Repository: awslabs/smithy-typescript Branch: main Commit: 396de9c6de60 Files: 2099 Total size: 9.5 MB Directory structure: gitextract_d2fwqw70/ ├── .changeset/ │ ├── README.md │ └── config.json ├── .eslintrc.js ├── .github/ │ ├── CODEOWNERS │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ ├── ci.yml │ ├── git-sync.yml │ ├── release-npm-packages.yml │ ├── release-npm-ssdk-libs.yml │ └── update-smithy-gradle-plugin.yml ├── .gitignore ├── .prettierignore ├── .yarn/ │ └── releases/ │ └── yarn-4.10.3.cjs ├── .yarnrc.yml ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CODE_REVIEW.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── NOTICE ├── README.md ├── api-extractor.json ├── api-extractor.packages.json ├── api-snapshot/ │ └── api.json ├── build.gradle.kts ├── config/ │ ├── checkstyle/ │ │ ├── checkstyle.xml │ │ └── suppressions.xml │ ├── spotbugs/ │ │ └── filter.xml │ └── spotless/ │ ├── formatting.xml │ └── license-header.txt ├── gradle.properties ├── gradlew ├── gradlew.bat ├── jest.config.base.js ├── package.json ├── packages/ │ ├── abort-controller/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── AbortController.spec.ts │ │ │ ├── AbortController.ts │ │ │ ├── AbortSignal.spec.ts │ │ │ ├── AbortSignal.ts │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── chunked-blob-reader/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── chunked-blob-reader-native/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── config-resolver/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── core/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── cbor.d.ts │ │ ├── cbor.js │ │ ├── checksum.d.ts │ │ ├── checksum.js │ │ ├── client.d.ts │ │ ├── client.js │ │ ├── config.d.ts │ │ ├── config.js │ │ ├── endpoints.d.ts │ │ ├── endpoints.js │ │ ├── event-streams.d.ts │ │ ├── event-streams.js │ │ ├── package.json │ │ ├── planning/ │ │ │ ├── consolidation.md │ │ │ └── consolidation_checklist.md │ │ ├── protocols.d.ts │ │ ├── protocols.js │ │ ├── retry.d.ts │ │ ├── retry.js │ │ ├── schema.d.ts │ │ ├── schema.js │ │ ├── scripts/ │ │ │ ├── cbor-perf.mjs │ │ │ └── lint.js │ │ ├── serde.d.ts │ │ ├── serde.js │ │ ├── src/ │ │ │ ├── core.integ.spec.ts │ │ │ ├── getSmithyContext.ts │ │ │ ├── index.ts │ │ │ ├── middleware-http-auth-scheme/ │ │ │ │ ├── getHttpAuthSchemeEndpointRuleSetPlugin.ts │ │ │ │ ├── getHttpAuthSchemePlugin.ts │ │ │ │ ├── httpAuthSchemeMiddleware.ts │ │ │ │ ├── index.ts │ │ │ │ ├── resolveAuthOptions.spec.ts │ │ │ │ └── resolveAuthOptions.ts │ │ │ ├── middleware-http-signing/ │ │ │ │ ├── getHttpSigningMiddleware.ts │ │ │ │ ├── httpSigningMiddleware.ts │ │ │ │ └── index.ts │ │ │ ├── normalizeProvider.spec.ts │ │ │ ├── normalizeProvider.ts │ │ │ ├── pagination/ │ │ │ │ ├── createPaginator.spec.ts │ │ │ │ └── createPaginator.ts │ │ │ ├── request-builder/ │ │ │ │ └── requestBuilder.ts │ │ │ ├── setFeature.spec.ts │ │ │ ├── setFeature.ts │ │ │ ├── submodules/ │ │ │ │ ├── cbor/ │ │ │ │ │ ├── CborCodec.spec.ts │ │ │ │ │ ├── CborCodec.ts │ │ │ │ │ ├── SmithyRpcV2CborProtocol.spec.ts │ │ │ │ │ ├── SmithyRpcV2CborProtocol.ts │ │ │ │ │ ├── byte-printer.ts │ │ │ │ │ ├── cbor-decode.ts │ │ │ │ │ ├── cbor-encode.ts │ │ │ │ │ ├── cbor-types.ts │ │ │ │ │ ├── cbor.spec.ts │ │ │ │ │ ├── cbor.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── parseCborBody.spec.ts │ │ │ │ │ ├── parseCborBody.ts │ │ │ │ │ └── test-data/ │ │ │ │ │ ├── decode-error-tests.json │ │ │ │ │ └── success-tests.json │ │ │ │ ├── checksum/ │ │ │ │ │ ├── chunked-blob-reader/ │ │ │ │ │ │ ├── CHANGELOG.chunked-blob-reader-native.md │ │ │ │ │ │ ├── CHANGELOG.chunked-blob-reader.md │ │ │ │ │ │ ├── chunked-blob-reader.native.spec.ts │ │ │ │ │ │ ├── chunked-blob-reader.native.ts │ │ │ │ │ │ ├── chunked-blob-reader.spec.ts │ │ │ │ │ │ └── chunked-blob-reader.ts │ │ │ │ │ ├── hash-blob-browser/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── blobHasher.spec.ts │ │ │ │ │ │ └── blobHasher.ts │ │ │ │ │ ├── hash-stream-node/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── HashCalculator.spec.ts │ │ │ │ │ │ ├── HashCalculator.ts │ │ │ │ │ │ ├── fileStreamHasher.spec.ts │ │ │ │ │ │ ├── fileStreamHasher.ts │ │ │ │ │ │ ├── readableStreamHasher.spec.ts │ │ │ │ │ │ └── readableStreamHasher.ts │ │ │ │ │ ├── index.browser.ts │ │ │ │ │ ├── index.native.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ └── md5-js/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── md5.spec.ts │ │ │ │ │ └── md5.ts │ │ │ │ ├── client/ │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── invalid-dependency/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── invalidFunction.spec.ts │ │ │ │ │ │ ├── invalidFunction.ts │ │ │ │ │ │ ├── invalidProvider.spec.ts │ │ │ │ │ │ └── invalidProvider.ts │ │ │ │ │ ├── middleware-stack/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── MiddlewareStack.spec.ts │ │ │ │ │ │ ├── MiddlewareStack.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── smithy-client/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── NoOpLogger.ts │ │ │ │ │ │ ├── client.spec.ts │ │ │ │ │ │ ├── client.ts │ │ │ │ │ │ ├── command.spec.ts │ │ │ │ │ │ ├── command.ts │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── create-aggregated-client.spec.ts │ │ │ │ │ │ ├── create-aggregated-client.ts │ │ │ │ │ │ ├── default-error-handler.ts │ │ │ │ │ │ ├── defaults-mode.ts │ │ │ │ │ │ ├── emitWarningIfUnsupportedVersion.spec.ts │ │ │ │ │ │ ├── emitWarningIfUnsupportedVersion.ts │ │ │ │ │ │ ├── exceptions.spec.ts │ │ │ │ │ │ ├── exceptions.ts │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ ├── checksum.integ.spec.ts │ │ │ │ │ │ │ ├── checksum.ts │ │ │ │ │ │ │ ├── defaultExtensionConfiguration.ts │ │ │ │ │ │ │ └── retry.ts │ │ │ │ │ │ ├── get-array-if-single-item.ts │ │ │ │ │ │ ├── get-value-from-text-node.spec.ts │ │ │ │ │ │ ├── get-value-from-text-node.ts │ │ │ │ │ │ ├── is-serializable-header-value.spec.ts │ │ │ │ │ │ ├── is-serializable-header-value.ts │ │ │ │ │ │ ├── object-mapping.spec.ts │ │ │ │ │ │ ├── object-mapping.ts │ │ │ │ │ │ ├── schemaLogFilter.spec.ts │ │ │ │ │ │ ├── schemaLogFilter.ts │ │ │ │ │ │ ├── ser-utils.spec.ts │ │ │ │ │ │ ├── ser-utils.ts │ │ │ │ │ │ ├── serde-json.spec.ts │ │ │ │ │ │ └── serde-json.ts │ │ │ │ │ ├── util-middleware/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── getSmithyContext.ts │ │ │ │ │ │ ├── normalizeProvider.spec.ts │ │ │ │ │ │ └── normalizeProvider.ts │ │ │ │ │ └── util-waiter/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── circular-reference-bug.spec.ts │ │ │ │ │ ├── circularReplacer.spec.ts │ │ │ │ │ ├── circularReplacer.ts │ │ │ │ │ ├── createWaiter.spec.ts │ │ │ │ │ ├── createWaiter.ts │ │ │ │ │ ├── poller.spec.ts │ │ │ │ │ ├── poller.ts │ │ │ │ │ ├── utils/ │ │ │ │ │ │ ├── sleep.ts │ │ │ │ │ │ ├── validate.spec.ts │ │ │ │ │ │ └── validate.ts │ │ │ │ │ ├── waiter.spec.ts │ │ │ │ │ └── waiter.ts │ │ │ │ ├── config/ │ │ │ │ │ ├── config-resolver/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── endpointsConfig/ │ │ │ │ │ │ │ ├── NodeUseDualstackEndpointConfigOptions.spec.ts │ │ │ │ │ │ │ ├── NodeUseDualstackEndpointConfigOptions.ts │ │ │ │ │ │ │ ├── NodeUseFipsEndpointConfigOptions.spec.ts │ │ │ │ │ │ │ ├── NodeUseFipsEndpointConfigOptions.ts │ │ │ │ │ │ │ ├── resolveCustomEndpointsConfig.spec.ts │ │ │ │ │ │ │ ├── resolveCustomEndpointsConfig.ts │ │ │ │ │ │ │ ├── resolveEndpointsConfig.spec.ts │ │ │ │ │ │ │ ├── resolveEndpointsConfig.ts │ │ │ │ │ │ │ └── utils/ │ │ │ │ │ │ │ ├── getEndpointFromRegion.spec.ts │ │ │ │ │ │ │ └── getEndpointFromRegion.ts │ │ │ │ │ │ ├── regionConfig/ │ │ │ │ │ │ │ ├── checkRegion.spec.ts │ │ │ │ │ │ │ ├── checkRegion.ts │ │ │ │ │ │ │ ├── config.spec.ts │ │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ │ ├── getRealRegion.spec.ts │ │ │ │ │ │ │ ├── getRealRegion.ts │ │ │ │ │ │ │ ├── isFipsRegion.spec.ts │ │ │ │ │ │ │ ├── isFipsRegion.ts │ │ │ │ │ │ │ ├── resolveRegionConfig.spec.ts │ │ │ │ │ │ │ └── resolveRegionConfig.ts │ │ │ │ │ │ └── regionInfo/ │ │ │ │ │ │ ├── EndpointVariant.ts │ │ │ │ │ │ ├── EndpointVariantTag.ts │ │ │ │ │ │ ├── PartitionHash.ts │ │ │ │ │ │ ├── RegionHash.ts │ │ │ │ │ │ ├── getHostnameFromVariants.spec.ts │ │ │ │ │ │ ├── getHostnameFromVariants.ts │ │ │ │ │ │ ├── getRegionInfo.spec.ts │ │ │ │ │ │ ├── getRegionInfo.ts │ │ │ │ │ │ ├── getResolvedHostname.spec.ts │ │ │ │ │ │ ├── getResolvedHostname.ts │ │ │ │ │ │ ├── getResolvedPartition.spec.ts │ │ │ │ │ │ ├── getResolvedPartition.ts │ │ │ │ │ │ ├── getResolvedSigningRegion.spec.ts │ │ │ │ │ │ └── getResolvedSigningRegion.ts │ │ │ │ │ ├── defaults-mode/ │ │ │ │ │ │ ├── CHANGELOG.browser.md │ │ │ │ │ │ ├── CHANGELOG.node.md │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── defaultsModeConfig.ts │ │ │ │ │ │ ├── resolveDefaultsModeConfig.browser.spec.ts │ │ │ │ │ │ ├── resolveDefaultsModeConfig.browser.ts │ │ │ │ │ │ ├── resolveDefaultsModeConfig.native.spec.ts │ │ │ │ │ │ ├── resolveDefaultsModeConfig.native.ts │ │ │ │ │ │ ├── resolveDefaultsModeConfig.spec.ts │ │ │ │ │ │ └── resolveDefaultsModeConfig.ts │ │ │ │ │ ├── index.browser.ts │ │ │ │ │ ├── index.native.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── node-config-provider/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── configLoader.spec.ts │ │ │ │ │ │ ├── configLoader.ts │ │ │ │ │ │ ├── fromEnv.spec.ts │ │ │ │ │ │ ├── fromEnv.ts │ │ │ │ │ │ ├── fromSharedConfigFiles.spec.ts │ │ │ │ │ │ ├── fromSharedConfigFiles.ts │ │ │ │ │ │ ├── fromStatic.spec.ts │ │ │ │ │ │ ├── fromStatic.ts │ │ │ │ │ │ └── getSelectorName.ts │ │ │ │ │ ├── property-provider/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── CredentialsProviderError.spec.ts │ │ │ │ │ │ ├── CredentialsProviderError.ts │ │ │ │ │ │ ├── ProviderError.spec.ts │ │ │ │ │ │ ├── ProviderError.ts │ │ │ │ │ │ ├── TokenProviderError.spec.ts │ │ │ │ │ │ ├── TokenProviderError.ts │ │ │ │ │ │ ├── chain.spec.ts │ │ │ │ │ │ ├── chain.ts │ │ │ │ │ │ ├── fromValue.spec.ts │ │ │ │ │ │ ├── fromValue.ts │ │ │ │ │ │ ├── memoize.spec.ts │ │ │ │ │ │ └── memoize.ts │ │ │ │ │ ├── shared-ini-file-loader/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── externalDataInterceptor.spec.ts │ │ │ │ │ │ ├── externalDataInterceptor.ts │ │ │ │ │ │ ├── getConfigData.spec.ts │ │ │ │ │ │ ├── getConfigData.ts │ │ │ │ │ │ ├── getConfigFilepath.spec.ts │ │ │ │ │ │ ├── getConfigFilepath.ts │ │ │ │ │ │ ├── getCredentialsFilepath.spec.ts │ │ │ │ │ │ ├── getCredentialsFilepath.ts │ │ │ │ │ │ ├── getHomeDir.spec.ts │ │ │ │ │ │ ├── getHomeDir.ts │ │ │ │ │ │ ├── getProfileName.spec.ts │ │ │ │ │ │ ├── getProfileName.ts │ │ │ │ │ │ ├── getSSOTokenFilepath.spec.ts │ │ │ │ │ │ ├── getSSOTokenFilepath.ts │ │ │ │ │ │ ├── getSSOTokenFromFile.spec.ts │ │ │ │ │ │ ├── getSSOTokenFromFile.ts │ │ │ │ │ │ ├── getSsoSessionData.spec.ts │ │ │ │ │ │ ├── getSsoSessionData.ts │ │ │ │ │ │ ├── loadSharedConfigFiles.spec.ts │ │ │ │ │ │ ├── loadSharedConfigFiles.ts │ │ │ │ │ │ ├── loadSsoSessionData.spec.ts │ │ │ │ │ │ ├── loadSsoSessionData.ts │ │ │ │ │ │ ├── mergeConfigFiles.spec.ts │ │ │ │ │ │ ├── mergeConfigFiles.ts │ │ │ │ │ │ ├── parseIni.spec.ts │ │ │ │ │ │ ├── parseIni.ts │ │ │ │ │ │ ├── parseKnownFiles.spec.ts │ │ │ │ │ │ ├── parseKnownFiles.ts │ │ │ │ │ │ ├── readFile.spec.ts │ │ │ │ │ │ ├── readFile.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ └── util-config-provider/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── booleanSelector.spec.ts │ │ │ │ │ ├── booleanSelector.ts │ │ │ │ │ ├── numberSelector.spec.ts │ │ │ │ │ ├── numberSelector.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── endpoints/ │ │ │ │ │ ├── index.browser.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── middleware-endpoint/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── adaptors/ │ │ │ │ │ │ │ ├── createConfigValueProvider.spec.ts │ │ │ │ │ │ │ ├── createConfigValueProvider.ts │ │ │ │ │ │ │ ├── getEndpointFromConfig.browser.ts │ │ │ │ │ │ │ ├── getEndpointFromConfig.ts │ │ │ │ │ │ │ ├── getEndpointFromInstructions.spec.ts │ │ │ │ │ │ │ ├── getEndpointFromInstructions.ts │ │ │ │ │ │ │ ├── getEndpointUrlConfig.spec.ts │ │ │ │ │ │ │ ├── getEndpointUrlConfig.ts │ │ │ │ │ │ │ └── toEndpointV1.ts │ │ │ │ │ │ ├── endpointMiddleware.ts │ │ │ │ │ │ ├── getEndpointPlugin.ts │ │ │ │ │ │ ├── resolveEndpointConfig.spec.ts │ │ │ │ │ │ ├── resolveEndpointConfig.ts │ │ │ │ │ │ ├── resolveEndpointRequiredConfig.spec.ts │ │ │ │ │ │ ├── resolveEndpointRequiredConfig.ts │ │ │ │ │ │ ├── service-customizations/ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── s3.spec.ts │ │ │ │ │ │ │ └── s3.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── toEndpointV1.spec.ts │ │ │ │ │ ├── toEndpointV1.ts │ │ │ │ │ └── util-endpoints/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── __mocks__/ │ │ │ │ │ │ ├── test-cases/ │ │ │ │ │ │ │ ├── aws-region.json │ │ │ │ │ │ │ ├── default-values.json │ │ │ │ │ │ │ ├── headers.json │ │ │ │ │ │ │ ├── local-region-override.json │ │ │ │ │ │ │ ├── parse-url.json │ │ │ │ │ │ │ ├── substring.json │ │ │ │ │ │ │ ├── uri-encode.json │ │ │ │ │ │ │ └── valid-hostlabel.json │ │ │ │ │ │ └── valid-rules/ │ │ │ │ │ │ ├── aws-region.json │ │ │ │ │ │ ├── default-values.json │ │ │ │ │ │ ├── headers.json │ │ │ │ │ │ ├── local-region-override.json │ │ │ │ │ │ ├── parse-url.json │ │ │ │ │ │ ├── substring.json │ │ │ │ │ │ ├── uri-encode.json │ │ │ │ │ │ └── valid-hostlabel.json │ │ │ │ │ ├── bdd/ │ │ │ │ │ │ └── BinaryDecisionDiagram.ts │ │ │ │ │ ├── cache/ │ │ │ │ │ │ ├── EndpointCache.spec.ts │ │ │ │ │ │ └── EndpointCache.ts │ │ │ │ │ ├── debug/ │ │ │ │ │ │ ├── debugId.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── toDebugString.ts │ │ │ │ │ ├── decideEndpoint.spec.ts │ │ │ │ │ ├── decideEndpoint.ts │ │ │ │ │ ├── getEndpointUrlConfig.spec.ts │ │ │ │ │ ├── getEndpointUrlConfig.ts │ │ │ │ │ ├── lib/ │ │ │ │ │ │ ├── booleanEquals.spec.ts │ │ │ │ │ │ ├── booleanEquals.ts │ │ │ │ │ │ ├── coalesce.spec.ts │ │ │ │ │ │ ├── coalesce.ts │ │ │ │ │ │ ├── getAttr.spec.ts │ │ │ │ │ │ ├── getAttr.ts │ │ │ │ │ │ ├── getAttrPathList.spec.ts │ │ │ │ │ │ ├── getAttrPathList.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── isIpAddress.spec.ts │ │ │ │ │ │ ├── isIpAddress.ts │ │ │ │ │ │ ├── isSet.spec.ts │ │ │ │ │ │ ├── isSet.ts │ │ │ │ │ │ ├── isValidHostLabel.spec.ts │ │ │ │ │ │ ├── isValidHostLabel.ts │ │ │ │ │ │ ├── ite.spec.ts │ │ │ │ │ │ ├── ite.ts │ │ │ │ │ │ ├── not.spec.ts │ │ │ │ │ │ ├── not.ts │ │ │ │ │ │ ├── parseURL.spec.ts │ │ │ │ │ │ ├── parseURL.ts │ │ │ │ │ │ ├── split.spec.ts │ │ │ │ │ │ ├── split.ts │ │ │ │ │ │ ├── stringEquals.spec.ts │ │ │ │ │ │ ├── stringEquals.ts │ │ │ │ │ │ ├── substring.spec.ts │ │ │ │ │ │ ├── substring.ts │ │ │ │ │ │ ├── uriEncode.spec.ts │ │ │ │ │ │ └── uriEncode.ts │ │ │ │ │ ├── resolveEndpoint.integ.spec.ts │ │ │ │ │ ├── resolveEndpoint.spec.ts │ │ │ │ │ ├── resolveEndpoint.ts │ │ │ │ │ ├── types/ │ │ │ │ │ │ ├── EndpointError.ts │ │ │ │ │ │ ├── EndpointFunctions.ts │ │ │ │ │ │ ├── EndpointRuleObject.ts │ │ │ │ │ │ ├── ErrorRuleObject.ts │ │ │ │ │ │ ├── RuleSetObject.ts │ │ │ │ │ │ ├── TreeRuleObject.ts │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ └── shared.ts │ │ │ │ │ └── utils/ │ │ │ │ │ ├── callFunction.spec.ts │ │ │ │ │ ├── callFunction.ts │ │ │ │ │ ├── customEndpointFunctions.ts │ │ │ │ │ ├── endpointFunctions.spec.ts │ │ │ │ │ ├── endpointFunctions.ts │ │ │ │ │ ├── evaluateCondition.spec.ts │ │ │ │ │ ├── evaluateCondition.ts │ │ │ │ │ ├── evaluateConditions.spec.ts │ │ │ │ │ ├── evaluateConditions.ts │ │ │ │ │ ├── evaluateEndpointRule.spec.ts │ │ │ │ │ ├── evaluateEndpointRule.ts │ │ │ │ │ ├── evaluateErrorRule.spec.ts │ │ │ │ │ ├── evaluateErrorRule.ts │ │ │ │ │ ├── evaluateExpression.spec.ts │ │ │ │ │ ├── evaluateExpression.ts │ │ │ │ │ ├── evaluateRules.spec.ts │ │ │ │ │ ├── evaluateRules.ts │ │ │ │ │ ├── evaluateTemplate.spec.ts │ │ │ │ │ ├── evaluateTemplate.ts │ │ │ │ │ ├── evaluateTreeRule.spec.ts │ │ │ │ │ ├── evaluateTreeRule.ts │ │ │ │ │ ├── getEndpointHeaders.spec.ts │ │ │ │ │ ├── getEndpointHeaders.ts │ │ │ │ │ ├── getEndpointProperties.spec.ts │ │ │ │ │ ├── getEndpointProperties.ts │ │ │ │ │ ├── getEndpointProperty.spec.ts │ │ │ │ │ ├── getEndpointProperty.ts │ │ │ │ │ ├── getEndpointUrl.spec.ts │ │ │ │ │ ├── getEndpointUrl.ts │ │ │ │ │ ├── getReferenceValue.spec.ts │ │ │ │ │ ├── getReferenceValue.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── event-streams/ │ │ │ │ │ ├── EventStreamSerde.spec.ts │ │ │ │ │ ├── EventStreamSerde.ts │ │ │ │ │ ├── eventstream-codec/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── EventStreamCodec.spec.ts │ │ │ │ │ │ ├── EventStreamCodec.ts │ │ │ │ │ │ ├── HeaderMarshaller.spec.ts │ │ │ │ │ │ ├── HeaderMarshaller.ts │ │ │ │ │ │ ├── Int64.spec.ts │ │ │ │ │ │ ├── Int64.ts │ │ │ │ │ │ ├── Message.ts │ │ │ │ │ │ ├── MessageDecoderStream.spec.ts │ │ │ │ │ │ ├── MessageDecoderStream.ts │ │ │ │ │ │ ├── MessageEncoderStream.spec.ts │ │ │ │ │ │ ├── MessageEncoderStream.ts │ │ │ │ │ │ ├── SmithyMessageDecoderStream.spec.ts │ │ │ │ │ │ ├── SmithyMessageDecoderStream.ts │ │ │ │ │ │ ├── SmithyMessageEncoderStream.spec.ts │ │ │ │ │ │ ├── SmithyMessageEncoderStream.ts │ │ │ │ │ │ ├── TestVectors.fixture.ts │ │ │ │ │ │ ├── splitMessage.spec.ts │ │ │ │ │ │ ├── splitMessage.ts │ │ │ │ │ │ └── vectorTypes.fixture.ts │ │ │ │ │ ├── eventstream-serde/ │ │ │ │ │ │ ├── CHANGELOG.eventstream-serde-browser.md │ │ │ │ │ │ ├── CHANGELOG.eventstream-serde-node.md │ │ │ │ │ │ ├── EventStreamMarshaller.browser.ts │ │ │ │ │ │ ├── EventStreamMarshaller.ts │ │ │ │ │ │ └── utils.ts │ │ │ │ │ ├── eventstream-serde-config-resolver/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── EventStreamSerdeConfig.spec.ts │ │ │ │ │ │ └── EventStreamSerdeConfig.ts │ │ │ │ │ ├── eventstream-serde-universal/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── EventStreamMarshaller.ts │ │ │ │ │ │ ├── clientContextParams-precedence.integ.spec.ts │ │ │ │ │ │ ├── eventstream-cbor.integ.spec.ts │ │ │ │ │ │ ├── getChunkedStream.spec.ts │ │ │ │ │ │ ├── getChunkedStream.ts │ │ │ │ │ │ ├── getUnmarshalledStream.spec.ts │ │ │ │ │ │ └── getUnmarshalledStream.ts │ │ │ │ │ ├── index.browser.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── protocols/ │ │ │ │ │ ├── HttpBindingProtocol.spec.ts │ │ │ │ │ ├── HttpBindingProtocol.ts │ │ │ │ │ ├── HttpProtocol.spec.ts │ │ │ │ │ ├── HttpProtocol.ts │ │ │ │ │ ├── RpcProtocol.spec.ts │ │ │ │ │ ├── RpcProtocol.ts │ │ │ │ │ ├── SerdeContext.ts │ │ │ │ │ ├── collect-stream-body.spec.ts │ │ │ │ │ ├── collect-stream-body.ts │ │ │ │ │ ├── extended-encode-uri-component.spec.ts │ │ │ │ │ ├── extended-encode-uri-component.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── middleware-content-length/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ └── contentLengthMiddleware.ts │ │ │ │ │ ├── protocol-http/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── Field.ts │ │ │ │ │ │ ├── Fields.ts │ │ │ │ │ │ ├── extensions/ │ │ │ │ │ │ │ └── httpExtensionConfiguration.ts │ │ │ │ │ │ ├── httpHandler.ts │ │ │ │ │ │ ├── httpRequest.spec.ts │ │ │ │ │ │ ├── httpRequest.ts │ │ │ │ │ │ ├── httpResponse.ts │ │ │ │ │ │ ├── isValidHostname.spec.ts │ │ │ │ │ │ ├── isValidHostname.ts │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── querystring-builder/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ └── buildQueryString.ts │ │ │ │ │ ├── querystring-parser/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── parseQueryString.spec.ts │ │ │ │ │ │ └── parseQueryString.ts │ │ │ │ │ ├── requestBuilder.spec.ts │ │ │ │ │ ├── requestBuilder.ts │ │ │ │ │ ├── resolve-path.spec.ts │ │ │ │ │ ├── resolve-path.ts │ │ │ │ │ ├── serde/ │ │ │ │ │ │ ├── FromStringShapeDeserializer.ts │ │ │ │ │ │ ├── HttpInterceptingShapeDeserializer.ts │ │ │ │ │ │ ├── HttpInterceptingShapeSerializer.ts │ │ │ │ │ │ ├── ToStringShapeSerializer.spec.ts │ │ │ │ │ │ ├── ToStringShapeSerializer.ts │ │ │ │ │ │ └── determineTimestampFormat.ts │ │ │ │ │ ├── url-parser/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── parseUrl.spec.ts │ │ │ │ │ │ └── parseUrl.ts │ │ │ │ │ └── util-uri-escape/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── escape-uri-path.spec.ts │ │ │ │ │ ├── escape-uri-path.ts │ │ │ │ │ ├── escape-uri.spec.ts │ │ │ │ │ └── escape-uri.ts │ │ │ │ ├── retry/ │ │ │ │ │ ├── index.browser.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── middleware-retry/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── configurations.spec.ts │ │ │ │ │ │ ├── configurations.ts │ │ │ │ │ │ ├── isStreamingPayload/ │ │ │ │ │ │ │ ├── isStreamingPayload.browser.ts │ │ │ │ │ │ │ └── isStreamingPayload.ts │ │ │ │ │ │ ├── longPollMiddleware.spec.ts │ │ │ │ │ │ ├── longPollMiddleware.ts │ │ │ │ │ │ ├── omitRetryHeadersMiddleware.spec.ts │ │ │ │ │ │ ├── omitRetryHeadersMiddleware.ts │ │ │ │ │ │ ├── parseRetryAfterHeader.spec.ts │ │ │ │ │ │ ├── parseRetryAfterHeader.ts │ │ │ │ │ │ ├── retry-pre-sra-deprecated/ │ │ │ │ │ │ │ ├── AdaptiveRetryStrategy.spec.ts │ │ │ │ │ │ │ ├── AdaptiveRetryStrategy.ts │ │ │ │ │ │ │ ├── StandardRetryStrategy.spec.ts │ │ │ │ │ │ │ ├── StandardRetryStrategy.ts │ │ │ │ │ │ │ ├── defaultRetryQuota.spec.ts │ │ │ │ │ │ │ ├── defaultRetryQuota.ts │ │ │ │ │ │ │ ├── delayDecider.spec.ts │ │ │ │ │ │ │ ├── delayDecider.ts │ │ │ │ │ │ │ ├── retryDecider.spec.ts │ │ │ │ │ │ │ ├── retryDecider.ts │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ │ ├── retryMiddleware.spec.ts │ │ │ │ │ │ ├── retryMiddleware.ts │ │ │ │ │ │ └── util.ts │ │ │ │ │ ├── retry-rate-target.integ.spec.ts │ │ │ │ │ ├── service-error-classification/ │ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── service-error-classification.spec.ts │ │ │ │ │ │ └── service-error-classification.ts │ │ │ │ │ └── util-retry/ │ │ │ │ │ ├── AdaptiveRetryStrategy.spec.ts │ │ │ │ │ ├── AdaptiveRetryStrategy.ts │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── ConfiguredRetryStrategy.spec.ts │ │ │ │ │ ├── ConfiguredRetryStrategy.ts │ │ │ │ │ ├── DefaultRateLimiter.spec.ts │ │ │ │ │ ├── DefaultRateLimiter.ts │ │ │ │ │ ├── DefaultRetryBackoffStrategy.spec.ts │ │ │ │ │ ├── DefaultRetryBackoffStrategy.ts │ │ │ │ │ ├── DefaultRetryToken.spec.ts │ │ │ │ │ ├── DefaultRetryToken.ts │ │ │ │ │ ├── StandardRetryStrategy.spec.ts │ │ │ │ │ ├── StandardRetryStrategy.ts │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── retries-2026-config.ts │ │ │ │ │ ├── retries.integ.spec.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── schema/ │ │ │ │ │ ├── TypeRegistry.spec.ts │ │ │ │ │ ├── TypeRegistry.ts │ │ │ │ │ ├── deref.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── middleware/ │ │ │ │ │ │ ├── getSchemaSerdePlugin.ts │ │ │ │ │ │ ├── schema-middleware-types.ts │ │ │ │ │ │ ├── schemaDeserializationMiddleware.spec.ts │ │ │ │ │ │ ├── schemaDeserializationMiddleware.ts │ │ │ │ │ │ ├── schemaSerializationMiddleware.spec.ts │ │ │ │ │ │ └── schemaSerializationMiddleware.ts │ │ │ │ │ └── schemas/ │ │ │ │ │ ├── ErrorSchema.ts │ │ │ │ │ ├── ListSchema.ts │ │ │ │ │ ├── MapSchema.ts │ │ │ │ │ ├── NormalizedSchema.spec.ts │ │ │ │ │ ├── NormalizedSchema.ts │ │ │ │ │ ├── OperationSchema.ts │ │ │ │ │ ├── Schema.ts │ │ │ │ │ ├── SimpleSchema.ts │ │ │ │ │ ├── StructureSchema.ts │ │ │ │ │ ├── operation.ts │ │ │ │ │ ├── schemas.spec.ts │ │ │ │ │ ├── sentinels.ts │ │ │ │ │ ├── translateTraits.spec.ts │ │ │ │ │ └── translateTraits.ts │ │ │ │ └── serde/ │ │ │ │ ├── copyDocumentWithTransform.ts │ │ │ │ ├── date-utils.spec.ts │ │ │ │ ├── date-utils.ts │ │ │ │ ├── generateIdempotencyToken.spec.ts │ │ │ │ ├── hash-node/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── hash-node.spec.ts │ │ │ │ │ └── hash-node.ts │ │ │ │ ├── index.browser.ts │ │ │ │ ├── index.native.ts │ │ │ │ ├── index.ts │ │ │ │ ├── is-array-buffer/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── is-array-buffer.spec.ts │ │ │ │ │ └── is-array-buffer.ts │ │ │ │ ├── lazy-json.spec.ts │ │ │ │ ├── lazy-json.ts │ │ │ │ ├── middleware-serde/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── deserializerMiddleware.spec.ts │ │ │ │ │ ├── deserializerMiddleware.ts │ │ │ │ │ ├── middleware-serde.integ.spec.ts │ │ │ │ │ ├── serdePlugin.ts │ │ │ │ │ ├── serializerMiddleware.spec.ts │ │ │ │ │ └── serializerMiddleware.ts │ │ │ │ ├── parse-utils.spec.ts │ │ │ │ ├── parse-utils.ts │ │ │ │ ├── quote-header.spec.ts │ │ │ │ ├── quote-header.ts │ │ │ │ ├── schema-serde-lib/ │ │ │ │ │ ├── schema-date-utils.spec.ts │ │ │ │ │ └── schema-date-utils.ts │ │ │ │ ├── split-every.spec.ts │ │ │ │ ├── split-every.ts │ │ │ │ ├── split-header.spec.ts │ │ │ │ ├── split-header.ts │ │ │ │ ├── util-base64/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── __mocks__/ │ │ │ │ │ │ └── testCases.json │ │ │ │ │ ├── constants-for-browser.ts │ │ │ │ │ ├── fromBase64.browser.spec.ts │ │ │ │ │ ├── fromBase64.browser.ts │ │ │ │ │ ├── fromBase64.spec.ts │ │ │ │ │ ├── fromBase64.ts │ │ │ │ │ ├── toBase64.browser.spec.ts │ │ │ │ │ ├── toBase64.browser.ts │ │ │ │ │ ├── toBase64.spec.ts │ │ │ │ │ └── toBase64.ts │ │ │ │ ├── util-body-length/ │ │ │ │ │ ├── CHANGELOG.util-body-length-browser.md │ │ │ │ │ ├── CHANGELOG.util-body-length-node.md │ │ │ │ │ ├── calculateBodyLength.browser.spec.ts │ │ │ │ │ ├── calculateBodyLength.browser.ts │ │ │ │ │ ├── calculateBodyLength.spec.ts │ │ │ │ │ └── calculateBodyLength.ts │ │ │ │ ├── util-buffer-from/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── buffer-from.spec.ts │ │ │ │ │ └── buffer-from.ts │ │ │ │ ├── util-hex-encoding/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── hex-encoding.spec.ts │ │ │ │ │ └── hex-encoding.ts │ │ │ │ ├── util-stream/ │ │ │ │ │ ├── ByteArrayCollector.ts │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── blob/ │ │ │ │ │ │ ├── Uint8ArrayBlobAdapter.spec.ts │ │ │ │ │ │ └── Uint8ArrayBlobAdapter.ts │ │ │ │ │ ├── checksum/ │ │ │ │ │ │ ├── ChecksumStream.browser.ts │ │ │ │ │ │ ├── ChecksumStream.ts │ │ │ │ │ │ ├── createChecksumStream.browser.spec.ts │ │ │ │ │ │ ├── createChecksumStream.browser.ts │ │ │ │ │ │ ├── createChecksumStream.spec.ts │ │ │ │ │ │ └── createChecksumStream.ts │ │ │ │ │ ├── createBufferedReadable.browser.spec.ts │ │ │ │ │ ├── createBufferedReadable.browser.ts │ │ │ │ │ ├── createBufferedReadable.spec.ts │ │ │ │ │ ├── createBufferedReadable.ts │ │ │ │ │ ├── getAwsChunkedEncodingStream.browser.spec.ts │ │ │ │ │ ├── getAwsChunkedEncodingStream.browser.ts │ │ │ │ │ ├── getAwsChunkedEncodingStream.spec.ts │ │ │ │ │ ├── getAwsChunkedEncodingStream.ts │ │ │ │ │ ├── headStream.browser.ts │ │ │ │ │ ├── headStream.spec.ts │ │ │ │ │ ├── headStream.ts │ │ │ │ │ ├── sdk-stream-mixin.browser.spec.ts │ │ │ │ │ ├── sdk-stream-mixin.browser.ts │ │ │ │ │ ├── sdk-stream-mixin.spec.ts │ │ │ │ │ ├── sdk-stream-mixin.ts │ │ │ │ │ ├── splitStream.browser.ts │ │ │ │ │ ├── splitStream.spec.ts │ │ │ │ │ ├── splitStream.ts │ │ │ │ │ ├── stream-collector.browser.ts │ │ │ │ │ ├── stream-collector.ts │ │ │ │ │ ├── stream-type-check.ts │ │ │ │ │ └── util-stream.integ.spec.ts │ │ │ │ ├── util-utf8/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── fromUtf8.browser.spec.ts │ │ │ │ │ ├── fromUtf8.browser.ts │ │ │ │ │ ├── fromUtf8.spec.ts │ │ │ │ │ ├── fromUtf8.ts │ │ │ │ │ ├── toUint8Array.browser.spec.ts │ │ │ │ │ ├── toUint8Array.browser.ts │ │ │ │ │ ├── toUint8Array.spec.ts │ │ │ │ │ ├── toUint8Array.ts │ │ │ │ │ ├── toUtf8.browser.spec.ts │ │ │ │ │ ├── toUtf8.browser.ts │ │ │ │ │ ├── toUtf8.spec.ts │ │ │ │ │ └── toUtf8.ts │ │ │ │ ├── uuid/ │ │ │ │ │ ├── CHANGELOG.md │ │ │ │ │ ├── v4.spec.ts │ │ │ │ │ └── v4.ts │ │ │ │ └── value/ │ │ │ │ ├── NumericValue.spec.ts │ │ │ │ └── NumericValue.ts │ │ │ └── util-identity-and-auth/ │ │ │ ├── DefaultIdentityProviderConfig.ts │ │ │ ├── httpAuthSchemes/ │ │ │ │ ├── httpApiKeyAuth.ts │ │ │ │ ├── httpBearerAuth.ts │ │ │ │ ├── index.ts │ │ │ │ └── noAuth.ts │ │ │ ├── index.ts │ │ │ └── memoizeIdentityProvider.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── credential-provider-imds/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── config/ │ │ │ │ ├── Endpoint.ts │ │ │ │ ├── EndpointConfigOptions.spec.ts │ │ │ │ ├── EndpointConfigOptions.ts │ │ │ │ ├── EndpointMode.ts │ │ │ │ ├── EndpointModeConfigOptions.spec.ts │ │ │ │ └── EndpointModeConfigOptions.ts │ │ │ ├── error/ │ │ │ │ └── InstanceMetadataV1FallbackError.ts │ │ │ ├── fromContainerMetadata.spec.ts │ │ │ ├── fromContainerMetadata.ts │ │ │ ├── fromInstanceMetadata.spec.ts │ │ │ ├── fromInstanceMetadata.ts │ │ │ ├── index.ts │ │ │ ├── remoteProvider/ │ │ │ │ ├── ImdsCredentials.spec.ts │ │ │ │ ├── ImdsCredentials.ts │ │ │ │ ├── RemoteProviderInit.spec.ts │ │ │ │ ├── RemoteProviderInit.ts │ │ │ │ ├── httpRequest.spec.ts │ │ │ │ ├── httpRequest.ts │ │ │ │ ├── index.ts │ │ │ │ ├── retry.spec.ts │ │ │ │ └── retry.ts │ │ │ ├── types.ts │ │ │ └── utils/ │ │ │ ├── getExtendedInstanceMetadataCredentials.spec.ts │ │ │ ├── getExtendedInstanceMetadataCredentials.ts │ │ │ ├── getInstanceMetadataEndpoint.spec.ts │ │ │ ├── getInstanceMetadataEndpoint.ts │ │ │ ├── staticStabilityProvider.spec.ts │ │ │ └── staticStabilityProvider.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── eventstream-codec/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── buildTestVectorsFixture.js │ │ ├── src/ │ │ │ └── index.ts │ │ ├── test_vectors/ │ │ │ ├── decoded/ │ │ │ │ ├── negative/ │ │ │ │ │ ├── corrupted_header_len │ │ │ │ │ ├── corrupted_headers │ │ │ │ │ ├── corrupted_length │ │ │ │ │ └── corrupted_payload │ │ │ │ └── positive/ │ │ │ │ ├── all_headers │ │ │ │ ├── empty_message │ │ │ │ ├── int32_header │ │ │ │ ├── payload_no_headers │ │ │ │ └── payload_one_str_header │ │ │ └── encoded/ │ │ │ ├── negative/ │ │ │ │ ├── corrupted_header_len │ │ │ │ ├── corrupted_headers │ │ │ │ ├── corrupted_length │ │ │ │ └── corrupted_payload │ │ │ └── positive/ │ │ │ ├── all_headers │ │ │ ├── empty_message │ │ │ ├── int32_header │ │ │ ├── payload_no_headers │ │ │ └── payload_one_str_header │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── eventstream-serde-browser/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── eventstream-serde-config-resolver/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── eventstream-serde-node/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── eventstream-serde-universal/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── experimental-identity-and-auth/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── HttpAuthScheme.ts │ │ │ ├── HttpAuthSchemeProvider.ts │ │ │ ├── HttpSigner.ts │ │ │ ├── IdentityProviderConfig.ts │ │ │ ├── SigV4Signer.ts │ │ │ ├── apiKeyIdentity.ts │ │ │ ├── endpointRuleSet.ts │ │ │ ├── httpApiKeyAuth.ts │ │ │ ├── httpBearerAuth.ts │ │ │ ├── index.ts │ │ │ ├── integration/ │ │ │ │ ├── httpApiKeyAuth.integ.spec.ts │ │ │ │ └── httpBearerAuth.integ.spec.ts │ │ │ ├── memoizeIdentityProvider.ts │ │ │ ├── middleware-http-auth-scheme/ │ │ │ │ ├── getHttpAuthSchemeEndpointRuleSetPlugin.ts │ │ │ │ ├── getHttpAuthSchemePlugin.ts │ │ │ │ ├── httpAuthSchemeMiddleware.ts │ │ │ │ └── index.ts │ │ │ ├── middleware-http-signing/ │ │ │ │ ├── getHttpSigningMiddleware.ts │ │ │ │ ├── httpSigningMiddleware.ts │ │ │ │ └── index.ts │ │ │ ├── noAuth.ts │ │ │ └── tokenIdentity.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.test.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── fetch-http-handler/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── create-request.ts │ │ │ ├── fetch-http-handler.browser.spec.ts │ │ │ ├── fetch-http-handler.spec.ts │ │ │ ├── fetch-http-handler.ts │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── request-timeout.ts │ │ │ ├── stream-collector.browser.spec.ts │ │ │ ├── stream-collector.spec.ts │ │ │ └── stream-collector.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.browser.mts │ │ └── vitest.config.mts │ ├── hash-blob-browser/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── hash-node/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── hash-stream-node/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── invalid-dependency/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── is-array-buffer/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── md5-js/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── middleware-apply-body-checksum/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── applyMd5BodyChecksumMiddleware.spec.ts │ │ │ ├── applyMd5BodyChecksumMiddleware.ts │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── md5Configuration.ts │ │ │ └── middleware-apply-body-checksum.integ.spec.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── middleware-compression/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS.spec.ts │ │ │ ├── NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS.ts │ │ │ ├── NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS.spec.ts │ │ │ ├── NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS.ts │ │ │ ├── compressStream.browser.spec.ts │ │ │ ├── compressStream.browser.ts │ │ │ ├── compressStream.spec.ts │ │ │ ├── compressStream.ts │ │ │ ├── compressString.browser.spec.ts │ │ │ ├── compressString.browser.ts │ │ │ ├── compressString.spec.ts │ │ │ ├── compressString.ts │ │ │ ├── compressionMiddleware.spec.ts │ │ │ ├── compressionMiddleware.ts │ │ │ ├── configurations.ts │ │ │ ├── constants.ts │ │ │ ├── getCompressionPlugin.spec.ts │ │ │ ├── getCompressionPlugin.ts │ │ │ ├── index.ts │ │ │ ├── isStreaming.spec.ts │ │ │ ├── isStreaming.ts │ │ │ ├── resolveCompressionConfig.spec.ts │ │ │ └── resolveCompressionConfig.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── middleware-content-length/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── middleware-endpoint/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── middleware-retry/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── middleware-serde/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── middleware-stack/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── node-config-provider/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── node-http-handler/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── fixtures/ │ │ │ ├── test-server-cert.pem │ │ │ └── test-server-key.pem │ │ ├── package.json │ │ ├── src/ │ │ │ ├── build-abort-error.ts │ │ │ ├── constants.ts │ │ │ ├── get-transformed-headers.ts │ │ │ ├── http2/ │ │ │ │ ├── ClientHttp2SessionRef.spec.ts │ │ │ │ └── ClientHttp2SessionRef.ts │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── node-http-handler.mock-server.spec.ts │ │ │ ├── node-http-handler.spec.ts │ │ │ ├── node-http-handler.ts │ │ │ ├── node-http2-connection-manager.ts │ │ │ ├── node-http2-connection-pool.ts │ │ │ ├── node-http2-handler.spec.ts │ │ │ ├── node-http2-handler.ts │ │ │ ├── readable.mock.ts │ │ │ ├── server.mock.ts │ │ │ ├── set-connection-timeout.spec.ts │ │ │ ├── set-connection-timeout.ts │ │ │ ├── set-request-timeout.spec.ts │ │ │ ├── set-request-timeout.ts │ │ │ ├── set-socket-keep-alive.spec.ts │ │ │ ├── set-socket-keep-alive.ts │ │ │ ├── set-socket-timeout.spec.ts │ │ │ ├── set-socket-timeout.ts │ │ │ ├── stream-collector/ │ │ │ │ ├── collector.spec.ts │ │ │ │ ├── collector.ts │ │ │ │ ├── index.spec.ts │ │ │ │ ├── index.ts │ │ │ │ └── readable.mock.ts │ │ │ ├── timing.ts │ │ │ ├── write-request-body.spec.ts │ │ │ └── write-request-body.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── property-provider/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── protocol-http/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── querystring-builder/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── querystring-parser/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── service-client-documentation-generator/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── sdk-client-toc-plugin.ts │ │ │ └── utils.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── service-error-classification/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── shared-ini-file-loader/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── signature-v4/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── HeaderFormatter.spec.ts │ │ │ ├── HeaderFormatter.ts │ │ │ ├── SignatureV4.spec.ts │ │ │ ├── SignatureV4.ts │ │ │ ├── SignatureV4Base.ts │ │ │ ├── constants.ts │ │ │ ├── credentialDerivation.spec.ts │ │ │ ├── credentialDerivation.ts │ │ │ ├── getCanonicalHeaders.spec.ts │ │ │ ├── getCanonicalHeaders.ts │ │ │ ├── getCanonicalQuery.spec.ts │ │ │ ├── getCanonicalQuery.ts │ │ │ ├── getPayloadHash.spec.ts │ │ │ ├── getPayloadHash.ts │ │ │ ├── headerUtil.ts │ │ │ ├── index.ts │ │ │ ├── moveHeadersToQuery.spec.ts │ │ │ ├── moveHeadersToQuery.ts │ │ │ ├── prepareRequest.spec.ts │ │ │ ├── prepareRequest.ts │ │ │ ├── signature-v4a-container.ts │ │ │ ├── suite.fixture.ts │ │ │ ├── suite.spec.ts │ │ │ ├── utilDate.spec.ts │ │ │ └── utilDate.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── signature-v4a/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── scripts/ │ │ │ ├── Ec.js │ │ │ └── esbuild.mjs │ │ ├── src/ │ │ │ ├── SignatureV4a.spec.ts │ │ │ ├── SignatureV4a.ts │ │ │ ├── constants.ts │ │ │ ├── credentialDerivation.spec.ts │ │ │ ├── credentialDerivation.ts │ │ │ ├── elliptic/ │ │ │ │ └── Ec.ts │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ └── vitest.config.mts │ ├── smithy-client/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── fix-api-extractor.js │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── snapshot-testing/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── integ-snapshots/ │ │ │ ├── req/ │ │ │ │ ├── EmptyInputOutput.txt │ │ │ │ ├── Float16.txt │ │ │ │ ├── FractionalSeconds.txt │ │ │ │ ├── GreetingWithErrors.txt │ │ │ │ ├── NoInputOutput.txt │ │ │ │ ├── RecursiveShapes.txt │ │ │ │ ├── RpcV2CborSparseMaps.txt │ │ │ │ ├── SimpleScalarProperties.txt │ │ │ │ └── SparseNullsOperation.txt │ │ │ ├── res/ │ │ │ │ ├── EmptyInputOutput.txt │ │ │ │ ├── Float16.txt │ │ │ │ ├── FractionalSeconds.txt │ │ │ │ ├── GreetingWithErrors.txt │ │ │ │ ├── NoInputOutput.txt │ │ │ │ ├── RecursiveShapes.txt │ │ │ │ ├── RpcV2CborSparseMaps.txt │ │ │ │ ├── SimpleScalarProperties.txt │ │ │ │ └── SparseNullsOperation.txt │ │ │ └── res-err/ │ │ │ ├── ComplexError.txt │ │ │ ├── InvalidGreeting.txt │ │ │ ├── RpcV2ProtocolServiceException.txt │ │ │ ├── UnmodeledServiceException.txt │ │ │ └── ValidationException.txt │ │ ├── package.json │ │ ├── src/ │ │ │ ├── SnapshotRequestHandler.ts │ │ │ ├── SnapshotRunner.ts │ │ │ ├── index.ts │ │ │ ├── protocols/ │ │ │ │ ├── SmithyRpcV2CborSnapshotProtocol.ts │ │ │ │ ├── SnapshotProtocol.ts │ │ │ │ └── index.ts │ │ │ ├── serializers/ │ │ │ │ ├── ContentTypeDetection.ts │ │ │ │ ├── SnapshotEventStreamSerializer.ts │ │ │ │ ├── SnapshotPayloadSerializer.ts │ │ │ │ ├── serializeBytes.ts │ │ │ │ ├── serializeDate.ts │ │ │ │ ├── serializeDocument.ts │ │ │ │ ├── serializeHttpRequest.spec.ts │ │ │ │ ├── serializeHttpRequest.ts │ │ │ │ └── serializeHttpResponse.ts │ │ │ ├── snapshot-testing-types.ts │ │ │ ├── snapshot-testing.integ.spec.ts │ │ │ └── structure/ │ │ │ └── createFromSchema.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── typecheck/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── src/ │ │ │ ├── getRuntimeTypecheckPlugin.ts │ │ │ ├── index.ts │ │ │ ├── runtime-typecheck.integ.spec.ts │ │ │ ├── types.ts │ │ │ ├── validateSchema.spec.ts │ │ │ └── validateSchema.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── types/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── api-extractor.json │ │ ├── package.json │ │ ├── scripts/ │ │ │ └── downlevel.js │ │ ├── src/ │ │ │ ├── abort-handler.ts │ │ │ ├── abort.ts │ │ │ ├── auth/ │ │ │ │ ├── HttpApiKeyAuth.ts │ │ │ │ ├── HttpAuthScheme.ts │ │ │ │ ├── HttpAuthSchemeProvider.ts │ │ │ │ ├── HttpSigner.ts │ │ │ │ ├── IdentityProviderConfig.ts │ │ │ │ ├── auth.ts │ │ │ │ └── index.ts │ │ │ ├── blob/ │ │ │ │ └── blob-payload-input-types.ts │ │ │ ├── checksum.ts │ │ │ ├── client.ts │ │ │ ├── command.ts │ │ │ ├── connection/ │ │ │ │ ├── config.ts │ │ │ │ ├── index.ts │ │ │ │ ├── manager.ts │ │ │ │ └── pool.ts │ │ │ ├── crypto.ts │ │ │ ├── downlevel-ts3.4/ │ │ │ │ └── transform/ │ │ │ │ └── type-transform.ts │ │ │ ├── encode.ts │ │ │ ├── endpoint.ts │ │ │ ├── endpoints/ │ │ │ │ ├── EndpointRuleObject.ts │ │ │ │ ├── ErrorRuleObject.ts │ │ │ │ ├── RuleSetObject.ts │ │ │ │ ├── TreeRuleObject.ts │ │ │ │ ├── index.ts │ │ │ │ └── shared.ts │ │ │ ├── eventStream.ts │ │ │ ├── extensions/ │ │ │ │ ├── checksum.ts │ │ │ │ ├── defaultClientConfiguration.ts │ │ │ │ ├── defaultExtensionConfiguration.ts │ │ │ │ ├── index.ts │ │ │ │ └── retry.ts │ │ │ ├── externals-check/ │ │ │ │ └── browser-externals-check.ts │ │ │ ├── feature-ids.ts │ │ │ ├── http/ │ │ │ │ └── httpHandlerInitialization.ts │ │ │ ├── http.ts │ │ │ ├── identity/ │ │ │ │ ├── apiKeyIdentity.ts │ │ │ │ ├── awsCredentialIdentity.ts │ │ │ │ ├── identity.ts │ │ │ │ ├── index.ts │ │ │ │ └── tokenIdentity.ts │ │ │ ├── index.ts │ │ │ ├── logger.ts │ │ │ ├── middleware.ts │ │ │ ├── pagination.ts │ │ │ ├── profile.ts │ │ │ ├── response.ts │ │ │ ├── retry.ts │ │ │ ├── schema/ │ │ │ │ ├── schema-deprecated.ts │ │ │ │ ├── schema.ts │ │ │ │ ├── sentinels.ts │ │ │ │ ├── static-schemas.ts │ │ │ │ └── traits.ts │ │ │ ├── serde.ts │ │ │ ├── shapes.ts │ │ │ ├── signature.ts │ │ │ ├── stream.ts │ │ │ ├── streaming-payload/ │ │ │ │ ├── streaming-blob-common-types.ts │ │ │ │ ├── streaming-blob-payload-input-types.ts │ │ │ │ └── streaming-blob-payload-output-types.ts │ │ │ ├── transfer.ts │ │ │ ├── transform/ │ │ │ │ ├── client-method-transforms.ts │ │ │ │ ├── client-payload-blob-type-narrow.spec.ts │ │ │ │ ├── client-payload-blob-type-narrow.ts │ │ │ │ ├── exact.ts │ │ │ │ ├── mutable.ts │ │ │ │ ├── no-undefined.spec.ts │ │ │ │ ├── no-undefined.ts │ │ │ │ ├── type-transform.spec.ts │ │ │ │ └── type-transform.ts │ │ │ ├── uri.ts │ │ │ ├── util.spec.ts │ │ │ ├── util.ts │ │ │ └── waiter.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.test.json │ │ └── tsconfig.types.json │ ├── url-parser/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-base64/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-body-length-browser/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-body-length-node/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-buffer-from/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-config-provider/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-defaults-mode-browser/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-defaults-mode-node/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-endpoints/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-hex-encoding/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-middleware/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-retry/ │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-stream/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-uri-escape/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-utf8/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ ├── util-waiter/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ └── tsconfig.types.json │ └── uuid/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── package.json │ ├── src/ │ │ └── index.ts │ ├── tsconfig.cjs.json │ ├── tsconfig.es.json │ └── tsconfig.types.json ├── prettier.config.js ├── private/ │ ├── my-local-model/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── XYZService.ts │ │ │ ├── XYZServiceClient.ts │ │ │ ├── auth/ │ │ │ │ ├── httpAuthExtensionConfiguration.ts │ │ │ │ └── httpAuthSchemeProvider.ts │ │ │ ├── commands/ │ │ │ │ ├── CamelCaseOperationCommand.ts │ │ │ │ ├── GetNumbersCommand.ts │ │ │ │ ├── HttpLabelCommandCommand.ts │ │ │ │ ├── TradeEventStreamCommand.ts │ │ │ │ └── index.ts │ │ │ ├── endpoint/ │ │ │ │ ├── EndpointParameters.ts │ │ │ │ ├── bdd.ts │ │ │ │ └── endpointResolver.ts │ │ │ ├── extensionConfiguration.ts │ │ │ ├── index.ts │ │ │ ├── models/ │ │ │ │ ├── XYZServiceSyntheticServiceException.ts │ │ │ │ ├── errors.ts │ │ │ │ └── models_0.ts │ │ │ ├── pagination/ │ │ │ │ ├── GetNumbersPaginator.ts │ │ │ │ ├── Interfaces.ts │ │ │ │ ├── camelCaseOperationPaginator.ts │ │ │ │ └── index.ts │ │ │ ├── protocols/ │ │ │ │ └── Rpcv2cbor.ts │ │ │ ├── runtimeConfig.browser.ts │ │ │ ├── runtimeConfig.native.ts │ │ │ ├── runtimeConfig.shared.ts │ │ │ ├── runtimeConfig.ts │ │ │ ├── runtimeExtensions.ts │ │ │ └── waiters/ │ │ │ ├── index.ts │ │ │ ├── waitForNumbersAligned.ts │ │ │ ├── waitForNumbersMisaligned.ts │ │ │ └── waitForNumbersWhatDoTheyDoAnyway.ts │ │ ├── test/ │ │ │ └── functional/ │ │ │ └── rpcv2cbor.spec.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── my-local-model-schema/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── XYZService.ts │ │ │ ├── XYZServiceClient.ts │ │ │ ├── auth/ │ │ │ │ ├── httpAuthExtensionConfiguration.ts │ │ │ │ └── httpAuthSchemeProvider.ts │ │ │ ├── commands/ │ │ │ │ ├── CamelCaseOperationCommand.ts │ │ │ │ ├── GetNumbersCommand.ts │ │ │ │ ├── HttpLabelCommandCommand.ts │ │ │ │ ├── TradeEventStreamCommand.ts │ │ │ │ └── index.ts │ │ │ ├── endpoint/ │ │ │ │ ├── EndpointParameters.ts │ │ │ │ ├── bdd.ts │ │ │ │ └── endpointResolver.ts │ │ │ ├── extensionConfiguration.ts │ │ │ ├── index.ts │ │ │ ├── models/ │ │ │ │ ├── XYZServiceSyntheticServiceException.ts │ │ │ │ ├── errors.ts │ │ │ │ └── models_0.ts │ │ │ ├── pagination/ │ │ │ │ ├── GetNumbersPaginator.ts │ │ │ │ ├── Interfaces.ts │ │ │ │ ├── camelCaseOperationPaginator.ts │ │ │ │ └── index.ts │ │ │ ├── runtimeConfig.browser.ts │ │ │ ├── runtimeConfig.native.ts │ │ │ ├── runtimeConfig.shared.ts │ │ │ ├── runtimeConfig.ts │ │ │ ├── runtimeExtensions.ts │ │ │ ├── schemas/ │ │ │ │ └── schemas_0.ts │ │ │ └── waiters/ │ │ │ ├── index.ts │ │ │ ├── waitForNumbersAligned.ts │ │ │ ├── waitForNumbersMisaligned.ts │ │ │ └── waitForNumbersWhatDoTheyDoAnyway.ts │ │ ├── test/ │ │ │ ├── functional/ │ │ │ │ └── rpcv2cbor.spec.ts │ │ │ ├── index-objects.spec.mjs │ │ │ ├── index-types.ts │ │ │ ├── snapshots/ │ │ │ │ ├── req/ │ │ │ │ │ ├── CamelCaseOperation.txt │ │ │ │ │ ├── GetNumbers.txt │ │ │ │ │ ├── HttpLabelCommand.txt │ │ │ │ │ └── TradeEventStream.txt │ │ │ │ ├── res/ │ │ │ │ │ ├── CamelCaseOperation.txt │ │ │ │ │ ├── GetNumbers.txt │ │ │ │ │ ├── HttpLabelCommand.txt │ │ │ │ │ └── TradeEventStream.txt │ │ │ │ └── res-err/ │ │ │ │ ├── CodedThrottlingError.txt │ │ │ │ ├── HaltError.txt │ │ │ │ ├── MainServiceLinkedError.txt │ │ │ │ ├── MysteryThrottlingError.txt │ │ │ │ ├── RetryableError.txt │ │ │ │ ├── UnmodeledServiceException.txt │ │ │ │ └── XYZServiceServiceException.txt │ │ │ └── snapshots.integ.spec.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── smithy-rpcv2-cbor/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── RpcV2Protocol.ts │ │ │ ├── RpcV2ProtocolClient.ts │ │ │ ├── auth/ │ │ │ │ ├── httpAuthExtensionConfiguration.ts │ │ │ │ └── httpAuthSchemeProvider.ts │ │ │ ├── commands/ │ │ │ │ ├── EmptyInputOutputCommand.ts │ │ │ │ ├── Float16Command.ts │ │ │ │ ├── FractionalSecondsCommand.ts │ │ │ │ ├── GreetingWithErrorsCommand.ts │ │ │ │ ├── NoInputOutputCommand.ts │ │ │ │ ├── OperationWithDefaultsCommand.ts │ │ │ │ ├── OptionalInputOutputCommand.ts │ │ │ │ ├── RecursiveShapesCommand.ts │ │ │ │ ├── RpcV2CborDenseMapsCommand.ts │ │ │ │ ├── RpcV2CborListsCommand.ts │ │ │ │ ├── RpcV2CborSparseMapsCommand.ts │ │ │ │ ├── SimpleScalarPropertiesCommand.ts │ │ │ │ ├── SparseNullsOperationCommand.ts │ │ │ │ └── index.ts │ │ │ ├── endpoint/ │ │ │ │ ├── EndpointParameters.ts │ │ │ │ ├── bdd.ts │ │ │ │ └── endpointResolver.ts │ │ │ ├── extensionConfiguration.ts │ │ │ ├── index.ts │ │ │ ├── models/ │ │ │ │ ├── RpcV2ProtocolServiceException.ts │ │ │ │ ├── enums.ts │ │ │ │ ├── errors.ts │ │ │ │ └── models_0.ts │ │ │ ├── protocols/ │ │ │ │ └── Rpcv2cbor.ts │ │ │ ├── runtimeConfig.browser.ts │ │ │ ├── runtimeConfig.native.ts │ │ │ ├── runtimeConfig.shared.ts │ │ │ ├── runtimeConfig.ts │ │ │ └── runtimeExtensions.ts │ │ ├── test/ │ │ │ ├── functional/ │ │ │ │ └── rpcv2cbor.spec.ts │ │ │ ├── index-objects.spec.mjs │ │ │ └── index-types.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ ├── smithy-rpcv2-cbor-schema/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── RpcV2Protocol.ts │ │ │ ├── RpcV2ProtocolClient.ts │ │ │ ├── auth/ │ │ │ │ ├── httpAuthExtensionConfiguration.ts │ │ │ │ └── httpAuthSchemeProvider.ts │ │ │ ├── commands/ │ │ │ │ ├── EmptyInputOutputCommand.ts │ │ │ │ ├── Float16Command.ts │ │ │ │ ├── FractionalSecondsCommand.ts │ │ │ │ ├── GreetingWithErrorsCommand.ts │ │ │ │ ├── NoInputOutputCommand.ts │ │ │ │ ├── OperationWithDefaultsCommand.ts │ │ │ │ ├── OptionalInputOutputCommand.ts │ │ │ │ ├── RecursiveShapesCommand.ts │ │ │ │ ├── RpcV2CborDenseMapsCommand.ts │ │ │ │ ├── RpcV2CborListsCommand.ts │ │ │ │ ├── RpcV2CborSparseMapsCommand.ts │ │ │ │ ├── SimpleScalarPropertiesCommand.ts │ │ │ │ ├── SparseNullsOperationCommand.ts │ │ │ │ └── index.ts │ │ │ ├── endpoint/ │ │ │ │ ├── EndpointParameters.ts │ │ │ │ ├── bdd.ts │ │ │ │ └── endpointResolver.ts │ │ │ ├── extensionConfiguration.ts │ │ │ ├── index.ts │ │ │ ├── models/ │ │ │ │ ├── RpcV2ProtocolServiceException.ts │ │ │ │ ├── enums.ts │ │ │ │ ├── errors.ts │ │ │ │ └── models_0.ts │ │ │ ├── runtimeConfig.browser.ts │ │ │ ├── runtimeConfig.native.ts │ │ │ ├── runtimeConfig.shared.ts │ │ │ ├── runtimeConfig.ts │ │ │ ├── runtimeExtensions.ts │ │ │ └── schemas/ │ │ │ └── schemas_0.ts │ │ ├── test/ │ │ │ ├── functional/ │ │ │ │ └── rpcv2cbor.spec.ts │ │ │ ├── index-objects.spec.mjs │ │ │ ├── index-types.ts │ │ │ ├── snapshots/ │ │ │ │ ├── req/ │ │ │ │ │ ├── EmptyInputOutput.txt │ │ │ │ │ ├── Float16.txt │ │ │ │ │ ├── FractionalSeconds.txt │ │ │ │ │ ├── GreetingWithErrors.txt │ │ │ │ │ ├── NoInputOutput.txt │ │ │ │ │ ├── OperationWithDefaults.txt │ │ │ │ │ ├── OptionalInputOutput.txt │ │ │ │ │ ├── RecursiveShapes.txt │ │ │ │ │ ├── RpcV2CborDenseMaps.txt │ │ │ │ │ ├── RpcV2CborLists.txt │ │ │ │ │ ├── RpcV2CborSparseMaps.txt │ │ │ │ │ ├── SimpleScalarProperties.txt │ │ │ │ │ └── SparseNullsOperation.txt │ │ │ │ ├── res/ │ │ │ │ │ ├── EmptyInputOutput.txt │ │ │ │ │ ├── Float16.txt │ │ │ │ │ ├── FractionalSeconds.txt │ │ │ │ │ ├── GreetingWithErrors.txt │ │ │ │ │ ├── NoInputOutput.txt │ │ │ │ │ ├── OperationWithDefaults.txt │ │ │ │ │ ├── OptionalInputOutput.txt │ │ │ │ │ ├── RecursiveShapes.txt │ │ │ │ │ ├── RpcV2CborDenseMaps.txt │ │ │ │ │ ├── RpcV2CborLists.txt │ │ │ │ │ ├── RpcV2CborSparseMaps.txt │ │ │ │ │ ├── SimpleScalarProperties.txt │ │ │ │ │ └── SparseNullsOperation.txt │ │ │ │ └── res-err/ │ │ │ │ ├── ComplexError.txt │ │ │ │ ├── InvalidGreeting.txt │ │ │ │ ├── UnmodeledServiceException.txt │ │ │ │ └── ValidationException.txt │ │ │ └── snapshots.integ.spec.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ ├── tsconfig.types.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ └── util-test/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── package.json │ ├── src/ │ │ ├── index.ts │ │ └── test-http-handler.ts │ ├── tsconfig.cjs.json │ ├── tsconfig.es.json │ └── tsconfig.types.json ├── scripts/ │ ├── build-generated-test-packages.js │ ├── check-dependencies.js │ ├── cli-dispatcher/ │ │ ├── index.js │ │ ├── lib/ │ │ │ ├── Package.js │ │ │ ├── findFolders.js │ │ │ ├── findScripts.js │ │ │ ├── matchSorter.js │ │ │ └── matcher.js │ │ ├── readme.md │ │ ├── set-alias.sh │ │ └── workspace.js │ ├── compilation/ │ │ ├── Inliner.js │ │ └── tmp/ │ │ └── .gitignore │ ├── example.js │ ├── inline.js │ ├── package-json-enforcement.js │ ├── post-protocol-test-codegen.js │ ├── retry.js │ ├── runtime-dep-version-check.js │ ├── set-engines.js │ ├── utils/ │ │ ├── list-folders.js │ │ ├── spawn-process.js │ │ └── walk.js │ └── validation/ │ ├── api-snapshot-validation.js │ └── no-generic-byte-arrays.js ├── settings.gradle.kts ├── smithy-typescript-codegen/ │ ├── build.gradle.kts │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── software/ │ │ │ └── amazon/ │ │ │ └── smithy/ │ │ │ └── typescript/ │ │ │ └── codegen/ │ │ │ ├── ApplicationProtocol.java │ │ │ ├── CodegenUtils.java │ │ │ ├── CommandGenerator.java │ │ │ ├── Dependency.java │ │ │ ├── DirectedTypeScriptCodegen.java │ │ │ ├── EnumGenerator.java │ │ │ ├── ExtensionConfigurationGenerator.java │ │ │ ├── FrameworkErrorModel.java │ │ │ ├── HttpProtocolTestGenerator.java │ │ │ ├── ImportDeclarations.java │ │ │ ├── IndexGenerator.java │ │ │ ├── IntEnumGenerator.java │ │ │ ├── LanguageTarget.java │ │ │ ├── PackageApiValidationGenerator.java │ │ │ ├── PackageContainer.java │ │ │ ├── PackageJsonGenerator.java │ │ │ ├── PaginationGenerator.java │ │ │ ├── RuntimeConfigGenerator.java │ │ │ ├── RuntimeExtensionsGenerator.java │ │ │ ├── ServerCommandGenerator.java │ │ │ ├── ServerGenerator.java │ │ │ ├── ServerSymbolVisitor.java │ │ │ ├── ServiceAggregatedClientGenerator.java │ │ │ ├── ServiceBareBonesClientGenerator.java │ │ │ ├── SmithyCoreSubmodules.java │ │ │ ├── StructureGenerator.java │ │ │ ├── StructuredMemberWriter.java │ │ │ ├── SymbolVisitor.java │ │ │ ├── TypeScriptClientCodegenPlugin.java │ │ │ ├── TypeScriptCodegenContext.java │ │ │ ├── TypeScriptCodegenPlugin.java │ │ │ ├── TypeScriptDelegator.java │ │ │ ├── TypeScriptDependency.java │ │ │ ├── TypeScriptJmesPathVisitor.java │ │ │ ├── TypeScriptSSDKCodegenPlugin.java │ │ │ ├── TypeScriptServerCodegenPlugin.java │ │ │ ├── TypeScriptSettings.java │ │ │ ├── TypeScriptUtils.java │ │ │ ├── TypeScriptWriter.java │ │ │ ├── UnionGenerator.java │ │ │ ├── UnresolvableProtocolException.java │ │ │ ├── WaiterGenerator.java │ │ │ ├── auth/ │ │ │ │ ├── AuthUtils.java │ │ │ │ └── http/ │ │ │ │ ├── ConfigField.java │ │ │ │ ├── HttpAuthOptionProperty.java │ │ │ │ ├── HttpAuthScheme.java │ │ │ │ ├── HttpAuthSchemeParameter.java │ │ │ │ ├── HttpAuthSchemeProviderGenerator.java │ │ │ │ ├── ResolveConfigFunction.java │ │ │ │ ├── SupportedHttpAuthSchemesIndex.java │ │ │ │ ├── integration/ │ │ │ │ │ ├── AddHttpAuthSchemePlugin.java │ │ │ │ │ ├── AddHttpSigningPlugin.java │ │ │ │ │ ├── HttpAuthExtensionConfigurationInterface.java │ │ │ │ │ ├── HttpAuthRuntimeExtensionIntegration.java │ │ │ │ │ ├── HttpAuthTypeScriptIntegration.java │ │ │ │ │ ├── SupportHttpApiKeyAuth.java │ │ │ │ │ ├── SupportHttpBearerAuth.java │ │ │ │ │ └── SupportNoAuth.java │ │ │ │ └── sections/ │ │ │ │ ├── DefaultHttpAuthSchemeParametersProviderFunctionCodeSection.java │ │ │ │ ├── DefaultHttpAuthSchemeProviderFunctionCodeSection.java │ │ │ │ ├── HttpAuthOptionFunctionCodeSection.java │ │ │ │ ├── HttpAuthOptionFunctionsCodeSection.java │ │ │ │ ├── HttpAuthSchemeInputConfigInterfaceCodeSection.java │ │ │ │ ├── HttpAuthSchemeParametersInterfaceCodeSection.java │ │ │ │ ├── HttpAuthSchemeParametersProviderInterfaceCodeSection.java │ │ │ │ ├── HttpAuthSchemeProviderInterfaceCodeSection.java │ │ │ │ ├── HttpAuthSchemeResolvedConfigInterfaceCodeSection.java │ │ │ │ ├── ResolveHttpAuthSchemeConfigFunctionCodeSection.java │ │ │ │ ├── ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection.java │ │ │ │ └── ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection.java │ │ │ ├── documentation/ │ │ │ │ ├── DocumentationExampleGenerator.java │ │ │ │ └── StructureExampleGenerator.java │ │ │ ├── endpointsV2/ │ │ │ │ ├── AddDefaultEndpointRuleSet.java │ │ │ │ ├── ClientConfigKeys.java │ │ │ │ ├── ConditionSerializer.java │ │ │ │ ├── ConvertBdd.java │ │ │ │ ├── EndpointsParamNameMap.java │ │ │ │ ├── EndpointsV2Generator.java │ │ │ │ ├── OmitEndpointParams.java │ │ │ │ ├── ParameterGenerator.java │ │ │ │ ├── RuleSerializer.java │ │ │ │ ├── RuleSetParameterFinder.java │ │ │ │ ├── RuleSetParametersVisitor.java │ │ │ │ └── RuleSetSerializer.java │ │ │ ├── extensions/ │ │ │ │ ├── DefaultExtensionConfigurationInterface.java │ │ │ │ ├── ExtensionConfigurationInterface.java │ │ │ │ └── HttpHandlerExtensionConfigurationInterface.java │ │ │ ├── integration/ │ │ │ │ ├── AddBaseServiceExceptionClass.java │ │ │ │ ├── AddBuiltinPlugins.java │ │ │ │ ├── AddChecksumRequiredDependency.java │ │ │ │ ├── AddClientRuntimeConfig.java │ │ │ │ ├── AddCompressionDependency.java │ │ │ │ ├── AddDefaultsModeDependency.java │ │ │ │ ├── AddEventStreamDependency.java │ │ │ │ ├── AddHttpApiKeyAuthPlugin.java │ │ │ │ ├── AddProtocolConfig.java │ │ │ │ ├── AddSdkStreamMixinDependency.java │ │ │ │ ├── DefaultReadmeGenerator.java │ │ │ │ ├── DocumentMemberDeserVisitor.java │ │ │ │ ├── DocumentMemberSerVisitor.java │ │ │ │ ├── DocumentShapeDeserVisitor.java │ │ │ │ ├── DocumentShapeSerVisitor.java │ │ │ │ ├── EventStreamGenerator.java │ │ │ │ ├── HttpBindingProtocolGenerator.java │ │ │ │ ├── HttpProtocolGeneratorUtils.java │ │ │ │ ├── HttpRpcProtocolGenerator.java │ │ │ │ ├── ProtocolGenerator.java │ │ │ │ ├── RuntimeClientPlugin.java │ │ │ │ └── TypeScriptIntegration.java │ │ │ ├── knowledge/ │ │ │ │ ├── SerdeElisionIndex.java │ │ │ │ └── ServiceClosure.java │ │ │ ├── protocols/ │ │ │ │ ├── AddProtocols.java │ │ │ │ ├── ProtocolPriorityConfig.java │ │ │ │ ├── SmithyProtocolUtils.java │ │ │ │ └── cbor/ │ │ │ │ ├── CborMemberDeserVisitor.java │ │ │ │ ├── CborMemberSerVisitor.java │ │ │ │ ├── CborShapeDeserVisitor.java │ │ │ │ ├── CborShapeSerVisitor.java │ │ │ │ └── SmithyRpcV2Cbor.java │ │ │ ├── schema/ │ │ │ │ ├── SchemaGenerationAllowlist.java │ │ │ │ ├── SchemaGenerator.java │ │ │ │ ├── SchemaReferenceIndex.java │ │ │ │ ├── SchemaTraitExtension.java │ │ │ │ ├── SchemaTraitFilterIndex.java │ │ │ │ ├── SchemaTraitGenerator.java │ │ │ │ └── SchemaTraitWriter.java │ │ │ ├── sections/ │ │ │ │ ├── ClientBodyExtraCodeSection.java │ │ │ │ ├── ClientConfigCodeSection.java │ │ │ │ ├── ClientConstructorCodeSection.java │ │ │ │ ├── ClientDestroyCodeSection.java │ │ │ │ ├── ClientPropertiesCodeSection.java │ │ │ │ ├── CommandBodyExtraCodeSection.java │ │ │ │ ├── CommandConstructorCodeSection.java │ │ │ │ ├── CommandContextCodeSection.java │ │ │ │ ├── CommandPropertiesCodeSection.java │ │ │ │ ├── PreCommandClassCodeSection.java │ │ │ │ └── SmithyContextCodeSection.java │ │ │ ├── util/ │ │ │ │ ├── ClientWriterConsumer.java │ │ │ │ ├── CommandWriterConsumer.java │ │ │ │ ├── JavaScriptObjectWriter.java │ │ │ │ ├── PatternDetectionCompression.java │ │ │ │ ├── PropertyAccessor.java │ │ │ │ └── StringStore.java │ │ │ └── validation/ │ │ │ ├── ImportFrom.java │ │ │ ├── LongValidator.java │ │ │ ├── ReplaceLast.java │ │ │ ├── SensitiveDataFinder.java │ │ │ └── UnaryFunctionCall.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ └── services/ │ │ │ ├── software.amazon.smithy.build.SmithyBuildPlugin │ │ │ └── software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration │ │ └── software/ │ │ └── amazon/ │ │ └── smithy/ │ │ └── typescript/ │ │ └── codegen/ │ │ ├── base-package.json │ │ ├── extensionConfiguration.template │ │ ├── framework-errors.smithy │ │ ├── integration/ │ │ │ ├── default_readme_client.md.template │ │ │ ├── default_readme_server.md.template │ │ │ └── http-api-key-auth.ts │ │ ├── malformed-request-test-regex-json-stub.ts │ │ ├── protocol-test-cbor-stub.ts │ │ ├── protocol-test-form-urlencoded-stub.ts │ │ ├── protocol-test-json-stub.ts │ │ ├── protocol-test-octet-stream-stub.ts │ │ ├── protocol-test-stub.ts │ │ ├── protocol-test-text-stub.ts │ │ ├── protocol-test-unknown-type-stub.ts │ │ ├── protocol-test-xml-stub.ts │ │ ├── reserved-words-members.txt │ │ ├── reserved-words.txt │ │ ├── resolveRuntimeExtensions1.template │ │ ├── resolveRuntimeExtensions2.template │ │ ├── runtimeConfig.browser.ts.template │ │ ├── runtimeConfig.native.ts.template │ │ ├── runtimeConfig.shared.ts.template │ │ ├── runtimeConfig.ts.template │ │ ├── runtimeExtensions1.template │ │ ├── runtimeExtensions2.template │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ ├── tsconfig.types.json │ │ ├── typedoc.json │ │ ├── vitest.config.integ.mts │ │ └── vitest.config.mts │ └── test/ │ ├── java/ │ │ └── software/ │ │ └── amazon/ │ │ └── smithy/ │ │ └── typescript/ │ │ └── codegen/ │ │ ├── ApplicationProtocolTest.java │ │ ├── CodegenUtilsTest.java │ │ ├── CommandGeneratorTest.java │ │ ├── DefaultDefaultReadmeGeneratorTest.java │ │ ├── EnumGeneratorTest.java │ │ ├── ImportDeclarationsTest.java │ │ ├── IndexGeneratorTest.java │ │ ├── IntEnumGeneratorTest.java │ │ ├── PackageJsonGeneratorTest.java │ │ ├── RuntimeConfigGeneratorTest.java │ │ ├── ServiceBareBonesClientGeneratorTest.java │ │ ├── StructureGeneratorTest.java │ │ ├── SymbolDecoratorIntegration.java │ │ ├── SymbolProviderTest.java │ │ ├── TypeScriptCodegenPluginTest.java │ │ ├── TypeScriptDelegatorTest.java │ │ ├── TypeScriptDependencyTest.java │ │ ├── TypeScriptJmesPathVisitorTest.java │ │ ├── TypeScriptSettingsTest.java │ │ ├── TypeScriptUtilsTest.java │ │ ├── TypeScriptWriterTest.java │ │ ├── UnionGeneratorTest.java │ │ ├── documentation/ │ │ │ ├── DocumentationExampleGeneratorTest.java │ │ │ └── StructureExampleGeneratorTest.java │ │ ├── endpointsV2/ │ │ │ ├── EndpointsV2GeneratorTest.java │ │ │ └── RuleSetParameterFinderTest.java │ │ ├── integration/ │ │ │ ├── AddHttpApiKeyAuthPluginTest.java │ │ │ ├── DocumentMemberDeserVisitorTest.java │ │ │ ├── DocumentMemberSerVisitorTest.java │ │ │ ├── EventStreamGeneratorTest.java │ │ │ ├── HttpProtocolGeneratorUtilsTest.java │ │ │ ├── ProtocolGeneratorTest.java │ │ │ └── RuntimeClientPluginTest.java │ │ ├── knowledge/ │ │ │ └── SerdeElisionIndexTest.java │ │ ├── protocols/ │ │ │ └── cbor/ │ │ │ ├── CborMemberDeserVisitorTest.java │ │ │ ├── CborMemberSerVisitorTest.java │ │ │ ├── CborShapeDeserVisitorTest.java │ │ │ └── CborShapeSerVisitorTest.java │ │ ├── schema/ │ │ │ ├── SchemaReferenceIndexTest.java │ │ │ ├── SchemaTraitExtensionTest.java │ │ │ ├── SchemaTraitFilterIndexTest.java │ │ │ ├── SchemaTraitGeneratorTest.java │ │ │ └── SchemaTraitWriterTest.java │ │ ├── util/ │ │ │ ├── PatternDetectionCompressionTest.java │ │ │ ├── PropertyAccessorTest.java │ │ │ └── StringStoreTest.java │ │ └── validation/ │ │ ├── ImportFromTest.java │ │ ├── LongValidatorTest.java │ │ ├── ReplaceLastTest.java │ │ ├── SensitiveDataFinderTest.java │ │ └── UnaryFunctionCallTest.java │ └── resources/ │ ├── META-INF/ │ │ └── services/ │ │ └── software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration │ └── software/ │ └── amazon/ │ └── smithy/ │ └── typescript/ │ └── codegen/ │ ├── endpointsV2/ │ │ ├── endpoints-operation-context-params.smithy │ │ └── endpoints.smithy │ ├── error-test-empty.smithy │ ├── error-test-optional-member-no-message.smithy │ ├── error-test-optional-message.smithy │ ├── error-test-required-member-no-message.smithy │ ├── error-test-required-message.smithy │ ├── error-test-retryable-throttling.smithy │ ├── error-test-retryable.smithy │ ├── integration/ │ │ ├── endpoint-trait.smithy │ │ ├── http-api-key-auth-trait-all-optional.smithy │ │ ├── http-api-key-auth-trait-no-scheme.smithy │ │ ├── http-api-key-auth-trait-on-operation.smithy │ │ └── http-api-key-auth-trait.smithy │ ├── knowledge/ │ │ └── serde-elision.smithy │ ├── output-structure.smithy │ ├── simple-service-with-operation.smithy │ ├── simple-service.smithy │ ├── test-insensitive-list.smithy │ ├── test-insensitive-map.smithy │ ├── test-insensitive-simple-shape.smithy │ ├── test-list-with-sensitive-member.smithy │ ├── test-list-with-structure-with-sensitive-data.smithy │ ├── test-list-with-union-with-sensitive-data.smithy │ ├── test-map-with-sensitive-member.smithy │ ├── test-map-with-structure-with-sensitive-data.smithy │ ├── test-map-with-union-with-sensitive-data.smithy │ ├── test-recursive-shapes.smithy │ ├── test-required-member.smithy │ ├── test-sensitive-list.smithy │ ├── test-sensitive-map.smithy │ ├── test-sensitive-simple-shape.smithy │ ├── test-sensitive-structure.smithy │ ├── test-sensitive-union.smithy │ ├── test-streaming-union.smithy │ ├── test-structure-with-sensitive-data.smithy │ ├── test-structure-without-sensitive-data.smithy │ ├── test-union-with-list.smithy │ ├── test-union-with-map.smithy │ ├── test-union-with-sensitive-data.smithy │ ├── test-union-with-structure.smithy │ ├── test-union-without-sensitive-data.smithy │ ├── testmodel.smithy │ └── validation/ │ └── long-validation.smithy ├── smithy-typescript-codegen-test/ │ ├── build.gradle.kts │ ├── example-weather-customizations/ │ │ ├── build.gradle.kts │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── example/ │ │ │ └── weather/ │ │ │ ├── ExampleWeatherCustomEndpointsRuntimeConfig.java │ │ │ └── SupportWeatherSigV4Auth.java │ │ └── resources/ │ │ └── META-INF/ │ │ └── services/ │ │ └── software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration │ ├── model/ │ │ ├── common/ │ │ │ ├── fakeAuth.smithy │ │ │ └── fakeProtocol.smithy │ │ ├── identity-and-auth/ │ │ │ ├── httpApiKeyAuth/ │ │ │ │ └── HttpApiKeyAuthService.smithy │ │ │ └── httpBearerAuth/ │ │ │ └── HttpBearerAuthService.smithy │ │ └── weather/ │ │ ├── main.smithy │ │ ├── more-nesting.smithy │ │ └── nested.smithy │ ├── released-version-test/ │ │ ├── build.gradle.kts │ │ └── smithy-build.json │ └── smithy-build.json ├── smithy-typescript-protocol-test-codegen/ │ ├── build.gradle.kts │ ├── model/ │ │ └── my-local-model/ │ │ ├── HttpLabelCommand.smithy │ │ ├── main.smithy │ │ ├── my-local-model.smithy │ │ └── secondary.smithy │ └── smithy-build.json ├── smithy-typescript-ssdk-codegen-test-utils/ │ ├── build.gradle.kts │ └── src/ │ └── main/ │ ├── java/ │ │ └── software/ │ │ └── amazon/ │ │ └── smithy/ │ │ └── typescript/ │ │ └── ssdk/ │ │ └── codegen/ │ │ └── test/ │ │ └── utils/ │ │ ├── AddProtocols.java │ │ └── TestProtocolGenerator.java │ └── resources/ │ └── META-INF/ │ └── services/ │ └── software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration ├── smithy-typescript-ssdk-libs/ │ ├── README.md │ ├── server-apigateway/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── lambda.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ └── tsconfig.types.json │ ├── server-common/ │ │ ├── .gitignore │ │ ├── .npmignore │ │ ├── CHANGELOG.md │ │ ├── LICENSE │ │ ├── README.md │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── accept.spec.ts │ │ │ ├── accept.ts │ │ │ ├── errors.ts │ │ │ ├── httpbinding/ │ │ │ │ ├── index.ts │ │ │ │ ├── mux.spec.ts │ │ │ │ └── mux.ts │ │ │ ├── index.ts │ │ │ ├── unique.spec.ts │ │ │ ├── unique.ts │ │ │ └── validation/ │ │ │ ├── index.spec.ts │ │ │ ├── index.ts │ │ │ ├── validators.spec.ts │ │ │ └── validators.ts │ │ ├── tsconfig.cjs.json │ │ ├── tsconfig.es.json │ │ ├── tsconfig.json │ │ └── tsconfig.types.json │ └── server-node/ │ ├── .gitignore │ ├── .npmignore │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── jest.config.js │ ├── package.json │ ├── src/ │ │ ├── index.spec.ts │ │ ├── index.ts │ │ └── node.ts │ ├── tsconfig.cjs.json │ ├── tsconfig.es.json │ ├── tsconfig.json │ └── tsconfig.types.json ├── testbed/ │ └── bundlers/ │ ├── .gitignore │ ├── Makefile │ ├── applications/ │ │ ├── NormalizedSchema.ts │ │ ├── abstract-protocols.ts │ │ ├── cbor-client-aggregate.ts │ │ ├── cbor-client.ts │ │ ├── cbor-protocol.ts │ │ └── inactive/ │ │ └── .gitkeep │ ├── package.json │ └── runner/ │ ├── bundler-output-analysis.cjs │ └── run.mjs ├── tsconfig.cjs.json ├── tsconfig.es.json ├── tsconfig.json ├── tsconfig.test.json ├── tsconfig.types.json ├── turbo.json ├── vitest.config.browser.mts ├── vitest.config.integ.mts └── vitest.config.mts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .changeset/README.md ================================================ # Changesets Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) ================================================ FILE: .changeset/config.json ================================================ { "$schema": "https://unpkg.com/@changesets/config@2.3.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [], "linked": [], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": ["@aws-smithy/*"], "privatePackages": { "tag": false, "version": false } } ================================================ FILE: .eslintrc.js ================================================ module.exports = { parser: "@typescript-eslint/parser", // Specifies the ESLint parser parserOptions: { ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features sourceType: "module", // Allows for the use of imports }, extends: [ // Uses the recommended rules from the @typescript-eslint/eslint-plugin "plugin:@typescript-eslint/recommended", ], plugins: ["@typescript-eslint", "n"], rules: { /** Turn off strict enforcement */ "@typescript-eslint/ban-types": "off", "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/no-var-requires": "off", "@typescript-eslint/no-empty-function": "off", "@typescript-eslint/no-empty-interface": "off", "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/explicit-module-boundary-types": "off", "prefer-rest-params": "off", "@typescript-eslint/no-non-null-assertion": "off", // intentional usage "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-unsafe-function-type": "off", // temporary until upgrading ESLint "@typescript-eslint/no-unused-vars": "off", "@typescript-eslint/no-require-imports": "off", /** Warnings */ "@typescript-eslint/no-namespace": "warn", /** Errors */ "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-import-type-side-effects": "error", "n/prefer-node-protocol": "error", }, overrides: [ { files: ["packages/*/src/**/*.ts"], excludedFiles: ["packages/*/src/**/*.spec.ts"], rules: { "no-restricted-imports": [ "error", { patterns: [ { group: ["*src*", "*dist-*"], }, { group: [ "@smithy/util-hex-encoding", "@smithy/util-base64", "@smithy/util-body-length-browser", "@smithy/util-body-length-node", "@smithy/util-utf8", "@smithy/util-buffer-from", "@smithy/is-array-buffer", "@smithy/middleware-serde", "@smithy/hash-node", "@smithy/hash-blob-browser", "@smithy/hash-stream-node", "@smithy/md5-js", "@smithy/chunked-blob-reader", "@smithy/chunked-blob-reader-native", "@smithy/util-stream", "@smithy/uuid", ], message: "This package has been consolidated into @smithy/core/serde.", }, { group: [ "@smithy/smithy-client", "@smithy/middleware-stack", "@smithy/util-middleware", "@smithy/invalid-dependency", "@smithy/util-waiter", ], message: "This package has been consolidated into @smithy/core/client.", }, { group: [ "@smithy/config-resolver", "@smithy/util-config-provider", "@smithy/node-config-provider", "@smithy/shared-ini-file-loader", "@smithy/property-provider", "@smithy/util-defaults-mode-browser", "@smithy/util-defaults-mode-node", ], message: "This package has been consolidated into @smithy/core/config.", }, { group: [ "@smithy/protocol-http", "@smithy/middleware-content-length", "@smithy/util-uri-escape", "@smithy/querystring-builder", "@smithy/querystring-parser", "@smithy/url-parser", ], message: "This package has been consolidated into @smithy/core/protocols.", }, { group: ["@smithy/util-retry", "@smithy/middleware-retry", "@smithy/service-error-classification"], message: "This package has been consolidated into @smithy/core/retry.", }, { group: ["@smithy/util-endpoints", "@smithy/middleware-endpoint"], message: "This package has been consolidated into @smithy/core/endpoints.", }, { group: [ "@smithy/hash-blob-browser", "@smithy/hash-stream-node", "@smithy/md5-js", "@smithy/chunked-blob-reader", "@smithy/chunked-blob-reader-native", ], message: "This package has been consolidated into @smithy/core/checksum.", }, { group: [ "@smithy/eventstream-codec", "@smithy/eventstream-serde-universal", "@smithy/eventstream-serde-browser", "@smithy/eventstream-serde-node", "@smithy/eventstream-serde-config-resolver", ], message: "This package has been consolidated into @smithy/core/event-streams.", }, ], }, ], }, }, ], }; ================================================ FILE: .github/CODEOWNERS ================================================ * @smithy-lang/aws-sdk-js-team ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ *Issue #, if available:* *Description of changes:* If one or more of the packages in the `/packages` directory has been modified, be sure `yarn changeset add` has been run and its output has been committed and included in this pull request. See CONTRIBUTING.md. --- By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. ================================================ FILE: .github/workflows/ci.yml ================================================ name: ci on: push: branches: [main] pull_request: branches: [main] permissions: contents: read jobs: build: runs-on: ${{ matrix.os }} name: Java ${{ matrix.java }} ${{ matrix.os }} strategy: matrix: java: [17] os: [macos-latest, ubuntu-latest, windows-latest] steps: - uses: actions/checkout@v5 - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v5 with: java-version: ${{ matrix.java }} distribution: "corretto" - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - name: clean and build run: ./gradlew clean build -Plog-tests - name: publish run: ./gradlew publish protocol-tests: runs-on: ${{ matrix.os }} name: Protocol Tests strategy: matrix: java: [17] os: [ubuntu-latest] steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 22 cache: "yarn" - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v5 with: java-version: ${{ matrix.java }} distribution: "corretto" - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - name: clean and build run: ./gradlew clean build -Plog-tests - name: Install dependencies run: | yarn yarn turbo telemetry disable - name: Build packages run: node ./scripts/retry -- yarn build - name: Run protocol tests run: node ./scripts/retry -- yarn test:protocols lint-typescript: runs-on: ubuntu-latest name: TypeScript Lint steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 22 cache: "yarn" - name: Install dependencies run: yarn - name: Run eslint run: yarn lint --concurrency=3 test-typescript: runs-on: smithy-typescript_ubuntu-latest_8-core name: TypeScript Test ${{ matrix.node }} needs: ["ensure-typescript-packages-have-changesets", "lint-typescript", "ensure-typescript-formatted"] strategy: fail-fast: false matrix: node: [18, 20, 22, 24, 26] steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: ${{ matrix.node }} cache: "yarn" - name: Set up JDK 17 uses: actions/setup-java@v5 with: java-version: "17" distribution: "corretto" - name: Setup Gradle uses: gradle/actions/setup-gradle@v5 with: cache-encryption-key: ${{ secrets.GRADLE_ENCRYPTION_KEY }} - name: Install dependencies run: | yarn yarn turbo telemetry disable - name: Build and validate API snapshot run: node ./scripts/retry -- make api-snapshot - name: Run unit tests run: node ./scripts/retry -- yarn test - name: Run integration tests run: | yarn config set enableImmutableInstalls false node ./scripts/retry -- yarn test:integration extract-docs: runs-on: smithy-typescript_ubuntu-latest_8-core name: Extract Docs steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 22 cache: "yarn" - name: Install dependencies run: | yarn yarn turbo telemetry disable - name: Build packages run: node ./scripts/retry -- yarn build - name: Run API Extractor run: yarn extract:docs ensure-typescript-formatted: runs-on: ubuntu-latest name: Ensure TypeScript is formatted steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 22 cache: "yarn" - name: Install dependencies run: yarn - name: Run the code formatter run: yarn format # This checks the output of git diff. If it's not empty (i.e there were # changes) it'll return a non-zero error code. - name: Ensure there are no changes from running the formatter run: | git diff test -z "$(git diff)" ensure-typescript-packages-have-changesets: runs-on: ubuntu-latest name: Ensure TypeScript packages have changesets steps: - uses: actions/checkout@v5 # Include full git history needed for `yarn changeset status` with: ref: ${{github.event.pull_request.head.sha}} fetch-depth: 0 - uses: actions/setup-node@v5 with: node-version: 22 cache: "yarn" - name: Install run: yarn - name: Ensure changesets exist for each changed package run: yarn changeset status --since=origin/main ================================================ FILE: .github/workflows/git-sync.yml ================================================ name: git-sync-with-mirror on: push: branches: [main] workflow_dispatch: permissions: contents: read jobs: git-sync: runs-on: ubuntu-latest steps: - name: git-sync env: git_sync_source_repo: ${{ secrets.GIT_SYNC_SOURCE_REPO }} git_sync_destination_repo: ${{ secrets.GIT_SYNC_DESTINATION_REPO }} if: env.git_sync_source_repo && env.git_sync_destination_repo uses: wei/git-sync@v3 with: source_repo: ${{ secrets.GIT_SYNC_SOURCE_REPO }} source_branch: "main" destination_repo: ${{ secrets.GIT_SYNC_DESTINATION_REPO }} destination_branch: "main" source_ssh_private_key: ${{ secrets.GIT_SYNC_SOURCE_SSH_PRIVATE_KEY }} destination_ssh_private_key: ${{ secrets.GIT_SYNC_DESTINATION_SSH_PRIVATE_KEY }} ================================================ FILE: .github/workflows/release-npm-packages.yml ================================================ name: release-npm-packages on: workflow_dispatch: # on button click jobs: release: name: Release TypeScript packages to NPM runs-on: ubuntu-latest permissions: id-token: write contents: write steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 18 cache: "yarn" - name: Install dependencies run: yarn install - name: Version id: version run: | yarn changeset version echo "porcelain=$(git status --porcelain | wc -l)" >> $GITHUB_OUTPUT - name: Configure AWS Credentials id: credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-region: us-west-2 role-to-assume: ${{ secrets.JS_TEAM_ROLE_TO_ASSUME }} role-session-name: SmithyTypeScriptGitHubRelease audience: sts.amazonaws.com - name: Configure deploy key for push if: steps.version.outputs.porcelain != '0' run: | deploy_key=$(aws secretsmanager get-secret-value \ --region us-west-2 \ --secret-id ${{ secrets.DEPLOY_KEY_SECRET_ARN }} \ --query SecretString --output text) echo "::add-mask::$deploy_key" mkdir -p ~/.ssh echo "$deploy_key" > ~/.ssh/deploy_key chmod 600 ~/.ssh/deploy_key ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null git remote set-url origin git@github.com:smithy-lang/smithy-typescript.git git config core.sshCommand "ssh -i ~/.ssh/deploy_key -o IdentitiesOnly=yes" - name: Commit id: commit if: steps.version.outputs.porcelain != '0' run: | git config --global user.email "github-aws-smithy-automation@amazon.com" git config --global user.name "Smithy Automation" git add . git commit -m 'Version NPM packages' git push - name: Fetch NPM token id: token if: steps.commit.outcome == 'success' run: | aws configure --profile token set role_arn ${{ secrets.JS_TEAM_TOKEN_ROLE }} aws configure --profile token set credential_source Environment npm_token=$(aws secretsmanager get-secret-value --region us-west-2 --secret-id=smithy-typescript-npm-token --query SecretString --output text --profile token) echo "::add-mask::$npm_token" echo "NPM_TOKEN=$npm_token" >> $GITHUB_ENV - name: Stage Release id: stage if: steps.token.outcome == 'success' run: | yarn stage-release --concurrency=1 - name: Release id: release uses: changesets/action@v1 if: steps.stage.outcome == 'success' with: publish: yarn release env: NPM_TOKEN: ${{ env.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Failure Nofitication if: ${{ failure() }} run: aws cloudwatch put-metric-data --namespace SmithyTypeScriptPublish --metric-name NpmPackagePublishFailure --value 1 ================================================ FILE: .github/workflows/release-npm-ssdk-libs.yml ================================================ name: release-npm-ssdk-libs on: workflow_dispatch: # on button click jobs: release: name: Release to SSDK lib packages to NPM runs-on: ubuntu-latest permissions: id-token: write contents: write steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v5 with: node-version: 18 cache: "yarn" - name: Install dependencies run: yarn install - name: Configure AWS Credentials id: credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-region: us-west-2 role-to-assume: ${{ secrets.ROLE_TO_ASSUME }} role-session-name: SmithyTypeScriptGitHubRelease audience: sts.amazonaws.com - name: Fetch NPM token id: token run: | aws configure --profile token set role_arn ${{ secrets.TOKEN_ROLE }} aws configure --profile token set credential_source Environment npm_token=$(aws secretsmanager get-secret-value --region us-west-2 --secret-id=SMITHY_PUBLISH_npmToken --query SecretString --output text --profile token) echo "::add-mask::$npm_token" echo "NPM_TOKEN=$npm_token" >> $GITHUB_ENV - name: Stage Release id: stage if: steps.token.outcome == 'success' run: | yarn stage-release --concurrency=1 - name: Release id: release uses: changesets/action@v1 if: steps.stage.outcome == 'success' with: publish: yarn release env: NPM_TOKEN: ${{ env.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Failure Nofitication if: ${{ failure() }} run: aws cloudwatch put-metric-data --namespace SmithyTypeScriptPublish --metric-name NpmPackagePublishFailure --value 1 ================================================ FILE: .github/workflows/update-smithy-gradle-plugin.yml ================================================ name: Get latest smithy gradle plugin version on: workflow_dispatch: # on button click # Uncomment once permissions to create PRs has been added. schedule: # Runs every wednesday at 11 - cron: '0 11 * * WED' permissions: contents: write pull-requests: write jobs: get-version: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - name: Fetch latest smithy-gradle-plugin version id: fetch-latest run: | echo "latestSmithyGradle=$( \ curl -sL https://api.github.com/repos/smithy-lang/smithy-gradle-plugin/tags | \ jq -r '.[0].name')" >> $GITHUB_OUTPUT - name: Get current version id: get-current run: | cat gradle.properties >> $GITHUB_OUTPUT - name: Check if the current version of smithy-gradle-plugin should be updated id: update-check run: | echo update-required=$( \ [ "${{ steps.get-current.outputs.smithyGradleVersion }}" = "${{ steps.fetch-latest.outputs.latestSmithyGradle }}" ] \ && echo "false" || echo "true") >> $GITHUB_OUTPUT - name: Set up new git branch for version bump id: git-setup if: steps.update-check.outputs.update-required == 'true' run: | git checkout -b "automation/bump-smithy-gradle-version/${{ steps.fetch-latest.outputs.latestSmithyGradle }}" git config --global user.email "github-aws-smithy-automation@amazon.com" git config --global user.name "Smithy Automation" - name: Find and replace gradle version in properties files id: replace-current-version-properties if: steps.update-check.outputs.update-required == 'true' run: | find . -type f -name 'gradle.properties' \ -exec sed -i "s|smithyGradleVersion=${{ steps.get-current.outputs.smithyGradleVersion }}|smithyGradleVersion=${{ steps.fetch-latest.outputs.latestSmithyGradle }}|g" {} \; - name: Create PR if: steps.update-check.outputs.update-required == 'true' run: | git add . git commit -m 'Update smithy-gradle-plugin Version' git push --set-upstream origin "automation/bump-smithy-gradle-version/${{ steps.fetch-latest.outputs.latestSmithyGradle }}" gh pr create \ --title "[Automation] smithy-gradle-plugin Version Bump - \`${{ steps.fetch-latest.outputs.latestSmithyGradle }}\`" \ --body "Automated pull request to bump smithy gradle plugin version from ${{ steps.get-current.outputs.smithyGradleVersion }} to ${{ steps.fetch-latest.outputs.latestSmithyGradle }}" \ --base main echo "PR Created for version bump to ${{ steps.fetch-latest.outputs.latestSmithyGradle }}" env: GITHUB_TOKEN: ${{ secrets.PUSH_TOKEN }} ================================================ FILE: .gitignore ================================================ # Eclipse .classpath .project .settings/ # Intellij .idea/ *.iml *.iws # Mac .DS_Store # Maven target/ **/dependency-reduced-pom.xml # Gradle /.gradle build/ */out/ */*/out/ wrapper/ .attach_pid* # local scripting workspace # Visual Studio Code .vscode/* # Integ test Yarn stuff smithy-typescript-integ-tests/dist smithy-typescript-integ-tests/node_modules smithy-typescript-integ-tests/yarn.lock # Issue https://github.com/smithy-lang/smithy-typescript/issues/425 smithy-typescript-codegen/bin/ smithy-typescript-codegen-test/bin/ smithy-typescript-ssdk-codegen-test-utils/bin/ smithy-typescript-codegen-test/example-weather-customizations/bin/ testbed/bundlers/dist testbed/bundlers/dist-* **/node_modules/ **/*.tsbuildinfo **/*.d.ts **/yarn-error.log coverage **/.turbo dist-* *.tsbuildinfo .pnp.* .yarn/* !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/sdks !.yarn/versions # NPM release staging .release # Gradle composite build properties local.properties # doc-gen api-extractor-packages ================================================ FILE: .prettierignore ================================================ ./packages/**/dist/* ./packages/**/dist-types/* ./packages/**/dist-es/* ./packages/**/dist-cjs/* **/dist/* **/dist-types/* **/dist-es/* **/dist-cjs/* ================================================ FILE: .yarn/releases/yarn-4.10.3.cjs ================================================ #!/usr/bin/env node /* eslint-disable */ //prettier-ignore (()=>{var DGe=Object.create;var dU=Object.defineProperty;var PGe=Object.getOwnPropertyDescriptor;var bGe=Object.getOwnPropertyNames;var xGe=Object.getPrototypeOf,kGe=Object.prototype.hasOwnProperty;var Ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var Ze=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)dU(t,r,{get:e[r],enumerable:!0})},QGe=(t,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of bGe(e))!kGe.call(t,a)&&a!==r&&dU(t,a,{get:()=>e[a],enumerable:!(s=PGe(e,a))||s.enumerable});return t};var ut=(t,e,r)=>(r=t!=null?DGe(xGe(t)):{},QGe(e||!t||!t.__esModule?dU(r,"default",{value:t,enumerable:!0}):r,t));var fi={};Vt(fi,{SAFE_TIME:()=>HX,S_IFDIR:()=>Jb,S_IFLNK:()=>Kb,S_IFMT:()=>Mf,S_IFREG:()=>N2});var Mf,Jb,N2,Kb,HX,jX=Ze(()=>{Mf=61440,Jb=16384,N2=32768,Kb=40960,HX=456789e3});var or={};Vt(or,{EBADF:()=>Mo,EBUSY:()=>RGe,EEXIST:()=>MGe,EINVAL:()=>FGe,EISDIR:()=>LGe,ENOENT:()=>NGe,ENOSYS:()=>TGe,ENOTDIR:()=>OGe,ENOTEMPTY:()=>_Ge,EOPNOTSUPP:()=>HGe,EROFS:()=>UGe,ERR_DIR_CLOSED:()=>mU});function Cc(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function RGe(t){return Cc("EBUSY",t)}function TGe(t,e){return Cc("ENOSYS",`${t}, ${e}`)}function FGe(t){return Cc("EINVAL",`invalid argument, ${t}`)}function Mo(t){return Cc("EBADF",`bad file descriptor, ${t}`)}function NGe(t){return Cc("ENOENT",`no such file or directory, ${t}`)}function OGe(t){return Cc("ENOTDIR",`not a directory, ${t}`)}function LGe(t){return Cc("EISDIR",`illegal operation on a directory, ${t}`)}function MGe(t){return Cc("EEXIST",`file already exists, ${t}`)}function UGe(t){return Cc("EROFS",`read-only filesystem, ${t}`)}function _Ge(t){return Cc("ENOTEMPTY",`directory not empty, ${t}`)}function HGe(t){return Cc("EOPNOTSUPP",`operation not supported, ${t}`)}function mU(){return Cc("ERR_DIR_CLOSED","Directory handle was closed")}var zb=Ze(()=>{});var $a={};Vt($a,{BigIntStatsEntry:()=>iE,DEFAULT_MODE:()=>IU,DirEntry:()=>yU,StatEntry:()=>nE,areStatsEqual:()=>CU,clearStats:()=>Zb,convertToBigIntStats:()=>GGe,makeDefaultStats:()=>GX,makeEmptyStats:()=>jGe});function GX(){return new nE}function jGe(){return Zb(GX())}function Zb(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):EU.types.isDate(r)&&(t[e]=new Date(0))}return t}function GGe(t){let e=new iE;for(let r in t)if(Object.hasOwn(t,r)){let s=t[r];typeof s=="number"?e[r]=BigInt(s):EU.types.isDate(s)&&(e[r]=new Date(s))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function CU(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,s=e;return!(r.atimeNs!==s.atimeNs||r.mtimeNs!==s.mtimeNs||r.ctimeNs!==s.ctimeNs||r.birthtimeNs!==s.birthtimeNs)}var EU,IU,yU,nE,iE,wU=Ze(()=>{EU=ut(Ie("util")),IU=33188,yU=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},nE=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=IU;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},iE=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(IU);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function JGe(t){let e,r;if(e=t.match(YGe))t=e[1];else if(r=t.match(VGe))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function KGe(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(qGe))?t=`/${e[1]}`:(r=t.match(WGe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function Xb(t,e){return t===fe?WX(e):BU(e)}var O2,vt,Er,fe,J,qX,qGe,WGe,YGe,VGe,BU,WX,el=Ze(()=>{O2=ut(Ie("path")),vt={root:"/",dot:".",parent:".."},Er={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},fe=Object.create(O2.default),J=Object.create(O2.default.posix);fe.cwd=()=>process.cwd();J.cwd=process.platform==="win32"?()=>BU(process.cwd()):process.cwd;process.platform==="win32"&&(J.resolve=(...t)=>t.length>0&&J.isAbsolute(t[0])?O2.default.posix.resolve(...t):O2.default.posix.resolve(J.cwd(),...t));qX=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};fe.contains=(t,e)=>qX(fe,t,e);J.contains=(t,e)=>qX(J,t,e);qGe=/^([a-zA-Z]:.*)$/,WGe=/^\/\/(\.\/)?(.*)$/,YGe=/^\/([a-zA-Z]:.*)$/,VGe=/^\/unc\/(\.dot\/)?(.*)$/;BU=process.platform==="win32"?KGe:t=>t,WX=process.platform==="win32"?JGe:t=>t;fe.fromPortablePath=WX;fe.toPortablePath=BU});async function $b(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let s=[];for(let a of r)for(let n of r)s.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(s),e.indexPath}async function YX(t,e,r,s,a){let n=t.pathUtils.normalize(e),c=r.pathUtils.normalize(s),f=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:dd,mtime:dd}:await r.lstatPromise(c);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await vU(f,p,t,n,r,c,{...a,didParentExist:!0});for(let C of f)await C();await Promise.all(p.map(C=>C()))}async function vU(t,e,r,s,a,n,c){let f=c.didParentExist?await VX(r,s):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=c.stableTime?{atime:dd,mtime:dd}:p,C;switch(!0){case p.isDirectory():C=await ZGe(t,e,r,s,f,a,n,p,c);break;case p.isFile():C=await eqe(t,e,r,s,f,a,n,p,c);break;case p.isSymbolicLink():C=await tqe(t,e,r,s,f,a,n,p,c);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(c.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((C||f?.mtime?.getTime()!==E.getTime()||f?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(s,h,E)),C=!0),(f===null||(f.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(s,p.mode&511)),C=!0)),C}async function VX(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function ZGe(t,e,r,s,a,n,c,f,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(s,{mode:f.mode})}catch(S){if(S.code!=="EEXIST")throw S}}),h=!0);let E=await n.readdirPromise(c),C=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let S of E.sort())await vU(t,e,r,r.pathUtils.join(s,S),n,n.pathUtils.join(c,S),C)&&(h=!0);else(await Promise.all(E.map(async b=>{await vU(t,e,r,r.pathUtils.join(s,b),n,n.pathUtils.join(c,b),C)}))).some(b=>b)&&(h=!0);return h}async function XGe(t,e,r,s,a,n,c,f,p,h){let E=await n.checksumFilePromise(c,{algorithm:"sha1"}),C=420,S=f.mode&511,b=`${E}${S!==C?S.toString(8):""}`,I=r.pathUtils.join(h.indexPath,E.slice(0,2),`${b}.dat`),T;(le=>(le[le.Lock=0]="Lock",le[le.Rename=1]="Rename"))(T||={});let N=1,U=await VX(r,I);if(a){let ie=U&&a.dev===U.dev&&a.ino===U.ino,ue=U?.mtimeMs!==zGe;if(ie&&ue&&h.autoRepair&&(N=0,U=null),!ie)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1}let W=!U&&N===1?`${I}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,ee=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(I,async()=>{let ie=await n.readFilePromise(c);await r.writeFilePromise(I,ie)}),N===1&&W)){let ie=await n.readFilePromise(c);await r.writeFilePromise(W,ie);try{await r.linkPromise(W,I)}catch(ue){if(ue.code==="EEXIST")ee=!0,await r.unlinkPromise(W);else throw ue}}a||await r.linkPromise(I,s)}),e.push(async()=>{U||(await r.lutimesPromise(I,dd,dd),S!==C&&await r.chmodPromise(I,S)),W&&!ee&&await r.unlinkPromise(W)}),!1}async function $Ge(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(c);await r.writeFilePromise(s,h)}),!0}async function eqe(t,e,r,s,a,n,c,f,p){return p.linkStrategy?.type==="HardlinkFromIndex"?XGe(t,e,r,s,a,n,c,f,p,p.linkStrategy):$Ge(t,e,r,s,a,n,c,f,p)}async function tqe(t,e,r,s,a,n,c,f,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(s)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(Xb(r.pathUtils,await n.readlinkPromise(c)),s)}),!0}var dd,zGe,SU=Ze(()=>{el();dd=new Date(456789e3*1e3),zGe=dd.getTime()});function ex(t,e,r,s){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let c=t.pathUtils.join(e,n);return Object.assign(t.statSync(c),{name:n,path:void 0})};return new L2(e,a,s)}var L2,JX=Ze(()=>{zb();L2=class{constructor(e,r,s={}){this.path=e;this.nextDirent=r;this.opts=s;this.closed=!1}throwIfClosed(){if(this.closed)throw mU()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function KX(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var zX,tx,ZX=Ze(()=>{zX=Ie("events");wU();tx=class t extends zX.EventEmitter{constructor(r,s,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=s,this.bigint=a,this.lastStats=this.stat()}static create(r,s,a){let n=new t(r,s,a);return n.start(),n}start(){KX(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){KX(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new iE:new nE;return Zb(r)}}makeInterval(r){let s=setInterval(()=>{let a=this.stat(),n=this.lastStats;CU(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?s:s.unref()}registerChangeListener(r,s){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(s))}unregisterChangeListener(r){this.removeListener("change",r);let s=this.changeListeners.get(r);typeof s<"u"&&clearInterval(s),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function sE(t,e,r,s){let a,n,c,f;switch(typeof r){case"function":a=!1,n=!0,c=5007,f=r;break;default:({bigint:a=!1,persistent:n=!0,interval:c=5007}=r),f=s;break}let p=rx.get(t);typeof p>"u"&&rx.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=tx.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(f,{persistent:n,interval:c}),h}function md(t,e,r){let s=rx.get(t);if(typeof s>"u")return;let a=s.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),s.delete(e)))}function yd(t){let e=rx.get(t);if(!(typeof e>"u"))for(let r of e.keys())md(t,r)}var rx,DU=Ze(()=>{ZX();rx=new WeakMap});function rqe(t){let e=t.match(/\r?\n/g);if(e===null)return $X.EOL;let r=e.filter(a=>a===`\r `).length,s=e.length-r;return r>s?`\r `:` `}function Ed(t,e){return e.replace(/\r?\n/g,rqe(t))}var XX,$X,mp,Uf,Id=Ze(()=>{XX=Ie("crypto"),$X=Ie("os");SU();el();mp=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let s=[e];for(;s.length>0;){let a=s.shift();if((await this.lstatPromise(a)).isDirectory()){let c=await this.readdirPromise(a);if(r)for(let f of c.sort())s.push(this.pathUtils.join(a,f));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let s=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,XX.createHash)(r),f=0;for(;(f=await this.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await this.closePromise(s)}}async removePromise(e,{recursive:r=!0,maxRetries:s=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(c=>this.removePromise(this.pathUtils.resolve(e,c))))}for(let n=0;n<=s;n++)try{await this.rmdirPromise(e);break}catch(c){if(c.code!=="EBUSY"&&c.code!=="ENOTEMPTY")throw c;nsetTimeout(f,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let s;try{s=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(s.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{await this.mkdirPromise(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&await this.chmodPromise(f,r),s!=null)await this.utimesPromise(f,s[0],s[1]);else{let p=await this.statPromise(this.pathUtils.dirname(f));await this.utimesPromise(f,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:s}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let c=2;c<=a.length;++c){let f=a.slice(0,c).join(this.pathUtils.sep);if(!this.existsSync(f)){try{this.mkdirSync(f)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=f,r!=null&&this.chmodSync(f,r),s!=null)this.utimesSync(f,s[0],s[1]);else{let p=this.statSync(this.pathUtils.dirname(f));this.utimesSync(f,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:s=this,overwrite:a=!0,stableSort:n=!1,stableTime:c=!1,linkStrategy:f=null}={}){return await YX(this,e,s,r,{overwrite:a,stableSort:n,stableTime:c,linkStrategy:f})}copySync(e,r,{baseFs:s=this,overwrite:a=!0}={}){let n=s.lstatSync(r),c=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=s.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),s.pathUtils.join(r,h),{baseFs:s,overwrite:a})}else if(n.isFile()){if(!c||a){c&&this.removeSync(e);let p=s.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!c||a){c&&this.removeSync(e);let p=s.readlinkSync(r);this.symlinkSync(Xb(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let f=n.mode&511;this.chmodSync(e,f)}async changeFilePromise(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,s):this.changeFileTextPromise(e,r,s)}async changeFileBufferPromise(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:s})}async changeFileTextPromise(e,r,{automaticNewlines:s,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let c=s?Ed(n,r):r;n!==c&&await this.writeFilePromise(e,c,{mode:a})}changeFileSync(e,r,s={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,s):this.changeFileTextSync(e,r,s)}changeFileBufferSync(e,r,{mode:s}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:s})}changeFileTextSync(e,r,{automaticNewlines:s=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let c=s?Ed(n,r):r;n!==c&&this.writeFileSync(e,c,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(s){if(s.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw s}}moveSync(e,r){try{this.renameSync(e,r)}catch(s){if(s.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw s}}async lockPromise(e,r){let s=`${e}.flock`,a=1e3/60,n=Date.now(),c=null,f=async()=>{let p;try{[p]=await this.readJsonPromise(s)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;c===null;)try{c=await this.openPromise(s,"wx")}catch(p){if(p.code==="EEXIST"){if(!await f())try{await this.unlinkPromise(s);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${s})`)}else throw p}await this.writePromise(c,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(c),await this.unlinkPromise(s)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(s){throw s.message+=` (in ${e})`,s}}async writeJsonPromise(e,r,{compact:s=!1}={}){let a=s?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)} `)}writeJsonSync(e,r,{compact:s=!1}={}){let a=s?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)} `)}async preserveTimePromise(e,r){let s=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,s.atime,s.mtime)}async preserveTimeSync(e,r){let s=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,s.atime,s.mtime)}},Uf=class extends mp{constructor(){super(J)}}});var _s,yp=Ze(()=>{Id();_s=class extends mp{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,s){return this.baseFs.openPromise(this.mapToBase(e),r,s)}openSync(e,r,s){return this.baseFs.openSync(this.mapToBase(e),r,s)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,s,a,n){return await this.baseFs.readPromise(e,r,s,a,n)}readSync(e,r,s,a,n){return this.baseFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,s):await this.baseFs.writePromise(e,r,s,a,n)}writeSync(e,r,s,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,s):this.baseFs.writeSync(e,r,s,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,s){return this.baseFs.fchownPromise(e,r,s)}fchownSync(e,r,s){return this.baseFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return this.baseFs.chownPromise(this.mapToBase(e),r,s)}chownSync(e,r,s){return this.baseFs.chownSync(this.mapToBase(e),r,s)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,s=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),s)}copyFileSync(e,r,s=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),s)}async appendFilePromise(e,r,s){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,s)}appendFileSync(e,r,s){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,s)}async writeFilePromise(e,r,s){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,s)}writeFileSync(e,r,s){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,s)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,s){return this.baseFs.utimesPromise(this.mapToBase(e),r,s)}utimesSync(e,r,s){return this.baseFs.utimesSync(this.mapToBase(e),r,s)}async lutimesPromise(e,r,s){return this.baseFs.lutimesPromise(this.mapToBase(e),r,s)}lutimesSync(e,r,s){return this.baseFs.lutimesSync(this.mapToBase(e),r,s)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(c,a,s)}symlinkSync(e,r,s){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,s);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),c=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(c,a,s)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,s){return this.baseFs.watch(this.mapToBase(e),r,s)}watchFile(e,r,s){return this.baseFs.watchFile(this.mapToBase(e),r,s)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var _f,e$=Ze(()=>{yp();_f=class extends _s{constructor(e,{baseFs:r,pathUtils:s}){super(s),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function t$(t){let e=t;return typeof t.path=="string"&&(e.path=fe.toPortablePath(t.path)),e}var r$,Yn,Cd=Ze(()=>{r$=ut(Ie("fs"));Id();el();Yn=class extends Uf{constructor(e=r$.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return vt.root}resolve(e){return J.resolve(e)}async openPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.open(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}openSync(e,r,s){return this.realFs.openSync(fe.fromPortablePath(e),r,s)}async opendirPromise(e,r){return await new Promise((s,a)=>{typeof r<"u"?this.realFs.opendir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.opendir(fe.fromPortablePath(e),this.makeCallback(s,a))}).then(s=>{let a=s;return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(fe.fromPortablePath(e),r):this.realFs.opendirSync(fe.fromPortablePath(e));return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,s=0,a=0,n=-1){return await new Promise((c,f)=>{this.realFs.read(e,r,s,a,n,(p,h)=>{p?f(p):c(h)})})}readSync(e,r,s,a,n){return this.realFs.readSync(e,r,s,a,n)}async writePromise(e,r,s,a,n){return await new Promise((c,f)=>typeof r=="string"?this.realFs.write(e,r,s,this.makeCallback(c,f)):this.realFs.write(e,r,s,a,n,this.makeCallback(c,f)))}writeSync(e,r,s,a,n){return typeof r=="string"?this.realFs.writeSync(e,r,s):this.realFs.writeSync(e,r,s,a,n)}async closePromise(e){await new Promise((r,s)=>{this.realFs.close(e,this.makeCallback(r,s))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createReadStream(s,r)}createWriteStream(e,r){let s=e!==null?fe.fromPortablePath(e):e;return this.realFs.createWriteStream(s,r)}async realpathPromise(e){return await new Promise((r,s)=>{this.realFs.realpath(fe.fromPortablePath(e),{},this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}realpathSync(e){return fe.toPortablePath(this.realFs.realpathSync(fe.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(fe.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(fe.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((s,a)=>{this.realFs.access(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}existsSync(e){return this.realFs.existsSync(fe.fromPortablePath(e))}async statPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.stat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.stat(fe.fromPortablePath(e),this.makeCallback(s,a))})}statSync(e,r){return r?this.realFs.statSync(fe.fromPortablePath(e),r):this.realFs.statSync(fe.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(s,a)):this.realFs.fstat(e,this.makeCallback(s,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.lstat(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.lstat(fe.fromPortablePath(e),this.makeCallback(s,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(fe.fromPortablePath(e),r):this.realFs.lstatSync(fe.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.fchmod(e,r,this.makeCallback(s,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((s,a)=>{this.realFs.chmod(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}chmodSync(e,r){return this.realFs.chmodSync(fe.fromPortablePath(e),r)}async fchownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.fchown(e,r,s,this.makeCallback(a,n))})}fchownSync(e,r,s){return this.realFs.fchownSync(e,r,s)}async chownPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.chown(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}chownSync(e,r,s){return this.realFs.chownSync(fe.fromPortablePath(e),r,s)}async renamePromise(e,r){return await new Promise((s,a)=>{this.realFs.rename(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}renameSync(e,r){return this.realFs.renameSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async copyFilePromise(e,r,s=0){return await new Promise((a,n)=>{this.realFs.copyFile(fe.fromPortablePath(e),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}copyFileSync(e,r,s=0){return this.realFs.copyFileSync(fe.fromPortablePath(e),fe.fromPortablePath(r),s)}async appendFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.appendFile(c,r,s,this.makeCallback(a,n)):this.realFs.appendFile(c,r,this.makeCallback(a,n))})}appendFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.appendFileSync(a,r,s):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,s){return await new Promise((a,n)=>{let c=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.writeFile(c,r,s,this.makeCallback(a,n)):this.realFs.writeFile(c,r,this.makeCallback(a,n))})}writeFileSync(e,r,s){let a=typeof e=="string"?fe.fromPortablePath(e):e;s?this.realFs.writeFileSync(a,r,s):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,s)=>{this.realFs.unlink(fe.fromPortablePath(e),this.makeCallback(r,s))})}unlinkSync(e){return this.realFs.unlinkSync(fe.fromPortablePath(e))}async utimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.utimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}utimesSync(e,r,s){this.realFs.utimesSync(fe.fromPortablePath(e),r,s)}async lutimesPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.lutimes(fe.fromPortablePath(e),r,s,this.makeCallback(a,n))})}lutimesSync(e,r,s){this.realFs.lutimesSync(fe.fromPortablePath(e),r,s)}async mkdirPromise(e,r){return await new Promise((s,a)=>{this.realFs.mkdir(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(fe.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rmdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rmdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(fe.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((s,a)=>{r?this.realFs.rm(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.rm(fe.fromPortablePath(e),this.makeCallback(s,a))})}rmSync(e,r){return this.realFs.rmSync(fe.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((s,a)=>{this.realFs.link(fe.fromPortablePath(e),fe.fromPortablePath(r),this.makeCallback(s,a))})}linkSync(e,r){return this.realFs.linkSync(fe.fromPortablePath(e),fe.fromPortablePath(r))}async symlinkPromise(e,r,s){return await new Promise((a,n)=>{this.realFs.symlink(fe.fromPortablePath(e.replace(/\/+$/,"")),fe.fromPortablePath(r),s,this.makeCallback(a,n))})}symlinkSync(e,r,s){return this.realFs.symlinkSync(fe.fromPortablePath(e.replace(/\/+$/,"")),fe.fromPortablePath(r),s)}async readFilePromise(e,r){return await new Promise((s,a)=>{let n=typeof e=="string"?fe.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(s,a))})}readFileSync(e,r){let s=typeof e=="string"?fe.fromPortablePath(e):e;return this.realFs.readFileSync(s,r)}async readdirPromise(e,r){return await new Promise((s,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(t$)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(n=>s(n.map(fe.toPortablePath)),a)):this.realFs.readdir(fe.fromPortablePath(e),r,this.makeCallback(s,a)):this.realFs.readdir(fe.fromPortablePath(e),this.makeCallback(s,a))})}readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(fe.fromPortablePath(e),r).map(t$):this.realFs.readdirSync(fe.fromPortablePath(e),r).map(fe.toPortablePath):this.realFs.readdirSync(fe.fromPortablePath(e),r):this.realFs.readdirSync(fe.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,s)=>{this.realFs.readlink(fe.fromPortablePath(e),this.makeCallback(r,s))}).then(r=>fe.toPortablePath(r))}readlinkSync(e){return fe.toPortablePath(this.realFs.readlinkSync(fe.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.truncate(fe.fromPortablePath(e),r,this.makeCallback(s,a))})}truncateSync(e,r){return this.realFs.truncateSync(fe.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((s,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(s,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,s){return this.realFs.watch(fe.fromPortablePath(e),r,s)}watchFile(e,r,s){return this.realFs.watchFile(fe.fromPortablePath(e),r,s)}unwatchFile(e,r){return this.realFs.unwatchFile(fe.fromPortablePath(e),r)}makeCallback(e,r){return(s,a)=>{s?r(s):e(a)}}}});var Sn,n$=Ze(()=>{Cd();yp();el();Sn=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?J.normalize(e):this.baseFs.resolve(J.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var i$,Hf,s$=Ze(()=>{Cd();yp();el();i$=vt.root,Hf=class extends _s{constructor(e,{baseFs:r=new Yn}={}){super(J),this.target=this.pathUtils.resolve(vt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(vt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(i$,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(i$,this.pathUtils.relative(this.target,e))}}});var oE,o$=Ze(()=>{yp();oE=class extends _s{constructor(r,s){super(s);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var wd,tl,e0,a$=Ze(()=>{wd=Ie("fs");Id();Cd();DU();zb();el();tl=4278190080,e0=class extends Uf{constructor({baseFs:r=new Yn,filter:s=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:c=!0,maxAge:f=5e3,typeCheck:p=wd.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:C}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=c?new Map:null,this.factoryPromise=E,this.factorySync=C,this.filter=s,this.getMountPoint=h,this.magic=a<<24,this.maxAge=f,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(yd(this),this.mountInstances)for(let[r,{childFs:s}]of this.mountInstances.entries())s.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,s){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,s]),a}async openPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,s,a),async(n,{subPath:c})=>this.remapFd(n,await n.openPromise(c,s,a)))}openSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,s,a),(n,{subPath:c})=>this.remapFd(n,n.openSync(c,s,a)))}async opendirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,s),async(a,{subPath:n})=>await a.opendirPromise(n,s),{requireSubpath:!1})}opendirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,s),(a,{subPath:n})=>a.opendirSync(n,s),{requireSubpath:!1})}async readPromise(r,s,a,n,c){if((r&tl)!==this.magic)return await this.baseFs.readPromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("read");let[p,h]=f;return await p.readPromise(h,s,a,n,c)}readSync(r,s,a,n,c){if((r&tl)!==this.magic)return this.baseFs.readSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("readSync");let[p,h]=f;return p.readSync(h,s,a,n,c)}async writePromise(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="string"?await this.baseFs.writePromise(r,s,a):await this.baseFs.writePromise(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("write");let[p,h]=f;return typeof s=="string"?await p.writePromise(h,s,a):await p.writePromise(h,s,a,n,c)}writeSync(r,s,a,n,c){if((r&tl)!==this.magic)return typeof s=="string"?this.baseFs.writeSync(r,s,a):this.baseFs.writeSync(r,s,a,n,c);let f=this.fdMap.get(r);if(typeof f>"u")throw Mo("writeSync");let[p,h]=f;return typeof s=="string"?p.writeSync(h,s,a):p.writeSync(h,s,a,n,c)}async closePromise(r){if((r&tl)!==this.magic)return await this.baseFs.closePromise(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Mo("close");this.fdMap.delete(r);let[a,n]=s;return await a.closePromise(n)}closeSync(r){if((r&tl)!==this.magic)return this.baseFs.closeSync(r);let s=this.fdMap.get(r);if(typeof s>"u")throw Mo("closeSync");this.fdMap.delete(r);let[a,n]=s;return a.closeSync(n)}createReadStream(r,s){return r===null?this.baseFs.createReadStream(r,s):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,s),(a,{archivePath:n,subPath:c})=>{let f=a.createReadStream(c,s);return f.path=fe.fromPortablePath(this.pathUtils.join(n,c)),f})}createWriteStream(r,s){return r===null?this.baseFs.createWriteStream(r,s):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,s),(a,{subPath:n})=>a.createWriteStream(n,s))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=await this.baseFs.realpathPromise(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,await s.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(s,{archivePath:a,subPath:n})=>{let c=this.realPaths.get(a);return typeof c>"u"&&(c=this.baseFs.realpathSync(a),this.realPaths.set(a,c)),this.pathUtils.join(c,this.pathUtils.relative(vt.root,s.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(s,{subPath:a})=>await s.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(s,{subPath:a})=>s.existsSync(a))}async accessPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,s),async(a,{subPath:n})=>await a.accessPromise(n,s))}accessSync(r,s){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,s),(a,{subPath:n})=>a.accessSync(n,s))}async statPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,s),async(a,{subPath:n})=>await a.statPromise(n,s))}statSync(r,s){return this.makeCallSync(r,()=>this.baseFs.statSync(r,s),(a,{subPath:n})=>a.statSync(n,s))}async fstatPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fstat");let[n,c]=a;return n.fstatPromise(c,s)}fstatSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fstatSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fstatSync");let[n,c]=a;return n.fstatSync(c,s)}async lstatPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,s),async(a,{subPath:n})=>await a.lstatPromise(n,s))}lstatSync(r,s){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,s),(a,{subPath:n})=>a.lstatSync(n,s))}async fchmodPromise(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodPromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fchmod");let[n,c]=a;return n.fchmodPromise(c,s)}fchmodSync(r,s){if((r&tl)!==this.magic)return this.baseFs.fchmodSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("fchmodSync");let[n,c]=a;return n.fchmodSync(c,s)}async chmodPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,s),async(a,{subPath:n})=>await a.chmodPromise(n,s))}chmodSync(r,s){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,s),(a,{subPath:n})=>a.chmodSync(n,s))}async fchownPromise(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownPromise(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Mo("fchown");let[c,f]=n;return c.fchownPromise(f,s,a)}fchownSync(r,s,a){if((r&tl)!==this.magic)return this.baseFs.fchownSync(r,s,a);let n=this.fdMap.get(r);if(typeof n>"u")throw Mo("fchownSync");let[c,f]=n;return c.fchownSync(f,s,a)}async chownPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,s,a),async(n,{subPath:c})=>await n.chownPromise(c,s,a))}chownSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,s,a),(n,{subPath:c})=>n.chownSync(c,s,a))}async renamePromise(r,s){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.renamePromise(r,s),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(s,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,f)}))}renameSync(r,s){return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.renameSync(r,s),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(s,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(c,{subPath:f})=>{if(a!==c)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,f)}))}async copyFilePromise(r,s,a=0){let n=async(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&wd.constants.COPYFILE_EXCL&&await this.existsPromise(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await c.readFilePromise(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(s,async()=>await this.baseFs.copyFilePromise(r,s,a),async(c,{subPath:f})=>await n(this.baseFs,r,c,f)),async(c,{subPath:f})=>await this.makeCallPromise(s,async()=>await n(c,f,this.baseFs,s),async(p,{subPath:h})=>c!==p?await n(c,f,p,h):await c.copyFilePromise(f,h,a)))}copyFileSync(r,s,a=0){let n=(c,f,p,h)=>{if(a&wd.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${f}' -> ${h}'`),{code:"EXDEV"});if(a&wd.constants.COPYFILE_EXCL&&this.existsSync(f))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${f}' -> '${h}'`),{code:"EEXIST"});let E;try{E=c.readFileSync(f)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${f}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(s,()=>this.baseFs.copyFileSync(r,s,a),(c,{subPath:f})=>n(this.baseFs,r,c,f)),(c,{subPath:f})=>this.makeCallSync(s,()=>n(c,f,this.baseFs,s),(p,{subPath:h})=>c!==p?n(c,f,p,h):c.copyFileSync(f,h,a)))}async appendFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,s,a),async(n,{subPath:c})=>await n.appendFilePromise(c,s,a))}appendFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,s,a),(n,{subPath:c})=>n.appendFileSync(c,s,a))}async writeFilePromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,s,a),async(n,{subPath:c})=>await n.writeFilePromise(c,s,a))}writeFileSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,s,a),(n,{subPath:c})=>n.writeFileSync(c,s,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(s,{subPath:a})=>await s.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(s,{subPath:a})=>s.unlinkSync(a))}async utimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,s,a),async(n,{subPath:c})=>await n.utimesPromise(c,s,a))}utimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,s,a),(n,{subPath:c})=>n.utimesSync(c,s,a))}async lutimesPromise(r,s,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,s,a),async(n,{subPath:c})=>await n.lutimesPromise(c,s,a))}lutimesSync(r,s,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,s,a),(n,{subPath:c})=>n.lutimesSync(c,s,a))}async mkdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,s),async(a,{subPath:n})=>await a.mkdirPromise(n,s))}mkdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,s),(a,{subPath:n})=>a.mkdirSync(n,s))}async rmdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,s),async(a,{subPath:n})=>await a.rmdirPromise(n,s))}rmdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,s),(a,{subPath:n})=>a.rmdirSync(n,s))}async rmPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,s),async(a,{subPath:n})=>await a.rmPromise(n,s))}rmSync(r,s){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,s),(a,{subPath:n})=>a.rmSync(n,s))}async linkPromise(r,s){return await this.makeCallPromise(s,async()=>await this.baseFs.linkPromise(r,s),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,s){return this.makeCallSync(s,()=>this.baseFs.linkSync(r,s),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,s,a){return await this.makeCallPromise(s,async()=>await this.baseFs.symlinkPromise(r,s,a),async(n,{subPath:c})=>await n.symlinkPromise(r,c))}symlinkSync(r,s,a){return this.makeCallSync(s,()=>this.baseFs.symlinkSync(r,s,a),(n,{subPath:c})=>n.symlinkSync(r,c))}async readFilePromise(r,s){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,s),async(a,{subPath:n})=>await a.readFilePromise(n,s))}readFileSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,s),(a,{subPath:n})=>a.readFileSync(n,s))}async readdirPromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,s),async(a,{subPath:n})=>await a.readdirPromise(n,s),{requireSubpath:!1})}readdirSync(r,s){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,s),(a,{subPath:n})=>a.readdirSync(n,s),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(s,{subPath:a})=>await s.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(s,{subPath:a})=>s.readlinkSync(a))}async truncatePromise(r,s){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,s),async(a,{subPath:n})=>await a.truncatePromise(n,s))}truncateSync(r,s){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,s),(a,{subPath:n})=>a.truncateSync(n,s))}async ftruncatePromise(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncatePromise(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("ftruncate");let[n,c]=a;return n.ftruncatePromise(c,s)}ftruncateSync(r,s){if((r&tl)!==this.magic)return this.baseFs.ftruncateSync(r,s);let a=this.fdMap.get(r);if(typeof a>"u")throw Mo("ftruncateSync");let[n,c]=a;return n.ftruncateSync(c,s)}watch(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,s,a),(n,{subPath:c})=>n.watch(c,s,a))}watchFile(r,s,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,s,a),()=>sE(this,r,s,a))}unwatchFile(r,s){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,s),()=>md(this,r,s))}async makeCallPromise(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await s();let c=this.resolve(r),f=this.findMount(c);return f?n&&f.subPath==="/"?await s():await this.getMountPromise(f.archivePath,async p=>await a(p,f)):await s()}makeCallSync(r,s,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return s();let c=this.resolve(r),f=this.findMount(c);return!f||n&&f.subPath==="/"?s():this.getMountSync(f.archivePath,p=>a(p,f))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let s="";for(;;){let a=r.substring(s.length),n=this.getMountPoint(a,s);if(!n)return null;if(s=this.pathUtils.join(s,n),!this.isMount.has(s)){if(this.notMount.has(s))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(s).mode&wd.constants.S_IFMT)!==this.typeCheck){this.notMount.add(s);continue}}catch{return null}this.isMount.add(s)}return{archivePath:s,subPath:this.pathUtils.join(vt.root,r.substring(s.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let s=Date.now(),a=s+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[c,{childFs:f,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||f.hasOpenFileHandles?.())){if(s>=p){f.saveAndClose?.(),this.mountInstances.delete(c),n-=1;continue}else if(r===null||n<=0){a=p;break}f.saveAndClose?.(),this.mountInstances.delete(c),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-s).unref())}async getMountPromise(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await s(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await s(a)}finally{a.saveAndClose?.()}}}getMountSync(r,s){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,s(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return s(a)}finally{a.saveAndClose?.()}}}}});var er,nx,l$=Ze(()=>{Id();el();er=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),nx=class t extends mp{static{this.instance=new t}constructor(){super(J)}getExtractHint(){throw er()}getRealPath(){throw er()}resolve(){throw er()}async openPromise(){throw er()}openSync(){throw er()}async opendirPromise(){throw er()}opendirSync(){throw er()}async readPromise(){throw er()}readSync(){throw er()}async writePromise(){throw er()}writeSync(){throw er()}async closePromise(){throw er()}closeSync(){throw er()}createWriteStream(){throw er()}createReadStream(){throw er()}async realpathPromise(){throw er()}realpathSync(){throw er()}async readdirPromise(){throw er()}readdirSync(){throw er()}async existsPromise(e){throw er()}existsSync(e){throw er()}async accessPromise(){throw er()}accessSync(){throw er()}async statPromise(){throw er()}statSync(){throw er()}async fstatPromise(e){throw er()}fstatSync(e){throw er()}async lstatPromise(e){throw er()}lstatSync(e){throw er()}async fchmodPromise(){throw er()}fchmodSync(){throw er()}async chmodPromise(){throw er()}chmodSync(){throw er()}async fchownPromise(){throw er()}fchownSync(){throw er()}async chownPromise(){throw er()}chownSync(){throw er()}async mkdirPromise(){throw er()}mkdirSync(){throw er()}async rmdirPromise(){throw er()}rmdirSync(){throw er()}async rmPromise(){throw er()}rmSync(){throw er()}async linkPromise(){throw er()}linkSync(){throw er()}async symlinkPromise(){throw er()}symlinkSync(){throw er()}async renamePromise(){throw er()}renameSync(){throw er()}async copyFilePromise(){throw er()}copyFileSync(){throw er()}async appendFilePromise(){throw er()}appendFileSync(){throw er()}async writeFilePromise(){throw er()}writeFileSync(){throw er()}async unlinkPromise(){throw er()}unlinkSync(){throw er()}async utimesPromise(){throw er()}utimesSync(){throw er()}async lutimesPromise(){throw er()}lutimesSync(){throw er()}async readFilePromise(){throw er()}readFileSync(){throw er()}async readlinkPromise(){throw er()}readlinkSync(){throw er()}async truncatePromise(){throw er()}truncateSync(){throw er()}async ftruncatePromise(e,r){throw er()}ftruncateSync(e,r){throw er()}watch(){throw er()}watchFile(){throw er()}unwatchFile(){throw er()}}});var t0,c$=Ze(()=>{yp();el();t0=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return fe.fromPortablePath(e)}mapToBase(e){return fe.toPortablePath(e)}}});var nqe,PU,iqe,uo,u$=Ze(()=>{Cd();yp();el();nqe=/^[0-9]+$/,PU=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,iqe=/^([^/]+-)?[a-f0-9]+$/,uo=class t extends _s{static makeVirtualPath(e,r,s){if(J.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!J.basename(r).match(iqe))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=J.relative(J.dirname(e),s).split("/"),c=0;for(;c{bU=ut(Ie("buffer")),f$=Ie("url"),A$=Ie("util");yp();el();ix=class extends _s{constructor(e){super(fe),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0,f$.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!sqe(e,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,A$.inspect)(e)}`)}}});var y$,Uo,Ep,r0,sx,ox,aE,Tu,Fu,h$,g$,d$,m$,M2,E$=Ze(()=>{y$=Ie("readline"),Uo=Symbol("kBaseFs"),Ep=Symbol("kFd"),r0=Symbol("kClosePromise"),sx=Symbol("kCloseResolve"),ox=Symbol("kCloseReject"),aE=Symbol("kRefs"),Tu=Symbol("kRef"),Fu=Symbol("kUnref"),M2=class{constructor(e,r){this[m$]=1;this[d$]=void 0;this[g$]=void 0;this[h$]=void 0;this[Uo]=r,this[Ep]=e}get fd(){return this[Ep]}async appendFile(e,r){try{this[Tu](this.appendFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;return await this[Uo].appendFilePromise(this.fd,e,s?{encoding:s}:void 0)}finally{this[Fu]()}}async chown(e,r){try{return this[Tu](this.chown),await this[Uo].fchownPromise(this.fd,e,r)}finally{this[Fu]()}}async chmod(e){try{return this[Tu](this.chmod),await this[Uo].fchmodPromise(this.fd,e)}finally{this[Fu]()}}createReadStream(e){return this[Uo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Uo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,s,a){try{this[Tu](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,s=e.length??n.byteLength,a=e.position??null),r??=0,s??=0,s===0?{bytesRead:s,buffer:n}:{bytesRead:await this[Uo].readPromise(this.fd,n,r,s,a),buffer:n}}finally{this[Fu]()}}async readFile(e){try{this[Tu](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[Uo].readFilePromise(this.fd,r)}finally{this[Fu]()}}readLines(e){return(0,y$.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Tu](this.stat),await this[Uo].fstatPromise(this.fd,e)}finally{this[Fu]()}}async truncate(e){try{return this[Tu](this.truncate),await this[Uo].ftruncatePromise(this.fd,e)}finally{this[Fu]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[Tu](this.writeFile);let s=(typeof r=="string"?r:r?.encoding)??void 0;await this[Uo].writeFilePromise(this.fd,e,s)}finally{this[Fu]()}}async write(...e){try{if(this[Tu](this.write),ArrayBuffer.isView(e[0])){let[r,s,a,n]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,s,a]=e;return{bytesWritten:await this[Uo].writePromise(this.fd,r,s,a),buffer:r}}}finally{this[Fu]()}}async writev(e,r){try{this[Tu](this.writev);let s=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);s+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);s+=n.bytesWritten}return{buffers:e,bytesWritten:s}}finally{this[Fu]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[Ep]===-1)return Promise.resolve();if(this[r0])return this[r0];if(this[aE]--,this[aE]===0){let e=this[Ep];this[Ep]=-1,this[r0]=this[Uo].closePromise(e).finally(()=>{this[r0]=void 0})}else this[r0]=new Promise((e,r)=>{this[sx]=e,this[ox]=r}).finally(()=>{this[r0]=void 0,this[ox]=void 0,this[sx]=void 0});return this[r0]}[(Uo,Ep,m$=aE,d$=r0,g$=sx,h$=ox,Tu)](e){if(this[Ep]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[aE]++}[Fu](){if(this[aE]--,this[aE]===0){let e=this[Ep];this[Ep]=-1,this[Uo].closePromise(e).then(this[sx],this[ox])}}}});function U2(t,e){e=new ix(e);let r=(s,a,n)=>{let c=s[a];s[a]=n,typeof c?.[lE.promisify.custom]<"u"&&(n[lE.promisify.custom]=c[lE.promisify.custom])};{r(t,"exists",(s,...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(s).then(f=>{c(f)},()=>{c(!1)})})}),r(t,"read",(...s)=>{let[a,n,c,f,p,h]=s;if(s.length<=3){let E={};s.length<3?h=s[1]:(E=s[1],h=s[2]),{buffer:n=Buffer.alloc(16384),offset:c=0,length:f=n.byteLength,position:p}=E}if(c==null&&(c=0),f|=0,f===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,c,f,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let s of I$){let a=s.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[s];if(typeof n>"u")continue;r(t,a,(...f)=>{let h=typeof f[f.length-1]=="function"?f.pop():()=>{};process.nextTick(()=>{n.apply(e,f).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",s=>{try{return e.existsSync(s)}catch{return!1}}),r(t,"readSync",(...s)=>{let[a,n,c,f,p]=s;return s.length<=3&&({offset:c=0,length:f=n.byteLength,position:p}=s[2]||{}),c==null&&(c=0),f|=0,f===0?0:(p==null&&(p=-1),e.readSync(a,n,c,f,p))});for(let s of oqe){let a=s;if(typeof t[a]>"u")continue;let n=e[s];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let s=t.promises;for(let a of I$){let n=a.replace(/Promise$/,"");if(typeof s[n]>"u")continue;let c=e[a];typeof c>"u"||a!=="open"&&r(s,n,(f,...p)=>f instanceof M2?f[n].apply(f,p):c.call(e,f,...p))}r(s,"open",async(...a)=>{let n=await e.openPromise(...a);return new M2(n,e)})}t.read[lE.promisify.custom]=async(s,a,...n)=>({bytesRead:await e.readPromise(s,a,...n),buffer:a}),t.write[lE.promisify.custom]=async(s,a,...n)=>({bytesWritten:await e.writePromise(s,a,...n),buffer:a})}function ax(t,e){let r=Object.create(t);return U2(r,e),r}var lE,oqe,I$,C$=Ze(()=>{lE=Ie("util");p$();E$();oqe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),I$=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function w$(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function B$(){if(xU)return xU;let t=fe.toPortablePath(v$.default.tmpdir()),e=ce.realpathSync(t);return process.once("exit",()=>{ce.rmtempSync()}),xU={tmpdir:t,realTmpdir:e}}var v$,Nu,xU,ce,S$=Ze(()=>{v$=ut(Ie("os"));Cd();el();Nu=new Set,xU=null;ce=Object.assign(new Yn,{detachTemp(t){Nu.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=B$();for(;;){let s=w$("xfs-");try{this.mkdirSync(J.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>"u")return a;try{return t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=B$();for(;;){let s=w$("xfs-");try{await this.mkdirPromise(J.join(e,s))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=J.join(r,s);if(Nu.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(Nu.has(a)){Nu.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Nu.values()).map(async t=>{try{await ce.removePromise(t,{maxRetries:0}),Nu.delete(t)}catch{}}))},rmtempSync(){for(let t of Nu)try{ce.removeSync(t),Nu.delete(t)}catch{}}})});var _2={};Vt(_2,{AliasFS:()=>_f,BasePortableFakeFS:()=>Uf,CustomDir:()=>L2,CwdFS:()=>Sn,FakeFS:()=>mp,Filename:()=>Er,JailFS:()=>Hf,LazyFS:()=>oE,MountFS:()=>e0,NoFS:()=>nx,NodeFS:()=>Yn,PortablePath:()=>vt,PosixFS:()=>t0,ProxiedFS:()=>_s,VirtualFS:()=>uo,constants:()=>fi,errors:()=>or,extendFs:()=>ax,normalizeLineEndings:()=>Ed,npath:()=>fe,opendir:()=>ex,patchFs:()=>U2,ppath:()=>J,setupCopyIndex:()=>$b,statUtils:()=>$a,unwatchAllFiles:()=>yd,unwatchFile:()=>md,watchFile:()=>sE,xfs:()=>ce});var Dt=Ze(()=>{jX();zb();wU();SU();JX();DU();Id();el();el();e$();Id();n$();s$();o$();a$();l$();Cd();c$();yp();u$();C$();S$()});var k$=_((mkt,x$)=>{x$.exports=b$;b$.sync=lqe;var D$=Ie("fs");function aqe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var s=0;s{F$.exports=R$;R$.sync=cqe;var Q$=Ie("fs");function R$(t,e,r){Q$.stat(t,function(s,a){r(s,s?!1:T$(a,e))})}function cqe(t,e){return T$(Q$.statSync(t),e)}function T$(t,e){return t.isFile()&&uqe(t,e)}function uqe(t,e){var r=t.mode,s=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),c=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),f=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=f|p,C=r&h||r&p&&a===c||r&f&&s===n||r&E&&n===0;return C}});var L$=_((Ikt,O$)=>{var Ekt=Ie("fs"),lx;process.platform==="win32"||global.TESTING_WINDOWS?lx=k$():lx=N$();O$.exports=kU;kU.sync=fqe;function kU(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(s,a){kU(t,e||{},function(n,c){n?a(n):s(c)})})}lx(t,e||{},function(s,a){s&&(s.code==="EACCES"||e&&e.ignoreErrors)&&(s=null,a=!1),r(s,a)})}function fqe(t,e){try{return lx.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var q$=_((Ckt,G$)=>{var cE=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",M$=Ie("path"),Aqe=cE?";":":",U$=L$(),_$=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),H$=(t,e)=>{let r=e.colon||Aqe,s=t.match(/\//)||cE&&t.match(/\\/)?[""]:[...cE?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=cE?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=cE?a.split(r):[""];return cE&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:s,pathExt:n,pathExtExe:a}},j$=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:s,pathExt:a,pathExtExe:n}=H$(t,e),c=[],f=h=>new Promise((E,C)=>{if(h===s.length)return e.all&&c.length?E(c):C(_$(t));let S=s[h],b=/^".*"$/.test(S)?S.slice(1,-1):S,I=M$.join(b,t),T=!b&&/^\.[\\\/]/.test(t)?t.slice(0,2)+I:I;E(p(T,h,0))}),p=(h,E,C)=>new Promise((S,b)=>{if(C===a.length)return S(f(E+1));let I=a[C];U$(h+I,{pathExt:n},(T,N)=>{if(!T&&N)if(e.all)c.push(h+I);else return S(h+I);return S(p(h,E,C+1))})});return r?f(0).then(h=>r(null,h),r):f(0)},pqe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:s,pathExtExe:a}=H$(t,e),n=[];for(let c=0;c{"use strict";var W$=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(s=>s.toUpperCase()==="PATH")||"Path"};QU.exports=W$;QU.exports.default=W$});var z$=_((Bkt,K$)=>{"use strict";var V$=Ie("path"),hqe=q$(),gqe=Y$();function J$(t,e){let r=t.options.env||process.env,s=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let c;try{c=hqe.sync(t.command,{path:r[gqe({env:r})],pathExt:e?V$.delimiter:void 0})}catch{}finally{n&&process.chdir(s)}return c&&(c=V$.resolve(a?t.options.cwd:"",c)),c}function dqe(t){return J$(t)||J$(t,!0)}K$.exports=dqe});var Z$=_((vkt,TU)=>{"use strict";var RU=/([()\][%!^"`<>&|;, *?])/g;function mqe(t){return t=t.replace(RU,"^$1"),t}function yqe(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(RU,"^$1"),e&&(t=t.replace(RU,"^$1")),t}TU.exports.command=mqe;TU.exports.argument=yqe});var $$=_((Skt,X$)=>{"use strict";X$.exports=/^#!(.*)/});var tee=_((Dkt,eee)=>{"use strict";var Eqe=$$();eee.exports=(t="")=>{let e=t.match(Eqe);if(!e)return null;let[r,s]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?s:s?`${a} ${s}`:a}});var nee=_((Pkt,ree)=>{"use strict";var FU=Ie("fs"),Iqe=tee();function Cqe(t){let r=Buffer.alloc(150),s;try{s=FU.openSync(t,"r"),FU.readSync(s,r,0,150,0),FU.closeSync(s)}catch{}return Iqe(r.toString())}ree.exports=Cqe});var aee=_((bkt,oee)=>{"use strict";var wqe=Ie("path"),iee=z$(),see=Z$(),Bqe=nee(),vqe=process.platform==="win32",Sqe=/\.(?:com|exe)$/i,Dqe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function Pqe(t){t.file=iee(t);let e=t.file&&Bqe(t.file);return e?(t.args.unshift(t.file),t.command=e,iee(t)):t.file}function bqe(t){if(!vqe)return t;let e=Pqe(t),r=!Sqe.test(e);if(t.options.forceShell||r){let s=Dqe.test(e);t.command=wqe.normalize(t.command),t.command=see.command(t.command),t.args=t.args.map(n=>see.argument(n,s));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function xqe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let s={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?s:bqe(s)}oee.exports=xqe});var uee=_((xkt,cee)=>{"use strict";var NU=process.platform==="win32";function OU(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function kqe(t,e){if(!NU)return;let r=t.emit;t.emit=function(s,a){if(s==="exit"){let n=lee(a,e);if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function lee(t,e){return NU&&t===1&&!e.file?OU(e.original,"spawn"):null}function Qqe(t,e){return NU&&t===1&&!e.file?OU(e.original,"spawnSync"):null}cee.exports={hookChildProcess:kqe,verifyENOENT:lee,verifyENOENTSync:Qqe,notFoundError:OU}});var UU=_((kkt,uE)=>{"use strict";var fee=Ie("child_process"),LU=aee(),MU=uee();function Aee(t,e,r){let s=LU(t,e,r),a=fee.spawn(s.command,s.args,s.options);return MU.hookChildProcess(a,s),a}function Rqe(t,e,r){let s=LU(t,e,r),a=fee.spawnSync(s.command,s.args,s.options);return a.error=a.error||MU.verifyENOENTSync(a.status,s),a}uE.exports=Aee;uE.exports.spawn=Aee;uE.exports.sync=Rqe;uE.exports._parse=LU;uE.exports._enoent=MU});var hee=_((Qkt,pee)=>{"use strict";function Tqe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Bd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Bd)}Tqe(Bd,Error);Bd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C>",P=ur(">>",!1),y=">&",F=ur(">&",!1),z=">",Z=ur(">",!1),$="<<<",oe=ur("<<<",!1),xe="<&",Re=ur("<&",!1),lt="<",Ct=ur("<",!1),qt=function(O){return{type:"argument",segments:[].concat(...O)}},ir=function(O){return O},bt="$'",gn=ur("$'",!1),br="'",Ir=ur("'",!1),Or=function(O){return[{type:"text",text:O}]},nn='""',ai=ur('""',!1),Io=function(){return{type:"text",text:""}},ts='"',$s=ur('"',!1),Co=function(O){return O},Hi=function(O){return{type:"arithmetic",arithmetic:O,quoted:!0}},eo=function(O){return{type:"shell",shell:O,quoted:!0}},wo=function(O){return{type:"variable",...O,quoted:!0}},QA=function(O){return{type:"text",text:O}},Af=function(O){return{type:"arithmetic",arithmetic:O,quoted:!1}},dh=function(O){return{type:"shell",shell:O,quoted:!1}},mh=function(O){return{type:"variable",...O,quoted:!1}},to=function(O){return{type:"glob",pattern:O}},jn=/^[^']/,Rs=Ki(["'"],!0,!1),ro=function(O){return O.join("")},ou=/^[^$"]/,au=Ki(["$",'"'],!0,!1),lu=`\\ `,RA=ur(`\\ `,!1),TA=function(){return""},oa="\\",aa=ur("\\",!1),FA=/^[\\$"`]/,gr=Ki(["\\","$",'"',"`"],!1,!1),Bo=function(O){return O},Me="\\a",cu=ur("\\a",!1),Cr=function(){return"a"},pf="\\b",NA=ur("\\b",!1),OA=function(){return"\b"},uu=/^[Ee]/,fu=Ki(["E","e"],!1,!1),oc=function(){return"\x1B"},ve="\\f",Nt=ur("\\f",!1),ac=function(){return"\f"},Oi="\\n",no=ur("\\n",!1),Tt=function(){return` `},xn="\\r",la=ur("\\r",!1),ji=function(){return"\r"},Li="\\t",Na=ur("\\t",!1),dn=function(){return" "},Kn="\\v",Au=ur("\\v",!1),yh=function(){return"\v"},Oa=/^[\\'"?]/,La=Ki(["\\","'",'"',"?"],!1,!1),Ma=function(O){return String.fromCharCode(parseInt(O,16))},$e="\\x",Ua=ur("\\x",!1),hf="\\u",lc=ur("\\u",!1),wn="\\U",ca=ur("\\U",!1),LA=function(O){return String.fromCodePoint(parseInt(O,16))},MA=/^[0-7]/,ua=Ki([["0","7"]],!1,!1),Bl=/^[0-9a-fA-f]/,Mt=Ki([["0","9"],["a","f"],["A","f"]],!1,!1),kn=yf(),fa="{}",Ha=ur("{}",!1),rs=function(){return"{}"},cc="-",pu=ur("-",!1),uc="+",ja=ur("+",!1),Mi=".",Is=ur(".",!1),vl=function(O,K,re){return{type:"number",value:(O==="-"?-1:1)*parseFloat(K.join("")+"."+re.join(""))}},gf=function(O,K){return{type:"number",value:(O==="-"?-1:1)*parseInt(K.join(""))}},fc=function(O){return{type:"variable",...O}},wi=function(O){return{type:"variable",name:O}},Qn=function(O){return O},Ac="*",Ke=ur("*",!1),st="/",St=ur("/",!1),lr=function(O,K,re){return{type:K==="*"?"multiplication":"division",right:re}},te=function(O,K){return K.reduce((re,de)=>({left:re,...de}),O)},Ee=function(O,K,re){return{type:K==="+"?"addition":"subtraction",right:re}},Oe="$((",dt=ur("$((",!1),Et="))",Pt=ur("))",!1),tr=function(O){return O},An="$(",li=ur("$(",!1),Gi=function(O){return O},Rn="${",Ga=ur("${",!1),my=":-",X1=ur(":-",!1),vo=function(O,K){return{name:O,defaultValue:K}},yy=":-}",Eh=ur(":-}",!1),$1=function(O){return{name:O,defaultValue:[]}},So=":+",Ih=ur(":+",!1),Ch=function(O,K){return{name:O,alternativeValue:K}},hu=":+}",wh=ur(":+}",!1),Fg=function(O){return{name:O,alternativeValue:[]}},Ng=function(O){return{name:O}},Og="$",Ey=ur("$",!1),df=function(O){return e.isGlobPattern(O)},Do=function(O){return O},Sl=/^[a-zA-Z0-9_]/,Bh=Ki([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),Lg=function(){return By()},Dl=/^[$@*?#a-zA-Z0-9_\-]/,Pl=Ki(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Iy=/^[()}<>$|&; \t"']/,UA=Ki(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Cy=/^[<>&; \t"']/,wy=Ki(["<",">","&",";"," "," ",'"',"'"],!1,!1),_A=/^[ \t]/,HA=Ki([" "," "],!1,!1),Y=0,xt=0,jA=[{line:1,column:1}],Po=0,mf=[],yt=0,gu;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function By(){return t.substring(xt,Y)}function Mg(){return Ef(xt,Y)}function e2(O,K){throw K=K!==void 0?K:Ef(xt,Y),GA([Ug(O)],t.substring(xt,Y),K)}function vh(O,K){throw K=K!==void 0?K:Ef(xt,Y),di(O,K)}function ur(O,K){return{type:"literal",text:O,ignoreCase:K}}function Ki(O,K,re){return{type:"class",parts:O,inverted:K,ignoreCase:re}}function yf(){return{type:"any"}}function qa(){return{type:"end"}}function Ug(O){return{type:"other",description:O}}function du(O){var K=jA[O],re;if(K)return K;for(re=O-1;!jA[re];)re--;for(K=jA[re],K={line:K.line,column:K.column};rePo&&(Po=Y,mf=[]),mf.push(O))}function di(O,K){return new Bd(O,null,null,K)}function GA(O,K,re){return new Bd(Bd.buildMessage(O,K),O,K,re)}function Wa(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=Aa(),re===r&&(re=null),re!==r?(xt=O,K=n(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Aa(){var O,K,re,de,Je;if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de!==r?(Je=Ya(),Je===r&&(Je=null),Je!==r?(xt=O,K=c(K,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;if(O===r)if(O=Y,K=Sh(),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();re!==r?(de=_g(),de===r&&(de=null),de!==r?(xt=O,K=f(K,de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function Ya(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=Aa(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=p(re),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function _g(){var O;return t.charCodeAt(Y)===59?(O=h,Y++):(O=r,yt===0&&wt(E)),O===r&&(t.charCodeAt(Y)===38?(O=C,Y++):(O=r,yt===0&&wt(S))),O}function Sh(){var O,K,re;return O=Y,K=qA(),K!==r?(re=Hg(),re===r&&(re=null),re!==r?(xt=O,K=b(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Hg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=vy(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Sh(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=I(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function vy(){var O;return t.substr(Y,2)===T?(O=T,Y+=2):(O=r,yt===0&&wt(N)),O===r&&(t.substr(Y,2)===U?(O=U,Y+=2):(O=r,yt===0&&wt(W))),O}function qA(){var O,K,re;return O=Y,K=If(),K!==r?(re=jg(),re===r&&(re=null),re!==r?(xt=O,K=ee(K,re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function jg(){var O,K,re,de,Je,At,dr;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(re=mu(),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=qA(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=ie(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;return O}function mu(){var O;return t.substr(Y,2)===ue?(O=ue,Y+=2):(O=r,yt===0&&wt(le)),O===r&&(t.charCodeAt(Y)===124?(O=me,Y++):(O=r,yt===0&&wt(pe))),O}function yu(){var O,K,re,de,Je,At;if(O=Y,K=bh(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r)if(de=WA(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(xt=O,K=g(K,de),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;else Y=O,O=r;if(O===r)if(O=Y,K=bh(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,yt===0&&wt(Ce)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=we(K),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r;return O}function If(){var O,K,re,de,Je,At,dr,vr,Un,mi,Cs;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===40?(re=ye,Y++):(re=r,yt===0&&wt(Ae)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Aa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===41?(dr=se,Y++):(dr=r,yt===0&&wt(X)),dr!==r){for(vr=[],Un=kt();Un!==r;)vr.push(Un),Un=kt();if(vr!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=De(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r)if(t.charCodeAt(Y)===123?(re=Te,Y++):(re=r,yt===0&&wt(mt)),re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r)if(Je=Aa(),Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();if(At!==r)if(t.charCodeAt(Y)===125?(dr=j,Y++):(dr=r,yt===0&&wt(rt)),dr!==r){for(vr=[],Un=kt();Un!==r;)vr.push(Un),Un=kt();if(vr!==r){for(Un=[],mi=Gn();mi!==r;)Un.push(mi),mi=Gn();if(Un!==r){for(mi=[],Cs=kt();Cs!==r;)mi.push(Cs),Cs=kt();mi!==r?(xt=O,K=Fe(Je,Un),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){for(re=[],de=yu();de!==r;)re.push(de),de=yu();if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();if(de!==r){if(Je=[],At=Eu(),At!==r)for(;At!==r;)Je.push(At),At=Eu();else Je=r;if(Je!==r){for(At=[],dr=kt();dr!==r;)At.push(dr),dr=kt();At!==r?(xt=O,K=Ne(re,Je),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r}else Y=O,O=r;if(O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=yu(),de!==r)for(;de!==r;)re.push(de),de=yu();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=be(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r}}}return O}function Ts(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r){if(re=[],de=bi(),de!==r)for(;de!==r;)re.push(de),de=bi();else re=r;if(re!==r){for(de=[],Je=kt();Je!==r;)de.push(Je),Je=kt();de!==r?(xt=O,K=Ve(re),O=K):(Y=O,O=r)}else Y=O,O=r}else Y=O,O=r;return O}function Eu(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();if(K!==r?(re=Gn(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r){for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();K!==r?(re=bi(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r)}return O}function Gn(){var O,K,re,de,Je;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(it.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Ue)),re===r&&(re=null),re!==r?(de=ns(),de!==r?(Je=bi(),Je!==r?(xt=O,K=x(re,de,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function ns(){var O;return t.substr(Y,2)===w?(O=w,Y+=2):(O=r,yt===0&&wt(P)),O===r&&(t.substr(Y,2)===y?(O=y,Y+=2):(O=r,yt===0&&wt(F)),O===r&&(t.charCodeAt(Y)===62?(O=z,Y++):(O=r,yt===0&&wt(Z)),O===r&&(t.substr(Y,3)===$?(O=$,Y+=3):(O=r,yt===0&&wt(oe)),O===r&&(t.substr(Y,2)===xe?(O=xe,Y+=2):(O=r,yt===0&&wt(Re)),O===r&&(t.charCodeAt(Y)===60?(O=lt,Y++):(O=r,yt===0&&wt(Ct))))))),O}function bi(){var O,K,re;for(O=Y,K=[],re=kt();re!==r;)K.push(re),re=kt();return K!==r?(re=WA(),re!==r?(xt=O,K=ke(re),O=K):(Y=O,O=r)):(Y=O,O=r),O}function WA(){var O,K,re;if(O=Y,K=[],re=Cf(),re!==r)for(;re!==r;)K.push(re),re=Cf();else K=r;return K!==r&&(xt=O,K=qt(K)),O=K,O}function Cf(){var O,K;return O=Y,K=mn(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=Gg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=qg(),K!==r&&(xt=O,K=ir(K)),O=K,O===r&&(O=Y,K=is(),K!==r&&(xt=O,K=ir(K)),O=K))),O}function mn(){var O,K,re,de;return O=Y,t.substr(Y,2)===bt?(K=bt,Y+=2):(K=r,yt===0&&wt(gn)),K!==r?(re=yn(),re!==r?(t.charCodeAt(Y)===39?(de=br,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Or(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function Gg(){var O,K,re,de;return O=Y,t.charCodeAt(Y)===39?(K=br,Y++):(K=r,yt===0&&wt(Ir)),K!==r?(re=wf(),re!==r?(t.charCodeAt(Y)===39?(de=br,Y++):(de=r,yt===0&&wt(Ir)),de!==r?(xt=O,K=Or(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function qg(){var O,K,re,de;if(O=Y,t.substr(Y,2)===nn?(K=nn,Y+=2):(K=r,yt===0&&wt(ai)),K!==r&&(xt=O,K=Io()),O=K,O===r)if(O=Y,t.charCodeAt(Y)===34?(K=ts,Y++):(K=r,yt===0&&wt($s)),K!==r){for(re=[],de=bl();de!==r;)re.push(de),de=bl();re!==r?(t.charCodeAt(Y)===34?(de=ts,Y++):(de=r,yt===0&&wt($s)),de!==r?(xt=O,K=Co(re),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;return O}function is(){var O,K,re;if(O=Y,K=[],re=bo(),re!==r)for(;re!==r;)K.push(re),re=bo();else K=r;return K!==r&&(xt=O,K=Co(K)),O=K,O}function bl(){var O,K;return O=Y,K=Xr(),K!==r&&(xt=O,K=Hi(K)),O=K,O===r&&(O=Y,K=Ph(),K!==r&&(xt=O,K=eo(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=wo(K)),O=K,O===r&&(O=Y,K=Bf(),K!==r&&(xt=O,K=QA(K)),O=K))),O}function bo(){var O,K;return O=Y,K=Xr(),K!==r&&(xt=O,K=Af(K)),O=K,O===r&&(O=Y,K=Ph(),K!==r&&(xt=O,K=dh(K)),O=K,O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=mh(K)),O=K,O===r&&(O=Y,K=Sy(),K!==r&&(xt=O,K=to(K)),O=K,O===r&&(O=Y,K=Dh(),K!==r&&(xt=O,K=QA(K)),O=K)))),O}function wf(){var O,K,re;for(O=Y,K=[],jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs));re!==r;)K.push(re),jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs));return K!==r&&(xt=O,K=ro(K)),O=K,O}function Bf(){var O,K,re;if(O=Y,K=[],re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au))),re!==r)for(;re!==r;)K.push(re),re=xl(),re===r&&(ou.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(au)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function xl(){var O,K,re;return O=Y,t.substr(Y,2)===lu?(K=lu,Y+=2):(K=r,yt===0&&wt(RA)),K!==r&&(xt=O,K=TA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(FA.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(gr)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r)),O}function yn(){var O,K,re;for(O=Y,K=[],re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs)));re!==r;)K.push(re),re=xo(),re===r&&(jn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Rs)));return K!==r&&(xt=O,K=ro(K)),O=K,O}function xo(){var O,K,re;return O=Y,t.substr(Y,2)===Me?(K=Me,Y+=2):(K=r,yt===0&&wt(cu)),K!==r&&(xt=O,K=Cr()),O=K,O===r&&(O=Y,t.substr(Y,2)===pf?(K=pf,Y+=2):(K=r,yt===0&&wt(NA)),K!==r&&(xt=O,K=OA()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(uu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(fu)),re!==r?(xt=O,K=oc(),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===ve?(K=ve,Y+=2):(K=r,yt===0&&wt(Nt)),K!==r&&(xt=O,K=ac()),O=K,O===r&&(O=Y,t.substr(Y,2)===Oi?(K=Oi,Y+=2):(K=r,yt===0&&wt(no)),K!==r&&(xt=O,K=Tt()),O=K,O===r&&(O=Y,t.substr(Y,2)===xn?(K=xn,Y+=2):(K=r,yt===0&&wt(la)),K!==r&&(xt=O,K=ji()),O=K,O===r&&(O=Y,t.substr(Y,2)===Li?(K=Li,Y+=2):(K=r,yt===0&&wt(Na)),K!==r&&(xt=O,K=dn()),O=K,O===r&&(O=Y,t.substr(Y,2)===Kn?(K=Kn,Y+=2):(K=r,yt===0&&wt(Au)),K!==r&&(xt=O,K=yh()),O=K,O===r&&(O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(Oa.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(La)),re!==r?(xt=O,K=Bo(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Iu()))))))))),O}function Iu(){var O,K,re,de,Je,At,dr,vr,Un,mi,Cs,JA;return O=Y,t.charCodeAt(Y)===92?(K=oa,Y++):(K=r,yt===0&&wt(aa)),K!==r?(re=pa(),re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===$e?(K=$e,Y+=2):(K=r,yt===0&&wt(Ua)),K!==r?(re=Y,de=Y,Je=pa(),Je!==r?(At=Fs(),At!==r?(Je=[Je,At],de=Je):(Y=de,de=r)):(Y=de,de=r),de===r&&(de=pa()),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===hf?(K=hf,Y+=2):(K=r,yt===0&&wt(lc)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(vr=Fs(),vr!==r?(Je=[Je,At,dr,vr],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=Ma(re),O=K):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===wn?(K=wn,Y+=2):(K=r,yt===0&&wt(ca)),K!==r?(re=Y,de=Y,Je=Fs(),Je!==r?(At=Fs(),At!==r?(dr=Fs(),dr!==r?(vr=Fs(),vr!==r?(Un=Fs(),Un!==r?(mi=Fs(),mi!==r?(Cs=Fs(),Cs!==r?(JA=Fs(),JA!==r?(Je=[Je,At,dr,vr,Un,mi,Cs,JA],de=Je):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r)):(Y=de,de=r),de!==r?re=t.substring(re,Y):re=de,re!==r?(xt=O,K=LA(re),O=K):(Y=O,O=r)):(Y=O,O=r)))),O}function pa(){var O;return MA.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(ua)),O}function Fs(){var O;return Bl.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(Mt)),O}function Dh(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,t.charCodeAt(Y)===92?(de=oa,Y++):(de=r,yt===0&&wt(aa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===fa?(de=fa,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=rs()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Dy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=Y,t.charCodeAt(Y)===92?(de=oa,Y++):(de=r,yt===0&&wt(aa)),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===fa?(de=fa,Y+=2):(de=r,yt===0&&wt(Ha)),de!==r&&(xt=re,de=rs()),re=de,re===r&&(re=Y,de=Y,yt++,Je=Dy(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r)));else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function YA(){var O,K,re,de,Je,At;if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;if(re!==r)if(t.charCodeAt(Y)===46?(de=Mi,Y++):(de=r,yt===0&&wt(Is)),de!==r){if(Je=[],it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue)),At!==r)for(;At!==r;)Je.push(At),it.test(t.charAt(Y))?(At=t.charAt(Y),Y++):(At=r,yt===0&&wt(Ue));else Je=r;Je!==r?(xt=O,K=vl(K,re,Je),O=K):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;if(O===r){if(O=Y,t.charCodeAt(Y)===45?(K=cc,Y++):(K=r,yt===0&&wt(pu)),K===r&&(t.charCodeAt(Y)===43?(K=uc,Y++):(K=r,yt===0&&wt(ja))),K===r&&(K=null),K!==r){if(re=[],it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue)),de!==r)for(;de!==r;)re.push(de),it.test(t.charAt(Y))?(de=t.charAt(Y),Y++):(de=r,yt===0&&wt(Ue));else re=r;re!==r?(xt=O,K=gf(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;if(O===r&&(O=Y,K=VA(),K!==r&&(xt=O,K=fc(K)),O=K,O===r&&(O=Y,K=pc(),K!==r&&(xt=O,K=wi(K)),O=K,O===r)))if(O=Y,t.charCodeAt(Y)===40?(K=ye,Y++):(K=r,yt===0&&wt(Ae)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.charCodeAt(Y)===41?(At=se,Y++):(At=r,yt===0&&wt(X)),At!==r?(xt=O,K=Qn(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r}return O}function vf(){var O,K,re,de,Je,At,dr,vr;if(O=Y,K=YA(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=YA(),vr!==r?(xt=de,Je=lr(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===42?(At=Ac,Y++):(At=r,yt===0&&wt(Ke)),At===r&&(t.charCodeAt(Y)===47?(At=st,Y++):(At=r,yt===0&&wt(St))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=YA(),vr!==r?(xt=de,Je=lr(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function io(){var O,K,re,de,Je,At,dr,vr;if(O=Y,K=vf(),K!==r){for(re=[],de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=vf(),vr!==r?(xt=de,Je=Ee(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r;for(;de!==r;){for(re.push(de),de=Y,Je=[],At=kt();At!==r;)Je.push(At),At=kt();if(Je!==r)if(t.charCodeAt(Y)===43?(At=uc,Y++):(At=r,yt===0&&wt(ja)),At===r&&(t.charCodeAt(Y)===45?(At=cc,Y++):(At=r,yt===0&&wt(pu))),At!==r){for(dr=[],vr=kt();vr!==r;)dr.push(vr),vr=kt();dr!==r?(vr=vf(),vr!==r?(xt=de,Je=Ee(K,At,vr),de=Je):(Y=de,de=r)):(Y=de,de=r)}else Y=de,de=r;else Y=de,de=r}re!==r?(xt=O,K=te(K,re),O=K):(Y=O,O=r)}else Y=O,O=r;return O}function Xr(){var O,K,re,de,Je,At;if(O=Y,t.substr(Y,3)===Oe?(K=Oe,Y+=3):(K=r,yt===0&&wt(dt)),K!==r){for(re=[],de=kt();de!==r;)re.push(de),de=kt();if(re!==r)if(de=io(),de!==r){for(Je=[],At=kt();At!==r;)Je.push(At),At=kt();Je!==r?(t.substr(Y,2)===Et?(At=Et,Y+=2):(At=r,yt===0&&wt(Pt)),At!==r?(xt=O,K=tr(de),O=K):(Y=O,O=r)):(Y=O,O=r)}else Y=O,O=r;else Y=O,O=r}else Y=O,O=r;return O}function Ph(){var O,K,re,de;return O=Y,t.substr(Y,2)===An?(K=An,Y+=2):(K=r,yt===0&&wt(li)),K!==r?(re=Aa(),re!==r?(t.charCodeAt(Y)===41?(de=se,Y++):(de=r,yt===0&&wt(X)),de!==r?(xt=O,K=Gi(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O}function VA(){var O,K,re,de,Je,At;return O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===my?(de=my,Y+=2):(de=r,yt===0&&wt(X1)),de!==r?(Je=Ts(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=vo(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===yy?(de=yy,Y+=3):(de=r,yt===0&&wt(Eh)),de!==r?(xt=O,K=$1(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,2)===So?(de=So,Y+=2):(de=r,yt===0&&wt(Ih)),de!==r?(Je=Ts(),Je!==r?(t.charCodeAt(Y)===125?(At=j,Y++):(At=r,yt===0&&wt(rt)),At!==r?(xt=O,K=Ch(re,Je),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.substr(Y,3)===hu?(de=hu,Y+=3):(de=r,yt===0&&wt(wh)),de!==r?(xt=O,K=Fg(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.substr(Y,2)===Rn?(K=Rn,Y+=2):(K=r,yt===0&&wt(Ga)),K!==r?(re=pc(),re!==r?(t.charCodeAt(Y)===125?(de=j,Y++):(de=r,yt===0&&wt(rt)),de!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)):(Y=O,O=r),O===r&&(O=Y,t.charCodeAt(Y)===36?(K=Og,Y++):(K=r,yt===0&&wt(Ey)),K!==r?(re=pc(),re!==r?(xt=O,K=Ng(re),O=K):(Y=O,O=r)):(Y=O,O=r)))))),O}function Sy(){var O,K,re;return O=Y,K=Wg(),K!==r?(xt=Y,re=df(K),re?re=void 0:re=r,re!==r?(xt=O,K=Do(K),O=K):(Y=O,O=r)):(Y=O,O=r),O}function Wg(){var O,K,re,de,Je;if(O=Y,K=[],re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r),re!==r)for(;re!==r;)K.push(re),re=Y,de=Y,yt++,Je=xh(),yt--,Je===r?de=void 0:(Y=de,de=r),de!==r?(t.length>Y?(Je=t.charAt(Y),Y++):(Je=r,yt===0&&wt(kn)),Je!==r?(xt=re,de=Bo(Je),re=de):(Y=re,re=r)):(Y=re,re=r);else K=r;return K!==r&&(xt=O,K=ro(K)),O=K,O}function bh(){var O,K,re;if(O=Y,K=[],Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh)),re!==r)for(;re!==r;)K.push(re),Sl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Bh));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function pc(){var O,K,re;if(O=Y,K=[],Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Pl)),re!==r)for(;re!==r;)K.push(re),Dl.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,yt===0&&wt(Pl));else K=r;return K!==r&&(xt=O,K=Lg()),O=K,O}function Dy(){var O;return Iy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(UA)),O}function xh(){var O;return Cy.test(t.charAt(Y))?(O=t.charAt(Y),Y++):(O=r,yt===0&&wt(wy)),O}function kt(){var O,K;if(O=[],_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA)),K!==r)for(;K!==r;)O.push(K),_A.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,yt===0&&wt(HA));else O=r;return O}if(gu=a(),gu!==r&&Y===t.length)return gu;throw gu!==r&&Y!1}){try{return(0,gee.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fE(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:s},a)=>`${fx(r)}${s===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function fx(t){return`${AE(t.chain)}${t.then?` ${_U(t.then)}`:""}`}function _U(t){return`${t.type} ${fx(t.line)}`}function AE(t){return`${jU(t)}${t.then?` ${HU(t.then)}`:""}`}function HU(t){return`${t.type} ${AE(t.chain)}`}function jU(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cx(e)).join(" ")} `:""}${t.args.map(e=>GU(e)).join(" ")}`;case"subshell":return`(${fE(t.subshell)})${t.args.length>0?` ${t.args.map(e=>H2(e)).join(" ")}`:""}`;case"group":return`{ ${fE(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>H2(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cx(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cx(t){return`${t.name}=${t.args[0]?vd(t.args[0]):""}`}function GU(t){switch(t.type){case"redirection":return H2(t);case"argument":return vd(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function H2(t){return`${t.subtype} ${t.args.map(e=>vd(e)).join(" ")}`}function vd(t){return t.segments.map(e=>qU(e)).join("")}function qU(t){let e=(s,a)=>a?`"${s}"`:s,r=s=>s===""?"''":s.match(/[()}<>$|&;"'\n\t ]/)?s.match(/['\t\p{C}]/u)?s.match(/'/)?`"${s.replace(/["$\t\p{C}]/u,Oqe)}"`:`$'${s.replace(/[\t\p{C}]/u,mee)}'`:`'${s}'`:s;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${fE(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(s=>vd(s)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(s=>vd(s)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${Ax(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function Ax(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,s=a=>r(Ax(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${s(t.left)} ${e(t.type)} ${s(t.right)}`}}var gee,dee,Nqe,mee,Oqe,yee=Ze(()=>{gee=ut(hee());dee=new Map([["\f","\\f"],[` `,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),Nqe=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(dee,([t,e])=>[t,`"$'${e}'"`])]),mee=t=>dee.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,Oqe=t=>Nqe.get(t)??`"$'${mee(t)}'"`});var Iee=_((Wkt,Eee)=>{"use strict";function Lqe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Sd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Sd)}Lqe(Sd,Error);Sd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;Cue&&(ue=W,le=[]),le.push(Ue))}function rt(Ue,x){return new Sd(Ue,null,null,x)}function Fe(Ue,x,w){return new Sd(Sd.buildMessage(Ue,x),Ue,x,w)}function Ne(){var Ue,x,w,P;return Ue=W,x=be(),x!==r?(t.charCodeAt(W)===47?(w=n,W++):(w=r,me===0&&j(c)),w!==r?(P=be(),P!==r?(ee=Ue,x=f(x,P),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=be(),x!==r&&(ee=Ue,x=p(x)),Ue=x),Ue}function be(){var Ue,x,w,P;return Ue=W,x=Ve(),x!==r?(t.charCodeAt(W)===64?(w=h,W++):(w=r,me===0&&j(E)),w!==r?(P=it(),P!==r?(ee=Ue,x=C(x,P),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=Ve(),x!==r&&(ee=Ue,x=S(x)),Ue=x),Ue}function Ve(){var Ue,x,w,P,y;return Ue=W,t.charCodeAt(W)===64?(x=h,W++):(x=r,me===0&&j(E)),x!==r?(w=ke(),w!==r?(t.charCodeAt(W)===47?(P=n,W++):(P=r,me===0&&j(c)),P!==r?(y=ke(),y!==r?(ee=Ue,x=b(),Ue=x):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r)):(W=Ue,Ue=r),Ue===r&&(Ue=W,x=ke(),x!==r&&(ee=Ue,x=b()),Ue=x),Ue}function ke(){var Ue,x,w;if(Ue=W,x=[],I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(T)),w!==r)for(;w!==r;)x.push(w),I.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(T));else x=r;return x!==r&&(ee=Ue,x=b()),Ue=x,Ue}function it(){var Ue,x,w;if(Ue=W,x=[],N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U)),w!==r)for(;w!==r;)x.push(w),N.test(t.charAt(W))?(w=t.charAt(W),W++):(w=r,me===0&&j(U));else x=r;return x!==r&&(ee=Ue,x=b()),Ue=x,Ue}if(pe=a(),pe!==r&&W===t.length)return pe;throw pe!==r&&W{Cee=ut(Iee())});var Pd=_((Vkt,Dd)=>{"use strict";function Bee(t){return typeof t>"u"||t===null}function Uqe(t){return typeof t=="object"&&t!==null}function _qe(t){return Array.isArray(t)?t:Bee(t)?[]:[t]}function Hqe(t,e){var r,s,a,n;if(e)for(n=Object.keys(e),r=0,s=n.length;r{"use strict";function j2(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}j2.prototype=Object.create(Error.prototype);j2.prototype.constructor=j2;j2.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};vee.exports=j2});var Pee=_((Kkt,Dee)=>{"use strict";var See=Pd();function WU(t,e,r,s,a){this.name=t,this.buffer=e,this.position=r,this.line=s,this.column=a}WU.prototype.getSnippet=function(e,r){var s,a,n,c,f;if(!this.buffer)return null;for(e=e||4,r=r||75,s="",a=this.position;a>0&&`\0\r \x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){s=" ... ",a+=5;break}for(n="",c=this.position;cr/2-1){n=" ... ",c-=5;break}return f=this.buffer.slice(a,c),See.repeat(" ",e)+s+f+n+` `+See.repeat(" ",e+this.position-a+s.length)+"^"};WU.prototype.toString=function(e){var r,s="";return this.name&&(s+='in "'+this.name+'" '),s+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(s+=`: `+r)),s};Dee.exports=WU});var Ss=_((zkt,xee)=>{"use strict";var bee=pE(),qqe=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Wqe=["scalar","sequence","mapping"];function Yqe(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(s){e[String(s)]=r})}),e}function Vqe(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(qqe.indexOf(r)===-1)throw new bee('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Yqe(e.styleAliases||null),Wqe.indexOf(this.kind)===-1)throw new bee('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}xee.exports=Vqe});var bd=_((Zkt,Qee)=>{"use strict";var kee=Pd(),gx=pE(),Jqe=Ss();function YU(t,e,r){var s=[];return t.include.forEach(function(a){r=YU(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,c){n.tag===a.tag&&n.kind===a.kind&&s.push(c)}),r.push(a)}),r.filter(function(a,n){return s.indexOf(n)===-1})}function Kqe(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function s(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var zqe=Ss();Ree.exports=new zqe("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var Nee=_(($kt,Fee)=>{"use strict";var Zqe=Ss();Fee.exports=new Zqe("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var Lee=_((eQt,Oee)=>{"use strict";var Xqe=Ss();Oee.exports=new Xqe("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var dx=_((tQt,Mee)=>{"use strict";var $qe=bd();Mee.exports=new $qe({explicit:[Tee(),Nee(),Lee()]})});var _ee=_((rQt,Uee)=>{"use strict";var e5e=Ss();function t5e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function r5e(){return null}function n5e(t){return t===null}Uee.exports=new e5e("tag:yaml.org,2002:null",{kind:"scalar",resolve:t5e,construct:r5e,predicate:n5e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var jee=_((nQt,Hee)=>{"use strict";var i5e=Ss();function s5e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function o5e(t){return t==="true"||t==="True"||t==="TRUE"}function a5e(t){return Object.prototype.toString.call(t)==="[object Boolean]"}Hee.exports=new i5e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:s5e,construct:o5e,predicate:a5e,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var qee=_((iQt,Gee)=>{"use strict";var l5e=Pd(),c5e=Ss();function u5e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function f5e(t){return 48<=t&&t<=55}function A5e(t){return 48<=t&&t<=57}function p5e(t){if(t===null)return!1;var e=t.length,r=0,s=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var Vee=_((sQt,Yee)=>{"use strict";var Wee=Pd(),d5e=Ss(),m5e=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function y5e(t){return!(t===null||!m5e.test(t)||t[t.length-1]==="_")}function E5e(t){var e,r,s,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,s=1,a.forEach(function(n){e+=n*s,s*=60}),r*e):r*parseFloat(e,10)}var I5e=/^[-+]?[0-9]+e/;function C5e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(Wee.isNegativeZero(t))return"-0.0";return r=t.toString(10),I5e.test(r)?r.replace("e",".e"):r}function w5e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||Wee.isNegativeZero(t))}Yee.exports=new d5e("tag:yaml.org,2002:float",{kind:"scalar",resolve:y5e,construct:E5e,predicate:w5e,represent:C5e,defaultStyle:"lowercase"})});var VU=_((oQt,Jee)=>{"use strict";var B5e=bd();Jee.exports=new B5e({include:[dx()],implicit:[_ee(),jee(),qee(),Vee()]})});var JU=_((aQt,Kee)=>{"use strict";var v5e=bd();Kee.exports=new v5e({include:[VU()]})});var $ee=_((lQt,Xee)=>{"use strict";var S5e=Ss(),zee=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Zee=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function D5e(t){return t===null?!1:zee.exec(t)!==null||Zee.exec(t)!==null}function P5e(t){var e,r,s,a,n,c,f,p=0,h=null,E,C,S;if(e=zee.exec(t),e===null&&(e=Zee.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],s=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,s,a));if(n=+e[4],c=+e[5],f=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],C=+(e[11]||0),h=(E*60+C)*6e4,e[9]==="-"&&(h=-h)),S=new Date(Date.UTC(r,s,a,n,c,f,p)),h&&S.setTime(S.getTime()-h),S}function b5e(t){return t.toISOString()}Xee.exports=new S5e("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:D5e,construct:P5e,instanceOf:Date,represent:b5e})});var tte=_((cQt,ete)=>{"use strict";var x5e=Ss();function k5e(t){return t==="<<"||t===null}ete.exports=new x5e("tag:yaml.org,2002:merge",{kind:"scalar",resolve:k5e})});var ite=_((uQt,nte)=>{"use strict";var xd;try{rte=Ie,xd=rte("buffer").Buffer}catch{}var rte,Q5e=Ss(),KU=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= \r`;function R5e(t){if(t===null)return!1;var e,r,s=0,a=t.length,n=KU;for(r=0;r64)){if(e<0)return!1;s+=6}return s%8===0}function T5e(t){var e,r,s=t.replace(/[\r\n=]/g,""),a=s.length,n=KU,c=0,f=[];for(e=0;e>16&255),f.push(c>>8&255),f.push(c&255)),c=c<<6|n.indexOf(s.charAt(e));return r=a%4*6,r===0?(f.push(c>>16&255),f.push(c>>8&255),f.push(c&255)):r===18?(f.push(c>>10&255),f.push(c>>2&255)):r===12&&f.push(c>>4&255),xd?xd.from?xd.from(f):new xd(f):f}function F5e(t){var e="",r=0,s,a,n=t.length,c=KU;for(s=0;s>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]),r=(r<<8)+t[s];return a=n%3,a===0?(e+=c[r>>18&63],e+=c[r>>12&63],e+=c[r>>6&63],e+=c[r&63]):a===2?(e+=c[r>>10&63],e+=c[r>>4&63],e+=c[r<<2&63],e+=c[64]):a===1&&(e+=c[r>>2&63],e+=c[r<<4&63],e+=c[64],e+=c[64]),e}function N5e(t){return xd&&xd.isBuffer(t)}nte.exports=new Q5e("tag:yaml.org,2002:binary",{kind:"scalar",resolve:R5e,construct:T5e,predicate:N5e,represent:F5e})});var ote=_((AQt,ste)=>{"use strict";var O5e=Ss(),L5e=Object.prototype.hasOwnProperty,M5e=Object.prototype.toString;function U5e(t){if(t===null)return!0;var e=[],r,s,a,n,c,f=t;for(r=0,s=f.length;r{"use strict";var H5e=Ss(),j5e=Object.prototype.toString;function G5e(t){if(t===null)return!0;var e,r,s,a,n,c=t;for(n=new Array(c.length),e=0,r=c.length;e{"use strict";var W5e=Ss(),Y5e=Object.prototype.hasOwnProperty;function V5e(t){if(t===null)return!0;var e,r=t;for(e in r)if(Y5e.call(r,e)&&r[e]!==null)return!1;return!0}function J5e(t){return t!==null?t:{}}cte.exports=new W5e("tag:yaml.org,2002:set",{kind:"mapping",resolve:V5e,construct:J5e})});var gE=_((gQt,fte)=>{"use strict";var K5e=bd();fte.exports=new K5e({include:[JU()],implicit:[$ee(),tte()],explicit:[ite(),ote(),lte(),ute()]})});var pte=_((dQt,Ate)=>{"use strict";var z5e=Ss();function Z5e(){return!0}function X5e(){}function $5e(){return""}function e9e(t){return typeof t>"u"}Ate.exports=new z5e("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:Z5e,construct:X5e,predicate:e9e,represent:$5e})});var gte=_((mQt,hte)=>{"use strict";var t9e=Ss();function r9e(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),s="";return!(e[0]==="/"&&(r&&(s=r[1]),s.length>3||e[e.length-s.length-1]!=="/"))}function n9e(t){var e=t,r=/\/([gim]*)$/.exec(t),s="";return e[0]==="/"&&(r&&(s=r[1]),e=e.slice(1,e.length-s.length-1)),new RegExp(e,s)}function i9e(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function s9e(t){return Object.prototype.toString.call(t)==="[object RegExp]"}hte.exports=new t9e("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:r9e,construct:n9e,predicate:s9e,represent:i9e})});var yte=_((yQt,mte)=>{"use strict";var mx;try{dte=Ie,mx=dte("esprima")}catch{typeof window<"u"&&(mx=window.esprima)}var dte,o9e=Ss();function a9e(t){if(t===null)return!1;try{var e="("+t+")",r=mx.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function l9e(t){var e="("+t+")",r=mx.parse(e,{range:!0}),s=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){s.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(s,e.slice(a[0]+1,a[1]-1)):new Function(s,"return "+e.slice(a[0],a[1]))}function c9e(t){return t.toString()}function u9e(t){return Object.prototype.toString.call(t)==="[object Function]"}mte.exports=new o9e("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:a9e,construct:l9e,predicate:u9e,represent:c9e})});var G2=_((IQt,Ite)=>{"use strict";var Ete=bd();Ite.exports=Ete.DEFAULT=new Ete({include:[gE()],explicit:[pte(),gte(),yte()]})});var Ute=_((CQt,q2)=>{"use strict";var Ip=Pd(),Pte=pE(),f9e=Pee(),bte=gE(),A9e=G2(),i0=Object.prototype.hasOwnProperty,yx=1,xte=2,kte=3,Ex=4,zU=1,p9e=2,Cte=3,h9e=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,g9e=/[\x85\u2028\u2029]/,d9e=/[,\[\]\{\}]/,Qte=/^(?:!|!!|![a-z\-]+!)$/i,Rte=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function wte(t){return Object.prototype.toString.call(t)}function jf(t){return t===10||t===13}function Qd(t){return t===9||t===32}function rl(t){return t===9||t===32||t===10||t===13}function dE(t){return t===44||t===91||t===93||t===123||t===125}function m9e(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function y9e(t){return t===120?2:t===117?4:t===85?8:0}function E9e(t){return 48<=t&&t<=57?t-48:-1}function Bte(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` `:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function I9e(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var Tte=new Array(256),Fte=new Array(256);for(kd=0;kd<256;kd++)Tte[kd]=Bte(kd)?1:0,Fte[kd]=Bte(kd);var kd;function C9e(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||A9e,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Nte(t,e){return new Pte(e,new f9e(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Tr(t,e){throw Nte(t,e)}function Ix(t,e){t.onWarning&&t.onWarning.call(null,Nte(t,e))}var vte={YAML:function(e,r,s){var a,n,c;e.version!==null&&Tr(e,"duplication of %YAML directive"),s.length!==1&&Tr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(s[0]),a===null&&Tr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),c=parseInt(a[2],10),n!==1&&Tr(e,"unacceptable YAML version of the document"),e.version=s[0],e.checkLineBreaks=c<2,c!==1&&c!==2&&Ix(e,"unsupported YAML version of the document")},TAG:function(e,r,s){var a,n;s.length!==2&&Tr(e,"TAG directive accepts exactly two arguments"),a=s[0],n=s[1],Qte.test(a)||Tr(e,"ill-formed tag handle (first argument) of the TAG directive"),i0.call(e.tagMap,a)&&Tr(e,'there is a previously declared suffix for "'+a+'" tag handle'),Rte.test(n)||Tr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function n0(t,e,r,s){var a,n,c,f;if(e1&&(t.result+=Ip.repeat(` `,e-1))}function w9e(t,e,r){var s,a,n,c,f,p,h,E,C=t.kind,S=t.result,b;if(b=t.input.charCodeAt(t.position),rl(b)||dE(b)||b===35||b===38||b===42||b===33||b===124||b===62||b===39||b===34||b===37||b===64||b===96||(b===63||b===45)&&(a=t.input.charCodeAt(t.position+1),rl(a)||r&&dE(a)))return!1;for(t.kind="scalar",t.result="",n=c=t.position,f=!1;b!==0;){if(b===58){if(a=t.input.charCodeAt(t.position+1),rl(a)||r&&dE(a))break}else if(b===35){if(s=t.input.charCodeAt(t.position-1),rl(s))break}else{if(t.position===t.lineStart&&Cx(t)||r&&dE(b))break;if(jf(b))if(p=t.line,h=t.lineStart,E=t.lineIndent,os(t,!1,-1),t.lineIndent>=e){f=!0,b=t.input.charCodeAt(t.position);continue}else{t.position=c,t.line=p,t.lineStart=h,t.lineIndent=E;break}}f&&(n0(t,n,c,!1),XU(t,t.line-p),n=c=t.position,f=!1),Qd(b)||(c=t.position+1),b=t.input.charCodeAt(++t.position)}return n0(t,n,c,!1),t.result?!0:(t.kind=C,t.result=S,!1)}function B9e(t,e){var r,s,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,s=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(n0(t,s,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)s=t.position,t.position++,a=t.position;else return!0;else jf(r)?(n0(t,s,a,!0),XU(t,os(t,!1,e)),s=a=t.position):t.position===t.lineStart&&Cx(t)?Tr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Tr(t,"unexpected end of the stream within a single quoted scalar")}function v9e(t,e){var r,s,a,n,c,f;if(f=t.input.charCodeAt(t.position),f!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=s=t.position;(f=t.input.charCodeAt(t.position))!==0;){if(f===34)return n0(t,r,t.position,!0),t.position++,!0;if(f===92){if(n0(t,r,t.position,!0),f=t.input.charCodeAt(++t.position),jf(f))os(t,!1,e);else if(f<256&&Tte[f])t.result+=Fte[f],t.position++;else if((c=y9e(f))>0){for(a=c,n=0;a>0;a--)f=t.input.charCodeAt(++t.position),(c=m9e(f))>=0?n=(n<<4)+c:Tr(t,"expected hexadecimal character");t.result+=I9e(n),t.position++}else Tr(t,"unknown escape sequence");r=s=t.position}else jf(f)?(n0(t,r,s,!0),XU(t,os(t,!1,e)),r=s=t.position):t.position===t.lineStart&&Cx(t)?Tr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,s=t.position)}Tr(t,"unexpected end of the stream within a double quoted scalar")}function S9e(t,e){var r=!0,s,a=t.tag,n,c=t.anchor,f,p,h,E,C,S={},b,I,T,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,C=!1,n=[];else if(N===123)p=125,C=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(os(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=c,t.kind=C?"mapping":"sequence",t.result=n,!0;r||Tr(t,"missed comma between flow collection entries"),I=b=T=null,h=E=!1,N===63&&(f=t.input.charCodeAt(t.position+1),rl(f)&&(h=E=!0,t.position++,os(t,!0,e))),s=t.line,yE(t,e,yx,!1,!0),I=t.tag,b=t.result,os(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===s)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),os(t,!0,e),yE(t,e,yx,!1,!0),T=t.result),C?mE(t,n,S,I,b,T):h?n.push(mE(t,null,S,I,b,T)):n.push(b),os(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Tr(t,"unexpected end of the stream within a flow collection")}function D9e(t,e){var r,s,a=zU,n=!1,c=!1,f=e,p=0,h=!1,E,C;if(C=t.input.charCodeAt(t.position),C===124)s=!1;else if(C===62)s=!0;else return!1;for(t.kind="scalar",t.result="";C!==0;)if(C=t.input.charCodeAt(++t.position),C===43||C===45)zU===a?a=C===43?Cte:p9e:Tr(t,"repeat of a chomping mode identifier");else if((E=E9e(C))>=0)E===0?Tr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?Tr(t,"repeat of an indentation width identifier"):(f=e+E-1,c=!0);else break;if(Qd(C)){do C=t.input.charCodeAt(++t.position);while(Qd(C));if(C===35)do C=t.input.charCodeAt(++t.position);while(!jf(C)&&C!==0)}for(;C!==0;){for(ZU(t),t.lineIndent=0,C=t.input.charCodeAt(t.position);(!c||t.lineIndentf&&(f=t.lineIndent),jf(C)){p++;continue}if(t.lineIndente)&&p!==0)Tr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(yE(t,e,Ex,!0,a)&&(I?S=t.result:b=t.result),I||(mE(t,h,E,C,S,b,n,c),C=S=b=null),os(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Tr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),C=0,S=t.implicitTypes.length;C tag; it should be "'+b.kind+'", not "'+t.kind+'"'),b.resolve(t.result)?(t.result=b.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Tr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Tr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function Q9e(t){var e=t.position,r,s,a,n=!1,c;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(c=t.input.charCodeAt(t.position))!==0&&(os(t,!0,-1),c=t.input.charCodeAt(t.position),!(t.lineIndent>0||c!==37));){for(n=!0,c=t.input.charCodeAt(++t.position),r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);for(s=t.input.slice(r,t.position),a=[],s.length<1&&Tr(t,"directive name must not be less than one character in length");c!==0;){for(;Qd(c);)c=t.input.charCodeAt(++t.position);if(c===35){do c=t.input.charCodeAt(++t.position);while(c!==0&&!jf(c));break}if(jf(c))break;for(r=t.position;c!==0&&!rl(c);)c=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}c!==0&&ZU(t),i0.call(vte,s)?vte[s](t,s,a):Ix(t,'unknown document directive "'+s+'"')}if(os(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,os(t,!0,-1)):n&&Tr(t,"directives end mark is expected"),yE(t,t.lineIndent-1,Ex,!1,!0),os(t,!0,-1),t.checkLineBreaks&&g9e.test(t.input.slice(e,t.position))&&Ix(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Cx(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,os(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var s=Ote(t,r);if(typeof e!="function")return s;for(var a=0,n=s.length;a"u"&&(r=e,e=null),Lte(t,e,Ip.extend({schema:bte},r))}function T9e(t,e){return Mte(t,Ip.extend({schema:bte},e))}q2.exports.loadAll=Lte;q2.exports.load=Mte;q2.exports.safeLoadAll=R9e;q2.exports.safeLoad=T9e});var lre=_((wQt,r_)=>{"use strict";var Y2=Pd(),V2=pE(),F9e=G2(),N9e=gE(),Vte=Object.prototype.toString,Jte=Object.prototype.hasOwnProperty,O9e=9,W2=10,L9e=13,M9e=32,U9e=33,_9e=34,Kte=35,H9e=37,j9e=38,G9e=39,q9e=42,zte=44,W9e=45,Zte=58,Y9e=61,V9e=62,J9e=63,K9e=64,Xte=91,$te=93,z9e=96,ere=123,Z9e=124,tre=125,_o={};_o[0]="\\0";_o[7]="\\a";_o[8]="\\b";_o[9]="\\t";_o[10]="\\n";_o[11]="\\v";_o[12]="\\f";_o[13]="\\r";_o[27]="\\e";_o[34]='\\"';_o[92]="\\\\";_o[133]="\\N";_o[160]="\\_";_o[8232]="\\L";_o[8233]="\\P";var X9e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function $9e(t,e){var r,s,a,n,c,f,p;if(e===null)return{};for(r={},s=Object.keys(e),a=0,n=s.length;a0?t.charCodeAt(n-1):null,S=S&&jte(c,f)}else{for(n=0;ns&&t[C+1]!==" ",C=n);else if(!EE(c))return wx;f=n>0?t.charCodeAt(n-1):null,S=S&&jte(c,f)}h=h||E&&n-C-1>s&&t[C+1]!==" "}return!p&&!h?S&&!a(t)?nre:ire:r>9&&rre(t)?wx:h?ore:sre}function sWe(t,e,r,s){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&X9e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),c=s||t.flowLevel>-1&&r>=t.flowLevel;function f(p){return tWe(t,p)}switch(iWe(e,c,t.indent,n,f)){case nre:return e;case ire:return"'"+e.replace(/'/g,"''")+"'";case sre:return"|"+Gte(e,t.indent)+qte(Hte(e,a));case ore:return">"+Gte(e,t.indent)+qte(Hte(oWe(e,n),a));case wx:return'"'+aWe(e,n)+'"';default:throw new V2("impossible error: invalid scalar style")}}()}function Gte(t,e){var r=rre(t)?String(e):"",s=t[t.length-1]===` `,a=s&&(t[t.length-2]===` `||t===` `),n=a?"+":s?"":"-";return r+n+` `}function qte(t){return t[t.length-1]===` `?t.slice(0,-1):t}function oWe(t,e){for(var r=/(\n+)([^\n]*)/g,s=function(){var h=t.indexOf(` `);return h=h!==-1?h:t.length,r.lastIndex=h,Wte(t.slice(0,h),e)}(),a=t[0]===` `||t[0]===" ",n,c;c=r.exec(t);){var f=c[1],p=c[2];n=p[0]===" ",s+=f+(!a&&!n&&p!==""?` `:"")+Wte(p,e),a=n}return s}function Wte(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,s,a=0,n,c=0,f=0,p="";s=r.exec(t);)f=s.index,f-a>e&&(n=c>a?c:f,p+=` `+t.slice(a,n),a=n+1),c=f;return p+=` `,t.length-a>e&&c>a?p+=t.slice(a,c)+` `+t.slice(c+1):p+=t.slice(a),p.slice(1)}function aWe(t){for(var e="",r,s,a,n=0;n=55296&&r<=56319&&(s=t.charCodeAt(n+1),s>=56320&&s<=57343)){e+=_te((r-55296)*1024+s-56320+65536),n++;continue}a=_o[r],e+=!a&&EE(r)?t[n]:a||_te(r)}return e}function lWe(t,e,r){var s="",a=t.tag,n,c;for(n=0,c=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Rd(t,e,h,!1,!1)&&(E+=t.dump,s+=E));t.tag=a,t.dump="{"+s+"}"}function fWe(t,e,r,s){var a="",n=t.tag,c=Object.keys(r),f,p,h,E,C,S;if(t.sortKeys===!0)c.sort();else if(typeof t.sortKeys=="function")c.sort(t.sortKeys);else if(t.sortKeys)throw new V2("sortKeys must be a boolean or a function");for(f=0,p=c.length;f1024,C&&(t.dump&&W2===t.dump.charCodeAt(0)?S+="?":S+="? "),S+=t.dump,C&&(S+=$U(t,e)),Rd(t,e+1,E,!0,C)&&(t.dump&&W2===t.dump.charCodeAt(0)?S+=":":S+=": ",S+=t.dump,a+=S));t.tag=n,t.dump=a||"{}"}function Yte(t,e,r){var s,a,n,c,f,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,c=a.length;n tag resolver accepts not "'+p+'" style');t.dump=s}return!0}return!1}function Rd(t,e,r,s,a,n){t.tag=null,t.dump=r,Yte(t,r,!1)||Yte(t,r,!0);var c=Vte.call(t.dump);s&&(s=t.flowLevel<0||t.flowLevel>e);var f=c==="[object Object]"||c==="[object Array]",p,h;if(f&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(f&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),c==="[object Object]")s&&Object.keys(t.dump).length!==0?(fWe(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(uWe(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(c==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;s&&t.dump.length!==0?(cWe(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(lWe(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(c==="[object String]")t.tag!=="?"&&sWe(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new V2("unacceptable kind of an object to dump "+c)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function AWe(t,e){var r=[],s=[],a,n;for(e_(t,r,s),a=0,n=s.length;a{"use strict";var Bx=Ute(),cre=lre();function vx(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}qi.exports.Type=Ss();qi.exports.Schema=bd();qi.exports.FAILSAFE_SCHEMA=dx();qi.exports.JSON_SCHEMA=VU();qi.exports.CORE_SCHEMA=JU();qi.exports.DEFAULT_SAFE_SCHEMA=gE();qi.exports.DEFAULT_FULL_SCHEMA=G2();qi.exports.load=Bx.load;qi.exports.loadAll=Bx.loadAll;qi.exports.safeLoad=Bx.safeLoad;qi.exports.safeLoadAll=Bx.safeLoadAll;qi.exports.dump=cre.dump;qi.exports.safeDump=cre.safeDump;qi.exports.YAMLException=pE();qi.exports.MINIMAL_SCHEMA=dx();qi.exports.SAFE_SCHEMA=gE();qi.exports.DEFAULT_SCHEMA=G2();qi.exports.scan=vx("scan");qi.exports.parse=vx("parse");qi.exports.compose=vx("compose");qi.exports.addConstructor=vx("addConstructor")});var Are=_((vQt,fre)=>{"use strict";var hWe=ure();fre.exports=hWe});var hre=_((SQt,pre)=>{"use strict";function gWe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Td(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Td)}gWe(Td,Error);Td.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C({[dt]:Oe})))},ue=function(te){return te},le=function(te){return te},me=Oa("correct indentation"),pe=" ",Be=dn(" ",!1),Ce=function(te){return te.length===lr*St},g=function(te){return te.length===(lr+1)*St},we=function(){return lr++,!0},ye=function(){return lr--,!0},Ae=function(){return la()},se=Oa("pseudostring"),X=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,De=Kn(["\r",` `," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Te=/^[^\r\n\t ,\][{}:#"']/,mt=Kn(["\r",` `," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),j=function(){return la().replace(/^ *| *$/g,"")},rt="--",Fe=dn("--",!1),Ne=/^[a-zA-Z\/0-9]/,be=Kn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ve=/^[^\r\n\t :,]/,ke=Kn(["\r",` `," "," ",":",","],!0,!1),it="null",Ue=dn("null",!1),x=function(){return null},w="true",P=dn("true",!1),y=function(){return!0},F="false",z=dn("false",!1),Z=function(){return!1},$=Oa("string"),oe='"',xe=dn('"',!1),Re=function(){return""},lt=function(te){return te},Ct=function(te){return te.join("")},qt=/^[^"\\\0-\x1F\x7F]/,ir=Kn(['"',"\\",["\0",""],"\x7F"],!0,!1),bt='\\"',gn=dn('\\"',!1),br=function(){return'"'},Ir="\\\\",Or=dn("\\\\",!1),nn=function(){return"\\"},ai="\\/",Io=dn("\\/",!1),ts=function(){return"/"},$s="\\b",Co=dn("\\b",!1),Hi=function(){return"\b"},eo="\\f",wo=dn("\\f",!1),QA=function(){return"\f"},Af="\\n",dh=dn("\\n",!1),mh=function(){return` `},to="\\r",jn=dn("\\r",!1),Rs=function(){return"\r"},ro="\\t",ou=dn("\\t",!1),au=function(){return" "},lu="\\u",RA=dn("\\u",!1),TA=function(te,Ee,Oe,dt){return String.fromCharCode(parseInt(`0x${te}${Ee}${Oe}${dt}`))},oa=/^[0-9a-fA-F]/,aa=Kn([["0","9"],["a","f"],["A","F"]],!1,!1),FA=Oa("blank space"),gr=/^[ \t]/,Bo=Kn([" "," "],!1,!1),Me=Oa("white space"),cu=/^[ \t\n\r]/,Cr=Kn([" "," ",` `,"\r"],!1,!1),pf=`\r `,NA=dn(`\r `,!1),OA=` `,uu=dn(` `,!1),fu="\r",oc=dn("\r",!1),ve=0,Nt=0,ac=[{line:1,column:1}],Oi=0,no=[],Tt=0,xn;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function la(){return t.substring(Nt,ve)}function ji(){return Ma(Nt,ve)}function Li(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),hf([Oa(te)],t.substring(Nt,ve),Ee)}function Na(te,Ee){throw Ee=Ee!==void 0?Ee:Ma(Nt,ve),Ua(te,Ee)}function dn(te,Ee){return{type:"literal",text:te,ignoreCase:Ee}}function Kn(te,Ee,Oe){return{type:"class",parts:te,inverted:Ee,ignoreCase:Oe}}function Au(){return{type:"any"}}function yh(){return{type:"end"}}function Oa(te){return{type:"other",description:te}}function La(te){var Ee=ac[te],Oe;if(Ee)return Ee;for(Oe=te-1;!ac[Oe];)Oe--;for(Ee=ac[Oe],Ee={line:Ee.line,column:Ee.column};OeOi&&(Oi=ve,no=[]),no.push(te))}function Ua(te,Ee){return new Td(te,null,null,Ee)}function hf(te,Ee,Oe){return new Td(Td.buildMessage(te,Ee),te,Ee,Oe)}function lc(){var te;return te=LA(),te}function wn(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=ca();Oe!==r;)Ee.push(Oe),Oe=ca();return Ee!==r&&(Nt=te,Ee=n(Ee)),te=Ee,te}function ca(){var te,Ee,Oe,dt,Et;return te=ve,Ee=Bl(),Ee!==r?(t.charCodeAt(ve)===45?(Oe=c,ve++):(Oe=r,Tt===0&&$e(f)),Oe!==r?(dt=Qn(),dt!==r?(Et=ua(),Et!==r?(Nt=te,Ee=p(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te}function LA(){var te,Ee,Oe;for(te=ve,Ee=[],Oe=MA();Oe!==r;)Ee.push(Oe),Oe=MA();return Ee!==r&&(Nt=te,Ee=h(Ee)),te=Ee,te}function MA(){var te,Ee,Oe,dt,Et,Pt,tr,An,li;if(te=ve,Ee=Qn(),Ee===r&&(Ee=null),Ee!==r){if(Oe=ve,t.charCodeAt(ve)===35?(dt=E,ve++):(dt=r,Tt===0&&$e(C)),dt!==r){if(Et=[],Pt=ve,tr=ve,Tt++,An=st(),Tt--,An===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(An=t.charAt(ve),ve++):(An=r,Tt===0&&$e(S)),An!==r?(tr=[tr,An],Pt=tr):(ve=Pt,Pt=r)):(ve=Pt,Pt=r),Pt!==r)for(;Pt!==r;)Et.push(Pt),Pt=ve,tr=ve,Tt++,An=st(),Tt--,An===r?tr=void 0:(ve=tr,tr=r),tr!==r?(t.length>ve?(An=t.charAt(ve),ve++):(An=r,Tt===0&&$e(S)),An!==r?(tr=[tr,An],Pt=tr):(ve=Pt,Pt=r)):(ve=Pt,Pt=r);else Et=r;Et!==r?(dt=[dt,Et],Oe=dt):(ve=Oe,Oe=r)}else ve=Oe,Oe=r;if(Oe===r&&(Oe=null),Oe!==r){if(dt=[],Et=Ke(),Et!==r)for(;Et!==r;)dt.push(Et),Et=Ke();else dt=r;dt!==r?(Nt=te,Ee=b(),te=Ee):(ve=te,te=r)}else ve=te,te=r}else ve=te,te=r;if(te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=Ha(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Tt===0&&$e(T)),Et!==r?(Pt=Qn(),Pt===r&&(Pt=null),Pt!==r?(tr=ua(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=Bl(),Ee!==r?(Oe=rs(),Oe!==r?(dt=Qn(),dt===r&&(dt=null),dt!==r?(t.charCodeAt(ve)===58?(Et=I,ve++):(Et=r,Tt===0&&$e(T)),Et!==r?(Pt=Qn(),Pt===r&&(Pt=null),Pt!==r?(tr=ua(),tr!==r?(Nt=te,Ee=N(Oe,tr),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))){if(te=ve,Ee=Bl(),Ee!==r)if(Oe=rs(),Oe!==r)if(dt=Qn(),dt!==r)if(Et=pu(),Et!==r){if(Pt=[],tr=Ke(),tr!==r)for(;tr!==r;)Pt.push(tr),tr=Ke();else Pt=r;Pt!==r?(Nt=te,Ee=N(Oe,Et),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;else ve=te,te=r;if(te===r)if(te=ve,Ee=Bl(),Ee!==r)if(Oe=rs(),Oe!==r){if(dt=[],Et=ve,Pt=Qn(),Pt===r&&(Pt=null),Pt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Tt===0&&$e(W)),tr!==r?(An=Qn(),An===r&&(An=null),An!==r?(li=rs(),li!==r?(Nt=Et,Pt=ee(Oe,li),Et=Pt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r),Et!==r)for(;Et!==r;)dt.push(Et),Et=ve,Pt=Qn(),Pt===r&&(Pt=null),Pt!==r?(t.charCodeAt(ve)===44?(tr=U,ve++):(tr=r,Tt===0&&$e(W)),tr!==r?(An=Qn(),An===r&&(An=null),An!==r?(li=rs(),li!==r?(Nt=Et,Pt=ee(Oe,li),Et=Pt):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r)):(ve=Et,Et=r);else dt=r;dt!==r?(Et=Qn(),Et===r&&(Et=null),Et!==r?(t.charCodeAt(ve)===58?(Pt=I,ve++):(Pt=r,Tt===0&&$e(T)),Pt!==r?(tr=Qn(),tr===r&&(tr=null),tr!==r?(An=ua(),An!==r?(Nt=te,Ee=ie(Oe,dt,An),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r}return te}function ua(){var te,Ee,Oe,dt,Et,Pt,tr;if(te=ve,Ee=ve,Tt++,Oe=ve,dt=st(),dt!==r?(Et=Mt(),Et!==r?(t.charCodeAt(ve)===45?(Pt=c,ve++):(Pt=r,Tt===0&&$e(f)),Pt!==r?(tr=Qn(),tr!==r?(dt=[dt,Et,Pt,tr],Oe=dt):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r)):(ve=Oe,Oe=r),Tt--,Oe!==r?(ve=Ee,Ee=void 0):Ee=r,Ee!==r?(Oe=Ke(),Oe!==r?(dt=kn(),dt!==r?(Et=wn(),Et!==r?(Pt=fa(),Pt!==r?(Nt=te,Ee=ue(Et),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,Ee=st(),Ee!==r?(Oe=kn(),Oe!==r?(dt=LA(),dt!==r?(Et=fa(),Et!==r?(Nt=te,Ee=ue(dt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r),te===r))if(te=ve,Ee=cc(),Ee!==r){if(Oe=[],dt=Ke(),dt!==r)for(;dt!==r;)Oe.push(dt),dt=Ke();else Oe=r;Oe!==r?(Nt=te,Ee=le(Ee),te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function Bl(){var te,Ee,Oe;for(Tt++,te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=Ce(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),Tt--,te===r&&(Ee=r,Tt===0&&$e(me)),te}function Mt(){var te,Ee,Oe;for(te=ve,Ee=[],t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));Oe!==r;)Ee.push(Oe),t.charCodeAt(ve)===32?(Oe=pe,ve++):(Oe=r,Tt===0&&$e(Be));return Ee!==r?(Nt=ve,Oe=g(Ee),Oe?Oe=void 0:Oe=r,Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)):(ve=te,te=r),te}function kn(){var te;return Nt=ve,te=we(),te?te=void 0:te=r,te}function fa(){var te;return Nt=ve,te=ye(),te?te=void 0:te=r,te}function Ha(){var te;return te=vl(),te===r&&(te=uc()),te}function rs(){var te,Ee,Oe;if(te=vl(),te===r){if(te=ve,Ee=[],Oe=ja(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=ja();else Ee=r;Ee!==r&&(Nt=te,Ee=Ae()),te=Ee}return te}function cc(){var te;return te=Mi(),te===r&&(te=Is(),te===r&&(te=vl(),te===r&&(te=uc()))),te}function pu(){var te;return te=Mi(),te===r&&(te=vl(),te===r&&(te=ja())),te}function uc(){var te,Ee,Oe,dt,Et,Pt;if(Tt++,te=ve,X.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(De)),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Te.test(t.charAt(ve))?(Pt=t.charAt(ve),ve++):(Pt=r,Tt===0&&$e(mt)),Pt!==r?(Et=[Et,Pt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Te.test(t.charAt(ve))?(Pt=t.charAt(ve),ve++):(Pt=r,Tt===0&&$e(mt)),Pt!==r?(Et=[Et,Pt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(se)),te}function ja(){var te,Ee,Oe,dt,Et;if(te=ve,t.substr(ve,2)===rt?(Ee=rt,ve+=2):(Ee=r,Tt===0&&$e(Fe)),Ee===r&&(Ee=null),Ee!==r)if(Ne.test(t.charAt(ve))?(Oe=t.charAt(ve),ve++):(Oe=r,Tt===0&&$e(be)),Oe!==r){for(dt=[],Ve.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Tt===0&&$e(ke));Et!==r;)dt.push(Et),Ve.test(t.charAt(ve))?(Et=t.charAt(ve),ve++):(Et=r,Tt===0&&$e(ke));dt!==r?(Nt=te,Ee=j(),te=Ee):(ve=te,te=r)}else ve=te,te=r;else ve=te,te=r;return te}function Mi(){var te,Ee;return te=ve,t.substr(ve,4)===it?(Ee=it,ve+=4):(Ee=r,Tt===0&&$e(Ue)),Ee!==r&&(Nt=te,Ee=x()),te=Ee,te}function Is(){var te,Ee;return te=ve,t.substr(ve,4)===w?(Ee=w,ve+=4):(Ee=r,Tt===0&&$e(P)),Ee!==r&&(Nt=te,Ee=y()),te=Ee,te===r&&(te=ve,t.substr(ve,5)===F?(Ee=F,ve+=5):(Ee=r,Tt===0&&$e(z)),Ee!==r&&(Nt=te,Ee=Z()),te=Ee),te}function vl(){var te,Ee,Oe,dt;return Tt++,te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Tt===0&&$e(xe)),Ee!==r?(t.charCodeAt(ve)===34?(Oe=oe,ve++):(Oe=r,Tt===0&&$e(xe)),Oe!==r?(Nt=te,Ee=Re(),te=Ee):(ve=te,te=r)):(ve=te,te=r),te===r&&(te=ve,t.charCodeAt(ve)===34?(Ee=oe,ve++):(Ee=r,Tt===0&&$e(xe)),Ee!==r?(Oe=gf(),Oe!==r?(t.charCodeAt(ve)===34?(dt=oe,ve++):(dt=r,Tt===0&&$e(xe)),dt!==r?(Nt=te,Ee=lt(Oe),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)),Tt--,te===r&&(Ee=r,Tt===0&&$e($)),te}function gf(){var te,Ee,Oe;if(te=ve,Ee=[],Oe=fc(),Oe!==r)for(;Oe!==r;)Ee.push(Oe),Oe=fc();else Ee=r;return Ee!==r&&(Nt=te,Ee=Ct(Ee)),te=Ee,te}function fc(){var te,Ee,Oe,dt,Et,Pt;return qt.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Tt===0&&$e(ir)),te===r&&(te=ve,t.substr(ve,2)===bt?(Ee=bt,ve+=2):(Ee=r,Tt===0&&$e(gn)),Ee!==r&&(Nt=te,Ee=br()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Ir?(Ee=Ir,ve+=2):(Ee=r,Tt===0&&$e(Or)),Ee!==r&&(Nt=te,Ee=nn()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ai?(Ee=ai,ve+=2):(Ee=r,Tt===0&&$e(Io)),Ee!==r&&(Nt=te,Ee=ts()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===$s?(Ee=$s,ve+=2):(Ee=r,Tt===0&&$e(Co)),Ee!==r&&(Nt=te,Ee=Hi()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===eo?(Ee=eo,ve+=2):(Ee=r,Tt===0&&$e(wo)),Ee!==r&&(Nt=te,Ee=QA()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===Af?(Ee=Af,ve+=2):(Ee=r,Tt===0&&$e(dh)),Ee!==r&&(Nt=te,Ee=mh()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===to?(Ee=to,ve+=2):(Ee=r,Tt===0&&$e(jn)),Ee!==r&&(Nt=te,Ee=Rs()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===ro?(Ee=ro,ve+=2):(Ee=r,Tt===0&&$e(ou)),Ee!==r&&(Nt=te,Ee=au()),te=Ee,te===r&&(te=ve,t.substr(ve,2)===lu?(Ee=lu,ve+=2):(Ee=r,Tt===0&&$e(RA)),Ee!==r?(Oe=wi(),Oe!==r?(dt=wi(),dt!==r?(Et=wi(),Et!==r?(Pt=wi(),Pt!==r?(Nt=te,Ee=TA(Oe,dt,Et,Pt),te=Ee):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)):(ve=te,te=r)))))))))),te}function wi(){var te;return oa.test(t.charAt(ve))?(te=t.charAt(ve),ve++):(te=r,Tt===0&&$e(aa)),te}function Qn(){var te,Ee;if(Tt++,te=[],gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Bo)),Ee!==r)for(;Ee!==r;)te.push(Ee),gr.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Bo));else te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(FA)),te}function Ac(){var te,Ee;if(Tt++,te=[],cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Cr)),Ee!==r)for(;Ee!==r;)te.push(Ee),cu.test(t.charAt(ve))?(Ee=t.charAt(ve),ve++):(Ee=r,Tt===0&&$e(Cr));else te=r;return Tt--,te===r&&(Ee=r,Tt===0&&$e(Me)),te}function Ke(){var te,Ee,Oe,dt,Et,Pt;if(te=ve,Ee=st(),Ee!==r){for(Oe=[],dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Pt=st(),Pt!==r?(Et=[Et,Pt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);dt!==r;)Oe.push(dt),dt=ve,Et=Qn(),Et===r&&(Et=null),Et!==r?(Pt=st(),Pt!==r?(Et=[Et,Pt],dt=Et):(ve=dt,dt=r)):(ve=dt,dt=r);Oe!==r?(Ee=[Ee,Oe],te=Ee):(ve=te,te=r)}else ve=te,te=r;return te}function st(){var te;return t.substr(ve,2)===pf?(te=pf,ve+=2):(te=r,Tt===0&&$e(NA)),te===r&&(t.charCodeAt(ve)===10?(te=OA,ve++):(te=r,Tt===0&&$e(uu)),te===r&&(t.charCodeAt(ve)===13?(te=fu,ve++):(te=r,Tt===0&&$e(oc)))),te}let St=2,lr=0;if(xn=a(),xn!==r&&ve===t.length)return xn;throw xn!==r&&ve"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>yre(t[e])):!1}function n_(t,e,r){if(t===null)return`null `;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} `;if(typeof t=="string")return`${dre(t)} `;if(Array.isArray(t)){if(t.length===0)return`[] `;let s=" ".repeat(e);return` ${t.map(n=>`${s}- ${n_(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[s,a]=t instanceof Sx?[t.data,!1]:[t,!0],n=" ".repeat(e),c=Object.keys(s);a&&c.sort((p,h)=>{let E=gre.indexOf(p),C=gre.indexOf(h);return E===-1&&C===-1?ph?1:0:E!==-1&&C===-1?-1:E===-1&&C!==-1?1:E-C});let f=c.filter(p=>!yre(s[p])).map((p,h)=>{let E=s[p],C=dre(p),S=n_(E,e+1,!0),b=h>0||r?n:"",I=C.length>1024?`? ${C} ${b}:`:`${C}:`,T=S.startsWith(` `)?S:` ${S}`;return`${b}${I}${T}`}).join(e===0?` `:"")||` `;return r?` ${f}`:`${f}`}throw new Error(`Unsupported value type (${t})`)}function nl(t){try{let e=n_(t,0,!1);return e!==` `?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function yWe(t){return t.endsWith(` `)||(t+=` `),(0,mre.parse)(t)}function IWe(t){if(EWe.test(t))return yWe(t);let e=(0,Dx.safeLoad)(t,{schema:Dx.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function as(t){return IWe(t)}var Dx,mre,mWe,gre,Sx,EWe,Ere=Ze(()=>{Dx=ut(Are()),mre=ut(hre()),mWe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,gre=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],Sx=class{constructor(e){this.data=e}};nl.PreserveOrdering=Sx;EWe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var J2={};Vt(J2,{parseResolution:()=>px,parseShell:()=>ux,parseSyml:()=>as,stringifyArgument:()=>GU,stringifyArgumentSegment:()=>qU,stringifyArithmeticExpression:()=>Ax,stringifyCommand:()=>jU,stringifyCommandChain:()=>AE,stringifyCommandChainThen:()=>HU,stringifyCommandLine:()=>fx,stringifyCommandLineThen:()=>_U,stringifyEnvSegment:()=>cx,stringifyRedirectArgument:()=>H2,stringifyResolution:()=>hx,stringifyShell:()=>fE,stringifyShellLine:()=>fE,stringifySyml:()=>nl,stringifyValueArgument:()=>vd});var wc=Ze(()=>{yee();wee();Ere()});var Cre=_((kQt,i_)=>{"use strict";var CWe=t=>{let e=!1,r=!1,s=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=CWe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};i_.exports=Ire;i_.exports.default=Ire});var wre=_((QQt,wWe)=>{wWe.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var Fd=_(Ml=>{"use strict";var vre=wre(),Ds=process.env;Object.defineProperty(Ml,"_vendors",{value:vre.map(function(t){return t.constant})});Ml.name=null;Ml.isPR=null;vre.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(s){return Bre(s)});if(Ml[t.constant]=r,!!r)switch(Ml.name=t.name,typeof t.pr){case"string":Ml.isPR=!!Ds[t.pr];break;case"object":"env"in t.pr?Ml.isPR=t.pr.env in Ds&&Ds[t.pr.env]!==t.pr.ne:"any"in t.pr?Ml.isPR=t.pr.any.some(function(s){return!!Ds[s]}):Ml.isPR=Bre(t.pr);break;default:Ml.isPR=null}});Ml.isCI=!!(Ds.CI!=="false"&&(Ds.BUILD_ID||Ds.BUILD_NUMBER||Ds.CI||Ds.CI_APP_ID||Ds.CI_BUILD_ID||Ds.CI_BUILD_NUMBER||Ds.CI_NAME||Ds.CONTINUOUS_INTEGRATION||Ds.RUN_ID||Ml.name));function Bre(t){return typeof t=="string"?!!Ds[t]:"env"in t?Ds[t.env]&&Ds[t.env].includes(t.includes):"any"in t?t.any.some(function(e){return!!Ds[e]}):Object.keys(t).every(function(e){return Ds[e]===t[e]})}});var ei,En,Nd,s_,Px,Sre,o_,a_,bx=Ze(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(ei||(ei={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(En||(En={}));Nd=-1,s_=/^(-h|--help)(?:=([0-9]+))?$/,Px=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,Sre=/^-[a-zA-Z]{2,}$/,o_=/^([^=]+)=([\s\S]*)$/,a_=process.env.DEBUG_CLI==="1"});var nt,IE,xx,l_,kx=Ze(()=>{bx();nt=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},IE=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(s=>s.reason!==null&&s.reason===r[0].reason)){let[{reason:s}]=this.candidates;this.message=`${s} ${this.candidates.map(({usage:a})=>`$ ${a}`).join(` `)}`}else if(this.candidates.length===1){let[{usage:s}]=this.candidates;this.message=`Command not found; did you mean: $ ${s} ${l_(e)}`}else this.message=`Command not found; did you mean one of: ${this.candidates.map(({usage:s},a)=>`${`${a}.`.padStart(4)} ${s}`).join(` `)} ${l_(e)}`}},xx=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: ${this.usages.map((s,a)=>`${`${a}.`.padStart(4)} ${s}`).join(` `)} ${l_(e)}`}},l_=t=>`While running ${t.filter(e=>e!==ei.EndOfInput&&e!==ei.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function BWe(t){let e=t.split(` `),r=e.filter(a=>a.match(/\S/)),s=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(s).trimRight()).join(` `)}function Ho(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` `),t=BWe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 `),t=t.replace(/\n(\n)?\n*/g,(s,a)=>a||" "),r&&(t=t.split(/\n/).map(s=>{let a=s.match(/^\s*[*-][\t ]+(.*)/);if(!a)return s.match(/(.{1,80})(?: |$)/g).join(` `);let n=s.length-s.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((c,f)=>" ".repeat(n)+(f===0?"- ":" ")+c).join(` `)}).join(` `)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(s,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(s,a,n)=>e.bold(a+n+a)),t?`${t} `:""}var c_,Dre,Pre,u_=Ze(()=>{c_=Array(80).fill("\u2501");for(let t=0;t<=24;++t)c_[c_.length-t]=`\x1B[38;5;${232+t}m\u2501`;Dre={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<75?` ${c_.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},Pre={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function ya(t){return{...t,[K2]:!0}}function Gf(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function Qx(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,s,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=s!=="."||!e?`${s.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function z2(t,e){return e.length===1?new nt(`${t}${Qx(e[0],{mergeName:!0})}`):new nt(`${t}: ${e.map(r=>` - ${Qx(r)}`).join("")}`)}function Od(t,e,r){if(typeof r>"u")return e;let s=[],a=[],n=f=>{let p=e;return e=f,n.bind(null,p)};if(!r(e,{errors:s,coercions:a,coercion:n}))throw z2(`Invalid value for ${t}`,s);for(let[,f]of a)f();return e}var K2,Cp=Ze(()=>{kx();K2=Symbol("clipanion/isOption")});var Ea={};Vt(Ea,{KeyRelationship:()=>qf,TypeAssertionError:()=>o0,applyCascade:()=>$2,as:()=>jWe,assert:()=>UWe,assertWithErrors:()=>_We,cascade:()=>Nx,fn:()=>GWe,hasAtLeastOneKey:()=>m_,hasExactLength:()=>Rre,hasForbiddenKeys:()=>lYe,hasKeyRelationship:()=>tB,hasMaxLength:()=>WWe,hasMinLength:()=>qWe,hasMutuallyExclusiveKeys:()=>cYe,hasRequiredKeys:()=>aYe,hasUniqueItems:()=>YWe,isArray:()=>Rx,isAtLeast:()=>g_,isAtMost:()=>KWe,isBase64:()=>nYe,isBoolean:()=>QWe,isDate:()=>TWe,isDict:()=>OWe,isEnum:()=>fo,isHexColor:()=>rYe,isISO8601:()=>tYe,isInExclusiveRange:()=>ZWe,isInInclusiveRange:()=>zWe,isInstanceOf:()=>MWe,isInteger:()=>d_,isJSON:()=>iYe,isLiteral:()=>xre,isLowerCase:()=>XWe,isMap:()=>NWe,isNegative:()=>VWe,isNullable:()=>oYe,isNumber:()=>p_,isObject:()=>kre,isOneOf:()=>h_,isOptional:()=>sYe,isPartial:()=>LWe,isPayload:()=>RWe,isPositive:()=>JWe,isRecord:()=>Fx,isSet:()=>FWe,isString:()=>wE,isTuple:()=>Tx,isUUID4:()=>eYe,isUnknown:()=>A_,isUpperCase:()=>$We,makeTrait:()=>Qre,makeValidator:()=>Wr,matchesRegExp:()=>X2,softAssert:()=>HWe});function ti(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function CE(t,e){if(t.length===0)return"nothing";if(t.length===1)return ti(t[0]);let r=t.slice(0,-1),s=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>ti(n)).join(", ")}${a}${ti(s)}`}function s0(t,e){var r,s,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:vWe.test(e)?`${(s=t?.p)!==null&&s!==void 0?s:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function f_(t,e,r){return t===1?e:r}function mr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function xWe(t,e){return r=>{t[e]=r}}function Wf(t,e){return r=>{let s=t[e];return t[e]=r,Wf(t,e).bind(null,s)}}function Z2(t,e,r){let s=()=>(t(r()),a),a=()=>(t(e),s);return s}function A_(){return Wr({test:(t,e)=>!0})}function xre(t){return Wr({test:(e,r)=>e!==t?mr(r,`Expected ${ti(t)} (got ${ti(e)})`):!0})}function wE(){return Wr({test:(t,e)=>typeof t!="string"?mr(e,`Expected a string (got ${ti(t)})`):!0})}function fo(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),s=new Set(e);return s.size===1?xre([...s][0]):Wr({test:(a,n)=>s.has(a)?!0:r?mr(n,`Expected one of ${CE(e,"or")} (got ${ti(a)})`):mr(n,`Expected a valid enumeration value (got ${ti(a)})`)})}function QWe(){return Wr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s=kWe.get(t);if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a boolean (got ${ti(t)})`)}return!0}})}function p_(){return Wr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)s=a;else return mr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a number (got ${ti(t)})`)}return!0}})}function RWe(t){return Wr({test:(e,r)=>{var s;if(typeof r?.coercions>"u")return mr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return mr(r,"Unbound coercion result");if(typeof e!="string")return mr(r,`Expected a string (got ${ti(e)})`);let a;try{a=JSON.parse(e)}catch{return mr(r,`Expected a JSON string (got ${ti(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Wf(n,"value")}))?(r.coercions.push([(s=r.p)!==null&&s!==void 0?s:".",r.coercion.bind(null,n.value)]),!0):!1}})}function TWe(){return Wr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return mr(e,"Unbound coercion result");let s;if(typeof t=="string"&&bre.test(t))s=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))s=new Date(a*1e3);else return mr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof s<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,s)]),!0}return mr(e,`Expected a date (got ${ti(t)})`)}return!0}})}function Rx(t,{delimiter:e}={}){return Wr({test:(r,s)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof s?.coercions<"u"){if(typeof s?.coercion>"u")return mr(s,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return mr(s,`Expected an array (got ${ti(r)})`);let c=!0;for(let f=0,p=r.length;f{var n,c;if(Object.getPrototypeOf(s).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f=[...s],p=[...s];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,C)=>E!==f[C])?new Set(p):s;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",Z2(a.coercion,s,h)]),!0}else{let f=!0;for(let p of s)if(f=t(p,Object.assign({},a))&&f,!f&&a?.errors==null)break;return f}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");let f={value:s};return r(s,Object.assign(Object.assign({},a),{coercion:Wf(f,"value")}))?(a.coercions.push([(c=a.p)!==null&&c!==void 0?c:".",Z2(a.coercion,s,()=>new Set(f.value))]),!0):!1}return mr(a,`Expected a set (got ${ti(s)})`)}})}function NWe(t,e){let r=Rx(Tx([t,e])),s=Fx(e,{keys:t});return Wr({test:(a,n)=>{var c,f,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let C=()=>E.some((S,b)=>S[0]!==h[b][0]||S[1]!==h[b][1])?new Map(E):a;return n.coercions.push([(c=n.p)!==null&&c!==void 0?c:".",Z2(n.coercion,a,C)]),!0}else{let h=!0;for(let[E,C]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(C,Object.assign(Object.assign({},n),{p:s0(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return mr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(f=n.p)!==null&&f!==void 0?f:".",Z2(n.coercion,a,()=>new Map(h.value))]),!0):!1:s(a,Object.assign(Object.assign({},n),{coercion:Wf(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",Z2(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return mr(n,`Expected a map (got ${ti(a)})`)}})}function Tx(t,{delimiter:e}={}){let r=Rre(t.length);return Wr({test:(s,a)=>{var n;if(typeof s=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");s=s.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)])}if(!Array.isArray(s))return mr(a,`Expected a tuple (got ${ti(s)})`);let c=r(s,Object.assign({},a));for(let f=0,p=s.length;f{var n;if(Array.isArray(s)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?mr(a,"Unbound coercion result"):r(s,Object.assign(Object.assign({},a),{coercion:void 0}))?(s=Object.fromEntries(s),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,s)]),!0):!1;if(typeof s!="object"||s===null)return mr(a,`Expected an object (got ${ti(s)})`);let c=Object.keys(s),f=!0;for(let p=0,h=c.length;p{if(typeof a!="object"||a===null)return mr(n,`Expected an object (got ${ti(a)})`);let c=new Set([...r,...Object.keys(a)]),f={},p=!0;for(let h of c){if(h==="constructor"||h==="__proto__")p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,C=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(C,Object.assign(Object.assign({},n),{p:s0(n,h),coercion:Wf(a,h)}))&&p:e===null?p=mr(Object.assign(Object.assign({},n),{p:s0(n,h)}),`Extraneous property (got ${ti(C)})`):Object.defineProperty(f,h,{enumerable:!0,get:()=>C,set:xWe(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(f,n)&&p),p}});return Object.assign(s,{properties:t})}function LWe(t){return kre(t,{extra:Fx(A_())})}function Qre(t){return()=>t}function Wr({test:t}){return Qre(t)()}function UWe(t,e){if(!e(t))throw new o0}function _We(t,e){let r=[];if(!e(t,{errors:r}))throw new o0({errors:r})}function HWe(t,e){}function jWe(t,e,{coerce:r=!1,errors:s,throw:a}={}){let n=s?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}let c={value:t},f=Wf(c,"value"),p=[];if(!e(t,{errors:n,coercion:f,coercions:p})){if(a)throw new o0({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?c.value:{value:c.value,errors:void 0}}function GWe(t,e){let r=Tx(t);return(...s)=>{if(!r(s))throw new o0;return e(...s)}}function qWe(t){return Wr({test:(e,r)=>e.length>=t?!0:mr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function WWe(t){return Wr({test:(e,r)=>e.length<=t?!0:mr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function Rre(t){return Wr({test:(e,r)=>e.length!==t?mr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function YWe({map:t}={}){return Wr({test:(e,r)=>{let s=new Set,a=new Set;for(let n=0,c=e.length;nt<=0?!0:mr(e,`Expected to be negative (got ${t})`)})}function JWe(){return Wr({test:(t,e)=>t>=0?!0:mr(e,`Expected to be positive (got ${t})`)})}function g_(t){return Wr({test:(e,r)=>e>=t?!0:mr(r,`Expected to be at least ${t} (got ${e})`)})}function KWe(t){return Wr({test:(e,r)=>e<=t?!0:mr(r,`Expected to be at most ${t} (got ${e})`)})}function zWe(t,e){return Wr({test:(r,s)=>r>=t&&r<=e?!0:mr(s,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function ZWe(t,e){return Wr({test:(r,s)=>r>=t&&re!==Math.round(e)?mr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?mr(r,`Expected to be a safe integer (got ${e})`):!0})}function X2(t){return Wr({test:(e,r)=>t.test(e)?!0:mr(r,`Expected to match the pattern ${t.toString()} (got ${ti(e)})`)})}function XWe(){return Wr({test:(t,e)=>t!==t.toLowerCase()?mr(e,`Expected to be all-lowercase (got ${t})`):!0})}function $We(){return Wr({test:(t,e)=>t!==t.toUpperCase()?mr(e,`Expected to be all-uppercase (got ${t})`):!0})}function eYe(){return Wr({test:(t,e)=>bWe.test(t)?!0:mr(e,`Expected to be a valid UUID v4 (got ${ti(t)})`)})}function tYe(){return Wr({test:(t,e)=>bre.test(t)?!0:mr(e,`Expected to be a valid ISO 8601 date string (got ${ti(t)})`)})}function rYe({alpha:t=!1}){return Wr({test:(e,r)=>(t?SWe.test(e):DWe.test(e))?!0:mr(r,`Expected to be a valid hexadecimal color string (got ${ti(e)})`)})}function nYe(){return Wr({test:(t,e)=>PWe.test(t)?!0:mr(e,`Expected to be a valid base 64 string (got ${ti(t)})`)})}function iYe(t=A_()){return Wr({test:(e,r)=>{let s;try{s=JSON.parse(e)}catch{return mr(r,`Expected to be a valid JSON string (got ${ti(e)})`)}return t(s,r)}})}function Nx(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Wr({test:(s,a)=>{var n,c;let f={value:s},p=typeof a?.coercions<"u"?Wf(f,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(s,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,C]of h)E.push(C());try{if(typeof a?.coercions<"u"){if(f.value!==s){if(typeof a?.coercion>"u")return mr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,f.value)])}(c=a?.coercions)===null||c===void 0||c.push(...h)}return r.every(C=>C(f.value,a))}finally{for(let C of E)C()}}})}function $2(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Nx(t,r)}function sYe(t){return Wr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function oYe(t){return Wr({test:(e,r)=>e===null?!0:t(e,r)})}function aYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)||p.push(h);return p.length>0?mr(c,`Missing required ${f_(p.length,"property","properties")} ${CE(p,"and")}`):!0}})}function m_(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>Object.keys(n).some(h=>a(s,h,n))?!0:mr(c,`Missing at least one property from ${CE(Array.from(s),"or")}`)})}function lYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>0?mr(c,`Forbidden ${f_(p.length,"property","properties")} ${CE(p,"and")}`):!0}})}function cYe(t,e){var r;let s=new Set(t),a=eB[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return Wr({test:(n,c)=>{let f=new Set(Object.keys(n)),p=[];for(let h of s)a(f,h,n)&&p.push(h);return p.length>1?mr(c,`Mutually exclusive properties ${CE(p,"and")}`):!0}})}function tB(t,e,r,s){var a,n;let c=new Set((a=s?.ignore)!==null&&a!==void 0?a:[]),f=eB[(n=s?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=uYe[e],E=e===qf.Forbids?"or":"and";return Wr({test:(C,S)=>{let b=new Set(Object.keys(C));if(!f(b,t,C)||c.has(C[t]))return!0;let I=[];for(let T of p)(f(b,T,C)&&!c.has(C[T]))!==h.expect&&I.push(T);return I.length>=1?mr(S,`Property "${t}" ${h.message} ${f_(I.length,"property","properties")} ${CE(I,E)}`):!0}})}var vWe,SWe,DWe,PWe,bWe,bre,kWe,MWe,h_,o0,eB,qf,uYe,Ul=Ze(()=>{vWe=/^[a-zA-Z_][a-zA-Z0-9_]*$/;SWe=/^#[0-9a-f]{6}$/i,DWe=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,PWe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,bWe=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,bre=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;kWe=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);MWe=t=>Wr({test:(e,r)=>e instanceof t?!0:mr(r,`Expected an instance of ${t.name} (got ${ti(e)})`)}),h_=(t,{exclusive:e=!1}={})=>Wr({test:(r,s)=>{var a,n,c;let f=[],p=typeof s?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?mr(s,`Expected to match exactly a single predicate (matched ${f.join(", ")})`):(c=s?.errors)===null||c===void 0||c.push(...p),!1}});o0=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=` `;for(let s of e)r+=` - ${s}`}super(r)}};eB={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(qf||(qf={}));uYe={[qf.Forbids]:{expect:!1,message:"forbids using"},[qf.Requires]:{expect:!0,message:"requires using"}}});var ot,a0=Ze(()=>{Cp();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:c}=await Promise.resolve().then(()=>(Ul(),Ea)),f=c(a(n()),r),p=[],h=[];if(!f(this,{errors:p,coercions:h}))throw z2("Invalid option schema",p);for(let[,C]of h)C()}else if(r!=null)throw new Error("Invalid command schema");let s=await this.execute();return typeof s<"u"?s:0}};ot.isOption=K2;ot.Default=[]});function il(t){a_&&console.log(t)}function Fre(){let t={nodes:[]};for(let e=0;e{if(e.has(s))return;e.add(s);let a=t.nodes[s];for(let c of Object.values(a.statics))for(let{to:f}of c)r(f);for(let[,{to:c}]of a.dynamics)r(c);for(let{to:c}of a.shortcuts)r(c);let n=new Set(a.shortcuts.map(({to:c})=>c));for(;a.shortcuts.length>0;){let{to:c}=a.shortcuts.shift(),f=t.nodes[c];for(let[p,h]of Object.entries(f.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let C of h)E.some(({to:S})=>C.to===S)||E.push(C)}for(let[p,h]of f.dynamics)a.dynamics.some(([E,{to:C}])=>p===E&&h.to===C)||a.dynamics.push([p,h]);for(let p of f.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(En.InitialNode)}function pYe(t,{prefix:e=""}={}){if(a_){il(`${e}Nodes are:`);for(let r=0;rE!==En.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===En.ErrorNode))throw new IE(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));s=dYe(h)}if(s.length>0){il(" Results:");for(let n of s)il(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else il(" No results");return s}function gYe(t,e,{endToken:r=ei.EndOfInput}={}){let s=hYe(t,[...e,r]);return mYe(e,s.map(({state:a})=>a))}function dYe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function mYe(t,e){let r=e.filter(S=>S.selectedIndex!==null),s=r.filter(S=>!S.partial);if(s.length>0&&(r=s),r.length===0)throw new Error;let a=r.filter(S=>S.selectedIndex===Nd||S.requiredOptions.every(b=>b.some(I=>S.options.find(T=>T.name===I))));if(a.length===0)throw new IE(t,r.map(S=>({usage:S.candidateUsage,reason:null})));let n=0;for(let S of a)S.path.length>n&&(n=S.path.length);let c=a.filter(S=>S.path.length===n),f=S=>S.positionals.filter(({extra:b})=>!b).length+S.options.length,p=c.map(S=>({state:S,positionalCount:f(S)})),h=0;for(let{positionalCount:S}of p)S>h&&(h=S);let E=p.filter(({positionalCount:S})=>S===h).map(({state:S})=>S),C=yYe(E);if(C.length>1)throw new xx(t,C.map(S=>S.candidateUsage));return C[0]}function yYe(t){let e=[],r=[];for(let s of t)s.selectedIndex===Nd?r.push(s):e.push(s);return r.length>0&&e.push({...Tre,path:Nre(...r.map(s=>s.path)),options:r.reduce((s,a)=>s.concat(a.options),[])}),e}function Nre(t,e,...r){return e===void 0?Array.from(t):Nre(t.filter((s,a)=>s===e[a]),...r)}function _l(){return{dynamics:[],shortcuts:[],statics:{}}}function Ore(t){return t===En.SuccessNode||t===En.ErrorNode}function y_(t,e=0){return{to:Ore(t.to)?t.to:t.to>=En.CustomNode?t.to+e-En.CustomNode+1:t.to+e,reducer:t.reducer}}function EYe(t,e=0){let r=_l();for(let[s,a]of t.dynamics)r.dynamics.push([s,y_(a,e)]);for(let s of t.shortcuts)r.shortcuts.push(y_(s,e));for(let[s,a]of Object.entries(t.statics))r.statics[s]=a.map(n=>y_(n,e));return r}function Hs(t,e,r,s,a){t.nodes[e].dynamics.push([r,{to:s,reducer:a}])}function BE(t,e,r,s){t.nodes[e].shortcuts.push({to:r,reducer:s})}function Ia(t,e,r,s,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:s,reducer:a})}function Ox(t,e,r,s,a){if(Array.isArray(e)){let[n,...c]=e;return t[n](r,s,a,...c)}else return t[e](r,s,a)}var Tre,IYe,E_,Hl,I_,Lx,Mx=Ze(()=>{bx();kx();Tre={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Nd,partial:!1,tokens:[]};IYe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,s)=>!t.ignoreOptions&&e===s,isBatchOption:(t,e,r,s)=>!t.ignoreOptions&&Sre.test(e)&&[...e.slice(1)].every(a=>s.has(`-${a}`)),isBoundOption:(t,e,r,s,a)=>{let n=e.match(o_);return!t.ignoreOptions&&!!n&&Px.test(n[1])&&s.has(n[1])&&a.filter(c=>c.nameSet.includes(n[1])).every(c=>c.allowBinding)},isNegatedOption:(t,e,r,s)=>!t.ignoreOptions&&e===`--no-${s.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&s_.test(e),isUnsupportedOption:(t,e,r,s)=>!t.ignoreOptions&&e.startsWith("-")&&Px.test(e)&&!s.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!Px.test(e)},E_={setCandidateState:(t,e,r,s)=>({...t,...s}),setSelectedIndex:(t,e,r,s)=>({...t,selectedIndex:s}),setPartialIndex:(t,e,r,s)=>({...t,selectedIndex:s,partial:!0}),pushBatch:(t,e,r,s)=>{let a=t.options.slice(),n=t.tokens.slice();for(let c=1;c{let[,s,a]=e.match(o_),n=t.options.concat({name:s,value:a}),c=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,s.length],option:s},{segmentIndex:r,type:"assign",slice:[s.length,s.length+1]},{segmentIndex:r,type:"value",slice:[s.length+1,s.length+a.length+1]}]);return{...t,options:n,tokens:c}},pushPath:(t,e,r)=>{let s=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:s,tokens:a}},pushPositional:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtra:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let s=t.positionals.concat({value:e,extra:Hl}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:s,tokens:a}},pushTrue:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,s)=>{let a=t.options.concat({name:s,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:s});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,s)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var s;let a=t.options[t.options.length-1],n=t.options.slice(),c=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((s=a.value)!==null&&s!==void 0?s:[]).concat([e]),{...t,options:n,tokens:c}},setStringValue:(t,e,r)=>{let s=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return s.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,s)=>{let[,,a]=e.match(s_);return typeof a<"u"?{...t,options:[{name:"-c",value:String(s)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(s)}]}},setError:(t,e,r,s)=>e===ei.EndOfInput||e===ei.EndOfPartialInput?{...t,errorMessage:`${s}.`}:{...t,errorMessage:`${s} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},Hl=Symbol(),I_=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:s=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:s,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Hl)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Hl?this.arity.extra.push(e):this.arity.extra!==Hl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Hl)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let s=0;s1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(s))throw new Error(`The arity must be an integer, got ${s}`);if(s<0)throw new Error(`The arity must be positive, got ${s}`);let f=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,f);this.options.push({preferredName:f,nameSet:e,description:r,arity:s,hidden:a,required:n,allowBinding:c})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let s=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&s.push(...this.paths[0]),e){for(let{preferredName:c,nameSet:f,arity:p,hidden:h,description:E,required:C}of this.options){if(h)continue;let S=[];for(let I=0;I`:`[${b}]`)}s.push(...this.arity.leading.map(c=>`<${c}>`)),this.arity.extra===Hl?s.push("..."):s.push(...this.arity.extra.map(c=>`[${c}]`)),s.push(...this.arity.trailing.map(c=>`<${c}>`))}return{usage:s.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=Fre(),r=En.InitialNode,s=this.usage().usage,a=this.options.filter(f=>f.required).map(f=>f.nameSet);r=Ou(e,_l()),Ia(e,En.InitialNode,ei.StartOfInput,r,["setCandidateState",{candidateUsage:s,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",c=this.paths.length>0?this.paths:[[]];for(let f of c){let p=r;if(f.length>0){let S=Ou(e,_l());BE(e,p,S),this.registerOptions(e,S),p=S}for(let S=0;S0||!this.arity.proxy){let S=Ou(e,_l());Hs(e,p,"isHelp",S,["useHelp",this.cliIndex]),Hs(e,S,"always",S,"pushExtra"),Ia(e,S,ei.EndOfInput,En.SuccessNode,["setSelectedIndex",Nd]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Ia(e,p,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ia(e,p,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let S=0;S0||S+1!==this.arity.leading.length)&&(Ia(e,b,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ia(e,b,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex])),Hs(e,h,"isNotOptionLike",b,"pushPositional"),h=b}let E=h;if(this.arity.extra===Hl||this.arity.extra.length>0){let S=Ou(e,_l());if(BE(e,h,S),this.arity.extra===Hl){let b=Ou(e,_l());this.arity.proxy||this.registerOptions(e,b),Hs(e,h,n,b,"pushExtraNoLimits"),Hs(e,b,n,b,"pushExtraNoLimits"),BE(e,b,S)}else for(let b=0;b0)&&this.registerOptions(e,I),Hs(e,E,n,I,"pushExtra"),BE(e,I,S),E=I}E=S}this.arity.trailing.length>0&&(Ia(e,E,ei.EndOfInput,En.ErrorNode,["setError","Not enough positional arguments"]),Ia(e,E,ei.EndOfPartialInput,En.SuccessNode,["setPartialIndex",this.cliIndex]));let C=E;for(let S=0;S=0&&e{let c=n?ei.EndOfPartialInput:ei.EndOfInput;return gYe(s,a,{endToken:c})}}}}});function Mre(){return Ux.default&&"getColorDepth"in Ux.default.WriteStream.prototype?Ux.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function Ure(t){let e=Lre;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=Ie("async_hooks");e=Lre=new r;let s=process.stdout._write;process.stdout._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?s.call(this,n,c,f):p.stdout.write(n,c,f)};let a=process.stderr._write;process.stderr._write=function(n,c,f){let p=e.getStore();return typeof p>"u"?a.call(this,n,c,f):p.stderr.write(n,c,f)}}return r=>e.run(t,r)}var Ux,Lre,_re=Ze(()=>{Ux=ut(Ie("tty"),1)});var _x,Hre=Ze(()=>{a0();_x=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let s=new t(r);s.path=e.path;for(let a of e.options)switch(a.name){case"-c":s.commands.push(Number(a.value));break;case"-i":s.index=Number(a.value);break}return s}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: `),this.context.stdout.write(` `);let r=0;for(let s of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[s].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` `),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. `)}}}});async function qre(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=Yre(t);return Ca.from(r,e).runExit(s,a)}async function Wre(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}=Yre(t);return Ca.from(r,e).run(s,a)}function Yre(t){let e,r,s,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(s=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?s=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],s=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],s=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],s=t[2],a=t[3];break}if(typeof s>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:s,resolvedContext:a}}function Gre(t){return t()}var jre,Ca,Vre=Ze(()=>{bx();Mx();u_();_re();a0();Hre();jre=Symbol("clipanion/errorCommand");Ca=class t{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:s,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new Lx({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=s,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let s=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)s.register(n);return s}register(e){var r;let s=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[ot.isOption]&&s.set(p,h)}let n=this.builder.command(),c=n.cliIndex,f=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof f<"u")for(let p of f)n.addPath(p);this.registrations.set(e,{specs:s,builder:n,index:c});for(let[p,{definition:h}]of s.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:s,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:c,process:f}=this.builder.compile(),p=f(s,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case Nd:{let E=_x.from(p,c);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=c[p.selectedIndex],C=this.registrations.get(E);if(typeof C>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let S=new E;S.context=h,S.tokens=p.tokens,S.path=p.path;try{for(let[b,{transformer:I}]of C.specs.entries())S[b]=I(C.builder,b,p,h);return S}catch(b){throw b[jre]=S,b}}break}}async run(e,r){var s,a;let n,c={...t.defaultContext,...r},f=(s=this.enableColors)!==null&&s!==void 0?s:c.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,c)}catch(E){return c.stdout.write(this.error(E,{colored:f})),1}if(n.help)return c.stdout.write(this.usage(n,{colored:f,detailed:!0})),0;n.context=c,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,C)=>this.error(E,C),format:E=>this.format(E),process:(E,C)=>this.process(E,{...c,...C}),run:(E,C)=>this.run(E,{...c,...C}),usage:(E,C)=>this.usage(E,C)};let p=this.enableCapture&&(a=Ure(c))!==null&&a!==void 0?a:Gre,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return c.stdout.write(this.error(E,{colored:f,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:s}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),c=typeof e.usage.category<"u"?Ho(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,f=typeof e.usage.description<"u"?Ho(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?Ho(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,C])=>[Ho(E,{format:this.format(r),paragraphs:!1}),C.replace(/\$0/g,this.binaryName)]):void 0;return{path:s,usage:a,category:c,description:f,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let s of this.registrations.keys()){let a=this.definition(s,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:s=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(b=>b.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(s=!0)}let c=e!==null&&e instanceof ot?e.constructor:e,f="";if(c)if(s){let{description:p="",details:h="",examples:E=[]}=c.usage||{};p!==""&&(f+=Ho(p,{format:this.format(r),paragraphs:!1}).replace(/^./,b=>b.toUpperCase()),f+=` `),(h!==""||E.length>0)&&(f+=`${this.format(r).header("Usage")} `,f+=` `);let{usage:C,options:S}=this.getUsageByRegistration(c,{inlineOptions:!1});if(f+=`${this.format(r).bold(a)}${C} `,S.length>0){f+=` `,f+=`${this.format(r).header("Options")} `;let b=S.reduce((I,T)=>Math.max(I,T.definition.length),0);f+=` `;for(let{definition:I,description:T}of S)f+=` ${this.format(r).bold(I.padEnd(b))} ${Ho(T,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(f+=` `,f+=`${this.format(r).header("Details")} `,f+=` `,f+=Ho(h,{format:this.format(r),paragraphs:!0})),E.length>0){f+=` `,f+=`${this.format(r).header("Examples")} `;for(let[b,I]of E)f+=` `,f+=Ho(b,{format:this.format(r),paragraphs:!1}),f+=`${I.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} `}}else{let{usage:p}=this.getUsageByRegistration(c);f+=`${this.format(r).bold(a)}${p} `}else{let p=new Map;for(let[S,{index:b}]of this.registrations.entries()){if(typeof S.usage>"u")continue;let I=typeof S.usage.category<"u"?Ho(S.usage.category,{format:this.format(r),paragraphs:!1}):null,T=p.get(I);typeof T>"u"&&p.set(I,T=[]);let{usage:N}=this.getUsageByIndex(b);T.push({commandClass:S,usage:N})}let h=Array.from(p.keys()).sort((S,b)=>S===null?-1:b===null?1:S.localeCompare(b,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",C=typeof this.binaryVersion<"u";E||C?(E&&C?f+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} `:E?f+=`${this.format(r).header(`${this.binaryLabel}`)} `:f+=`${this.format(r).header(`${this.binaryVersion}`)} `,f+=` ${this.format(r).bold(a)}${this.binaryName} `):f+=`${this.format(r).bold(a)}${this.binaryName} `;for(let S of h){let b=p.get(S).slice().sort((T,N)=>T.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),I=S!==null?S.trim():"General commands";f+=` `,f+=`${this.format(r).header(`${I}`)} `;for(let{commandClass:T,usage:N}of b){let U=T.usage.description||"undocumented";f+=` `,f+=` ${this.format(r).bold(N)} `,f+=` ${Ho(U,{format:this.format(r),paragraphs:!1})}`}}f+=` `,f+=Ho("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return f}error(e,r){var s,{colored:a,command:n=(s=e[jre])!==null&&s!==void 0?s:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let c="",f=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");f==="Error"&&(f="Internal Error"),c+=`${this.format(a).error(f)}: ${e.message} `;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(c+=` `,c+=this.usage(n)):e.stack&&(c+=`${e.stack.replace(/^.*\n/,"")} `),c}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?Dre:Pre}getUsageByRegistration(e,r){let s=this.registrations.get(e);if(typeof s>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(s.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};Ca.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:Mre()}});var rB,Jre=Ze(()=>{a0();rB=class extends ot{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} `)}};rB.paths=[["--clipanion=definitions"]]});var nB,Kre=Ze(()=>{a0();nB=class extends ot{async execute(){this.context.stdout.write(this.cli.usage())}};nB.paths=[["-h"],["--help"]]});function Hx(t={}){return ya({definition(e,r){var s;e.addProxy({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){return s.positionals.map(({value:a})=>a)}})}var C_=Ze(()=>{Cp()});var iB,zre=Ze(()=>{a0();C_();iB=class extends ot{constructor(){super(...arguments),this.args=Hx()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} `)}};iB.paths=[["--clipanion=tokens"]]});var sB,Zre=Ze(()=>{a0();sB=class extends ot{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} `)}};sB.paths=[["-v"],["--version"]]});var w_={};Vt(w_,{DefinitionsCommand:()=>rB,HelpCommand:()=>nB,TokensCommand:()=>iB,VersionCommand:()=>sB});var Xre=Ze(()=>{Jre();Kre();zre();Zre()});function $re(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=new Set(c);return ya({definition(p){p.addOption({names:c,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let C,S=typeof s<"u"?[...s]:void 0;for(let{name:b,value:I}of E.options)f.has(b)&&(C=b,S=S??[],S.push(I));return typeof S<"u"?Od(C??h,S,a.validator):S}})}var ene=Ze(()=>{Cp()});function tne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);return ya({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E=S);return E}})}var rne=Ze(()=>{Cp()});function nne(t,e,r){let[s,a]=Gf(e,r??{}),n=t.split(","),c=new Set(n);return ya({definition(f){f.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(f,p,h){let E=s;for(let{name:C,value:S}of h.options)c.has(C)&&(E??(E=0),S?E+=1:E=0);return E}})}var ine=Ze(()=>{Cp()});function sne(t={}){return ya({definition(e,r){var s;e.addRest({name:(s=t.name)!==null&&s!==void 0?s:r,required:t.required})},transformer(e,r,s){let a=c=>{let f=s.positionals[c];return f.extra===Hl||f.extra===!1&&cc)}})}var one=Ze(()=>{Mx();Cp()});function CYe(t,e,r){let[s,a]=Gf(e,r??{}),{arity:n=1}=a,c=t.split(","),f=new Set(c);return ya({definition(p){p.addOption({names:c,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,C){let S,b=s;typeof a.env<"u"&&C.env[a.env]&&(S=a.env,b=C.env[a.env]);for(let{name:I,value:T}of E.options)f.has(I)&&(S=I,b=T);return typeof b=="string"?Od(S??h,b,a.validator):b}})}function wYe(t={}){let{required:e=!0}=t;return ya({definition(r,s){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:s,required:t.required})},transformer(r,s,a){var n;for(let c=0;c{Mx();Cp()});var ge={};Vt(ge,{Array:()=>$re,Boolean:()=>tne,Counter:()=>nne,Proxy:()=>Hx,Rest:()=>sne,String:()=>ane,applyValidator:()=>Od,cleanValidationError:()=>Qx,formatError:()=>z2,isOptionSymbol:()=>K2,makeCommandOption:()=>ya,rerouteArguments:()=>Gf});var cne=Ze(()=>{Cp();C_();ene();rne();ine();one();lne()});var oB={};Vt(oB,{Builtins:()=>w_,Cli:()=>Ca,Command:()=>ot,Option:()=>ge,UsageError:()=>nt,formatMarkdownish:()=>Ho,run:()=>Wre,runExit:()=>qre});var Yt=Ze(()=>{kx();u_();a0();Vre();Xre();cne()});var une=_((MRt,BYe)=>{BYe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var hne=_((URt,wp)=>{var fne=Ie("fs"),v_=Ie("path"),vYe=Ie("os"),SYe=Ie("crypto"),DYe=une(),S_=DYe.version,PYe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function bYe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,` `);let s;for(;(s=PYe.exec(r))!=null;){let a=s[1],n=s[2]||"";n=n.trim();let c=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),c==='"'&&(n=n.replace(/\\n/g,` `),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function xYe(t){let e=pne(t),r=js.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let s=Ane(t).split(","),a=s.length,n;for(let c=0;c=a)throw f}return js.parse(n)}function kYe(t){console.log(`[dotenv@${S_}][INFO] ${t}`)}function QYe(t){console.log(`[dotenv@${S_}][WARN] ${t}`)}function B_(t){console.log(`[dotenv@${S_}][DEBUG] ${t}`)}function Ane(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function RYe(t,e){let r;try{r=new URL(e)}catch(f){throw f.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):f}let s=r.password;if(!s)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,c=t.parsed[n];if(!c)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:c,key:s}}function pne(t){let e=v_.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function TYe(t){return t[0]==="~"?v_.join(vYe.homedir(),t.slice(1)):t}function FYe(t){kYe("Loading env from encrypted .env.vault");let e=js._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),js.populate(r,e,t),{parsed:e}}function NYe(t){let e=v_.resolve(process.cwd(),".env"),r="utf8",s=!!(t&&t.debug);t&&(t.path!=null&&(e=TYe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=js.parse(fne.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),js.populate(n,a,t),{parsed:a}}catch(a){return s&&B_(`Failed to load ${e} ${a.message}`),{error:a}}}function OYe(t){let e=pne(t);return Ane(t).length===0?js.configDotenv(t):fne.existsSync(e)?js._configVault(t):(QYe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),js.configDotenv(t))}function LYe(t,e){let r=Buffer.from(e.slice(-64),"hex"),s=Buffer.from(t,"base64"),a=s.slice(0,12),n=s.slice(-16);s=s.slice(12,-16);try{let c=SYe.createDecipheriv("aes-256-gcm",r,a);return c.setAuthTag(n),`${c.update(s)}${c.final()}`}catch(c){let f=c instanceof RangeError,p=c.message==="Invalid key length",h=c.message==="Unsupported state or unable to authenticate data";if(f||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",c.code),console.error("Error: ",c.message),c}}function MYe(t,e,r={}){let s=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),s&&B_(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var js={configDotenv:NYe,_configVault:FYe,_parseVault:xYe,config:OYe,decrypt:LYe,parse:bYe,populate:MYe};wp.exports.configDotenv=js.configDotenv;wp.exports._configVault=js._configVault;wp.exports._parseVault=js._parseVault;wp.exports.config=js.config;wp.exports.decrypt=js.decrypt;wp.exports.parse=js.parse;wp.exports.populate=js.populate;wp.exports=js});var dne=_((_Rt,gne)=>{"use strict";gne.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Ld=_((HRt,D_)=>{"use strict";var UYe=dne(),mne=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,s=()=>{r--,e.length>0&&e.shift()()},a=(f,p,...h)=>{r++;let E=UYe(f,...h);p(E),E.then(s,s)},n=(f,p,...h)=>{rnew Promise(h=>n(f,h,...p));return Object.defineProperties(c,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),c};D_.exports=mne;D_.exports.default=mne});function Yf(t){return`YN${t.toString(10).padStart(4,"0")}`}function jx(t){let e=Number(t.slice(2));if(typeof Br[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var Br,Gx=Ze(()=>{Br=(Me=>(Me[Me.UNNAMED=0]="UNNAMED",Me[Me.EXCEPTION=1]="EXCEPTION",Me[Me.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Me[Me.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Me[Me.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Me[Me.BUILD_DISABLED=5]="BUILD_DISABLED",Me[Me.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Me[Me.MUST_BUILD=7]="MUST_BUILD",Me[Me.MUST_REBUILD=8]="MUST_REBUILD",Me[Me.BUILD_FAILED=9]="BUILD_FAILED",Me[Me.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Me[Me.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Me[Me.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Me[Me.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Me[Me.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Me[Me.REMOTE_INVALID=15]="REMOTE_INVALID",Me[Me.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Me[Me.RESOLUTION_PACK=17]="RESOLUTION_PACK",Me[Me.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Me[Me.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Me[Me.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Me[Me.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Me[Me.FETCH_FAILED=30]="FETCH_FAILED",Me[Me.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Me[Me.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Me[Me.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Me[Me.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Me[Me.NETWORK_ERROR=35]="NETWORK_ERROR",Me[Me.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Me[Me.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Me[Me.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Me[Me.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Me[Me.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Me[Me.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Me[Me.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Me[Me.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Me[Me.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Me[Me.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Me[Me.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Me[Me.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Me[Me.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Me[Me.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Me[Me.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Me[Me.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Me[Me.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Me[Me.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Me[Me.INVALID_MANIFEST=57]="INVALID_MANIFEST",Me[Me.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Me[Me.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Me[Me.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Me[Me.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Me[Me.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Me[Me.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Me[Me.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Me[Me.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Me[Me.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Me[Me.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Me[Me.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Me[Me.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Me[Me.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Me[Me.NETWORK_DISABLED=80]="NETWORK_DISABLED",Me[Me.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Me[Me.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Me[Me.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Me[Me.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Me[Me.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Me[Me.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Me[Me.VERSION_NOTICE=88]="VERSION_NOTICE",Me[Me.TIPS_NOTICE=89]="TIPS_NOTICE",Me[Me.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Me[Me.INVALID_PROVENANCE_ENVIRONMENT=91]="INVALID_PROVENANCE_ENVIRONMENT",Me))(Br||{})});var aB=_((GRt,yne)=>{var _Ye="2.0.0",HYe=Number.MAX_SAFE_INTEGER||9007199254740991,jYe=16,GYe=250,qYe=["major","premajor","minor","preminor","patch","prepatch","prerelease"];yne.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:jYe,MAX_SAFE_BUILD_LENGTH:GYe,MAX_SAFE_INTEGER:HYe,RELEASE_TYPES:qYe,SEMVER_SPEC_VERSION:_Ye,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var lB=_((qRt,Ene)=>{var WYe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};Ene.exports=WYe});var vE=_((Bp,Ine)=>{var{MAX_SAFE_COMPONENT_LENGTH:P_,MAX_SAFE_BUILD_LENGTH:YYe,MAX_LENGTH:VYe}=aB(),JYe=lB();Bp=Ine.exports={};var KYe=Bp.re=[],zYe=Bp.safeRe=[],rr=Bp.src=[],nr=Bp.t={},ZYe=0,b_="[a-zA-Z0-9-]",XYe=[["\\s",1],["\\d",VYe],[b_,YYe]],$Ye=t=>{for(let[e,r]of XYe)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Jr=(t,e,r)=>{let s=$Ye(e),a=ZYe++;JYe(t,a,e),nr[t]=a,rr[a]=e,KYe[a]=new RegExp(e,r?"g":void 0),zYe[a]=new RegExp(s,r?"g":void 0)};Jr("NUMERICIDENTIFIER","0|[1-9]\\d*");Jr("NUMERICIDENTIFIERLOOSE","\\d+");Jr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${b_}*`);Jr("MAINVERSION",`(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})\\.(${rr[nr.NUMERICIDENTIFIER]})`);Jr("MAINVERSIONLOOSE",`(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})\\.(${rr[nr.NUMERICIDENTIFIERLOOSE]})`);Jr("PRERELEASEIDENTIFIER",`(?:${rr[nr.NUMERICIDENTIFIER]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASEIDENTIFIERLOOSE",`(?:${rr[nr.NUMERICIDENTIFIERLOOSE]}|${rr[nr.NONNUMERICIDENTIFIER]})`);Jr("PRERELEASE",`(?:-(${rr[nr.PRERELEASEIDENTIFIER]}(?:\\.${rr[nr.PRERELEASEIDENTIFIER]})*))`);Jr("PRERELEASELOOSE",`(?:-?(${rr[nr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${rr[nr.PRERELEASEIDENTIFIERLOOSE]})*))`);Jr("BUILDIDENTIFIER",`${b_}+`);Jr("BUILD",`(?:\\+(${rr[nr.BUILDIDENTIFIER]}(?:\\.${rr[nr.BUILDIDENTIFIER]})*))`);Jr("FULLPLAIN",`v?${rr[nr.MAINVERSION]}${rr[nr.PRERELEASE]}?${rr[nr.BUILD]}?`);Jr("FULL",`^${rr[nr.FULLPLAIN]}$`);Jr("LOOSEPLAIN",`[v=\\s]*${rr[nr.MAINVERSIONLOOSE]}${rr[nr.PRERELEASELOOSE]}?${rr[nr.BUILD]}?`);Jr("LOOSE",`^${rr[nr.LOOSEPLAIN]}$`);Jr("GTLT","((?:<|>)?=?)");Jr("XRANGEIDENTIFIERLOOSE",`${rr[nr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Jr("XRANGEIDENTIFIER",`${rr[nr.NUMERICIDENTIFIER]}|x|X|\\*`);Jr("XRANGEPLAIN",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:\\.(${rr[nr.XRANGEIDENTIFIER]})(?:${rr[nr.PRERELEASE]})?${rr[nr.BUILD]}?)?)?`);Jr("XRANGEPLAINLOOSE",`[v=\\s]*(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${rr[nr.XRANGEIDENTIFIERLOOSE]})(?:${rr[nr.PRERELEASELOOSE]})?${rr[nr.BUILD]}?)?)?`);Jr("XRANGE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAIN]}$`);Jr("XRANGELOOSE",`^${rr[nr.GTLT]}\\s*${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("COERCEPLAIN",`(^|[^\\d])(\\d{1,${P_}})(?:\\.(\\d{1,${P_}}))?(?:\\.(\\d{1,${P_}}))?`);Jr("COERCE",`${rr[nr.COERCEPLAIN]}(?:$|[^\\d])`);Jr("COERCEFULL",rr[nr.COERCEPLAIN]+`(?:${rr[nr.PRERELEASE]})?(?:${rr[nr.BUILD]})?(?:$|[^\\d])`);Jr("COERCERTL",rr[nr.COERCE],!0);Jr("COERCERTLFULL",rr[nr.COERCEFULL],!0);Jr("LONETILDE","(?:~>?)");Jr("TILDETRIM",`(\\s*)${rr[nr.LONETILDE]}\\s+`,!0);Bp.tildeTrimReplace="$1~";Jr("TILDE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAIN]}$`);Jr("TILDELOOSE",`^${rr[nr.LONETILDE]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("LONECARET","(?:\\^)");Jr("CARETTRIM",`(\\s*)${rr[nr.LONECARET]}\\s+`,!0);Bp.caretTrimReplace="$1^";Jr("CARET",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAIN]}$`);Jr("CARETLOOSE",`^${rr[nr.LONECARET]}${rr[nr.XRANGEPLAINLOOSE]}$`);Jr("COMPARATORLOOSE",`^${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]})$|^$`);Jr("COMPARATOR",`^${rr[nr.GTLT]}\\s*(${rr[nr.FULLPLAIN]})$|^$`);Jr("COMPARATORTRIM",`(\\s*)${rr[nr.GTLT]}\\s*(${rr[nr.LOOSEPLAIN]}|${rr[nr.XRANGEPLAIN]})`,!0);Bp.comparatorTrimReplace="$1$2$3";Jr("HYPHENRANGE",`^\\s*(${rr[nr.XRANGEPLAIN]})\\s+-\\s+(${rr[nr.XRANGEPLAIN]})\\s*$`);Jr("HYPHENRANGELOOSE",`^\\s*(${rr[nr.XRANGEPLAINLOOSE]})\\s+-\\s+(${rr[nr.XRANGEPLAINLOOSE]})\\s*$`);Jr("STAR","(<|>)?=?\\s*\\*");Jr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Jr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var qx=_((WRt,Cne)=>{var eVe=Object.freeze({loose:!0}),tVe=Object.freeze({}),rVe=t=>t?typeof t!="object"?eVe:t:tVe;Cne.exports=rVe});var x_=_((YRt,vne)=>{var wne=/^[0-9]+$/,Bne=(t,e)=>{let r=wne.test(t),s=wne.test(e);return r&&s&&(t=+t,e=+e),t===e?0:r&&!s?-1:s&&!r?1:tBne(e,t);vne.exports={compareIdentifiers:Bne,rcompareIdentifiers:nVe}});var jo=_((VRt,bne)=>{var Wx=lB(),{MAX_LENGTH:Sne,MAX_SAFE_INTEGER:Yx}=aB(),{safeRe:Dne,t:Pne}=vE(),iVe=qx(),{compareIdentifiers:SE}=x_(),k_=class t{constructor(e,r){if(r=iVe(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>Sne)throw new TypeError(`version is longer than ${Sne} characters`);Wx("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let s=e.trim().match(r.loose?Dne[Pne.LOOSE]:Dne[Pne.FULL]);if(!s)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+s[1],this.minor=+s[2],this.patch=+s[3],this.major>Yx||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Yx||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Yx||this.patch<0)throw new TypeError("Invalid patch version");s[4]?this.prerelease=s[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&s===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];s===!1&&(n=[r]),SE(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};bne.exports=k_});var Md=_((JRt,kne)=>{var xne=jo(),sVe=(t,e,r=!1)=>{if(t instanceof xne)return t;try{return new xne(t,e)}catch(s){if(!r)return null;throw s}};kne.exports=sVe});var Rne=_((KRt,Qne)=>{var oVe=Md(),aVe=(t,e)=>{let r=oVe(t,e);return r?r.version:null};Qne.exports=aVe});var Fne=_((zRt,Tne)=>{var lVe=Md(),cVe=(t,e)=>{let r=lVe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};Tne.exports=cVe});var Lne=_((ZRt,One)=>{var Nne=jo(),uVe=(t,e,r,s,a)=>{typeof r=="string"&&(a=s,s=r,r=void 0);try{return new Nne(t instanceof Nne?t.version:t,r).inc(e,s,a).version}catch{return null}};One.exports=uVe});var _ne=_((XRt,Une)=>{var Mne=Md(),fVe=(t,e)=>{let r=Mne(t,null,!0),s=Mne(e,null,!0),a=r.compare(s);if(a===0)return null;let n=a>0,c=n?r:s,f=n?s:r,p=!!c.prerelease.length;if(!!f.prerelease.length&&!p)return!f.patch&&!f.minor?"major":c.patch?"patch":c.minor?"minor":"major";let E=p?"pre":"";return r.major!==s.major?E+"major":r.minor!==s.minor?E+"minor":r.patch!==s.patch?E+"patch":"prerelease"};Une.exports=fVe});var jne=_(($Rt,Hne)=>{var AVe=jo(),pVe=(t,e)=>new AVe(t,e).major;Hne.exports=pVe});var qne=_((eTt,Gne)=>{var hVe=jo(),gVe=(t,e)=>new hVe(t,e).minor;Gne.exports=gVe});var Yne=_((tTt,Wne)=>{var dVe=jo(),mVe=(t,e)=>new dVe(t,e).patch;Wne.exports=mVe});var Jne=_((rTt,Vne)=>{var yVe=Md(),EVe=(t,e)=>{let r=yVe(t,e);return r&&r.prerelease.length?r.prerelease:null};Vne.exports=EVe});var Bc=_((nTt,zne)=>{var Kne=jo(),IVe=(t,e,r)=>new Kne(t,r).compare(new Kne(e,r));zne.exports=IVe});var Xne=_((iTt,Zne)=>{var CVe=Bc(),wVe=(t,e,r)=>CVe(e,t,r);Zne.exports=wVe});var eie=_((sTt,$ne)=>{var BVe=Bc(),vVe=(t,e)=>BVe(t,e,!0);$ne.exports=vVe});var Vx=_((oTt,rie)=>{var tie=jo(),SVe=(t,e,r)=>{let s=new tie(t,r),a=new tie(e,r);return s.compare(a)||s.compareBuild(a)};rie.exports=SVe});var iie=_((aTt,nie)=>{var DVe=Vx(),PVe=(t,e)=>t.sort((r,s)=>DVe(r,s,e));nie.exports=PVe});var oie=_((lTt,sie)=>{var bVe=Vx(),xVe=(t,e)=>t.sort((r,s)=>bVe(s,r,e));sie.exports=xVe});var cB=_((cTt,aie)=>{var kVe=Bc(),QVe=(t,e,r)=>kVe(t,e,r)>0;aie.exports=QVe});var Jx=_((uTt,lie)=>{var RVe=Bc(),TVe=(t,e,r)=>RVe(t,e,r)<0;lie.exports=TVe});var Q_=_((fTt,cie)=>{var FVe=Bc(),NVe=(t,e,r)=>FVe(t,e,r)===0;cie.exports=NVe});var R_=_((ATt,uie)=>{var OVe=Bc(),LVe=(t,e,r)=>OVe(t,e,r)!==0;uie.exports=LVe});var Kx=_((pTt,fie)=>{var MVe=Bc(),UVe=(t,e,r)=>MVe(t,e,r)>=0;fie.exports=UVe});var zx=_((hTt,Aie)=>{var _Ve=Bc(),HVe=(t,e,r)=>_Ve(t,e,r)<=0;Aie.exports=HVe});var T_=_((gTt,pie)=>{var jVe=Q_(),GVe=R_(),qVe=cB(),WVe=Kx(),YVe=Jx(),VVe=zx(),JVe=(t,e,r,s)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return jVe(t,r,s);case"!=":return GVe(t,r,s);case">":return qVe(t,r,s);case">=":return WVe(t,r,s);case"<":return YVe(t,r,s);case"<=":return VVe(t,r,s);default:throw new TypeError(`Invalid operator: ${e}`)}};pie.exports=JVe});var gie=_((dTt,hie)=>{var KVe=jo(),zVe=Md(),{safeRe:Zx,t:Xx}=vE(),ZVe=(t,e)=>{if(t instanceof KVe)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?Zx[Xx.COERCEFULL]:Zx[Xx.COERCE]);else{let p=e.includePrerelease?Zx[Xx.COERCERTLFULL]:Zx[Xx.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let s=r[2],a=r[3]||"0",n=r[4]||"0",c=e.includePrerelease&&r[5]?`-${r[5]}`:"",f=e.includePrerelease&&r[6]?`+${r[6]}`:"";return zVe(`${s}.${a}.${n}${c}${f}`,e)};hie.exports=ZVe});var mie=_((mTt,die)=>{"use strict";die.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var $x=_((yTt,yie)=>{"use strict";yie.exports=Fn;Fn.Node=Ud;Fn.create=Fn;function Fn(t){var e=this;if(e instanceof Fn||(e=new Fn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,s=arguments.length;r1)r=e;else if(this.head)s=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;s!==null;a++)r=t(r,s.value,a),s=s.next;return r};Fn.prototype.reduceReverse=function(t,e){var r,s=this.tail;if(arguments.length>1)r=e;else if(this.tail)s=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;s!==null;a--)r=t(r,s.value,a),s=s.prev;return r};Fn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Fn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Fn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Fn;if(ethis.length&&(e=this.length);for(var s=0,a=this.head;a!==null&&sthis.length&&(e=this.length);for(var s=this.length,a=this.tail;a!==null&&s>e;s--)a=a.prev;for(;a!==null&&s>t;s--,a=a.prev)r.push(a.value);return r};Fn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var s=0,a=this.head;a!==null&&s{"use strict";var t7e=$x(),_d=Symbol("max"),Sp=Symbol("length"),DE=Symbol("lengthCalculator"),fB=Symbol("allowStale"),Hd=Symbol("maxAge"),vp=Symbol("dispose"),Eie=Symbol("noDisposeOnSet"),Gs=Symbol("lruList"),Lu=Symbol("cache"),Cie=Symbol("updateAgeOnGet"),F_=()=>1,O_=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[_d]=e.max||1/0,s=e.length||F_;if(this[DE]=typeof s!="function"?F_:s,this[fB]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[Hd]=e.maxAge||0,this[vp]=e.dispose,this[Eie]=e.noDisposeOnSet||!1,this[Cie]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[_d]=e||1/0,uB(this)}get max(){return this[_d]}set allowStale(e){this[fB]=!!e}get allowStale(){return this[fB]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[Hd]=e,uB(this)}get maxAge(){return this[Hd]}set lengthCalculator(e){typeof e!="function"&&(e=F_),e!==this[DE]&&(this[DE]=e,this[Sp]=0,this[Gs].forEach(r=>{r.length=this[DE](r.value,r.key),this[Sp]+=r.length})),uB(this)}get lengthCalculator(){return this[DE]}get length(){return this[Sp]}get itemCount(){return this[Gs].length}rforEach(e,r){r=r||this;for(let s=this[Gs].tail;s!==null;){let a=s.prev;Iie(this,e,s,r),s=a}}forEach(e,r){r=r||this;for(let s=this[Gs].head;s!==null;){let a=s.next;Iie(this,e,s,r),s=a}}keys(){return this[Gs].toArray().map(e=>e.key)}values(){return this[Gs].toArray().map(e=>e.value)}reset(){this[vp]&&this[Gs]&&this[Gs].length&&this[Gs].forEach(e=>this[vp](e.key,e.value)),this[Lu]=new Map,this[Gs]=new t7e,this[Sp]=0}dump(){return this[Gs].map(e=>ek(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Gs]}set(e,r,s){if(s=s||this[Hd],s&&typeof s!="number")throw new TypeError("maxAge must be a number");let a=s?Date.now():0,n=this[DE](r,e);if(this[Lu].has(e)){if(n>this[_d])return PE(this,this[Lu].get(e)),!1;let p=this[Lu].get(e).value;return this[vp]&&(this[Eie]||this[vp](e,p.value)),p.now=a,p.maxAge=s,p.value=r,this[Sp]+=n-p.length,p.length=n,this.get(e),uB(this),!0}let c=new L_(e,r,n,a,s);return c.length>this[_d]?(this[vp]&&this[vp](e,r),!1):(this[Sp]+=c.length,this[Gs].unshift(c),this[Lu].set(e,this[Gs].head),uB(this),!0)}has(e){if(!this[Lu].has(e))return!1;let r=this[Lu].get(e).value;return!ek(this,r)}get(e){return N_(this,e,!0)}peek(e){return N_(this,e,!1)}pop(){let e=this[Gs].tail;return e?(PE(this,e),e.value):null}del(e){PE(this,this[Lu].get(e))}load(e){this.reset();let r=Date.now();for(let s=e.length-1;s>=0;s--){let a=e[s],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let c=n-r;c>0&&this.set(a.k,a.v,c)}}}prune(){this[Lu].forEach((e,r)=>N_(this,r,!1))}},N_=(t,e,r)=>{let s=t[Lu].get(e);if(s){let a=s.value;if(ek(t,a)){if(PE(t,s),!t[fB])return}else r&&(t[Cie]&&(s.value.now=Date.now()),t[Gs].unshiftNode(s));return a.value}},ek=(t,e)=>{if(!e||!e.maxAge&&!t[Hd])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[Hd]&&r>t[Hd]},uB=t=>{if(t[Sp]>t[_d])for(let e=t[Gs].tail;t[Sp]>t[_d]&&e!==null;){let r=e.prev;PE(t,e),e=r}},PE=(t,e)=>{if(e){let r=e.value;t[vp]&&t[vp](r.key,r.value),t[Sp]-=r.length,t[Lu].delete(r.key),t[Gs].removeNode(e)}},L_=class{constructor(e,r,s,a,n){this.key=e,this.value=r,this.length=s,this.now=a,this.maxAge=n||0}},Iie=(t,e,r,s)=>{let a=r.value;ek(t,a)&&(PE(t,r),t[fB]||(a=void 0)),a&&e.call(s,a.value,a.key,t)};wie.exports=O_});var vc=_((ITt,Pie)=>{var M_=class t{constructor(e,r){if(r=n7e(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof U_)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(s=>this.parseRange(s.trim())).filter(s=>s.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let s=this.set[0];if(this.set=this.set.filter(a=>!Sie(a[0])),this.set.length===0)this.set=[s];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&u7e(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){let s=((this.options.includePrerelease&&l7e)|(this.options.loose&&c7e))+":"+e,a=vie.get(s);if(a)return a;let n=this.options.loose,c=n?sl[wa.HYPHENRANGELOOSE]:sl[wa.HYPHENRANGE];e=e.replace(c,I7e(this.options.includePrerelease)),vi("hyphen replace",e),e=e.replace(sl[wa.COMPARATORTRIM],s7e),vi("comparator trim",e),e=e.replace(sl[wa.TILDETRIM],o7e),vi("tilde trim",e),e=e.replace(sl[wa.CARETTRIM],a7e),vi("caret trim",e);let f=e.split(" ").map(C=>f7e(C,this.options)).join(" ").split(/\s+/).map(C=>E7e(C,this.options));n&&(f=f.filter(C=>(vi("loose invalid filter",C,this.options),!!C.match(sl[wa.COMPARATORLOOSE])))),vi("range list",f);let p=new Map,h=f.map(C=>new U_(C,this.options));for(let C of h){if(Sie(C))return[C];p.set(C.value,C)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return vie.set(s,E),E}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(s=>Die(s,r)&&e.set.some(a=>Die(a,r)&&s.every(n=>a.every(c=>n.intersects(c,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new i7e(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",u7e=t=>t.value==="",Die=(t,e)=>{let r=!0,s=t.slice(),a=s.pop();for(;r&&s.length;)r=s.every(n=>a.intersects(n,e)),a=s.pop();return r},f7e=(t,e)=>(vi("comp",t,e),t=h7e(t,e),vi("caret",t),t=A7e(t,e),vi("tildes",t),t=d7e(t,e),vi("xrange",t),t=y7e(t,e),vi("stars",t),t),Ba=t=>!t||t.toLowerCase()==="x"||t==="*",A7e=(t,e)=>t.trim().split(/\s+/).map(r=>p7e(r,e)).join(" "),p7e=(t,e)=>{let r=e.loose?sl[wa.TILDELOOSE]:sl[wa.TILDE];return t.replace(r,(s,a,n,c,f)=>{vi("tilde",t,s,a,n,c,f);let p;return Ba(a)?p="":Ba(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Ba(c)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:f?(vi("replaceTilde pr",f),p=`>=${a}.${n}.${c}-${f} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${c} <${a}.${+n+1}.0-0`,vi("tilde return",p),p})},h7e=(t,e)=>t.trim().split(/\s+/).map(r=>g7e(r,e)).join(" "),g7e=(t,e)=>{vi("caret",t,e);let r=e.loose?sl[wa.CARETLOOSE]:sl[wa.CARET],s=e.includePrerelease?"-0":"";return t.replace(r,(a,n,c,f,p)=>{vi("caret",t,a,n,c,f,p);let h;return Ba(n)?h="":Ba(c)?h=`>=${n}.0.0${s} <${+n+1}.0.0-0`:Ba(f)?n==="0"?h=`>=${n}.${c}.0${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.0${s} <${+n+1}.0.0-0`:p?(vi("replaceCaret pr",p),n==="0"?c==="0"?h=`>=${n}.${c}.${f}-${p} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}-${p} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f}-${p} <${+n+1}.0.0-0`):(vi("no pr"),n==="0"?c==="0"?h=`>=${n}.${c}.${f}${s} <${n}.${c}.${+f+1}-0`:h=`>=${n}.${c}.${f}${s} <${n}.${+c+1}.0-0`:h=`>=${n}.${c}.${f} <${+n+1}.0.0-0`),vi("caret return",h),h})},d7e=(t,e)=>(vi("replaceXRanges",t,e),t.split(/\s+/).map(r=>m7e(r,e)).join(" ")),m7e=(t,e)=>{t=t.trim();let r=e.loose?sl[wa.XRANGELOOSE]:sl[wa.XRANGE];return t.replace(r,(s,a,n,c,f,p)=>{vi("xRange",t,s,a,n,c,f,p);let h=Ba(n),E=h||Ba(c),C=E||Ba(f),S=C;return a==="="&&S&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?s="<0.0.0-0":s="*":a&&S?(E&&(c=0),f=0,a===">"?(a=">=",E?(n=+n+1,c=0,f=0):(c=+c+1,f=0)):a==="<="&&(a="<",E?n=+n+1:c=+c+1),a==="<"&&(p="-0"),s=`${a+n}.${c}.${f}${p}`):E?s=`>=${n}.0.0${p} <${+n+1}.0.0-0`:C&&(s=`>=${n}.${c}.0${p} <${n}.${+c+1}.0-0`),vi("xRange return",s),s})},y7e=(t,e)=>(vi("replaceStars",t,e),t.trim().replace(sl[wa.STAR],"")),E7e=(t,e)=>(vi("replaceGTE0",t,e),t.trim().replace(sl[e.includePrerelease?wa.GTE0PRE:wa.GTE0],"")),I7e=t=>(e,r,s,a,n,c,f,p,h,E,C,S,b)=>(Ba(s)?r="":Ba(a)?r=`>=${s}.0.0${t?"-0":""}`:Ba(n)?r=`>=${s}.${a}.0${t?"-0":""}`:c?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Ba(h)?p="":Ba(E)?p=`<${+h+1}.0.0-0`:Ba(C)?p=`<${h}.${+E+1}.0-0`:S?p=`<=${h}.${E}.${C}-${S}`:t?p=`<${h}.${E}.${+C+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),C7e=(t,e,r)=>{for(let s=0;s0){let a=t[s].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var AB=_((CTt,Tie)=>{var pB=Symbol("SemVer ANY"),j_=class t{static get ANY(){return pB}constructor(e,r){if(r=bie(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),H_("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===pB?this.value="":this.value=this.operator+this.semver.version,H_("comp",this)}parse(e){let r=this.options.loose?xie[kie.COMPARATORLOOSE]:xie[kie.COMPARATOR],s=e.match(r);if(!s)throw new TypeError(`Invalid comparator: ${e}`);this.operator=s[1]!==void 0?s[1]:"",this.operator==="="&&(this.operator=""),s[2]?this.semver=new Qie(s[2],this.options.loose):this.semver=pB}toString(){return this.value}test(e){if(H_("Comparator.test",e,this.options.loose),this.semver===pB||e===pB)return!0;if(typeof e=="string")try{e=new Qie(e,this.options)}catch{return!1}return __(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new Rie(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new Rie(this.value,r).test(e.semver):(r=bie(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||__(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||__(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};Tie.exports=j_;var bie=qx(),{safeRe:xie,t:kie}=vE(),__=T_(),H_=lB(),Qie=jo(),Rie=vc()});var hB=_((wTt,Fie)=>{var w7e=vc(),B7e=(t,e,r)=>{try{e=new w7e(e,r)}catch{return!1}return e.test(t)};Fie.exports=B7e});var Oie=_((BTt,Nie)=>{var v7e=vc(),S7e=(t,e)=>new v7e(t,e).set.map(r=>r.map(s=>s.value).join(" ").trim().split(" "));Nie.exports=S7e});var Mie=_((vTt,Lie)=>{var D7e=jo(),P7e=vc(),b7e=(t,e,r)=>{let s=null,a=null,n=null;try{n=new P7e(e,r)}catch{return null}return t.forEach(c=>{n.test(c)&&(!s||a.compare(c)===-1)&&(s=c,a=new D7e(s,r))}),s};Lie.exports=b7e});var _ie=_((STt,Uie)=>{var x7e=jo(),k7e=vc(),Q7e=(t,e,r)=>{let s=null,a=null,n=null;try{n=new k7e(e,r)}catch{return null}return t.forEach(c=>{n.test(c)&&(!s||a.compare(c)===1)&&(s=c,a=new x7e(s,r))}),s};Uie.exports=Q7e});var Gie=_((DTt,jie)=>{var G_=jo(),R7e=vc(),Hie=cB(),T7e=(t,e)=>{t=new R7e(t,e);let r=new G_("0.0.0");if(t.test(r)||(r=new G_("0.0.0-0"),t.test(r)))return r;r=null;for(let s=0;s{let f=new G_(c.semver.version);switch(c.operator){case">":f.prerelease.length===0?f.patch++:f.prerelease.push(0),f.raw=f.format();case"":case">=":(!n||Hie(f,n))&&(n=f);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${c.operator}`)}}),n&&(!r||Hie(r,n))&&(r=n)}return r&&t.test(r)?r:null};jie.exports=T7e});var Wie=_((PTt,qie)=>{var F7e=vc(),N7e=(t,e)=>{try{return new F7e(t,e).range||"*"}catch{return null}};qie.exports=N7e});var tk=_((bTt,Kie)=>{var O7e=jo(),Jie=AB(),{ANY:L7e}=Jie,M7e=vc(),U7e=hB(),Yie=cB(),Vie=Jx(),_7e=zx(),H7e=Kx(),j7e=(t,e,r,s)=>{t=new O7e(t,s),e=new M7e(e,s);let a,n,c,f,p;switch(r){case">":a=Yie,n=_7e,c=Vie,f=">",p=">=";break;case"<":a=Vie,n=H7e,c=Yie,f="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(U7e(t,e,s))return!1;for(let h=0;h{b.semver===L7e&&(b=new Jie(">=0.0.0")),C=C||b,S=S||b,a(b.semver,C.semver,s)?C=b:c(b.semver,S.semver,s)&&(S=b)}),C.operator===f||C.operator===p||(!S.operator||S.operator===f)&&n(t,S.semver))return!1;if(S.operator===p&&c(t,S.semver))return!1}return!0};Kie.exports=j7e});var Zie=_((xTt,zie)=>{var G7e=tk(),q7e=(t,e,r)=>G7e(t,e,">",r);zie.exports=q7e});var $ie=_((kTt,Xie)=>{var W7e=tk(),Y7e=(t,e,r)=>W7e(t,e,"<",r);Xie.exports=Y7e});var rse=_((QTt,tse)=>{var ese=vc(),V7e=(t,e,r)=>(t=new ese(t,r),e=new ese(e,r),t.intersects(e,r));tse.exports=V7e});var ise=_((RTt,nse)=>{var J7e=hB(),K7e=Bc();nse.exports=(t,e,r)=>{let s=[],a=null,n=null,c=t.sort((E,C)=>K7e(E,C,r));for(let E of c)J7e(E,e,r)?(n=E,a||(a=E)):(n&&s.push([a,n]),n=null,a=null);a&&s.push([a,null]);let f=[];for(let[E,C]of s)E===C?f.push(E):!C&&E===c[0]?f.push("*"):C?E===c[0]?f.push(`<=${C}`):f.push(`${E} - ${C}`):f.push(`>=${E}`);let p=f.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var sse=vc(),W_=AB(),{ANY:q_}=W_,gB=hB(),Y_=Bc(),z7e=(t,e,r={})=>{if(t===e)return!0;t=new sse(t,r),e=new sse(e,r);let s=!1;e:for(let a of t.set){for(let n of e.set){let c=X7e(a,n,r);if(s=s||c!==null,c)continue e}if(s)return!1}return!0},Z7e=[new W_(">=0.0.0-0")],ose=[new W_(">=0.0.0")],X7e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===q_){if(e.length===1&&e[0].semver===q_)return!0;r.includePrerelease?t=Z7e:t=ose}if(e.length===1&&e[0].semver===q_){if(r.includePrerelease)return!0;e=ose}let s=new Set,a,n;for(let b of t)b.operator===">"||b.operator===">="?a=ase(a,b,r):b.operator==="<"||b.operator==="<="?n=lse(n,b,r):s.add(b.semver);if(s.size>1)return null;let c;if(a&&n){if(c=Y_(a.semver,n.semver,r),c>0)return null;if(c===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let b of s){if(a&&!gB(b,String(a),r)||n&&!gB(b,String(n),r))return null;for(let I of e)if(!gB(b,String(I),r))return!1;return!0}let f,p,h,E,C=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,S=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;C&&C.prerelease.length===1&&n.operator==="<"&&C.prerelease[0]===0&&(C=!1);for(let b of e){if(E=E||b.operator===">"||b.operator===">=",h=h||b.operator==="<"||b.operator==="<=",a){if(S&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===S.major&&b.semver.minor===S.minor&&b.semver.patch===S.patch&&(S=!1),b.operator===">"||b.operator===">="){if(f=ase(a,b,r),f===b&&f!==a)return!1}else if(a.operator===">="&&!gB(a.semver,String(b),r))return!1}if(n){if(C&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===C.major&&b.semver.minor===C.minor&&b.semver.patch===C.patch&&(C=!1),b.operator==="<"||b.operator==="<="){if(p=lse(n,b,r),p===b&&p!==n)return!1}else if(n.operator==="<="&&!gB(n.semver,String(b),r))return!1}if(!b.operator&&(n||a)&&c!==0)return!1}return!(a&&h&&!n&&c!==0||n&&E&&!a&&c!==0||S||C)},ase=(t,e,r)=>{if(!t)return e;let s=Y_(t.semver,e.semver,r);return s>0?t:s<0||e.operator===">"&&t.operator===">="?e:t},lse=(t,e,r)=>{if(!t)return e;let s=Y_(t.semver,e.semver,r);return s<0?t:s>0||e.operator==="<"&&t.operator==="<="?e:t};cse.exports=z7e});var Ai=_((FTt,pse)=>{var V_=vE(),fse=aB(),$7e=jo(),Ase=x_(),eJe=Md(),tJe=Rne(),rJe=Fne(),nJe=Lne(),iJe=_ne(),sJe=jne(),oJe=qne(),aJe=Yne(),lJe=Jne(),cJe=Bc(),uJe=Xne(),fJe=eie(),AJe=Vx(),pJe=iie(),hJe=oie(),gJe=cB(),dJe=Jx(),mJe=Q_(),yJe=R_(),EJe=Kx(),IJe=zx(),CJe=T_(),wJe=gie(),BJe=AB(),vJe=vc(),SJe=hB(),DJe=Oie(),PJe=Mie(),bJe=_ie(),xJe=Gie(),kJe=Wie(),QJe=tk(),RJe=Zie(),TJe=$ie(),FJe=rse(),NJe=ise(),OJe=use();pse.exports={parse:eJe,valid:tJe,clean:rJe,inc:nJe,diff:iJe,major:sJe,minor:oJe,patch:aJe,prerelease:lJe,compare:cJe,rcompare:uJe,compareLoose:fJe,compareBuild:AJe,sort:pJe,rsort:hJe,gt:gJe,lt:dJe,eq:mJe,neq:yJe,gte:EJe,lte:IJe,cmp:CJe,coerce:wJe,Comparator:BJe,Range:vJe,satisfies:SJe,toComparators:DJe,maxSatisfying:PJe,minSatisfying:bJe,minVersion:xJe,validRange:kJe,outside:QJe,gtr:RJe,ltr:TJe,intersects:FJe,simplifyRange:NJe,subset:OJe,SemVer:$7e,re:V_.re,src:V_.src,tokens:V_.t,SEMVER_SPEC_VERSION:fse.SEMVER_SPEC_VERSION,RELEASE_TYPES:fse.RELEASE_TYPES,compareIdentifiers:Ase.compareIdentifiers,rcompareIdentifiers:Ase.rcompareIdentifiers}});var gse=_((NTt,hse)=>{"use strict";function LJe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function jd(t,e,r,s){this.message=t,this.expected=e,this.found=r,this.location=s,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,jd)}LJe(jd,Error);jd.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",C;for(C=0;C0){for(C=1,S=1;C{switch(Re[1]){case"|":return xe|Re[3];case"&":return xe&Re[3];case"^":return xe^Re[3]}},$)},S="!",b=Fe("!",!1),I=function($){return!$},T="(",N=Fe("(",!1),U=")",W=Fe(")",!1),ee=function($){return $},ie=/^[^ \t\n\r()!|&\^]/,ue=Ne([" "," ",` `,"\r","(",")","!","|","&","^"],!0,!1),le=function($){return e.queryPattern.test($)},me=function($){return e.checkFn($)},pe=ke("whitespace"),Be=/^[ \t\n\r]/,Ce=Ne([" "," ",` `,"\r"],!1,!1),g=0,we=0,ye=[{line:1,column:1}],Ae=0,se=[],X=0,De;if("startRule"in e){if(!(e.startRule in s))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=s[e.startRule]}function Te(){return t.substring(we,g)}function mt(){return Ue(we,g)}function j($,oe){throw oe=oe!==void 0?oe:Ue(we,g),P([ke($)],t.substring(we,g),oe)}function rt($,oe){throw oe=oe!==void 0?oe:Ue(we,g),w($,oe)}function Fe($,oe){return{type:"literal",text:$,ignoreCase:oe}}function Ne($,oe,xe){return{type:"class",parts:$,inverted:oe,ignoreCase:xe}}function be(){return{type:"any"}}function Ve(){return{type:"end"}}function ke($){return{type:"other",description:$}}function it($){var oe=ye[$],xe;if(oe)return oe;for(xe=$-1;!ye[xe];)xe--;for(oe=ye[xe],oe={line:oe.line,column:oe.column};xe<$;)t.charCodeAt(xe)===10?(oe.line++,oe.column=1):oe.column++,xe++;return ye[$]=oe,oe}function Ue($,oe){var xe=it($),Re=it(oe);return{start:{offset:$,line:xe.line,column:xe.column},end:{offset:oe,line:Re.line,column:Re.column}}}function x($){gAe&&(Ae=g,se=[]),se.push($))}function w($,oe){return new jd($,null,null,oe)}function P($,oe,xe){return new jd(jd.buildMessage($,oe),$,oe,xe)}function y(){var $,oe,xe,Re,lt,Ct,qt,ir;if($=g,oe=F(),oe!==r){for(xe=[],Re=g,lt=Z(),lt!==r?(t.charCodeAt(g)===124?(Ct=n,g++):(Ct=r,X===0&&x(c)),Ct===r&&(t.charCodeAt(g)===38?(Ct=f,g++):(Ct=r,X===0&&x(p)),Ct===r&&(t.charCodeAt(g)===94?(Ct=h,g++):(Ct=r,X===0&&x(E)))),Ct!==r?(qt=Z(),qt!==r?(ir=F(),ir!==r?(lt=[lt,Ct,qt,ir],Re=lt):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r);Re!==r;)xe.push(Re),Re=g,lt=Z(),lt!==r?(t.charCodeAt(g)===124?(Ct=n,g++):(Ct=r,X===0&&x(c)),Ct===r&&(t.charCodeAt(g)===38?(Ct=f,g++):(Ct=r,X===0&&x(p)),Ct===r&&(t.charCodeAt(g)===94?(Ct=h,g++):(Ct=r,X===0&&x(E)))),Ct!==r?(qt=Z(),qt!==r?(ir=F(),ir!==r?(lt=[lt,Ct,qt,ir],Re=lt):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r);xe!==r?(we=$,oe=C(oe,xe),$=oe):(g=$,$=r)}else g=$,$=r;return $}function F(){var $,oe,xe,Re,lt,Ct;return $=g,t.charCodeAt(g)===33?(oe=S,g++):(oe=r,X===0&&x(b)),oe!==r?(xe=F(),xe!==r?(we=$,oe=I(xe),$=oe):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(oe=T,g++):(oe=r,X===0&&x(N)),oe!==r?(xe=Z(),xe!==r?(Re=y(),Re!==r?(lt=Z(),lt!==r?(t.charCodeAt(g)===41?(Ct=U,g++):(Ct=r,X===0&&x(W)),Ct!==r?(we=$,oe=ee(Re),$=oe):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=z())),$}function z(){var $,oe,xe,Re,lt;if($=g,oe=Z(),oe!==r){if(xe=g,Re=[],ie.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,X===0&&x(ue)),lt!==r)for(;lt!==r;)Re.push(lt),ie.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,X===0&&x(ue));else Re=r;Re!==r?xe=t.substring(xe,g):xe=Re,xe!==r?(we=g,Re=le(xe),Re?Re=void 0:Re=r,Re!==r?(we=$,oe=me(xe),$=oe):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function Z(){var $,oe;for(X++,$=[],Be.test(t.charAt(g))?(oe=t.charAt(g),g++):(oe=r,X===0&&x(Ce));oe!==r;)$.push(oe),Be.test(t.charAt(g))?(oe=t.charAt(g),g++):(oe=r,X===0&&x(Ce));return X--,$===r&&(oe=r,X===0&&x(pe)),$}if(De=a(),De!==r&&g===t.length)return De;throw De!==r&&g{var{parse:UJe}=gse();rk.makeParser=(t=/[a-z]+/)=>(e,r)=>UJe(e,{queryPattern:t,checkFn:r});rk.parse=rk.makeParser()});var yse=_((LTt,mse)=>{"use strict";mse.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var J_=_((MTt,Ise)=>{var dB=yse(),Ese={};for(let t of Object.keys(dB))Ese[dB[t]]=t;var hr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};Ise.exports=hr;for(let t of Object.keys(hr)){if(!("channels"in hr[t]))throw new Error("missing channels property: "+t);if(!("labels"in hr[t]))throw new Error("missing channel labels property: "+t);if(hr[t].labels.length!==hr[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=hr[t];delete hr[t].channels,delete hr[t].labels,Object.defineProperty(hr[t],"channels",{value:e}),Object.defineProperty(hr[t],"labels",{value:r})}hr.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.min(e,r,s),n=Math.max(e,r,s),c=n-a,f,p;n===a?f=0:e===n?f=(r-s)/c:r===n?f=2+(s-e)/c:s===n&&(f=4+(e-r)/c),f=Math.min(f*60,360),f<0&&(f+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=c/(n+a):p=c/(2-n-a),[f,p*100,h*100]};hr.rgb.hsv=function(t){let e,r,s,a,n,c=t[0]/255,f=t[1]/255,p=t[2]/255,h=Math.max(c,f,p),E=h-Math.min(c,f,p),C=function(S){return(h-S)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=C(c),r=C(f),s=C(p),c===h?a=s-r:f===h?a=1/3+e-s:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};hr.rgb.hwb=function(t){let e=t[0],r=t[1],s=t[2],a=hr.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,s));return s=1-1/255*Math.max(e,Math.max(r,s)),[a,n*100,s*100]};hr.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.min(1-e,1-r,1-s),n=(1-e-a)/(1-a)||0,c=(1-r-a)/(1-a)||0,f=(1-s-a)/(1-a)||0;return[n*100,c*100,f*100,a*100]};function _Je(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}hr.rgb.keyword=function(t){let e=Ese[t];if(e)return e;let r=1/0,s;for(let a of Object.keys(dB)){let n=dB[a],c=_Je(t,n);c.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,s=s>.04045?((s+.055)/1.055)**2.4:s/12.92;let a=e*.4124+r*.3576+s*.1805,n=e*.2126+r*.7152+s*.0722,c=e*.0193+r*.1192+s*.9505;return[a*100,n*100,c*100]};hr.rgb.lab=function(t){let e=hr.rgb.xyz(t),r=e[0],s=e[1],a=e[2];r/=95.047,s/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*s-16,c=500*(r-s),f=200*(s-a);return[n,c,f]};hr.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100,a,n,c;if(r===0)return c=s*255,[c,c,c];s<.5?a=s*(1+r):a=s+r-s*r;let f=2*s-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?c=f+(a-f)*6*n:2*n<1?c=a:3*n<2?c=f+(a-f)*(2/3-n)*6:c=f,p[h]=c*255;return p};hr.hsl.hsv=function(t){let e=t[0],r=t[1]/100,s=t[2]/100,a=r,n=Math.max(s,.01);s*=2,r*=s<=1?s:2-s,a*=n<=1?n:2-n;let c=(s+r)/2,f=s===0?2*a/(n+a):2*r/(s+r);return[e,f*100,c*100]};hr.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,s=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),c=255*s*(1-r),f=255*s*(1-r*n),p=255*s*(1-r*(1-n));switch(s*=255,a){case 0:return[s,p,c];case 1:return[f,s,c];case 2:return[c,s,p];case 3:return[c,f,s];case 4:return[p,c,s];case 5:return[s,c,f]}};hr.hsv.hsl=function(t){let e=t[0],r=t[1]/100,s=t[2]/100,a=Math.max(s,.01),n,c;c=(2-r)*s;let f=(2-r)*a;return n=r*a,n/=f<=1?f:2-f,n=n||0,c/=2,[e,n*100,c*100]};hr.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100,a=r+s,n;a>1&&(r/=a,s/=a);let c=Math.floor(6*e),f=1-s;n=6*e-c,c&1&&(n=1-n);let p=r+n*(f-r),h,E,C;switch(c){default:case 6:case 0:h=f,E=p,C=r;break;case 1:h=p,E=f,C=r;break;case 2:h=r,E=f,C=p;break;case 3:h=r,E=p,C=f;break;case 4:h=p,E=r,C=f;break;case 5:h=f,E=r,C=p;break}return[h*255,E*255,C*255]};hr.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,s=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),c=1-Math.min(1,r*(1-a)+a),f=1-Math.min(1,s*(1-a)+a);return[n*255,c*255,f*255]};hr.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,s=t[2]/100,a,n,c;return a=e*3.2406+r*-1.5372+s*-.4986,n=e*-.9689+r*1.8758+s*.0415,c=e*.0557+r*-.204+s*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,c=c>.0031308?1.055*c**(1/2.4)-.055:c*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),c=Math.min(Math.max(0,c),1),[a*255,n*255,c*255]};hr.xyz.lab=function(t){let e=t[0],r=t[1],s=t[2];e/=95.047,r/=100,s/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,s=s>.008856?s**(1/3):7.787*s+16/116;let a=116*r-16,n=500*(e-r),c=200*(r-s);return[a,n,c]};hr.lab.xyz=function(t){let e=t[0],r=t[1],s=t[2],a,n,c;n=(e+16)/116,a=r/500+n,c=n-s/200;let f=n**3,p=a**3,h=c**3;return n=f>.008856?f:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,c=h>.008856?h:(c-16/116)/7.787,a*=95.047,n*=100,c*=108.883,[a,n,c]};hr.lab.lch=function(t){let e=t[0],r=t[1],s=t[2],a;a=Math.atan2(s,r)*360/2/Math.PI,a<0&&(a+=360);let c=Math.sqrt(r*r+s*s);return[e,c,a]};hr.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),c=r*Math.sin(a);return[e,n,c]};hr.rgb.ansi16=function(t,e=null){let[r,s,a]=t,n=e===null?hr.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let c=30+(Math.round(a/255)<<2|Math.round(s/255)<<1|Math.round(r/255));return n===2&&(c+=60),c};hr.hsv.ansi16=function(t){return hr.rgb.ansi16(hr.hsv.rgb(t),t[2])};hr.rgb.ansi256=function(t){let e=t[0],r=t[1],s=t[2];return e===r&&r===s?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(s/255*5)};hr.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,s=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[s,a,n]};hr.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,s=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,s,a]};hr.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};hr.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(f=>f+f).join(""));let s=parseInt(r,16),a=s>>16&255,n=s>>8&255,c=s&255;return[a,n,c]};hr.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,s=t[2]/255,a=Math.max(Math.max(e,r),s),n=Math.min(Math.min(e,r),s),c=a-n,f,p;return c<1?f=n/(1-c):f=0,c<=0?p=0:a===e?p=(r-s)/c%6:a===r?p=2+(s-e)/c:p=4+(e-r)/c,p/=6,p%=1,[p*360,c*100,f*100]};hr.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,s=r<.5?2*e*r:2*e*(1-r),a=0;return s<1&&(a=(r-.5*s)/(1-s)),[t[0],s*100,a*100]};hr.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,s=e*r,a=0;return s<1&&(a=(r-s)/(1-s)),[t[0],s*100,a*100]};hr.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,s=t[2]/100;if(r===0)return[s*255,s*255,s*255];let a=[0,0,0],n=e%1*6,c=n%1,f=1-c,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=c,a[2]=0;break;case 1:a[0]=f,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=c;break;case 3:a[0]=0,a[1]=f,a[2]=1;break;case 4:a[0]=c,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=f}return p=(1-r)*s,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};hr.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,s=e+r*(1-e),a=0;return s>0&&(a=e/s),[t[0],a*100,s*100]};hr.hcg.hsl=function(t){let e=t[1]/100,s=t[2]/100*(1-e)+.5*e,a=0;return s>0&&s<.5?a=e/(2*s):s>=.5&&s<1&&(a=e/(2*(1-s))),[t[0],a*100,s*100]};hr.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,s=e+r*(1-e);return[t[0],(s-e)*100,(1-s)*100]};hr.hwb.hcg=function(t){let e=t[1]/100,s=1-t[2]/100,a=s-e,n=0;return a<1&&(n=(s-a)/(1-a)),[t[0],a*100,n*100]};hr.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};hr.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};hr.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};hr.gray.hsl=function(t){return[0,0,t[0]]};hr.gray.hsv=hr.gray.hsl;hr.gray.hwb=function(t){return[0,100,t[0]]};hr.gray.cmyk=function(t){return[0,0,0,t[0]]};hr.gray.lab=function(t){return[t[0],0,0]};hr.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,s=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(s.length)+s};hr.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var wse=_((UTt,Cse)=>{var nk=J_();function HJe(){let t={},e=Object.keys(nk);for(let r=e.length,s=0;s{var K_=J_(),WJe=wse(),bE={},YJe=Object.keys(K_);function VJe(t){let e=function(...r){let s=r[0];return s==null?s:(s.length>1&&(r=s),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function JJe(t){let e=function(...r){let s=r[0];if(s==null)return s;s.length>1&&(r=s);let a=t(r);if(typeof a=="object")for(let n=a.length,c=0;c{bE[t]={},Object.defineProperty(bE[t],"channels",{value:K_[t].channels}),Object.defineProperty(bE[t],"labels",{value:K_[t].labels});let e=WJe(t);Object.keys(e).forEach(s=>{let a=e[s];bE[t][s]=JJe(a),bE[t][s].raw=VJe(a)})});Bse.exports=bE});var sk=_((HTt,xse)=>{"use strict";var Sse=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,Dse=(t,e)=>(...r)=>{let s=t(...r);return`\x1B[${38+e};5;${s}m`},Pse=(t,e)=>(...r)=>{let s=t(...r);return`\x1B[${38+e};2;${s[0]};${s[1]};${s[2]}m`},ik=t=>t,bse=(t,e,r)=>[t,e,r],xE=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let s=r();return Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0}),s},enumerable:!0,configurable:!0})},z_,kE=(t,e,r,s)=>{z_===void 0&&(z_=vse());let a=s?10:0,n={};for(let[c,f]of Object.entries(z_)){let p=c==="ansi16"?"ansi":c;c===e?n[p]=t(r,a):typeof f=="object"&&(n[p]=t(f[e],a))}return n};function KJe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,s]of Object.entries(e)){for(let[a,n]of Object.entries(s))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},s[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:s,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",xE(e.color,"ansi",()=>kE(Sse,"ansi16",ik,!1)),xE(e.color,"ansi256",()=>kE(Dse,"ansi256",ik,!1)),xE(e.color,"ansi16m",()=>kE(Pse,"rgb",bse,!1)),xE(e.bgColor,"ansi",()=>kE(Sse,"ansi16",ik,!0)),xE(e.bgColor,"ansi256",()=>kE(Dse,"ansi256",ik,!0)),xE(e.bgColor,"ansi16m",()=>kE(Pse,"rgb",bse,!0)),e}Object.defineProperty(xse,"exports",{enumerable:!0,get:KJe})});var Qse=_((jTt,kse)=>{"use strict";kse.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",s=e.indexOf(r+t),a=e.indexOf("--");return s!==-1&&(a===-1||s{"use strict";var zJe=Ie("os"),Rse=Ie("tty"),Sc=Qse(),{env:Ps}=process,l0;Sc("no-color")||Sc("no-colors")||Sc("color=false")||Sc("color=never")?l0=0:(Sc("color")||Sc("colors")||Sc("color=true")||Sc("color=always"))&&(l0=1);"FORCE_COLOR"in Ps&&(Ps.FORCE_COLOR==="true"?l0=1:Ps.FORCE_COLOR==="false"?l0=0:l0=Ps.FORCE_COLOR.length===0?1:Math.min(parseInt(Ps.FORCE_COLOR,10),3));function Z_(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function X_(t,e){if(l0===0)return 0;if(Sc("color=16m")||Sc("color=full")||Sc("color=truecolor"))return 3;if(Sc("color=256"))return 2;if(t&&!e&&l0===void 0)return 0;let r=l0||0;if(Ps.TERM==="dumb")return r;if(process.platform==="win32"){let s=zJe.release().split(".");return Number(s[0])>=10&&Number(s[2])>=10586?Number(s[2])>=14931?3:2:1}if("CI"in Ps)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(s=>s in Ps)||Ps.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Ps)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Ps.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Ps)return 1;if(Ps.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Ps){let s=parseInt((Ps.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Ps.TERM_PROGRAM){case"iTerm.app":return s>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Ps.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Ps.TERM)||"COLORTERM"in Ps?1:r}function ZJe(t){let e=X_(t,t&&t.isTTY);return Z_(e)}Tse.exports={supportsColor:ZJe,stdout:Z_(X_(!0,Rse.isatty(1))),stderr:Z_(X_(!0,Rse.isatty(2)))}});var Ose=_((qTt,Nse)=>{"use strict";var XJe=(t,e,r)=>{let s=t.indexOf(e);if(s===-1)return t;let a=e.length,n=0,c="";do c+=t.substr(n,s-n)+e+r,n=s+a,s=t.indexOf(e,n);while(s!==-1);return c+=t.substr(n),c},$Je=(t,e,r,s)=>{let a=0,n="";do{let c=t[s-1]==="\r";n+=t.substr(a,(c?s-1:s)-a)+e+(c?`\r `:` `)+r,a=s+1,s=t.indexOf(` `,a)}while(s!==-1);return n+=t.substr(a),n};Nse.exports={stringReplaceAll:XJe,stringEncaseCRLFWithFirstIndex:$Je}});var Hse=_((WTt,_se)=>{"use strict";var eKe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,Lse=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,tKe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,rKe=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,nKe=new Map([["n",` `],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function Use(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):nKe.get(t)||t}function iKe(t,e){let r=[],s=e.trim().split(/\s*,\s*/g),a;for(let n of s){let c=Number(n);if(!Number.isNaN(c))r.push(c);else if(a=n.match(tKe))r.push(a[2].replace(rKe,(f,p,h)=>p?Use(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function sKe(t){Lse.lastIndex=0;let e=[],r;for(;(r=Lse.exec(t))!==null;){let s=r[1];if(r[2]){let a=iKe(s,r[2]);e.push([s].concat(a))}else e.push([s])}return e}function Mse(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let s=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in s))throw new Error(`Unknown Chalk style: ${a}`);s=n.length>0?s[a](...n):s[a]}return s}_se.exports=(t,e)=>{let r=[],s=[],a=[];if(e.replace(eKe,(n,c,f,p,h,E)=>{if(c)a.push(Use(c));else if(p){let C=a.join("");a=[],s.push(r.length===0?C:Mse(t,r)(C)),r.push({inverse:f,styles:sKe(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");s.push(Mse(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),s.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return s.join("")}});var RE=_((YTt,Vse)=>{"use strict";var mB=sk(),{stdout:e4,stderr:t4}=Fse(),{stringReplaceAll:oKe,stringEncaseCRLFWithFirstIndex:aKe}=Ose(),{isArray:ok}=Array,Gse=["ansi","ansi","ansi256","ansi16m"],QE=Object.create(null),lKe=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=e4?e4.level:0;t.level=e.level===void 0?r:e.level},r4=class{constructor(e){return qse(e)}},qse=t=>{let e={};return lKe(e,t),e.template=(...r)=>Yse(e.template,...r),Object.setPrototypeOf(e,ak.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=r4,e.template};function ak(t){return qse(t)}for(let[t,e]of Object.entries(mB))QE[t]={get(){let r=lk(this,n4(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};QE.visible={get(){let t=lk(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var Wse=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of Wse)QE[t]={get(){let{level:e}=this;return function(...r){let s=n4(mB.color[Gse[e]][t](...r),mB.color.close,this._styler);return lk(this,s,this._isEmpty)}}};for(let t of Wse){let e="bg"+t[0].toUpperCase()+t.slice(1);QE[e]={get(){let{level:r}=this;return function(...s){let a=n4(mB.bgColor[Gse[r]][t](...s),mB.bgColor.close,this._styler);return lk(this,a,this._isEmpty)}}}}var cKe=Object.defineProperties(()=>{},{...QE,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),n4=(t,e,r)=>{let s,a;return r===void 0?(s=t,a=e):(s=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:s,closeAll:a,parent:r}},lk=(t,e,r)=>{let s=(...a)=>ok(a[0])&&ok(a[0].raw)?jse(s,Yse(s,...a)):jse(s,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(s,cKe),s._generator=t,s._styler=e,s._isEmpty=r,s},jse=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:s,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=oKe(e,r.close,r.open),r=r.parent;let n=e.indexOf(` `);return n!==-1&&(e=aKe(e,a,s,n)),s+e+a},$_,Yse=(t,...e)=>{let[r]=e;if(!ok(r)||!ok(r.raw))return e.join(" ");let s=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";Dc.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Dc.find=(t,e)=>t.nodes.find(r=>r.type===e);Dc.exceedsLimit=(t,e,r=1,s)=>s===!1||!Dc.isInteger(t)||!Dc.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=s;Dc.escapeNode=(t,e=0,r)=>{let s=t.nodes[e];s&&(r&&s.type===r||s.type==="open"||s.type==="close")&&s.escaped!==!0&&(s.value="\\"+s.value,s.escaped=!0)};Dc.encloseBrace=t=>t.type!=="brace"||t.commas>>0+t.ranges>>0?!1:(t.invalid=!0,!0);Dc.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:!(t.commas>>0+t.ranges>>0)||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Dc.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Dc.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Dc.flatten=(...t)=>{let e=[],r=s=>{for(let a=0;a{"use strict";var Jse=uk();Kse.exports=(t,e={})=>{let r=(s,a={})=>{let n=e.escapeInvalid&&Jse.isInvalidBrace(a),c=s.invalid===!0&&e.escapeInvalid===!0,f="";if(s.value)return(n||c)&&Jse.isOpenOrClose(s)?"\\"+s.value:s.value;if(s.value)return s.value;if(s.nodes)for(let p of s.nodes)f+=r(p);return f};return r(t)}});var Zse=_((KTt,zse)=>{"use strict";zse.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var ooe=_((zTt,soe)=>{"use strict";var Xse=Zse(),Gd=(t,e,r)=>{if(Xse(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(Xse(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let s={relaxZeros:!0,...r};typeof s.strictZeros=="boolean"&&(s.relaxZeros=s.strictZeros===!1);let a=String(s.relaxZeros),n=String(s.shorthand),c=String(s.capture),f=String(s.wrap),p=t+":"+e+"="+a+n+c+f;if(Gd.cache.hasOwnProperty(p))return Gd.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let T=t+"|"+e;return s.capture?`(${T})`:s.wrap===!1?T:`(?:${T})`}let C=ioe(t)||ioe(e),S={min:t,max:e,a:h,b:E},b=[],I=[];if(C&&(S.isPadded=C,S.maxLen=String(S.max).length),h<0){let T=E<0?Math.abs(E):1;I=$se(T,Math.abs(h),S,s),h=S.a=0}return E>=0&&(b=$se(h,E,S,s)),S.negatives=I,S.positives=b,S.result=uKe(I,b,s),s.capture===!0?S.result=`(${S.result})`:s.wrap!==!1&&b.length+I.length>1&&(S.result=`(?:${S.result})`),Gd.cache[p]=S,S.result};function uKe(t,e,r){let s=i4(t,e,"-",!1,r)||[],a=i4(e,t,"",!1,r)||[],n=i4(t,e,"-?",!0,r)||[];return s.concat(n).concat(a).join("|")}function fKe(t,e){let r=1,s=1,a=toe(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=toe(t,r);for(a=roe(e+1,s)-1;t1&&f.count.pop(),f.count.push(E.count[0]),f.string=f.pattern+noe(f.count),c=h+1;continue}r.isPadded&&(C=dKe(h,r,s)),E.string=C+E.pattern+noe(E.count),n.push(E),c=h+1,f=E}return n}function i4(t,e,r,s,a){let n=[];for(let c of t){let{string:f}=c;!s&&!eoe(e,"string",f)&&n.push(r+f),s&&eoe(e,"string",f)&&n.push(r+f)}return n}function pKe(t,e){let r=[];for(let s=0;se?1:e>t?-1:0}function eoe(t,e,r){return t.some(s=>s[e]===r)}function toe(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function roe(t,e){return t-t%Math.pow(10,e)}function noe(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function gKe(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function ioe(t){return/^-?(0+)\d/.test(t)}function dKe(t,e,r){if(!e.isPadded)return t;let s=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(s){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${s}}`:`0{${s}}`}}Gd.cache={};Gd.clearCache=()=>Gd.cache={};soe.exports=Gd});var a4=_((ZTt,hoe)=>{"use strict";var mKe=Ie("util"),coe=ooe(),aoe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),yKe=t=>e=>t===!0?Number(e):String(e),s4=t=>typeof t=="number"||typeof t=="string"&&t!=="",yB=t=>Number.isInteger(+t),o4=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},EKe=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,IKe=(t,e,r)=>{if(e>0){let s=t[0]==="-"?"-":"";s&&(t=t.slice(1)),t=s+t.padStart(s?e-1:e,"0")}return r===!1?String(t):t},loe=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((c,f)=>cf?1:0),t.positives.sort((c,f)=>cf?1:0);let r=e.capture?"":"?:",s="",a="",n;return t.positives.length&&(s=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),s&&a?n=`${s}|${a}`:n=s||a,e.wrap?`(${r}${n})`:n},uoe=(t,e,r,s)=>{if(r)return coe(t,e,{wrap:!1,...s});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},foe=(t,e,r)=>{if(Array.isArray(t)){let s=r.wrap===!0,a=r.capture?"":"?:";return s?`(${a}${t.join("|")})`:t.join("|")}return coe(t,e,r)},Aoe=(...t)=>new RangeError("Invalid range arguments: "+mKe.inspect(...t)),poe=(t,e,r)=>{if(r.strictRanges===!0)throw Aoe([t,e]);return[]},wKe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},BKe=(t,e,r=1,s={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(s.strictRanges===!0)throw Aoe([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let c=a>n,f=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=o4(f)||o4(p)||o4(h),C=E?Math.max(f.length,p.length,h.length):0,S=E===!1&&EKe(t,e,s)===!1,b=s.transform||yKe(S);if(s.toRegex&&r===1)return uoe(loe(t,C),loe(e,C),!0,s);let I={negatives:[],positives:[]},T=W=>I[W<0?"negatives":"positives"].push(Math.abs(W)),N=[],U=0;for(;c?a>=n:a<=n;)s.toRegex===!0&&r>1?T(a):N.push(IKe(b(a,U),C,S)),a=c?a-r:a+r,U++;return s.toRegex===!0?r>1?CKe(I,s):foe(N,null,{wrap:!1,...s}):N},vKe=(t,e,r=1,s={})=>{if(!yB(t)&&t.length>1||!yB(e)&&e.length>1)return poe(t,e,s);let a=s.transform||(S=>String.fromCharCode(S)),n=`${t}`.charCodeAt(0),c=`${e}`.charCodeAt(0),f=n>c,p=Math.min(n,c),h=Math.max(n,c);if(s.toRegex&&r===1)return uoe(p,h,!1,s);let E=[],C=0;for(;f?n>=c:n<=c;)E.push(a(n,C)),n=f?n-r:n+r,C++;return s.toRegex===!0?foe(E,null,{wrap:!1,options:s}):E},Ak=(t,e,r,s={})=>{if(e==null&&s4(t))return[t];if(!s4(t)||!s4(e))return poe(t,e,s);if(typeof r=="function")return Ak(t,e,1,{transform:r});if(aoe(r))return Ak(t,e,0,r);let a={...s};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,yB(r)?yB(t)&&yB(e)?BKe(t,e,r,a):vKe(t,e,Math.max(Math.abs(r),1),a):r!=null&&!aoe(r)?wKe(r,a):Ak(t,e,1,r)};hoe.exports=Ak});var moe=_((XTt,doe)=>{"use strict";var SKe=a4(),goe=uk(),DKe=(t,e={})=>{let r=(s,a={})=>{let n=goe.isInvalidBrace(a),c=s.invalid===!0&&e.escapeInvalid===!0,f=n===!0||c===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(s.isOpen===!0||s.isClose===!0)return p+s.value;if(s.type==="open")return f?p+s.value:"(";if(s.type==="close")return f?p+s.value:")";if(s.type==="comma")return s.prev.type==="comma"?"":f?s.value:"|";if(s.value)return s.value;if(s.nodes&&s.ranges>0){let E=goe.reduce(s.nodes),C=SKe(...E,{...e,wrap:!1,toRegex:!0});if(C.length!==0)return E.length>1&&C.length>1?`(${C})`:C}if(s.nodes)for(let E of s.nodes)h+=r(E,s);return h};return r(t)};doe.exports=DKe});var Ioe=_(($Tt,Eoe)=>{"use strict";var PKe=a4(),yoe=fk(),TE=uk(),qd=(t="",e="",r=!1)=>{let s=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?TE.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)s.push(qd(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),s.push(Array.isArray(n)?qd(a,n,r):a+n);return TE.flatten(s)},bKe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,s=(a,n={})=>{a.queue=[];let c=n,f=n.queue;for(;c.type!=="brace"&&c.type!=="root"&&c.parent;)c=c.parent,f=c.queue;if(a.invalid||a.dollar){f.push(qd(f.pop(),yoe(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){f.push(qd(f.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let C=TE.reduce(a.nodes);if(TE.exceedsLimit(...C,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let S=PKe(...C,e);S.length===0&&(S=yoe(a,e)),f.push(qd(f.pop(),S)),a.nodes=[];return}let p=TE.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let C=0;C{"use strict";Coe.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` `,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var Poe=_((tFt,Doe)=>{"use strict";var xKe=fk(),{MAX_LENGTH:Boe,CHAR_BACKSLASH:l4,CHAR_BACKTICK:kKe,CHAR_COMMA:QKe,CHAR_DOT:RKe,CHAR_LEFT_PARENTHESES:TKe,CHAR_RIGHT_PARENTHESES:FKe,CHAR_LEFT_CURLY_BRACE:NKe,CHAR_RIGHT_CURLY_BRACE:OKe,CHAR_LEFT_SQUARE_BRACKET:voe,CHAR_RIGHT_SQUARE_BRACKET:Soe,CHAR_DOUBLE_QUOTE:LKe,CHAR_SINGLE_QUOTE:MKe,CHAR_NO_BREAK_SPACE:UKe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:_Ke}=woe(),HKe=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},s=typeof r.maxLength=="number"?Math.min(Boe,r.maxLength):Boe;if(t.length>s)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${s})`);let a={type:"root",input:t,nodes:[]},n=[a],c=a,f=a,p=0,h=t.length,E=0,C=0,S,b={},I=()=>t[E++],T=N=>{if(N.type==="text"&&f.type==="dot"&&(f.type="text"),f&&f.type==="text"&&N.type==="text"){f.value+=N.value;return}return c.nodes.push(N),N.parent=c,N.prev=f,f=N,N};for(T({type:"bos"});E0){if(c.ranges>0){c.ranges=0;let N=c.nodes.shift();c.nodes=[N,{type:"text",value:xKe(c)}]}T({type:"comma",value:S}),c.commas++;continue}if(S===RKe&&C>0&&c.commas===0){let N=c.nodes;if(C===0||N.length===0){T({type:"text",value:S});continue}if(f.type==="dot"){if(c.range=[],f.value+=S,f.type="range",c.nodes.length!==3&&c.nodes.length!==5){c.invalid=!0,c.ranges=0,f.type="text";continue}c.ranges++,c.args=[];continue}if(f.type==="range"){N.pop();let U=N[N.length-1];U.value+=f.value+S,f=U,c.ranges--;continue}T({type:"dot",value:S});continue}T({type:"text",value:S})}do if(c=n.pop(),c.type!=="root"){c.nodes.forEach(W=>{W.nodes||(W.type==="open"&&(W.isOpen=!0),W.type==="close"&&(W.isClose=!0),W.nodes||(W.type="text"),W.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(c);N.nodes.splice(U,1,...c.nodes)}while(n.length>0);return T({type:"eos"}),a};Doe.exports=HKe});var koe=_((rFt,xoe)=>{"use strict";var boe=fk(),jKe=moe(),GKe=Ioe(),qKe=Poe(),jl=(t,e={})=>{let r=[];if(Array.isArray(t))for(let s of t){let a=jl.create(s,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(jl.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};jl.parse=(t,e={})=>qKe(t,e);jl.stringify=(t,e={})=>boe(typeof t=="string"?jl.parse(t,e):t,e);jl.compile=(t,e={})=>(typeof t=="string"&&(t=jl.parse(t,e)),jKe(t,e));jl.expand=(t,e={})=>{typeof t=="string"&&(t=jl.parse(t,e));let r=GKe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};jl.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?jl.compile(t,e):jl.expand(t,e);xoe.exports=jl});var EB=_((nFt,Noe)=>{"use strict";var WKe=Ie("path"),Vf="\\\\/",Qoe=`[^${Vf}]`,Dp="\\.",YKe="\\+",VKe="\\?",pk="\\/",JKe="(?=.)",Roe="[^/]",c4=`(?:${pk}|$)`,Toe=`(?:^|${pk})`,u4=`${Dp}{1,2}${c4}`,KKe=`(?!${Dp})`,zKe=`(?!${Toe}${u4})`,ZKe=`(?!${Dp}{0,1}${c4})`,XKe=`(?!${u4})`,$Ke=`[^.${pk}]`,eze=`${Roe}*?`,Foe={DOT_LITERAL:Dp,PLUS_LITERAL:YKe,QMARK_LITERAL:VKe,SLASH_LITERAL:pk,ONE_CHAR:JKe,QMARK:Roe,END_ANCHOR:c4,DOTS_SLASH:u4,NO_DOT:KKe,NO_DOTS:zKe,NO_DOT_SLASH:ZKe,NO_DOTS_SLASH:XKe,QMARK_NO_DOT:$Ke,STAR:eze,START_ANCHOR:Toe},tze={...Foe,SLASH_LITERAL:`[${Vf}]`,QMARK:Qoe,STAR:`${Qoe}*?`,DOTS_SLASH:`${Dp}{1,2}(?:[${Vf}]|$)`,NO_DOT:`(?!${Dp})`,NO_DOTS:`(?!(?:^|[${Vf}])${Dp}{1,2}(?:[${Vf}]|$))`,NO_DOT_SLASH:`(?!${Dp}{0,1}(?:[${Vf}]|$))`,NO_DOTS_SLASH:`(?!${Dp}{1,2}(?:[${Vf}]|$))`,QMARK_NO_DOT:`[^.${Vf}]`,START_ANCHOR:`(?:^|[${Vf}])`,END_ANCHOR:`(?:[${Vf}]|$)`},rze={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};Noe.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:rze,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:WKe.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?tze:Foe}}});var IB=_(ol=>{"use strict";var nze=Ie("path"),ize=process.platform==="win32",{REGEX_BACKSLASH:sze,REGEX_REMOVE_BACKSLASH:oze,REGEX_SPECIAL_CHARS:aze,REGEX_SPECIAL_CHARS_GLOBAL:lze}=EB();ol.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);ol.hasRegexChars=t=>aze.test(t);ol.isRegexChar=t=>t.length===1&&ol.hasRegexChars(t);ol.escapeRegex=t=>t.replace(lze,"\\$1");ol.toPosixSlashes=t=>t.replace(sze,"/");ol.removeBackslashes=t=>t.replace(oze,e=>e==="\\"?"":e);ol.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};ol.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:ize===!0||nze.sep==="\\";ol.escapeLast=(t,e,r)=>{let s=t.lastIndexOf(e,r);return s===-1?t:t[s-1]==="\\"?ol.escapeLast(t,e,s-1):`${t.slice(0,s)}\\${t.slice(s)}`};ol.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};ol.wrapOutput=(t,e={},r={})=>{let s=r.contains?"":"^",a=r.contains?"":"$",n=`${s}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var Goe=_((sFt,joe)=>{"use strict";var Ooe=IB(),{CHAR_ASTERISK:f4,CHAR_AT:cze,CHAR_BACKWARD_SLASH:CB,CHAR_COMMA:uze,CHAR_DOT:A4,CHAR_EXCLAMATION_MARK:p4,CHAR_FORWARD_SLASH:Hoe,CHAR_LEFT_CURLY_BRACE:h4,CHAR_LEFT_PARENTHESES:g4,CHAR_LEFT_SQUARE_BRACKET:fze,CHAR_PLUS:Aze,CHAR_QUESTION_MARK:Loe,CHAR_RIGHT_CURLY_BRACE:pze,CHAR_RIGHT_PARENTHESES:Moe,CHAR_RIGHT_SQUARE_BRACKET:hze}=EB(),Uoe=t=>t===Hoe||t===CB,_oe=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},gze=(t,e)=>{let r=e||{},s=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],c=[],f=[],p=t,h=-1,E=0,C=0,S=!1,b=!1,I=!1,T=!1,N=!1,U=!1,W=!1,ee=!1,ie=!1,ue=!1,le=0,me,pe,Be={value:"",depth:0,isGlob:!1},Ce=()=>h>=s,g=()=>p.charCodeAt(h+1),we=()=>(me=pe,p.charCodeAt(++h));for(;h0&&(Ae=p.slice(0,E),p=p.slice(E),C-=E),ye&&I===!0&&C>0?(ye=p.slice(0,C),se=p.slice(C)):I===!0?(ye="",se=p):ye=p,ye&&ye!==""&&ye!=="/"&&ye!==p&&Uoe(ye.charCodeAt(ye.length-1))&&(ye=ye.slice(0,-1)),r.unescape===!0&&(se&&(se=Ooe.removeBackslashes(se)),ye&&W===!0&&(ye=Ooe.removeBackslashes(ye)));let X={prefix:Ae,input:t,start:E,base:ye,glob:se,isBrace:S,isBracket:b,isGlob:I,isExtglob:T,isGlobstar:N,negated:ee,negatedExtglob:ie};if(r.tokens===!0&&(X.maxDepth=0,Uoe(pe)||c.push(Be),X.tokens=c),r.parts===!0||r.tokens===!0){let De;for(let Te=0;Te{"use strict";var hk=EB(),Gl=IB(),{MAX_LENGTH:gk,POSIX_REGEX_SOURCE:dze,REGEX_NON_SPECIAL_CHARS:mze,REGEX_SPECIAL_CHARS_BACKREF:yze,REPLACEMENTS:qoe}=hk,Eze=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>Gl.escapeRegex(a)).join("..")}return r},FE=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,d4=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=qoe[t]||t;let r={...e},s=typeof r.maxLength=="number"?Math.min(gk,r.maxLength):gk,a=t.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);let n={type:"bos",value:"",output:r.prepend||""},c=[n],f=r.capture?"":"?:",p=Gl.isWindows(e),h=hk.globChars(p),E=hk.extglobChars(h),{DOT_LITERAL:C,PLUS_LITERAL:S,SLASH_LITERAL:b,ONE_CHAR:I,DOTS_SLASH:T,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:W,QMARK:ee,QMARK_NO_DOT:ie,STAR:ue,START_ANCHOR:le}=h,me=x=>`(${f}(?:(?!${le}${x.dot?T:C}).)*?)`,pe=r.dot?"":N,Be=r.dot?ee:ie,Ce=r.bash===!0?me(r):ue;r.capture&&(Ce=`(${Ce})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:c};t=Gl.removePrefix(t,g),a=t.length;let we=[],ye=[],Ae=[],se=n,X,De=()=>g.index===a-1,Te=g.peek=(x=1)=>t[g.index+x],mt=g.advance=()=>t[++g.index]||"",j=()=>t.slice(g.index+1),rt=(x="",w=0)=>{g.consumed+=x,g.index+=w},Fe=x=>{g.output+=x.output!=null?x.output:x.value,rt(x.value)},Ne=()=>{let x=1;for(;Te()==="!"&&(Te(2)!=="("||Te(3)==="?");)mt(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},be=x=>{g[x]++,Ae.push(x)},Ve=x=>{g[x]--,Ae.pop()},ke=x=>{if(se.type==="globstar"){let w=g.braces>0&&(x.type==="comma"||x.type==="brace"),P=x.extglob===!0||we.length&&(x.type==="pipe"||x.type==="paren");x.type!=="slash"&&x.type!=="paren"&&!w&&!P&&(g.output=g.output.slice(0,-se.output.length),se.type="star",se.value="*",se.output=Ce,g.output+=se.output)}if(we.length&&x.type!=="paren"&&(we[we.length-1].inner+=x.value),(x.value||x.output)&&Fe(x),se&&se.type==="text"&&x.type==="text"){se.value+=x.value,se.output=(se.output||"")+x.value;return}x.prev=se,c.push(x),se=x},it=(x,w)=>{let P={...E[w],conditions:1,inner:""};P.prev=se,P.parens=g.parens,P.output=g.output;let y=(r.capture?"(":"")+P.open;be("parens"),ke({type:x,value:w,output:g.output?"":I}),ke({type:"paren",extglob:!0,value:mt(),output:y}),we.push(P)},Ue=x=>{let w=x.close+(r.capture?")":""),P;if(x.type==="negate"){let y=Ce;if(x.inner&&x.inner.length>1&&x.inner.includes("/")&&(y=me(r)),(y!==Ce||De()||/^\)+$/.test(j()))&&(w=x.close=`)$))${y}`),x.inner.includes("*")&&(P=j())&&/^\.[^\\/.]+$/.test(P)){let F=d4(P,{...e,fastpaths:!1}).output;w=x.close=`)${F})${y})`}x.prev.type==="bos"&&(g.negatedExtglob=!0)}ke({type:"paren",extglob:!0,value:X,output:w}),Ve("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let x=!1,w=t.replace(yze,(P,y,F,z,Z,$)=>z==="\\"?(x=!0,P):z==="?"?y?y+z+(Z?ee.repeat(Z.length):""):$===0?Be+(Z?ee.repeat(Z.length):""):ee.repeat(F.length):z==="."?C.repeat(F.length):z==="*"?y?y+z+(Z?Ce:""):Ce:y?P:`\\${P}`);return x===!0&&(r.unescape===!0?w=w.replace(/\\/g,""):w=w.replace(/\\+/g,P=>P.length%2===0?"\\\\":P?"\\":"")),w===t&&r.contains===!0?(g.output=t,g):(g.output=Gl.wrapOutput(w,g,e),g)}for(;!De();){if(X=mt(),X==="\0")continue;if(X==="\\"){let P=Te();if(P==="/"&&r.bash!==!0||P==="."||P===";")continue;if(!P){X+="\\",ke({type:"text",value:X});continue}let y=/^\\+/.exec(j()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(X+="\\")),r.unescape===!0?X=mt():X+=mt(),g.brackets===0){ke({type:"text",value:X});continue}}if(g.brackets>0&&(X!=="]"||se.value==="["||se.value==="[^")){if(r.posix!==!1&&X===":"){let P=se.value.slice(1);if(P.includes("[")&&(se.posix=!0,P.includes(":"))){let y=se.value.lastIndexOf("["),F=se.value.slice(0,y),z=se.value.slice(y+2),Z=dze[z];if(Z){se.value=F+Z,g.backtrack=!0,mt(),!n.output&&c.indexOf(se)===1&&(n.output=I);continue}}}(X==="["&&Te()!==":"||X==="-"&&Te()==="]")&&(X=`\\${X}`),X==="]"&&(se.value==="["||se.value==="[^")&&(X=`\\${X}`),r.posix===!0&&X==="!"&&se.value==="["&&(X="^"),se.value+=X,Fe({value:X});continue}if(g.quotes===1&&X!=='"'){X=Gl.escapeRegex(X),se.value+=X,Fe({value:X});continue}if(X==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&ke({type:"text",value:X});continue}if(X==="("){be("parens"),ke({type:"paren",value:X});continue}if(X===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(FE("opening","("));let P=we[we.length-1];if(P&&g.parens===P.parens+1){Ue(we.pop());continue}ke({type:"paren",value:X,output:g.parens?")":"\\)"}),Ve("parens");continue}if(X==="["){if(r.nobracket===!0||!j().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(FE("closing","]"));X=`\\${X}`}else be("brackets");ke({type:"bracket",value:X});continue}if(X==="]"){if(r.nobracket===!0||se&&se.type==="bracket"&&se.value.length===1){ke({type:"text",value:X,output:`\\${X}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(FE("opening","["));ke({type:"text",value:X,output:`\\${X}`});continue}Ve("brackets");let P=se.value.slice(1);if(se.posix!==!0&&P[0]==="^"&&!P.includes("/")&&(X=`/${X}`),se.value+=X,Fe({value:X}),r.literalBrackets===!1||Gl.hasRegexChars(P))continue;let y=Gl.escapeRegex(se.value);if(g.output=g.output.slice(0,-se.value.length),r.literalBrackets===!0){g.output+=y,se.value=y;continue}se.value=`(${f}${y}|${se.value})`,g.output+=se.value;continue}if(X==="{"&&r.nobrace!==!0){be("braces");let P={type:"brace",value:X,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};ye.push(P),ke(P);continue}if(X==="}"){let P=ye[ye.length-1];if(r.nobrace===!0||!P){ke({type:"text",value:X,output:X});continue}let y=")";if(P.dots===!0){let F=c.slice(),z=[];for(let Z=F.length-1;Z>=0&&(c.pop(),F[Z].type!=="brace");Z--)F[Z].type!=="dots"&&z.unshift(F[Z].value);y=Eze(z,r),g.backtrack=!0}if(P.comma!==!0&&P.dots!==!0){let F=g.output.slice(0,P.outputIndex),z=g.tokens.slice(P.tokensIndex);P.value=P.output="\\{",X=y="\\}",g.output=F;for(let Z of z)g.output+=Z.output||Z.value}ke({type:"brace",value:X,output:y}),Ve("braces"),ye.pop();continue}if(X==="|"){we.length>0&&we[we.length-1].conditions++,ke({type:"text",value:X});continue}if(X===","){let P=X,y=ye[ye.length-1];y&&Ae[Ae.length-1]==="braces"&&(y.comma=!0,P="|"),ke({type:"comma",value:X,output:P});continue}if(X==="/"){if(se.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",c.pop(),se=n;continue}ke({type:"slash",value:X,output:b});continue}if(X==="."){if(g.braces>0&&se.type==="dot"){se.value==="."&&(se.output=C);let P=ye[ye.length-1];se.type="dots",se.output+=X,se.value+=X,P.dots=!0;continue}if(g.braces+g.parens===0&&se.type!=="bos"&&se.type!=="slash"){ke({type:"text",value:X,output:C});continue}ke({type:"dot",value:X,output:C});continue}if(X==="?"){if(!(se&&se.value==="(")&&r.noextglob!==!0&&Te()==="("&&Te(2)!=="?"){it("qmark",X);continue}if(se&&se.type==="paren"){let y=Te(),F=X;if(y==="<"&&!Gl.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(se.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(j()))&&(F=`\\${X}`),ke({type:"text",value:X,output:F});continue}if(r.dot!==!0&&(se.type==="slash"||se.type==="bos")){ke({type:"qmark",value:X,output:ie});continue}ke({type:"qmark",value:X,output:ee});continue}if(X==="!"){if(r.noextglob!==!0&&Te()==="("&&(Te(2)!=="?"||!/[!=<:]/.test(Te(3)))){it("negate",X);continue}if(r.nonegate!==!0&&g.index===0){Ne();continue}}if(X==="+"){if(r.noextglob!==!0&&Te()==="("&&Te(2)!=="?"){it("plus",X);continue}if(se&&se.value==="("||r.regex===!1){ke({type:"plus",value:X,output:S});continue}if(se&&(se.type==="bracket"||se.type==="paren"||se.type==="brace")||g.parens>0){ke({type:"plus",value:X});continue}ke({type:"plus",value:S});continue}if(X==="@"){if(r.noextglob!==!0&&Te()==="("&&Te(2)!=="?"){ke({type:"at",extglob:!0,value:X,output:""});continue}ke({type:"text",value:X});continue}if(X!=="*"){(X==="$"||X==="^")&&(X=`\\${X}`);let P=mze.exec(j());P&&(X+=P[0],g.index+=P[0].length),ke({type:"text",value:X});continue}if(se&&(se.type==="globstar"||se.star===!0)){se.type="star",se.star=!0,se.value+=X,se.output=Ce,g.backtrack=!0,g.globstar=!0,rt(X);continue}let x=j();if(r.noextglob!==!0&&/^\([^?]/.test(x)){it("star",X);continue}if(se.type==="star"){if(r.noglobstar===!0){rt(X);continue}let P=se.prev,y=P.prev,F=P.type==="slash"||P.type==="bos",z=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!F||x[0]&&x[0]!=="/")){ke({type:"star",value:X,output:""});continue}let Z=g.braces>0&&(P.type==="comma"||P.type==="brace"),$=we.length&&(P.type==="pipe"||P.type==="paren");if(!F&&P.type!=="paren"&&!Z&&!$){ke({type:"star",value:X,output:""});continue}for(;x.slice(0,3)==="/**";){let oe=t[g.index+4];if(oe&&oe!=="/")break;x=x.slice(3),rt("/**",3)}if(P.type==="bos"&&De()){se.type="globstar",se.value+=X,se.output=me(r),g.output=se.output,g.globstar=!0,rt(X);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&!z&&De()){g.output=g.output.slice(0,-(P.output+se.output).length),P.output=`(?:${P.output}`,se.type="globstar",se.output=me(r)+(r.strictSlashes?")":"|$)"),se.value+=X,g.globstar=!0,g.output+=P.output+se.output,rt(X);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&x[0]==="/"){let oe=x[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(P.output+se.output).length),P.output=`(?:${P.output}`,se.type="globstar",se.output=`${me(r)}${b}|${b}${oe})`,se.value+=X,g.output+=P.output+se.output,g.globstar=!0,rt(X+mt()),ke({type:"slash",value:"/",output:""});continue}if(P.type==="bos"&&x[0]==="/"){se.type="globstar",se.value+=X,se.output=`(?:^|${b}|${me(r)}${b})`,g.output=se.output,g.globstar=!0,rt(X+mt()),ke({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-se.output.length),se.type="globstar",se.output=me(r),se.value+=X,g.output+=se.output,g.globstar=!0,rt(X);continue}let w={type:"star",value:X,output:Ce};if(r.bash===!0){w.output=".*?",(se.type==="bos"||se.type==="slash")&&(w.output=pe+w.output),ke(w);continue}if(se&&(se.type==="bracket"||se.type==="paren")&&r.regex===!0){w.output=X,ke(w);continue}(g.index===g.start||se.type==="slash"||se.type==="dot")&&(se.type==="dot"?(g.output+=U,se.output+=U):r.dot===!0?(g.output+=W,se.output+=W):(g.output+=pe,se.output+=pe),Te()!=="*"&&(g.output+=I,se.output+=I)),ke(w)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE("closing","]"));g.output=Gl.escapeLast(g.output,"["),Ve("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE("closing",")"));g.output=Gl.escapeLast(g.output,"("),Ve("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(FE("closing","}"));g.output=Gl.escapeLast(g.output,"{"),Ve("braces")}if(r.strictSlashes!==!0&&(se.type==="star"||se.type==="bracket")&&ke({type:"maybe_slash",value:"",output:`${b}?`}),g.backtrack===!0){g.output="";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};d4.fastpaths=(t,e)=>{let r={...e},s=typeof r.maxLength=="number"?Math.min(gk,r.maxLength):gk,a=t.length;if(a>s)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${s}`);t=qoe[t]||t;let n=Gl.isWindows(e),{DOT_LITERAL:c,SLASH_LITERAL:f,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:C,NO_DOTS_SLASH:S,STAR:b,START_ANCHOR:I}=hk.globChars(n),T=r.dot?C:E,N=r.dot?S:E,U=r.capture?"":"?:",W={negated:!1,prefix:""},ee=r.bash===!0?".*?":b;r.capture&&(ee=`(${ee})`);let ie=pe=>pe.noglobstar===!0?ee:`(${U}(?:(?!${I}${pe.dot?h:c}).)*?)`,ue=pe=>{switch(pe){case"*":return`${T}${p}${ee}`;case".*":return`${c}${p}${ee}`;case"*.*":return`${T}${ee}${c}${p}${ee}`;case"*/*":return`${T}${ee}${f}${p}${N}${ee}`;case"**":return T+ie(r);case"**/*":return`(?:${T}${ie(r)}${f})?${N}${p}${ee}`;case"**/*.*":return`(?:${T}${ie(r)}${f})?${N}${ee}${c}${p}${ee}`;case"**/.*":return`(?:${T}${ie(r)}${f})?${c}${p}${ee}`;default:{let Be=/^(.*?)\.(\w+)$/.exec(pe);if(!Be)return;let Ce=ue(Be[1]);return Ce?Ce+c+Be[2]:void 0}}},le=Gl.removePrefix(t,W),me=ue(le);return me&&r.strictSlashes!==!0&&(me+=`${f}?`),me};Woe.exports=d4});var Joe=_((aFt,Voe)=>{"use strict";var Ize=Ie("path"),Cze=Goe(),m4=Yoe(),y4=IB(),wze=EB(),Bze=t=>t&&typeof t=="object"&&!Array.isArray(t),Zi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(S=>Zi(S,e,r));return S=>{for(let b of E){let I=b(S);if(I)return I}return!1}}let s=Bze(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!s)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=y4.isWindows(e),c=s?Zi.compileRe(t,e):Zi.makeRe(t,e,!1,!0),f=c.state;delete c.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Zi(a.ignore,E,r)}let h=(E,C=!1)=>{let{isMatch:S,match:b,output:I}=Zi.test(E,c,e,{glob:t,posix:n}),T={glob:t,state:f,regex:c,posix:n,input:E,output:I,match:b,isMatch:S};return typeof a.onResult=="function"&&a.onResult(T),S===!1?(T.isMatch=!1,C?T:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(T),T.isMatch=!1,C?T:!1):(typeof a.onMatch=="function"&&a.onMatch(T),C?T:!0)};return r&&(h.state=f),h};Zi.test=(t,e,r,{glob:s,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},c=n.format||(a?y4.toPosixSlashes:null),f=t===s,p=f&&c?c(t):t;return f===!1&&(p=c?c(t):t,f=p===s),(f===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?f=Zi.matchBase(t,e,r,a):f=e.exec(p)),{isMatch:!!f,match:f,output:p}};Zi.matchBase=(t,e,r,s=y4.isWindows(r))=>(e instanceof RegExp?e:Zi.makeRe(e,r)).test(Ize.basename(t));Zi.isMatch=(t,e,r)=>Zi(e,r)(t);Zi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Zi.parse(r,e)):m4(t,{...e,fastpaths:!1});Zi.scan=(t,e)=>Cze(t,e);Zi.compileRe=(t,e,r=!1,s=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",c=a.contains?"":"$",f=`${n}(?:${t.output})${c}`;t&&t.negated===!0&&(f=`^(?!${f}).*$`);let p=Zi.toRegex(f,e);return s===!0&&(p.state=t),p};Zi.makeRe=(t,e={},r=!1,s=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=m4.fastpaths(t,e)),a.output||(a=m4(t,e)),Zi.compileRe(a,e,r,s)};Zi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Zi.constants=wze;Voe.exports=Zi});var zoe=_((lFt,Koe)=>{"use strict";Koe.exports=Joe()});var Go=_((cFt,eae)=>{"use strict";var Xoe=Ie("util"),$oe=koe(),Jf=zoe(),E4=IB(),Zoe=t=>t===""||t==="./",xi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let s=new Set,a=new Set,n=new Set,c=0,f=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!s.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};xi.match=xi;xi.matcher=(t,e)=>Jf(t,e);xi.isMatch=(t,e,r)=>Jf(e,r)(t);xi.any=xi.isMatch;xi.not=(t,e,r={})=>{e=[].concat(e).map(String);let s=new Set,a=[],n=f=>{r.onResult&&r.onResult(f),a.push(f.output)},c=new Set(xi(t,e,{...r,onResult:n}));for(let f of a)c.has(f)||s.add(f);return[...s]};xi.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${Xoe.inspect(t)}"`);if(Array.isArray(e))return e.some(s=>xi.contains(t,s,r));if(typeof e=="string"){if(Zoe(t)||Zoe(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return xi.isMatch(t,e,{...r,contains:!0})};xi.matchKeys=(t,e,r)=>{if(!E4.isObject(t))throw new TypeError("Expected the first argument to be an object");let s=xi(Object.keys(t),e,r),a={};for(let n of s)a[n]=t[n];return a};xi.some=(t,e,r)=>{let s=[].concat(t);for(let a of[].concat(e)){let n=Jf(String(a),r);if(s.some(c=>n(c)))return!0}return!1};xi.every=(t,e,r)=>{let s=[].concat(t);for(let a of[].concat(e)){let n=Jf(String(a),r);if(!s.every(c=>n(c)))return!1}return!0};xi.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${Xoe.inspect(t)}"`);return[].concat(e).every(s=>Jf(s,r)(t))};xi.capture=(t,e,r)=>{let s=E4.isWindows(r),n=Jf.makeRe(String(t),{...r,capture:!0}).exec(s?E4.toPosixSlashes(e):e);if(n)return n.slice(1).map(c=>c===void 0?"":c)};xi.makeRe=(...t)=>Jf.makeRe(...t);xi.scan=(...t)=>Jf.scan(...t);xi.parse=(t,e)=>{let r=[];for(let s of[].concat(t||[]))for(let a of $oe(String(s),e))r.push(Jf.parse(a,e));return r};xi.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:$oe(t,e)};xi.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return xi.braces(t,{...e,expand:!0})};eae.exports=xi});var rae=_((uFt,tae)=>{"use strict";tae.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var dk=_((fFt,nae)=>{"use strict";var vze=rae();nae.exports=t=>typeof t=="string"?t.replace(vze(),""):t});function iae(t){return Number.isSafeInteger(t)&&t>=0}var sae=Ze(()=>{});function oae(t){return t!=null&&typeof t!="function"&&iae(t.length)}var aae=Ze(()=>{sae()});function Pc(t){return t==="__proto__"}var wB=Ze(()=>{});function NE(t){switch(typeof t){case"number":case"symbol":return!1;case"string":return t.includes(".")||t.includes("[")||t.includes("]")}}var mk=Ze(()=>{});function OE(t){return typeof t=="string"||typeof t=="symbol"?t:Object.is(t?.valueOf?.(),-0)?"-0":String(t)}var yk=Ze(()=>{});function Mu(t){let e=[],r=t.length;if(r===0)return e;let s=0,a="",n="",c=!1;for(t.charCodeAt(0)===46&&(e.push(""),s++);s{});function va(t,e,r){if(t==null)return r;switch(typeof e){case"string":{if(Pc(e))return r;let s=t[e];return s===void 0?NE(e)?va(t,Mu(e),r):r:s}case"number":case"symbol":{typeof e=="number"&&(e=OE(e));let s=t[e];return s===void 0?r:s}default:{if(Array.isArray(e))return Sze(t,e,r);if(Object.is(e?.valueOf(),-0)?e="-0":e=String(e),Pc(e))return r;let s=t[e];return s===void 0?r:s}}}function Sze(t,e,r){if(e.length===0)return r;let s=t;for(let a=0;a{wB();mk();yk();LE()});function I4(t){return t!==null&&(typeof t=="object"||typeof t=="function")}var lae=Ze(()=>{});function ME(t){return t==null||typeof t!="object"&&typeof t!="function"}var Ik=Ze(()=>{});function Ck(t,e){return t===e||Number.isNaN(t)&&Number.isNaN(e)}var C4=Ze(()=>{});function Wd(t){return Object.getOwnPropertySymbols(t).filter(e=>Object.prototype.propertyIsEnumerable.call(t,e))}var wk=Ze(()=>{});function Yd(t){return t==null?t===void 0?"[object Undefined]":"[object Null]":Object.prototype.toString.call(t)}var Bk=Ze(()=>{});var vk,UE,_E,HE,Vd,Sk,Dk,Pk,bk,xk,cae,kk,jE,uae,Qk,Rk,Tk,Fk,Nk,fae,Ok,Lk,Mk,Aae,Uk,_k,Hk=Ze(()=>{vk="[object RegExp]",UE="[object String]",_E="[object Number]",HE="[object Boolean]",Vd="[object Arguments]",Sk="[object Symbol]",Dk="[object Date]",Pk="[object Map]",bk="[object Set]",xk="[object Array]",cae="[object Function]",kk="[object ArrayBuffer]",jE="[object Object]",uae="[object Error]",Qk="[object DataView]",Rk="[object Uint8Array]",Tk="[object Uint8ClampedArray]",Fk="[object Uint16Array]",Nk="[object Uint32Array]",fae="[object BigUint64Array]",Ok="[object Int8Array]",Lk="[object Int16Array]",Mk="[object Int32Array]",Aae="[object BigInt64Array]",Uk="[object Float32Array]",_k="[object Float64Array]"});function GE(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}var jk=Ze(()=>{});function pae(t,e){return u0(t,void 0,t,new Map,e)}function u0(t,e,r,s=new Map,a=void 0){let n=a?.(t,e,r,s);if(n!=null)return n;if(ME(t))return t;if(s.has(t))return s.get(t);if(Array.isArray(t)){let c=new Array(t.length);s.set(t,c);for(let f=0;f{wk();Bk();Hk();Ik();jk()});function hae(t){return u0(t,void 0,t,new Map,void 0)}var gae=Ze(()=>{w4()});function dae(t,e){return pae(t,(r,s,a,n)=>{let c=e?.(r,s,a,n);if(c!=null)return c;if(typeof t=="object")switch(Object.prototype.toString.call(t)){case _E:case UE:case HE:{let f=new t.constructor(t?.valueOf());return c0(f,t),f}case Vd:{let f={};return c0(f,t),f.length=t.length,f[Symbol.iterator]=t[Symbol.iterator],f}default:return}})}var mae=Ze(()=>{w4();Hk()});function f0(t){return dae(t)}var B4=Ze(()=>{mae()});function Gk(t,e=Number.MAX_SAFE_INTEGER){switch(typeof t){case"number":return Number.isInteger(t)&&t>=0&&t{Pze=/^(?:0|[1-9]\d*)$/});function BB(t){return t!==null&&typeof t=="object"&&Yd(t)==="[object Arguments]"}var S4=Ze(()=>{Bk()});function vB(t,e){let r;if(Array.isArray(e)?r=e:typeof e=="string"&&NE(e)&&t?.[e]==null?r=Mu(e):r=[e],r.length===0)return!1;let s=t;for(let a=0;a{mk();v4();S4();LE()});function P4(t){return typeof t=="object"&&t!==null}var yae=Ze(()=>{});function Eae(t){return typeof t=="symbol"||t instanceof Symbol}var Iae=Ze(()=>{});function Cae(t,e){return Array.isArray(t)?!1:typeof t=="number"||typeof t=="boolean"||t==null||Eae(t)?!0:typeof t=="string"&&(xze.test(t)||!bze.test(t))||e!=null&&Object.hasOwn(e,t)}var bze,xze,wae=Ze(()=>{Iae();bze=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xze=/^\w*$/});function A0(t,e){if(t==null)return!0;switch(typeof e){case"symbol":case"number":case"object":{if(Array.isArray(e))return Bae(t,e);if(typeof e=="number"?e=OE(e):typeof e=="object"&&(Object.is(e?.valueOf(),-0)?e="-0":e=String(e)),Pc(e))return!1;if(t?.[e]===void 0)return!0;try{return delete t[e],!0}catch{return!1}}case"string":{if(t?.[e]===void 0&&NE(e))return Bae(t,Mu(e));if(Pc(e))return!1;try{return delete t[e],!0}catch{return!1}}}}function Bae(t,e){let r=va(t,e.slice(0,-1),t),s=e[e.length-1];if(r?.[s]===void 0)return!0;if(Pc(s))return!1;try{return delete r[s],!0}catch{return!1}}var b4=Ze(()=>{Ek();wB();mk();yk();LE()});function vae(t){return t==null}var Sae=Ze(()=>{});var Dae,Pae=Ze(()=>{C4();Dae=(t,e,r)=>{let s=t[e];(!(Object.hasOwn(t,e)&&Ck(s,r))||r===void 0&&!(e in t))&&(t[e]=r)}});function bae(t,e,r,s){if(t==null&&!I4(t))return t;let a=Cae(e,t)?[e]:Array.isArray(e)?e:typeof e=="string"?Mu(e):[e],n=t;for(let c=0;c{wB();Pae();v4();wae();yk();lae();LE()});function Jd(t,e,r){return bae(t,e,()=>r,()=>{})}var x4=Ze(()=>{xae()});function kae(t,e=0,r={}){typeof r!="object"&&(r={});let s=null,a=null,n=null,c=0,f=null,p,{leading:h=!1,trailing:E=!0,maxWait:C}=r,S="maxWait"in r,b=S?Math.max(Number(C)||0,e):0,I=ue=>(s!==null&&(p=t.apply(a,s)),s=a=null,c=ue,p),T=ue=>(c=ue,f=setTimeout(ee,e),h&&s!==null?I(ue):p),N=ue=>(f=null,E&&s!==null?I(ue):p),U=ue=>{if(n===null)return!0;let le=ue-n,me=le>=e||le<0,pe=S&&ue-c>=b;return me||pe},W=ue=>{let le=n===null?0:ue-n,me=e-le,pe=b-(ue-c);return S?Math.min(me,pe):me},ee=()=>{let ue=Date.now();if(U(ue))return N(ue);f=setTimeout(ee,W(ue))},ie=function(...ue){let le=Date.now(),me=U(le);if(s=ue,a=this,n=le,me){if(f===null)return T(le);if(S)return clearTimeout(f),f=setTimeout(ee,e),I(le)}return f===null&&(f=setTimeout(ee,e)),p};return ie.cancel=()=>{f!==null&&clearTimeout(f),c=0,n=s=a=f=null},ie.flush=()=>f===null?p:N(Date.now()),ie}var Qae=Ze(()=>{});function k4(t,e=0,r={}){let{leading:s=!0,trailing:a=!0}=r;return kae(t,e,{leading:s,maxWait:e,trailing:a})}var Rae=Ze(()=>{Qae()});function Q4(t){if(t==null)return"";if(typeof t=="string")return t;if(Array.isArray(t))return t.map(Q4).join(",");let e=String(t);return e==="0"&&Object.is(Number(t),-0)?"-0":e}var Tae=Ze(()=>{});function R4(t){if(!t||typeof t!="object")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.prototype||Object.getPrototypeOf(e)===null?Object.prototype.toString.call(t)==="[object Object]":!1}var Fae=Ze(()=>{});function Nae(t,e,r){return SB(t,e,void 0,void 0,void 0,void 0,r)}function SB(t,e,r,s,a,n,c){let f=c(t,e,r,s,a,n);if(f!==void 0)return f;if(typeof t==typeof e)switch(typeof t){case"bigint":case"string":case"boolean":case"symbol":case"undefined":return t===e;case"number":return t===e||Object.is(t,e);case"function":return t===e;case"object":return DB(t,e,n,c)}return DB(t,e,n,c)}function DB(t,e,r,s){if(Object.is(t,e))return!0;let a=Yd(t),n=Yd(e);if(a===Vd&&(a=jE),n===Vd&&(n=jE),a!==n)return!1;switch(a){case UE:return t.toString()===e.toString();case _E:{let p=t.valueOf(),h=e.valueOf();return Ck(p,h)}case HE:case Dk:case Sk:return Object.is(t.valueOf(),e.valueOf());case vk:return t.source===e.source&&t.flags===e.flags;case cae:return t===e}r=r??new Map;let c=r.get(t),f=r.get(e);if(c!=null&&f!=null)return c===e;r.set(t,e),r.set(e,t);try{switch(a){case Pk:{if(t.size!==e.size)return!1;for(let[p,h]of t.entries())if(!e.has(p)||!SB(h,e.get(p),p,t,e,r,s))return!1;return!0}case bk:{if(t.size!==e.size)return!1;let p=Array.from(t.values()),h=Array.from(e.values());for(let E=0;ESB(C,b,void 0,t,e,r,s));if(S===-1)return!1;h.splice(S,1)}return!0}case xk:case Rk:case Tk:case Fk:case Nk:case fae:case Ok:case Lk:case Mk:case Aae:case Uk:case _k:{if(typeof Buffer<"u"&&Buffer.isBuffer(t)!==Buffer.isBuffer(e)||t.length!==e.length)return!1;for(let p=0;p{Fae();wk();Bk();Hk();C4()});function Lae(){}var Mae=Ze(()=>{});function T4(t,e){return Nae(t,e,Lae)}var Uae=Ze(()=>{Oae();Mae()});function _ae(t){return GE(t)}var Hae=Ze(()=>{jk()});function jae(t){if(typeof t!="object"||t==null)return!1;if(Object.getPrototypeOf(t)===null)return!0;if(Object.prototype.toString.call(t)!=="[object Object]"){let r=t[Symbol.toStringTag];return r==null||!Object.getOwnPropertyDescriptor(t,Symbol.toStringTag)?.writable?!1:t.toString()===`[object ${r}]`}let e=t;for(;Object.getPrototypeOf(e)!==null;)e=Object.getPrototypeOf(e);return Object.getPrototypeOf(t)===e}var Gae=Ze(()=>{});function qae(t){if(ME(t))return t;if(Array.isArray(t)||GE(t)||t instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&t instanceof SharedArrayBuffer)return t.slice(0);let e=Object.getPrototypeOf(t),r=e.constructor;if(t instanceof Date||t instanceof Map||t instanceof Set)return new r(t);if(t instanceof RegExp){let s=new r(t);return s.lastIndex=t.lastIndex,s}if(t instanceof DataView)return new r(t.buffer.slice(0));if(t instanceof Error){let s=new r(t.message);return s.stack=t.stack,s.name=t.name,s.cause=t.cause,s}if(typeof File<"u"&&t instanceof File)return new r([t],t.name,{type:t.type,lastModified:t.lastModified});if(typeof t=="object"){let s=Object.create(e);return Object.assign(s,t)}return t}var Wae=Ze(()=>{Ik();jk()});function F4(t,...e){let r=e.slice(0,-1),s=e[e.length-1],a=t;for(let n=0;n{B4();wB();Wae();Ik();wk();S4();yae();Gae();Hae()});function N4(t,...e){if(t==null)return{};let r=hae(t);for(let s=0;s{b4();gae()});function Kd(t,...e){if(vae(t))return{};let r={};for(let s=0;s{Ek();D4();x4();aae();Sae()});function Kae(t){return t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}var zae=Ze(()=>{});function PB(t){return Kae(Q4(t))}var Zae=Ze(()=>{zae();Tae()});var ql=Ze(()=>{Rae();Uae();B4();Ek();D4();Yae();Vae();Jae();x4();b4();Zae();LE()});var je={};Vt(je,{AsyncActions:()=>M4,BufferStream:()=>L4,CachingStrategy:()=>ale,DefaultStream:()=>U4,allSettledSafe:()=>Uu,assertNever:()=>H4,bufferStream:()=>WE,buildIgnorePattern:()=>Oze,convertMapsToIndexableObjects:()=>Yk,dynamicRequire:()=>bp,escapeRegExp:()=>Qze,getArrayWithDefault:()=>xB,getFactoryWithDefault:()=>Yl,getMapWithDefault:()=>j4,getSetWithDefault:()=>Pp,groupBy:()=>Uze,isIndexableObject:()=>O4,isPathLike:()=>Lze,isTaggedYarnVersion:()=>kze,makeDeferred:()=>ile,mapAndFilter:()=>Wl,mapAndFind:()=>p0,mergeIntoTarget:()=>cle,overrideType:()=>Rze,parseBoolean:()=>kB,parseInt:()=>YE,parseOptionalBoolean:()=>lle,plural:()=>Wk,prettifyAsyncErrors:()=>qE,prettifySyncErrors:()=>G4,releaseAfterUseAsync:()=>Fze,replaceEnvVariables:()=>Vk,sortMap:()=>qs,toMerged:()=>Mze,tryParseOptionalBoolean:()=>q4,validateEnum:()=>Tze});function kze(t){return!!(tle.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function Wk(t,{one:e,more:r,zero:s=r}){return t===0?s:t===1?e:r}function Qze(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Rze(t){}function H4(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function Tze(t,e){let r=Object.values(t);if(!r.includes(e))throw new nt(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(s=>JSON.stringify(s)).join(", ")})`);return e}function Wl(t,e){let r=[];for(let s of t){let a=e(s);a!==rle&&r.push(a)}return r}function p0(t,e){for(let r of t){let s=e(r);if(s!==nle)return s}}function O4(t){return typeof t=="object"&&t!==null}async function Uu(t){let e=await Promise.allSettled(t),r=[];for(let s of e){if(s.status==="rejected")throw s.reason;r.push(s.value)}return r}function Yk(t){if(t instanceof Map&&(t=Object.fromEntries(t)),O4(t))for(let e of Object.keys(t)){let r=t[e];O4(r)&&(t[e]=Yk(r))}return t}function Yl(t,e,r){let s=t.get(e);return typeof s>"u"&&t.set(e,s=r()),s}function xB(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function Pp(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function j4(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function Fze(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function qE(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function G4(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function WE(t){return await new Promise((e,r)=>{let s=[];t.on("error",a=>{r(a)}),t.on("data",a=>{s.push(a)}),t.on("end",()=>{e(Buffer.concat(s))})})}function ile(){let t,e;return{promise:new Promise((s,a)=>{t=s,e=a}),resolve:t,reject:e}}function sle(t){return bB(fe.fromPortablePath(t))}function ole(path){let physicalPath=fe.fromPortablePath(path),currentCacheEntry=bB.cache[physicalPath];delete bB.cache[physicalPath];let result;try{result=sle(physicalPath);let freshCacheEntry=bB.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{bB.cache[physicalPath]=currentCacheEntry}return result}function Nze(t){let e=Xae.get(t),r=ce.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let s=ole(t);return Xae.set(t,{mtime:r.mtimeMs,instance:s}),s}function bp(t,{cachingStrategy:e=2}={}){switch(e){case 0:return ole(t);case 1:return Nze(t);case 2:return sle(t);default:throw new Error("Unsupported caching strategy")}}function qs(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let s=[];for(let n of e)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function Oze(t){return t.length===0?null:t.map(e=>`(${$ae.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Vk(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...s)=>{let{variableName:a,colon:n,fallback:c}=s[s.length-1],f=Object.hasOwn(e,a),p=e[a];if(p||f&&!n)return p;if(c!=null)return c;throw new nt(`Environment variable not found (${a})`)})}function kB(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function lle(t){return typeof t>"u"?t:kB(t)}function q4(t){try{return lle(t)}catch{return null}}function Lze(t){return!!(fe.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function cle(t,...e){let r=c=>({value:c}),s=r(t),a=e.map(c=>r(c)),{value:n}=F4(s,...a,(c,f)=>{if(Array.isArray(c)&&Array.isArray(f)){for(let p of f)c.find(h=>T4(h,p))||c.push(p);return c}});return n}function Mze(...t){return cle({},...t)}function Uze(t,e){let r=Object.create(null);for(let s of t){let a=s[e];r[a]??=[],r[a].push(s)}return r}function YE(t){return typeof t=="string"?Number.parseInt(t,10):t}var $ae,ele,tle,_4,rle,nle,L4,M4,U4,bB,Xae,ale,bc=Ze(()=>{Dt();Yt();ql();$ae=ut(Go()),ele=ut(Ld()),tle=ut(Ai()),_4=Ie("stream");rle=Symbol();Wl.skip=rle;nle=Symbol();p0.skip=nle;L4=class extends _4.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,s,a){if(s!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};M4=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,ele.default)(e)}set(e,r){let s=this.deferred.get(e);typeof s>"u"&&this.deferred.set(e,s=ile());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&s.resolve()},n=>{this.promises.get(e)===a&&s.reject(n)}),s.promise}reduce(e,r){let s=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(s))}async wait(){await Promise.all(this.promises.values())}},U4=class extends _4.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,s,a){if(s!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},bB=eval("require");Xae=new Map;ale=(s=>(s[s.NoCache=0]="NoCache",s[s.FsTime=1]="FsTime",s[s.Node=2]="Node",s))(ale||{})});var VE,W4,Y4,ule=Ze(()=>{VE=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))(VE||{}),W4=(s=>(s.Dependency="Dependency",s.PeerDependency="PeerDependency",s.PeerDependencyMeta="PeerDependencyMeta",s))(W4||{}),Y4=(s=>(s.Inactive="inactive",s.Redundant="redundant",s.Active="active",s))(Y4||{})});var he={};Vt(he,{LogLevel:()=>$k,Style:()=>zk,Type:()=>ht,addLogFilterSupport:()=>TB,applyColor:()=>ri,applyHyperlink:()=>KE,applyStyle:()=>zd,json:()=>Zd,jsonOrPretty:()=>jze,mark:()=>Z4,pretty:()=>Ht,prettyField:()=>Kf,prettyList:()=>z4,prettyTruncatedLocatorList:()=>Xk,stripAnsi:()=>JE.default,supportsColor:()=>Zk,supportsHyperlinks:()=>K4,tuple:()=>_u});function fle(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let s=1024**r;return`${Math.floor(t*100/s)/100} ${e[r-1]}`}function Jk(t,e){if(Array.isArray(e))return e.length===0?ri(t,"[]",ht.CODE):ri(t,"[ ",ht.CODE)+e.map(r=>Jk(t,r)).join(", ")+ri(t," ]",ht.CODE);if(typeof e=="string")return ri(t,JSON.stringify(e),ht.STRING);if(typeof e=="number")return ri(t,JSON.stringify(e),ht.NUMBER);if(typeof e=="boolean")return ri(t,JSON.stringify(e),ht.BOOLEAN);if(e===null)return ri(t,"null",ht.NULL);if(typeof e=="object"&&Object.getPrototypeOf(e)===Object.prototype){let r=Object.entries(e);return r.length===0?ri(t,"{}",ht.CODE):ri(t,"{ ",ht.CODE)+r.map(([s,a])=>`${Jk(t,s)}: ${Jk(t,a)}`).join(", ")+ri(t," }",ht.CODE)}if(typeof e>"u")return ri(t,"undefined",ht.NULL);throw new Error("Assertion failed: The value doesn't seem to be a valid JSON object")}function _u(t,e){return[e,t]}function zd(t,e,r){return t.get("enableColors")&&r&2&&(e=RB.default.bold(e)),e}function ri(t,e,r){if(!t.get("enableColors"))return e;let s=_ze.get(r);if(s===null)return e;let a=typeof s>"u"?r:J4.level>=3?s[0]:s[1],n=typeof a=="number"?V4.ansi256(a):a.startsWith("#")?V4.hex(a):V4[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function KE(t,e,r){return t.get("enableHyperlinks")?Hze?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Ht(t,e,r){if(e===null)return ri(t,"null",ht.NULL);if(Object.hasOwn(Kk,r))return Kk[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return ri(t,e,r)}function z4(t,e,r,{separator:s=", "}={}){return[...e].map(a=>Ht(t,a,r)).join(s)}function Zd(t,e){if(t===null)return null;if(Object.hasOwn(Kk,e))return Kk[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function jze(t,e,[r,s]){return t?Zd(r,s):Ht(e,r,s)}function Z4(t){return{Check:ri(t,"\u2713","green"),Cross:ri(t,"\u2718","red"),Question:ri(t,"?","cyan")}}function Kf(t,{label:e,value:[r,s]}){return`${Ht(t,e,ht.CODE)}: ${Ht(t,r,s)}`}function Xk(t,e,r){let s=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${Yr(t,h)}, `,C=X4(h).length+2;if(s.length>0&&nh).join("").slice(0,-2);let c="X".repeat(a.length.toString().length),f=`and ${c} more.`,p=a.length;for(;s.length>1&&nh).join(""),f.replace(c,Ht(t,p,ht.NUMBER))].join("")}function TB(t,{configuration:e}){let r=e.get("logFilters"),s=new Map,a=new Map,n=[];for(let C of r){let S=C.get("level");if(typeof S>"u")continue;let b=C.get("code");typeof b<"u"&&s.set(b,S);let I=C.get("text");typeof I<"u"&&a.set(I,S);let T=C.get("pattern");typeof T<"u"&&n.push([Ale.default.matcher(T,{contains:!0}),S])}n.reverse();let c=(C,S,b)=>{if(C===null||C===0)return b;let I=a.size>0||n.length>0?(0,JE.default)(S):S;if(a.size>0){let T=a.get(I);if(typeof T<"u")return T??b}if(n.length>0){for(let[T,N]of n)if(T(I))return N??b}if(s.size>0){let T=s.get(Yf(C));if(typeof T<"u")return T??b}return b},f=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(C,S,b,I){switch(c(S,b,I)){case"info":f.call(C,S,b);break;case"warning":p.call(C,S??0,b);break;case"error":h.call(C,S??0,b);break}};t.reportInfo=function(...C){return E(this,...C,"info")},t.reportWarning=function(...C){return E(this,...C,"warning")},t.reportError=function(...C){return E(this,...C,"error")}}var RB,QB,Ale,JE,ht,zk,J4,Zk,K4,V4,_ze,qo,Kk,Hze,$k,xc=Ze(()=>{Dt();RB=ut(RE()),QB=ut(Fd());Yt();Ale=ut(Go()),JE=ut(dk());Gx();Wo();ht={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",STRING:"STRING",BOOLEAN:"BOOLEAN",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},zk=(e=>(e[e.BOLD=2]="BOLD",e))(zk||{}),J4=QB.default.GITHUB_ACTIONS?{level:2}:RB.default.supportsColor?{level:RB.default.supportsColor.level}:{level:0},Zk=J4.level!==0,K4=Zk&&!QB.default.GITHUB_ACTIONS&&!QB.default.CIRCLE&&!QB.default.GITLAB,V4=new RB.default.Instance(J4),_ze=new Map([[ht.NO_HINT,null],[ht.NULL,["#a853b5",129]],[ht.SCOPE,["#d75f00",166]],[ht.NAME,["#d7875f",173]],[ht.RANGE,["#00afaf",37]],[ht.REFERENCE,["#87afff",111]],[ht.NUMBER,["#ffd700",220]],[ht.STRING,["#b4bd68",32]],[ht.BOOLEAN,["#faa023",209]],[ht.PATH,["#d75fd7",170]],[ht.URL,["#d75fd7",170]],[ht.ADDED,["#5faf00",70]],[ht.REMOVED,["#ff3131",160]],[ht.CODE,["#87afff",111]],[ht.SIZE,["#ffd700",220]]]),qo=t=>t;Kk={[ht.ID]:qo({pretty:(t,e)=>typeof e=="number"?ri(t,`${e}`,ht.NUMBER):ri(t,e,ht.CODE),json:t=>t}),[ht.INSPECT]:qo({pretty:(t,e)=>Jk(t,e),json:t=>t}),[ht.NUMBER]:qo({pretty:(t,e)=>ri(t,`${e}`,ht.NUMBER),json:t=>t}),[ht.IDENT]:qo({pretty:(t,e)=>Xi(t,e),json:t=>un(t)}),[ht.LOCATOR]:qo({pretty:(t,e)=>Yr(t,e),json:t=>ll(t)}),[ht.DESCRIPTOR]:qo({pretty:(t,e)=>ni(t,e),json:t=>al(t)}),[ht.RESOLUTION]:qo({pretty:(t,{descriptor:e,locator:r})=>FB(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:al(t),locator:e!==null?ll(e):null})}),[ht.DEPENDENT]:qo({pretty:(t,{locator:e,descriptor:r})=>$4(t,e,r),json:({locator:t,descriptor:e})=>({locator:ll(t),descriptor:al(e)})}),[ht.PACKAGE_EXTENSION]:qo({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${Xi(t,e.parentDescriptor)} \u27A4 ${ri(t,"dependencies",ht.CODE)} \u27A4 ${Xi(t,e.descriptor)}`;case"PeerDependency":return`${Xi(t,e.parentDescriptor)} \u27A4 ${ri(t,"peerDependencies",ht.CODE)} \u27A4 ${Xi(t,e.descriptor)}`;case"PeerDependencyMeta":return`${Xi(t,e.parentDescriptor)} \u27A4 ${ri(t,"peerDependenciesMeta",ht.CODE)} \u27A4 ${Xi(t,Sa(e.selector))} \u27A4 ${ri(t,e.key,ht.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${un(t.parentDescriptor)} > ${un(t.descriptor)}`;case"PeerDependency":return`${un(t.parentDescriptor)} >> ${un(t.descriptor)}`;case"PeerDependencyMeta":return`${un(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[ht.SETTING]:qo({pretty:(t,e)=>(t.get(e),KE(t,ri(t,e,ht.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[ht.DURATION]:qo({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),s=Math.ceil((e-r*60*1e3)/1e3);return s===0?`${r}m`:`${r}m ${s}s`}else{let r=Math.floor(e/1e3),s=e-r*1e3;return s===0?`${r}s`:`${r}s ${s}ms`}},json:t=>t}),[ht.SIZE]:qo({pretty:(t,e)=>ri(t,fle(e),ht.NUMBER),json:t=>t}),[ht.SIZE_DIFF]:qo({pretty:(t,e)=>{let r=e>=0?"+":"-",s=r==="+"?ht.REMOVED:ht.ADDED;return ri(t,`${r} ${fle(Math.max(Math.abs(e),1))}`,s)},json:t=>t}),[ht.PATH]:qo({pretty:(t,e)=>ri(t,fe.fromPortablePath(e),ht.PATH),json:t=>fe.fromPortablePath(t)}),[ht.MARKDOWN]:qo({pretty:(t,{text:e,format:r,paragraphs:s})=>Ho(e,{format:r,paragraphs:s}),json:({text:t})=>t}),[ht.MARKDOWN_INLINE]:qo({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(r,s,a)=>Ht(t,s+a+s,ht.CODE)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,s,a)=>zd(t,a,2)),e),json:t=>t})};Hze=!!process.env.KONSOLE_VERSION;$k=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))($k||{})});var ple=_(zE=>{"use strict";Object.defineProperty(zE,"__esModule",{value:!0});zE.splitWhen=zE.flatten=void 0;function Gze(t){return t.reduce((e,r)=>[].concat(e,r),[])}zE.flatten=Gze;function qze(t,e){let r=[[]],s=0;for(let a of t)e(a)?(s++,r[s]=[]):r[s].push(a);return r}zE.splitWhen=qze});var hle=_(eQ=>{"use strict";Object.defineProperty(eQ,"__esModule",{value:!0});eQ.isEnoentCodeError=void 0;function Wze(t){return t.code==="ENOENT"}eQ.isEnoentCodeError=Wze});var gle=_(tQ=>{"use strict";Object.defineProperty(tQ,"__esModule",{value:!0});tQ.createDirentFromStats=void 0;var e3=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Yze(t,e){return new e3(t,e)}tQ.createDirentFromStats=Yze});var Ele=_(ls=>{"use strict";Object.defineProperty(ls,"__esModule",{value:!0});ls.convertPosixPathToPattern=ls.convertWindowsPathToPattern=ls.convertPathToPattern=ls.escapePosixPath=ls.escapeWindowsPath=ls.escape=ls.removeLeadingDotSegment=ls.makeAbsolute=ls.unixify=void 0;var Vze=Ie("os"),Jze=Ie("path"),dle=Vze.platform()==="win32",Kze=2,zze=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g,Zze=/(\\?)([()[\]{}]|^!|[!+@](?=\())/g,Xze=/^\\\\([.?])/,$ze=/\\(?![!()+@[\]{}])/g;function eZe(t){return t.replace(/\\/g,"/")}ls.unixify=eZe;function tZe(t,e){return Jze.resolve(t,e)}ls.makeAbsolute=tZe;function rZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(Kze)}return t}ls.removeLeadingDotSegment=rZe;ls.escape=dle?t3:r3;function t3(t){return t.replace(Zze,"\\$2")}ls.escapeWindowsPath=t3;function r3(t){return t.replace(zze,"\\$2")}ls.escapePosixPath=r3;ls.convertPathToPattern=dle?mle:yle;function mle(t){return t3(t).replace(Xze,"//$1").replace($ze,"/")}ls.convertWindowsPathToPattern=mle;function yle(t){return r3(t)}ls.convertPosixPathToPattern=yle});var Cle=_((UOt,Ile)=>{Ile.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var vle=_((_Ot,Ble)=>{var nZe=Cle(),wle={"{":"}","(":")","[":"]"},iZe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,s=-2,a=-2,n=-2,c=-2;ee&&(c===-1||c>s||(c=t.indexOf("\\",e),c===-1||c>s)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(c=t.indexOf("\\",e),c===-1||c>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(c=t.indexOf("\\",e),c===-1||c>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(c=t.indexOf("\\",r),c===-1||c>n))))return!0;if(t[e]==="\\"){var f=t[e+1];e+=2;var p=wle[f];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},sZe=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var oZe=vle(),aZe=Ie("path").posix.dirname,lZe=Ie("os").platform()==="win32",n3="/",cZe=/\\/g,uZe=/[\{\[].*[\}\]]$/,fZe=/(^|[^\\])([\{\[]|\([^\)]+$)/,AZe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;Sle.exports=function(e,r){var s=Object.assign({flipBackslashes:!0},r);s.flipBackslashes&&lZe&&e.indexOf(n3)<0&&(e=e.replace(cZe,n3)),uZe.test(e)&&(e+=n3),e+="a";do e=aZe(e);while(oZe(e)||fZe.test(e));return e.replace(AZe,"$1")}});var Fle=_(jr=>{"use strict";Object.defineProperty(jr,"__esModule",{value:!0});jr.removeDuplicateSlashes=jr.matchAny=jr.convertPatternsToRe=jr.makeRe=jr.getPatternParts=jr.expandBraceExpansion=jr.expandPatternsWithBraceExpansion=jr.isAffectDepthOfReadingPattern=jr.endsWithSlashGlobStar=jr.hasGlobStar=jr.getBaseDirectory=jr.isPatternRelatedToParentDirectory=jr.getPatternsOutsideCurrentDirectory=jr.getPatternsInsideCurrentDirectory=jr.getPositivePatterns=jr.getNegativePatterns=jr.isPositivePattern=jr.isNegativePattern=jr.convertToNegativePattern=jr.convertToPositivePattern=jr.isDynamicPattern=jr.isStaticPattern=void 0;var pZe=Ie("path"),hZe=Dle(),i3=Go(),Ple="**",gZe="\\",dZe=/[*?]|^!/,mZe=/\[[^[]*]/,yZe=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,EZe=/[!*+?@]\([^(]*\)/,IZe=/,|\.\./,CZe=/(?!^)\/{2,}/g;function ble(t,e={}){return!xle(t,e)}jr.isStaticPattern=ble;function xle(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(gZe)||dZe.test(t)||mZe.test(t)||yZe.test(t)||e.extglob!==!1&&EZe.test(t)||e.braceExpansion!==!1&&wZe(t))}jr.isDynamicPattern=xle;function wZe(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let s=t.slice(e,r);return IZe.test(s)}function BZe(t){return rQ(t)?t.slice(1):t}jr.convertToPositivePattern=BZe;function vZe(t){return"!"+t}jr.convertToNegativePattern=vZe;function rQ(t){return t.startsWith("!")&&t[1]!=="("}jr.isNegativePattern=rQ;function kle(t){return!rQ(t)}jr.isPositivePattern=kle;function SZe(t){return t.filter(rQ)}jr.getNegativePatterns=SZe;function DZe(t){return t.filter(kle)}jr.getPositivePatterns=DZe;function PZe(t){return t.filter(e=>!s3(e))}jr.getPatternsInsideCurrentDirectory=PZe;function bZe(t){return t.filter(s3)}jr.getPatternsOutsideCurrentDirectory=bZe;function s3(t){return t.startsWith("..")||t.startsWith("./..")}jr.isPatternRelatedToParentDirectory=s3;function xZe(t){return hZe(t,{flipBackslashes:!1})}jr.getBaseDirectory=xZe;function kZe(t){return t.includes(Ple)}jr.hasGlobStar=kZe;function Qle(t){return t.endsWith("/"+Ple)}jr.endsWithSlashGlobStar=Qle;function QZe(t){let e=pZe.basename(t);return Qle(t)||ble(e)}jr.isAffectDepthOfReadingPattern=QZe;function RZe(t){return t.reduce((e,r)=>e.concat(Rle(r)),[])}jr.expandPatternsWithBraceExpansion=RZe;function Rle(t){let e=i3.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0});return e.sort((r,s)=>r.length-s.length),e.filter(r=>r!=="")}jr.expandBraceExpansion=Rle;function TZe(t,e){let{parts:r}=i3.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}jr.getPatternParts=TZe;function Tle(t,e){return i3.makeRe(t,e)}jr.makeRe=Tle;function FZe(t,e){return t.map(r=>Tle(r,e))}jr.convertPatternsToRe=FZe;function NZe(t,e){return e.some(r=>r.test(t))}jr.matchAny=NZe;function OZe(t){return t.replace(CZe,"/")}jr.removeDuplicateSlashes=OZe});var Mle=_((GOt,Lle)=>{"use strict";var LZe=Ie("stream"),Nle=LZe.PassThrough,MZe=Array.prototype.slice;Lle.exports=UZe;function UZe(){let t=[],e=MZe.call(arguments),r=!1,s=e[e.length-1];s&&!Array.isArray(s)&&s.pipe==null?e.pop():s={};let a=s.end!==!1,n=s.pipeError===!0;s.objectMode==null&&(s.objectMode=!0),s.highWaterMark==null&&(s.highWaterMark=64*1024);let c=Nle(s);function f(){for(let E=0,C=arguments.length;E0||(r=!1,p())}function b(I){function T(){I.removeListener("merge2UnpipeEnd",T),I.removeListener("end",T),n&&I.removeListener("error",N),S()}function N(U){c.emit("error",U)}if(I._readableState.endEmitted)return S();I.on("merge2UnpipeEnd",T),I.on("end",T),n&&I.on("error",N),I.pipe(c,{end:!1}),I.resume()}for(let I=0;I{"use strict";Object.defineProperty(nQ,"__esModule",{value:!0});nQ.merge=void 0;var _Ze=Mle();function HZe(t){let e=_Ze(t);return t.forEach(r=>{r.once("error",s=>e.emit("error",s))}),e.once("close",()=>Ule(t)),e.once("end",()=>Ule(t)),e}nQ.merge=HZe;function Ule(t){t.forEach(e=>e.emit("close"))}});var Hle=_(ZE=>{"use strict";Object.defineProperty(ZE,"__esModule",{value:!0});ZE.isEmpty=ZE.isString=void 0;function jZe(t){return typeof t=="string"}ZE.isString=jZe;function GZe(t){return t===""}ZE.isEmpty=GZe});var xp=_(Yo=>{"use strict";Object.defineProperty(Yo,"__esModule",{value:!0});Yo.string=Yo.stream=Yo.pattern=Yo.path=Yo.fs=Yo.errno=Yo.array=void 0;var qZe=ple();Yo.array=qZe;var WZe=hle();Yo.errno=WZe;var YZe=gle();Yo.fs=YZe;var VZe=Ele();Yo.path=VZe;var JZe=Fle();Yo.pattern=JZe;var KZe=_le();Yo.stream=KZe;var zZe=Hle();Yo.string=zZe});var Wle=_(Vo=>{"use strict";Object.defineProperty(Vo,"__esModule",{value:!0});Vo.convertPatternGroupToTask=Vo.convertPatternGroupsToTasks=Vo.groupPatternsByBaseDirectory=Vo.getNegativePatternsAsPositive=Vo.getPositivePatterns=Vo.convertPatternsToTasks=Vo.generate=void 0;var Hu=xp();function ZZe(t,e){let r=jle(t,e),s=jle(e.ignore,e),a=Gle(r),n=qle(r,s),c=a.filter(E=>Hu.pattern.isStaticPattern(E,e)),f=a.filter(E=>Hu.pattern.isDynamicPattern(E,e)),p=o3(c,n,!1),h=o3(f,n,!0);return p.concat(h)}Vo.generate=ZZe;function jle(t,e){let r=t;return e.braceExpansion&&(r=Hu.pattern.expandPatternsWithBraceExpansion(r)),e.baseNameMatch&&(r=r.map(s=>s.includes("/")?s:`**/${s}`)),r.map(s=>Hu.pattern.removeDuplicateSlashes(s))}function o3(t,e,r){let s=[],a=Hu.pattern.getPatternsOutsideCurrentDirectory(t),n=Hu.pattern.getPatternsInsideCurrentDirectory(t),c=a3(a),f=a3(n);return s.push(...l3(c,e,r)),"."in f?s.push(c3(".",n,e,r)):s.push(...l3(f,e,r)),s}Vo.convertPatternsToTasks=o3;function Gle(t){return Hu.pattern.getPositivePatterns(t)}Vo.getPositivePatterns=Gle;function qle(t,e){return Hu.pattern.getNegativePatterns(t).concat(e).map(Hu.pattern.convertToPositivePattern)}Vo.getNegativePatternsAsPositive=qle;function a3(t){let e={};return t.reduce((r,s)=>{let a=Hu.pattern.getBaseDirectory(s);return a in r?r[a].push(s):r[a]=[s],r},e)}Vo.groupPatternsByBaseDirectory=a3;function l3(t,e,r){return Object.keys(t).map(s=>c3(s,t[s],e,r))}Vo.convertPatternGroupsToTasks=l3;function c3(t,e,r,s){return{dynamic:s,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Hu.pattern.convertToNegativePattern))}}Vo.convertPatternGroupToTask=c3});var Vle=_(iQ=>{"use strict";Object.defineProperty(iQ,"__esModule",{value:!0});iQ.read=void 0;function XZe(t,e,r){e.fs.lstat(t,(s,a)=>{if(s!==null){Yle(r,s);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){u3(r,a);return}e.fs.stat(t,(n,c)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){Yle(r,n);return}u3(r,a);return}e.markSymbolicLink&&(c.isSymbolicLink=()=>!0),u3(r,c)})})}iQ.read=XZe;function Yle(t,e){t(e)}function u3(t,e){t(null,e)}});var Jle=_(sQ=>{"use strict";Object.defineProperty(sQ,"__esModule",{value:!0});sQ.read=void 0;function $Ze(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let s=e.fs.statSync(t);return e.markSymbolicLink&&(s.isSymbolicLink=()=>!0),s}catch(s){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw s}}sQ.read=$Ze});var Kle=_(h0=>{"use strict";Object.defineProperty(h0,"__esModule",{value:!0});h0.createFileSystemAdapter=h0.FILE_SYSTEM_ADAPTER=void 0;var oQ=Ie("fs");h0.FILE_SYSTEM_ADAPTER={lstat:oQ.lstat,stat:oQ.stat,lstatSync:oQ.lstatSync,statSync:oQ.statSync};function eXe(t){return t===void 0?h0.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},h0.FILE_SYSTEM_ADAPTER),t)}h0.createFileSystemAdapter=eXe});var zle=_(A3=>{"use strict";Object.defineProperty(A3,"__esModule",{value:!0});var tXe=Kle(),f3=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=tXe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};A3.default=f3});var Xd=_(g0=>{"use strict";Object.defineProperty(g0,"__esModule",{value:!0});g0.statSync=g0.stat=g0.Settings=void 0;var Zle=Vle(),rXe=Jle(),p3=zle();g0.Settings=p3.default;function nXe(t,e,r){if(typeof e=="function"){Zle.read(t,h3(),e);return}Zle.read(t,h3(e),r)}g0.stat=nXe;function iXe(t,e){let r=h3(e);return rXe.read(t,r)}g0.statSync=iXe;function h3(t={}){return t instanceof p3.default?t:new p3.default(t)}});var ece=_(($Ot,$le)=>{var Xle;$le.exports=typeof queueMicrotask=="function"?queueMicrotask.bind(typeof window<"u"?window:global):t=>(Xle||(Xle=Promise.resolve())).then(t).catch(e=>setTimeout(()=>{throw e},0))});var rce=_((eLt,tce)=>{tce.exports=oXe;var sXe=ece();function oXe(t,e){let r,s,a,n=!0;Array.isArray(t)?(r=[],s=t.length):(a=Object.keys(t),r={},s=a.length);function c(p){function h(){e&&e(p,r),e=null}n?sXe(h):h()}function f(p,h,E){r[p]=E,(--s===0||h)&&c(h)}s?a?a.forEach(function(p){t[p](function(h,E){f(p,h,E)})}):t.forEach(function(p,h){p(function(E,C){f(h,E,C)})}):c(null),n=!1}});var g3=_(lQ=>{"use strict";Object.defineProperty(lQ,"__esModule",{value:!0});lQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var aQ=process.versions.node.split(".");if(aQ[0]===void 0||aQ[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var nce=Number.parseInt(aQ[0],10),aXe=Number.parseInt(aQ[1],10),ice=10,lXe=10,cXe=nce>ice,uXe=nce===ice&&aXe>=lXe;lQ.IS_SUPPORT_READDIR_WITH_FILE_TYPES=cXe||uXe});var sce=_(cQ=>{"use strict";Object.defineProperty(cQ,"__esModule",{value:!0});cQ.createDirentFromStats=void 0;var d3=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function fXe(t,e){return new d3(t,e)}cQ.createDirentFromStats=fXe});var m3=_(uQ=>{"use strict";Object.defineProperty(uQ,"__esModule",{value:!0});uQ.fs=void 0;var AXe=sce();uQ.fs=AXe});var y3=_(fQ=>{"use strict";Object.defineProperty(fQ,"__esModule",{value:!0});fQ.joinPathSegments=void 0;function pXe(t,e,r){return t.endsWith(r)?t+e:t+r+e}fQ.joinPathSegments=pXe});var fce=_(d0=>{"use strict";Object.defineProperty(d0,"__esModule",{value:!0});d0.readdir=d0.readdirWithFileTypes=d0.read=void 0;var hXe=Xd(),oce=rce(),gXe=g3(),ace=m3(),lce=y3();function dXe(t,e,r){if(!e.stats&&gXe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){cce(t,e,r);return}uce(t,e,r)}d0.read=dXe;function cce(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(s,a)=>{if(s!==null){AQ(r,s);return}let n=a.map(f=>({dirent:f,name:f.name,path:lce.joinPathSegments(t,f.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){E3(r,n);return}let c=n.map(f=>mXe(f,e));oce(c,(f,p)=>{if(f!==null){AQ(r,f);return}E3(r,p)})})}d0.readdirWithFileTypes=cce;function mXe(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(s,a)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){r(s);return}r(null,t);return}t.dirent=ace.fs.createDirentFromStats(t.name,a),r(null,t)})}}function uce(t,e,r){e.fs.readdir(t,(s,a)=>{if(s!==null){AQ(r,s);return}let n=a.map(c=>{let f=lce.joinPathSegments(t,c,e.pathSegmentSeparator);return p=>{hXe.stat(f,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let C={name:c,path:f,dirent:ace.fs.createDirentFromStats(c,E)};e.stats&&(C.stats=E),p(null,C)})}});oce(n,(c,f)=>{if(c!==null){AQ(r,c);return}E3(r,f)})})}d0.readdir=uce;function AQ(t,e){t(e)}function E3(t,e){t(null,e)}});var dce=_(m0=>{"use strict";Object.defineProperty(m0,"__esModule",{value:!0});m0.readdir=m0.readdirWithFileTypes=m0.read=void 0;var yXe=Xd(),EXe=g3(),Ace=m3(),pce=y3();function IXe(t,e){return!e.stats&&EXe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?hce(t,e):gce(t,e)}m0.read=IXe;function hce(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(s=>{let a={dirent:s,name:s.name,path:pce.joinPathSegments(t,s.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=Ace.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}m0.readdirWithFileTypes=hce;function gce(t,e){return e.fs.readdirSync(t).map(s=>{let a=pce.joinPathSegments(t,s,e.pathSegmentSeparator),n=yXe.statSync(a,e.fsStatSettings),c={name:s,path:a,dirent:Ace.fs.createDirentFromStats(s,n)};return e.stats&&(c.stats=n),c})}m0.readdir=gce});var mce=_(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});y0.createFileSystemAdapter=y0.FILE_SYSTEM_ADAPTER=void 0;var XE=Ie("fs");y0.FILE_SYSTEM_ADAPTER={lstat:XE.lstat,stat:XE.stat,lstatSync:XE.lstatSync,statSync:XE.statSync,readdir:XE.readdir,readdirSync:XE.readdirSync};function CXe(t){return t===void 0?y0.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},y0.FILE_SYSTEM_ADAPTER),t)}y0.createFileSystemAdapter=CXe});var yce=_(C3=>{"use strict";Object.defineProperty(C3,"__esModule",{value:!0});var wXe=Ie("path"),BXe=Xd(),vXe=mce(),I3=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=vXe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,wXe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new BXe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};C3.default=I3});var pQ=_(E0=>{"use strict";Object.defineProperty(E0,"__esModule",{value:!0});E0.Settings=E0.scandirSync=E0.scandir=void 0;var Ece=fce(),SXe=dce(),w3=yce();E0.Settings=w3.default;function DXe(t,e,r){if(typeof e=="function"){Ece.read(t,B3(),e);return}Ece.read(t,B3(e),r)}E0.scandir=DXe;function PXe(t,e){let r=B3(e);return SXe.read(t,r)}E0.scandirSync=PXe;function B3(t={}){return t instanceof w3.default?t:new w3.default(t)}});var Cce=_((uLt,Ice)=>{"use strict";function bXe(t){var e=new t,r=e;function s(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:s,release:a}}Ice.exports=bXe});var Bce=_((fLt,v3)=>{"use strict";var xXe=Cce();function wce(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),!(r>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");var s=xXe(kXe),a=null,n=null,c=0,f=null,p={push:T,drain:kc,saturated:kc,pause:E,paused:!1,get concurrency(){return r},set concurrency(ue){if(!(ue>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");if(r=ue,!p.paused)for(;a&&c=r||p.paused?n?(n.next=me,n=me):(a=me,n=me,p.saturated()):(c++,e.call(t,me.value,me.worked))}function N(ue,le){var me=s.get();me.context=t,me.release=U,me.value=ue,me.callback=le||kc,me.errorHandler=f,c>=r||p.paused?a?(me.next=a,a=me):(a=me,n=me,p.saturated()):(c++,e.call(t,me.value,me.worked))}function U(ue){ue&&s.release(ue);var le=a;le&&c<=r?p.paused?c--:(n===a&&(n=null),a=le.next,le.next=null,e.call(t,le.value,le.worked),n===null&&p.empty()):--c===0&&p.drain()}function W(){a=null,n=null,p.drain=kc}function ee(){a=null,n=null,p.drain(),p.drain=kc}function ie(ue){f=ue}}function kc(){}function kXe(){this.value=null,this.callback=kc,this.next=null,this.release=kc,this.context=null,this.errorHandler=null;var t=this;this.worked=function(r,s){var a=t.callback,n=t.errorHandler,c=t.value;t.value=null,t.callback=kc,t.errorHandler&&n(r,c),a.call(t.context,r,s),t.release(t)}}function QXe(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);function s(E,C){e.call(this,E).then(function(S){C(null,S)},C)}var a=wce(t,s,r),n=a.push,c=a.unshift;return a.push=f,a.unshift=p,a.drained=h,a;function f(E){var C=new Promise(function(S,b){n(E,function(I,T){if(I){b(I);return}S(T)})});return C.catch(kc),C}function p(E){var C=new Promise(function(S,b){c(E,function(I,T){if(I){b(I);return}S(T)})});return C.catch(kc),C}function h(){if(a.idle())return new Promise(function(S){S()});var E=a.drain,C=new Promise(function(S){a.drain=function(){E(),S()}});return C}}v3.exports=wce;v3.exports.promise=QXe});var hQ=_(zf=>{"use strict";Object.defineProperty(zf,"__esModule",{value:!0});zf.joinPathSegments=zf.replacePathSegmentSeparator=zf.isAppliedFilter=zf.isFatalError=void 0;function RXe(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}zf.isFatalError=RXe;function TXe(t,e){return t===null||t(e)}zf.isAppliedFilter=TXe;function FXe(t,e){return t.split(/[/\\]/).join(e)}zf.replacePathSegmentSeparator=FXe;function NXe(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}zf.joinPathSegments=NXe});var P3=_(D3=>{"use strict";Object.defineProperty(D3,"__esModule",{value:!0});var OXe=hQ(),S3=class{constructor(e,r){this._root=e,this._settings=r,this._root=OXe.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};D3.default=S3});var k3=_(x3=>{"use strict";Object.defineProperty(x3,"__esModule",{value:!0});var LXe=Ie("events"),MXe=pQ(),UXe=Bce(),gQ=hQ(),_Xe=P3(),b3=class extends _Xe.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=MXe.scandir,this._emitter=new LXe.EventEmitter,this._queue=UXe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let s={directory:e,base:r};this._queue.push(s,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(s,a)=>{if(s!==null){r(s,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!gQ.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let s=e.path;r!==void 0&&(e.path=gQ.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),gQ.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&gQ.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(s,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};x3.default=b3});var vce=_(R3=>{"use strict";Object.defineProperty(R3,"__esModule",{value:!0});var HXe=k3(),Q3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new HXe.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{jXe(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{GXe(e,this._storage)}),this._reader.read()}};R3.default=Q3;function jXe(t,e){t(e)}function GXe(t,e){t(null,e)}});var Sce=_(F3=>{"use strict";Object.defineProperty(F3,"__esModule",{value:!0});var qXe=Ie("stream"),WXe=k3(),T3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new WXe.default(this._root,this._settings),this._stream=new qXe.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};F3.default=T3});var Dce=_(O3=>{"use strict";Object.defineProperty(O3,"__esModule",{value:!0});var YXe=pQ(),dQ=hQ(),VXe=P3(),N3=class extends VXe.default{constructor(){super(...arguments),this._scandir=YXe.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let s=this._scandir(e,this._settings.fsScandirSettings);for(let a of s)this._handleEntry(a,r)}catch(s){this._handleError(s)}}_handleError(e){if(dQ.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let s=e.path;r!==void 0&&(e.path=dQ.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),dQ.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&dQ.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(s,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};O3.default=N3});var Pce=_(M3=>{"use strict";Object.defineProperty(M3,"__esModule",{value:!0});var JXe=Dce(),L3=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new JXe.default(this._root,this._settings)}read(){return this._reader.read()}};M3.default=L3});var bce=_(_3=>{"use strict";Object.defineProperty(_3,"__esModule",{value:!0});var KXe=Ie("path"),zXe=pQ(),U3=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,KXe.sep),this.fsScandirSettings=new zXe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};_3.default=U3});var yQ=_(Zf=>{"use strict";Object.defineProperty(Zf,"__esModule",{value:!0});Zf.Settings=Zf.walkStream=Zf.walkSync=Zf.walk=void 0;var xce=vce(),ZXe=Sce(),XXe=Pce(),H3=bce();Zf.Settings=H3.default;function $Xe(t,e,r){if(typeof e=="function"){new xce.default(t,mQ()).read(e);return}new xce.default(t,mQ(e)).read(r)}Zf.walk=$Xe;function e$e(t,e){let r=mQ(e);return new XXe.default(t,r).read()}Zf.walkSync=e$e;function t$e(t,e){let r=mQ(e);return new ZXe.default(t,r).read()}Zf.walkStream=t$e;function mQ(t={}){return t instanceof H3.default?t:new H3.default(t)}});var EQ=_(G3=>{"use strict";Object.defineProperty(G3,"__esModule",{value:!0});var r$e=Ie("path"),n$e=Xd(),kce=xp(),j3=class{constructor(e){this._settings=e,this._fsStatSettings=new n$e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return r$e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let s={name:r,path:r,dirent:kce.fs.createDirentFromStats(r,e)};return this._settings.stats&&(s.stats=e),s}_isFatalError(e){return!kce.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};G3.default=j3});var Y3=_(W3=>{"use strict";Object.defineProperty(W3,"__esModule",{value:!0});var i$e=Ie("stream"),s$e=Xd(),o$e=yQ(),a$e=EQ(),q3=class extends a$e.default{constructor(){super(...arguments),this._walkStream=o$e.walkStream,this._stat=s$e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let s=e.map(this._getFullEntryPath,this),a=new i$e.PassThrough({objectMode:!0});a._write=(n,c,f)=>this._getEntry(s[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===s.length-1&&a.end(),f()}).catch(f);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(s.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,s)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):s(a))})}};W3.default=q3});var Qce=_(J3=>{"use strict";Object.defineProperty(J3,"__esModule",{value:!0});var l$e=yQ(),c$e=EQ(),u$e=Y3(),V3=class extends c$e.default{constructor(){super(...arguments),this._walkAsync=l$e.walk,this._readerStream=new u$e.default(this._settings)}dynamic(e,r){return new Promise((s,a)=>{this._walkAsync(e,r,(n,c)=>{n===null?s(c):a(n)})})}async static(e,r){let s=[],a=this._readerStream.static(e,r);return new Promise((n,c)=>{a.once("error",c),a.on("data",f=>s.push(f)),a.once("end",()=>n(s))})}};J3.default=V3});var Rce=_(z3=>{"use strict";Object.defineProperty(z3,"__esModule",{value:!0});var NB=xp(),K3=class{constructor(e,r,s){this._patterns=e,this._settings=r,this._micromatchOptions=s,this._storage=[],this._fillStorage()}_fillStorage(){for(let e of this._patterns){let r=this._getPatternSegments(e),s=this._splitSegmentsIntoSections(r);this._storage.push({complete:s.length<=1,pattern:e,segments:r,sections:s})}}_getPatternSegments(e){return NB.pattern.getPatternParts(e,this._micromatchOptions).map(s=>NB.pattern.isDynamicPattern(s,this._settings)?{dynamic:!0,pattern:s,patternRe:NB.pattern.makeRe(s,this._micromatchOptions)}:{dynamic:!1,pattern:s})}_splitSegmentsIntoSections(e){return NB.array.splitWhen(e,r=>r.dynamic&&NB.pattern.hasGlobStar(r.pattern))}};z3.default=K3});var Tce=_(X3=>{"use strict";Object.defineProperty(X3,"__esModule",{value:!0});var f$e=Rce(),Z3=class extends f$e.default{match(e){let r=e.split("/"),s=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>s);for(let n of a){let c=n.sections[0];if(!n.complete&&s>c.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};X3.default=Z3});var Fce=_(e8=>{"use strict";Object.defineProperty(e8,"__esModule",{value:!0});var IQ=xp(),A$e=Tce(),$3=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,s){let a=this._getMatcher(r),n=this._getNegativePatternsRe(s);return c=>this._filter(e,c,a,n)}_getMatcher(e){return new A$e.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(IQ.pattern.isAffectDepthOfReadingPattern);return IQ.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,s,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=IQ.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,s)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let s=r.split("/").length;if(e==="")return s;let a=e.split("/").length;return s-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!IQ.pattern.matchAny(e,r)}};e8.default=$3});var Nce=_(r8=>{"use strict";Object.defineProperty(r8,"__esModule",{value:!0});var $d=xp(),t8=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let s=$d.pattern.convertPatternsToRe(e,this._micromatchOptions),a=$d.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,s,a)}_filter(e,r,s){let a=$d.path.removeLeadingDotSegment(e.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(a,s))return!1;let n=e.dirent.isDirectory(),c=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,s,n);return this._settings.unique&&c&&this._createIndexRecord(a),c}_isDuplicateEntry(e){return this.index.has(e)}_createIndexRecord(e){this.index.set(e,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let s=$d.path.makeAbsolute(this._settings.cwd,e);return $d.pattern.matchAny(s,r)}_isMatchToPatterns(e,r,s){let a=$d.pattern.matchAny(e,r);return!a&&s?$d.pattern.matchAny(e+"/",r):a}};r8.default=t8});var Oce=_(i8=>{"use strict";Object.defineProperty(i8,"__esModule",{value:!0});var p$e=xp(),n8=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return p$e.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};i8.default=n8});var Mce=_(o8=>{"use strict";Object.defineProperty(o8,"__esModule",{value:!0});var Lce=xp(),s8=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Lce.path.makeAbsolute(this._settings.cwd,r),r=Lce.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};o8.default=s8});var CQ=_(l8=>{"use strict";Object.defineProperty(l8,"__esModule",{value:!0});var h$e=Ie("path"),g$e=Fce(),d$e=Nce(),m$e=Oce(),y$e=Mce(),a8=class{constructor(e){this._settings=e,this.errorFilter=new m$e.default(this._settings),this.entryFilter=new d$e.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new g$e.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new y$e.default(this._settings)}_getRootDirectory(e){return h$e.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};l8.default=a8});var Uce=_(u8=>{"use strict";Object.defineProperty(u8,"__esModule",{value:!0});var E$e=Qce(),I$e=CQ(),c8=class extends I$e.default{constructor(){super(...arguments),this._reader=new E$e.default(this._settings)}async read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e);return(await this.api(r,e,s)).map(n=>s.transform(n))}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};u8.default=c8});var _ce=_(A8=>{"use strict";Object.defineProperty(A8,"__esModule",{value:!0});var C$e=Ie("stream"),w$e=Y3(),B$e=CQ(),f8=class extends B$e.default{constructor(){super(...arguments),this._reader=new w$e.default(this._settings)}read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e),a=this.api(r,e,s),n=new C$e.Readable({objectMode:!0,read:()=>{}});return a.once("error",c=>n.emit("error",c)).on("data",c=>n.emit("data",s.transform(c))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};A8.default=f8});var Hce=_(h8=>{"use strict";Object.defineProperty(h8,"__esModule",{value:!0});var v$e=Xd(),S$e=yQ(),D$e=EQ(),p8=class extends D$e.default{constructor(){super(...arguments),this._walkSync=S$e.walkSync,this._statSync=v$e.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let s=[];for(let a of e){let n=this._getFullEntryPath(a),c=this._getEntry(n,a,r);c===null||!r.entryFilter(c)||s.push(c)}return s}_getEntry(e,r,s){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(s.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};h8.default=p8});var jce=_(d8=>{"use strict";Object.defineProperty(d8,"__esModule",{value:!0});var P$e=Hce(),b$e=CQ(),g8=class extends b$e.default{constructor(){super(...arguments),this._reader=new P$e.default(this._settings)}read(e){let r=this._getRootDirectory(e),s=this._getReaderOptions(e);return this.api(r,e,s).map(s.transform)}api(e,r,s){return r.dynamic?this._reader.dynamic(e,s):this._reader.static(r.patterns,s)}};d8.default=g8});var Gce=_(eI=>{"use strict";Object.defineProperty(eI,"__esModule",{value:!0});eI.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var $E=Ie("fs"),x$e=Ie("os"),k$e=Math.max(x$e.cpus().length,1);eI.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:$E.lstat,lstatSync:$E.lstatSync,stat:$E.stat,statSync:$E.statSync,readdir:$E.readdir,readdirSync:$E.readdirSync};var m8=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,k$e),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0),this.ignore=[].concat(this.ignore)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},eI.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};eI.default=m8});var wQ=_((OLt,Wce)=>{"use strict";var qce=Wle(),Q$e=Uce(),R$e=_ce(),T$e=jce(),y8=Gce(),Qc=xp();async function E8(t,e){ju(t);let r=I8(t,Q$e.default,e),s=await Promise.all(r);return Qc.array.flatten(s)}(function(t){t.glob=t,t.globSync=e,t.globStream=r,t.async=t;function e(h,E){ju(h);let C=I8(h,T$e.default,E);return Qc.array.flatten(C)}t.sync=e;function r(h,E){ju(h);let C=I8(h,R$e.default,E);return Qc.stream.merge(C)}t.stream=r;function s(h,E){ju(h);let C=[].concat(h),S=new y8.default(E);return qce.generate(C,S)}t.generateTasks=s;function a(h,E){ju(h);let C=new y8.default(E);return Qc.pattern.isDynamicPattern(h,C)}t.isDynamicPattern=a;function n(h){return ju(h),Qc.path.escape(h)}t.escapePath=n;function c(h){return ju(h),Qc.path.convertPathToPattern(h)}t.convertPathToPattern=c;let f;(function(h){function E(S){return ju(S),Qc.path.escapePosixPath(S)}h.escapePath=E;function C(S){return ju(S),Qc.path.convertPosixPathToPattern(S)}h.convertPathToPattern=C})(f=t.posix||(t.posix={}));let p;(function(h){function E(S){return ju(S),Qc.path.escapeWindowsPath(S)}h.escapePath=E;function C(S){return ju(S),Qc.path.convertWindowsPathToPattern(S)}h.convertPathToPattern=C})(p=t.win32||(t.win32={}))})(E8||(E8={}));function I8(t,e,r){let s=[].concat(t),a=new y8.default(r),n=qce.generate(s,a),c=new e(a);return n.map(c.read,c)}function ju(t){if(![].concat(t).every(s=>Qc.string.isString(s)&&!Qc.string.isEmpty(s)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}Wce.exports=E8});var Nn={};Vt(Nn,{checksumFile:()=>vQ,checksumPattern:()=>SQ,makeHash:()=>cs});function cs(...t){let e=(0,BQ.createHash)("sha512"),r="";for(let s of t)typeof s=="string"?r+=s:s&&(r&&(e.update(r),r=""),e.update(s));return r&&e.update(r),e.digest("hex")}async function vQ(t,{baseFs:e,algorithm:r}={baseFs:ce,algorithm:"sha512"}){let s=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),c=(0,BQ.createHash)(r),f=0;for(;(f=await e.readPromise(s,n,0,65536))!==0;)c.update(f===65536?n:n.slice(0,f));return c.digest("hex")}finally{await e.closePromise(s)}}async function SQ(t,{cwd:e}){let s=(await(0,C8.default)(t,{cwd:fe.fromPortablePath(e),onlyDirectories:!0})).map(f=>`${f}/**/*`),a=await(0,C8.default)([t,...s],{cwd:fe.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async f=>{let p=[Buffer.from(f)],h=J.join(e,fe.toPortablePath(f)),E=await ce.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ce.readlinkPromise(h))):E.isFile()&&p.push(await ce.readFilePromise(h)),p.join("\0")})),c=(0,BQ.createHash)("sha512");for(let f of n)c.update(f);return c.digest("hex")}var BQ,C8,I0=Ze(()=>{Dt();BQ=Ie("crypto"),C8=ut(wQ())});var G={};Vt(G,{allPeerRequests:()=>qB,areDescriptorsEqual:()=>zce,areIdentsEqual:()=>UB,areLocatorsEqual:()=>_B,areVirtualPackagesEquivalent:()=>j$e,bindDescriptor:()=>_$e,bindLocator:()=>H$e,convertDescriptorToLocator:()=>DQ,convertLocatorToDescriptor:()=>B8,convertPackageToLocator:()=>L$e,convertToIdent:()=>O$e,convertToManifestRange:()=>X$e,copyPackage:()=>LB,devirtualizeDescriptor:()=>MB,devirtualizeLocator:()=>rI,ensureDevirtualizedDescriptor:()=>M$e,ensureDevirtualizedLocator:()=>U$e,getIdentVendorPath:()=>P8,isPackageCompatible:()=>QQ,isVirtualDescriptor:()=>kp,isVirtualLocator:()=>Gu,makeDescriptor:()=>On,makeIdent:()=>Da,makeLocator:()=>Ws,makeRange:()=>xQ,parseDescriptor:()=>C0,parseFileStyleRange:()=>z$e,parseIdent:()=>Sa,parseLocator:()=>Qp,parseRange:()=>em,prettyDependent:()=>$4,prettyDescriptor:()=>ni,prettyIdent:()=>Xi,prettyLocator:()=>Yr,prettyLocatorNoColors:()=>X4,prettyRange:()=>iI,prettyReference:()=>jB,prettyResolution:()=>FB,prettyWorkspace:()=>GB,renamePackage:()=>v8,slugifyIdent:()=>w8,slugifyLocator:()=>nI,sortDescriptors:()=>sI,stringifyDescriptor:()=>al,stringifyIdent:()=>un,stringifyLocator:()=>ll,tryParseDescriptor:()=>HB,tryParseIdent:()=>Zce,tryParseLocator:()=>bQ,tryParseRange:()=>K$e,unwrapIdentFromScope:()=>eet,virtualizeDescriptor:()=>S8,virtualizePackage:()=>D8,wrapIdentIntoScope:()=>$$e});function Da(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:cs(t,e),scope:t,name:e}}function On(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:cs(t.identHash,e),range:e}}function Ws(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:cs(t.identHash,e),reference:e}}function O$e(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function DQ(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function B8(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function L$e(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function v8(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function LB(t){return v8(t,t)}function S8(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return On(t,`virtual:${e}#${t.range}`)}function D8(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return v8(t,Ws(t,`virtual:${e}#${t.reference}`))}function kp(t){return t.range.startsWith(OB)}function Gu(t){return t.reference.startsWith(OB)}function MB(t){if(!kp(t))throw new Error("Not a virtual descriptor");return On(t,t.range.replace(PQ,""))}function rI(t){if(!Gu(t))throw new Error("Not a virtual descriptor");return Ws(t,t.reference.replace(PQ,""))}function M$e(t){return kp(t)?On(t,t.range.replace(PQ,"")):t}function U$e(t){return Gu(t)?Ws(t,t.reference.replace(PQ,"")):t}function _$e(t,e){return t.range.includes("::")?t:On(t,`${t.range}::${tI.default.stringify(e)}`)}function H$e(t,e){return t.reference.includes("::")?t:Ws(t,`${t.reference}::${tI.default.stringify(e)}`)}function UB(t,e){return t.identHash===e.identHash}function zce(t,e){return t.descriptorHash===e.descriptorHash}function _B(t,e){return t.locatorHash===e.locatorHash}function j$e(t,e){if(!Gu(t))throw new Error("Invalid package type");if(!Gu(e))throw new Error("Invalid package type");if(!UB(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let s=e.dependencies.get(r.identHash);if(!s||!zce(r,s))return!1}return!0}function Sa(t){let e=Zce(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function Zce(t){let e=t.match(G$e);if(!e)return null;let[,r,s]=e;return Da(typeof r<"u"?r:null,s)}function C0(t,e=!1){let r=HB(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function HB(t,e=!1){let r=e?t.match(q$e):t.match(W$e);if(!r)return null;let[,s,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let c=typeof s<"u"?s:null,f=typeof n<"u"?n:"unknown";return On(Da(c,a),f)}function Qp(t,e=!1){let r=bQ(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function bQ(t,e=!1){let r=e?t.match(Y$e):t.match(V$e);if(!r)return null;let[,s,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let c=typeof s<"u"?s:null,f=typeof n<"u"?n:"unknown";return Ws(Da(c,a),f)}function em(t,e){let r=t.match(J$e);if(r===null)throw new Error(`Invalid range (${t})`);let s=typeof r[1]<"u"?r[1]:null;if(typeof e?.requireProtocol=="string"&&s!==e.requireProtocol)throw new Error(`Invalid protocol (${s})`);if(e?.requireProtocol&&s===null)throw new Error(`Missing protocol (${s})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),c=e?.parseSelector?tI.default.parse(n):n,f=typeof r[4]<"u"?tI.default.parse(r[4]):null;return{protocol:s,source:a,selector:c,params:f}}function K$e(t,e){try{return em(t,e)}catch{return null}}function z$e(t,{protocol:e}){let{selector:r,params:s}=em(t,{requireProtocol:e,requireBindings:!0});if(typeof s.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Qp(s.locator,!0),path:r}}function Yce(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A"),t=t.replaceAll("#","%23"),t}function Z$e(t){return t===null?!1:Object.entries(t).length>0}function xQ({protocol:t,source:e,selector:r,params:s}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${Yce(e)}#`),a+=Yce(r),Z$e(s)&&(a+=`::${tI.default.stringify(s)}`),a}function X$e(t){let{params:e,protocol:r,source:s,selector:a}=em(t);for(let n in e)n.startsWith("__")&&delete e[n];return xQ({protocol:r,source:s,params:e,selector:a})}function un(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function $$e(t,e){return t.scope?Da(e,`${t.scope}__${t.name}`):Da(e,t.name)}function eet(t,e){if(t.scope!==e)return t;let r=t.name.indexOf("__");if(r===-1)return Da(null,t.name);let s=t.name.slice(0,r),a=t.name.slice(r+2);return Da(s,a)}function al(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function ll(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function w8(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function nI(t){let{protocol:e,selector:r}=em(t.reference),s=e!==null?e.replace(tet,""):"exotic",a=Vce.default.valid(r),n=a!==null?`${s}-${a}`:`${s}`,c=10;return t.scope?`${w8(t)}-${n}-${t.locatorHash.slice(0,c)}`:`${w8(t)}-${n}-${t.locatorHash.slice(0,c)}`}function Xi(t,e){return e.scope?`${Ht(t,`@${e.scope}/`,ht.SCOPE)}${Ht(t,e.name,ht.NAME)}`:`${Ht(t,e.name,ht.NAME)}`}function kQ(t){if(t.startsWith(OB)){let e=kQ(t.substring(t.indexOf("#")+1)),r=t.substring(OB.length,OB.length+F$e);return`${e} [${r}]`}else return t.replace(ret,"?[...]")}function iI(t,e){return`${Ht(t,kQ(e),ht.RANGE)}`}function ni(t,e){return`${Xi(t,e)}${Ht(t,"@",ht.RANGE)}${iI(t,e.range)}`}function jB(t,e){return`${Ht(t,kQ(e),ht.REFERENCE)}`}function Yr(t,e){return`${Xi(t,e)}${Ht(t,"@",ht.REFERENCE)}${jB(t,e.reference)}`}function X4(t){return`${un(t)}@${kQ(t.reference)}`}function sI(t){return qs(t,[e=>un(e),e=>e.range])}function GB(t,e){return Xi(t,e.anchoredLocator)}function FB(t,e,r){let s=kp(e)?MB(e):e;return r===null?`${ni(t,s)} \u2192 ${Z4(t).Cross}`:s.identHash===r.identHash?`${ni(t,s)} \u2192 ${jB(t,r.reference)}`:`${ni(t,s)} \u2192 ${Yr(t,r)}`}function $4(t,e,r){return r===null?`${Yr(t,e)}`:`${Yr(t,e)} (via ${iI(t,r.range)})`}function P8(t){return`node_modules/${un(t)}`}function QQ(t,e){return t.conditions?N$e(t.conditions,r=>{let[,s,a]=r.match(Kce),n=e[s];return n?n.includes(a):!0}):!0}function qB(t){let e=new Set;if("children"in t)e.add(t);else for(let r of t.requests.values())e.add(r);for(let r of e)for(let s of r.children.values())e.add(s);return e}var tI,Vce,Jce,OB,F$e,Kce,N$e,PQ,G$e,q$e,W$e,Y$e,V$e,J$e,tet,ret,Wo=Ze(()=>{tI=ut(Ie("querystring")),Vce=ut(Ai()),Jce=ut(dse());xc();I0();bc();Wo();OB="virtual:",F$e=5,Kce=/(os|cpu|libc)=([a-z0-9_-]+)/,N$e=(0,Jce.makeParser)(Kce);PQ=/^[^#]*#/;G$e=/^(?:@([^/]+?)\/)?([^@/]+)$/;q$e=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,W$e=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;Y$e=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,V$e=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;J$e=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;tet=/:$/;ret=/\?.*/});var Xce,$ce=Ze(()=>{Wo();Xce={hooks:{reduceDependency:(t,e,r,s,{resolver:a,resolveOptions:n})=>{for(let{pattern:c,reference:f}of e.topLevelWorkspace.manifest.resolutions){if(c.from&&(c.from.fullName!==un(r)||e.configuration.normalizeLocator(Ws(Sa(c.from.fullName),c.from.description??r.reference)).locatorHash!==r.locatorHash)||c.descriptor.fullName!==un(t)||e.configuration.normalizeDependency(On(Qp(c.descriptor.fullName),c.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(On(t,f)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let s=GB(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${s}: ${n}`),reportError:(a,n)=>e.reportError(a,`${s}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let s of r.errors)e.reportWarning(57,s.message)}}}});var Ei,tm=Ze(()=>{Ei=class t{static{this.protocol="workspace:"}supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){return[s.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let s=r.project.getWorkspaceByCwd(e.reference.slice(t.protocol.length));return{...e,version:s.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...s.manifest.dependencies,...s.manifest.devDependencies])),peerDependencies:new Map([...s.manifest.peerDependencies]),dependenciesMeta:s.manifest.dependenciesMeta,peerDependenciesMeta:s.manifest.peerDependenciesMeta,bin:s.manifest.bin}}}});var Fr={};Vt(Fr,{SemVer:()=>iue.SemVer,clean:()=>iet,getComparator:()=>rue,mergeComparators:()=>b8,satisfiesWithPrereleases:()=>Xf,simplifyRanges:()=>x8,stringifyComparator:()=>nue,validRange:()=>cl});function Xf(t,e,r=!1){if(!t)return!1;let s=`${e}${r}`,a=eue.get(s);if(typeof a>"u")try{a=new Rp.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{eue.set(s,a||null)}else if(a===null)return!1;let n;try{n=new Rp.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(c=>{for(let f of c)f.semver.prerelease&&(f.semver.prerelease=[]);return c.every(f=>f.test(n))}))}function cl(t){if(t.indexOf(":")!==-1)return null;let e=tue.get(t);if(typeof e<"u")return e;try{e=new Rp.default.Range(t)}catch{e=null}return tue.set(t,e),e}function iet(t){let e=net.exec(t);return e?e[1]:null}function rue(t){if(t.semver===Rp.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case"":return{gt:[">=",t.semver],lt:["<=",t.semver]};case">":case">=":return{gt:[t.operator,t.semver],lt:null};case"<":case"<=":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function b8(t){if(t.length===0)return null;let e=null,r=null;for(let s of t){if(s.gt){let a=e!==null?Rp.default.compare(s.gt[1],e[1]):null;(a===null||a>0||a===0&&s.gt[0]===">")&&(e=s.gt)}if(s.lt){let a=r!==null?Rp.default.compare(s.lt[1],r[1]):null;(a===null||a<0||a===0&&s.lt[0]==="<")&&(r=s.lt)}}if(e&&r){let s=Rp.default.compare(e[1],r[1]);if(s===0&&(e[0]===">"||r[0]==="<")||s>0)return null}return{gt:e,lt:r}}function nue(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===">="&&t.lt[0]==="<"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(" "):"*"}function x8(t){let e=t.map(set).map(s=>cl(s).set.map(a=>a.map(n=>rue(n)))),r=e.shift().map(s=>b8(s)).filter(s=>s!==null);for(let s of e){let a=[];for(let n of r)for(let c of s){let f=b8([n,...c]);f!==null&&a.push(f)}r=a}return r.length===0?null:r.map(s=>nue(s)).join(" || ")}function set(t){let e=t.split("||");if(e.length>1){let r=new Set;for(let s of e)e.some(a=>a!==s&&Rp.default.subset(s,a))||r.add(s);if(r.size{Rp=ut(Ai()),iue=ut(Ai()),eue=new Map;tue=new Map;net=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function sue(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function oue(t){return t.charCodeAt(0)===65279?t.slice(1):t}function Pa(t){return t.replace(/\\/g,"/")}function RQ(t,{yamlCompatibilityMode:e}){return e?q4(t):typeof t>"u"||typeof t=="boolean"?t:null}function aue(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let s=r%2===0?"":"!",a=e.slice(r);return`${s}${t}=${a}`}function k8(t,e){return e.length===1?aue(t,e[0]):`(${e.map(r=>aue(t,r)).join(" | ")})`}var lue,Ut,oI=Ze(()=>{Dt();wc();lue=ut(Ai());tm();bc();Tp();Wo();Ut=class t{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static{this.fileName="package.json"}static{this.allDependencies=["dependencies","devDependencies","peerDependencies"]}static{this.hardDependencies=["dependencies","devDependencies"]}static async tryFind(e,{baseFs:r=new Yn}={}){let s=J.join(e,"package.json");try{return await t.fromFile(s,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let s=await t.tryFind(e,{baseFs:r});if(s===null)throw new Error("Manifest not found");return s}static async fromFile(e,{baseFs:r=new Yn}={}){let s=new t;return await s.loadFile(e,{baseFs:r}),s}static fromText(e){let r=new t;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(oue(e)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(r),this.indent=sue(e)}async loadFile(e,{baseFs:r=new Yn}){let s=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(oue(s)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=sue(s)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let s=[];if(this.name=null,typeof e.name=="string")try{this.name=Sa(e.name)}catch{s.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let c of e.os)typeof c!="string"?s.push(new Error("Parsing failed for the 'os' field")):n.push(c)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let c of e.cpu)typeof c!="string"?s.push(new Error("Parsing failed for the 'cpu' field")):n.push(c)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let c of e.libc)typeof c!="string"?s.push(new Error("Parsing failed for the 'libc' field")):n.push(c)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=Pa(e.main):this.main=null,typeof e.module=="string"?this.module=Pa(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=Pa(e.browser);else{this.browser=new Map;for(let[n,c]of Object.entries(e.browser))this.browser.set(Pa(n),typeof c=="string"?Pa(c):c)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")e.bin.trim()===""?s.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,Pa(e.bin)):s.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,c]of Object.entries(e.bin)){if(typeof c!="string"||c.trim()===""){s.push(new Error(`Invalid bin definition for '${n}'`));continue}let f=Sa(n);this.bin.set(f.name,Pa(c))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,c]of Object.entries(e.scripts)){if(typeof c!="string"){s.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,c)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,c]of Object.entries(e.dependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,c]of Object.entries(e.devDependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,c]of Object.entries(e.peerDependencies)){let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof c!="string"||!c.startsWith(Ei.protocol)&&!cl(c))&&(s.push(new Error(`Invalid dependency range for '${n}'`)),c="*");let p=On(f,c);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&s.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){s.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,c]of Object.entries(e.dependenciesMeta)){if(typeof c!="object"||c===null){s.push(new Error(`Invalid meta field for '${n}`));continue}let f=C0(n),p=this.ensureDependencyMeta(f),h=RQ(c.built,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=RQ(c.optional,{yamlCompatibilityMode:r});if(E===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}let C=RQ(c.unplugged,{yamlCompatibilityMode:r});if(C===null){s.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:C})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,c]of Object.entries(e.peerDependenciesMeta)){if(typeof c!="object"||c===null){s.push(new Error(`Invalid meta field for '${n}'`));continue}let f=C0(n),p=this.ensurePeerDependencyMeta(f),h=RQ(c.optional,{yamlCompatibilityMode:r});if(h===null){s.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,c]of Object.entries(e.resolutions)){if(typeof c!="string"){s.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:px(n),reference:c})}catch(f){s.push(f);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){s.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=Pa(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=Pa(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=Pa(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,c]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(Pa(n),typeof c=="string"?Pa(c):c)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.provenance=="boolean"&&(this.publishConfig.provenance=e.publishConfig.provenance),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,Pa(e.publishConfig.bin)]]):s.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,c]of Object.entries(e.publishConfig.bin)){if(typeof c!="string"){s.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,Pa(c))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){s.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(Pa(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:s.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:s.push(new Error("Invalid selfReferences definition, must be a boolean value")):s.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,c]of Object.entries(e.optionalDependencies)){if(typeof c!="string"){s.push(new Error(`Invalid dependency range for '${n}'`));continue}let f;try{f=Sa(n)}catch{s.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=On(f,c);this.dependencies.set(p.identHash,p);let h=On(f,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=s}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(k8("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(k8("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(k8("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!lue.default.valid(e.range))throw new Error(`Invalid meta field range for '${al(e)}'`);let r=un(e),s=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(s);return n||a.set(s,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${al(e)}'`);let r=un(e),s=this.peerDependenciesMeta.get(r);return s||this.peerDependenciesMeta.set(r,s={}),s}setRawField(e,r,{after:s=[]}={}){let a=new Set(s.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,c=this.raw={},f=!1;for(let p of Object.keys(n))c[p]=n[p],f||(a.delete(p),a.size===0&&(c[e]=r,f=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=un(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(c=>({[c]:n.get(c)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let s=[],a=[];for(let n of this.dependencies.values()){let c=this.dependenciesMeta.get(un(n)),f=!1;if(r&&c){let p=c.get(null);p&&p.optional&&(f=!0)}f?a.push(n):s.push(n)}s.length>0?e.dependencies=Object.assign({},...sI(s).map(n=>({[un(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...sI(a).map(n=>({[un(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...sI(this.devDependencies.values()).map(n=>({[un(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...sI(this.peerDependencies.values()).map(n=>({[un(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,c]of qs(this.dependenciesMeta.entries(),([f,p])=>f))for(let[f,p]of qs(c.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=f!==null?al(On(Sa(n),f)):n,E={...p};r&&f===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...qs(this.peerDependenciesMeta.entries(),([n,c])=>n).map(([n,c])=>({[n]:c}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:c})=>({[hx(n)]:c}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,c]of this.scripts.entries())e.scripts[n]=c}else delete e.scripts;return e}}});function aet(t){return typeof t.reportCode<"u"}var cue,uue,oet,jt,Ao,Rc=Ze(()=>{ql();cue=Ie("stream"),uue=Ie("string_decoder"),oet=15,jt=class extends Error{constructor(r,s,a){super(s);this.reportExtra=a;this.reportCode=r}};Ao=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,s,a=new Promise(p=>{s=p}),n=p=>{let h=s;a=new Promise(E=>{s=E}),r=p,h()},c=(p=0)=>{n(r+1)},f=async function*(){for(;r{r=c}),a=k4(c=>{let f=r;s=new Promise(p=>{r=p}),e=c,f()},1e3/oet),n=async function*(){for(;;)await s,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let s=this.reportProgress(e);try{return await r(e)}finally{s.stop()}}startProgressSync(e,r){let s=this.reportProgress(e);try{return r(e)}finally{s.stop()}}reportInfoOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),s?.reportExtra?.(this))}reportWarningOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),s?.reportExtra?.(this))}reportErrorOnce(e,r,s){let a=s&&s.key?s.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),s?.reportExtra?.(this))}reportExceptionOnce(e){aet(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new cue.PassThrough,s=new uue.StringDecoder,a="";return r.on("data",n=>{let c=s.write(n),f;do if(f=c.indexOf(` `),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(f!==-1);a+=c}),r.on("end",()=>{let n=s.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var aI,Q8=Ze(()=>{Rc();Wo();aI=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let s=this.fetchers.find(a=>a.supports(e,r));return s||null}getFetcher(e,r){let s=this.fetchers.find(a=>a.supports(e,r));if(!s)throw new jt(11,`${Yr(r.project.configuration,e)} isn't supported by any available fetcher`);return s}}});var rm,R8=Ze(()=>{Wo();rm=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,s){return this.getResolverByDescriptor(e,s).bindDescriptor(e,r,s)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,s){return await this.getResolverByDescriptor(e,s).getCandidates(e,r,s)}async getSatisfying(e,r,s,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,s,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let s=this.resolvers.find(a=>a.supportsDescriptor(e,r));return s||null}getResolverByDescriptor(e,r){let s=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!s)throw new Error(`${ni(r.project.configuration,e)} isn't supported by any available resolver`);return s}tryResolverByLocator(e,r){let s=this.resolvers.find(a=>a.supportsLocator(e,r));return s||null}getResolverByLocator(e,r){let s=this.resolvers.find(a=>a.supportsLocator(e,r));if(!s)throw new Error(`${Yr(r.project.configuration,e)} isn't supported by any available resolver`);return s}}});var lI,T8=Ze(()=>{Dt();Wo();lI=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let s=e.reference.indexOf("#");if(s===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(s+1),n=Ws(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let s=e.reference.indexOf("#");if(s===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(s+1),n=Ws(e,a),c=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,c,r)}getLocatorFilename(e){return nI(e)}async ensureVirtualLink(e,r,s){let a=r.packageFs.getRealPath(),n=s.project.configuration.get("virtualFolder"),c=this.getLocatorFilename(e),f=uo.makeVirtualPath(n,c,a),p=new _f(f,{baseFs:r.packageFs,pathUtils:J});return{...r,packageFs:p}}}});var TQ,fue=Ze(()=>{TQ=class t{static{this.protocol="virtual:"}static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}supportsLocator(e,r){return t.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,s){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,s,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}});var cI,F8=Ze(()=>{Dt();tm();cI=class{supports(e){return!!e.reference.startsWith(Ei.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let s=this.getWorkspace(e,r).cwd;return{packageFs:new Sn(s),prefixPath:vt.dot,localPath:s}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Ei.protocol.length))}}});function WB(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Aue(t){return typeof t>"u"?3:WB(t)?0:Array.isArray(t)?1:2}function L8(t,e){return Object.hasOwn(t,e)}function uet(t){return WB(t)&&L8(t,"onConflict")&&typeof t.onConflict=="string"}function fet(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!uet(t))return{onConflict:"default",value:t};if(L8(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function pue(t,e){let r=WB(t)&&L8(t,e)?t[e]:void 0;return fet(r)}function uI(t,e){return[t,e,hue]}function M8(t){return Array.isArray(t)?t[2]===hue:!1}function N8(t,e){if(WB(t)){let r={};for(let s of Object.keys(t))r[s]=N8(t[s],e);return uI(e,r)}return Array.isArray(t)?uI(e,t.map(r=>N8(r,e))):uI(e,t)}function O8(t,e,r,s,a){let n,c=[],f=a,p=0;for(let E=a-1;E>=s;--E){let[C,S]=t[E],{onConflict:b,value:I}=pue(S,r),T=Aue(I);if(T!==3){if(n??=T,T!==n||b==="hardReset"){p=f;break}if(T===2)return uI(C,I);if(c.unshift([C,I]),b==="reset"){p=E;break}b==="extend"&&E===s&&(s=0),f=E}}if(typeof n>"u")return null;let h=c.map(([E])=>E).join(", ");switch(n){case 1:return uI(h,new Array().concat(...c.map(([E,C])=>C.map(S=>N8(S,E)))));case 0:{let E=Object.assign({},...c.map(([,T])=>T)),C=Object.keys(E),S={},b=t.map(([T,N])=>[T,pue(N,r).value]),I=cet(b,([T,N])=>{let U=Aue(N);return U!==0&&U!==3});if(I!==-1){let T=b.slice(I+1);for(let N of C)S[N]=O8(T,e,N,0,T.length)}else for(let T of C)S[T]=O8(b,e,T,p,b.length);return uI(h,S)}default:throw new Error("Assertion failed: Non-extendable value type")}}function gue(t){return O8(t.map(([e,r])=>[e,{".":r}]),[],".",0,t.length)}function YB(t){return M8(t)?t[1]:t}function FQ(t){let e=M8(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>FQ(r));if(WB(e)){let r={};for(let[s,a]of Object.entries(e))r[s]=FQ(a);return r}return e}function U8(t){return M8(t)?t[0]:null}var cet,hue,due=Ze(()=>{cet=(t,e,r)=>{let s=[...t];return s.reverse(),s.findIndex(e,r)};hue=Symbol()});var NQ={};Vt(NQ,{getDefaultGlobalFolder:()=>H8,getHomeFolder:()=>fI,isFolderInside:()=>j8});function H8(){if(process.platform==="win32"){let t=fe.toPortablePath(process.env.LOCALAPPDATA||fe.join((0,_8.homedir)(),"AppData","Local"));return J.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=fe.toPortablePath(process.env.XDG_DATA_HOME);return J.resolve(t,"yarn/berry")}return J.resolve(fI(),".yarn/berry")}function fI(){return fe.toPortablePath((0,_8.homedir)()||"/usr/local/share")}function j8(t,e){let r=J.relative(e,t);return r&&!r.startsWith("..")&&!J.isAbsolute(r)}var _8,OQ=Ze(()=>{Dt();_8=Ie("os")});var Eue=_((uMt,yue)=>{"use strict";var G8=Ie("https"),q8=Ie("http"),{URL:mue}=Ie("url"),W8=class extends q8.Agent{constructor(e){let{proxy:r,proxyRequestOptions:s,...a}=e;super(a),this.proxy=typeof r=="string"?new mue(r):r,this.proxyRequestOptions=s||{}}createConnection(e,r){let s={...this.proxyRequestOptions,method:"CONNECT",host:this.proxy.hostname,port:this.proxy.port,path:`${e.host}:${e.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?"keep-alive":"close",host:`${e.host}:${e.port}`},agent:!1,timeout:e.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||"")}:${decodeURIComponent(this.proxy.password||"")}`).toString("base64");s.headers["proxy-authorization"]=`Basic ${n}`}this.proxy.protocol==="https:"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol==="http:"?q8:G8).request(s);a.once("connect",(n,c,f)=>{a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200?r(null,c):(c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null))}),a.once("timeout",()=>{a.destroy(new Error("Proxy timeout"))}),a.once("error",n=>{a.removeAllListeners(),r(n,null)}),a.end()}},Y8=class extends G8.Agent{constructor(e){let{proxy:r,proxyRequestOptions:s,...a}=e;super(a),this.proxy=typeof r=="string"?new mue(r):r,this.proxyRequestOptions=s||{}}createConnection(e,r){let s={...this.proxyRequestOptions,method:"CONNECT",host:this.proxy.hostname,port:this.proxy.port,path:`${e.host}:${e.port}`,setHost:!1,headers:{...this.proxyRequestOptions.headers,connection:this.keepAlive?"keep-alive":"close",host:`${e.host}:${e.port}`},agent:!1,timeout:e.timeout||0};if(this.proxy.username||this.proxy.password){let n=Buffer.from(`${decodeURIComponent(this.proxy.username||"")}:${decodeURIComponent(this.proxy.password||"")}`).toString("base64");s.headers["proxy-authorization"]=`Basic ${n}`}this.proxy.protocol==="https:"&&(s.servername=this.proxy.hostname);let a=(this.proxy.protocol==="http:"?q8:G8).request(s);a.once("connect",(n,c,f)=>{if(a.removeAllListeners(),c.removeAllListeners(),n.statusCode===200){let p=super.createConnection({...e,socket:c});r(null,p)}else c.destroy(),r(new Error(`Bad response: ${n.statusCode}`),null)}),a.once("timeout",()=>{a.destroy(new Error("Proxy timeout"))}),a.once("error",n=>{a.removeAllListeners(),r(n,null)}),a.end()}};yue.exports={HttpProxyAgent:W8,HttpsProxyAgent:Y8}});var V8,Iue,Cue,wue=Ze(()=>{V8=ut(Eue(),1),Iue=V8.default.HttpProxyAgent,Cue=V8.default.HttpsProxyAgent});var Np=_((Fp,LQ)=>{"use strict";Object.defineProperty(Fp,"__esModule",{value:!0});var Bue=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function pet(t){return Bue.includes(t)}var het=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Blob","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Bue];function get(t){return het.includes(t)}var det=["null","undefined","string","number","bigint","boolean","symbol"];function met(t){return det.includes(t)}function AI(t){return e=>typeof e===t}var{toString:vue}=Object.prototype,VB=t=>{let e=vue.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&Pe.domElement(t))return"HTMLElement";if(get(e))return e},pi=t=>e=>VB(e)===t;function Pe(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(Pe.observable(t))return"Observable";if(Pe.array(t))return"Array";if(Pe.buffer(t))return"Buffer";let e=VB(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Pe.undefined=AI("undefined");Pe.string=AI("string");var yet=AI("number");Pe.number=t=>yet(t)&&!Pe.nan(t);Pe.bigint=AI("bigint");Pe.function_=AI("function");Pe.null_=t=>t===null;Pe.class_=t=>Pe.function_(t)&&t.toString().startsWith("class ");Pe.boolean=t=>t===!0||t===!1;Pe.symbol=AI("symbol");Pe.numericString=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Pe.array=(t,e)=>Array.isArray(t)?Pe.function_(e)?t.every(e):!0:!1;Pe.buffer=t=>{var e,r,s,a;return(a=(s=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||s===void 0?void 0:s.call(r,t))!==null&&a!==void 0?a:!1};Pe.blob=t=>pi("Blob")(t);Pe.nullOrUndefined=t=>Pe.null_(t)||Pe.undefined(t);Pe.object=t=>!Pe.null_(t)&&(typeof t=="object"||Pe.function_(t));Pe.iterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Pe.asyncIterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Pe.generator=t=>{var e,r;return Pe.iterable(t)&&Pe.function_((e=t)===null||e===void 0?void 0:e.next)&&Pe.function_((r=t)===null||r===void 0?void 0:r.throw)};Pe.asyncGenerator=t=>Pe.asyncIterable(t)&&Pe.function_(t.next)&&Pe.function_(t.throw);Pe.nativePromise=t=>pi("Promise")(t);var Eet=t=>{var e,r;return Pe.function_((e=t)===null||e===void 0?void 0:e.then)&&Pe.function_((r=t)===null||r===void 0?void 0:r.catch)};Pe.promise=t=>Pe.nativePromise(t)||Eet(t);Pe.generatorFunction=pi("GeneratorFunction");Pe.asyncGeneratorFunction=t=>VB(t)==="AsyncGeneratorFunction";Pe.asyncFunction=t=>VB(t)==="AsyncFunction";Pe.boundFunction=t=>Pe.function_(t)&&!t.hasOwnProperty("prototype");Pe.regExp=pi("RegExp");Pe.date=pi("Date");Pe.error=pi("Error");Pe.map=t=>pi("Map")(t);Pe.set=t=>pi("Set")(t);Pe.weakMap=t=>pi("WeakMap")(t);Pe.weakSet=t=>pi("WeakSet")(t);Pe.int8Array=pi("Int8Array");Pe.uint8Array=pi("Uint8Array");Pe.uint8ClampedArray=pi("Uint8ClampedArray");Pe.int16Array=pi("Int16Array");Pe.uint16Array=pi("Uint16Array");Pe.int32Array=pi("Int32Array");Pe.uint32Array=pi("Uint32Array");Pe.float32Array=pi("Float32Array");Pe.float64Array=pi("Float64Array");Pe.bigInt64Array=pi("BigInt64Array");Pe.bigUint64Array=pi("BigUint64Array");Pe.arrayBuffer=pi("ArrayBuffer");Pe.sharedArrayBuffer=pi("SharedArrayBuffer");Pe.dataView=pi("DataView");Pe.enumCase=(t,e)=>Object.values(e).includes(t);Pe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Pe.urlInstance=t=>pi("URL")(t);Pe.urlString=t=>{if(!Pe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Pe.truthy=t=>!!t;Pe.falsy=t=>!t;Pe.nan=t=>Number.isNaN(t);Pe.primitive=t=>Pe.null_(t)||met(typeof t);Pe.integer=t=>Number.isInteger(t);Pe.safeInteger=t=>Number.isSafeInteger(t);Pe.plainObject=t=>{if(vue.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Pe.typedArray=t=>pet(VB(t));var Iet=t=>Pe.safeInteger(t)&&t>=0;Pe.arrayLike=t=>!Pe.nullOrUndefined(t)&&!Pe.function_(t)&&Iet(t.length);Pe.inRange=(t,e)=>{if(Pe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Pe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Cet=1,wet=["innerHTML","ownerDocument","style","attributes","nodeValue"];Pe.domElement=t=>Pe.object(t)&&t.nodeType===Cet&&Pe.string(t.nodeName)&&!Pe.plainObject(t)&&wet.every(e=>e in t);Pe.observable=t=>{var e,r,s,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(s=t)["@@observable"])===null||a===void 0?void 0:a.call(s)):!1};Pe.nodeStream=t=>Pe.object(t)&&Pe.function_(t.pipe)&&!Pe.observable(t);Pe.infinite=t=>t===1/0||t===-1/0;var Sue=t=>e=>Pe.integer(e)&&Math.abs(e%2)===t;Pe.evenInteger=Sue(0);Pe.oddInteger=Sue(1);Pe.emptyArray=t=>Pe.array(t)&&t.length===0;Pe.nonEmptyArray=t=>Pe.array(t)&&t.length>0;Pe.emptyString=t=>Pe.string(t)&&t.length===0;var Bet=t=>Pe.string(t)&&!/\S/.test(t);Pe.emptyStringOrWhitespace=t=>Pe.emptyString(t)||Bet(t);Pe.nonEmptyString=t=>Pe.string(t)&&t.length>0;Pe.nonEmptyStringAndNotWhitespace=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t);Pe.emptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length===0;Pe.nonEmptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length>0;Pe.emptySet=t=>Pe.set(t)&&t.size===0;Pe.nonEmptySet=t=>Pe.set(t)&&t.size>0;Pe.emptyMap=t=>Pe.map(t)&&t.size===0;Pe.nonEmptyMap=t=>Pe.map(t)&&t.size>0;Pe.propertyKey=t=>Pe.any([Pe.string,Pe.number,Pe.symbol],t);Pe.formData=t=>pi("FormData")(t);Pe.urlSearchParams=t=>pi("URLSearchParams")(t);var Due=(t,e,r)=>{if(!Pe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};Pe.any=(t,...e)=>(Pe.array(t)?t:[t]).some(s=>Due(Array.prototype.some,s,e));Pe.all=(t,...e)=>Due(Array.prototype.every,t,e);var _t=(t,e,r,s={})=>{if(!t){let{multipleValues:a}=s,n=a?`received values of types ${[...new Set(r.map(c=>`\`${Pe(c)}\``))].join(", ")}`:`received value of type \`${Pe(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Fp.assert={undefined:t=>_t(Pe.undefined(t),"undefined",t),string:t=>_t(Pe.string(t),"string",t),number:t=>_t(Pe.number(t),"number",t),bigint:t=>_t(Pe.bigint(t),"bigint",t),function_:t=>_t(Pe.function_(t),"Function",t),null_:t=>_t(Pe.null_(t),"null",t),class_:t=>_t(Pe.class_(t),"Class",t),boolean:t=>_t(Pe.boolean(t),"boolean",t),symbol:t=>_t(Pe.symbol(t),"symbol",t),numericString:t=>_t(Pe.numericString(t),"string with a number",t),array:(t,e)=>{_t(Pe.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>_t(Pe.buffer(t),"Buffer",t),blob:t=>_t(Pe.blob(t),"Blob",t),nullOrUndefined:t=>_t(Pe.nullOrUndefined(t),"null or undefined",t),object:t=>_t(Pe.object(t),"Object",t),iterable:t=>_t(Pe.iterable(t),"Iterable",t),asyncIterable:t=>_t(Pe.asyncIterable(t),"AsyncIterable",t),generator:t=>_t(Pe.generator(t),"Generator",t),asyncGenerator:t=>_t(Pe.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>_t(Pe.nativePromise(t),"native Promise",t),promise:t=>_t(Pe.promise(t),"Promise",t),generatorFunction:t=>_t(Pe.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>_t(Pe.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>_t(Pe.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>_t(Pe.boundFunction(t),"Function",t),regExp:t=>_t(Pe.regExp(t),"RegExp",t),date:t=>_t(Pe.date(t),"Date",t),error:t=>_t(Pe.error(t),"Error",t),map:t=>_t(Pe.map(t),"Map",t),set:t=>_t(Pe.set(t),"Set",t),weakMap:t=>_t(Pe.weakMap(t),"WeakMap",t),weakSet:t=>_t(Pe.weakSet(t),"WeakSet",t),int8Array:t=>_t(Pe.int8Array(t),"Int8Array",t),uint8Array:t=>_t(Pe.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>_t(Pe.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>_t(Pe.int16Array(t),"Int16Array",t),uint16Array:t=>_t(Pe.uint16Array(t),"Uint16Array",t),int32Array:t=>_t(Pe.int32Array(t),"Int32Array",t),uint32Array:t=>_t(Pe.uint32Array(t),"Uint32Array",t),float32Array:t=>_t(Pe.float32Array(t),"Float32Array",t),float64Array:t=>_t(Pe.float64Array(t),"Float64Array",t),bigInt64Array:t=>_t(Pe.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>_t(Pe.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>_t(Pe.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>_t(Pe.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>_t(Pe.dataView(t),"DataView",t),enumCase:(t,e)=>_t(Pe.enumCase(t,e),"EnumCase",t),urlInstance:t=>_t(Pe.urlInstance(t),"URL",t),urlString:t=>_t(Pe.urlString(t),"string with a URL",t),truthy:t=>_t(Pe.truthy(t),"truthy",t),falsy:t=>_t(Pe.falsy(t),"falsy",t),nan:t=>_t(Pe.nan(t),"NaN",t),primitive:t=>_t(Pe.primitive(t),"primitive",t),integer:t=>_t(Pe.integer(t),"integer",t),safeInteger:t=>_t(Pe.safeInteger(t),"integer",t),plainObject:t=>_t(Pe.plainObject(t),"plain object",t),typedArray:t=>_t(Pe.typedArray(t),"TypedArray",t),arrayLike:t=>_t(Pe.arrayLike(t),"array-like",t),domElement:t=>_t(Pe.domElement(t),"HTMLElement",t),observable:t=>_t(Pe.observable(t),"Observable",t),nodeStream:t=>_t(Pe.nodeStream(t),"Node.js Stream",t),infinite:t=>_t(Pe.infinite(t),"infinite number",t),emptyArray:t=>_t(Pe.emptyArray(t),"empty array",t),nonEmptyArray:t=>_t(Pe.nonEmptyArray(t),"non-empty array",t),emptyString:t=>_t(Pe.emptyString(t),"empty string",t),emptyStringOrWhitespace:t=>_t(Pe.emptyStringOrWhitespace(t),"empty string or whitespace",t),nonEmptyString:t=>_t(Pe.nonEmptyString(t),"non-empty string",t),nonEmptyStringAndNotWhitespace:t=>_t(Pe.nonEmptyStringAndNotWhitespace(t),"non-empty string and not whitespace",t),emptyObject:t=>_t(Pe.emptyObject(t),"empty object",t),nonEmptyObject:t=>_t(Pe.nonEmptyObject(t),"non-empty object",t),emptySet:t=>_t(Pe.emptySet(t),"empty set",t),nonEmptySet:t=>_t(Pe.nonEmptySet(t),"non-empty set",t),emptyMap:t=>_t(Pe.emptyMap(t),"empty map",t),nonEmptyMap:t=>_t(Pe.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>_t(Pe.propertyKey(t),"PropertyKey",t),formData:t=>_t(Pe.formData(t),"FormData",t),urlSearchParams:t=>_t(Pe.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>_t(Pe.evenInteger(t),"even integer",t),oddInteger:t=>_t(Pe.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>_t(Pe.directInstanceOf(t,e),"T",t),inRange:(t,e)=>_t(Pe.inRange(t,e),"in range",t),any:(t,...e)=>_t(Pe.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>_t(Pe.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(Pe,{class:{value:Pe.class_},function:{value:Pe.function_},null:{value:Pe.null_}});Object.defineProperties(Fp.assert,{class:{value:Fp.assert.class_},function:{value:Fp.assert.function_},null:{value:Fp.assert.null_}});Fp.default=Pe;LQ.exports=Pe;LQ.exports.default=Pe;LQ.exports.assert=Fp.assert});var Pue=_((AMt,J8)=>{"use strict";var MQ=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},UQ=class t{static fn(e){return(...r)=>new t((s,a,n)=>{r.push(n),e(...r).then(s,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,s)=>{this._reject=s;let a=f=>{this._isPending=!1,r(f)},n=f=>{this._isPending=!1,s(f)},c=f=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(f)};return Object.defineProperties(c,{shouldReject:{get:()=>this._rejectOnCancel,set:f=>{this._rejectOnCancel=f}}}),e(a,n,c)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new MQ(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(UQ.prototype,Promise.prototype);J8.exports=UQ;J8.exports.CancelError=MQ});var bue=_((z8,Z8)=>{"use strict";Object.defineProperty(z8,"__esModule",{value:!0});function vet(t){return t.encrypted}var K8=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let s=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",c=()=>{s&&r.connect(),vet(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?c():t.connecting?t.once("connect",c):t.destroyed&&n&&r.close(t._hadError)};z8.default=K8;Z8.exports=K8;Z8.exports.default=K8});var xue=_(($8,eH)=>{"use strict";Object.defineProperty($8,"__esModule",{value:!0});var Det=bue(),Pet=Number(process.versions.node.split(".")[0]),X8=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=c=>{let f=c.emit.bind(c);c.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,c.emit=f),f(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||Pet>=13)&&(e.phases.total=Date.now()-e.start)});let s=c=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let f=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};c.prependOnceListener("lookup",f),Det.default(c,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(c.removeListener("lookup",f),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?s(t.socket):t.prependOnceListener("socket",s);let a=()=>{var c;e.upload=Date.now(),e.phases.request=e.upload-(c=e.secureConnect,c??e.connect)};return(typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",c=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,c.timings=e,r(c),c.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};$8.default=X8;eH.exports=X8;eH.exports.default=X8});var Oue=_((pMt,nH)=>{"use strict";var{V4MAPPED:bet,ADDRCONFIG:xet,ALL:Nue,promises:{Resolver:kue},lookup:ket}=Ie("dns"),{promisify:tH}=Ie("util"),Qet=Ie("os"),pI=Symbol("cacheableLookupCreateConnection"),rH=Symbol("cacheableLookupInstance"),Que=Symbol("expires"),Ret=typeof Nue=="number",Rue=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Tet=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Tue=()=>{let t=!1,e=!1;for(let r of Object.values(Qet.networkInterfaces()))for(let s of r)if(!s.internal&&(s.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Fet=t=>Symbol.iterator in t,Fue={ttl:!0},Net={all:!0},_Q=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:s=3600,errorTtl:a=.15,resolver:n=new kue,lookup:c=ket}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=tH(c),this._resolver instanceof kue?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=tH(this._resolver.resolve4.bind(this._resolver)),this._resolve6=tH(this._resolver.resolve6.bind(this._resolver))),this._iface=Tue(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,s<1)this._fallback=!1;else{this._fallback=!0;let f=setInterval(()=>{this._hostnamesToFallback.clear()},s*1e3);f.unref&&f.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,s){if(typeof r=="function"?(s=r,r={}):typeof r=="number"&&(r={family:r}),!s)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?s(null,a):s(null,a.address,a.family,a.expires,a.ttl)},s)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let s=await this.query(e);if(r.family===6){let a=s.filter(n=>n.family===6);r.hints&bet&&(Ret&&r.hints&Nue||a.length===0)?Tet(s):s=a}else r.family===4&&(s=s.filter(a=>a.family===4));if(r.hints&xet){let{_iface:a}=this;s=s.filter(n=>n.family===6?a.has6:a.has4)}if(s.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?s:s[0]}async query(e){let r=await this._cache.get(e);if(!r){let s=this._pending[e];if(s)r=await s;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(s=>({...s})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[s,a]=await Promise.all([this._resolve4(e,Fue),this._resolve6(e,Fue)].map(h=>r(h))),n=0,c=0,f=0,p=Date.now();for(let h of s)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,c=Math.max(c,h.ttl);return s.length>0?a.length>0?f=Math.min(n,c):f=n:f=c,{entries:[...s,...a],cacheTtl:f}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,s){if(this.maxTtl>0&&s>0){s=Math.min(s,this.maxTtl)*1e3,r[Que]=Date.now()+s;try{await this._cache.set(e,r,s)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}Fet(this._cache)&&this._tick(s)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Net);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let s=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,s),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let s=1/0,a=Date.now();for(let[n,c]of this._cache){let f=c[Que];a>=f?this._cache.delete(n):f("lookup"in r||(r.lookup=this.lookup),e[pI](r,s))}uninstall(e){if(Rue(e),e[pI]){if(e[rH]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[pI],delete e[pI],delete e[rH]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Tue(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};nH.exports=_Q;nH.exports.default=_Q});var Uue=_((hMt,iH)=>{"use strict";var Oet=typeof URL>"u"?Ie("url").URL:URL,Let="text/plain",Met="us-ascii",Lue=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Uet=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let s=r[1].split(";"),a=r[2],n=e?"":r[3],c=!1;s[s.length-1]==="base64"&&(s.pop(),c=!0);let f=(s.shift()||"").toLowerCase(),h=[...s.map(E=>{let[C,S=""]=E.split("=").map(b=>b.trim());return C==="charset"&&(S=S.toLowerCase(),S===Met)?"":`${C}${S?`=${S}`:""}`}).filter(Boolean)];return c&&h.push("base64"),(h.length!==0||f&&f!==Let)&&h.unshift(f),`data:${h.join(";")},${c?a.trim():a}${n?`#${n}`:""}`},Mue=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return Uet(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new Oet(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,c)=>/^(?!\/)/g.test(c)?`${c}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),c=n[n.length-1];Lue(c,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])Lue(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};iH.exports=Mue;iH.exports.default=Mue});var jue=_((gMt,Hue)=>{Hue.exports=_ue;function _ue(t,e){if(t&&e)return _ue(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(s){r[s]=t[s]}),r;function r(){for(var s=new Array(arguments.length),a=0;a{var Gue=jue();sH.exports=Gue(HQ);sH.exports.strict=Gue(que);HQ.proto=HQ(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return HQ(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return que(this)},configurable:!0})});function HQ(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function que(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var aH=_((mMt,Yue)=>{var _et=oH(),Het=function(){},jet=function(t){return t.setHeader&&typeof t.abort=="function"},Get=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},Wue=function(t,e,r){if(typeof e=="function")return Wue(t,null,e);e||(e={}),r=_et(r||Het);var s=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,c=e.writable||e.writable!==!1&&t.writable,f=function(){t.writable||p()},p=function(){c=!1,n||r.call(t)},h=function(){n=!1,c||r.call(t)},E=function(I){r.call(t,I?new Error("exited with error code: "+I):null)},C=function(I){r.call(t,I)},S=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(c&&!(s&&s.ended))return r.call(t,new Error("premature close"))},b=function(){t.req.on("finish",p)};return jet(t)?(t.on("complete",p),t.on("abort",S),t.req?b():t.on("request",b)):c&&!s&&(t.on("end",f),t.on("close",f)),Get(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",C),t.on("close",S),function(){t.removeListener("complete",p),t.removeListener("abort",S),t.removeListener("request",b),t.req&&t.req.removeListener("finish",p),t.removeListener("end",f),t.removeListener("close",f),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",C),t.removeListener("close",S)}};Yue.exports=Wue});var Kue=_((yMt,Jue)=>{var qet=oH(),Wet=aH(),lH=Ie("fs"),JB=function(){},Yet=/^v?\.0/.test(process.version),jQ=function(t){return typeof t=="function"},Vet=function(t){return!Yet||!lH?!1:(t instanceof(lH.ReadStream||JB)||t instanceof(lH.WriteStream||JB))&&jQ(t.close)},Jet=function(t){return t.setHeader&&jQ(t.abort)},Ket=function(t,e,r,s){s=qet(s);var a=!1;t.on("close",function(){a=!0}),Wet(t,{readable:e,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,Vet(t))return t.close(JB);if(Jet(t))return t.abort();if(jQ(t.destroy))return t.destroy();s(c||new Error("stream was destroyed"))}}},Vue=function(t){t()},zet=function(t,e){return t.pipe(e)},Zet=function(){var t=Array.prototype.slice.call(arguments),e=jQ(t[t.length-1]||JB)&&t.pop()||JB;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,s=t.map(function(a,n){var c=n0;return Ket(a,c,f,function(p){r||(r=p),p&&s.forEach(Vue),!c&&(s.forEach(Vue),e(r))})});return t.reduce(zet)};Jue.exports=Zet});var Zue=_((EMt,zue)=>{"use strict";var{PassThrough:Xet}=Ie("stream");zue.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,s=r==="buffer",a=!1;e?a=!(r||s):r=r||"utf8",s&&(r=null);let n=new Xet({objectMode:a});r&&n.setEncoding(r);let c=0,f=[];return n.on("data",p=>{f.push(p),a?c=f.length:c+=p.length}),n.getBufferedValue=()=>e?f:s?Buffer.concat(f,c):f.join(""),n.getBufferedLength=()=>c,n}});var Xue=_((IMt,hI)=>{"use strict";var $et=Kue(),ett=Zue(),GQ=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function qQ(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,s;return await new Promise((a,n)=>{let c=f=>{f&&(f.bufferedData=s.getBufferedValue()),n(f)};s=$et(t,ett(e),f=>{if(f){c(f);return}a()}),s.on("data",()=>{s.getBufferedLength()>r&&c(new GQ)})}),s.getBufferedValue()}hI.exports=qQ;hI.exports.default=qQ;hI.exports.buffer=(t,e)=>qQ(t,{...e,encoding:"buffer"});hI.exports.array=(t,e)=>qQ(t,{...e,array:!0});hI.exports.MaxBufferError=GQ});var efe=_((wMt,$ue)=>{"use strict";var ttt=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),rtt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),ntt=new Set([500,502,503,504]),itt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},stt={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function nm(t){let e=parseInt(t,10);return isFinite(e)?e:0}function ott(t){return t?ntt.has(t.status):!0}function cH(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let s of r){let[a,n]=s.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^"|"$/g,"")}return e}function att(t){let e=[];for(let r in t){let s=t[r];e.push(s===!0?r:r+"="+s)}if(e.length)return e.join(", ")}$ue.exports=class{constructor(e,r,{shared:s,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:c,_fromObject:f}={}){if(f){this._fromObject(f);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=s!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=cH(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=cH(e.headers["cache-control"]),c&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":att(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&rtt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||ttt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=cH(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let s of r)if(e.headers[s]!==this._reqHeaders[s])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let s in e)itt[s]||(r[s]=e[s]);if(e.connection){let s=e.connection.trim().split(/\s*,\s*/);for(let a of s)delete r[a]}if(r.warning){let s=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));s.length?r.warning=s.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return nm(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return nm(this._rescc["s-maxage"])}if(this._rescc["max-age"])return nm(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let s=Date.parse(this._resHeaders.expires);return Number.isNaN(s)||ss)return Math.max(e,(r-s)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+nm(this._rescc["stale-if-error"]),s=e+nm(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,s)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+nm(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+nm(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&ott(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let s=!1;if(r.status!==void 0&&r.status!=304?s=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?s=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?s=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?s=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(s=!0),!s)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let c in this._resHeaders)a[c]=c in r.headers&&!stt[c]?r.headers[c]:this._resHeaders[c];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var WQ=_((BMt,tfe)=>{"use strict";tfe.exports=t=>{let e={};for(let[r,s]of Object.entries(t))e[r.toLowerCase()]=s;return e}});var nfe=_((vMt,rfe)=>{"use strict";var ltt=Ie("stream").Readable,ctt=WQ(),uH=class extends ltt{constructor(e,r,s,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(s instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=ctt(r),this.body=s,this.url=a}_read(){this.push(this.body),this.push(null)}};rfe.exports=uH});var sfe=_((SMt,ife)=>{"use strict";var utt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];ife.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(utt));for(let s of r)s in e||(e[s]=typeof t[s]=="function"?t[s].bind(t):t[s])}});var afe=_((DMt,ofe)=>{"use strict";var ftt=Ie("stream").PassThrough,Att=sfe(),ptt=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new ftt;return Att(t,e),t.pipe(e)};ofe.exports=ptt});var lfe=_(fH=>{fH.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",s=Array.isArray(e);r=s?"[":"{";var a=!0;for(var n in e){var c=typeof e[n]=="function"||!s&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!c&&(a||(r+=","),a=!1,s?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=s?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};fH.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Afe=_((bMt,ffe)=>{"use strict";var htt=Ie("events"),cfe=lfe(),gtt=t=>{let e={redis:"@keyv/redis",rediss:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql",etcd:"@keyv/etcd",offline:"@keyv/offline",tiered:"@keyv/tiered"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(Ie(e[r]))(t)}return new Map},ufe=["sqlite","postgres","mysql","mongo","redis","tiered"],AH=class extends htt{constructor(e,{emitErrors:r=!0,...s}={}){if(super(),this.opts={namespace:"keyv",serialize:cfe.stringify,deserialize:cfe.parse,...typeof e=="string"?{uri:e}:e,...s},!this.opts.store){let n={...this.opts};this.opts.store=gtt(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on=="function"&&r&&this.opts.store.on("error",n=>this.emit("error",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[c,f]of typeof n=="function"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(f);if(!(this.opts.store.namespace&&!c.includes(this.opts.store.namespace))){if(typeof p.expires=="number"&&Date.now()>p.expires){this.delete(c);continue}yield[this._getKeyUnprefix(c),p.value]}}};typeof this.opts.store[Symbol.iterator]=="function"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator=="function"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return ufe.includes(this.opts.store.opts.dialect)||ufe.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(":").splice(1).join(":")}get(e,r){let{store:s}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&s.getMany===void 0){let c=[];for(let f of n)c.push(Promise.resolve().then(()=>s.get(f)).then(p=>typeof p=="string"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires=="number"&&Date.now()>p.expires?this.delete(f).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(c).then(f=>{let p=[];for(let h of f)p.push(h.value);return p})}return Promise.resolve().then(()=>a?s.getMany(n):s.get(n)).then(c=>typeof c=="string"?this.opts.deserialize(c):this.opts.compression?this.opts.deserialize(c):c).then(c=>{if(c!=null)return a?c.map((f,p)=>{if(typeof f=="string"&&(f=this.opts.deserialize(f)),f!=null){if(typeof f.expires=="number"&&Date.now()>f.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?f:f.value}}):typeof c.expires=="number"&&Date.now()>c.expires?this.delete(e).then(()=>{}):r&&r.raw?c:c.value})}set(e,r,s){let a=this._getKeyPrefix(e);typeof s>"u"&&(s=this.opts.ttl),s===0&&(s=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let c=typeof s=="number"?Date.now()+s:null;return typeof r=="symbol"&&this.emit("error","symbol cannot be serialized"),r={value:r,expires:c},this.opts.serialize(r)}).then(c=>n.set(a,c,s)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let c of a)n.push(r.delete(c));return Promise.allSettled(n).then(c=>c.every(f=>f.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let s=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(s))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:s}=this.opts;return Promise.resolve().then(async()=>typeof s.has=="function"?s.has(r):await s.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect=="function")return e.disconnect()}};ffe.exports=AH});var gfe=_((kMt,hfe)=>{"use strict";var dtt=Ie("events"),YQ=Ie("url"),mtt=Uue(),ytt=Xue(),pH=efe(),pfe=nfe(),Ett=WQ(),Itt=afe(),Ctt=Afe(),KB=class t{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Ctt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,s)=>{let a;if(typeof r=="string")a=hH(YQ.parse(r)),r={};else if(r instanceof YQ.URL)a=hH(YQ.parse(r.toString())),r={};else{let[C,...S]=(r.path||"").split("?"),b=S.length>0?`?${S.join("?")}`:"";a=hH({...r,pathname:C,search:b})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...wtt(a)},r.headers=Ett(r.headers);let n=new dtt,c=mtt(YQ.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),f=`${r.method}:${c}`,p=!1,h=!1,E=C=>{h=!0;let S=!1,b,I=new Promise(N=>{b=()=>{S||(S=!0,N())}}),T=N=>{if(p&&!C.forceRefresh){N.status=N.statusCode;let W=pH.fromObject(p.cachePolicy).revalidatedPolicy(C,N);if(!W.modified){let ee=W.policy.responseHeaders();N=new pfe(p.statusCode,ee,p.body,p.url),N.cachePolicy=W.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new pH(C,N,C),N.fromCache=!1);let U;C.cache&&N.cachePolicy.storable()?(U=Itt(N),(async()=>{try{let W=ytt.buffer(N);if(await Promise.race([I,new Promise(le=>N.once("end",le))]),S)return;let ee=await W,ie={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:ee},ue=C.strictTtl?N.cachePolicy.timeToLive():void 0;C.maxTtl&&(ue=ue?Math.min(ue,C.maxTtl):C.maxTtl),await this.cache.set(f,ie,ue)}catch(W){n.emit("error",new t.CacheError(W))}})()):C.cache&&p&&(async()=>{try{await this.cache.delete(f)}catch(W){n.emit("error",new t.CacheError(W))}})(),n.emit("response",U||N),typeof s=="function"&&s(U||N)};try{let N=e(C,T);N.once("error",b),N.once("abort",b),n.emit("request",N)}catch(N){n.emit("error",new t.RequestError(N))}};return(async()=>{let C=async b=>{await Promise.resolve();let I=b.cache?await this.cache.get(f):void 0;if(typeof I>"u")return E(b);let T=pH.fromObject(I.cachePolicy);if(T.satisfiesWithoutRevalidation(b)&&!b.forceRefresh){let N=T.responseHeaders(),U=new pfe(I.statusCode,N,I.body,I.url);U.cachePolicy=T,U.fromCache=!0,n.emit("response",U),typeof s=="function"&&s(U)}else p=I,b.headers=T.revalidationHeaders(b),E(b)},S=b=>n.emit("error",new t.CacheError(b));this.cache.once("error",S),n.on("response",()=>this.cache.removeListener("error",S));try{await C(r)}catch(b){r.automaticFailover&&!h&&E(r),n.emit("error",new t.CacheError(b))}})(),n}}};function wtt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function hH(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}KB.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};KB.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};hfe.exports=KB});var mfe=_((TMt,dfe)=>{"use strict";var Btt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];dfe.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(Btt)),s={};for(let a of r)a in e||(s[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,s),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var Efe=_((FMt,yfe)=>{"use strict";var{Transform:vtt,PassThrough:Stt}=Ie("stream"),gH=Ie("zlib"),Dtt=mfe();yfe.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof gH.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let s=!0,a=new vtt({transform(f,p,h){s=!1,h(null,f)},flush(f){f()}}),n=new Stt({autoDestroy:!1,destroy(f,p){t.destroy(),p(f)}}),c=r?gH.createBrotliDecompress():gH.createUnzip();return c.once("error",f=>{if(s&&!t.readable){n.end();return}n.destroy(f)}),Dtt(t,n),t.pipe(a).pipe(c).pipe(n),n}});var mH=_((NMt,Ife)=>{"use strict";var dH=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[s,a]of this.oldCache.entries())this.onEviction(s,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Ife.exports=dH});var EH=_((OMt,vfe)=>{"use strict";var Ptt=Ie("events"),btt=Ie("tls"),xtt=Ie("http2"),ktt=mH(),ba=Symbol("currentStreamsCount"),Cfe=Symbol("request"),Tc=Symbol("cachedOriginSet"),gI=Symbol("gracefullyClosing"),Qtt=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Rtt=(t,e,r)=>{let s=0,a=t.length;for(;s>>1;r(t[n],e)?s=n+1:a=n}return s},Ttt=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,yH=(t,e)=>{for(let r of t)r[Tc].lengthe[Tc].includes(s))&&r[ba]+e[ba]<=e.remoteSettings.maxConcurrentStreams&&Bfe(r)},Ftt=(t,e)=>{for(let r of t)e[Tc].lengthr[Tc].includes(s))&&e[ba]+r[ba]<=r.remoteSettings.maxConcurrentStreams&&Bfe(e)},wfe=({agent:t,isFree:e})=>{let r={};for(let s in t.sessions){let n=t.sessions[s].filter(c=>{let f=c[im.kCurrentStreamsCount]{t[gI]=!0,t[ba]===0&&t.close()},im=class t extends Ptt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:s=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=s,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new ktt({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let s of Qtt)e[s]&&(r+=`:${e[s]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let s=this.queue[e][r];this._sessionsCount{Array.isArray(s)?(s=[...s],a()):s=[{resolve:a,reject:n}];let c=this.normalizeOptions(r),f=t.normalizeOrigin(e,r&&r.servername);if(f===void 0){for(let{reject:E}of s)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(c in this.sessions){let E=this.sessions[c],C=-1,S=-1,b;for(let I of E){let T=I.remoteSettings.maxConcurrentStreams;if(T=T||I[gI]||I.destroyed)continue;b||(C=T),N>S&&(b=I,S=N)}}if(b){if(s.length!==1){for(let{reject:I}of s){let T=new Error(`Expected the length of listeners to be 1, got ${s.length}. Please report this to https://github.com/szmarczak/http2-wrapper/`);I(T)}return}s[0].resolve(b);return}}if(c in this.queue){if(f in this.queue[c]){this.queue[c][f].listeners.push(...s),this._tryToCreateNewSession(c,f);return}}else this.queue[c]={};let p=()=>{c in this.queue&&this.queue[c][f]===h&&(delete this.queue[c][f],Object.keys(this.queue[c]).length===0&&delete this.queue[c])},h=()=>{let E=`${f}:${c}`,C=!1;try{let S=xtt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});S[ba]=0,S[gI]=!1;let b=()=>S[ba]{this.tlsSessionCache.set(E,N)}),S.once("error",N=>{for(let{reject:U}of s)U(N);this.tlsSessionCache.delete(E)}),S.setTimeout(this.timeout,()=>{S.destroy()}),S.once("close",()=>{if(C){I&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[c];N.splice(N.indexOf(S),1),N.length===0&&delete this.sessions[c]}else{let N=new Error("Session closed without receiving a SETTINGS frame");N.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of s)U(N);p()}this._tryToCreateNewSession(c,f)});let T=()=>{if(!(!(c in this.queue)||!b())){for(let N of S[Tc])if(N in this.queue[c]){let{listeners:U}=this.queue[c][N];for(;U.length!==0&&b();)U.shift().resolve(S);let W=this.queue[c];if(W[N].listeners.length===0&&(delete W[N],Object.keys(W).length===0)){delete this.queue[c];break}if(!b())break}}};S.on("origin",()=>{S[Tc]=S.originSet,b()&&(T(),yH(this.sessions[c],S))}),S.once("remoteSettings",()=>{if(S.ref(),S.unref(),this._sessionsCount++,h.destroyed){let N=new Error("Agent has been destroyed");for(let U of s)U.reject(N);S.destroy();return}S[Tc]=S.originSet;{let N=this.sessions;if(c in N){let U=N[c];U.splice(Rtt(U,S,Ttt),0,S)}else N[c]=[S]}this._freeSessionsCount+=1,C=!0,this.emit("session",S),T(),p(),S[ba]===0&&this._freeSessionsCount>this.maxFreeSessions&&S.close(),s.length!==0&&(this.getSession(f,r,s),s.length=0),S.on("remoteSettings",()=>{T(),yH(this.sessions[c],S)})}),S[Cfe]=S.request,S.request=(N,U)=>{if(S[gI])throw new Error("The session is gracefully closing. No new streams are allowed.");let W=S[Cfe](N,U);return S.ref(),++S[ba],S[ba]===S.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,W.once("close",()=>{if(I=b(),--S[ba],!S.destroyed&&!S.closed&&(Ftt(this.sessions[c],S),b()&&!S.closed)){I||(this._freeSessionsCount++,I=!0);let ee=S[ba]===0;ee&&S.unref(),ee&&(this._freeSessionsCount>this.maxFreeSessions||S[gI])?S.close():(yH(this.sessions[c],S),T())}}),W}}catch(S){for(let b of s)b.reject(S);p()}};h.listeners=s,h.completed=!1,h.destroyed=!1,this.queue[c][f]=h,this._tryToCreateNewSession(c,f)})}request(e,r,s,a){return new Promise((n,c)=>{this.getSession(e,r,[{reject:c,resolve:f=>{try{n(f.request(s,a))}catch(p){c(p)}}}])})}createConnection(e,r){return t.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let s=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),btt.connect(s,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ba]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let s of r)s.destroy(e);for(let r of Object.values(this.queue))for(let s of Object.values(r))s.destroyed=!0;this.queue={}}get freeSessions(){return wfe({agent:this,isFree:!0})}get busySessions(){return wfe({agent:this,isFree:!1})}};im.kCurrentStreamsCount=ba;im.kGracefullyClosing=gI;vfe.exports={Agent:im,globalAgent:new im}});var CH=_((LMt,Sfe)=>{"use strict";var{Readable:Ntt}=Ie("stream"),IH=class extends Ntt{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};Sfe.exports=IH});var wH=_((MMt,Dfe)=>{"use strict";Dfe.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var bfe=_((UMt,Pfe)=>{"use strict";Pfe.exports=(t,e,r)=>{for(let s of r)t.on(s,(...a)=>e.emit(s,...a))}});var kfe=_((_Mt,xfe)=>{"use strict";xfe.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var Rfe=_((jMt,Qfe)=>{"use strict";var dI=(t,e,r)=>{Qfe.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};dI(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],s=Array.isArray(r);return s&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${s?"one of":"of"} type ${r}. Received ${typeof t[2]}`});dI(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);dI(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);dI(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);dI(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);dI(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var PH=_((GMt,Ufe)=>{"use strict";var Ott=Ie("http2"),{Writable:Ltt}=Ie("stream"),{Agent:Tfe,globalAgent:Mtt}=EH(),Utt=CH(),_tt=wH(),Htt=bfe(),jtt=kfe(),{ERR_INVALID_ARG_TYPE:BH,ERR_INVALID_PROTOCOL:Gtt,ERR_HTTP_HEADERS_SENT:Ffe,ERR_INVALID_HTTP_TOKEN:qtt,ERR_HTTP_INVALID_HEADER_VALUE:Wtt,ERR_INVALID_CHAR:Ytt}=Rfe(),{HTTP2_HEADER_STATUS:Nfe,HTTP2_HEADER_METHOD:Ofe,HTTP2_HEADER_PATH:Lfe,HTTP2_METHOD_CONNECT:Vtt}=Ott.constants,Jo=Symbol("headers"),vH=Symbol("origin"),SH=Symbol("session"),Mfe=Symbol("options"),VQ=Symbol("flushedHeaders"),zB=Symbol("jobs"),Jtt=/^[\^`\-\w!#$%&*+.|~]+$/,Ktt=/[^\t\u0020-\u007E\u0080-\u00FF]/,DH=class extends Ltt{constructor(e,r,s){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=_tt(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(s=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[SH]=r.h2session;else if(r.agent===!1)this.agent=new Tfe({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new Tfe({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Mtt;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new BH("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Gtt(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,c=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:f}=r;if(r.timeout=void 0,this[Jo]=Object.create(null),this[zB]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[Jo])&&(this[Jo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[Mfe]=r,n===443?(this[vH]=`https://${c}`,":authority"in this[Jo]||(this[Jo][":authority"]=c)):(this[vH]=`https://${c}:${n}`,":authority"in this[Jo]||(this[Jo][":authority"]=`${c}:${n}`)),f&&this.setTimeout(f),s&&this.once("response",s),this[VQ]=!1}get method(){return this[Jo][Ofe]}set method(e){e&&(this[Jo][Ofe]=e.toUpperCase())}get path(){return this[Jo][Lfe]}set path(e){e&&(this[Jo][Lfe]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,s){if(this._mustNotHaveABody){s(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,s);this._request?a():this[zB].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[zB].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[VQ]||this.destroyed)return;this[VQ]=!0;let e=this.method===Vtt,r=s=>{if(this._request=s,this.destroyed){s.destroy();return}e||Htt(s,this,["timeout","continue","close","error"]);let a=c=>(...f)=>{!this.writable&&!this.destroyed?c(...f):this.once("finish",()=>{c(...f)})};s.once("response",a((c,f,p)=>{let h=new Utt(this.socket,s.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=c[Nfe],h.headers=c,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,s,Buffer.alloc(0))?this.emit("close"):s.destroy()):(s.on("data",E=>{!h._dumped&&!h.push(E)&&s.pause()}),s.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),s.once("headers",a(c=>this.emit("information",{statusCode:c[Nfe]}))),s.once("trailers",a((c,f,p)=>{let{res:h}=this;h.trailers=c,h.rawTrailers=p}));let{socket:n}=s.session;this.socket=n,this.connection=n;for(let c of this[zB])c();this.emit("socket",this.socket)};if(this[SH])try{r(this[SH].request(this[Jo]))}catch(s){this.emit("error",s)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[vH],this[Mfe],this[Jo]))}catch(s){this.emit("error",s)}}}getHeader(e){if(typeof e!="string")throw new BH("name","string",e);return this[Jo][e.toLowerCase()]}get headersSent(){return this[VQ]}removeHeader(e){if(typeof e!="string")throw new BH("name","string",e);if(this.headersSent)throw new Ffe("remove");delete this[Jo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Ffe("set");if(typeof e!="string"||!Jtt.test(e)&&!jtt(e))throw new qtt("Header name",e);if(typeof r>"u")throw new Wtt(r,e);if(Ktt.test(r))throw new Ytt("header content",e);this[Jo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let s=()=>this._request.setTimeout(e,r);return this._request?s():this[zB].push(s),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};Ufe.exports=DH});var Hfe=_((qMt,_fe)=>{"use strict";var ztt=Ie("tls");_fe.exports=(t={},e=ztt.connect)=>new Promise((r,s)=>{let a=!1,n,c=async()=>{await p,n.off("timeout",f),n.off("error",s),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit("timeout"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},f=async()=>{a=!0,c()},p=(async()=>{try{n=await e(t,c),n.on("error",s),n.once("timeout",f)}catch(h){s(h)}})()})});var Gfe=_((WMt,jfe)=>{"use strict";var Ztt=Ie("net");jfe.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Ztt.isIP(e)?"":e}});var Yfe=_((YMt,xH)=>{"use strict";var qfe=Ie("http"),bH=Ie("https"),Xtt=Hfe(),$tt=mH(),ert=PH(),trt=Gfe(),rrt=wH(),JQ=new $tt({maxSize:100}),ZB=new Map,Wfe=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let s=()=>{t.emit("free",e,r)};e.on("free",s);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",s),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},nrt=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!JQ.has(e)){if(ZB.has(e))return(await ZB.get(e)).alpnProtocol;let{path:r,agent:s}=t;t.path=t.socketPath;let a=Xtt(t);ZB.set(e,a);try{let{socket:n,alpnProtocol:c}=await a;if(JQ.set(e,c),t.path=r,c==="h2")n.destroy();else{let{globalAgent:f}=bH,p=bH.Agent.prototype.createConnection;s?s.createConnection===p?Wfe(s,n,t):n.destroy():f.createConnection===p?Wfe(f,n,t):n.destroy()}return ZB.delete(e),c}catch(n){throw ZB.delete(e),n}}return JQ.get(e)};xH.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=rrt(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let s=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||trt(e),e.port=e.port||(s?443:80),e._defaultAgent=s?bH.globalAgent:qfe.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[s?"https":"http"]}return s&&await nrt(e)==="h2"?(a&&(e.agent=a.http2),new ert(e,r)):qfe.request(e,r)};xH.exports.protocolCache=JQ});var Jfe=_((VMt,Vfe)=>{"use strict";var irt=Ie("http2"),srt=EH(),kH=PH(),ort=CH(),art=Yfe(),lrt=(t,e,r)=>new kH(t,e,r),crt=(t,e,r)=>{let s=new kH(t,e,r);return s.end(),s};Vfe.exports={...irt,ClientRequest:kH,IncomingMessage:ort,...srt,request:lrt,get:crt,auto:art}});var RH=_(QH=>{"use strict";Object.defineProperty(QH,"__esModule",{value:!0});var Kfe=Np();QH.default=t=>Kfe.default.nodeStream(t)&&Kfe.default.function_(t.getBoundary)});var $fe=_(TH=>{"use strict";Object.defineProperty(TH,"__esModule",{value:!0});var Zfe=Ie("fs"),Xfe=Ie("util"),zfe=Np(),urt=RH(),frt=Xfe.promisify(Zfe.stat);TH.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(zfe.default.string(t))return Buffer.byteLength(t);if(zfe.default.buffer(t))return t.length;if(urt.default(t))return Xfe.promisify(t.getLength.bind(t))();if(t instanceof Zfe.ReadStream){let{size:r}=await frt(t.path);return r===0?void 0:r}}});var NH=_(FH=>{"use strict";Object.defineProperty(FH,"__esModule",{value:!0});function Art(t,e,r){let s={};for(let a of r)s[a]=(...n)=>{e.emit(a,...n)},t.on(a,s[a]);return()=>{for(let a of r)t.off(a,s[a])}}FH.default=Art});var eAe=_(OH=>{"use strict";Object.defineProperty(OH,"__esModule",{value:!0});OH.default=()=>{let t=[];return{once(e,r,s){e.once(r,s),t.push({origin:e,event:r,fn:s})},unhandleAll(){for(let e of t){let{origin:r,event:s,fn:a}=e;r.removeListener(s,a)}t.length=0}}}});var rAe=_(XB=>{"use strict";Object.defineProperty(XB,"__esModule",{value:!0});XB.TimeoutError=void 0;var prt=Ie("net"),hrt=eAe(),tAe=Symbol("reentry"),grt=()=>{},KQ=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};XB.TimeoutError=KQ;XB.default=(t,e,r)=>{if(tAe in t)return grt;t[tAe]=!0;let s=[],{once:a,unhandleAll:n}=hrt.default(),c=(C,S,b)=>{var I;let T=setTimeout(S,C,C,b);(I=T.unref)===null||I===void 0||I.call(T);let N=()=>{clearTimeout(T)};return s.push(N),N},{host:f,hostname:p}=r,h=(C,S)=>{t.destroy(new KQ(C,S))},E=()=>{for(let C of s)C();n()};if(t.once("error",C=>{if(E(),t.listenerCount("error")===0)throw C}),t.once("close",E),a(t,"response",C=>{a(C,"end",E)}),typeof e.request<"u"&&c(e.request,h,"request"),typeof e.socket<"u"){let C=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,C),s.push(()=>{t.removeListener("timeout",C)})}return a(t,"socket",C=>{var S;let{socketPath:b}=t;if(C.connecting){let I=!!(b??prt.isIP((S=p??f)!==null&&S!==void 0?S:"")!==0);if(typeof e.lookup<"u"&&!I&&typeof C.address().address>"u"){let T=c(e.lookup,h,"lookup");a(C,"lookup",T)}if(typeof e.connect<"u"){let T=()=>c(e.connect,h,"connect");I?a(C,"connect",T()):a(C,"lookup",N=>{N===null&&a(C,"connect",T())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(C,"connect",()=>{let T=c(e.secureConnect,h,"secureConnect");a(C,"secureConnect",T)})}if(typeof e.send<"u"){let I=()=>c(e.send,h,"send");C.connecting?a(C,"connect",()=>{a(t,"upload-complete",I())}):a(t,"upload-complete",I())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let C=c(e.response,h,"response");a(t,"response",C)}),E}});var iAe=_(LH=>{"use strict";Object.defineProperty(LH,"__esModule",{value:!0});var nAe=Np();LH.default=t=>{t=t;let e={protocol:t.protocol,hostname:nAe.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return nAe.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var sAe=_(MH=>{"use strict";Object.defineProperty(MH,"__esModule",{value:!0});var drt=Ie("url"),mrt=["protocol","host","hostname","port","pathname","search"];MH.default=(t,e)=>{var r,s;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(s=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&s!==void 0?s:""}`}let a=new drt.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of mrt)e[n]&&(a[n]=e[n].toString());return a}});var oAe=_(_H=>{"use strict";Object.defineProperty(_H,"__esModule",{value:!0});var UH=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};_H.default=UH});var jH=_(HH=>{"use strict";Object.defineProperty(HH,"__esModule",{value:!0});var yrt=async t=>{let e=[],r=0;for await(let s of t)e.push(s),r+=Buffer.byteLength(s);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};HH.default=yrt});var lAe=_(sm=>{"use strict";Object.defineProperty(sm,"__esModule",{value:!0});sm.dnsLookupIpVersionToFamily=sm.isDnsLookupIpVersion=void 0;var aAe={auto:0,ipv4:4,ipv6:6};sm.isDnsLookupIpVersion=t=>t in aAe;sm.dnsLookupIpVersionToFamily=t=>{if(sm.isDnsLookupIpVersion(t))return aAe[t];throw new Error("Invalid DNS lookup IP version")}});var GH=_(zQ=>{"use strict";Object.defineProperty(zQ,"__esModule",{value:!0});zQ.isResponseOk=void 0;zQ.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var uAe=_(qH=>{"use strict";Object.defineProperty(qH,"__esModule",{value:!0});var cAe=new Set;qH.default=t=>{cAe.has(t)||(cAe.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var fAe=_(WH=>{"use strict";Object.defineProperty(WH,"__esModule",{value:!0});var Si=Np(),Ert=(t,e)=>{if(Si.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Si.assert.any([Si.default.string,Si.default.undefined],t.encoding),Si.assert.any([Si.default.boolean,Si.default.undefined],t.resolveBodyOnly),Si.assert.any([Si.default.boolean,Si.default.undefined],t.methodRewriting),Si.assert.any([Si.default.boolean,Si.default.undefined],t.isStream),Si.assert.any([Si.default.string,Si.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:s=>s.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Si.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(s=>s.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Si.default.number(r)&&(t.retry.limit=r),Si.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Si.default.number))),Si.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:s}=t;if(!Si.default.function_(s.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Si.default.function_(s.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Si.default.function_(s.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Si.default.function_(s.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};WH.default=Ert});var AAe=_($B=>{"use strict";Object.defineProperty($B,"__esModule",{value:!0});$B.retryAfterStatusCodes=void 0;$B.retryAfterStatusCodes=new Set([413,429,503]);var Irt=({attemptCount:t,retryOptions:e,error:r,retryAfter:s})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),c=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!c)return 0;if(r.response){if(s)return e.maxRetryAfter===void 0||s>e.maxRetryAfter?0:s;if(r.response.statusCode===413)return 0}let f=Math.random()*100;return 2**(t-1)*1e3+f};$B.default=Irt});var rv=_(Ln=>{"use strict";Object.defineProperty(Ln,"__esModule",{value:!0});Ln.UnsupportedProtocolError=Ln.ReadError=Ln.TimeoutError=Ln.UploadError=Ln.CacheError=Ln.HTTPError=Ln.MaxRedirectsError=Ln.RequestError=Ln.setNonEnumerableProperties=Ln.knownHookEvents=Ln.withoutBody=Ln.kIsNormalizedAlready=void 0;var pAe=Ie("util"),hAe=Ie("stream"),Crt=Ie("fs"),w0=Ie("url"),gAe=Ie("http"),YH=Ie("http"),wrt=Ie("https"),Brt=xue(),vrt=Oue(),dAe=gfe(),Srt=Efe(),Drt=Jfe(),Prt=WQ(),at=Np(),brt=$fe(),mAe=RH(),xrt=NH(),yAe=rAe(),krt=iAe(),EAe=sAe(),Qrt=oAe(),Rrt=jH(),IAe=lAe(),Trt=GH(),B0=uAe(),Frt=fAe(),Nrt=AAe(),VH,po=Symbol("request"),$Q=Symbol("response"),mI=Symbol("responseSize"),yI=Symbol("downloadedSize"),EI=Symbol("bodySize"),II=Symbol("uploadedSize"),ZQ=Symbol("serverResponsesPiped"),CAe=Symbol("unproxyEvents"),wAe=Symbol("isFromCache"),JH=Symbol("cancelTimeouts"),BAe=Symbol("startedReading"),CI=Symbol("stopReading"),XQ=Symbol("triggerRead"),v0=Symbol("body"),ev=Symbol("jobs"),vAe=Symbol("originalResponse"),SAe=Symbol("retryTimeout");Ln.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Ort=at.default.string(process.versions.brotli);Ln.withoutBody=new Set(["GET","HEAD"]);Ln.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function Lrt(t){for(let e in t){let r=t[e];if(!at.default.string(r)&&!at.default.number(r)&&!at.default.boolean(r)&&!at.default.null_(r)&&!at.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function Mrt(t){return at.default.object(t)&&!("statusCode"in t)}var KH=new Qrt.default,Urt=async t=>new Promise((e,r)=>{let s=a=>{r(a)};t.pending||e(),t.once("error",s),t.once("ready",()=>{t.off("error",s),e()})}),_rt=new Set([300,301,302,303,304,307,308]),Hrt=["context","body","json","form"];Ln.setNonEnumerableProperties=(t,e)=>{let r={};for(let s of t)if(s)for(let a of Hrt)a in s&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:s[a]});Object.defineProperties(e,r)};var us=class extends Error{constructor(e,r,s){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,s instanceof oR?(Object.defineProperty(this,"request",{enumerable:!1,value:s}),Object.defineProperty(this,"response",{enumerable:!1,value:s[$Q]}),Object.defineProperty(this,"options",{enumerable:!1,value:s.options})):Object.defineProperty(this,"options",{enumerable:!1,value:s}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,at.default.string(r.stack)&&at.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,c=this.stack.slice(n).split(` `).reverse(),f=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` `).reverse();for(;f.length!==0&&f[0]===c[0];)c.shift();this.stack=`${this.stack.slice(0,n)}${c.reverse().join(` `)}${f.reverse().join(` `)}`}}};Ln.RequestError=us;var eR=class extends us{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};Ln.MaxRedirectsError=eR;var tR=class extends us{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};Ln.HTTPError=tR;var rR=class extends us{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};Ln.CacheError=rR;var nR=class extends us{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};Ln.UploadError=nR;var iR=class extends us{constructor(e,r,s){super(e.message,e,s),this.name="TimeoutError",this.event=e.event,this.timings=r}};Ln.TimeoutError=iR;var tv=class extends us{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};Ln.ReadError=tv;var sR=class extends us{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};Ln.UnsupportedProtocolError=sR;var jrt=["socket","connect","continue","information","upgrade","timeout"],oR=class extends hAe.Duplex{constructor(e,r={},s){super({autoDestroy:!1,highWaterMark:0}),this[yI]=0,this[II]=0,this.requestInitialized=!1,this[ZQ]=new Set,this.redirects=[],this[CI]=!1,this[XQ]=!1,this[ev]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof YH.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:c,body:f,form:p}=r;if((c||f||p)&&this._lockWrite(),Ln.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,s)}catch(h){at.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Crt.ReadStream&&await Urt(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[po])===null||h===void 0||h.destroy();return}for(let C of this[ev])C();this[ev].length=0,this.requestInitialized=!0}catch(E){if(E instanceof us){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,s){var a,n,c,f,p;let h=r;if(at.default.object(e)&&!at.default.urlInstance(e))r={...s,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...s,...r},e!==void 0&&(r.url=e),at.default.urlInstance(r.url)&&(r.url=new w0.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),at.assert.any([at.default.string,at.default.undefined],r.method),at.assert.any([at.default.object,at.default.undefined],r.headers),at.assert.any([at.default.string,at.default.urlInstance,at.default.undefined],r.prefixUrl),at.assert.any([at.default.object,at.default.undefined],r.cookieJar),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.searchParams),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.cache),at.assert.any([at.default.object,at.default.number,at.default.undefined],r.timeout),at.assert.any([at.default.object,at.default.undefined],r.context),at.assert.any([at.default.object,at.default.undefined],r.hooks),at.assert.any([at.default.boolean,at.default.undefined],r.decompress),at.assert.any([at.default.boolean,at.default.undefined],r.ignoreInvalidCookies),at.assert.any([at.default.boolean,at.default.undefined],r.followRedirect),at.assert.any([at.default.number,at.default.undefined],r.maxRedirects),at.assert.any([at.default.boolean,at.default.undefined],r.throwHttpErrors),at.assert.any([at.default.boolean,at.default.undefined],r.http2),at.assert.any([at.default.boolean,at.default.undefined],r.allowGetBody),at.assert.any([at.default.string,at.default.undefined],r.localAddress),at.assert.any([IAe.isDnsLookupIpVersion,at.default.undefined],r.dnsLookupIpVersion),at.assert.any([at.default.object,at.default.undefined],r.https),at.assert.any([at.default.boolean,at.default.undefined],r.rejectUnauthorized),r.https&&(at.assert.any([at.default.boolean,at.default.undefined],r.https.rejectUnauthorized),at.assert.any([at.default.function_,at.default.undefined],r.https.checkServerIdentity),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificateAuthority),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.key),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificate),at.assert.any([at.default.string,at.default.undefined],r.https.passphrase),at.assert.any([at.default.string,at.default.buffer,at.default.array,at.default.undefined],r.https.pfx)),at.assert.any([at.default.object,at.default.undefined],r.cacheOptions),at.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===s?.headers?r.headers={...r.headers}:r.headers=Prt({...s?.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==s?.searchParams){let b;if(at.default.string(r.searchParams)||r.searchParams instanceof w0.URLSearchParams)b=new w0.URLSearchParams(r.searchParams);else{Lrt(r.searchParams),b=new w0.URLSearchParams;for(let I in r.searchParams){let T=r.searchParams[I];T===null?b.append(I,""):T!==void 0&&b.append(I,T)}}(a=s?.searchParams)===null||a===void 0||a.forEach((I,T)=>{b.has(T)||b.append(T,I)}),r.searchParams=b}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(c=r.password)!==null&&c!==void 0?c:"",at.default.undefined(r.prefixUrl)?r.prefixUrl=(f=s?.prefixUrl)!==null&&f!==void 0?f:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),at.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=EAe.default(r.prefixUrl+r.url,r)}else(at.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=EAe.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:b}=r;Object.defineProperty(r,"prefixUrl",{set:T=>{let N=r.url;if(!N.href.startsWith(T))throw new Error(`Cannot change \`prefixUrl\` from ${b} to ${T}: ${N.href}`);r.url=new w0.URL(T+N.href.slice(b.length)),b=T},get:()=>b});let{protocol:I}=r.url;if(I==="unix:"&&(I="http:",r.url=new w0.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),I!=="http:"&&I!=="https:")throw new sR(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:b,getCookieString:I}=E;at.assert.function_(b),at.assert.function_(I),b.length===4&&I.length===0&&(b=pAe.promisify(b.bind(r.cookieJar)),I=pAe.promisify(I.bind(r.cookieJar)),r.cookieJar={setCookie:b,getCookieString:I})}let{cache:C}=r;if(C&&(KH.has(C)||KH.set(C,new dAe((b,I)=>{let T=b[po](b,I);return at.default.promise(T)&&(T.once=(N,U)=>{if(N==="error")T.catch(U);else if(N==="abort")(async()=>{try{(await T).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return T}),T},C))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)VH||(VH=new vrt.default),r.dnsCache=VH;else if(!at.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${at.default(r.dnsCache)}`);at.default.number(r.timeout)?r.timeout={request:r.timeout}:s&&r.timeout!==s.timeout?r.timeout={...s.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let S=r.hooks===s?.hooks;r.hooks={...r.hooks};for(let b of Ln.knownHookEvents)if(b in r.hooks)if(at.default.array(r.hooks[b]))r.hooks[b]=[...r.hooks[b]];else throw new TypeError(`Parameter \`${b}\` must be an Array, got ${at.default(r.hooks[b])}`);else r.hooks[b]=[];if(s&&!S)for(let b of Ln.knownHookEvents)s.hooks[b].length>0&&(r.hooks[b]=[...s.hooks[b],...r.hooks[b]]);if("family"in r&&B0.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),s?.https&&(r.https={...s.https,...r.https}),"rejectUnauthorized"in r&&B0.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&B0.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&B0.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&B0.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&B0.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&B0.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&B0.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let b in r.agent)if(b!=="http"&&b!=="https"&&b!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${b}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Ln.setNonEnumerableProperties([s,h],r),Frt.default(r,s)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,s=!at.default.undefined(e.form),a=!at.default.undefined(e.json),n=!at.default.undefined(e.body),c=s||a||n,f=Ln.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=f,c){if(f)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,s,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof hAe.Readable)&&!at.default.string(e.body)&&!at.default.buffer(e.body)&&!mAe.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(s&&!at.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!at.default.string(r["content-type"]);n?(mAe.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[v0]=e.body):s?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[v0]=new w0.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[v0]=e.stringifyJson(e.json));let h=await brt.default(this[v0],e.headers);at.default.undefined(r["content-length"])&&at.default.undefined(r["transfer-encoding"])&&!f&&!at.default.undefined(h)&&(r["content-length"]=String(h))}}else f?this._lockWrite():this._unlockWrite();this[EI]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:s}=r;this[vAe]=e,r.decompress&&(e=Srt(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:gAe.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[wAe]=n.isFromCache,this[mI]=Number(e.headers["content-length"])||void 0,this[$Q]=e,e.once("end",()=>{this[mI]=this[yI],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",f=>{e.destroy(),this._beforeError(new tv(f,this))}),e.once("aborted",()=>{this._beforeError(new tv({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let c=e.headers["set-cookie"];if(at.default.object(r.cookieJar)&&c){let f=c.map(async p=>r.cookieJar.setCookie(p,s.toString()));r.ignoreInvalidCookies&&(f=f.map(async p=>p.catch(()=>{})));try{await Promise.all(f)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&_rt.has(a)){if(e.resume(),this[po]&&(this[JH](),delete this[po],this[CAe]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[v0]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new eR(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new w0.URL(p,s),E=h.toString();decodeURI(E),h.hostname!==s.hostname||h.port!==s.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let C of r.hooks.beforeRedirect)await C(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!Trt.isResponseOk(n)){this._beforeError(new tR(n));return}e.on("readable",()=>{this[XQ]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let f of this[ZQ])if(!f.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&f.setHeader(p,E)}f.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:s,url:a}=r;Brt.default(e),this[JH]=yAe.default(e,s,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof yAe.TimeoutError?new iR(p,this.timings,this):new us(p.message,p,this),this._beforeError(p)}),this[CAe]=xrt.default(e,this,jrt),this[po]=e,this.emit("uploadProgress",this.uploadProgress);let c=this[v0],f=this.redirects.length===0?this:e;at.default.nodeStream(c)?(c.pipe(f),c.once("error",p=>{this._beforeError(new nR(p,this))})):(this._unlockWrite(),at.default.undefined(c)?(this._cannotHaveBody||this._noPipe)&&(f.end(),this._lockWrite()):(this._writeRequest(c,void 0,()=>{}),f.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((s,a)=>{Object.assign(r,krt.default(e)),delete r.url;let n,c=KH.get(r.cache)(r,async f=>{f._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",f),s(f)});r.url=e,c.once("error",a),c.once("request",async f=>{n=f,s(n)})})}async _makeRequest(){var e,r,s,a,n;let{options:c}=this,{headers:f}=c;for(let U in f)if(at.default.undefined(f[U]))delete f[U];else if(at.default.null_(f[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(c.decompress&&at.default.undefined(f["accept-encoding"])&&(f["accept-encoding"]=Ort?"gzip, deflate, br":"gzip, deflate"),c.cookieJar){let U=await c.cookieJar.getCookieString(c.url.toString());at.default.nonEmptyString(U)&&(c.headers.cookie=U)}for(let U of c.hooks.beforeRequest){let W=await U(c);if(!at.default.undefined(W)){c.request=()=>W;break}}c.body&&this[v0]!==c.body&&(this[v0]=c.body);let{agent:p,request:h,timeout:E,url:C}=c;if(c.dnsCache&&!("lookup"in c)&&(c.lookup=c.dnsCache.lookup),C.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${C.pathname}${C.search}`);if(U?.groups){let{socketPath:W,path:ee}=U.groups;Object.assign(c,{socketPath:W,path:ee,host:""})}}let S=C.protocol==="https:",b;c.http2?b=Drt.auto:b=S?wrt.request:gAe.request;let I=(e=c.request)!==null&&e!==void 0?e:b,T=c.cache?this._createCacheableRequest:I;p&&!c.http2&&(c.agent=p[S?"https":"http"]),c[po]=I,delete c.request,delete c.timeout;let N=c;if(N.shared=(r=c.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(s=c.cacheOptions)===null||s===void 0?void 0:s.cacheHeuristic,N.immutableMinTimeToLive=(a=c.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=c.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,c.dnsLookupIpVersion!==void 0)try{N.family=IAe.dnsLookupIpVersionToFamily(c.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}c.https&&("rejectUnauthorized"in c.https&&(N.rejectUnauthorized=c.https.rejectUnauthorized),c.https.checkServerIdentity&&(N.checkServerIdentity=c.https.checkServerIdentity),c.https.certificateAuthority&&(N.ca=c.https.certificateAuthority),c.https.certificate&&(N.cert=c.https.certificate),c.https.key&&(N.key=c.https.key),c.https.passphrase&&(N.passphrase=c.https.passphrase),c.https.pfx&&(N.pfx=c.https.pfx));try{let U=await T(C,N);at.default.undefined(U)&&(U=b(C,N)),c.request=h,c.timeout=E,c.agent=p,c.https&&("rejectUnauthorized"in c.https&&delete N.rejectUnauthorized,c.https.checkServerIdentity&&delete N.checkServerIdentity,c.https.certificateAuthority&&delete N.ca,c.https.certificate&&delete N.cert,c.https.key&&delete N.key,c.https.passphrase&&delete N.passphrase,c.https.pfx&&delete N.pfx),Mrt(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof dAe.CacheError?new rR(U,this):new us(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new us(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[CI])return;let{options:r}=this,s=this.retryCount+1;this[CI]=!0,e instanceof us||(e=new us(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Rrt.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let c;try{let f;n&&"retry-after"in n.headers&&(f=Number(n.headers["retry-after"]),Number.isNaN(f)?(f=Date.parse(n.headers["retry-after"])-Date.now(),f<=0&&(f=1)):f*=1e3),c=await r.retry.calculateDelay({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:Nrt.default({attemptCount:s,retryOptions:r.retry,error:a,retryAfter:f,computedValue:0})})}catch(f){this._error(new us(f.message,f,this));return}if(c){let f=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,s)}catch(p){this._error(new us(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",s,e))};this[SAe]=setTimeout(f,c);return}}this._error(a)})()}_read(){this[XQ]=!0;let e=this[$Q];if(e&&!this[CI]){e.readableLength&&(this[XQ]=!1);let r;for(;(r=e.read())!==null;){this[yI]+=r.length,this[BAe]=!0;let s=this.downloadProgress;s.percent<1&&this.emit("downloadProgress",s),this.push(r)}}}_write(e,r,s){let a=()=>{this._writeRequest(e,r,s)};this.requestInitialized?a():this[ev].push(a)}_writeRequest(e,r,s){this[po].destroyed||(this._progressCallbacks.push(()=>{this[II]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[po].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),s(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(po in this)){e();return}if(this[po].destroyed){e();return}this[po].end(s=>{s||(this[EI]=this[II],this.emit("uploadProgress",this.uploadProgress),this[po].emit("upload-complete")),e(s)})};this.requestInitialized?r():this[ev].push(r)}_destroy(e,r){var s;this[CI]=!0,clearTimeout(this[SAe]),po in this&&(this[JH](),!((s=this[$Q])===null||s===void 0)&&s.complete||this[po].destroy()),e!==null&&!at.default.undefined(e)&&!(e instanceof us)&&(e=new us(e.message,e,this)),r(e)}get _isAboutToError(){return this[CI]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,s;return((r=(e=this[po])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((s=this[vAe])===null||s===void 0)&&s.complete)}get socket(){var e,r;return(r=(e=this[po])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[mI]?e=this[yI]/this[mI]:this[mI]===this[yI]?e=1:e=0,{percent:e,transferred:this[yI],total:this[mI]}}get uploadProgress(){let e;return this[EI]?e=this[II]/this[EI]:this[EI]===this[II]?e=1:e=0,{percent:e,transferred:this[II],total:this[EI]}}get timings(){var e;return(e=this[po])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[wAe]}pipe(e,r){if(this[BAe])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof YH.ServerResponse&&this[ZQ].add(e),super.pipe(e,r)}unpipe(e){return e instanceof YH.ServerResponse&&this[ZQ].delete(e),super.unpipe(e),this}};Ln.default=oR});var nv=_(qu=>{"use strict";var Grt=qu&&qu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),qrt=qu&&qu.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Grt(e,t,r)};Object.defineProperty(qu,"__esModule",{value:!0});qu.CancelError=qu.ParseError=void 0;var DAe=rv(),zH=class extends DAe.RequestError{constructor(e,r){let{options:s}=r.request;super(`${e.message} in "${s.url.toString()}"`,e,r.request),this.name="ParseError"}};qu.ParseError=zH;var ZH=class extends DAe.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};qu.CancelError=ZH;qrt(rv(),qu)});var bAe=_(XH=>{"use strict";Object.defineProperty(XH,"__esModule",{value:!0});var PAe=nv(),Wrt=(t,e,r,s)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(s);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new PAe.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new PAe.ParseError(n,t)}};XH.default=Wrt});var $H=_(S0=>{"use strict";var Yrt=S0&&S0.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Vrt=S0&&S0.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&Yrt(e,t,r)};Object.defineProperty(S0,"__esModule",{value:!0});var Jrt=Ie("events"),Krt=Np(),zrt=Pue(),aR=nv(),xAe=bAe(),kAe=rv(),Zrt=NH(),Xrt=jH(),QAe=GH(),$rt=["request","response","redirect","uploadProgress","downloadProgress"];function RAe(t){let e,r,s=new Jrt.EventEmitter,a=new zrt((c,f,p)=>{let h=E=>{let C=new kAe.default(void 0,t);C.retryCount=E,C._noPipe=!0,p(()=>C.destroy()),p.shouldReject=!1,p(()=>f(new aR.CancelError(C))),e=C,C.once("response",async I=>{var T;if(I.retryCount=E,I.request.aborted)return;let N;try{N=await Xrt.default(C),I.rawBody=N}catch{return}if(C._isAboutToError)return;let U=((T=I.headers["content-encoding"])!==null&&T!==void 0?T:"").toLowerCase(),W=["gzip","deflate","br"].includes(U),{options:ee}=C;if(W&&!ee.decompress)I.body=N;else try{I.body=xAe.default(I,ee.responseType,ee.parseJson,ee.encoding)}catch(ie){if(I.body=N.toString(),QAe.isResponseOk(I)){C._beforeError(ie);return}}try{for(let[ie,ue]of ee.hooks.afterResponse.entries())I=await ue(I,async le=>{let me=kAe.default.normalizeArguments(void 0,{...le,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},ee);me.hooks.afterResponse=me.hooks.afterResponse.slice(0,ie);for(let Be of me.hooks.beforeRetry)await Be(me);let pe=RAe(me);return p(()=>{pe.catch(()=>{}),pe.cancel()}),pe})}catch(ie){C._beforeError(new aR.RequestError(ie.message,ie,C));return}if(!QAe.isResponseOk(I)){C._beforeError(new aR.HTTPError(I));return}r=I,c(C.options.resolveBodyOnly?I.body:I)});let S=I=>{if(a.isCanceled)return;let{options:T}=C;if(I instanceof aR.HTTPError&&!T.throwHttpErrors){let{response:N}=I;c(C.options.resolveBodyOnly?N.body:N);return}f(I)};C.once("error",S);let b=C.options.body;C.once("retry",(I,T)=>{var N,U;if(b===((N=T.request)===null||N===void 0?void 0:N.options.body)&&Krt.default.nodeStream((U=T.request)===null||U===void 0?void 0:U.options.body)){S(T);return}h(I)}),Zrt.default(C,s,$rt)};h(0)});a.on=(c,f)=>(s.on(c,f),a);let n=c=>{let f=(async()=>{await a;let{options:p}=r.request;return xAe.default(r,c,p.parseJson,p.encoding)})();return Object.defineProperties(f,Object.getOwnPropertyDescriptors(a)),f};return a.json=()=>{let{headers:c}=e.options;return!e.writableFinished&&c.accept===void 0&&(c.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}S0.default=RAe;Vrt(nv(),S0)});var TAe=_(ej=>{"use strict";Object.defineProperty(ej,"__esModule",{value:!0});var ent=nv();function tnt(t,...e){let r=(async()=>{if(t instanceof ent.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),s=()=>r;return r.json=s,r.text=s,r.buffer=s,r.on=s,r}ej.default=tnt});var OAe=_(tj=>{"use strict";Object.defineProperty(tj,"__esModule",{value:!0});var FAe=Np();function NAe(t){for(let e of Object.values(t))(FAe.default.plainObject(e)||FAe.default.array(e))&&NAe(e);return Object.freeze(t)}tj.default=NAe});var MAe=_(LAe=>{"use strict";Object.defineProperty(LAe,"__esModule",{value:!0})});var rj=_(Nc=>{"use strict";var rnt=Nc&&Nc.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),nnt=Nc&&Nc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&rnt(e,t,r)};Object.defineProperty(Nc,"__esModule",{value:!0});Nc.defaultHandler=void 0;var UAe=Np(),Fc=$H(),int=TAe(),cR=rv(),snt=OAe(),ont={RequestError:Fc.RequestError,CacheError:Fc.CacheError,ReadError:Fc.ReadError,HTTPError:Fc.HTTPError,MaxRedirectsError:Fc.MaxRedirectsError,TimeoutError:Fc.TimeoutError,ParseError:Fc.ParseError,CancelError:Fc.CancelError,UnsupportedProtocolError:Fc.UnsupportedProtocolError,UploadError:Fc.UploadError},ant=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:lR}=cR.default,_Ae=(...t)=>{let e;for(let r of t)e=lR(void 0,r,e);return e},lnt=t=>t.isStream?new cR.default(void 0,t):Fc.default(t),cnt=t=>"defaults"in t&&"options"in t.defaults,unt=["get","post","put","patch","head","delete"];Nc.defaultHandler=(t,e)=>e(t);var HAe=(t,e)=>{if(t)for(let r of t)r(e)},jAe=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(s=>(a,n)=>{let c,f=s(a,p=>(c=n(p),c));if(f!==c&&!a.isStream&&c){let p=f,{then:h,catch:E,finally:C}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(c)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(c)),p.then=h,p.catch=E,p.finally=C}return f});let e=(s,a={},n)=>{var c,f;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?lnt:h);if(UAe.default.plainObject(s)){let E={...s,...a};cR.setNonEnumerableProperties([s,a],E),a=E,s=void 0}try{let E;try{HAe(t.options.hooks.init,a),HAe((c=a.hooks)===null||c===void 0?void 0:c.init,a)}catch(S){E=S}let C=lR(s,a,n??t.options);if(C[cR.kIsNormalizedAlready]=!0,E)throw new Fc.RequestError(E.message,E,C);return h(C)}catch(E){if(a.isStream)throw E;return int.default(E,t.options.hooks.beforeError,(f=a.hooks)===null||f===void 0?void 0:f.beforeError)}};e.extend=(...s)=>{let a=[t.options],n=[...t._rawHandlers],c;for(let f of s)cnt(f)?(a.push(f.defaults.options),n.push(...f.defaults._rawHandlers),c=f.defaults.mutableDefaults):(a.push(f),"handlers"in f&&n.push(...f.handlers),c=f.mutableDefaults);return n=n.filter(f=>f!==Nc.defaultHandler),n.length===0&&n.push(Nc.defaultHandler),jAe({options:_Ae(...a),handlers:n,mutableDefaults:!!c})};let r=async function*(s,a){let n=lR(s,a,t.options);n.resolveBodyOnly=!1;let c=n.pagination;if(!UAe.default.object(c))throw new TypeError("`options.pagination` must be implemented");let f=[],{countLimit:p}=c,h=0;for(;h{let n=[];for await(let c of r(s,a))n.push(c);return n},e.paginate.each=r,e.stream=(s,a)=>e(s,{...a,isStream:!0});for(let s of unt)e[s]=(a,n)=>e(a,{...n,method:s}),e.stream[s]=(a,n)=>e(a,{...n,method:s,isStream:!0});return Object.assign(e,ont),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:snt.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=_Ae,e};Nc.default=jAe;nnt(MAe(),Nc)});var WAe=_((Op,uR)=>{"use strict";var fnt=Op&&Op.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),GAe=Op&&Op.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&fnt(e,t,r)};Object.defineProperty(Op,"__esModule",{value:!0});var Ant=Ie("url"),qAe=rj(),pnt={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let s of e){let a=s.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Ant.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[qAe.defaultHandler],mutableDefaults:!1},nj=qAe.default(pnt);Op.default=nj;uR.exports=nj;uR.exports.default=nj;uR.exports.__esModule=!0;GAe(rj(),Op);GAe($H(),Op)});var ln={};Vt(ln,{Method:()=>ZAe,del:()=>ynt,get:()=>oj,getNetworkSettings:()=>zAe,post:()=>aj,put:()=>mnt,request:()=>iv});async function ij(t){return Yl(VAe,t,()=>ce.readFilePromise(t).then(e=>(VAe.set(t,e),e)))}function dnt({statusCode:t,statusMessage:e},r){let s=Ht(r,t,ht.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return KE(r,`${s}${e?` (${e})`:""}`,a)}async function fR(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let a=r?.(s,e)??s.response.body?.error;a==null&&(s.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=s.message),s.code==="ETIMEDOUT"&&s.event==="socket"&&(a+=`(can be increased via ${Ht(e,"httpTimeout",ht.SETTING)})`);let n=new jt(35,a,c=>{s.response&&c.reportError(35,` ${Kf(e,{label:"Response Code",value:_u(ht.NO_HINT,dnt(s.response,e))})}`),s.request&&(c.reportError(35,` ${Kf(e,{label:"Request Method",value:_u(ht.NO_HINT,s.request.options.method)})}`),c.reportError(35,` ${Kf(e,{label:"Request URL",value:_u(ht.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&c.reportError(35,` ${Kf(e,{label:"Request Redirects",value:_u(ht.NO_HINT,z4(e,s.request.redirects,ht.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&c.reportError(35,` ${Kf(e,{label:"Request Retry Count",value:_u(ht.NO_HINT,`${Ht(e,s.request.retryCount,ht.NUMBER)} (can be increased via ${Ht(e,"httpRetry",ht.SETTING)})`)})}`)});throw n.originalError=s,n}}function zAe(t,e){let r=[...e.configuration.get("networkSettings")].sort(([c],[f])=>f.length-c.length),s={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(s),n=typeof t=="string"?new URL(t):t;for(let[c,f]of r)if(sj.default.isMatch(n.hostname,c))for(let p of a){let h=f.get(p);h!==null&&typeof s[p]>"u"&&(s[p]=h)}for(let c of a)typeof s[c]>"u"&&(s[c]=e.configuration.get(c));return s}async function iv(t,e,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c="GET",wrapNetworkRequest:f}){let p={target:t,body:e,configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c},h=async()=>await Ent(t,e,p),E=typeof f<"u"?await f(h,p):h;return await(await r.reduceHook(S=>S.wrapNetworkRequest,E,p))()}async function oj(t,{configuration:e,jsonResponse:r,customErrorMessage:s,wrapNetworkRequest:a,...n}){let c=()=>fR(iv(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:s}).then(p=>p.body),f=await(typeof a<"u"?c():Yl(YAe,t,()=>c().then(p=>(YAe.set(t,p),p))));return r?JSON.parse(f.toString()):f}async function mnt(t,e,{customErrorMessage:r,...s}){return(await fR(iv(t,e,{...s,method:"PUT"}),{customErrorMessage:r,configuration:s.configuration})).body}async function aj(t,e,{customErrorMessage:r,...s}){return(await fR(iv(t,e,{...s,method:"POST"}),{customErrorMessage:r,configuration:s.configuration})).body}async function ynt(t,{customErrorMessage:e,...r}){return(await fR(iv(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Ent(t,e,{configuration:r,headers:s,jsonRequest:a,jsonResponse:n,method:c="GET"}){let f=typeof t=="string"?new URL(t):t,p=zAe(f,{configuration:r});if(p.enableNetwork===!1)throw new jt(80,`Request to '${f.href}' has been blocked because of your configuration settings`);if(f.protocol==="http:"&&!sj.default.isMatch(f.hostname,r.get("unsafeHttpWhitelist")))throw new jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${f.hostname})`);let h={headers:s,method:c};h.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?h.body=e:h.json=e);let E=r.get("httpTimeout"),C=r.get("httpRetry"),S=r.get("enableStrictSsl"),b=p.httpsCaFilePath,I=p.httpsCertFilePath,T=p.httpsKeyFilePath,{default:N}=await Promise.resolve().then(()=>ut(WAe())),U=b?await ij(b):void 0,W=I?await ij(I):void 0,ee=T?await ij(T):void 0,ie={rejectUnauthorized:S,ca:U,cert:W,key:ee},ue={http:p.httpProxy?new Iue({proxy:p.httpProxy,proxyRequestOptions:ie}):hnt,https:p.httpsProxy?new Cue({proxy:p.httpsProxy,proxyRequestOptions:ie}):gnt},le=N.extend({timeout:{socket:E},retry:C,agent:ue,https:{rejectUnauthorized:S,certificateAuthority:U,certificate:W,key:ee},...h});return r.getLimit("networkConcurrency")(()=>le(f))}var JAe,KAe,sj,YAe,VAe,hnt,gnt,ZAe,AR=Ze(()=>{Dt();wue();JAe=Ie("https"),KAe=Ie("http"),sj=ut(Go());Rc();xc();bc();YAe=new Map,VAe=new Map,hnt=new KAe.Agent({keepAlive:!0}),gnt=new JAe.Agent({keepAlive:!0});ZAe=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(ZAe||{})});var fs={};Vt(fs,{availableParallelism:()=>cj,getArchitecture:()=>sv,getArchitectureName:()=>vnt,getArchitectureSet:()=>lj,getCaller:()=>bnt,major:()=>Int,openUrl:()=>Cnt});function Bnt(){if(process.platform!=="linux")return null;let t;try{t=ce.readFileSync(wnt)}catch{}if(typeof t<"u"){if(t&&(t.includes("GLIBC")||t.includes("GNU libc")||t.includes("GNU C Library")))return"glibc";if(t&&t.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],s=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return p0(r,a=>{let n=a.match(s);if(!n)return p0.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function sv(){return $Ae=$Ae??{os:(process.env.YARN_IS_TEST_ENV?process.env.YARN_OS_OVERRIDE:void 0)??process.platform,cpu:(process.env.YARN_IS_TEST_ENV?process.env.YARN_CPU_OVERRIDE:void 0)??process.arch,libc:(process.env.YARN_IS_TEST_ENV?process.env.YARN_LIBC_OVERRIDE:void 0)??Bnt()}}function vnt(t=sv()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function lj(){let t=sv();return epe=epe??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function Pnt(t){let e=Snt.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,s=e[2]&&e[2].indexOf("eval")===0,a=Dnt.exec(e[2]);return s&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function bnt(){let e=new Error().stack.split(` `)[3];return Pnt(e)}function cj(){return typeof pR.default.availableParallelism<"u"?pR.default.availableParallelism():Math.max(1,pR.default.cpus().length)}var pR,Int,XAe,Cnt,wnt,$Ae,epe,Snt,Dnt,hR=Ze(()=>{Dt();pR=ut(Ie("os"));gR();bc();Int=Number(process.versions.node.split(".")[0]),XAe=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),Cnt=typeof XAe<"u"?async t=>{try{return await uj(XAe,[t],{cwd:J.cwd()}),!0}catch{return!1}}:void 0,wnt="/usr/bin/ldd";Snt=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Dnt=/\((\S*)(?::(\d+))(?::(\d+))\)/});function gj(t,e,r,s,a){let n=YB(r);if(s.isArray||s.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((c,f)=>fj(t,`${e}[${f}]`,c,s,a)):String(n).split(/,/).map(c=>fj(t,e,c,s,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return fj(t,e,r,s,a)}function fj(t,e,r,s,a){let n=YB(r);switch(s.type){case"ANY":return FQ(n);case"SHAPE":return Rnt(t,e,r,s,a);case"MAP":return Tnt(t,e,r,s,a)}if(n===null&&!s.isNullable&&s.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if(s.values?.includes(n))return n;let f=(()=>{if(s.type==="BOOLEAN"&&typeof n!="string")return kB(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${e}" to be a string, got ${typeof n}`);let p=Vk(n,{env:t.env});switch(s.type){case"ABSOLUTE_PATH":{let h=a,E=U8(r);return E&&E[0]!=="<"&&(h=J.dirname(E)),J.resolve(h,fe.toPortablePath(p))}case"LOCATOR_LOOSE":return Qp(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return Qp(p);case"BOOLEAN":return kB(p);default:return p}})();if(s.values&&!s.values.includes(f))throw new Error(`Invalid value, expected one of ${s.values.join(", ")}`);return f}function Rnt(t,e,r,s,a){let n=YB(r);if(typeof n!="object"||Array.isArray(n))throw new nt(`Object configuration settings "${e}" must be an object`);let c=dj(t,s,{ignoreArrays:!0});if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=`${e}.${f}`;if(!s.properties[f])throw new nt(`Unrecognized configuration settings found: ${e}.${f} - run "yarn config" to see the list of settings supported in Yarn`);c.set(f,gj(t,h,p,s.properties[f],a))}return c}function Tnt(t,e,r,s,a){let n=YB(r),c=new Map;if(typeof n!="object"||Array.isArray(n))throw new nt(`Map configuration settings "${e}" must be an object`);if(n===null)return c;for(let[f,p]of Object.entries(n)){let h=s.normalizeKeys?s.normalizeKeys(f):f,E=`${e}['${h}']`,C=s.valueDefinition;c.set(h,gj(t,E,p,C,a))}return c}function dj(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let s=new Map;for(let[a,n]of Object.entries(e.properties))s.set(a,dj(t,n));return s}case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(s=>J.normalize(s)):J.isAbsolute(e.default)?J.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(s=>J.resolve(t.projectCwd,s)):J.resolve(t.projectCwd,e.default);default:return e.default}}function mR(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return Qnt;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return fe.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let s=[];for(let a of t)s.push(mR(a,e,r));return s}if(e.type==="MAP"&&t instanceof Map){if(t.size===0)return;let s=new Map;for(let[a,n]of t.entries()){let c=mR(n,e.valueDefinition,r);typeof c<"u"&&s.set(a,c)}return s}if(e.type==="SHAPE"&&t instanceof Map){if(t.size===0)return;let s=new Map;for(let[a,n]of t.entries()){let c=e.properties[a],f=mR(n,c,r);typeof f<"u"&&s.set(a,f)}return s}return t}function Fnt(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(yR)&&(e=(0,rpe.default)(e.slice(yR.length)),t[e]=r);return t}function pj(){let t=`${yR}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return hj}async function tpe(t){try{return await ce.readFilePromise(t)}catch{return Buffer.of()}}async function Nnt(t,e){return Buffer.compare(...await Promise.all([tpe(t),tpe(e)]))===0}async function Ont(t,e){let[r,s]=await Promise.all([ce.statPromise(t),ce.statPromise(e)]);return r.dev===s.dev&&r.ino===s.ino}async function Mnt({configuration:t,selfPath:e}){let r=t.get("yarnPath");return t.get("ignorePath")||r===null||r===e||await Lnt(r,e)?null:r}var rpe,Lp,npe,ipe,spe,Aj,xnt,ov,knt,Mp,yR,hj,Qnt,wI,ope,ER,dR,Lnt,ze,av=Ze(()=>{Dt();wc();rpe=ut(Cre()),Lp=ut(Fd());Yt();npe=ut(hne()),ipe=Ie("module"),spe=ut(Ld()),Aj=Ie("stream");$ce();oI();Q8();R8();T8();fue();F8();tm();due();OQ();xc();I0();AR();bc();hR();Tp();Wo();xnt=function(){if(!Lp.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=fe.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=ce.readJsonSync(t)}catch{return!1}return!(!("repository"in e)||!e.repository||(e.repository.private??!0))}(),ov=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),knt=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","zipDataEpilogue","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","osOverride","cpuOverride","libcOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreCwd"]),Mp=/^(?!v)[a-z0-9._-]+$/i,yR="yarn_",hj=".yarnrc.yml",Qnt="********",wI=(E=>(E.ANY="ANY",E.BOOLEAN="BOOLEAN",E.ABSOLUTE_PATH="ABSOLUTE_PATH",E.LOCATOR="LOCATOR",E.LOCATOR_LOOSE="LOCATOR_LOOSE",E.NUMBER="NUMBER",E.STRING="STRING",E.SECRET="SECRET",E.SHAPE="SHAPE",E.MAP="MAP",E))(wI||{}),ope=ht,ER=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(ER||{}),dR={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:H8()},cacheFolder:{description:"Folder where the cache files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"ABSOLUTE_PATH",default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:pj()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:Zk,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:K4,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Lp.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Lp.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Lp.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:cj()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values($k),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"NUMBER",default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Lp.isPR&&xnt,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},enableCacheClean:{description:"If false, disallows the `cache clean` command",type:"BOOLEAN",default:!0},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"SHAPE",properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"SHAPE",properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:"BOOLEAN",default:!1}}}}}}}};Lnt=process.platform==="win32"?Nnt:Ont;ze=class t{constructor(e){this.isCI=Lp.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(e,r,s){let a=new t(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(dR);let n=typeof s<"u"?s:r instanceof Map?r:new Map;for(let[c,f]of n)a.activatePlugin(c,f);return a}static async find(e,r,{strict:s=!0,usePathCheck:a=null,useRc:n=!0}={}){let c=Fnt();delete c.rcFilename;let f=new t(e),p=await t.findRcFiles(e),h=await t.findFolderRcFile(fI());h&&(p.find(me=>me.path===h.path)||p.unshift(h));let E=gue(p.map(le=>[le.path,le.data])),C=vt.dot,S=new Set(Object.keys(dR)),b=({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe})=>({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe}),I=({yarnPath:le,ignorePath:me,injectEnvironmentFiles:pe,...Be})=>{let Ce={};for(let[g,we]of Object.entries(Be))S.has(g)&&(Ce[g]=we);return Ce},T=({yarnPath:le,ignorePath:me,...pe})=>{let Be={};for(let[Ce,g]of Object.entries(pe))S.has(Ce)||(Be[Ce]=g);return Be};if(f.importSettings(b(dR)),f.useWithSource("",b(c),e,{strict:!1}),E){let[le,me]=E;f.useWithSource(le,b(me),C,{strict:!1})}if(a){if(await Mnt({configuration:f,selfPath:a})!==null)return f;f.useWithSource("",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let N=await t.findProjectCwd(e);f.startingCwd=e,f.projectCwd=N;let U=Object.assign(Object.create(null),process.env);f.env=U;let W=await Promise.all(f.get("injectEnvironmentFiles").map(async le=>{let me=le.endsWith("?")?await ce.readFilePromise(le.slice(0,-1),"utf8").catch(()=>""):await ce.readFilePromise(le,"utf8");return(0,npe.parse)(me)}));for(let le of W)for(let[me,pe]of Object.entries(le))f.env[me]=Vk(pe,{env:U});if(f.importSettings(I(dR)),f.useWithSource("",I(c),e,{strict:s}),E){let[le,me]=E;f.useWithSource(le,I(me),C,{strict:s})}let ee=le=>"default"in le?le.default:le,ie=new Map([["@@core",Xce]]);if(r!==null)for(let le of r.plugins.keys())ie.set(le,ee(r.modules.get(le)));for(let[le,me]of ie)f.activatePlugin(le,me);let ue=new Map([]);if(r!==null){let le=new Map;for(let[Be,Ce]of r.modules)le.set(Be,()=>Ce);let me=new Set,pe=async(Be,Ce)=>{let{factory:g,name:we}=bp(Be);if(!g||me.has(we))return;let ye=new Map(le),Ae=X=>{if((0,ipe.isBuiltin)(X))return bp(X);if(ye.has(X))return ye.get(X)();throw new nt(`This plugin cannot access the package referenced via ${X} which is neither a builtin, nor an exposed entry`)},se=await qE(async()=>ee(await g(Ae)),X=>`${X} (when initializing ${we}, defined in ${Ce})`);le.set(we,()=>se),me.add(we),ue.set(we,se)};if(c.plugins)for(let Be of c.plugins.split(";")){let Ce=J.resolve(e,fe.toPortablePath(Be));await pe(Ce,"")}for(let{path:Be,cwd:Ce,data:g}of p)if(n&&Array.isArray(g.plugins))for(let we of g.plugins){let ye=typeof we!="string"?we.path:we,Ae=we?.spec??"",se=we?.checksum??"";if(ov.has(Ae))continue;let X=J.resolve(Ce,fe.toPortablePath(ye));if(!await ce.existsPromise(X)){if(!Ae){let mt=Ht(f,J.basename(X,".cjs"),ht.NAME),j=Ht(f,".gitignore",ht.NAME),rt=Ht(f,f.values.get("rcFilename"),ht.NAME),Fe=Ht(f,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",ht.URL);throw new nt(`Missing source for the ${mt} plugin - please try to remove the plugin from ${rt} then reinstall it manually. This error usually occurs because ${j} is incorrect, check ${Fe} to make sure your plugin folder isn't gitignored.`)}if(!Ae.match(/^https?:/)){let mt=Ht(f,J.basename(X,".cjs"),ht.NAME),j=Ht(f,f.values.get("rcFilename"),ht.NAME);throw new nt(`Failed to recognize the source for the ${mt} plugin - please try to delete the plugin from ${j} then reinstall it manually.`)}let De=await oj(Ae,{configuration:f}),Te=cs(De);if(se&&se!==Te){let mt=Ht(f,J.basename(X,".cjs"),ht.NAME),j=Ht(f,f.values.get("rcFilename"),ht.NAME),rt=Ht(f,`yarn plugin import ${Ae}`,ht.CODE);throw new nt(`Failed to fetch the ${mt} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${j} then run ${rt} to reimport it.`)}await ce.mkdirPromise(J.dirname(X),{recursive:!0}),await ce.writeFilePromise(X,De)}await pe(X,Be)}}for(let[le,me]of ue)f.activatePlugin(le,me);if(f.useWithSource("",T(c),e,{strict:s}),E){let[le,me]=E;f.useWithSource(le,T(me),C,{strict:s})}return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),f}static async findRcFiles(e){let r=pj(),s=[],a=e,n=null;for(;a!==n;){n=a;let c=J.join(n,r);if(ce.existsSync(c)){let f,p;try{p=await ce.readFilePromise(c,"utf8"),f=as(p)}catch{let h="";throw p?.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(h=" (in particular, make sure you list the colons after each key name)"),new nt(`Parse error when loading ${c}; please check it's proper Yaml${h}`)}s.unshift({path:c,cwd:n,data:f})}a=J.dirname(n)}return s}static async findFolderRcFile(e){let r=J.join(e,Er.rc),s;try{s=await ce.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=as(s);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,s=e,a=null;for(;s!==a;){if(a=s,ce.existsSync(J.join(a,Er.lockfile)))return a;ce.existsSync(J.join(a,Er.manifest))&&(r=a),s=J.dirname(a)}return r}static async updateConfiguration(e,r,s={}){let a=pj(),n=J.join(e,a),c=ce.existsSync(n)?as(await ce.readFilePromise(n,"utf8")):{},f=!1,p;if(typeof r=="function"){try{p=r(c)}catch{p=r({})}if(p===c)return!1}else{p=c;for(let h of Object.keys(r)){let E=c[h],C=r[h],S;if(typeof C=="function")try{S=C(E)}catch{S=C(void 0)}else S=C;E!==S&&(S===t.deleteProperty?delete p[h]:p[h]=S,f=!0)}if(!f)return!1}return await ce.changeFilePromise(n,nl(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,s=>{let a=s.plugins??[];if(a.length===0)return{...s,plugins:r};let n=[],c=[...r];for(let f of a){let p=typeof f!="string"?f.path:f,h=c.find(E=>E.path===p);h?(n.push(h),c=c.filter(E=>E!==h)):n.push(f)}return n.push(...c),{...s,plugins:n}})}static async updateHomeConfiguration(e){let r=fI();return await t.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,s]of Object.entries(e))if(s!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,s),this.values.set(r,dj(this,s))}}useWithSource(e,r,s,a){try{this.use(e,r,s,a)}catch(n){throw n.message+=` (in ${Ht(this,e,ht.PATH)})`,n}}use(e,r,s,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let c of["enableStrictSettings",...Object.keys(r)]){let f=r[c],p=U8(f);if(p&&(e=p),typeof f>"u"||c==="plugins"||e===""&&knt.has(c))continue;if(c==="rcFilename")throw new nt(`The rcFilename settings can only be set via ${`${yR}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(c);if(!h){let C=fI(),S=e[0]!=="<"?J.dirname(e):null;if(a&&!(S!==null?C===S:!1))throw new nt(`Unrecognized or legacy configuration settings found: ${c} - run "yarn config" to see the list of settings supported in Yarn`);this.invalid.set(c,e);continue}if(this.sources.has(c)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=gj(this,c,f,h,s)}catch(C){throw C.message+=` in ${Ht(this,e,ht.PATH)}`,C}if(c==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let C=this.values.get(c);this.values.set(c,new Map(n?[...C,...E]:[...E,...C])),this.sources.set(c,`${this.sources.get(c)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let C=this.values.get(c);this.values.set(c,n?[...C,...E]:[...E,...C]),this.sources.set(c,`${this.sources.get(c)}, ${e}`)}else this.values.set(c,E),this.sources.set(c,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:s=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new nt(`Couldn't find a configuration settings named "${e}"`);return mR(a,n,{hideSecrets:r,getNativePaths:s})}getSubprocessStreams(e,{header:r,prefix:s,report:a}){let n,c,f=ce.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${s} ${Ht(this,"STDOUT","green")}`),h=a.createStreamReporter(`${s} ${Ht(this,"STDERR","red")}`);n=new Aj.PassThrough,n.pipe(p),n.pipe(f),c=new Aj.PassThrough,c.pipe(h),c.pipe(f)}else n=f,c=f,typeof r<"u"&&n.write(`${r} `);return{stdout:n,stderr:c}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let s of r.resolvers||[])e.push(new s);return new rm([new TQ,new Ei,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let s of r.fetchers||[])e.push(new s);return new aI([new lI,new cI,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let s of r.linkers||[])e.push(new s);return e}getSupportedArchitectures(){let e=sv(),r=this.get("supportedArchitectures"),s=r.get("os");s!==null&&(s=s.map(c=>c==="current"?e.os:c));let a=r.get("cpu");a!==null&&(a=a.map(c=>c==="current"?e.cpu:c));let n=r.get("libc");return n!==null&&(n=Wl(n,c=>c==="current"?e.libc??Wl.skip:c)),{os:s,cpu:a,libc:n}}isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get("preferInteractive"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(s,a,{userProvided:n=!1}={})=>{if(!cl(s.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let c=new Ut;c.load(a,{yamlCompatibilityMode:!0});let f=xB(e,s.identHash),p=[];f.push([s.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:s};for(let E of c.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of c.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,C]of c.peerDependenciesMeta)for(let[S,b]of Object.entries(C))p.push({...h,type:"PeerDependencyMeta",selector:E,key:S,value:b})};await this.triggerHook(s=>s.registerPackageExtensions,this,r);for(let[s,a]of this.get("packageExtensions"))r(C0(s,!0),Yk(a),{userProvided:!0});return e}normalizeLocator(e){return cl(e.reference)?Ws(e,`${this.get("defaultProtocol")}${e.reference}`):Mp.test(e.reference)?Ws(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return cl(e.range)?On(e,`${this.get("defaultProtocol")}${e.range}`):Mp.test(e.range)?On(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,s])=>[r,this.normalizeDependency(s)]))}normalizePackage(e,{packageExtensions:r}){let s=LB(e),a=r.get(e.identHash);if(typeof a<"u"){let c=e.version;if(c!==null){for(let[f,p]of a)if(Xf(c,f))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof s.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",s.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof s.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",s.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=s.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",Yl(s.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:H4(h)}}}let n=c=>c.scope?`${c.scope}__${c.name}`:`${c.name}`;for(let c of s.peerDependenciesMeta.keys()){let f=Sa(c);s.peerDependencies.has(f.identHash)||s.peerDependencies.set(f.identHash,On(f,"*"))}for(let c of s.peerDependencies.values()){if(c.scope==="types")continue;let f=n(c),p=Da("types",f),h=un(p);s.peerDependencies.has(p.identHash)||s.peerDependenciesMeta.has(h)||s.dependencies.has(p.identHash)||(s.peerDependencies.set(p.identHash,On(p,"*")),s.peerDependenciesMeta.set(h,{optional:!0}))}return s.dependencies=new Map(qs(s.dependencies,([,c])=>al(c))),s.peerDependencies=new Map(qs(s.peerDependencies,([,c])=>al(c))),s}getLimit(e){return Yl(this.limits,e,()=>(0,spe.default)(this.get(e)))}async triggerHook(e,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=e(a);n&&await n(...r)}}async triggerMultipleHooks(e,r){for(let s of r)await this.triggerHook(e,...s)}async reduceHook(e,r,...s){let a=r;for(let n of this.plugins.values()){let c=n.hooks;if(!c)continue;let f=e(c);f&&(a=await f(a,...s))}return a}async firstHook(e,...r){for(let s of this.plugins.values()){let a=s.hooks;if(!a)continue;let n=e(a);if(!n)continue;let c=await n(...r);if(typeof c<"u")return c}return null}}});var qr={};Vt(qr,{EndStrategy:()=>Ij,ExecError:()=>IR,PipeError:()=>lv,execvp:()=>uj,pipevp:()=>Wu});function om(t){return t!==null&&typeof t.fd=="number"}function mj(){}function yj(){for(let t of am)t.kill()}async function Wu(t,e,{cwd:r,env:s=process.env,strict:a=!1,stdin:n=null,stdout:c,stderr:f,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":om(n)&&(h[0]=n),om(c)&&(h[1]=c),om(f)&&(h[2]=f);let E=(0,Ej.default)(t,e,{cwd:fe.fromPortablePath(r),env:{...s,PWD:fe.fromPortablePath(r)},stdio:h});am.add(E),am.size===1&&(process.on("SIGINT",mj),process.on("SIGTERM",yj)),!om(n)&&n!==null&&n.pipe(E.stdin),om(c)||E.stdout.pipe(c,{end:!1}),om(f)||E.stderr.pipe(f,{end:!1});let C=()=>{for(let S of new Set([c,f]))om(S)||S.end()};return new Promise((S,b)=>{E.on("error",I=>{am.delete(E),am.size===0&&(process.off("SIGINT",mj),process.off("SIGTERM",yj)),(p===2||p===1)&&C(),b(I)}),E.on("close",(I,T)=>{am.delete(E),am.size===0&&(process.off("SIGINT",mj),process.off("SIGTERM",yj)),(p===2||p===1&&I!==0)&&C(),I===0||!a?S({code:Cj(I,T)}):b(new lv({fileName:t,code:I,signal:T}))})})}async function uj(t,e,{cwd:r,env:s=process.env,encoding:a="utf8",strict:n=!1}){let c=["ignore","pipe","pipe"],f=[],p=[],h=fe.fromPortablePath(r);typeof s.PWD<"u"&&(s={...s,PWD:h});let E=(0,Ej.default)(t,e,{cwd:h,env:s,stdio:c});return E.stdout.on("data",C=>{f.push(C)}),E.stderr.on("data",C=>{p.push(C)}),await new Promise((C,S)=>{E.on("error",b=>{let I=ze.create(r),T=Ht(I,t,ht.PATH);S(new jt(1,`Process ${T} failed to spawn`,N=>{N.reportError(1,` ${Kf(I,{label:"Thrown Error",value:_u(ht.NO_HINT,b.message)})}`)}))}),E.on("close",(b,I)=>{let T=a==="buffer"?Buffer.concat(f):Buffer.concat(f).toString(a),N=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);b===0||!n?C({code:Cj(b,I),stdout:T,stderr:N}):S(new IR({fileName:t,code:b,signal:I,stdout:T,stderr:N}))})})}function Cj(t,e){let r=Unt.get(e);return typeof r<"u"?128+r:t??1}function _nt(t,e,{configuration:r,report:s}){s.reportError(1,` ${Kf(r,t!==null?{label:"Exit Code",value:_u(ht.NUMBER,t)}:{label:"Exit Signal",value:_u(ht.CODE,e)})}`)}var Ej,Ij,lv,IR,am,Unt,gR=Ze(()=>{Dt();Ej=ut(UU());av();Rc();xc();Ij=(s=>(s[s.Never=0]="Never",s[s.ErrorCode=1]="ErrorCode",s[s.Always=2]="Always",s))(Ij||{}),lv=class extends jt{constructor({fileName:e,code:r,signal:s}){let a=ze.create(J.cwd()),n=Ht(a,e,ht.PATH);super(1,`Child ${n} reported an error`,c=>{_nt(r,s,{configuration:a,report:c})}),this.code=Cj(r,s)}},IR=class extends lv{constructor({fileName:e,code:r,signal:s,stdout:a,stderr:n}){super({fileName:e,code:r,signal:s}),this.stdout=a,this.stderr=n}};am=new Set;Unt=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function lpe(t){ape=t}function cv(){return typeof wj>"u"&&(wj=ape()),wj}var wj,ape,Bj=Ze(()=>{ape=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var cpe=_((CR,Sj)=>{var Hnt=Object.assign({},Ie("fs")),vj=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},s,a;r.ready=new Promise(function(Ke,st){s=Ke,a=st});var n={},c;for(c in r)r.hasOwnProperty(c)&&(n[c]=r[c]);var f=[],p="./this.program",h=function(Ke,st){throw st},E=!1,C=!0,S="";function b(Ke){return r.locateFile?r.locateFile(Ke,S):S+Ke}var I,T,N,U;C&&(E?S=Ie("path").dirname(S)+"/":S=__dirname+"/",I=function(st,St){var lr=Me(st);return lr?St?lr:lr.toString():(N||(N=Hnt),U||(U=Ie("path")),st=U.normalize(st),N.readFileSync(st,St?null:"utf8"))},T=function(st){var St=I(st,!0);return St.buffer||(St=new Uint8Array(St)),we(St.buffer),St},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),f=process.argv.slice(2),h=function(Ke){process.exit(Ke)},r.inspect=function(){return"[Emscripten Module object]"});var W=r.print||console.log.bind(console),ee=r.printErr||console.warn.bind(console);for(c in n)n.hasOwnProperty(c)&&(r[c]=n[c]);n=null,r.arguments&&(f=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var ie=0,ue=function(Ke){ie=Ke},le;r.wasmBinary&&(le=r.wasmBinary);var me=r.noExitRuntime||!0;typeof WebAssembly!="object"&&ts("no native wasm support detected");function pe(Ke,st,St){switch(st=st||"i8",st.charAt(st.length-1)==="*"&&(st="i32"),st){case"i1":return Ve[Ke>>0];case"i8":return Ve[Ke>>0];case"i16":return mh((Ke>>1)*2);case"i32":return to((Ke>>2)*4);case"i64":return to((Ke>>2)*4);case"float":return Af((Ke>>2)*4);case"double":return dh((Ke>>3)*8);default:ts("invalid type for getValue: "+st)}return null}var Be,Ce=!1,g;function we(Ke,st){Ke||ts("Assertion failed: "+st)}function ye(Ke){var st=r["_"+Ke];return we(st,"Cannot call unknown function "+Ke+", make sure it is exported"),st}function Ae(Ke,st,St,lr,te){var Ee={string:function(Gi){var Rn=0;if(Gi!=null&&Gi!==0){var Ga=(Gi.length<<2)+1;Rn=wi(Ga),mt(Gi,Rn,Ga)}return Rn},array:function(Gi){var Rn=wi(Gi.length);return Fe(Gi,Rn),Rn}};function Oe(Gi){return st==="string"?De(Gi):st==="boolean"?!!Gi:Gi}var dt=ye(Ke),Et=[],Pt=0;if(lr)for(var tr=0;tr=St)&&ke[lr];)++lr;return X.decode(ke.subarray(Ke,lr))}function Te(Ke,st,St,lr){if(!(lr>0))return 0;for(var te=St,Ee=St+lr-1,Oe=0;Oe=55296&&dt<=57343){var Et=Ke.charCodeAt(++Oe);dt=65536+((dt&1023)<<10)|Et&1023}if(dt<=127){if(St>=Ee)break;st[St++]=dt}else if(dt<=2047){if(St+1>=Ee)break;st[St++]=192|dt>>6,st[St++]=128|dt&63}else if(dt<=65535){if(St+2>=Ee)break;st[St++]=224|dt>>12,st[St++]=128|dt>>6&63,st[St++]=128|dt&63}else{if(St+3>=Ee)break;st[St++]=240|dt>>18,st[St++]=128|dt>>12&63,st[St++]=128|dt>>6&63,st[St++]=128|dt&63}}return st[St]=0,St-te}function mt(Ke,st,St){return Te(Ke,ke,st,St)}function j(Ke){for(var st=0,St=0;St=55296&&lr<=57343&&(lr=65536+((lr&1023)<<10)|Ke.charCodeAt(++St)&1023),lr<=127?++st:lr<=2047?st+=2:lr<=65535?st+=3:st+=4}return st}function rt(Ke){var st=j(Ke)+1,St=La(st);return St&&Te(Ke,Ve,St,st),St}function Fe(Ke,st){Ve.set(Ke,st)}function Ne(Ke,st){return Ke%st>0&&(Ke+=st-Ke%st),Ke}var be,Ve,ke,it,Ue,x,w,P,y,F;function z(Ke){be=Ke,r.HEAP_DATA_VIEW=F=new DataView(Ke),r.HEAP8=Ve=new Int8Array(Ke),r.HEAP16=it=new Int16Array(Ke),r.HEAP32=x=new Int32Array(Ke),r.HEAPU8=ke=new Uint8Array(Ke),r.HEAPU16=Ue=new Uint16Array(Ke),r.HEAPU32=w=new Uint32Array(Ke),r.HEAPF32=P=new Float32Array(Ke),r.HEAPF64=y=new Float64Array(Ke)}var Z=r.INITIAL_MEMORY||16777216,$,oe=[],xe=[],Re=[],lt=!1;function Ct(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)bt(r.preRun.shift());Rs(oe)}function qt(){lt=!0,Rs(xe)}function ir(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)br(r.postRun.shift());Rs(Re)}function bt(Ke){oe.unshift(Ke)}function gn(Ke){xe.unshift(Ke)}function br(Ke){Re.unshift(Ke)}var Ir=0,Or=null,nn=null;function ai(Ke){Ir++,r.monitorRunDependencies&&r.monitorRunDependencies(Ir)}function Io(Ke){if(Ir--,r.monitorRunDependencies&&r.monitorRunDependencies(Ir),Ir==0&&(Or!==null&&(clearInterval(Or),Or=null),nn)){var st=nn;nn=null,st()}}r.preloadedImages={},r.preloadedAudios={};function ts(Ke){r.onAbort&&r.onAbort(Ke),Ke+="",ee(Ke),Ce=!0,g=1,Ke="abort("+Ke+"). Build with -s ASSERTIONS=1 for more info.";var st=new WebAssembly.RuntimeError(Ke);throw a(st),st}var $s="data:application/octet-stream;base64,";function Co(Ke){return Ke.startsWith($s)}var Hi="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQIAEgACgCBGogACkDmC48AAAgACAAKQOYLkIIiDcDmC4gACgCoC5BCGsLNgKgLgsLEAAgACgCCBAGIABBADYCCAvwAQECf0F/IQECQCAALQAoDQAgACgCJEEDRgRAIABBDGoEQCAAQQA2AhAgAEEXNgIMC0F/DwsCQCAAKAIgBEAgACkDGELAAINCAFINASAAQQxqBEAgAEEANgIQIABBHTYCDAtBfw8LAkAgACgCACICRQ0AIAIQMkF/Sg0AIAAoAgAhASAAQQxqIgAEQCAAIAEoAgw2AgAgACABKAIQNgIEC0F/DwsgAEEAQgBBABAOQn9VDQAgACgCACIARQ0BIAAQGhpBfw8LQQAhASAAQQA7ATQgAEEMagRAIABCADcCDAsgACAAKAIgQQFqNgIgCyABCzsAIAAtACgEfkJ/BSAAKAIgRQRAIABBDGoiAARAIABBADYCBCAAQRI2AgALQn8PCyAAQQBCAEEHEA4LC5oIAQt/IABFBEAgARAJDwsgAUFATwRAQYSEAUEwNgIAQQAPCwJ/QRAgAUELakF4cSABQQtJGyEGIABBCGsiBSgCBCIJQXhxIQQCQCAJQQNxRQRAQQAgBkGAAkkNAhogBkEEaiAETQRAIAUhAiAEIAZrQZSIASgCAEEBdE0NAgtBAAwCCyAEIAVqIQcCQCAEIAZPBEAgBCAGayIDQRBJDQEgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAiADQQNyNgIEIAcgBygCBEEBcjYCBCACIAMQOwwBCyAHQcyEASgCAEYEQEHAhAEoAgAgBGoiBCAGTQ0CIAUgCUEBcSAGckECcjYCBCAFIAZqIgMgBCAGayICQQFyNgIEQcCEASACNgIAQcyEASADNgIADAELIAdByIQBKAIARgRAQbyEASgCACAEaiIDIAZJDQICQCADIAZrIgJBEE8EQCAFIAlBAXEgBnJBAnI2AgQgBSAGaiIEIAJBAXI2AgQgAyAFaiIDIAI2AgAgAyADKAIEQX5xNgIEDAELIAUgCUEBcSADckECcjYCBCADIAVqIgIgAigCBEEBcjYCBEEAIQJBACEEC0HIhAEgBDYCAEG8hAEgAjYCAAwBCyAHKAIEIgNBAnENASADQXhxIARqIgogBkkNASAKIAZrIQwCQCADQf8BTQRAIAcoAggiBCADQQN2IgJBA3RB3IQBakYaIAQgBygCDCIDRgRAQbSEAUG0hAEoAgBBfiACd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAHKAIYIQsCQCAHIAcoAgwiCEcEQCAHKAIIIgJBxIQBKAIASRogAiAINgIMIAggAjYCCAwBCwJAIAdBFGoiBCgCACICDQAgB0EQaiIEKAIAIgINAEEAIQgMAQsDQCAEIQMgAiIIQRRqIgQoAgAiAg0AIAhBEGohBCAIKAIQIgINAAsgA0EANgIACyALRQ0AAkAgByAHKAIcIgNBAnRB5IYBaiICKAIARgRAIAIgCDYCACAIDQFBuIQBQbiEASgCAEF+IAN3cTYCAAwCCyALQRBBFCALKAIQIAdGG2ogCDYCACAIRQ0BCyAIIAs2AhggBygCECICBEAgCCACNgIQIAIgCDYCGAsgBygCFCICRQ0AIAggAjYCFCACIAg2AhgLIAxBD00EQCAFIAlBAXEgCnJBAnI2AgQgBSAKaiICIAIoAgRBAXI2AgQMAQsgBSAJQQFxIAZyQQJyNgIEIAUgBmoiAyAMQQNyNgIEIAUgCmoiAiACKAIEQQFyNgIEIAMgDBA7CyAFIQILIAILIgIEQCACQQhqDwsgARAJIgVFBEBBAA8LIAUgAEF8QXggAEEEaygCACICQQNxGyACQXhxaiICIAEgASACSxsQBxogABAGIAUL6QEBA38CQCABRQ0AIAJBgDBxIgIEfwJ/IAJBgCBHBEBBAiACQYAQRg0BGiADBEAgA0EANgIEIANBEjYCAAtBAA8LQQQLIQJBAAVBAQshBkEUEAkiBEUEQCADBEAgA0EANgIEIANBDjYCAAtBAA8LIAQgAUEBahAJIgU2AgAgBUUEQCAEEAZBAA8LIAUgACABEAcgAWpBADoAACAEQQA2AhAgBEIANwMIIAQgATsBBCAGDQAgBCACECNBBUcNACAEKAIAEAYgBCgCDBAGIAQQBkEAIQQgAwRAIANBADYCBCADQRI2AgALCyAEC7UBAQJ/AkACQAJAAkACQAJAAkAgAC0ABQRAIAAtAABBAnFFDQELIAAoAjAQECAAQQA2AjAgAC0ABUUNAQsgAC0AAEEIcUUNAQsgACgCNBAcIABBADYCNCAALQAFRQ0BCyAALQAAQQRxRQ0BCyAAKAI4EBAgAEEANgI4IAAtAAVFDQELIAAtAABBgAFxRQ0BCyAAKAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQLDAILAn8CQANAAkACQAJAAkACQCADKAI8Ig1BggJLDQAgAxAvAkAgAygCPCINQYICSw0AIAoNAEEADAgLIA1FDQQgDUECSw0AIAMoAmghCAwBCyADKAJoIghFBEBBACEIDAELIAMoAkggCGoiAUEBayIELQAAIgYgAS0AAEcNACAGIAQtAAJHDQAgBEEDaiEEQQAhCQJAA0AgBiAELQAARw0BIAQtAAEgBkcEQCAJQQFyIQkMAgsgBC0AAiAGRwRAIAlBAnIhCQwCCyAELQADIAZHBEAgCUEDciEJDAILIAQtAAQgBkcEQCAJQQRyIQkMAgsgBC0ABSAGRwRAIAlBBXIhCQwCCyAELQAGIAZHBEAgCUEGciEJDAILIAQtAAcgBkcEQCAJQQdyIQkMAgsgBEEIaiEEIAlB+AFJIQEgCUEIaiEJIAENAAtBgAIhCQtBggIhBCANIAlBAmoiASABIA1LGyIBQYECSw0BIAEiBEECSw0BCyADKAJIIAhqLQAAIQQgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEAOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIAQ6AAAgAyAEQQJ0aiIBIAEvAeQBQQFqOwHkASADIAMoAjxBAWs2AjwgAyADKAJoQQFqIgQ2AmgMAQsgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtakEBOgAAIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qIARBA2s6AAAgAyADKAKALkEBajYCgC4gBEH9zgBqLQAAQQJ0IANqQegJaiIBIAEvAQBBAWo7AQAgA0GAywAtAABBAnRqQdgTaiIBIAEvAQBBAWo7AQAgAyADKAI8IARrNgI8IAMgAygCaCAEaiIENgJoCyADKALwLSADKAL0LUcNAUEAIQggAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyAEIAFrQQAQDyADIAMoAmg2AlggAygCABAKIAMoAgAoAhANAQwCCwsgA0EANgKELiAKQQRGBEAgAyADKAJYIgFBAE4EfyADKAJIIAFqBUEACyADKAJoIAFrQQEQDyADIAMoAmg2AlggAygCABAKQQNBAiADKAIAKAIQGwwCCyADKALwLQRAQQAhCCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEEUNAQtBASEICyAICwwBCyADIAogAUEMbEG42ABqKAIAEQIACyIBQX5xQQJGBEAgA0GaBTYCIAsgAUF9cUUEQEEAIQQgBSgCEA0CDAQLIAFBAUcNAAJAAkACQCAKQQFrDgUAAQEBAgELIAMpA5guISICfwJ+IAMoAqAuIgFBA2oiCUE/TQRAQgIgAa2GICKEDAELIAFBwABGBEAgAygCBCADKAIQaiAiNwAAIAMgAygCEEEIajYCEEICISJBCgwCCyADKAIEIAMoAhBqQgIgAa2GICKENwAAIAMgAygCEEEIajYCECABQT1rIQlCAkHAACABa62ICyEiIAlBB2ogCUE5SQ0AGiADKAIEIAMoAhBqICI3AAAgAyADKAIQQQhqNgIQQgAhIiAJQTlrCyEBIAMgIjcDmC4gAyABNgKgLiADEDAMAQsgA0EAQQBBABA5IApBA0cNACADKAJQQQBBgIAIEBkgAygCPA0AIANBADYChC4gA0EANgJYIANBADYCaAsgBRAKIAUoAhANAAwDC0EAIQQgCkEERw0AAkACfwJAAkAgAygCFEEBaw4CAQADCyAFIANBoAFqQeCAASgCABEBACIBNgIwIAMoAgQgAygCEGogATYAACADIAMoAhBBBGoiATYCECADKAIEIAFqIQQgBSgCCAwBCyADKAIEIAMoAhBqIQQgBSgCMCIBQRh0IAFBCHRBgID8B3FyIAFBCHZBgP4DcSABQRh2cnILIQEgBCABNgAAIAMgAygCEEEEajYCEAsgBRAKIAMoAhQiAUEBTgRAIANBACABazYCFAsgAygCEEUhBAsgBAwCCyAFQezAACgCADYCGEF7DAELIANBfzYCJEEACwwBCyMAQRBrIhQkAEF+IRcCQCABIgxFDQAgDCgCIEUNACAMKAIkRQ0AIAwoAhwiB0UNACAHKAIAIAxHDQAgBygCBCIIQbT+AGtBH0sNACAMKAIMIhBFDQAgDCgCACIBRQRAIAwoAgQNAQsgCEG//gBGBEAgB0HA/gA2AgRBwP4AIQgLIAdBpAFqIR8gB0G8BmohGSAHQbwBaiEcIAdBoAFqIR0gB0G4AWohGiAHQfwKaiEYIAdBQGshHiAHKAKIASEFIAwoAgQiICEGIAcoAoQBIQogDCgCECIPIRYCfwJAAkACQANAAkBBfSEEQQEhCQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAhBtP4Aaw4fBwYICQolJicoBSwtLQsZGgQMAjIzATUANw0OAzlISUwLIAcoApQBIQMgASEEIAYhCAw1CyAHKAKUASEDIAEhBCAGIQgMMgsgBygCtAEhCAwuCyAHKAIMIQgMQQsgBUEOTw0pIAZFDUEgBUEIaiEIIAFBAWohBCAGQQFrIQkgAS0AACAFdCAKaiEKIAVBBkkNDCAEIQEgCSEGIAghBQwpCyAFQSBPDSUgBkUNQCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhJDQ0gBCEBIAghBgwlCyAFQRBPDRUgBkUNPyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDBULIAcoAgwiC0UNByAFQRBPDSIgBkUNPiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEISQ0NIAQhASAJIQYgCCEFDCILIAVBH0sNFQwUCyAFQQ9LDRYMFQsgBygCFCIEQYAIcUUEQCAFIQgMFwsgCiEIIAVBD0sNGAwXCyAKIAVBB3F2IQogBUF4cSIFQR9LDQwgBkUNOiAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0GIAQhASAJIQYgCCEFDAwLIAcoArQBIgggBygCqAEiC08NIwwiCyAPRQ0qIBAgBygCjAE6AAAgB0HI/gA2AgQgD0EBayEPIBBBAWohECAHKAIEIQgMOQsgBygCDCIDRQRAQQAhCAwJCyAFQR9LDQcgBkUNNyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEYSQ0BIAQhASAJIQYgCCEFDAcLIAdBwP4ANgIEDCoLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDgLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMOAsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw4CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgCUUEQCAEIQFBACEGIAghBSANIQQMNwsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBDBwLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDYLIAVBEGohCSABQQJqIQQgBkECayELIAEtAAEgCHQgCmohCiAFQQ9LBEAgBCEBIAshBiAJIQUMBgsgC0UEQCAEIQFBACEGIAkhBSANIQQMNgsgBUEYaiEIIAFBA2ohBCAGQQNrIQsgAS0AAiAJdCAKaiEKIAUEQCAEIQEgCyEGIAghBQwGCyALRQRAIAQhAUEAIQYgCCEFIA0hBAw2CyAFQSBqIQUgBkEEayEGIAEtAAMgCHQgCmohCiABQQRqIQEMBQsgBUEIaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDDULIAFBAmohBCAGQQJrIQggAS0AASAJdCAKaiEKIAVBD0sEQCAEIQEgCCEGDBgLIAVBEGohCSAIRQRAIAQhAUEAIQYgCSEFIA0hBAw1CyABQQNqIQQgBkEDayEIIAEtAAIgCXQgCmohCiAFQQdLBEAgBCEBIAghBgwYCyAFQRhqIQUgCEUEQCAEIQFBACEGIA0hBAw1CyAGQQRrIQYgAS0AAyAFdCAKaiEKIAFBBGohAQwXCyAJDQYgBCEBQQAhBiAIIQUgDSEEDDMLIAlFBEAgBCEBQQAhBiAIIQUgDSEEDDMLIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQwUCyAMIBYgD2siCSAMKAIUajYCFCAHIAcoAiAgCWo2AiACQCADQQRxRQ0AIAkEQAJAIBAgCWshBCAMKAIcIggoAhQEQCAIQUBrIAQgCUEAQdiAASgCABEIAAwBCyAIIAgoAhwgBCAJQcCAASgCABEAACIENgIcIAwgBDYCMAsLIAcoAhRFDQAgByAeQeCAASgCABEBACIENgIcIAwgBDYCMAsCQCAHKAIMIghBBHFFDQAgBygCHCAKIApBCHRBgID8B3EgCkEYdHIgCkEIdkGA/gNxIApBGHZyciAHKAIUG0YNACAHQdH+ADYCBCAMQaQMNgIYIA8hFiAHKAIEIQgMMQtBACEKQQAhBSAPIRYLIAdBz/4ANgIEDC0LIApB//8DcSIEIApBf3NBEHZHBEAgB0HR/gA2AgQgDEGOCjYCGCAHKAIEIQgMLwsgB0HC/gA2AgQgByAENgKMAUEAIQpBACEFCyAHQcP+ADYCBAsgBygCjAEiBARAIA8gBiAEIAQgBksbIgQgBCAPSxsiCEUNHiAQIAEgCBAHIQQgByAHKAKMASAIazYCjAEgBCAIaiEQIA8gCGshDyABIAhqIQEgBiAIayEGIAcoAgQhCAwtCyAHQb/+ADYCBCAHKAIEIQgMLAsgBUEQaiEFIAZBAmshBiABLQABIAh0IApqIQogAUECaiEBCyAHIAo2AhQgCkH/AXFBCEcEQCAHQdH+ADYCBCAMQYIPNgIYIAcoAgQhCAwrCyAKQYDAA3EEQCAHQdH+ADYCBCAMQY0JNgIYIAcoAgQhCAwrCyAHKAIkIgQEQCAEIApBCHZBAXE2AgALAkAgCkGABHFFDQAgBy0ADEEEcUUNACAUIAo7AAwgBwJ/IAcoAhwhBUEAIBRBDGoiBEUNABogBSAEQQJB1IABKAIAEQAACzYCHAsgB0G2/gA2AgRBACEFQQAhCgsgBkUNKCABQQFqIQQgBkEBayEIIAEtAAAgBXQgCmohCiAFQRhPBEAgBCEBIAghBgwBCyAFQQhqIQkgCEUEQCAEIQFBACEGIAkhBSANIQQMKwsgAUECaiEEIAZBAmshCCABLQABIAl0IApqIQogBUEPSwRAIAQhASAIIQYMAQsgBUEQaiEJIAhFBEAgBCEBQQAhBiAJIQUgDSEEDCsLIAFBA2ohBCAGQQNrIQggAS0AAiAJdCAKaiEKIAVBB0sEQCAEIQEgCCEGDAELIAVBGGohBSAIRQRAIAQhAUEAIQYgDSEEDCsLIAZBBGshBiABLQADIAV0IApqIQogAUEEaiEBCyAHKAIkIgQEQCAEIAo2AgQLAkAgBy0AFUECcUUNACAHLQAMQQRxRQ0AIBQgCjYADCAHAn8gBygCHCEFQQAgFEEMaiIERQ0AGiAFIARBBEHUgAEoAgARAAALNgIcCyAHQbf+ADYCBEEAIQVBACEKCyAGRQ0mIAFBAWohBCAGQQFrIQggAS0AACAFdCAKaiEKIAVBCE8EQCAEIQEgCCEGDAELIAVBCGohBSAIRQRAIAQhAUEAIQYgDSEEDCkLIAZBAmshBiABLQABIAV0IApqIQogAUECaiEBCyAHKAIkIgQEQCAEIApBCHY2AgwgBCAKQf8BcTYCCAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgFCAKOwAMIAcCfyAHKAIcIQVBACAUQQxqIgRFDQAaIAUgBEECQdSAASgCABEAAAs2AhwLIAdBuP4ANgIEQQAhCEEAIQVBACEKIAcoAhQiBEGACHENAQsgBygCJCIEBEAgBEEANgIQCyAIIQUMAgsgBkUEQEEAIQYgCCEKIA0hBAwmCyABQQFqIQkgBkEBayELIAEtAAAgBXQgCGohCiAFQQhPBEAgCSEBIAshBgwBCyAFQQhqIQUgC0UEQCAJIQFBACEGIA0hBAwmCyAGQQJrIQYgAS0AASAFdCAKaiEKIAFBAmohAQsgByAKQf//A3EiCDYCjAEgBygCJCIFBEAgBSAINgIUC0EAIQUCQCAEQYAEcUUNACAHLQAMQQRxRQ0AIBQgCjsADCAHAn8gBygCHCEIQQAgFEEMaiIERQ0AGiAIIARBAkHUgAEoAgARAAALNgIcC0EAIQoLIAdBuf4ANgIECyAHKAIUIglBgAhxBEAgBiAHKAKMASIIIAYgCEkbIg4EQAJAIAcoAiQiA0UNACADKAIQIgRFDQAgAygCGCILIAMoAhQgCGsiCE0NACAEIAhqIAEgCyAIayAOIAggDmogC0sbEAcaIAcoAhQhCQsCQCAJQYAEcUUNACAHLQAMQQRxRQ0AIAcCfyAHKAIcIQRBACABRQ0AGiAEIAEgDkHUgAEoAgARAAALNgIcCyAHIAcoAowBIA5rIgg2AowBIAYgDmshBiABIA5qIQELIAgNEwsgB0G6/gA2AgQgB0EANgKMAQsCQCAHLQAVQQhxBEBBACEIIAZFDQQDQCABIAhqLQAAIQMCQCAHKAIkIgtFDQAgCygCHCIERQ0AIAcoAowBIgkgCygCIE8NACAHIAlBAWo2AowBIAQgCWogAzoAAAsgA0EAIAYgCEEBaiIISxsNAAsCQCAHLQAVQQJxRQ0AIActAAxBBHFFDQAgBwJ/IAcoAhwhBEEAIAFFDQAaIAQgASAIQdSAASgCABEAAAs2AhwLIAEgCGohASAGIAhrIQYgA0UNAQwTCyAHKAIkIgRFDQAgBEEANgIcCyAHQbv+ADYCBCAHQQA2AowBCwJAIActABVBEHEEQEEAIQggBkUNAwNAIAEgCGotAAAhAwJAIAcoAiQiC0UNACALKAIkIgRFDQAgBygCjAEiCSALKAIoTw0AIAcgCUEBajYCjAEgBCAJaiADOgAACyADQQAgBiAIQQFqIghLGw0ACwJAIActABVBAnFFDQAgBy0ADEEEcUUNACAHAn8gBygCHCEEQQAgAUUNABogBCABIAhB1IABKAIAEQAACzYCHAsgASAIaiEBIAYgCGshBiADRQ0BDBILIAcoAiQiBEUNACAEQQA2AiQLIAdBvP4ANgIECyAHKAIUIgtBgARxBEACQCAFQQ9LDQAgBkUNHyAFQQhqIQggAUEBaiEEIAZBAWshCSABLQAAIAV0IApqIQogBUEITwRAIAQhASAJIQYgCCEFDAELIAlFBEAgBCEBQQAhBiAIIQUgDSEEDCILIAVBEGohBSAGQQJrIQYgAS0AASAIdCAKaiEKIAFBAmohAQsCQCAHLQAMQQRxRQ0AIAogBy8BHEYNACAHQdH+ADYCBCAMQdcMNgIYIAcoAgQhCAwgC0EAIQpBACEFCyAHKAIkIgQEQCAEQQE2AjAgBCALQQl2QQFxNgIsCwJAIActAAxBBHFFDQAgC0UNACAHIB5B5IABKAIAEQEAIgQ2AhwgDCAENgIwCyAHQb/+ADYCBCAHKAIEIQgMHgtBACEGDA4LAkAgC0ECcUUNACAKQZ+WAkcNACAHKAIoRQRAIAdBDzYCKAtBACEKIAdBADYCHCAUQZ+WAjsADCAHIBRBDGoiBAR/QQAgBEECQdSAASgCABEAAAVBAAs2AhwgB0G1/gA2AgRBACEFIAcoAgQhCAwdCyAHKAIkIgQEQCAEQX82AjALAkAgC0EBcQRAIApBCHRBgP4DcSAKQQh2akEfcEUNAQsgB0HR/gA2AgQgDEH2CzYCGCAHKAIEIQgMHQsgCkEPcUEIRwRAIAdB0f4ANgIEIAxBgg82AhggBygCBCEIDB0LIApBBHYiBEEPcSIJQQhqIQsgCUEHTUEAIAcoAigiCAR/IAgFIAcgCzYCKCALCyALTxtFBEAgBUEEayEFIAdB0f4ANgIEIAxB+gw2AhggBCEKIAcoAgQhCAwdCyAHQQE2AhxBACEFIAdBADYCFCAHQYACIAl0NgIYIAxBATYCMCAHQb3+AEG//gAgCkGAwABxGzYCBEEAIQogBygCBCEIDBwLIAcgCkEIdEGAgPwHcSAKQRh0ciAKQQh2QYD+A3EgCkEYdnJyIgQ2AhwgDCAENgIwIAdBvv4ANgIEQQAhCkEAIQULIAcoAhBFBEAgDCAPNgIQIAwgEDYCDCAMIAY2AgQgDCABNgIAIAcgBTYCiAEgByAKNgKEAUECIRcMIAsgB0EBNgIcIAxBATYCMCAHQb/+ADYCBAsCfwJAIAcoAghFBEAgBUEDSQ0BIAUMAgsgB0HO/gA2AgQgCiAFQQdxdiEKIAVBeHEhBSAHKAIEIQgMGwsgBkUNGSAGQQFrIQYgAS0AACAFdCAKaiEKIAFBAWohASAFQQhqCyEEIAcgCkEBcTYCCAJAAkACQAJAAkAgCkEBdkEDcUEBaw4DAQIDAAsgB0HB/gA2AgQMAwsgB0Gw2wA2ApgBIAdCiYCAgNAANwOgASAHQbDrADYCnAEgB0HH/gA2AgQMAgsgB0HE/gA2AgQMAQsgB0HR/gA2AgQgDEHXDTYCGAsgBEEDayEFIApBA3YhCiAHKAIEIQgMGQsgByAKQR9xIghBgQJqNgKsASAHIApBBXZBH3EiBEEBajYCsAEgByAKQQp2QQ9xQQRqIgs2AqgBIAVBDmshBSAKQQ52IQogCEEdTUEAIARBHkkbRQRAIAdB0f4ANgIEIAxB6gk2AhggBygCBCEIDBkLIAdBxf4ANgIEQQAhCCAHQQA2ArQBCyAIIQQDQCAFQQJNBEAgBkUNGCAGQQFrIQYgAS0AACAFdCAKaiEKIAVBCGohBSABQQFqIQELIAcgBEEBaiIINgK0ASAHIARBAXRBsOwAai8BAEEBdGogCkEHcTsBvAEgBUEDayEFIApBA3YhCiALIAgiBEsNAAsLIAhBEk0EQEESIAhrIQ1BAyAIa0EDcSIEBEADQCAHIAhBAXRBsOwAai8BAEEBdGpBADsBvAEgCEEBaiEIIARBAWsiBA0ACwsgDUEDTwRAA0AgB0G8AWoiDSAIQQF0IgRBsOwAai8BAEEBdGpBADsBACANIARBsuwAai8BAEEBdGpBADsBACANIARBtOwAai8BAEEBdGpBADsBACANIARBtuwAai8BAEEBdGpBADsBACAIQQRqIghBE0cNAAsLIAdBEzYCtAELIAdBBzYCoAEgByAYNgKYASAHIBg2ArgBQQAhCEEAIBxBEyAaIB0gGRBOIg0EQCAHQdH+ADYCBCAMQfQINgIYIAcoAgQhCAwXCyAHQcb+ADYCBCAHQQA2ArQBQQAhDQsgBygCrAEiFSAHKAKwAWoiESAISwRAQX8gBygCoAF0QX9zIRIgBygCmAEhGwNAIAYhCSABIQsCQCAFIgMgGyAKIBJxIhNBAnRqLQABIg5PBEAgBSEEDAELA0AgCUUNDSALLQAAIAN0IQ4gC0EBaiELIAlBAWshCSADQQhqIgQhAyAEIBsgCiAOaiIKIBJxIhNBAnRqLQABIg5JDQALIAshASAJIQYLAkAgGyATQQJ0ai8BAiIFQQ9NBEAgByAIQQFqIgk2ArQBIAcgCEEBdGogBTsBvAEgBCAOayEFIAogDnYhCiAJIQgMAQsCfwJ/AkACQAJAIAVBEGsOAgABAgsgDkECaiIFIARLBEADQCAGRQ0bIAZBAWshBiABLQAAIAR0IApqIQogAUEBaiEBIARBCGoiBCAFSQ0ACwsgBCAOayEFIAogDnYhBCAIRQRAIAdB0f4ANgIEIAxBvAk2AhggBCEKIAcoAgQhCAwdCyAFQQJrIQUgBEECdiEKIARBA3FBA2ohCSAIQQF0IAdqLwG6AQwDCyAOQQNqIgUgBEsEQANAIAZFDRogBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQNrIQUgCiAOdiIEQQN2IQogBEEHcUEDagwBCyAOQQdqIgUgBEsEQANAIAZFDRkgBkEBayEGIAEtAAAgBHQgCmohCiABQQFqIQEgBEEIaiIEIAVJDQALCyAEIA5rQQdrIQUgCiAOdiIEQQd2IQogBEH/AHFBC2oLIQlBAAshAyAIIAlqIBFLDRMgCUEBayEEIAlBA3EiCwRAA0AgByAIQQF0aiADOwG8ASAIQQFqIQggCUEBayEJIAtBAWsiCw0ACwsgBEEDTwRAA0AgByAIQQF0aiIEIAM7Ab4BIAQgAzsBvAEgBCADOwHAASAEIAM7AcIBIAhBBGohCCAJQQRrIgkNAAsLIAcgCDYCtAELIAggEUkNAAsLIAcvAbwFRQRAIAdB0f4ANgIEIAxB0Qs2AhggBygCBCEIDBYLIAdBCjYCoAEgByAYNgKYASAHIBg2ArgBQQEgHCAVIBogHSAZEE4iDQRAIAdB0f4ANgIEIAxB2Ag2AhggBygCBCEIDBYLIAdBCTYCpAEgByAHKAK4ATYCnAFBAiAHIAcoAqwBQQF0akG8AWogBygCsAEgGiAfIBkQTiINBEAgB0HR/gA2AgQgDEGmCTYCGCAHKAIEIQgMFgsgB0HH/gA2AgRBACENCyAHQcj+ADYCBAsCQCAGQQ9JDQAgD0GEAkkNACAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBIAwgFkHogAEoAgARBwAgBygCiAEhBSAHKAKEASEKIAwoAgQhBiAMKAIAIQEgDCgCECEPIAwoAgwhECAHKAIEQb/+AEcNByAHQX82ApBHIAcoAgQhCAwUCyAHQQA2ApBHIAUhCSAGIQggASEEAkAgBygCmAEiEiAKQX8gBygCoAF0QX9zIhVxIg5BAnRqLQABIgsgBU0EQCAFIQMMAQsDQCAIRQ0PIAQtAAAgCXQhCyAEQQFqIQQgCEEBayEIIAlBCGoiAyEJIAMgEiAKIAtqIgogFXEiDkECdGotAAEiC0kNAAsLIBIgDkECdGoiAS8BAiETAkBBACABLQAAIhEgEUHwAXEbRQRAIAshBgwBCyAIIQYgBCEBAkAgAyIFIAsgEiAKQX8gCyARanRBf3MiFXEgC3YgE2oiEUECdGotAAEiDmpPBEAgAyEJDAELA0AgBkUNDyABLQAAIAV0IQ4gAUEBaiEBIAZBAWshBiAFQQhqIgkhBSALIBIgCiAOaiIKIBVxIAt2IBNqIhFBAnRqLQABIg5qIAlLDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAs2ApBHIAsgDmohBiAJIAtrIQMgCiALdiEKIA4hCwsgByAGNgKQRyAHIBNB//8DcTYCjAEgAyALayEFIAogC3YhCiARRQRAIAdBzf4ANgIEDBALIBFBIHEEQCAHQb/+ADYCBCAHQX82ApBHDBALIBFBwABxBEAgB0HR/gA2AgQgDEHQDjYCGAwQCyAHQcn+ADYCBCAHIBFBD3EiAzYClAELAkAgA0UEQCAHKAKMASELIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNDSAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKMASAKQX8gA3RBf3NxaiILNgKMASAJIANrIQUgCiADdiEKCyAHQcr+ADYCBCAHIAs2ApRHCyAFIQkgBiEIIAEhBAJAIAcoApwBIhIgCkF/IAcoAqQBdEF/cyIVcSIOQQJ0ai0AASIDIAVNBEAgBSELDAELA0AgCEUNCiAELQAAIAl0IQMgBEEBaiEEIAhBAWshCCAJQQhqIgshCSALIBIgAyAKaiIKIBVxIg5BAnRqLQABIgNJDQALCyASIA5BAnRqIgEvAQIhEwJAIAEtAAAiEUHwAXEEQCAHKAKQRyEGIAMhCQwBCyAIIQYgBCEBAkAgCyIFIAMgEiAKQX8gAyARanRBf3MiFXEgA3YgE2oiEUECdGotAAEiCWpPBEAgCyEODAELA0AgBkUNCiABLQAAIAV0IQkgAUEBaiEBIAZBAWshBiAFQQhqIg4hBSADIBIgCSAKaiIKIBVxIAN2IBNqIhFBAnRqLQABIglqIA5LDQALIAEhBCAGIQgLIBIgEUECdGoiAS0AACERIAEvAQIhEyAHIAcoApBHIANqIgY2ApBHIA4gA2shCyAKIAN2IQoLIAcgBiAJajYCkEcgCyAJayEFIAogCXYhCiARQcAAcQRAIAdB0f4ANgIEIAxB7A42AhggBCEBIAghBiAHKAIEIQgMEgsgB0HL/gA2AgQgByARQQ9xIgM2ApQBIAcgE0H//wNxNgKQAQsCQCADRQRAIAQhASAIIQYMAQsgBSEJIAghBiAEIQsCQCADIAVNBEAgBCEBDAELA0AgBkUNCCAGQQFrIQYgCy0AACAJdCAKaiEKIAtBAWoiASELIAlBCGoiCSADSQ0ACwsgByAHKAKQRyADajYCkEcgByAHKAKQASAKQX8gA3RBf3NxajYCkAEgCSADayEFIAogA3YhCgsgB0HM/gA2AgQLIA9FDQACfyAHKAKQASIIIBYgD2siBEsEQAJAIAggBGsiCCAHKAIwTQ0AIAcoAoxHRQ0AIAdB0f4ANgIEIAxBuQw2AhggBygCBCEIDBILAn8CQAJ/IAcoAjQiBCAISQRAIAcoAjggBygCLCAIIARrIghragwBCyAHKAI4IAQgCGtqCyILIBAgDyAQaiAQa0EBaqwiISAPIAcoAowBIgQgCCAEIAhJGyIEIAQgD0sbIgitIiIgISAiVBsiIqciCWoiBEkgCyAQT3ENACALIBBNIAkgC2ogEEtxDQAgECALIAkQBxogBAwBCyAQIAsgCyAQayIEIARBH3UiBGogBHMiCRAHIAlqIQQgIiAJrSIkfSIjUEUEQCAJIAtqIQkDQAJAICMgJCAjICRUGyIiQiBUBEAgIiEhDAELICIiIUIgfSImQgWIQgF8QgODIiVQRQRAA0AgBCAJKQAANwAAIAQgCSkAGDcAGCAEIAkpABA3ABAgBCAJKQAINwAIICFCIH0hISAJQSBqIQkgBEEgaiEEICVCAX0iJUIAUg0ACwsgJkLgAFQNAANAIAQgCSkAADcAACAEIAkpABg3ABggBCAJKQAQNwAQIAQgCSkACDcACCAEIAkpADg3ADggBCAJKQAwNwAwIAQgCSkAKDcAKCAEIAkpACA3ACAgBCAJKQBYNwBYIAQgCSkAUDcAUCAEIAkpAEg3AEggBCAJKQBANwBAIAQgCSkAYDcAYCAEIAkpAGg3AGggBCAJKQBwNwBwIAQgCSkAeDcAeCAJQYABaiEJIARBgAFqIQQgIUKAAX0iIUIfVg0ACwsgIUIQWgRAIAQgCSkAADcAACAEIAkpAAg3AAggIUIQfSEhIAlBEGohCSAEQRBqIQQLICFCCFoEQCAEIAkpAAA3AAAgIUIIfSEhIAlBCGohCSAEQQhqIQQLICFCBFoEQCAEIAkoAAA2AAAgIUIEfSEhIAlBBGohCSAEQQRqIQQLICFCAloEQCAEIAkvAAA7AAAgIUICfSEhIAlBAmohCSAEQQJqIQQLICMgIn0hIyAhUEUEQCAEIAktAAA6AAAgCUEBaiEJIARBAWohBAsgI0IAUg0ACwsgBAsMAQsgECAIIA8gBygCjAEiBCAEIA9LGyIIIA9ByIABKAIAEQQACyEQIAcgBygCjAEgCGsiBDYCjAEgDyAIayEPIAQNAiAHQcj+ADYCBCAHKAIEIQgMDwsgDSEJCyAJIQQMDgsgBygCBCEIDAwLIAEgBmohASAFIAZBA3RqIQUMCgsgBCAIaiEBIAUgCEEDdGohBQwJCyAEIAhqIQEgCyAIQQN0aiEFDAgLIAEgBmohASAFIAZBA3RqIQUMBwsgBCAIaiEBIAUgCEEDdGohBQwGCyAEIAhqIQEgAyAIQQN0aiEFDAULIAEgBmohASAFIAZBA3RqIQUMBAsgB0HR/gA2AgQgDEG8CTYCGCAHKAIEIQgMBAsgBCEBIAghBiAHKAIEIQgMAwtBACEGIAQhBSANIQQMAwsCQAJAIAhFBEAgCiEJDAELIAcoAhRFBEAgCiEJDAELAkAgBUEfSw0AIAZFDQMgBUEIaiEJIAFBAWohBCAGQQFrIQsgAS0AACAFdCAKaiEKIAVBGE8EQCAEIQEgCyEGIAkhBQwBCyALRQRAIAQhAUEAIQYgCSEFIA0hBAwGCyAFQRBqIQsgAUECaiEEIAZBAmshAyABLQABIAl0IApqIQogBUEPSwRAIAQhASADIQYgCyEFDAELIANFBEAgBCEBQQAhBiALIQUgDSEEDAYLIAVBGGohCSABQQNqIQQgBkEDayEDIAEtAAIgC3QgCmohCiAFQQdLBEAgBCEBIAMhBiAJIQUMAQsgA0UEQCAEIQFBACEGIAkhBSANIQQMBgsgBUEgaiEFIAZBBGshBiABLQADIAl0IApqIQogAUEEaiEBC0EAIQkgCEEEcQRAIAogBygCIEcNAgtBACEFCyAHQdD+ADYCBEEBIQQgCSEKDAMLIAdB0f4ANgIEIAxBjQw2AhggBygCBCEIDAELC0EAIQYgDSEECyAMIA82AhAgDCAQNgIMIAwgBjYCBCAMIAE2AgAgByAFNgKIASAHIAo2AoQBAkAgBygCLA0AIA8gFkYNAiAHKAIEIgFB0P4ASw0CIAFBzv4ASQ0ACwJ/IBYgD2shCiAHKAIMQQRxIQkCQAJAAkAgDCgCHCIDKAI4Ig1FBEBBASEIIAMgAygCACIBKAIgIAEoAiggAygCmEdBASADKAIodGpBARAoIg02AjggDUUNAQsgAygCLCIGRQRAIANCADcDMCADQQEgAygCKHQiBjYCLAsgBiAKTQRAAkAgCQRAAkAgBiAKTw0AIAogBmshBSAQIAprIQEgDCgCHCIGKAIUBEAgBkFAayABIAVBAEHYgAEoAgARCAAMAQsgBiAGKAIcIAEgBUHAgAEoAgARAAAiATYCHCAMIAE2AjALIAMoAiwiDUUNASAQIA1rIQUgAygCOCEBIAwoAhwiBigCFARAIAZBQGsgASAFIA1B3IABKAIAEQgADAILIAYgBigCHCABIAUgDUHEgAEoAgARBAAiATYCHCAMIAE2AjAMAQsgDSAQIAZrIAYQBxoLIANBADYCNCADIAMoAiw2AjBBAAwECyAKIAYgAygCNCIFayIBIAEgCksbIQsgECAKayEGIAUgDWohBQJAIAkEQAJAIAtFDQAgDCgCHCIBKAIUBEAgAUFAayAFIAYgC0HcgAEoAgARCAAMAQsgASABKAIcIAUgBiALQcSAASgCABEEACIBNgIcIAwgATYCMAsgCiALayIFRQ0BIBAgBWshBiADKAI4IQEgDCgCHCINKAIUBEAgDUFAayABIAYgBUHcgAEoAgARCAAMBQsgDSANKAIcIAEgBiAFQcSAASgCABEEACIBNgIcIAwgATYCMAwECyAFIAYgCxAHGiAKIAtrIgUNAgtBACEIIANBACADKAI0IAtqIgUgBSADKAIsIgFGGzYCNCABIAMoAjAiAU0NACADIAEgC2o2AjALIAgMAgsgAygCOCAQIAVrIAUQBxoLIAMgBTYCNCADIAMoAiw2AjBBAAtFBEAgDCgCECEPIAwoAgQhFyAHKAKIAQwDCyAHQdL+ADYCBAtBfCEXDAILIAYhFyAFCyEFIAwgICAXayIBIAwoAghqNgIIIAwgFiAPayIGIAwoAhRqNgIUIAcgBygCICAGajYCICAMIAcoAghBAEdBBnQgBWogBygCBCIFQb/+AEZBB3RqQYACIAVBwv4ARkEIdCAFQcf+AEYbajYCLCAEIARBeyAEGyABIAZyGyEXCyAUQRBqJAAgFwshASACIAIpAwAgADUCIH03AwACQAJAAkACQCABQQVqDgcBAgICAgMAAgtBAQ8LIAAoAhQNAEEDDwsgACgCACIABEAgACABNgIEIABBDTYCAAtBAiEBCyABCwkAIABBAToADAtEAAJAIAJC/////w9YBEAgACgCFEUNAQsgACgCACIABEAgAEEANgIEIABBEjYCAAtBAA8LIAAgATYCECAAIAI+AhRBAQu5AQEEfyAAQRBqIQECfyAALQAEBEAgARCEAQwBC0F+IQMCQCABRQ0AIAEoAiBFDQAgASgCJCIERQ0AIAEoAhwiAkUNACACKAIAIAFHDQAgAigCBEG0/gBrQR9LDQAgAigCOCIDBEAgBCABKAIoIAMQHiABKAIkIQQgASgCHCECCyAEIAEoAiggAhAeQQAhAyABQQA2AhwLIAMLIgEEQCAAKAIAIgAEQCAAIAE2AgQgAEENNgIACwsgAUUL0gwBBn8gAEIANwIQIABCADcCHCAAQRBqIQICfyAALQAEBEAgACgCCCEBQesMLQAAQTFGBH8Cf0F+IQMCQCACRQ0AIAJBADYCGCACKAIgIgRFBEAgAkEANgIoIAJBJzYCIEEnIQQLIAIoAiRFBEAgAkEoNgIkC0EGIAEgAUF/RhsiBUEASA0AIAVBCUoNAEF8IQMgBCACKAIoQQFB0C4QKCIBRQ0AIAIgATYCHCABIAI2AgAgAUEPNgI0IAFCgICAgKAFNwIcIAFBADYCFCABQYCAAjYCMCABQf//ATYCOCABIAIoAiAgAigCKEGAgAJBAhAoNgJIIAEgAigCICACKAIoIAEoAjBBAhAoIgM2AkwgA0EAIAEoAjBBAXQQGSACKAIgIAIoAihBgIAEQQIQKCEDIAFBgIACNgLoLSABQQA2AkAgASADNgJQIAEgAigCICACKAIoQYCAAkEEECgiAzYCBCABIAEoAugtIgRBAnQ2AgwCQAJAIAEoAkhFDQAgASgCTEUNACABKAJQRQ0AIAMNAQsgAUGaBTYCICACQejAACgCADYCGCACEIQBGkF8DAILIAFBADYCjAEgASAFNgKIASABQgA3AyggASADIARqNgLsLSABIARBA2xBA2s2AvQtQX4hAwJAIAJFDQAgAigCIEUNACACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQACQAJAIAEoAiAiBEE5aw45AQICAgICAgICAgICAQICAgECAgICAgICAgICAgICAgICAgECAgICAgICAgICAgECAgICAgICAgIBAAsgBEGaBUYNACAEQSpHDQELIAJBAjYCLCACQQA2AgggAkIANwIUIAFBADYCECABIAEoAgQ2AgggASgCFCIDQX9MBEAgAUEAIANrIgM2AhQLIAFBOUEqIANBAkYbNgIgIAIgA0ECRgR/IAFBoAFqQeSAASgCABEBAAVBAQs2AjAgAUF+NgIkIAFBADYCoC4gAUIANwOYLiABQYgXakGg0wA2AgAgASABQcwVajYCgBcgAUH8FmpBjNMANgIAIAEgAUHYE2o2AvQWIAFB8BZqQfjSADYCACABIAFB5AFqNgLoFiABEIgBQQAhAwsgAw0AIAIoAhwiAiACKAIwQQF0NgJEQQAhAyACKAJQQQBBgIAIEBkgAiACKAKIASIEQQxsIgFBtNgAai8BADYClAEgAiABQbDYAGovAQA2ApABIAIgAUGy2ABqLwEANgJ4IAIgAUG22ABqLwEANgJ0QfiAASgCACEFQeyAASgCACEGQYCBASgCACEBIAJCADcCbCACQgA3AmQgAkEANgI8IAJBADYChC4gAkIANwJUIAJBKSABIARBCUYiARs2AnwgAkEqIAYgARs2AoABIAJBKyAFIAEbNgKEAQsgAwsFQXoLDAELAn9BekHrDC0AAEExRw0AGkF+IAJFDQAaIAJBADYCGCACKAIgIgNFBEAgAkEANgIoIAJBJzYCIEEnIQMLIAIoAiRFBEAgAkEoNgIkC0F8IAMgAigCKEEBQaDHABAoIgRFDQAaIAIgBDYCHCAEQQA2AjggBCACNgIAIARBtP4ANgIEIARBzIABKAIAEQkANgKYR0F+IQMCQCACRQ0AIAIoAiBFDQAgAigCJCIFRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQACQAJAIAEoAjgiBgRAIAEoAihBD0cNAQsgAUEPNgIoIAFBADYCDAwBCyAFIAIoAiggBhAeIAFBADYCOCACKAIgIQUgAUEPNgIoIAFBADYCDCAFRQ0BCyACKAIkRQ0AIAIoAhwiAUUNACABKAIAIAJHDQAgASgCBEG0/gBrQR9LDQBBACEDIAFBADYCNCABQgA3AiwgAUEANgIgIAJBADYCCCACQgA3AhQgASgCDCIFBEAgAiAFQQFxNgIwCyABQrT+ADcCBCABQgA3AoQBIAFBADYCJCABQoCAgoAQNwMYIAFCgICAgHA3AxAgAUKBgICAcDcCjEcgASABQfwKaiIFNgK4ASABIAU2ApwBIAEgBTYCmAELQQAgA0UNABogAigCJCACKAIoIAQQHiACQQA2AhwgAwsLIgIEQCAAKAIAIgAEQCAAIAI2AgQgAEENNgIACwsgAkULKQEBfyAALQAERQRAQQAPC0ECIQEgACgCCCIAQQNOBH8gAEEHSgVBAgsLBgAgABAGC2MAQcgAEAkiAEUEQEGEhAEoAgAhASACBEAgAiABNgIEIAJBATYCAAsgAA8LIABBADoADCAAQQE6AAQgACACNgIAIABBADYCOCAAQgA3AzAgACABQQkgAUEBa0EJSRs2AgggAAukCgIIfwF+QfCAAUH0gAEgACgCdEGBCEkbIQYCQANAAkACfwJAIAAoAjxBhQJLDQAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNAiACQQRPDQBBAAwBCyAAIAAoAmggACgChAERAgALIQMgACAAKAJsOwFgQQIhAgJAIAA1AmggA619IgpCAVMNACAKIAAoAjBBhgJrrVUNACAAKAJwIAAoAnhPDQAgA0UNACAAIAMgBigCABECACICQQVLDQBBAiACIAAoAowBQQFGGyECCwJAIAAoAnAiA0EDSQ0AIAIgA0sNACAAIAAoAvAtIgJBAWo2AvAtIAAoAjwhBCACIAAoAuwtaiAAKAJoIgcgAC8BYEF/c2oiAjoAACAAIAAoAvAtIgVBAWo2AvAtIAUgACgC7C1qIAJBCHY6AAAgACAAKALwLSIFQQFqNgLwLSAFIAAoAuwtaiADQQNrOgAAIAAgACgCgC5BAWo2AoAuIANB/c4Aai0AAEECdCAAakHoCWoiAyADLwEAQQFqOwEAIAAgAkEBayICIAJBB3ZBgAJqIAJBgAJJG0GAywBqLQAAQQJ0akHYE2oiAiACLwEAQQFqOwEAIAAgACgCcCIFQQFrIgM2AnAgACAAKAI8IANrNgI8IAAoAvQtIQggACgC8C0hCSAEIAdqQQNrIgQgACgCaCICSwRAIAAgAkEBaiAEIAJrIgIgBUECayIEIAIgBEkbIAAoAoABEQUAIAAoAmghAgsgAEEANgJkIABBADYCcCAAIAIgA2oiBDYCaCAIIAlHDQJBACECIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgBCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQIMAwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAyAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qQQA6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtakEAOgAAIAAgACgC8C0iBEEBajYC8C0gBCAAKALsLWogAzoAACAAIANBAnRqIgMgAy8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRgRAIAAgACgCWCIDQQBOBH8gACgCSCADagVBAAsgACgCaCADa0EAEA8gACAAKAJoNgJYIAAoAgAQCgsgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwgACgCACgCEA0CQQAPBSAAQQE2AmQgACACNgJwIAAgACgCaEEBajYCaCAAIAAoAjxBAWs2AjwMAgsACwsgACgCZARAIAAoAmggACgCSGpBAWstAAAhAiAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtakEAOgAAIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWogAjoAACAAIAJBAnRqIgIgAi8B5AFBAWo7AeQBIAAoAvAtIAAoAvQtRhogAEEANgJkCyAAIAAoAmgiA0ECIANBAkkbNgKELiABQQRGBEAgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyADIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACECIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgAyABa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0BC0EBIQILIAIL2BACEH8BfiAAKAKIAUEFSCEOA0ACQAJ/AkACQAJAAn8CQAJAIAAoAjxBhQJNBEAgABAvIAAoAjwiA0GFAksNASABDQFBAA8LIA4NASAIIQMgBSEHIAohDSAGQf//A3FFDQEMAwsgA0UNA0EAIANBBEkNARoLIAAgACgCaEH4gAEoAgARAgALIQZBASECQQAhDSAAKAJoIgOtIAatfSISQgFTDQIgEiAAKAIwQYYCa61VDQIgBkUNAiAAIAZB8IABKAIAEQIAIgZBASAGQfz/A3EbQQEgACgCbCINQf//A3EgA0H//wNxSRshBiADIQcLAkAgACgCPCIEIAZB//8DcSICQQRqTQ0AIAZB//8DcUEDTQRAQQEgBkEBa0H//wNxIglFDQQaIANB//8DcSIEIAdBAWpB//8DcSIDSw0BIAAgAyAJIAQgA2tBAWogAyAJaiAESxtB7IABKAIAEQUADAELAkAgACgCeEEEdCACSQ0AIARBBEkNACAGQQFrQf//A3EiDCAHQQFqQf//A3EiBGohCSAEIANB//8DcSIDTwRAQeyAASgCACELIAMgCUkEQCAAIAQgDCALEQUADAMLIAAgBCADIARrQQFqIAsRBQAMAgsgAyAJTw0BIAAgAyAJIANrQeyAASgCABEFAAwBCyAGIAdqQf//A3EiA0UNACAAIANBAWtB+IABKAIAEQIAGgsgBgwCCyAAIAAoAmgiBUECIAVBAkkbNgKELiABQQRGBEBBACEDIAAgACgCWCIBQQBOBH8gACgCSCABagVBAAsgBSABa0EBEA8gACAAKAJoNgJYIAAoAgAQCkEDQQIgACgCACgCEBsPCyAAKALwLQRAQQAhAkEAIQMgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAFIAFrQQAQDyAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQMLQQEhAgwCCyADIQdBAQshBEEAIQYCQCAODQAgACgCPEGHAkkNACACIAdB//8DcSIQaiIDIAAoAkRBhgJrTw0AIAAgAzYCaEEAIQogACADQfiAASgCABECACEFAn8CQCAAKAJoIgitIAWtfSISQgFTDQAgEiAAKAIwQYYCa61VDQAgBUUNACAAIAVB8IABKAIAEQIAIQYgAC8BbCIKIAhB//8DcSIFTw0AIAZB//8DcSIDQQRJDQAgCCAEQf//A3FBAkkNARogCCACIApBAWpLDQEaIAggAiAFQQFqSw0BGiAIIAAoAkgiCSACa0EBaiICIApqLQAAIAIgBWotAABHDQEaIAggCUEBayICIApqIgwtAAAgAiAFaiIPLQAARw0BGiAIIAUgCCAAKAIwQYYCayICa0H//wNxQQAgAiAFSRsiEU0NARogCCADQf8BSw0BGiAGIQUgCCECIAQhAyAIIAoiCUECSQ0BGgNAAkAgA0EBayEDIAVBAWohCyAJQQFrIQkgAkEBayECIAxBAWsiDC0AACAPQQFrIg8tAABHDQAgA0H//wNxRQ0AIBEgAkH//wNxTw0AIAVB//8DcUH+AUsNACALIQUgCUH//wNxQQFLDQELCyAIIANB//8DcUEBSw0BGiAIIAtB//8DcUECRg0BGiAIQQFqIQggAyEEIAshBiAJIQogAgwBC0EBIQYgCAshBSAAIBA2AmgLAn8gBEH//wNxIgNBA00EQCAEQf//A3EiA0UNAyAAKAJIIAdB//8DcWotAAAhBCAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBDoAACAAIARBAnRqIgRB5AFqIAQvAeQBQQFqOwEAIAAgACgCPEEBazYCPCAAKALwLSICIAAoAvQtRiIEIANBAUYNARogACgCSCAHQQFqQf//A3FqLQAAIQkgACACQQFqNgLwLSAAKALsLSACakEAOgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAk6AAAgACAJQQJ0aiICQeQBaiACLwHkAUEBajsBACAAIAAoAjxBAWs2AjwgBCAAKALwLSICIAAoAvQtRmoiBCADQQJGDQEaIAAoAkggB0ECakH//wNxai0AACEHIAAgAkEBajYC8C0gACgC7C0gAmpBADoAACAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qQQA6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHOgAAIAAgB0ECdGoiB0HkAWogBy8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAQgACgC8C0gACgC9C1GagwBCyAAIAAoAvAtIgJBAWo2AvAtIAIgACgC7C1qIAdB//8DcSANQf//A3FrIgc6AAAgACAAKALwLSICQQFqNgLwLSACIAAoAuwtaiAHQQh2OgAAIAAgACgC8C0iAkEBajYC8C0gAiAAKALsLWogBEEDazoAACAAIAAoAoAuQQFqNgKALiADQf3OAGotAABBAnQgAGpB6AlqIgQgBC8BAEEBajsBACAAIAdBAWsiBCAEQQd2QYACaiAEQYACSRtBgMsAai0AAEECdGpB2BNqIgQgBC8BAEEBajsBACAAIAAoAjwgA2s2AjwgACgC8C0gACgC9C1GCyEEIAAgACgCaCADaiIHNgJoIARFDQFBACECQQAhBCAAIAAoAlgiA0EATgR/IAAoAkggA2oFQQALIAcgA2tBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEA0BCwsgAgu0BwIEfwF+AkADQAJAAkACQAJAIAAoAjxBhQJNBEAgABAvAkAgACgCPCICQYUCSw0AIAENAEEADwsgAkUNBCACQQRJDQELIAAgACgCaEH4gAEoAgARAgAhAiAANQJoIAKtfSIGQgFTDQAgBiAAKAIwQYYCa61VDQAgAkUNACAAIAJB8IABKAIAEQIAIgJBBEkNACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qIAAoAmggACgCbGsiAzoAACAAIAAoAvAtIgRBAWo2AvAtIAQgACgC7C1qIANBCHY6AAAgACAAKALwLSIEQQFqNgLwLSAEIAAoAuwtaiACQQNrOgAAIAAgACgCgC5BAWo2AoAuIAJB/c4Aai0AAEECdCAAakHoCWoiBCAELwEAQQFqOwEAIAAgA0EBayIDIANBB3ZBgAJqIANBgAJJG0GAywBqLQAAQQJ0akHYE2oiAyADLwEAQQFqOwEAIAAgACgCPCACayIFNgI8IAAoAvQtIQMgACgC8C0hBCAAKAJ4IAJPQQAgBUEDSxsNASAAIAAoAmggAmoiAjYCaCAAIAJBAWtB+IABKAIAEQIAGiADIARHDQQMAgsgACgCSCAAKAJoai0AACECIAAgACgC8C0iA0EBajYC8C0gAyAAKALsLWpBADoAACAAIAAoAvAtIgNBAWo2AvAtIAMgACgC7C1qQQA6AAAgACAAKALwLSIDQQFqNgLwLSADIAAoAuwtaiACOgAAIAAgAkECdGoiAkHkAWogAi8B5AFBAWo7AQAgACAAKAI8QQFrNgI8IAAgACgCaEEBajYCaCAAKALwLSAAKAL0LUcNAwwBCyAAIAAoAmhBAWoiBTYCaCAAIAUgAkEBayICQeyAASgCABEFACAAIAAoAmggAmo2AmggAyAERw0CC0EAIQNBACECIAAgACgCWCIEQQBOBH8gACgCSCAEagVBAAsgACgCaCAEa0EAEA8gACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQEMAgsLIAAgACgCaCIEQQIgBEECSRs2AoQuIAFBBEYEQEEAIQIgACAAKAJYIgFBAE4EfyAAKAJIIAFqBUEACyAEIAFrQQEQDyAAIAAoAmg2AlggACgCABAKQQNBAiAAKAIAKAIQGw8LIAAoAvAtBEBBACEDQQAhAiAAIAAoAlgiAUEATgR/IAAoAkggAWoFQQALIAQgAWtBABAPIAAgACgCaDYCWCAAKAIAEAogACgCACgCEEUNAQtBASEDCyADC80JAgl/An4gAUEERiEGIAAoAiwhAgJAAkACQCABQQRGBEAgAkECRg0CIAIEQCAAQQAQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQRQ0ECyAAIAYQTyAAQQI2AiwMAQsgAg0BIAAoAjxFDQEgACAGEE8gAEEBNgIsCyAAIAAoAmg2AlgLQQJBASABQQRGGyEKA0ACQCAAKAIMIAAoAhBBCGpLDQAgACgCABAKIAAoAgAiAigCEA0AQQAhAyABQQRHDQIgAigCBA0CIAAoAqAuDQIgACgCLEVBAXQPCwJAAkAgACgCPEGFAk0EQCAAEC8CQCAAKAI8IgNBhQJLDQAgAQ0AQQAPCyADRQ0CIAAoAiwEfyADBSAAIAYQTyAAIAo2AiwgACAAKAJoNgJYIAAoAjwLQQRJDQELIAAgACgCaEH4gAEoAgARAgAhBCAAKAJoIgKtIAStfSILQgFTDQAgCyAAKAIwQYYCa61VDQAgAiAAKAJIIgJqIgMvAAAgAiAEaiICLwAARw0AIANBAmogAkECakHQgAEoAgARAgBBAmoiA0EESQ0AIAAoAjwiAiADIAIgA0kbIgJBggIgAkGCAkkbIgdB/c4Aai0AACICQQJ0IgRBhMkAajMBACEMIARBhskAai8BACEDIAJBCGtBE00EQCAHQQNrIARBgNEAaigCAGutIAOthiAMhCEMIARBsNYAaigCACADaiEDCyAAKAKgLiEFIAMgC6dBAWsiCCAIQQd2QYACaiAIQYACSRtBgMsAai0AACICQQJ0IglBgsoAai8BAGohBCAJQYDKAGozAQAgA62GIAyEIQsgACkDmC4hDAJAIAUgAkEESQR/IAQFIAggCUGA0gBqKAIAa60gBK2GIAuEIQsgCUGw1wBqKAIAIARqCyICaiIDQT9NBEAgCyAFrYYgDIQhCwwBCyAFQcAARgRAIAAoAgQgACgCEGogDDcAACAAIAAoAhBBCGo2AhAgAiEDDAELIAAoAgQgACgCEGogCyAFrYYgDIQ3AAAgACAAKAIQQQhqNgIQIANBQGohAyALQcAAIAVrrYghCwsgACALNwOYLiAAIAM2AqAuIAAgACgCPCAHazYCPCAAIAAoAmggB2o2AmgMAgsgACgCSCAAKAJoai0AAEECdCICQYDBAGozAQAhCyAAKQOYLiEMAkAgACgCoC4iBCACQYLBAGovAQAiAmoiA0E/TQRAIAsgBK2GIAyEIQsMAQsgBEHAAEYEQCAAKAIEIAAoAhBqIAw3AAAgACAAKAIQQQhqNgIQIAIhAwwBCyAAKAIEIAAoAhBqIAsgBK2GIAyENwAAIAAgACgCEEEIajYCECADQUBqIQMgC0HAACAEa62IIQsLIAAgCzcDmC4gACADNgKgLiAAIAAoAmhBAWo2AmggACAAKAI8QQFrNgI8DAELCyAAIAAoAmgiAkECIAJBAkkbNgKELiAAKAIsIQIgAUEERgRAAkAgAkUNACAAQQEQUCAAQQA2AiwgACAAKAJoNgJYIAAoAgAQCiAAKAIAKAIQDQBBAg8LQQMPCyACBEBBACEDIABBABBQIABBADYCLCAAIAAoAmg2AlggACgCABAKIAAoAgAoAhBFDQELQQEhAwsgAwucAQEFfyACQQFOBEAgAiAAKAJIIAFqIgNqQQJqIQQgA0ECaiECIAAoAlQhAyAAKAJQIQUDQCAAIAItAAAgA0EFdEHg/wFxcyIDNgJUIAUgA0EBdGoiBi8BACIHIAFB//8DcUcEQCAAKAJMIAEgACgCOHFB//8DcUEBdGogBzsBACAGIAE7AQALIAFBAWohASACQQFqIgIgBEkNAAsLC1sBAn8gACAAKAJIIAFqLQACIAAoAlRBBXRB4P8BcXMiAjYCVCABIAAoAlAgAkEBdGoiAy8BACICRwRAIAAoAkwgACgCOCABcUEBdGogAjsBACADIAE7AQALIAILEwAgAUEFdEHg/wFxIAJB/wFxcwsGACABEAYLLwAjAEEQayIAJAAgAEEMaiABIAJsEIwBIQEgACgCDCECIABBEGokAEEAIAIgARsLjAoCAX4CfyMAQfAAayIGJAACQAJAAkACQAJAAkACQAJAIAQODwABBwIEBQYGBgYGBgYGAwYLQn8hBQJAIAAgBkHkAGpCDBARIgNCf1cEQCABBEAgASAAKAIMNgIAIAEgACgCEDYCBAsMAQsCQCADQgxSBEAgAQRAIAFBADYCBCABQRE2AgALDAELIAEoAhQhBEEAIQJCASEFA0AgBkHkAGogAmoiAiACLQAAIARB/f8DcSICQQJyIAJBA3NsQQh2cyICOgAAIAYgAjoAKCABAn8gASgCDEF/cyECQQAgBkEoaiIERQ0AGiACIARBAUHUgAEoAgARAAALQX9zIgI2AgwgASABKAIQIAJB/wFxakGFiKLAAGxBAWoiAjYCECAGIAJBGHY6ACggAQJ/IAEoAhRBf3MhAkEAIAZBKGoiBEUNABogAiAEQQFB1IABKAIAEQAAC0F/cyIENgIUIAVCDFIEQCAFpyECIAVCAXwhBQwBCwtCACEFIAAgBkEoahAhQQBIDQEgBigCUCEAIwBBEGsiAiQAIAIgADYCDCAGAn8gAkEMahCNASIARQRAIAZBITsBJEEADAELAn8gACgCFCIEQdAATgRAIARBCXQMAQsgAEHQADYCFEGAwAILIQQgBiAAKAIMIAQgACgCEEEFdGpqQaDAAWo7ASQgACgCBEEFdCAAKAIIQQt0aiAAKAIAQQF2ags7ASYgAkEQaiQAIAYtAG8iACAGLQBXRg0BIAYtACcgAEYNASABBEAgAUEANgIEIAFBGzYCAAsLQn8hBQsgBkHwAGokACAFDwtCfyEFIAAgAiADEBEiA0J/VwRAIAEEQCABIAAoAgw2AgAgASAAKAIQNgIECwwGCyMAQRBrIgAkAAJAIANQDQAgASgCFCEEIAJFBEBCASEFA0AgACACIAdqLQAAIARB/f8DcSIEQQJyIARBA3NsQQh2czoADyABAn8gASgCDEF/cyEEQQAgAEEPaiIHRQ0AGiAEIAdBAUHUgAEoAgARAAALQX9zIgQ2AgwgASABKAIQIARB/wFxakGFiKLAAGxBAWoiBDYCECAAIARBGHY6AA8gAQJ/IAEoAhRBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIUIAMgBVENAiAFpyEHIAVCAXwhBQwACwALQgEhBQNAIAAgAiAHai0AACAEQf3/A3EiBEECciAEQQNzbEEIdnMiBDoADyACIAdqIAQ6AAAgAQJ/IAEoAgxBf3MhBEEAIABBD2oiB0UNABogBCAHQQFB1IABKAIAEQAAC0F/cyIENgIMIAEgASgCECAEQf8BcWpBhYiiwABsQQFqIgQ2AhAgACAEQRh2OgAPIAECfyABKAIUQX9zIQRBACAAQQ9qIgdFDQAaIAQgB0EBQdSAASgCABEAAAtBf3MiBDYCFCADIAVRDQEgBachByAFQgF8IQUMAAsACyAAQRBqJAAgAyEFDAULIAJBADsBMiACIAIpAwAiA0KAAYQ3AwAgA0IIg1ANBCACIAIpAyBCDH03AyAMBAsgBkKFgICAcDcDECAGQoOAgIDAADcDCCAGQoGAgIAgNwMAQQAgBhAkIQUMAwsgA0IIWgR+IAIgASgCADYCACACIAEoAgQ2AgRCCAVCfwshBQwCCyABEAYMAQsgAQRAIAFBADYCBCABQRI2AgALQn8hBQsgBkHwAGokACAFC60DAgJ/An4jAEEQayIGJAACQAJAAkAgBEUNACABRQ0AIAJBAUYNAQtBACEDIABBCGoiAARAIABBADYCBCAAQRI2AgALDAELIANBAXEEQEEAIQMgAEEIaiIABEAgAEEANgIEIABBGDYCAAsMAQtBGBAJIgVFBEBBACEDIABBCGoiAARAIABBADYCBCAAQQ42AgALDAELIAVBADYCCCAFQgA3AgAgBUGQ8dmiAzYCFCAFQvis0ZGR8dmiIzcCDAJAIAQQIiICRQ0AIAKtIQhBACEDQYfTru5+IQJCASEHA0AgBiADIARqLQAAOgAPIAUgBkEPaiIDBH8gAiADQQFB1IABKAIAEQAABUEAC0F/cyICNgIMIAUgBSgCECACQf8BcWpBhYiiwABsQQFqIgI2AhAgBiACQRh2OgAPIAUCfyAFKAIUQX9zIQJBACAGQQ9qIgNFDQAaIAIgA0EBQdSAASgCABEAAAtBf3M2AhQgByAIUQ0BIAUoAgxBf3MhAiAHpyEDIAdCAXwhBwwACwALIAAgAUElIAUQQiIDDQAgBRAGQQAhAwsgBkEQaiQAIAMLnRoCBn4FfyMAQdAAayILJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCADDhQFBhULAwQJDgACCBAKDw0HEQERDBELAkBByAAQCSIBBEAgAUIANwMAIAFCADcDMCABQQA2AiggAUIANwMgIAFCADcDGCABQgA3AxAgAUIANwMIIAFCADcDOCABQQgQCSIDNgIEIAMNASABEAYgAARAIABBADYCBCAAQQ42AgALCyAAQQA2AhQMFAsgA0IANwMAIAAgATYCFCABQUBrQgA3AwAgAUIANwM4DBQLAkACQCACUARAQcgAEAkiA0UNFCADQgA3AwAgA0IANwMwIANBADYCKCADQgA3AyAgA0IANwMYIANCADcDECADQgA3AwggA0IANwM4IANBCBAJIgE2AgQgAQ0BIAMQBiAABEAgAEEANgIEIABBDjYCAAsMFAsgAiAAKAIQIgEpAzBWBEAgAARAIABBADYCBCAAQRI2AgALDBQLIAEoAigEQCAABEAgAEEANgIEIABBHTYCAAsMFAsgASgCBCEDAkAgASkDCCIGQgF9IgdQDQADQAJAIAIgAyAHIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQcMAQsgBSAGUQRAIAYhBQwDCyADIAVCAXwiBKdBA3RqKQMAIAJWDQILIAQhBSAEIAdUDQALCwJAIAIgAyAFpyIKQQN0aikDAH0iBFBFBEAgASgCACIDIApBBHRqKQMIIQcMAQsgASgCACIDIAVCAX0iBadBBHRqKQMIIgchBAsgAiAHIAR9VARAIAAEQCAAQQA2AgQgAEEcNgIACwwUCyADIAVCAXwiBUEAIAAQiQEiA0UNEyADKAIAIAMoAggiCkEEdGpBCGsgBDcDACADKAIEIApBA3RqIAI3AwAgAyACNwMwIAMgASkDGCIGIAMpAwgiBEIBfSIHIAYgB1QbNwMYIAEgAzYCKCADIAE2AiggASAENwMgIAMgBTcDIAwBCyABQgA3AwALIAAgAzYCFCADIAQ3A0AgAyACNwM4QgAhBAwTCyAAKAIQIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAKAIUIQEgAEEANgIUIAAgATYCEAwSCyACQghaBH4gASAAKAIANgIAIAEgACgCBDYCBEIIBUJ/CyEEDBELIAAoAhAiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAoAhQiAQRAAkAgASgCKCIDRQRAIAEpAxghAgwBCyADQQA2AiggASgCKEIANwMgIAEgASkDGCICIAEpAyAiBSACIAVWGyICNwMYCyABKQMIIAJWBEADQCABKAIAIAKnQQR0aigCABAGIAJCAXwiAiABKQMIVA0ACwsgASgCABAGIAEoAgQQBiABEAYLIAAQBgwQCyAAKAIQIgBCADcDOCAAQUBrQgA3AwAMDwsgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwOCyACIAAoAhAiAykDMCADKQM4IgZ9IgUgAiAFVBsiBVANDiABIAMpA0AiB6ciAEEEdCIBIAMoAgBqIgooAgAgBiADKAIEIABBA3RqKQMAfSICp2ogBSAKKQMIIAJ9IgYgBSAGVBsiBKcQByEKIAcgBCADKAIAIgAgAWopAwggAn1RrXwhAiAFIAZWBEADQCAKIASnaiAAIAKnQQR0IgFqIgAoAgAgBSAEfSIGIAApAwgiByAGIAdUGyIGpxAHGiACIAYgAygCACIAIAFqKQMIUa18IQIgBSAEIAZ8IgRWDQALCyADIAI3A0AgAyADKQM4IAR8NwM4DA4LQn8hBEHIABAJIgNFDQ0gA0IANwMAIANCADcDMCADQQA2AiggA0IANwMgIANCADcDGCADQgA3AxAgA0IANwMIIANCADcDOCADQQgQCSIBNgIEIAFFBEAgAxAGIAAEQCAAQQA2AgQgAEEONgIACwwOCyABQgA3AwAgACgCECIBBEACQCABKAIoIgpFBEAgASkDGCEEDAELIApBADYCKCABKAIoQgA3AyAgASABKQMYIgIgASkDICIFIAIgBVYbIgQ3AxgLIAEpAwggBFYEQANAIAEoAgAgBKdBBHRqKAIAEAYgBEIBfCIEIAEpAwhUDQALCyABKAIAEAYgASgCBBAGIAEQBgsgACADNgIQQgAhBAwNCyAAKAIUIgEEQAJAIAEoAigiA0UEQCABKQMYIQIMAQsgA0EANgIoIAEoAihCADcDICABIAEpAxgiAiABKQMgIgUgAiAFVhsiAjcDGAsgASkDCCACVgRAA0AgASgCACACp0EEdGooAgAQBiACQgF8IgIgASkDCFQNAAsLIAEoAgAQBiABKAIEEAYgARAGCyAAQQA2AhQMDAsgACgCECIDKQM4IAMpAzAgASACIAAQRCIHQgBTDQogAyAHNwM4AkAgAykDCCIGQgF9IgJQDQAgAygCBCEAA0ACQCAHIAAgAiAEfUIBiCAEfCIFp0EDdGopAwBUBEAgBUIBfSECDAELIAUgBlEEQCAGIQUMAwsgACAFQgF8IgSnQQN0aikDACAHVg0CCyAEIQUgAiAEVg0ACwsgAyAFNwNAQgAhBAwLCyAAKAIUIgMpAzggAykDMCABIAIgABBEIgdCAFMNCSADIAc3AzgCQCADKQMIIgZCAX0iAlANACADKAIEIQADQAJAIAcgACACIAR9QgGIIAR8IgWnQQN0aikDAFQEQCAFQgF9IQIMAQsgBSAGUQRAIAYhBQwDCyAAIAVCAXwiBKdBA3RqKQMAIAdWDQILIAQhBSACIARWDQALCyADIAU3A0BCACEEDAoLIAJCN1gEQCAABEAgAEEANgIEIABBEjYCAAsMCQsgARAqIAEgACgCDDYCKCAAKAIQKQMwIQIgAUEANgIwIAEgAjcDICABIAI3AxggAULcATcDAEI4IQQMCQsgACABKAIANgIMDAgLIAtBQGtBfzYCACALQouAgICwAjcDOCALQoyAgIDQATcDMCALQo+AgICgATcDKCALQpGAgICQATcDICALQoeAgICAATcDGCALQoWAgIDgADcDECALQoOAgIDAADcDCCALQoGAgIAgNwMAQQAgCxAkIQQMBwsgACgCECkDOCIEQn9VDQYgAARAIABBPTYCBCAAQR42AgALDAULIAAoAhQpAzgiBEJ/VQ0FIAAEQCAAQT02AgQgAEEeNgIACwwEC0J/IQQgAkJ/VwRAIAAEQCAAQQA2AgQgAEESNgIACwwFCyACIAAoAhQiAykDOCACfCIFQv//A3wiBFYEQCAABEAgAEEANgIEIABBEjYCAAsMBAsCQCAFIAMoAgQiCiADKQMIIganQQN0aikDACIHWA0AAkAgBCAHfUIQiCAGfCIIIAMpAxAiCVgNAEIQIAkgCVAbIQUDQCAFIgRCAYYhBSAEIAhUDQALIAQgCVQNACADKAIAIASnIgpBBHQQNCIMRQ0DIAMgDDYCACADKAIEIApBA3RBCGoQNCIKRQ0DIAMgBDcDECADIAo2AgQgAykDCCEGCyAGIAhaDQAgAygCACEMA0AgDCAGp0EEdGoiDUGAgAQQCSIONgIAIA5FBEAgAARAIABBADYCBCAAQQ42AgALDAYLIA1CgIAENwMIIAMgBkIBfCIFNwMIIAogBadBA3RqIAdCgIAEfCIHNwMAIAMpAwgiBiAIVA0ACwsgAykDQCEFIAMpAzghBwJAIAJQBEBCACEEDAELIAWnIgBBBHQiDCADKAIAaiINKAIAIAcgCiAAQQN0aikDAH0iBqdqIAEgAiANKQMIIAZ9IgcgAiAHVBsiBKcQBxogBSAEIAMoAgAiACAMaikDCCAGfVGtfCEFIAIgB1YEQANAIAAgBadBBHQiCmoiACgCACABIASnaiACIAR9IgYgACkDCCIHIAYgB1QbIganEAcaIAUgBiADKAIAIgAgCmopAwhRrXwhBSAEIAZ8IgQgAlQNAAsLIAMpAzghBwsgAyAFNwNAIAMgBCAHfCICNwM4IAIgAykDMFgNBCADIAI3AzAMBAsgAARAIABBADYCBCAAQRw2AgALDAILIAAEQCAAQQA2AgQgAEEONgIACyAABEAgAEEANgIEIABBDjYCAAsMAQsgAEEANgIUC0J/IQQLIAtB0ABqJAAgBAtIAQF/IABCADcCBCAAIAE2AgACQCABQQBIDQBBsBMoAgAgAUwNACABQQJ0QcATaigCAEEBRw0AQYSEASgCACECCyAAIAI2AgQLDgAgAkGx893xeWxBEHYLvgEAIwBBEGsiACQAIABBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAQRBqJAAgAkGx893xeWxBEHYLuQEBAX8jAEEQayIBJAAgAUEAOgAIQYCBAUECNgIAQfyAAUEDNgIAQfiAAUEENgIAQfSAAUEFNgIAQfCAAUEGNgIAQeyAAUEHNgIAQeiAAUEINgIAQeSAAUEJNgIAQeCAAUEKNgIAQdyAAUELNgIAQdiAAUEMNgIAQdSAAUENNgIAQdCAAUEONgIAQcyAAUEPNgIAQciAAUEQNgIAQcSAAUERNgIAQcCAAUESNgIAIAAQjgEgAUEQaiQAC78BAQF/IwBBEGsiAiQAIAJBADoACEGAgQFBAjYCAEH8gAFBAzYCAEH4gAFBBDYCAEH0gAFBBTYCAEHwgAFBBjYCAEHsgAFBBzYCAEHogAFBCDYCAEHkgAFBCTYCAEHggAFBCjYCAEHcgAFBCzYCAEHYgAFBDDYCAEHUgAFBDTYCAEHQgAFBDjYCAEHMgAFBDzYCAEHIgAFBEDYCAEHEgAFBETYCAEHAgAFBEjYCACAAIAEQkAEhACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFohACACQRBqJAAgAAu+AQEBfyMAQRBrIgIkACACQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABEFshACACQRBqJAAgAAu9AQEBfyMAQRBrIgMkACADQQA6AAhBgIEBQQI2AgBB/IABQQM2AgBB+IABQQQ2AgBB9IABQQU2AgBB8IABQQY2AgBB7IABQQc2AgBB6IABQQg2AgBB5IABQQk2AgBB4IABQQo2AgBB3IABQQs2AgBB2IABQQw2AgBB1IABQQ02AgBB0IABQQ42AgBBzIABQQ82AgBByIABQRA2AgBBxIABQRE2AgBBwIABQRI2AgAgACABIAIQjwEgA0EQaiQAC4UBAgR/AX4jAEEQayIBJAACQCAAKQMwUARADAELA0ACQCAAIAVBACABQQ9qIAFBCGoQZiIEQX9GDQAgAS0AD0EDRw0AIAIgASgCCEGAgICAf3FBgICAgHpGaiECC0F/IQMgBEF/Rg0BIAIhAyAFQgF8IgUgACkDMFQNAAsLIAFBEGokACADCwuMdSUAQYAIC7ELaW5zdWZmaWNpZW50IG1lbW9yeQBuZWVkIGRpY3Rpb25hcnkALSsgICAwWDB4AFppcCBhcmNoaXZlIGluY29uc2lzdGVudABJbnZhbGlkIGFyZ3VtZW50AGludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";Co(Hi)||(Hi=b(Hi));function eo(Ke){try{if(Ke==Hi&&le)return new Uint8Array(le);var st=Me(Ke);if(st)return st;if(T)return T(Ke);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(St){ts(St)}}function wo(Ke,st){var St,lr,te;try{te=eo(Ke),lr=new WebAssembly.Module(te),St=new WebAssembly.Instance(lr,st)}catch(Oe){var Ee=Oe.toString();throw ee("failed to compile wasm module: "+Ee),(Ee.includes("imported Memory")||Ee.includes("memory import"))&&ee("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),Oe}return[St,lr]}function QA(){var Ke={a:cu};function st(te,Ee){var Oe=te.exports;r.asm=Oe,Be=r.asm.g,z(Be.buffer),$=r.asm.W,gn(r.asm.h),Io("wasm-instantiate")}if(ai("wasm-instantiate"),r.instantiateWasm)try{var St=r.instantiateWasm(Ke,st);return St}catch(te){return ee("Module.instantiateWasm callback failed with error: "+te),!1}var lr=wo(Hi,Ke);return st(lr[0]),r.asm}function Af(Ke){return F.getFloat32(Ke,!0)}function dh(Ke){return F.getFloat64(Ke,!0)}function mh(Ke){return F.getInt16(Ke,!0)}function to(Ke){return F.getInt32(Ke,!0)}function jn(Ke,st){F.setInt32(Ke,st,!0)}function Rs(Ke){for(;Ke.length>0;){var st=Ke.shift();if(typeof st=="function"){st(r);continue}var St=st.func;typeof St=="number"?st.arg===void 0?$.get(St)():$.get(St)(st.arg):St(st.arg===void 0?null:st.arg)}}function ro(Ke,st){var St=new Date(to((Ke>>2)*4)*1e3);jn((st>>2)*4,St.getUTCSeconds()),jn((st+4>>2)*4,St.getUTCMinutes()),jn((st+8>>2)*4,St.getUTCHours()),jn((st+12>>2)*4,St.getUTCDate()),jn((st+16>>2)*4,St.getUTCMonth()),jn((st+20>>2)*4,St.getUTCFullYear()-1900),jn((st+24>>2)*4,St.getUTCDay()),jn((st+36>>2)*4,0),jn((st+32>>2)*4,0);var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return jn((st+28>>2)*4,te),ro.GMTString||(ro.GMTString=rt("GMT")),jn((st+40>>2)*4,ro.GMTString),st}function ou(Ke,st){return ro(Ke,st)}function au(Ke,st,St){ke.copyWithin(Ke,st,st+St)}function lu(Ke){try{return Be.grow(Ke-be.byteLength+65535>>>16),z(Be.buffer),1}catch{}}function RA(Ke){var st=ke.length;Ke=Ke>>>0;var St=2147483648;if(Ke>St)return!1;for(var lr=1;lr<=4;lr*=2){var te=st*(1+.2/lr);te=Math.min(te,Ke+100663296);var Ee=Math.min(St,Ne(Math.max(Ke,te),65536)),Oe=lu(Ee);if(Oe)return!0}return!1}function TA(Ke){ue(Ke)}function oa(Ke){var st=Date.now()/1e3|0;return Ke&&jn((Ke>>2)*4,st),st}function aa(){if(aa.called)return;aa.called=!0;var Ke=new Date().getFullYear(),st=new Date(Ke,0,1),St=new Date(Ke,6,1),lr=st.getTimezoneOffset(),te=St.getTimezoneOffset(),Ee=Math.max(lr,te);jn((vl()>>2)*4,Ee*60),jn((Is()>>2)*4,+(lr!=te));function Oe(An){var li=An.toTimeString().match(/\(([A-Za-z ]+)\)$/);return li?li[1]:"GMT"}var dt=Oe(st),Et=Oe(St),Pt=rt(dt),tr=rt(Et);te>2)*4,Pt),jn((Mi()+4>>2)*4,tr)):(jn((Mi()>>2)*4,tr),jn((Mi()+4>>2)*4,Pt))}function FA(Ke){aa();var st=Date.UTC(to((Ke+20>>2)*4)+1900,to((Ke+16>>2)*4),to((Ke+12>>2)*4),to((Ke+8>>2)*4),to((Ke+4>>2)*4),to((Ke>>2)*4),0),St=new Date(st);jn((Ke+24>>2)*4,St.getUTCDay());var lr=Date.UTC(St.getUTCFullYear(),0,1,0,0,0,0),te=(St.getTime()-lr)/(1e3*60*60*24)|0;return jn((Ke+28>>2)*4,te),St.getTime()/1e3|0}var gr=typeof atob=="function"?atob:function(Ke){var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",St="",lr,te,Ee,Oe,dt,Et,Pt,tr=0;Ke=Ke.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Oe=st.indexOf(Ke.charAt(tr++)),dt=st.indexOf(Ke.charAt(tr++)),Et=st.indexOf(Ke.charAt(tr++)),Pt=st.indexOf(Ke.charAt(tr++)),lr=Oe<<2|dt>>4,te=(dt&15)<<4|Et>>2,Ee=(Et&3)<<6|Pt,St=St+String.fromCharCode(lr),Et!==64&&(St=St+String.fromCharCode(te)),Pt!==64&&(St=St+String.fromCharCode(Ee));while(tr0||(Ct(),Ir>0))return;function st(){Qn||(Qn=!0,r.calledRun=!0,!Ce&&(qt(),s(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),ir()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),st()},1)):st()}if(r.run=Ac,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Ac(),e}}();typeof CR=="object"&&typeof Sj=="object"?Sj.exports=vj:typeof define=="function"&&define.amd?define([],function(){return vj}):typeof CR=="object"&&(CR.createModule=vj)});var Up,upe,fpe,Ape=Ze(()=>{Up=["number","number"],upe=(X=>(X[X.ZIP_ER_OK=0]="ZIP_ER_OK",X[X.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",X[X.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",X[X.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",X[X.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",X[X.ZIP_ER_READ=5]="ZIP_ER_READ",X[X.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",X[X.ZIP_ER_CRC=7]="ZIP_ER_CRC",X[X.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",X[X.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",X[X.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",X[X.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",X[X.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",X[X.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",X[X.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",X[X.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",X[X.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",X[X.ZIP_ER_EOF=17]="ZIP_ER_EOF",X[X.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",X[X.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",X[X.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",X[X.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",X[X.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",X[X.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",X[X.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",X[X.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",X[X.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",X[X.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",X[X.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",X[X.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",X[X.ZIP_ER_TELL=30]="ZIP_ER_TELL",X[X.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",X))(upe||{}),fpe=t=>({get HEAPU8(){return t.HEAPU8},errors:upe,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...Up,"number","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...Up,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...Up,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...Up,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...Up,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...Up,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...Up,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...Up,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...Up,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"])},struct:{statS:t.cwrap("zipstruct_statS","number",[]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function Dj(t,e){let r=t.indexOf(e);if(r<=0)return null;let s=r;for(;r>=0&&(s=r+e.length,t[s]!==J.sep);){if(t[r-1]===J.sep)return null;r=t.indexOf(e,s)}return t.length>s&&t[s]!==J.sep?null:t.slice(0,s)}var $f,ppe=Ze(()=>{Dt();Dt();eA();$f=class t extends e0{static async openPromise(e,r){let s=new t(r);try{return await e(s)}finally{s.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,s=e.readOnlyArchives,a=typeof r>"u"?f=>Dj(f,".zip"):f=>{for(let p of r){let h=Dj(f,p);if(h)return h}return null},n=(f,p)=>new As(p,{baseFs:f,readOnly:s,stats:f.statSync(p),customZipImplementation:e.customZipImplementation}),c=async(f,p)=>{let h={baseFs:f,readOnly:s,stats:await f.statPromise(p),customZipImplementation:e.customZipImplementation};return()=>new As(p,h)};super({...e,factorySync:n,factoryPromise:c,getMountPoint:a})}}});var Pj,BI,bj=Ze(()=>{Bj();Pj=class extends Error{constructor(e,r){super(e),this.name="Libzip Error",this.code=r}},BI=class{constructor(e){this.filesShouldBeCached=!0;let r="buffer"in e?e.buffer:e.baseFs.readFileSync(e.path);this.libzip=cv();let s=this.libzip.malloc(4);try{let c=0;e.readOnly&&(c|=this.libzip.ZIP_RDONLY);let f=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(f,c,s),this.lzSource=f}catch(p){throw this.libzip.source.free(f),p}if(this.zip===0){let p=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(p,this.libzip.getValue(s,"i32")),this.makeLibzipError(p)}}finally{this.libzip.free(s)}let a=this.libzip.getNumEntries(this.zip,0),n=new Array(a);for(let c=0;c>>0,n=this.libzip.struct.statMtime(r)>>>0,c=this.libzip.struct.statCrc(r)>>>0;return{size:a,mtime:n,crc:c}}makeLibzipError(e){let r=this.libzip.struct.errorCodeZip(e),s=this.libzip.error.strerror(e),a=new Pj(s,this.libzip.errors[r]);if(r===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${a.message}`);return a}setFileSource(e,r,s){let a=this.allocateSource(s);try{let n=this.libzip.file.add(this.zip,e,a,this.libzip.ZIP_FL_OVERWRITE);if(n===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(r!==null&&this.libzip.file.setCompression(this.zip,n,0,r[0],r[1])===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return n}catch(n){throw this.libzip.source.free(a),n}}setMtime(e,r){if(this.libzip.file.setMtime(this.zip,e,0,r,0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}getExternalAttributes(e){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let s=this.libzip.getValue(this.libzip.uint08S,"i8")>>>0,a=this.libzip.getValue(this.libzip.uint32S,"i32")>>>0;return[s,a]}setExternalAttributes(e,r,s){if(this.libzip.file.setExternalAttributes(this.zip,e,0,0,r,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}locate(e){return this.libzip.name.locate(this.zip,e,0)}getFileSource(e){let r=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.libzip.struct.statCompSize(r),n=this.libzip.struct.statCompMethod(r),c=this.libzip.malloc(a);try{let f=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(f===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let p=this.libzip.fread(f,c,a,0);if(p===-1)throw this.makeLibzipError(this.libzip.file.getError(f));if(pa)throw new Error("Overread");let h=this.libzip.HEAPU8.subarray(c,c+a);return{data:Buffer.from(h),compressionMethod:n}}finally{this.libzip.fclose(f)}}finally{this.libzip.free(c)}}deleteEntry(e){if(this.libzip.delete(this.zip,e)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}addDirectory(e){let r=this.libzip.dir.add(this.zip,e);if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return r}getBufferAndClose(){try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let e=this.libzip.source.tell(this.lzSource);if(e===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let r=this.libzip.malloc(e);if(!r)throw new Error("Couldn't allocate enough memory");try{let s=this.libzip.source.read(this.lzSource,r,e);if(s===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(se)throw new Error("Overread");let a=Buffer.from(this.libzip.HEAPU8.subarray(r,r+e));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(a=Buffer.concat([a,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),a}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource)}}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:s,byteLength:a}=this.allocateBuffer(e),n=this.libzip.source.fromUnattachedBuffer(s,a,0,1,r);if(n===0)throw this.libzip.free(r),this.makeLibzipError(r);return n}allocateSource(e){let{buffer:r,byteLength:s}=this.allocateBuffer(e),a=this.libzip.source.fromBuffer(this.zip,r,s,0,1);if(a===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return a}discard(){this.libzip.discard(this.zip)}}});function jnt(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(hpe.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function wR(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var xa,xj,hpe,kj,lm,Qj,Rj,gpe,As,BR=Ze(()=>{Dt();Dt();Dt();Dt();Dt();Dt();xa=Ie("fs"),xj=Ie("stream"),hpe=Ie("util"),kj=ut(Ie("zlib"));bj();lm=3,Qj=0,Rj=8,gpe="mixed";As=class extends Uf{constructor(r,s={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;s.readOnly&&(this.readOnly=!0);let a=s;this.level=typeof a.level<"u"?a.level:gpe;let n=s.customZipImplementation??BI;if(typeof r=="string"){let{baseFs:f=new Yn}=a;this.baseFs=f,this.path=r}else this.path=null,this.baseFs=null;if(s.stats)this.stats=s.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(f){if(f.code==="ENOENT"&&a.create)this.stats=$a.makeDefaultStats();else throw f}else this.stats=$a.makeDefaultStats();typeof r=="string"?s.create?this.zipImpl=new n({buffer:wR(),readOnly:this.readOnly}):this.zipImpl=new n({path:r,baseFs:this.baseFs,readOnly:this.readOnly,size:this.stats.size}):this.zipImpl=new n({buffer:r??wR(),readOnly:this.readOnly}),this.listings.set(vt.root,new Set);let c=this.zipImpl.getListings();for(let f=0;f{this.closeSync(f)}})}async readPromise(r,s,a,n,c){return this.readSync(r,s,a,n,c)}readSync(r,s,a=0,n=s.byteLength,c=-1){let f=this.fds.get(r);if(typeof f>"u")throw or.EBADF("read");let p=c===-1||c===null?f.cursor:c,h=this.readFileSync(f.p);h.copy(s,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(c===-1||c===null)&&(f.cursor+=E),E}async writePromise(r,s,a,n,c){return typeof s=="string"?this.writeSync(r,s,c):this.writeSync(r,s,a,n,c)}writeSync(r,s,a,n,c){throw typeof this.fds.get(r)>"u"?or.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw or.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:s}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new xj.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(f,p)=>{clearImmediate(c),this.closeSync(a),p(f)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),c=setImmediate(async()=>{try{let f=await this.readFilePromise(r,s);n.bytesRead=f.length,n.end(f)}catch(f){n.destroy(f)}});return n}createWriteStream(r,{encoding:s}={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),c=Object.assign(new xj.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(f,p)=>{try{f?p(f):(this.writeFileSync(r,Buffer.concat(a),s),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){c.destroy()},bytesWritten:0,path:r,pending:!1});return c.on("data",f=>{let p=Buffer.from(f);c.bytesWritten+=p.length,a.push(p)}),c}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let s=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`lstat '${r}'`);return s}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw or.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=J.resolve(vt.root,r);return this.entries.has(a)||this.listings.has(a)}let s;try{s=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return s===void 0?!1:this.entries.has(s)||this.listings.has(s)}async accessPromise(r,s){return this.accessSync(r,s)}accessSync(r,s=xa.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`access '${r}'`);if(this.readOnly&&s&xa.constants.W_OK)throw or.EROFS(`access '${r}'`)}async statPromise(r,s={bigint:!1}){return s.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,s)}}async fstatPromise(r,s){return this.fstatSync(r,s)}fstatSync(r,s){let a=this.fds.get(r);if(typeof a>"u")throw or.EBADF("fstatSync");let{p:n}=a,c=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(c)&&!this.listings.has(c))throw or.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(c))throw or.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,c,s)}async lstatPromise(r,s={bigint:!1}){return s.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,s={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,s.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(s.throwIfNoEntry===!1)return;throw or.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,s)}}statImpl(r,s,a={}){let n=this.entries.get(s);if(typeof n<"u"){let c=this.zipImpl.stat(n),f=c.crc,p=c.size,h=c.mtime*1e3,E=this.stats.uid,C=this.stats.gid,S=512,b=Math.ceil(c.size/S),I=h,T=h,N=h,U=new Date(I),W=new Date(T),ee=new Date(N),ie=new Date(h),ue=this.listings.has(s)?xa.constants.S_IFDIR:this.isSymbolicLink(n)?xa.constants.S_IFLNK:xa.constants.S_IFREG,le=ue===xa.constants.S_IFDIR?493:420,me=ue|this.getUnixMode(n,le)&511,pe=Object.assign(new $a.StatEntry,{uid:E,gid:C,size:p,blksize:S,blocks:b,atime:U,birthtime:W,ctime:ee,mtime:ie,atimeMs:I,birthtimeMs:T,ctimeMs:N,mtimeMs:h,mode:me,crc:f});return a.bigint===!0?$a.convertToBigIntStats(pe):pe}if(this.listings.has(s)){let c=this.stats.uid,f=this.stats.gid,p=0,h=512,E=0,C=this.stats.mtimeMs,S=this.stats.mtimeMs,b=this.stats.mtimeMs,I=this.stats.mtimeMs,T=new Date(C),N=new Date(S),U=new Date(b),W=new Date(I),ee=xa.constants.S_IFDIR|493,ue=Object.assign(new $a.StatEntry,{uid:c,gid:f,size:p,blksize:h,blocks:E,atime:T,birthtime:N,ctime:U,mtime:W,atimeMs:C,birthtimeMs:S,ctimeMs:b,mtimeMs:I,mode:ee,crc:0});return a.bigint===!0?$a.convertToBigIntStats(ue):ue}throw new Error("Unreachable")}getUnixMode(r,s){let[a,n]=this.zipImpl.getExternalAttributes(r);return a!==lm?s:n>>>16}registerListing(r){let s=this.listings.get(r);if(s)return s;this.registerListing(J.dirname(r)).add(J.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,s){this.registerListing(J.dirname(r)).add(J.basename(r)),this.entries.set(r,s)}unregisterListing(r){this.listings.delete(r),this.listings.get(J.dirname(r))?.delete(J.basename(r))}unregisterEntry(r){this.unregisterListing(r);let s=this.entries.get(r);this.entries.delete(r),!(typeof s>"u")&&(this.fileSources.delete(s),this.isSymbolicLink(s)&&this.symlinkCount--)}deleteEntry(r,s){this.unregisterEntry(r),this.zipImpl.deleteEntry(s)}resolveFilename(r,s,a=!0,n=!0){if(!this.ready)throw or.EBUSY(`archive closed, ${r}`);let c=J.resolve(vt.root,s);if(c==="/")return vt.root;let f=this.entries.get(c);if(a&&f!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(f)){let p=this.getFileSource(f).toString();return this.resolveFilename(r,J.resolve(J.dirname(c),p),!0,n)}else return c;for(;;){let p=this.resolveFilename(r,J.dirname(c),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw or.ENOENT(r)}if(!h)throw or.ENOTDIR(r);if(c=J.resolve(p,J.basename(c)),!a||this.symlinkCount===0)break;let C=this.zipImpl.locate(c.slice(1));if(C===-1)break;if(this.isSymbolicLink(C)){let S=this.getFileSource(C).toString();c=J.resolve(J.dirname(c),S)}else break}return c}setFileSource(r,s){let a=Buffer.isBuffer(s)?s:Buffer.from(s),n=J.relative(vt.root,r),c=null;this.level!=="mixed"&&(c=[this.level===0?Qj:Rj,this.level]);let f=this.zipImpl.setFileSource(n,c,a);return this.fileSources.set(f,a),f}isSymbolicLink(r){if(this.symlinkCount===0)return!1;let[s,a]=this.zipImpl.getExternalAttributes(r);return s!==lm?!1:(a>>>16&xa.constants.S_IFMT)===xa.constants.S_IFLNK}getFileSource(r,s={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let{data:n,compressionMethod:c}=this.zipImpl.getFileSource(r);if(c===Qj)return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,n),n;if(c===Rj){if(s.asyncDecompress)return new Promise((f,p)=>{kj.default.inflateRaw(n,(h,E)=>{h?p(h):(this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,E),f(E))})});{let f=kj.default.inflateRawSync(n);return this.zipImpl.filesShouldBeCached&&this.fileSources.set(r,f),f}}else throw new Error(`Unsupported compression method: ${c}`)}async fchmodPromise(r,s){return this.chmodPromise(this.fdToPath(r,"fchmod"),s)}fchmodSync(r,s){return this.chmodSync(this.fdToPath(r,"fchmodSync"),s)}async chmodPromise(r,s){return this.chmodSync(r,s)}chmodSync(r,s){if(this.readOnly)throw or.EROFS(`chmod '${r}'`);s&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let f=this.getUnixMode(n,xa.constants.S_IFREG|0)&-512|s;this.zipImpl.setExternalAttributes(n,lm,f<<16)}async fchownPromise(r,s,a){return this.chownPromise(this.fdToPath(r,"fchown"),s,a)}fchownSync(r,s,a){return this.chownSync(this.fdToPath(r,"fchownSync"),s,a)}async chownPromise(r,s,a){return this.chownSync(r,s,a)}chownSync(r,s,a){throw new Error("Unimplemented")}async renamePromise(r,s){return this.renameSync(r,s)}renameSync(r,s){throw new Error("Unimplemented")}async copyFilePromise(r,s,a){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}copyFileSync(r,s,a=0){let{indexSource:n,indexDest:c,resolvedDestP:f}=this.prepareCopyFile(r,s,a),p=this.getFileSource(n),h=this.setFileSource(f,p);h!==c&&this.registerEntry(f,h)}prepareCopyFile(r,s,a=0){if(this.readOnly)throw or.EROFS(`copyfile '${r} -> '${s}'`);if(a&xa.constants.COPYFILE_FICLONE_FORCE)throw or.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${s}'`);let n=this.resolveFilename(`copyfile '${r} -> ${s}'`,r),c=this.entries.get(n);if(typeof c>"u")throw or.EINVAL(`copyfile '${r}' -> '${s}'`);let f=this.resolveFilename(`copyfile '${r}' -> ${s}'`,s),p=this.entries.get(f);if(a&(xa.constants.COPYFILE_EXCL|xa.constants.COPYFILE_FICLONE_FORCE)&&typeof p<"u")throw or.EEXIST(`copyfile '${r}' -> '${s}'`);return{indexSource:c,resolvedDestP:f,indexDest:p}}async appendFilePromise(r,s,a){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,s,a)}appendFileSync(r,s,a={}){if(this.readOnly)throw or.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,s,a)}fdToPath(r,s){let a=this.fds.get(r)?.p;if(typeof a>"u")throw or.EBADF(s);return a}async writeFilePromise(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(s=Buffer.concat([await this.getFileSource(f,{asyncDecompress:!0}),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&await this.chmodPromise(p,c)}writeFileSync(r,s,a){let{encoding:n,mode:c,index:f,resolvedP:p}=this.prepareWriteFile(r,a);f!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(s=Buffer.concat([this.getFileSource(f),Buffer.from(s)])),n!==null&&(s=s.toString(n));let h=this.setFileSource(p,s);h!==f&&this.registerEntry(p,h),c!==null&&this.chmodSync(p,c)}prepareWriteFile(r,s){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw or.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw or.EISDIR(`open '${r}'`);let n=null,c=null;typeof s=="string"?n=s:typeof s=="object"&&({encoding:n=null,mode:c=null}=s);let f=this.entries.get(a);return{encoding:n,mode:c,resolvedP:a,index:f}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw or.EROFS(`unlink '${r}'`);let s=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(s))throw or.EISDIR(`unlink '${r}'`);let a=this.entries.get(s);if(typeof a>"u")throw or.EINVAL(`unlink '${r}'`);this.deleteEntry(s,a)}async utimesPromise(r,s,a){return this.utimesSync(r,s,a)}utimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,s,a){return this.lutimesSync(r,s,a)}lutimesSync(r,s,a){if(this.readOnly)throw or.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,s){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");this.zipImpl.setMtime(a,jnt(s))}async mkdirPromise(r,s){return this.mkdirSync(r,s)}mkdirSync(r,{mode:s=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:s});if(this.readOnly)throw or.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw or.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,s)}async rmdirPromise(r,s){return this.rmdirSync(r,s)}rmdirSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rmdir '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rmdir '${r}'`);let c=this.entries.get(a);if(typeof c>"u")throw or.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,c)}async rmPromise(r,s){return this.rmSync(r,s)}rmSync(r,{recursive:s=!1}={}){if(this.readOnly)throw or.EROFS(`rm '${r}'`);if(s){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw or.ENOTDIR(`rm '${r}'`);if(n.size>0)throw or.ENOTEMPTY(`rm '${r}'`);let c=this.entries.get(a);if(typeof c>"u")throw or.EINVAL(`rm '${r}'`);this.deleteEntry(r,c)}hydrateDirectory(r){let s=this.zipImpl.addDirectory(J.relative(vt.root,r));return this.registerListing(r),this.registerEntry(r,s),s}async linkPromise(r,s){return this.linkSync(r,s)}linkSync(r,s){throw or.EOPNOTSUPP(`link '${r}' -> '${s}'`)}async symlinkPromise(r,s){return this.symlinkSync(r,s)}symlinkSync(r,s){if(this.readOnly)throw or.EROFS(`symlink '${r}' -> '${s}'`);let a=this.resolveFilename(`symlink '${r}' -> '${s}'`,s);if(this.listings.has(a))throw or.EISDIR(`symlink '${r}' -> '${s}'`);if(this.entries.has(a))throw or.EEXIST(`symlink '${r}' -> '${s}'`);let n=this.setFileSource(a,r);this.registerEntry(a,n),this.zipImpl.setExternalAttributes(n,lm,(xa.constants.S_IFLNK|511)<<16),this.symlinkCount+=1}async readFilePromise(r,s){typeof s=="object"&&(s=s?s.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return s?a.toString(s):a}readFileSync(r,s){typeof s=="object"&&(s=s?s.encoding:void 0);let a=this.readFileBuffer(r);return s?a.toString(s):a}readFileBuffer(r,s={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw or.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,s)}async readdirPromise(r,s){return this.readdirSync(r,s)}readdirSync(r,s){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw or.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw or.ENOTDIR(`scandir '${r}'`);if(s?.recursive)if(s?.withFileTypes){let c=Array.from(n,f=>Object.assign(this.statImpl("lstat",J.join(r,f)),{name:f,path:vt.dot,parentPath:vt.dot}));for(let f of c){if(!f.isDirectory())continue;let p=J.join(f.path,f.name),h=this.listings.get(J.join(a,p));for(let E of h)c.push(Object.assign(this.statImpl("lstat",J.join(r,p,E)),{name:E,path:p,parentPath:p}))}return c}else{let c=[...n];for(let f of c){let p=this.listings.get(J.join(a,f));if(!(typeof p>"u"))for(let h of p)c.push(J.join(f,h))}return c}else return s?.withFileTypes?Array.from(n,c=>Object.assign(this.statImpl("lstat",J.join(r,c)),{name:c,path:void 0,parentPath:void 0})):[...n]}async readlinkPromise(r){let s=this.prepareReadlink(r);return(await this.getFileSource(s,{asyncDecompress:!0})).toString()}readlinkSync(r){let s=this.prepareReadlink(r);return this.getFileSource(s).toString()}prepareReadlink(r){let s=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(s)&&!this.listings.has(s))throw or.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(s))throw or.ENOTDIR(`open '${r}'`);if(this.listings.has(s))throw or.EINVAL(`readlink '${r}'`);let a=this.entries.get(s);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw or.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw or.EINVAL(`open '${r}'`);let c=await this.getFileSource(n,{asyncDecompress:!0}),f=Buffer.alloc(s,0);return c.copy(f),await this.writeFilePromise(r,f)}truncateSync(r,s=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw or.EINVAL(`open '${r}'`);let c=this.getFileSource(n),f=Buffer.alloc(s,0);return c.copy(f),this.writeFileSync(r,f)}async ftruncatePromise(r,s){return this.truncatePromise(this.fdToPath(r,"ftruncate"),s)}ftruncateSync(r,s){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),s)}watch(r,s,a){let n;switch(typeof s){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=s);break}if(!n)return{on:()=>{},close:()=>{}};let c=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(c)}}}watchFile(r,s,a){let n=J.resolve(vt.root,r);return sE(this,n,s,a)}unwatchFile(r,s){let a=J.resolve(vt.root,r);return md(this,a,s)}}});function mpe(t,e,r=Buffer.alloc(0),s){let a=new As(r),n=C=>C===e||C.startsWith(`${e}/`)?C.slice(0,e.length):null,c=async(C,S)=>()=>a,f=(C,S)=>a,p={...t},h=new Yn(p),E=new e0({baseFs:h,getMountPoint:n,factoryPromise:c,factorySync:f,magicByte:21,maxAge:1/0,typeCheck:s?.typeCheck});return U2(dpe.default,new t0(E)),a}var dpe,ype=Ze(()=>{Dt();dpe=ut(Ie("fs"));BR()});var Epe=Ze(()=>{ppe();BR();ype()});var Tj,uv,vR,Ipe=Ze(()=>{Dt();BR();Tj={CENTRAL_DIRECTORY:33639248,END_OF_CENTRAL_DIRECTORY:101010256},uv=22,vR=class t{constructor(e){this.filesShouldBeCached=!1;if("buffer"in e)throw new Error("Buffer based zip archives are not supported");if(!e.readOnly)throw new Error("Writable zip archives are not supported");this.baseFs=e.baseFs,this.fd=this.baseFs.openSync(e.path,"r");try{this.entries=t.readZipSync(this.fd,this.baseFs,e.size)}catch(r){throw this.baseFs.closeSync(this.fd),this.fd="closed",r}}static readZipSync(e,r,s){if(s=0;N--)if(n.readUInt32LE(N)===Tj.END_OF_CENTRAL_DIRECTORY){a=N;break}if(a===-1)throw new Error("Not a zip archive")}let c=n.readUInt16LE(a+10),f=n.readUInt32LE(a+12),p=n.readUInt32LE(a+16),h=n.readUInt16LE(a+20);if(a+h+uv>n.length)throw new Error("Zip archive inconsistent");if(c==65535||f==4294967295||p==4294967295)throw new Error("Zip 64 is not supported");if(f>s)throw new Error("Zip archive inconsistent");if(c>f/46)throw new Error("Zip archive inconsistent");let E=Buffer.alloc(f);if(r.readSync(e,E,0,E.length,p)!==E.length)throw new Error("Zip archive inconsistent");let C=[],S=0,b=0,I=0;for(;bE.length)throw new Error("Zip archive inconsistent");if(E.readUInt32LE(S)!==Tj.CENTRAL_DIRECTORY)throw new Error("Zip archive inconsistent");let N=E.readUInt16LE(S+4)>>>8;if(E.readUInt16LE(S+8)&1)throw new Error("Encrypted zip files are not supported");let W=E.readUInt16LE(S+10),ee=E.readUInt32LE(S+16),ie=E.readUInt16LE(S+28),ue=E.readUInt16LE(S+30),le=E.readUInt16LE(S+32),me=E.readUInt32LE(S+42),pe=E.toString("utf8",S+46,S+46+ie).replaceAll("\0"," ");if(pe.includes("\0"))throw new Error("Invalid ZIP file");let Be=E.readUInt32LE(S+20),Ce=E.readUInt32LE(S+38);C.push({name:pe,os:N,mtime:fi.SAFE_TIME,crc:ee,compressionMethod:W,isSymbolicLink:N===lm&&(Ce>>>16&fi.S_IFMT)===fi.S_IFLNK,size:E.readUInt32LE(S+24),compressedSize:Be,externalAttributes:Ce,localHeaderOffset:me}),I+=Be,b+=1,S+=46+ie+ue+le}if(I>s)throw new Error("Zip archive inconsistent");if(S!==E.length)throw new Error("Zip archive inconsistent");return C}getExternalAttributes(e){let r=this.entries[e];return[r.os,r.externalAttributes]}getListings(){return this.entries.map(e=>e.name)}getSymlinkCount(){let e=0;for(let r of this.entries)r.isSymbolicLink&&(e+=1);return e}stat(e){let r=this.entries[e];return{crc:r.crc,mtime:r.mtime,size:r.size}}locate(e){for(let r=0;rgpe,DEFLATE:()=>Rj,JsZipImpl:()=>vR,LibZipImpl:()=>BI,STORE:()=>Qj,ZIP_UNIX:()=>lm,ZipFS:()=>As,ZipOpenFS:()=>$f,getArchivePart:()=>Dj,getLibzipPromise:()=>qnt,getLibzipSync:()=>Gnt,makeEmptyArchive:()=>wR,mountMemoryDrive:()=>mpe});function Gnt(){return cv()}async function qnt(){return cv()}var Cpe,eA=Ze(()=>{Bj();Cpe=ut(cpe());Ape();Epe();Ipe();bj();lpe(()=>{let t=(0,Cpe.default)();return fpe(t)})});var Av,wpe=Ze(()=>{Dt();Yt();pv();Av=class extends ot{constructor(){super(...arguments);this.cwd=ge.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.usage={description:"run a command using yarn's portable shell",details:` This command will run a command using Yarn's portable shell. Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await vI(r,[],{cwd:fe.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var Vl,Bpe=Ze(()=>{Vl=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var PR={};Vt(PR,{fastGlobOptions:()=>Dpe,isBraceExpansion:()=>Fj,isGlobPattern:()=>Wnt,match:()=>Ynt,micromatchOptions:()=>DR});function Wnt(t){if(!SR.default.scan(t,DR).isGlob)return!1;try{SR.default.parse(t,DR)}catch{return!1}return!0}function Ynt(t,{cwd:e,baseFs:r}){return(0,vpe.default)(t,{...Dpe,cwd:fe.fromPortablePath(e),fs:ax(Spe.default,new t0(r))})}function Fj(t){return SR.default.scan(t,DR).isBrace}var vpe,Spe,SR,DR,Dpe,Ppe=Ze(()=>{Dt();vpe=ut(wQ()),Spe=ut(Ie("fs")),SR=ut(Go()),DR={strictBrackets:!0},Dpe={onlyDirectories:!1,onlyFiles:!1}});function Nj(){}function Oj(){for(let t of cm)t.kill()}function Qpe(t,e,r,s){return a=>{let n=a[0]instanceof tA.Transform?"pipe":a[0],c=a[1]instanceof tA.Transform?"pipe":a[1],f=a[2]instanceof tA.Transform?"pipe":a[2],p=(0,xpe.default)(t,e,{...s,stdio:[n,c,f]});return cm.add(p),cm.size===1&&(process.on("SIGINT",Nj),process.on("SIGTERM",Oj)),a[0]instanceof tA.Transform&&a[0].pipe(p.stdin),a[1]instanceof tA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof tA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(cm.delete(p),cm.size===0&&(process.off("SIGINT",Nj),process.off("SIGTERM",Oj)),E.code){case"ENOENT":a[2].write(`command not found: ${t} `),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} `),h(128);break;default:a[2].write(`uncaught error: ${E.message} `),h(1);break}}),p.on("close",E=>{cm.delete(p),cm.size===0&&(process.off("SIGINT",Nj),process.off("SIGTERM",Oj)),h(E!==null?E:129)})})}}}function Rpe(t){return e=>{let r=e[0]==="pipe"?new tA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function bR(t,e){return Mj.start(t,e)}function bpe(t,e=null){let r=new tA.PassThrough,s=new kpe.StringDecoder,a="";return r.on("data",n=>{let c=s.write(n),f;do if(f=c.indexOf(` `),f!==-1){let p=a+c.substring(0,f);c=c.substring(f+1),a="",t(e!==null?`${e} ${p}`:p)}while(f!==-1);a+=c}),r.on("end",()=>{let n=s.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function Tpe(t,{prefix:e}){return{stdout:bpe(r=>t.stdout.write(`${r} `),t.stdout.isTTY?e:null),stderr:bpe(r=>t.stderr.write(`${r} `),t.stderr.isTTY?e:null)}}var xpe,tA,kpe,cm,Oc,Lj,Mj,Uj=Ze(()=>{xpe=ut(UU()),tA=Ie("stream"),kpe=Ie("string_decoder"),cm=new Set;Oc=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},Lj=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Mj=class t{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:s,stderr:a}){let n=new t(null,e);return n.stdin=r,n.stdout=s,n.stderr=a,n}pipeTo(e,r=1){let s=new t(this,e),a=new Lj;return s.pipe=a,s.stdout=this.stdout,s.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),s}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let s;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");s=this.stderr,e[2]=s.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),s.close(),n))}async run(){let e=[];for(let s=this;s;s=s.ancestor)e.push(s.exec());return(await Promise.all(e))[0]}}});var mv={};Vt(mv,{EntryCommand:()=>Av,ShellError:()=>Vl,execute:()=>vI,globUtils:()=>PR});function Fpe(t,e,r){let s=new Jl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(s,{end:!1}),(e&2)===2&&r.stdin instanceof Jl.Writable&&s.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(s,{end:!1}),(e&2)===2&&s.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(s,{end:!1}),(e&2)===2&&s.pipe(r.stderr,{end:!1});break;default:throw new Vl(`Bad file descriptor: "${t}"`)}return s}function kR(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function Jnt(t,e,r){let s=[],a=new Jl.PassThrough;return a.on("data",n=>s.push(n)),await QR(t,e,kR(r,{stdout:a})),Buffer.concat(s).toString().replace(/[\r\n]+$/,"")}async function Npe(t,e,r){let s=t.map(async n=>{let c=await um(n.args,e,r);return{name:n.name,value:c.join(" ")}});return(await Promise.all(s)).reduce((n,c)=>(n[c.name]=c.value,n),{})}function xR(t){return t.match(/[^ \r\n\t]+/g)||[]}async function Hpe(t,e,r,s,a=s){switch(t.name){case"$":s(String(process.pid));break;case"#":s(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let c=xR(n);for(let f=0;f=0&&n"u"&&(t.defaultValue?c=(await um(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(c="")),typeof c>"u")throw f?new Vl(`Unbound argument #${n}`):new Vl(`Unbound variable "${t.name}"`);if(t.quoted)s(c);else{let p=xR(c);for(let E=0;Es.push(n));let a=Number(s.join(" "));return Number.isNaN(a)?hv({type:"variable",name:s.join(" ")},e,r):hv({type:"number",value:a},e,r)}else return Knt[t.type](await hv(t.left,e,r),await hv(t.right,e,r))}async function um(t,e,r){let s=new Map,a=[],n=[],c=E=>{n.push(E)},f=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{c(E),f()},h=(E,C,S)=>{let b=JSON.stringify({type:E,fd:C}),I=s.get(b);typeof I>"u"&&s.set(b,I=[]),I.push(S)};for(let E of t){let C=!1;switch(E.type){case"redirection":{let S=await um(E.args,e,r);for(let b of S)h(E.subtype,E.fd,b)}break;case"argument":for(let S of E.segments)switch(S.type){case"text":c(S.text);break;case"glob":c(S.pattern),C=!0;break;case"shell":{let b=await Jnt(S.shell,e,r);if(S.quoted)c(b);else{let I=xR(b);for(let T=0;T"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let b=await e.glob.match(S,{cwd:r.cwd,baseFs:e.baseFs});if(b.length===0){let I=Fj(S)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new Vl(`No matches found: "${S}"${I}`)}for(let I of b.sort())p(I)}}if(s.size>0){let E=[];for(let[C,S]of s.entries())E.splice(E.length,0,C,String(S.length),...S);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function gv(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let s=fe.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:s});let[n,...c]=t;if(n==="command")return Qpe(c[0],c.slice(1),e,{cwd:s,env:a});let f=e.builtins.get(n);if(typeof f>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return Rpe(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:C,stdout:S,stderr:b}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await f(c,e,r)}finally{r.stdin=C,r.stdout=S,r.stderr=b}})}function znt(t,e,r){return s=>{let a=new Jl.PassThrough,n=QR(t,e,kR(r,{stdin:a}));return{stdin:a,promise:n}}}function Znt(t,e,r){return s=>{let a=new Jl.PassThrough,n=QR(t,e,r);return{stdin:a,promise:n}}}function Ope(t,e,r,s){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(s.procedures,a));return s.procedures={...s.procedures},s.procedures[a]=t,gv([...e,"__ysh_run_procedure",a],r,s)}}async function Lpe(t,e,r){let s=t,a=null,n=null;for(;s;){let c=s.then?{...r}:r,f;switch(s.type){case"command":{let p=await um(s.args,e,r),h=await Npe(s.envs,e,r);f=s.envs.length?gv(p,e,kR(c,{environment:h})):gv(p,e,c)}break;case"subshell":{let p=await um(s.args,e,r),h=znt(s.subshell,e,c);f=Ope(h,p,e,c)}break;case"group":{let p=await um(s.args,e,r),h=Znt(s.group,e,c);f=Ope(h,p,e,c)}break;case"envs":{let p=await Npe(s.envs,e,r);c.environment={...c.environment,...p},f=gv(["true"],e,c)}break}if(typeof f>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=bR(f,{stdin:new Oc(c.stdin),stdout:new Oc(c.stdout),stderr:new Oc(c.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(f,1);break;case"|&":n=n.pipeTo(f,3);break}}s.then?(a=s.then.type,s=s.then.chain):s=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Xnt(t,e,r,{background:s=!1}={}){function a(n){let c=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],f=c[n%c.length];return Mpe.default.hex(f)}if(s){let n=r.nextBackgroundJobIndex++,c=a(n),f=`[${n}]`,p=c(f),{stdout:h,stderr:E}=Tpe(r,{prefix:p});return r.backgroundJobs.push(Lpe(t,e,kR(r,{stdout:h,stderr:E})).catch(C=>E.write(`${C.message} `)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${c(AE(t))}' has ended `)})),0}return await Lpe(t,e,r)}async function $nt(t,e,r,{background:s=!1}={}){let a,n=f=>{a=f,r.variables["?"]=String(f)},c=async f=>{try{return await Xnt(f.chain,e,r,{background:s&&typeof f.then>"u"})}catch(p){if(!(p instanceof Vl))throw p;return r.stderr.write(`${p.message} `),1}};for(n(await c(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await c(t.then.line));break;case"||":a!==0&&n(await c(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function QR(t,e,r){let s=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:c}of t){if(a=await $nt(n,e,r,{background:c==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=s,a}function jpe(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>dv(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>dv(e));case"arithmetic":return _j(t.arithmetic);case"shell":return Hj(t.shell);default:return!1}}function dv(t){switch(t.type){case"redirection":return t.args.some(e=>dv(e));case"argument":return t.segments.some(e=>jpe(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function _j(t){switch(t.type){case"variable":return jpe(t);case"number":return!1;default:return _j(t.left)||_j(t.right)}}function Hj(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let s;switch(r.type){case"subshell":s=Hj(r.subshell);break;case"command":s=r.envs.some(a=>a.args.some(n=>dv(n)))||r.args.some(a=>dv(a));break}if(s)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function vI(t,e=[],{baseFs:r=new Yn,builtins:s={},cwd:a=fe.toPortablePath(process.cwd()),env:n=process.env,stdin:c=process.stdin,stdout:f=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=PR}={}){let C={};for(let[I,T]of Object.entries(n))typeof T<"u"&&(C[I]=T);let S=new Map(Vnt);for(let[I,T]of Object.entries(s))S.set(I,T);c===null&&(c=new Jl.PassThrough,c.end());let b=ux(t,E);if(!Hj(b)&&b.length>0&&e.length>0){let{command:I}=b[b.length-1];for(;I.then;)I=I.then.line;let T=I.chain;for(;T.then;)T=T.then.chain;T.type==="command"&&(T.args=T.args.concat(e.map(N=>({type:"argument",segments:[{type:"text",text:N}]}))))}return await QR(b,{args:e,baseFs:r,builtins:S,initialStdin:c,initialStdout:f,initialStderr:p,glob:E},{cwd:a,environment:C,exitCode:null,procedures:{},stdin:c,stdout:f,stderr:p,variables:Object.assign({},h,{"?":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var Mpe,Upe,Jl,_pe,Vnt,Knt,pv=Ze(()=>{Dt();wc();Mpe=ut(RE()),Upe=Ie("os"),Jl=Ie("stream"),_pe=Ie("timers/promises");wpe();Bpe();Ppe();Uj();Uj();Vnt=new Map([["cd",async([t=(0,Upe.homedir)(),...e],r,s)=>{let a=J.resolve(s.cwd,fe.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(c=>{throw c.code==="ENOENT"?new Vl(`cd: no such file or directory: ${t}`):c})).isDirectory())throw new Vl(`cd: not a directory: ${t}`);return s.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${fe.fromPortablePath(r.cwd)} `),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,s)=>s.exitCode=parseInt(t??s.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} `),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new Vl("sleep: missing operand");let s=Number(t);if(Number.isNaN(s))throw new Vl(`sleep: invalid time interval '${t}'`);return await(0,_pe.setTimeout)(1e3*s,0)}],["unset",async(t,e,r)=>{for(let s of t)delete r.environment[s],delete r.variables[s];return 0}],["__ysh_run_procedure",async(t,e,r)=>{let s=r.procedures[t[0]];return await bR(s,{stdin:new Oc(r.stdin),stdout:new Oc(r.stdout),stderr:new Oc(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let s=r.stdin,a=r.stdout,n=r.stderr,c=[],f=[],p=[],h=0;for(;t[h]!=="--";){let C=t[h++],{type:S,fd:b}=JSON.parse(C),I=W=>{switch(b){case null:case 0:c.push(W);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},T=W=>{switch(b){case null:case 1:f.push(W);break;case 2:p.push(W);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},N=Number(t[h++]),U=h+N;for(let W=h;We.baseFs.createReadStream(J.resolve(r.cwd,fe.toPortablePath(t[W]))));break;case"<<<":I(()=>{let ee=new Jl.PassThrough;return process.nextTick(()=>{ee.write(`${t[W]} `),ee.end()}),ee});break;case"<&":I(()=>Fpe(Number(t[W]),1,r));break;case">":case">>":{let ee=J.resolve(r.cwd,fe.toPortablePath(t[W]));T(ee==="/dev/null"?new Jl.Writable({autoDestroy:!0,emitClose:!0,write(ie,ue,le){setImmediate(le)}}):e.baseFs.createWriteStream(ee,S===">>"?{flags:"a"}:void 0))}break;case">&":T(Fpe(Number(t[W]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${S}"`)}}if(c.length>0){let C=new Jl.PassThrough;s=C;let S=b=>{if(b===c.length)C.end();else{let I=c[b]();I.pipe(C,{end:!1}),I.on("end",()=>{S(b+1)})}};S(0)}if(f.length>0){let C=new Jl.PassThrough;a=C;for(let S of f)C.pipe(S)}if(p.length>0){let C=new Jl.PassThrough;n=C;for(let S of p)C.pipe(S)}let E=await bR(gv(t.slice(h+1),e,r),{stdin:new Oc(s),stdout:new Oc(a),stderr:new Oc(n)}).run();return await Promise.all(f.map(C=>new Promise((S,b)=>{C.on("error",I=>{b(I)}),C.on("close",()=>{S()}),C.end()}))),await Promise.all(p.map(C=>new Promise((S,b)=>{C.on("error",I=>{b(I)}),C.on("close",()=>{S()}),C.end()}))),E}]]);Knt={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Gpe=_((d4t,RR)=>{function eit(){var t=0,e=1,r=2,s=3,a=4,n=5,c=6,f=7,p=8,h=9,E=10,C=11,S=12,b=13,I=14,T=15,N=16,U=17,W=0,ee=1,ie=2,ue=3,le=4;function me(g,we){return 55296<=g.charCodeAt(we)&&g.charCodeAt(we)<=56319&&56320<=g.charCodeAt(we+1)&&g.charCodeAt(we+1)<=57343}function pe(g,we){we===void 0&&(we=0);var ye=g.charCodeAt(we);if(55296<=ye&&ye<=56319&&we=1){var Ae=g.charCodeAt(we-1),se=ye;return 55296<=Ae&&Ae<=56319?(Ae-55296)*1024+(se-56320)+65536:se}return ye}function Be(g,we,ye){var Ae=[g].concat(we).concat([ye]),se=Ae[Ae.length-2],X=ye,De=Ae.lastIndexOf(I);if(De>1&&Ae.slice(1,De).every(function(j){return j==s})&&[s,b,U].indexOf(g)==-1)return ie;var Te=Ae.lastIndexOf(a);if(Te>0&&Ae.slice(1,Te).every(function(j){return j==a})&&[S,a].indexOf(se)==-1)return Ae.filter(function(j){return j==a}).length%2==1?ue:le;if(se==t&&X==e)return W;if(se==r||se==t||se==e)return X==I&&we.every(function(j){return j==s})?ie:ee;if(X==r||X==t||X==e)return ee;if(se==c&&(X==c||X==f||X==h||X==E))return W;if((se==h||se==f)&&(X==f||X==p))return W;if((se==E||se==p)&&X==p)return W;if(X==s||X==T)return W;if(X==n)return W;if(se==S)return W;var mt=Ae.indexOf(s)!=-1?Ae.lastIndexOf(s)-1:Ae.length-2;return[b,U].indexOf(Ae[mt])!=-1&&Ae.slice(mt+1,-1).every(function(j){return j==s})&&X==I||se==T&&[N,U].indexOf(X)!=-1?W:we.indexOf(a)!=-1?ie:se==a&&X==a?W:ee}this.nextBreak=function(g,we){if(we===void 0&&(we=0),we<0)return 0;if(we>=g.length-1)return g.length;for(var ye=Ce(pe(g,we)),Ae=[],se=we+1;se{var tit=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,TR;function rit(){if(TR)return TR;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return TR=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=Gpe(),e=new t;return TR=r=>e.splitGraphemes(r)}}qpe.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let s=r-e,a="",n=0,c=0;for(;t.length>0;){let f=t.match(tit)||[t,t,void 0],p=rit()(f[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(s-c,p.length);a+=p.slice(0,E).join(""),n+=h,c+=E,typeof f[2]<"u"&&(a+=f[2]),t=t.slice(f[0].length)}return a}});var fn,yv=Ze(()=>{fn=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.10.3"});function Zpe(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Yf(t===null?0:t);return!r&&t===null?Ht(e,a,"grey"):a}function jj(t,{configuration:e,json:r}){let s=Zpe(t,{configuration:e,json:r});if(!s||t===null||t===0)return s;let a=Br[t],n=`https://yarnpkg.com/advanced/error-codes#${s}---${a}`.toLowerCase();return KE(e,s,n)}async function SI({configuration:t,stdout:e,forceError:r},s){let a=await Ot.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let c=!1,f=!1;for(let p of s)typeof p.option<"u"&&(p.error||r?(f=!0,n.reportError(50,p.message)):(c=!0,n.reportWarning(50,p.message)),p.callback?.());c&&!f&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Kpe,FR,nit,Ype,Vpe,D0,zpe,Jpe,iit,sit,NR,oit,Ot,Ev=Ze(()=>{Kpe=ut(Wpe()),FR=ut(Fd());Gx();Rc();yv();xc();nit="\xB7",Ype=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Vpe=80,D0=FR.default.GITHUB_ACTIONS?{start:t=>`::group::${t} `,end:t=>`::endgroup:: `}:FR.default.TRAVIS?{start:t=>`travis_fold:start:${t} `,end:t=>`travis_fold:end:${t} `}:FR.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} `,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,zpe=D0!==null,Jpe=new Date,iit=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,sit=t=>t,NR=sit({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),oit=iit&&Object.keys(NR).find(t=>{let e=NR[t];return!(e.date&&(e.date[0]!==Jpe.getDate()||e.date[1]!==Jpe.getMonth()+1))})||"default";Ot=class extends Ao{constructor({configuration:r,stdout:s,json:a=!1,forceSectionAlignment:n=!1,includeNames:c=!0,includePrefix:f=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:C=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(TB(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=c,this.includePrefix=f,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=C,this.json=a,this.stdout=s,r.get("enableProgressBars")&&!a&&s.isTTY&&s.columns>22){let S=r.get("progressBarStyle")||oit;if(!Object.hasOwn(NR,S))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=NR[S];let b=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*b/80)}}static async start(r,s){let a=new this(r),n=process.emitWarning;process.emitWarning=(c,f)=>{if(typeof c!="string"){let h=c;c=h.message,f=f??h.name}let p=typeof f<"u"?`${f}: ${c}`:c;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,zd(r.configuration,`Yarn ${fn}`,2));try{await s(a)}catch(c){a.reportExceptionOnce(c)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let s=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,s-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}async startSectionPromise({reportHeader:r,reportFooter:s,skipIfEmpty:a},n){let c={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(c):(c.action(),c.committed=!0);let f=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(c),c.committed&&s?.(p-f)}}startTimerImpl(r,s,a){return{cb:typeof s=="function"?s:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,D0!==null&&!this.json&&this.includeInfos&&this.stdout.write(D0.start(r))},reportFooter:f=>{if(this.indent-=1,D0!==null&&!this.json&&this.includeInfos){this.stdout.write(D0.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&f>200?this.reportInfo(null,`\u2514 Completed in ${Ht(this.configuration,f,ht.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof s=="function"?{}:s).skipIfEmpty}}startTimerSync(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionSync(c,n)}async startTimerPromise(r,s,a){let{cb:n,...c}=this.startTimerImpl(r,s,a);return this.startSectionPromise(c,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,s){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",c=`${this.formatPrefix(n,"blueBright")}${s}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(c)}reportWarning(r,s){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${s}`)}reportError(r,s){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,s)),this.reportErrorImpl(r,s)}reportErrorImpl(r,s){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:s}):this.writeLine(`${this.formatPrefix(n,"redBright")}${s}`,{truncate:!1})}reportFold(r,s){if(!D0)return;let a=`${D0.start(r)}${s}${D0.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let s=!1,a=Promise.resolve().then(async()=>{let c={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:c,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:f,title:p}of r)s||c.progress===f&&c.title===p||(c.progress=f,c.title=p,this.refreshProgress());n()}),n=()=>{s||(s=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let s=Ht(this.configuration,Date.now()-this.startTime,ht.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${s}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:s}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:s})} `),this.writeProgress()}writeLines(r,{truncate:s}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:s})} `);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let s of r)s.committed=!0,s.action()}clearProgress({delta:r=0,clear:s=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||s)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Vpe&&(this.progressFrame=(this.progressFrame+1)%Ype.length,this.progressTime=r);let s=Ype[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let c=this.formatName(null),f=c?`${c}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Ht(this.configuration,"\u27A4","blueBright")} ${f}${s}${n}${p} `)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Vpe)}refreshProgress({delta:r=0,force:s=!1}={}){let a=!1,n=!1;if(s||this.progress.size===0)a=!0;else for(let c of this.progress.values()){let f=typeof c.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*c.definition.progress):void 0,p=c.lastScaledSize;c.lastScaledSize=f;let h=c.lastTitle;if(c.lastTitle=c.definition.title,f!==p||(n=h!==c.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:s}={}){return this.progressStyle===null&&(s=!1),typeof s>"u"&&(s=this.configuration.get("preferTruncatedLines")),s&&(r=(0,Kpe.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?Zpe(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,s){return this.includePrefix?`${Ht(this.configuration,"\u27A4",s)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?jj(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${nit} `}}});var In={};Vt(In,{PackageManager:()=>$pe,detectPackageManager:()=>ehe,executePackageAccessibleBinary:()=>she,executePackageScript:()=>OR,executePackageShellcode:()=>Gj,executeWorkspaceAccessibleBinary:()=>pit,executeWorkspaceLifecycleScript:()=>nhe,executeWorkspaceScript:()=>rhe,getPackageAccessibleBinaries:()=>LR,getWorkspaceAccessibleBinaries:()=>ihe,hasPackageScript:()=>uit,hasWorkspaceScript:()=>qj,isNodeScript:()=>Wj,makeScriptEnv:()=>Iv,maybeExecuteWorkspaceLifecycleScript:()=>Ait,prepareExternalProject:()=>cit});async function P0(t,e,r,s=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${s.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await ce.writeFilePromise(J.format({dir:t,name:e,ext:".cmd"}),a)}await ce.writeFilePromise(J.join(t,e),`#!/bin/sh exec "${r}" ${s.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" `,{mode:493})}async function ehe(t){let e=await Ut.tryFind(t);if(e?.packageManager){let s=bQ(e.packageManager);if(s?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=s.reference.split(".");switch(s.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await ce.readFilePromise(J.join(t,Er.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:ce.existsSync(J.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:ce.existsSync(J.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Iv({project:t,locator:e,binFolder:r,ignoreCorepack:s,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let c={};for(let[E,C]of Object.entries(n))typeof C<"u"&&(c[E.toLowerCase()!=="path"?E:"PATH"]=C);let f=fe.fromPortablePath(r);c.BERRY_BIN_FOLDER=fe.fromPortablePath(f);let p=process.env.COREPACK_ROOT&&!s?fe.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([P0(r,"node",process.execPath),...fn!==null?[P0(r,"run",process.execPath,[p,"run"]),P0(r,"yarn",process.execPath,[p]),P0(r,"yarnpkg",process.execPath,[p]),P0(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),t&&(c.INIT_CWD=fe.fromPortablePath(t.configuration.startingCwd),c.PROJECT_CWD=fe.fromPortablePath(t.cwd)),c.PATH=c.PATH?`${f}${fe.delimiter}${c.PATH}`:`${f}`,c.npm_execpath=`${f}${fe.sep}yarn`,c.npm_node_execpath=`${f}${fe.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let E=t.tryWorkspaceByLocator(e),C=E?E.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";c.npm_package_name=un(e),c.npm_package_version=C;let S;if(E)S=E.cwd;else{let b=t.storedPackages.get(e.locatorHash);if(!b)throw new Error(`Package for ${Yr(t.configuration,e)} not found in the project`);let I=t.configuration.getLinkers(),T={project:t,report:new Ot({stdout:new b0.PassThrough,configuration:t.configuration})},N=I.find(U=>U.supportsPackage(b,T));if(!N)throw new Error(`The package ${Yr(t.configuration,b)} isn't supported by any of the available linkers`);S=await N.findPackageLocation(b,T)}c.npm_package_json=fe.fromPortablePath(J.join(S,Er.manifest))}let h=fn!==null?`yarn/${fn}`:`yarn/${bp("@yarnpkg/core").version}-core`;return c.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(c.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,c,async(E,C,S)=>await P0(r,E,C,S)),c}async function cit(t,e,{configuration:r,report:s,workspace:a=null,locator:n=null}){await lit(async()=>{await ce.mktempPromise(async c=>{let f=J.join(c,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(f,{prefix:fe.fromPortablePath(t),report:s}),C=n&&Gu(n)?rI(n):n,S=C?ll(C):"an external project";h.write(`Packing ${S} from sources `);let b=await ehe(t),I;b!==null?(h.write(`Using ${b.packageManager} for bootstrap. Reason: ${b.reason} `),I=b.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn `),I="Yarn");let T=I==="Yarn"&&!b?.packageManagerField;await ce.mktempPromise(async N=>{let U=await Iv({binFolder:N,ignoreCorepack:T,baseEnv:{...process.env,COREPACK_ENABLE_AUTO_PIN:"0"}}),ee=new Map([["Yarn Classic",async()=>{let ue=a!==null?["workspace",a]:[],le=J.join(t,Er.manifest),me=await ce.readFilePromise(le),pe=await Wu(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(pe.code!==0)return pe.code;await ce.writeFilePromise(le,me),await ce.appendFilePromise(J.join(t,".npmignore"),`/.yarn `),h.write(` `),delete U.NODE_ENV;let Be=await Wu("yarn",["install"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(Be.code!==0)return Be.code;h.write(` `);let Ce=await Wu("yarn",[...ue,"pack","--filename",fe.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ce.code!==0?Ce.code:0}],["Yarn",async()=>{let ue=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let le=J.join(t,Er.lockfile);await ce.existsPromise(le)||await ce.writeFilePromise(le,"");let me=await Wu("yarn",[...ue,"pack","--install-if-needed","--filename",fe.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return me.code!==0?me.code:0}],["npm",async()=>{if(a!==null){let we=new b0.PassThrough,ye=WE(we);we.pipe(h,{end:!1});let Ae=await Wu("npm",["--version"],{cwd:t,env:U,stdin:p,stdout:we,stderr:E,end:0});if(we.end(),Ae.code!==0)return h.end(),E.end(),Ae.code;let se=(await ye).toString().trim();if(!Xf(se,">=7.x")){let X=Da(null,"npm"),De=On(X,se),Te=On(X,">=7.x");throw new Error(`Workspaces aren't supported by ${ni(r,De)}; please upgrade to ${ni(r,Te)} (npm has been detected as the primary package manager for ${Ht(r,t,ht.PATH)})`)}}let ue=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let le=await Wu("npm",["install","--legacy-peer-deps"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(le.code!==0)return le.code;let me=new b0.PassThrough,pe=WE(me);me.pipe(h);let Be=await Wu("npm",["pack","--silent",...ue],{cwd:t,env:U,stdin:p,stdout:me,stderr:E});if(Be.code!==0)return Be.code;let Ce=(await pe).toString().trim().replace(/^.*\n/s,""),g=J.resolve(t,fe.toPortablePath(Ce));return await ce.renamePromise(g,e),0}]]).get(I);if(typeof ee>"u")throw new Error("Assertion failed: Unsupported workflow");let ie=await ee();if(!(ie===0||typeof ie>"u"))throw ce.detachTemp(c),new jt(58,`Packing the package failed (exit code ${ie}, logs can be found here: ${Ht(r,f,ht.PATH)})`)})})})}async function uit(t,e,{project:r}){let s=r.tryWorkspaceByLocator(t);if(s!==null)return qj(s,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${Yr(r.configuration,t)} not found in the project`);return await $f.openPromise(async n=>{let c=r.configuration,f=r.configuration.getLinkers(),p={project:r,report:new Ot({stdout:new b0.PassThrough,configuration:c})},h=f.find(b=>b.supportsPackage(a,p));if(!h)throw new Error(`The package ${Yr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),C=new Sn(E,{baseFs:n});return(await Ut.find(vt.dot,{baseFs:C})).scripts.has(e)})}async function OR(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ce.mktempPromise(async p=>{let{manifest:h,env:E,cwd:C}=await the(t,{project:a,binFolder:p,cwd:s,lifecycleScript:e}),S=h.scripts.get(e);if(typeof S>"u")return 1;let b=async()=>await vI(S,r,{cwd:C,env:E,stdin:n,stdout:c,stderr:f});return await(await a.configuration.reduceHook(T=>T.wrapScriptExecution,b,a,t,e,{script:S,args:r,cwd:C,env:E,stdin:n,stdout:c,stderr:f}))()})}async function Gj(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f}){return await ce.mktempPromise(async p=>{let{env:h,cwd:E}=await the(t,{project:a,binFolder:p,cwd:s});return await vI(e,r,{cwd:E,env:h,stdin:n,stdout:c,stderr:f})})}async function fit(t,{binFolder:e,cwd:r,lifecycleScript:s}){let a=await Iv({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:s});return await Yj(e,await ihe(t)),typeof r>"u"&&(r=J.dirname(await ce.realpathPromise(J.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function the(t,{project:e,binFolder:r,cwd:s,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return fit(n,{binFolder:r,cwd:s,lifecycleScript:a});let c=e.storedPackages.get(t.locatorHash);if(!c)throw new Error(`Package for ${Yr(e.configuration,t)} not found in the project`);return await $f.openPromise(async f=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Ot({stdout:new b0.PassThrough,configuration:p})},C=h.find(N=>N.supportsPackage(c,E));if(!C)throw new Error(`The package ${Yr(e.configuration,c)} isn't supported by any of the available linkers`);let S=await Iv({project:e,locator:t,binFolder:r,lifecycleScript:a});await Yj(r,await LR(t,{project:e}));let b=await C.findPackageLocation(c,E),I=new Sn(b,{baseFs:f}),T=await Ut.find(vt.dot,{baseFs:I});return typeof s>"u"&&(s=b),{manifest:T,binFolder:r,env:S,cwd:s}})}async function rhe(t,e,r,{cwd:s,stdin:a,stdout:n,stderr:c}){return await OR(t.anchoredLocator,e,r,{cwd:s,project:t.project,stdin:a,stdout:n,stderr:c})}function qj(t,e){return t.manifest.scripts.has(e)}async function nhe(t,e,{cwd:r,report:s}){let{configuration:a}=t.project,n=null;await ce.mktempPromise(async c=>{let f=J.join(c,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${fe.fromPortablePath(t.cwd)}") `,{stdout:h,stderr:E}=a.getSubprocessStreams(f,{report:s,prefix:Yr(a,t.anchoredLocator),header:p});s.reportInfo(36,`Calling the "${e}" lifecycle script`);let C=await rhe(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),C!==0)throw ce.detachTemp(c),new jt(36,`${PB(e)} script failed (exit code ${Ht(a,C,ht.NUMBER)}, logs can be found here: ${Ht(a,f,ht.PATH)}); run ${Ht(a,`yarn ${e}`,ht.CODE)} to investigate`)})}async function Ait(t,e,r){qj(t,e)&&await nhe(t,e,r)}function Wj(t){let e=J.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0;if(e===".exe"||e===".bin")return!1;let r=Buffer.alloc(4),s;try{s=ce.openSync(t,"r")}catch{return!0}try{ce.readSync(s,r,0,r.length,0)}finally{ce.closeSync(s)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function LR(t,{project:e}){let r=e.configuration,s=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${Yr(r,t)} not found in the project`);let n=new b0.Writable,c=r.getLinkers(),f={project:e,report:new Ot({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let C=e.storedResolutions.get(E.descriptorHash);if(!C)throw new Error(`Assertion failed: The resolution (${ni(r,E)}) should have been registered`);p.add(C)}let h=await Promise.all(Array.from(p,async E=>{let C=e.storedPackages.get(E);if(!C)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(C.bin.size===0)return Wl.skip;let S=c.find(I=>I.supportsPackage(C,f));if(!S)return Wl.skip;let b=null;try{b=await S.findPackageLocation(C,f)}catch(I){if(I.code==="LOCATOR_NOT_INSTALLED")return Wl.skip;throw I}return{dependency:C,packageLocation:b}}));for(let E of h){if(E===Wl.skip)continue;let{dependency:C,packageLocation:S}=E;for(let[b,I]of C.bin){let T=J.resolve(S,I);s.set(b,[C,fe.fromPortablePath(T),Wj(T)])}}return s}async function ihe(t){return await LR(t.anchoredLocator,{project:t.project})}async function Yj(t,e){await Promise.all(Array.from(e,([r,[,s,a]])=>a?P0(t,r,process.execPath,[s]):P0(t,r,s,[])))}async function she(t,e,r,{cwd:s,project:a,stdin:n,stdout:c,stderr:f,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await LR(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${Yr(a.configuration,t)}`);return await ce.mktempPromise(async C=>{let[,S]=E,b=await Iv({project:a,locator:t,binFolder:C});await Yj(b.BERRY_BIN_FOLDER,h);let I=Wj(fe.toPortablePath(S))?Wu(process.execPath,[...p,S,...r],{cwd:s,env:b,stdin:n,stdout:c,stderr:f}):Wu(S,r,{cwd:s,env:b,stdin:n,stdout:c,stderr:f}),T;try{T=await I}finally{await ce.removePromise(b.BERRY_BIN_FOLDER)}return T.code})}async function pit(t,e,r,{cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f}){return await she(t.anchoredLocator,e,r,{project:t.project,cwd:s,stdin:a,stdout:n,stderr:c,packageAccessibleBinaries:f})}var Xpe,b0,$pe,ait,lit,Vj=Ze(()=>{Dt();Dt();eA();pv();ql();Xpe=ut(Ld()),b0=Ie("stream");oI();Rc();Ev();yv();gR();xc();bc();Tp();Wo();$pe=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))($pe||{});ait=2,lit=(0,Xpe.default)(ait)});var DI=_((U4t,ahe)=>{"use strict";var ohe=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);ahe.exports=t=>t?Object.keys(t).map(e=>[ohe.has(e)?ohe.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var bI=_((_4t,dhe)=>{"use strict";var lhe=typeof process=="object"&&process?process:{stdout:null,stderr:null},hit=Ie("events"),che=Ie("stream"),uhe=Ie("string_decoder").StringDecoder,_p=Symbol("EOF"),Hp=Symbol("maybeEmitEnd"),x0=Symbol("emittedEnd"),MR=Symbol("emittingEnd"),Cv=Symbol("emittedError"),UR=Symbol("closed"),fhe=Symbol("read"),_R=Symbol("flush"),Ahe=Symbol("flushChunk"),ul=Symbol("encoding"),jp=Symbol("decoder"),HR=Symbol("flowing"),wv=Symbol("paused"),PI=Symbol("resume"),Ys=Symbol("bufferLength"),Jj=Symbol("bufferPush"),Kj=Symbol("bufferShift"),Ko=Symbol("objectMode"),zo=Symbol("destroyed"),zj=Symbol("emitData"),phe=Symbol("emitEnd"),Zj=Symbol("emitEnd2"),Gp=Symbol("async"),Bv=t=>Promise.resolve().then(t),hhe=global._MP_NO_ITERATOR_SYMBOLS_!=="1",git=hhe&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),dit=hhe&&Symbol.iterator||Symbol("iterator not implemented"),mit=t=>t==="end"||t==="finish"||t==="prefinish",yit=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,Eit=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),jR=class{constructor(e,r,s){this.src=e,this.dest=r,this.opts=s,this.ondrain=()=>e[PI](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},Xj=class extends jR{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,s){super(e,r,s),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};dhe.exports=class ghe extends che{constructor(e){super(),this[HR]=!1,this[wv]=!1,this.pipes=[],this.buffer=[],this[Ko]=e&&e.objectMode||!1,this[Ko]?this[ul]=null:this[ul]=e&&e.encoding||null,this[ul]==="buffer"&&(this[ul]=null),this[Gp]=e&&!!e.async||!1,this[jp]=this[ul]?new uhe(this[ul]):null,this[_p]=!1,this[x0]=!1,this[MR]=!1,this[UR]=!1,this[Cv]=null,this.writable=!0,this.readable=!0,this[Ys]=0,this[zo]=!1}get bufferLength(){return this[Ys]}get encoding(){return this[ul]}set encoding(e){if(this[Ko])throw new Error("cannot set encoding in objectMode");if(this[ul]&&e!==this[ul]&&(this[jp]&&this[jp].lastNeed||this[Ys]))throw new Error("cannot change encoding");this[ul]!==e&&(this[jp]=e?new uhe(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[jp].write(r)))),this[ul]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Ko]}set objectMode(e){this[Ko]=this[Ko]||!!e}get async(){return this[Gp]}set async(e){this[Gp]=this[Gp]||!!e}write(e,r,s){if(this[_p])throw new Error("write after end");if(this[zo])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(s=r,r="utf8"),r||(r="utf8");let a=this[Gp]?Bv:n=>n();return!this[Ko]&&!Buffer.isBuffer(e)&&(Eit(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):yit(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[Ko]?(this.flowing&&this[Ys]!==0&&this[_R](!0),this.flowing?this.emit("data",e):this[Jj](e),this[Ys]!==0&&this.emit("readable"),s&&a(s),this.flowing):e.length?(typeof e=="string"&&!(r===this[ul]&&!this[jp].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[ul]&&(e=this[jp].write(e)),this.flowing&&this[Ys]!==0&&this[_R](!0),this.flowing?this.emit("data",e):this[Jj](e),this[Ys]!==0&&this.emit("readable"),s&&a(s),this.flowing):(this[Ys]!==0&&this.emit("readable"),s&&a(s),this.flowing)}read(e){if(this[zo])return null;if(this[Ys]===0||e===0||e>this[Ys])return this[Hp](),null;this[Ko]&&(e=null),this.buffer.length>1&&!this[Ko]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[Ys])]);let r=this[fhe](e||null,this.buffer[0]);return this[Hp](),r}[fhe](e,r){return e===r.length||e===null?this[Kj]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Ys]-=e),this.emit("data",r),!this.buffer.length&&!this[_p]&&this.emit("drain"),r}end(e,r,s){return typeof e=="function"&&(s=e,e=null),typeof r=="function"&&(s=r,r="utf8"),e&&this.write(e,r),s&&this.once("end",s),this[_p]=!0,this.writable=!1,(this.flowing||!this[wv])&&this[Hp](),this}[PI](){this[zo]||(this[wv]=!1,this[HR]=!0,this.emit("resume"),this.buffer.length?this[_R]():this[_p]?this[Hp]():this.emit("drain"))}resume(){return this[PI]()}pause(){this[HR]=!1,this[wv]=!0}get destroyed(){return this[zo]}get flowing(){return this[HR]}get paused(){return this[wv]}[Jj](e){this[Ko]?this[Ys]+=1:this[Ys]+=e.length,this.buffer.push(e)}[Kj](){return this.buffer.length&&(this[Ko]?this[Ys]-=1:this[Ys]-=this.buffer[0].length),this.buffer.shift()}[_R](e){do;while(this[Ahe](this[Kj]()));!e&&!this.buffer.length&&!this[_p]&&this.emit("drain")}[Ahe](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[zo])return;let s=this[x0];return r=r||{},e===lhe.stdout||e===lhe.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,s?r.end&&e.end():(this.pipes.push(r.proxyErrors?new Xj(this,e,r):new jR(this,e,r)),this[Gp]?Bv(()=>this[PI]()):this[PI]()),e}unpipe(e){let r=this.pipes.find(s=>s.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let s=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[PI]():e==="readable"&&this[Ys]!==0?super.emit("readable"):mit(e)&&this[x0]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[Cv]&&(this[Gp]?Bv(()=>r.call(this,this[Cv])):r.call(this,this[Cv])),s}get emittedEnd(){return this[x0]}[Hp](){!this[MR]&&!this[x0]&&!this[zo]&&this.buffer.length===0&&this[_p]&&(this[MR]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[UR]&&this.emit("close"),this[MR]=!1)}emit(e,r,...s){if(e!=="error"&&e!=="close"&&e!==zo&&this[zo])return;if(e==="data")return r?this[Gp]?Bv(()=>this[zj](r)):this[zj](r):!1;if(e==="end")return this[phe]();if(e==="close"){if(this[UR]=!0,!this[x0]&&!this[zo])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[Cv]=r;let n=super.emit("error",r);return this[Hp](),n}else if(e==="resume"){let n=super.emit("resume");return this[Hp](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...s);return this[Hp](),a}[zj](e){for(let s of this.pipes)s.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Hp](),r}[phe](){this[x0]||(this[x0]=!0,this.readable=!1,this[Gp]?Bv(()=>this[Zj]()):this[Zj]())}[Zj](){if(this[jp]){let r=this[jp].end();if(r){for(let s of this.pipes)s.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[Ko]||(e.dataLength=0);let r=this.promise();return this.on("data",s=>{e.push(s),this[Ko]||(e.dataLength+=s.length)}),r.then(()=>e)}concat(){return this[Ko]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Ko]?Promise.reject(new Error("cannot concat in objectMode")):this[ul]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(zo,()=>r(new Error("stream destroyed"))),this.on("error",s=>r(s)),this.on("end",()=>e())})}[git](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[_p])return Promise.resolve({done:!0});let s=null,a=null,n=h=>{this.removeListener("data",c),this.removeListener("end",f),a(h)},c=h=>{this.removeListener("error",n),this.removeListener("end",f),this.pause(),s({value:h,done:!!this[_p]})},f=()=>{this.removeListener("error",n),this.removeListener("data",c),s({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,s=h,this.once(zo,p),this.once("error",n),this.once("end",f),this.once("data",c)})}}}[dit](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[zo]?(e?this.emit("error",e):this.emit(zo),this):(this[zo]=!0,this.buffer.length=0,this[Ys]=0,typeof this.close=="function"&&!this[UR]&&this.close(),e?this.emit("error",e):this.emit(zo),this)}static isStream(e){return!!e&&(e instanceof ghe||e instanceof che||e instanceof hit&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var yhe=_((H4t,mhe)=>{var Iit=Ie("zlib").constants||{ZLIB_VERNUM:4736};mhe.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Iit))});var h6=_(Kl=>{"use strict";var n6=Ie("assert"),k0=Ie("buffer").Buffer,Che=Ie("zlib"),fm=Kl.constants=yhe(),Cit=bI(),Ehe=k0.concat,Am=Symbol("_superWrite"),kI=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},wit=Symbol("opts"),vv=Symbol("flushFlag"),Ihe=Symbol("finishFlushFlag"),p6=Symbol("fullFlushFlag"),Ii=Symbol("handle"),GR=Symbol("onError"),xI=Symbol("sawError"),$j=Symbol("level"),e6=Symbol("strategy"),t6=Symbol("ended"),j4t=Symbol("_defaultFullFlush"),qR=class extends Cit{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[xI]=!1,this[t6]=!1,this[wit]=e,this[vv]=e.flush,this[Ihe]=e.finishFlush;try{this[Ii]=new Che[r](e)}catch(s){throw new kI(s)}this[GR]=s=>{this[xI]||(this[xI]=!0,this.close(),this.emit("error",s))},this[Ii].on("error",s=>this[GR](new kI(s))),this.once("end",()=>this.close)}close(){this[Ii]&&(this[Ii].close(),this[Ii]=null,this.emit("close"))}reset(){if(!this[xI])return n6(this[Ii],"zlib binding closed"),this[Ii].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[p6]),this.write(Object.assign(k0.alloc(0),{[vv]:e})))}end(e,r,s){return e&&this.write(e,r),this.flush(this[Ihe]),this[t6]=!0,super.end(null,null,s)}get ended(){return this[t6]}write(e,r,s){if(typeof r=="function"&&(s=r,r="utf8"),typeof e=="string"&&(e=k0.from(e,r)),this[xI])return;n6(this[Ii],"zlib binding closed");let a=this[Ii]._handle,n=a.close;a.close=()=>{};let c=this[Ii].close;this[Ii].close=()=>{},k0.concat=h=>h;let f;try{let h=typeof e[vv]=="number"?e[vv]:this[vv];f=this[Ii]._processChunk(e,h),k0.concat=Ehe}catch(h){k0.concat=Ehe,this[GR](new kI(h))}finally{this[Ii]&&(this[Ii]._handle=a,a.close=n,this[Ii].close=c,this[Ii].removeAllListeners("error"))}this[Ii]&&this[Ii].on("error",h=>this[GR](new kI(h)));let p;if(f)if(Array.isArray(f)&&f.length>0){p=this[Am](k0.from(f[0]));for(let h=1;h{this.flush(a),n()};try{this[Ii].params(e,r)}finally{this[Ii].flush=s}this[Ii]&&(this[$j]=e,this[e6]=r)}}}},i6=class extends qp{constructor(e){super(e,"Deflate")}},s6=class extends qp{constructor(e){super(e,"Inflate")}},r6=Symbol("_portable"),o6=class extends qp{constructor(e){super(e,"Gzip"),this[r6]=e&&!!e.portable}[Am](e){return this[r6]?(this[r6]=!1,e[9]=255,super[Am](e)):super[Am](e)}},a6=class extends qp{constructor(e){super(e,"Gunzip")}},l6=class extends qp{constructor(e){super(e,"DeflateRaw")}},c6=class extends qp{constructor(e){super(e,"InflateRaw")}},u6=class extends qp{constructor(e){super(e,"Unzip")}},WR=class extends qR{constructor(e,r){e=e||{},e.flush=e.flush||fm.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||fm.BROTLI_OPERATION_FINISH,super(e,r),this[p6]=fm.BROTLI_OPERATION_FLUSH}},f6=class extends WR{constructor(e){super(e,"BrotliCompress")}},A6=class extends WR{constructor(e){super(e,"BrotliDecompress")}};Kl.Deflate=i6;Kl.Inflate=s6;Kl.Gzip=o6;Kl.Gunzip=a6;Kl.DeflateRaw=l6;Kl.InflateRaw=c6;Kl.Unzip=u6;typeof Che.BrotliCompress=="function"?(Kl.BrotliCompress=f6,Kl.BrotliDecompress=A6):Kl.BrotliCompress=Kl.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var QI=_((W4t,whe)=>{var Bit=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;whe.exports=Bit!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var YR=_((V4t,Bhe)=>{"use strict";var vit=bI(),g6=QI(),d6=Symbol("slurp");Bhe.exports=class extends vit{constructor(e,r,s){switch(super(),this.pause(),this.extended=r,this.globalExtended=s,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=g6(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=g6(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[d6](r),s&&this[d6](s,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let s=this.remain,a=this.blockRemain;return this.remain=Math.max(0,s-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:s>=r?super.write(e):super.write(e.slice(0,s))}[d6](e,r){for(let s in e)e[s]!==null&&e[s]!==void 0&&!(r&&s==="path")&&(this[s]=s==="path"||s==="linkpath"?g6(e[s]):e[s])}}});var m6=_(VR=>{"use strict";VR.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);VR.code=new Map(Array.from(VR.name).map(t=>[t[1],t[0]]))});var Phe=_((K4t,Dhe)=>{"use strict";var Sit=(t,e)=>{if(Number.isSafeInteger(t))t<0?Pit(t,e):Dit(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},Dit=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Pit=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var s=e.length;s>1;s--){var a=t&255;t=Math.floor(t/256),r?e[s-1]=vhe(a):a===0?e[s-1]=0:(r=!0,e[s-1]=She(a))}},bit=t=>{let e=t[0],r=e===128?kit(t.slice(1,t.length)):e===255?xit(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},xit=t=>{for(var e=t.length,r=0,s=!1,a=e-1;a>-1;a--){var n=t[a],c;s?c=vhe(n):n===0?c=n:(s=!0,c=She(n)),c!==0&&(r-=c*Math.pow(256,e-a-1))}return r},kit=t=>{for(var e=t.length,r=0,s=e-1;s>-1;s--){var a=t[s];a!==0&&(r+=a*Math.pow(256,e-s-1))}return r},vhe=t=>(255^t)&255,She=t=>(255^t)+1&255;Dhe.exports={encode:Sit,parse:bit}});var TI=_((z4t,xhe)=>{"use strict";var y6=m6(),RI=Ie("path").posix,bhe=Phe(),E6=Symbol("slurp"),zl=Symbol("type"),w6=class{constructor(e,r,s,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[zl]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,s,a):e&&this.set(e)}decode(e,r,s,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=pm(e,r,100),this.mode=Q0(e,r+100,8),this.uid=Q0(e,r+108,8),this.gid=Q0(e,r+116,8),this.size=Q0(e,r+124,12),this.mtime=I6(e,r+136,12),this.cksum=Q0(e,r+148,12),this[E6](s),this[E6](a,!0),this[zl]=pm(e,r+156,1),this[zl]===""&&(this[zl]="0"),this[zl]==="0"&&this.path.substr(-1)==="/"&&(this[zl]="5"),this[zl]==="5"&&(this.size=0),this.linkpath=pm(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=pm(e,r+265,32),this.gname=pm(e,r+297,32),this.devmaj=Q0(e,r+329,8),this.devmin=Q0(e,r+337,8),e[r+475]!==0){let c=pm(e,r+345,155);this.path=c+"/"+this.path}else{let c=pm(e,r+345,130);c&&(this.path=c+"/"+this.path),this.atime=I6(e,r+476,12),this.ctime=I6(e,r+488,12)}let n=8*32;for(let c=r;c=r+512))throw new Error("need 512 bytes for header");let s=this.ctime||this.atime?130:155,a=Qit(this.path||"",s),n=a[0],c=a[1];this.needPax=a[2],this.needPax=hm(e,r,100,n)||this.needPax,this.needPax=R0(e,r+100,8,this.mode)||this.needPax,this.needPax=R0(e,r+108,8,this.uid)||this.needPax,this.needPax=R0(e,r+116,8,this.gid)||this.needPax,this.needPax=R0(e,r+124,12,this.size)||this.needPax,this.needPax=C6(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[zl].charCodeAt(0),this.needPax=hm(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=hm(e,r+265,32,this.uname)||this.needPax,this.needPax=hm(e,r+297,32,this.gname)||this.needPax,this.needPax=R0(e,r+329,8,this.devmaj)||this.needPax,this.needPax=R0(e,r+337,8,this.devmin)||this.needPax,this.needPax=hm(e,r+345,s,c)||this.needPax,e[r+475]!==0?this.needPax=hm(e,r+345,155,c)||this.needPax:(this.needPax=hm(e,r+345,130,c)||this.needPax,this.needPax=C6(e,r+476,12,this.atime)||this.needPax,this.needPax=C6(e,r+488,12,this.ctime)||this.needPax);let f=8*32;for(let p=r;p{let s=t,a="",n,c=RI.parse(t).root||".";if(Buffer.byteLength(s)<100)n=[s,a,!1];else{a=RI.dirname(s),s=RI.basename(s);do Buffer.byteLength(s)<=100&&Buffer.byteLength(a)<=e?n=[s,a,!1]:Buffer.byteLength(s)>100&&Buffer.byteLength(a)<=e?n=[s.substr(0,99),a,!0]:(s=RI.join(RI.basename(a),s),a=RI.dirname(a));while(a!==c&&!n);n||(n=[t.substr(0,99),"",!0])}return n},pm=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),I6=(t,e,r)=>Rit(Q0(t,e,r)),Rit=t=>t===null?null:new Date(t*1e3),Q0=(t,e,r)=>t[e]&128?bhe.parse(t.slice(e,e+r)):Fit(t,e,r),Tit=t=>isNaN(t)?null:t,Fit=(t,e,r)=>Tit(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),Nit={12:8589934591,8:2097151},R0=(t,e,r,s)=>s===null?!1:s>Nit[r]||s<0?(bhe.encode(s,t.slice(e,e+r)),!0):(Oit(t,e,r,s),!1),Oit=(t,e,r,s)=>t.write(Lit(s,r),e,r,"ascii"),Lit=(t,e)=>Mit(Math.floor(t).toString(8),e),Mit=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",C6=(t,e,r,s)=>s===null?!1:R0(t,e,r,s.getTime()/1e3),Uit=new Array(156).join("\0"),hm=(t,e,r,s)=>s===null?!1:(t.write(s+Uit,e,r,"utf8"),s.length!==Buffer.byteLength(s)||s.length>r);xhe.exports=w6});var JR=_((Z4t,khe)=>{"use strict";var _it=TI(),Hit=Ie("path"),Sv=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),s=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(s);for(let n=0;n<512;n++)a[n]=0;new _it({path:("PaxHeader/"+Hit.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+s}};Sv.parse=(t,e,r)=>new Sv(jit(Git(t),e),r);var jit=(t,e)=>e?Object.keys(t).reduce((r,s)=>(r[s]=t[s],r),e):t,Git=t=>t.replace(/\n$/,"").split(` `).reduce(qit,Object.create(null)),qit=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let s=e.split("="),a=s.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=s.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};khe.exports=Sv});var FI=_((X4t,Qhe)=>{Qhe.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var KR=_(($4t,Rhe)=>{"use strict";Rhe.exports=t=>class extends t{warn(e,r,s={}){this.file&&(s.file=this.file),this.cwd&&(s.cwd=this.cwd),s.code=r instanceof Error&&r.code||e,s.tarCode=e,!this.strict&&s.recoverable!==!1?(r instanceof Error&&(s=Object.assign(r,s),r=r.message),this.emit("warn",s.tarCode,r,s)):r instanceof Error?this.emit("error",Object.assign(r,s)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),s))}}});var v6=_((t3t,The)=>{"use strict";var zR=["|","<",">","?",":"],B6=zR.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),Wit=new Map(zR.map((t,e)=>[t,B6[e]])),Yit=new Map(B6.map((t,e)=>[t,zR[e]]));The.exports={encode:t=>zR.reduce((e,r)=>e.split(r).join(Wit.get(r)),t),decode:t=>B6.reduce((e,r)=>e.split(r).join(Yit.get(r)),t)}});var S6=_((r3t,Nhe)=>{var{isAbsolute:Vit,parse:Fhe}=Ie("path").win32;Nhe.exports=t=>{let e="",r=Fhe(t);for(;Vit(t)||r.root;){let s=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(s.length),e+=s,r=Fhe(t)}return[e,t]}});var Lhe=_((n3t,Ohe)=>{"use strict";Ohe.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var N6=_((o3t,Zhe)=>{"use strict";var qhe=bI(),Whe=JR(),Yhe=TI(),nA=Ie("fs"),Mhe=Ie("path"),rA=QI(),Jit=FI(),Vhe=(t,e)=>e?(t=rA(t).replace(/^\.(\/|$)/,""),Jit(e)+"/"+t):rA(t),Kit=16*1024*1024,Uhe=Symbol("process"),_he=Symbol("file"),Hhe=Symbol("directory"),P6=Symbol("symlink"),jhe=Symbol("hardlink"),Dv=Symbol("header"),ZR=Symbol("read"),b6=Symbol("lstat"),XR=Symbol("onlstat"),x6=Symbol("onread"),k6=Symbol("onreadlink"),Q6=Symbol("openfile"),R6=Symbol("onopenfile"),T0=Symbol("close"),$R=Symbol("mode"),T6=Symbol("awaitDrain"),D6=Symbol("ondrain"),iA=Symbol("prefix"),Ghe=Symbol("hadError"),Jhe=KR(),zit=v6(),Khe=S6(),zhe=Lhe(),eT=Jhe(class extends qhe{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=rA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||Kit,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=rA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?rA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let s=!1;if(!this.preservePaths){let[a,n]=Khe(this.path);a&&(this.path=n,s=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=zit.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=rA(r.absolute||Mhe.resolve(this.cwd,e)),this.path===""&&(this.path="./"),s&&this.warn("TAR_ENTRY_INFO",`stripping ${s} from absolute path`,{entry:this,path:s+this.path}),this.statCache.has(this.absolute)?this[XR](this.statCache.get(this.absolute)):this[b6]()}emit(e,...r){return e==="error"&&(this[Ghe]=!0),super.emit(e,...r)}[b6](){nA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[XR](r)})}[XR](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=Xit(e),this.emit("stat",e),this[Uhe]()}[Uhe](){switch(this.type){case"File":return this[_he]();case"Directory":return this[Hhe]();case"SymbolicLink":return this[P6]();default:return this.end()}}[$R](e){return zhe(e,this.type==="Directory",this.portable)}[iA](e){return Vhe(e,this.prefix)}[Dv](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new Yhe({path:this[iA](this.path),linkpath:this.type==="Link"?this[iA](this.linkpath):this.linkpath,mode:this[$R](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new Whe({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[iA](this.path),linkpath:this.type==="Link"?this[iA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[Hhe](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[Dv](),this.end()}[P6](){nA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[k6](r)})}[k6](e){this.linkpath=rA(e),this[Dv](),this.end()}[jhe](e){this.type="Link",this.linkpath=rA(Mhe.relative(this.cwd,e)),this.stat.size=0,this[Dv](),this.end()}[_he](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[jhe](r)}this.linkCache.set(e,this.absolute)}if(this[Dv](),this.stat.size===0)return this.end();this[Q6]()}[Q6](){nA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[R6](r)})}[R6](e){if(this.fd=e,this[Ghe])return this[T0]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[ZR]()}[ZR](){let{fd:e,buf:r,offset:s,length:a,pos:n}=this;nA.read(e,r,s,a,n,(c,f)=>{if(c)return this[T0](()=>this.emit("error",c));this[x6](f)})}[T0](e){nA.close(this.fd,e)}[x6](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[T0](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[T0](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[D6]())}[T6](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[ZR]()}}),F6=class extends eT{[b6](){this[XR](nA.lstatSync(this.absolute))}[P6](){this[k6](nA.readlinkSync(this.absolute))}[Q6](){this[R6](nA.openSync(this.absolute,"r"))}[ZR](){let e=!0;try{let{fd:r,buf:s,offset:a,length:n,pos:c}=this,f=nA.readSync(r,s,a,n,c);this[x6](f),e=!1}finally{if(e)try{this[T0](()=>{})}catch{}}}[T6](e){e()}[T0](e){nA.closeSync(this.fd),e()}},Zit=Jhe(class extends qhe{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=rA(e.path),this.mode=this[$R](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=rA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let s=!1;if(!this.preservePaths){let[a,n]=Khe(this.path);a&&(this.path=n,s=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new Yhe({path:this[iA](this.path),linkpath:this.type==="Link"?this[iA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),s&&this.warn("TAR_ENTRY_INFO",`stripping ${s} from absolute path`,{entry:this,path:s+this.path}),this.header.encode()&&!this.noPax&&super.write(new Whe({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[iA](this.path),linkpath:this.type==="Link"?this[iA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[iA](e){return Vhe(e,this.prefix)}[$R](e){return zhe(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});eT.Sync=F6;eT.Tar=Zit;var Xit=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";Zhe.exports=eT});var cT=_((l3t,i0e)=>{"use strict";var aT=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},$it=bI(),est=h6(),tst=YR(),q6=N6(),rst=q6.Sync,nst=q6.Tar,ist=$x(),Xhe=Buffer.alloc(1024),nT=Symbol("onStat"),tT=Symbol("ended"),sA=Symbol("queue"),NI=Symbol("current"),gm=Symbol("process"),rT=Symbol("processing"),$he=Symbol("processJob"),oA=Symbol("jobs"),O6=Symbol("jobDone"),iT=Symbol("addFSEntry"),e0e=Symbol("addTarEntry"),_6=Symbol("stat"),H6=Symbol("readdir"),sT=Symbol("onreaddir"),oT=Symbol("pipe"),t0e=Symbol("entry"),L6=Symbol("entryOpt"),j6=Symbol("writeEntryClass"),n0e=Symbol("write"),M6=Symbol("ondrain"),lT=Ie("fs"),r0e=Ie("path"),sst=KR(),U6=QI(),W6=sst(class extends $it{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=U6(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[j6]=q6,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new est.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[M6]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[M6]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[sA]=new ist,this[oA]=0,this.jobs=+e.jobs||4,this[rT]=!1,this[tT]=!1}[n0e](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[tT]=!0,this[gm](),this}write(e){if(this[tT])throw new Error("write after end");return e instanceof tst?this[e0e](e):this[iT](e),this.flowing}[e0e](e){let r=U6(r0e.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let s=new aT(e.path,r,!1);s.entry=new nst(e,this[L6](s)),s.entry.on("end",a=>this[O6](s)),this[oA]+=1,this[sA].push(s)}this[gm]()}[iT](e){let r=U6(r0e.resolve(this.cwd,e));this[sA].push(new aT(e,r)),this[gm]()}[_6](e){e.pending=!0,this[oA]+=1;let r=this.follow?"stat":"lstat";lT[r](e.absolute,(s,a)=>{e.pending=!1,this[oA]-=1,s?this.emit("error",s):this[nT](e,a)})}[nT](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[gm]()}[H6](e){e.pending=!0,this[oA]+=1,lT.readdir(e.absolute,(r,s)=>{if(e.pending=!1,this[oA]-=1,r)return this.emit("error",r);this[sT](e,s)})}[sT](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[gm]()}[gm](){if(!this[rT]){this[rT]=!0;for(let e=this[sA].head;e!==null&&this[oA]this.warn(r,s,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[t0e](e){this[oA]+=1;try{return new this[j6](e.path,this[L6](e)).on("end",()=>this[O6](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[M6](){this[NI]&&this[NI].entry&&this[NI].entry.resume()}[oT](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,c=n==="./"?"":n.replace(/\/*$/,"/");this[iT](c+a)});let r=e.entry,s=this.zip;s?r.on("data",a=>{s.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),G6=class extends W6{constructor(e){super(e),this[j6]=rst}pause(){}resume(){}[_6](e){let r=this.follow?"statSync":"lstatSync";this[nT](e,lT[r](e.absolute))}[H6](e,r){this[sT](e,lT.readdirSync(e.absolute))}[oT](e){let r=e.entry,s=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,c=n==="./"?"":n.replace(/\/*$/,"/");this[iT](c+a)}),s?r.on("data",a=>{s.write(a)}):r.on("data",a=>{super[n0e](a)})}};W6.Sync=G6;i0e.exports=W6});var GI=_(bv=>{"use strict";var ost=bI(),ast=Ie("events").EventEmitter,fl=Ie("fs"),J6=fl.writev;if(!J6){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;J6=(r,s,a,n)=>{let c=(p,h)=>n(p,h,s),f=new e;f.oncomplete=c,t.writeBuffers(r,s,a,f)}}var HI=Symbol("_autoClose"),Yu=Symbol("_close"),Pv=Symbol("_ended"),ii=Symbol("_fd"),s0e=Symbol("_finished"),N0=Symbol("_flags"),Y6=Symbol("_flush"),K6=Symbol("_handleChunk"),z6=Symbol("_makeBuf"),hT=Symbol("_mode"),uT=Symbol("_needDrain"),UI=Symbol("_onerror"),jI=Symbol("_onopen"),V6=Symbol("_onread"),LI=Symbol("_onwrite"),O0=Symbol("_open"),Wp=Symbol("_path"),dm=Symbol("_pos"),aA=Symbol("_queue"),MI=Symbol("_read"),o0e=Symbol("_readSize"),F0=Symbol("_reading"),fT=Symbol("_remain"),a0e=Symbol("_size"),AT=Symbol("_write"),OI=Symbol("_writing"),pT=Symbol("_defaultFlag"),_I=Symbol("_errored"),gT=class extends ost{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[_I]=!1,this[ii]=typeof r.fd=="number"?r.fd:null,this[Wp]=e,this[o0e]=r.readSize||16*1024*1024,this[F0]=!1,this[a0e]=typeof r.size=="number"?r.size:1/0,this[fT]=this[a0e],this[HI]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[ii]=="number"?this[MI]():this[O0]()}get fd(){return this[ii]}get path(){return this[Wp]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[O0](){fl.open(this[Wp],"r",(e,r)=>this[jI](e,r))}[jI](e,r){e?this[UI](e):(this[ii]=r,this.emit("open",r),this[MI]())}[z6](){return Buffer.allocUnsafe(Math.min(this[o0e],this[fT]))}[MI](){if(!this[F0]){this[F0]=!0;let e=this[z6]();if(e.length===0)return process.nextTick(()=>this[V6](null,0,e));fl.read(this[ii],e,0,e.length,null,(r,s,a)=>this[V6](r,s,a))}}[V6](e,r,s){this[F0]=!1,e?this[UI](e):this[K6](r,s)&&this[MI]()}[Yu](){if(this[HI]&&typeof this[ii]=="number"){let e=this[ii];this[ii]=null,fl.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[UI](e){this[F0]=!0,this[Yu](),this.emit("error",e)}[K6](e,r){let s=!1;return this[fT]-=e,e>0&&(s=super.write(ethis[jI](e,r))}[jI](e,r){this[pT]&&this[N0]==="r+"&&e&&e.code==="ENOENT"?(this[N0]="w",this[O0]()):e?this[UI](e):(this[ii]=r,this.emit("open",r),this[Y6]())}end(e,r){return e&&this.write(e,r),this[Pv]=!0,!this[OI]&&!this[aA].length&&typeof this[ii]=="number"&&this[LI](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[Pv]?(this.emit("error",new Error("write() after end()")),!1):this[ii]===null||this[OI]||this[aA].length?(this[aA].push(e),this[uT]=!0,!1):(this[OI]=!0,this[AT](e),!0)}[AT](e){fl.write(this[ii],e,0,e.length,this[dm],(r,s)=>this[LI](r,s))}[LI](e,r){e?this[UI](e):(this[dm]!==null&&(this[dm]+=r),this[aA].length?this[Y6]():(this[OI]=!1,this[Pv]&&!this[s0e]?(this[s0e]=!0,this[Yu](),this.emit("finish")):this[uT]&&(this[uT]=!1,this.emit("drain"))))}[Y6](){if(this[aA].length===0)this[Pv]&&this[LI](null,0);else if(this[aA].length===1)this[AT](this[aA].pop());else{let e=this[aA];this[aA]=[],J6(this[ii],e,this[dm],(r,s)=>this[LI](r,s))}}[Yu](){if(this[HI]&&typeof this[ii]=="number"){let e=this[ii];this[ii]=null,fl.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},X6=class extends dT{[O0](){let e;if(this[pT]&&this[N0]==="r+")try{e=fl.openSync(this[Wp],this[N0],this[hT])}catch(r){if(r.code==="ENOENT")return this[N0]="w",this[O0]();throw r}else e=fl.openSync(this[Wp],this[N0],this[hT]);this[jI](null,e)}[Yu](){if(this[HI]&&typeof this[ii]=="number"){let e=this[ii];this[ii]=null,fl.closeSync(e),this.emit("close")}}[AT](e){let r=!0;try{this[LI](null,fl.writeSync(this[ii],e,0,e.length,this[dm])),r=!1}finally{if(r)try{this[Yu]()}catch{}}}};bv.ReadStream=gT;bv.ReadStreamSync=Z6;bv.WriteStream=dT;bv.WriteStreamSync=X6});var BT=_((f3t,h0e)=>{"use strict";var lst=KR(),cst=TI(),ust=Ie("events"),fst=$x(),Ast=1024*1024,pst=YR(),l0e=JR(),hst=h6(),$6=Buffer.from([31,139]),Lc=Symbol("state"),mm=Symbol("writeEntry"),Yp=Symbol("readEntry"),eG=Symbol("nextEntry"),c0e=Symbol("processEntry"),Mc=Symbol("extendedHeader"),xv=Symbol("globalExtendedHeader"),L0=Symbol("meta"),u0e=Symbol("emitMeta"),Di=Symbol("buffer"),Vp=Symbol("queue"),ym=Symbol("ended"),f0e=Symbol("emittedEnd"),Em=Symbol("emit"),Al=Symbol("unzip"),mT=Symbol("consumeChunk"),yT=Symbol("consumeChunkSub"),tG=Symbol("consumeBody"),A0e=Symbol("consumeMeta"),p0e=Symbol("consumeHeader"),ET=Symbol("consuming"),rG=Symbol("bufferConcat"),nG=Symbol("maybeEnd"),kv=Symbol("writing"),M0=Symbol("aborted"),IT=Symbol("onDone"),Im=Symbol("sawValidEntry"),CT=Symbol("sawNullBlock"),wT=Symbol("sawEOF"),gst=t=>!0;h0e.exports=lst(class extends ust{constructor(e){e=e||{},super(e),this.file=e.file||"",this[Im]=null,this.on(IT,r=>{(this[Lc]==="begin"||this[Im]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(IT,e.ondone):this.on(IT,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||Ast,this.filter=typeof e.filter=="function"?e.filter:gst,this.writable=!0,this.readable=!1,this[Vp]=new fst,this[Di]=null,this[Yp]=null,this[mm]=null,this[Lc]="begin",this[L0]="",this[Mc]=null,this[xv]=null,this[ym]=!1,this[Al]=null,this[M0]=!1,this[CT]=!1,this[wT]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[p0e](e,r){this[Im]===null&&(this[Im]=!1);let s;try{s=new cst(e,r,this[Mc],this[xv])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(s.nullBlock)this[CT]?(this[wT]=!0,this[Lc]==="begin"&&(this[Lc]="header"),this[Em]("eof")):(this[CT]=!0,this[Em]("nullBlock"));else if(this[CT]=!1,!s.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:s});else if(!s.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:s});else{let a=s.type;if(/^(Symbolic)?Link$/.test(a)&&!s.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:s});else if(!/^(Symbolic)?Link$/.test(a)&&s.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:s});else{let n=this[mm]=new pst(s,this[Mc],this[xv]);if(!this[Im])if(n.remain){let c=()=>{n.invalid||(this[Im]=!0)};n.on("end",c)}else this[Im]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Em]("ignoredEntry",n),this[Lc]="ignore",n.resume()):n.size>0&&(this[L0]="",n.on("data",c=>this[L0]+=c),this[Lc]="meta"):(this[Mc]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Em]("ignoredEntry",n),this[Lc]=n.remain?"ignore":"header",n.resume()):(n.remain?this[Lc]="body":(this[Lc]="header",n.end()),this[Yp]?this[Vp].push(n):(this[Vp].push(n),this[eG]())))}}}[c0e](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[Yp]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",s=>this[eG]()),r=!1)):(this[Yp]=null,r=!1),r}[eG](){do;while(this[c0e](this[Vp].shift()));if(!this[Vp].length){let e=this[Yp];!e||e.flowing||e.size===e.remain?this[kv]||this.emit("drain"):e.once("drain",s=>this.emit("drain"))}}[tG](e,r){let s=this[mm],a=s.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return s.write(n),s.blockRemain||(this[Lc]="header",this[mm]=null,s.end()),n.length}[A0e](e,r){let s=this[mm],a=this[tG](e,r);return this[mm]||this[u0e](s),a}[Em](e,r,s){!this[Vp].length&&!this[Yp]?this.emit(e,r,s):this[Vp].push([e,r,s])}[u0e](e){switch(this[Em]("meta",this[L0]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[Mc]=l0e.parse(this[L0],this[Mc],!1);break;case"GlobalExtendedHeader":this[xv]=l0e.parse(this[L0],this[xv],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[Mc]=this[Mc]||Object.create(null),this[Mc].path=this[L0].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[Mc]=this[Mc]||Object.create(null),this[Mc].linkpath=this[L0].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[M0]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[M0])return;if(this[Al]===null&&e){if(this[Di]&&(e=Buffer.concat([this[Di],e]),this[Di]=null),e.length<$6.length)return this[Di]=e,!0;for(let s=0;this[Al]===null&&s<$6.length;s++)e[s]!==$6[s]&&(this[Al]=!1);if(this[Al]===null){let s=this[ym];this[ym]=!1,this[Al]=new hst.Unzip,this[Al].on("data",n=>this[mT](n)),this[Al].on("error",n=>this.abort(n)),this[Al].on("end",n=>{this[ym]=!0,this[mT]()}),this[kv]=!0;let a=this[Al][s?"end":"write"](e);return this[kv]=!1,a}}this[kv]=!0,this[Al]?this[Al].write(e):this[mT](e),this[kv]=!1;let r=this[Vp].length?!1:this[Yp]?this[Yp].flowing:!0;return!r&&!this[Vp].length&&this[Yp].once("drain",s=>this.emit("drain")),r}[rG](e){e&&!this[M0]&&(this[Di]=this[Di]?Buffer.concat([this[Di],e]):e)}[nG](){if(this[ym]&&!this[f0e]&&!this[M0]&&!this[ET]){this[f0e]=!0;let e=this[mm];if(e&&e.blockRemain){let r=this[Di]?this[Di].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Di]&&e.write(this[Di]),e.end()}this[Em](IT)}}[mT](e){if(this[ET])this[rG](e);else if(!e&&!this[Di])this[nG]();else{if(this[ET]=!0,this[Di]){this[rG](e);let r=this[Di];this[Di]=null,this[yT](r)}else this[yT](e);for(;this[Di]&&this[Di].length>=512&&!this[M0]&&!this[wT];){let r=this[Di];this[Di]=null,this[yT](r)}this[ET]=!1}(!this[Di]||this[ym])&&this[nG]()}[yT](e){let r=0,s=e.length;for(;r+512<=s&&!this[M0]&&!this[wT];)switch(this[Lc]){case"begin":case"header":this[p0e](e,r),r+=512;break;case"ignore":case"body":r+=this[tG](e,r);break;case"meta":r+=this[A0e](e,r);break;default:throw new Error("invalid state: "+this[Lc])}r{"use strict";var dst=DI(),d0e=BT(),qI=Ie("fs"),mst=GI(),g0e=Ie("path"),iG=FI();y0e.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let s=dst(t);if(s.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!s.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Est(s,e),s.noResume||yst(s),s.file&&s.sync?Ist(s):s.file?Cst(s,r):m0e(s)};var yst=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Est=(t,e)=>{let r=new Map(e.map(n=>[iG(n),!0])),s=t.filter,a=(n,c)=>{let f=c||g0e.parse(n).root||".",p=n===f?!1:r.has(n)?r.get(n):a(g0e.dirname(n),f);return r.set(n,p),p};t.filter=s?(n,c)=>s(n,c)&&a(iG(n)):n=>a(iG(n))},Ist=t=>{let e=m0e(t),r=t.file,s=!0,a;try{let n=qI.statSync(r),c=t.maxReadSize||16*1024*1024;if(n.size{let r=new d0e(t),s=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((c,f)=>{r.on("error",f),r.on("end",c),qI.stat(a,(p,h)=>{if(p)f(p);else{let E=new mst.ReadStream(a,{readSize:s,size:h.size});E.on("error",f),E.pipe(r)}})});return e?n.then(e,e):n},m0e=t=>new d0e(t)});var v0e=_((p3t,B0e)=>{"use strict";var wst=DI(),ST=cT(),E0e=GI(),I0e=vT(),C0e=Ie("path");B0e.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let s=wst(t);if(s.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!s.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return s.file&&s.sync?Bst(s,e):s.file?vst(s,e,r):s.sync?Sst(s,e):Dst(s,e)};var Bst=(t,e)=>{let r=new ST.Sync(t),s=new E0e.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(s),w0e(r,e)},vst=(t,e,r)=>{let s=new ST(t),a=new E0e.WriteStream(t.file,{mode:t.mode||438});s.pipe(a);let n=new Promise((c,f)=>{a.on("error",f),a.on("close",c),s.on("error",f)});return sG(s,e),r?n.then(r,r):n},w0e=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?I0e({file:C0e.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:s=>t.add(s)}):t.add(r)}),t.end()},sG=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return I0e({file:C0e.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:s=>t.add(s)}).then(s=>sG(t,e));t.add(r)}t.end()},Sst=(t,e)=>{let r=new ST.Sync(t);return w0e(r,e),r},Dst=(t,e)=>{let r=new ST(t);return sG(r,e),r}});var oG=_((h3t,Q0e)=>{"use strict";var Pst=DI(),S0e=cT(),Zl=Ie("fs"),D0e=GI(),P0e=vT(),b0e=Ie("path"),x0e=TI();Q0e.exports=(t,e,r)=>{let s=Pst(t);if(!s.file)throw new TypeError("file is required");if(s.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),s.sync?bst(s,e):kst(s,e,r)};var bst=(t,e)=>{let r=new S0e.Sync(t),s=!0,a,n;try{try{a=Zl.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=Zl.openSync(t.file,"w+");else throw p}let c=Zl.fstatSync(a),f=Buffer.alloc(512);e:for(n=0;nc.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}s=!1,xst(t,r,n,a,e)}finally{if(s)try{Zl.closeSync(a)}catch{}}},xst=(t,e,r,s,a)=>{let n=new D0e.WriteStreamSync(t.file,{fd:s,start:r});e.pipe(n),Qst(e,a)},kst=(t,e,r)=>{e=Array.from(e);let s=new S0e(t),a=(c,f,p)=>{let h=(I,T)=>{I?Zl.close(c,N=>p(I)):p(null,T)},E=0;if(f===0)return h(null,0);let C=0,S=Buffer.alloc(512),b=(I,T)=>{if(I)return h(I);if(C+=T,C<512&&T)return Zl.read(c,S,C,S.length-C,E+C,b);if(E===0&&S[0]===31&&S[1]===139)return h(new Error("cannot append to compressed archives"));if(C<512)return h(null,E);let N=new x0e(S);if(!N.cksumValid)return h(null,E);let U=512*Math.ceil(N.size/512);if(E+U+512>f||(E+=U+512,E>=f))return h(null,E);t.mtimeCache&&t.mtimeCache.set(N.path,N.mtime),C=0,Zl.read(c,S,0,512,E,b)};Zl.read(c,S,0,512,E,b)},n=new Promise((c,f)=>{s.on("error",f);let p="r+",h=(E,C)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",Zl.open(t.file,p,h);if(E)return f(E);Zl.fstat(C,(S,b)=>{if(S)return Zl.close(C,()=>f(S));a(C,b.size,(I,T)=>{if(I)return f(I);let N=new D0e.WriteStream(t.file,{fd:C,start:T});s.pipe(N),N.on("error",f),N.on("close",c),k0e(s,e)})})};Zl.open(t.file,p,h)});return r?n.then(r,r):n},Qst=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?P0e({file:b0e.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:s=>t.add(s)}):t.add(r)}),t.end()},k0e=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return P0e({file:b0e.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:s=>t.add(s)}).then(s=>k0e(t,e));t.add(r)}t.end()}});var T0e=_((g3t,R0e)=>{"use strict";var Rst=DI(),Tst=oG();R0e.exports=(t,e,r)=>{let s=Rst(t);if(!s.file)throw new TypeError("file is required");if(s.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),Fst(s),Tst(s,e,r)};var Fst=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,s)=>e(r,s)&&!(t.mtimeCache.get(r)>s.mtime):(r,s)=>!(t.mtimeCache.get(r)>s.mtime)}});var O0e=_((d3t,N0e)=>{var{promisify:F0e}=Ie("util"),U0=Ie("fs"),Nst=t=>{if(!t)t={mode:511,fs:U0};else if(typeof t=="object")t={mode:511,fs:U0,...t};else if(typeof t=="number")t={mode:t,fs:U0};else if(typeof t=="string")t={mode:parseInt(t,8),fs:U0};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||U0.mkdir,t.mkdirAsync=F0e(t.mkdir),t.stat=t.stat||t.fs.stat||U0.stat,t.statAsync=F0e(t.stat),t.statSync=t.statSync||t.fs.statSync||U0.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||U0.mkdirSync,t};N0e.exports=Nst});var M0e=_((m3t,L0e)=>{var Ost=process.platform,{resolve:Lst,parse:Mst}=Ie("path"),Ust=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=Lst(t),Ost==="win32"){let e=/[*|"<>?:]/,{root:r}=Mst(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};L0e.exports=Ust});var G0e=_((y3t,j0e)=>{var{dirname:U0e}=Ie("path"),_0e=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(s=>s.isDirectory()?r:void 0,s=>s.code==="ENOENT"?_0e(t,U0e(e),e):void 0),H0e=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(s){return s.code==="ENOENT"?H0e(t,U0e(e),e):void 0}};j0e.exports={findMade:_0e,findMadeSync:H0e}});var cG=_((E3t,W0e)=>{var{dirname:q0e}=Ie("path"),aG=(t,e,r)=>{e.recursive=!1;let s=q0e(t);return s===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return aG(s,e).then(n=>aG(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},lG=(t,e,r)=>{let s=q0e(t);if(e.recursive=!1,s===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return lG(t,e,lG(s,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};W0e.exports={mkdirpManual:aG,mkdirpManualSync:lG}});var J0e=_((I3t,V0e)=>{var{dirname:Y0e}=Ie("path"),{findMade:_st,findMadeSync:Hst}=G0e(),{mkdirpManual:jst,mkdirpManualSync:Gst}=cG(),qst=(t,e)=>(e.recursive=!0,Y0e(t)===t?e.mkdirAsync(t,e):_st(e,t).then(s=>e.mkdirAsync(t,e).then(()=>s).catch(a=>{if(a.code==="ENOENT")return jst(t,e);throw a}))),Wst=(t,e)=>{if(e.recursive=!0,Y0e(t)===t)return e.mkdirSync(t,e);let s=Hst(e,t);try{return e.mkdirSync(t,e),s}catch(a){if(a.code==="ENOENT")return Gst(t,e);throw a}};V0e.exports={mkdirpNative:qst,mkdirpNativeSync:Wst}});var X0e=_((C3t,Z0e)=>{var K0e=Ie("fs"),Yst=process.version,uG=Yst.replace(/^v/,"").split("."),z0e=+uG[0]>10||+uG[0]==10&&+uG[1]>=12,Vst=z0e?t=>t.mkdir===K0e.mkdir:()=>!1,Jst=z0e?t=>t.mkdirSync===K0e.mkdirSync:()=>!1;Z0e.exports={useNative:Vst,useNativeSync:Jst}});var ige=_((w3t,nge)=>{var WI=O0e(),YI=M0e(),{mkdirpNative:$0e,mkdirpNativeSync:ege}=J0e(),{mkdirpManual:tge,mkdirpManualSync:rge}=cG(),{useNative:Kst,useNativeSync:zst}=X0e(),VI=(t,e)=>(t=YI(t),e=WI(e),Kst(e)?$0e(t,e):tge(t,e)),Zst=(t,e)=>(t=YI(t),e=WI(e),zst(e)?ege(t,e):rge(t,e));VI.sync=Zst;VI.native=(t,e)=>$0e(YI(t),WI(e));VI.manual=(t,e)=>tge(YI(t),WI(e));VI.nativeSync=(t,e)=>ege(YI(t),WI(e));VI.manualSync=(t,e)=>rge(YI(t),WI(e));nge.exports=VI});var fge=_((B3t,uge)=>{"use strict";var Uc=Ie("fs"),Cm=Ie("path"),Xst=Uc.lchown?"lchown":"chown",$st=Uc.lchownSync?"lchownSync":"chownSync",oge=Uc.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),sge=(t,e,r)=>{try{return Uc[$st](t,e,r)}catch(s){if(s.code!=="ENOENT")throw s}},eot=(t,e,r)=>{try{return Uc.chownSync(t,e,r)}catch(s){if(s.code!=="ENOENT")throw s}},tot=oge?(t,e,r,s)=>a=>{!a||a.code!=="EISDIR"?s(a):Uc.chown(t,e,r,s)}:(t,e,r,s)=>s,fG=oge?(t,e,r)=>{try{return sge(t,e,r)}catch(s){if(s.code!=="EISDIR")throw s;eot(t,e,r)}}:(t,e,r)=>sge(t,e,r),rot=process.version,age=(t,e,r)=>Uc.readdir(t,e,r),not=(t,e)=>Uc.readdirSync(t,e);/^v4\./.test(rot)&&(age=(t,e,r)=>Uc.readdir(t,r));var DT=(t,e,r,s)=>{Uc[Xst](t,e,r,tot(t,e,r,a=>{s(a&&a.code!=="ENOENT"?a:null)}))},lge=(t,e,r,s,a)=>{if(typeof e=="string")return Uc.lstat(Cm.resolve(t,e),(n,c)=>{if(n)return a(n.code!=="ENOENT"?n:null);c.name=e,lge(t,c,r,s,a)});if(e.isDirectory())AG(Cm.resolve(t,e.name),r,s,n=>{if(n)return a(n);let c=Cm.resolve(t,e.name);DT(c,r,s,a)});else{let n=Cm.resolve(t,e.name);DT(n,r,s,a)}},AG=(t,e,r,s)=>{age(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return s();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return s(a)}if(a||!n.length)return DT(t,e,r,s);let c=n.length,f=null,p=h=>{if(!f){if(h)return s(f=h);if(--c===0)return DT(t,e,r,s)}};n.forEach(h=>lge(t,h,e,r,p))})},iot=(t,e,r,s)=>{if(typeof e=="string")try{let a=Uc.lstatSync(Cm.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&cge(Cm.resolve(t,e.name),r,s),fG(Cm.resolve(t,e.name),r,s)},cge=(t,e,r)=>{let s;try{s=not(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return fG(t,e,r);throw a}return s&&s.length&&s.forEach(a=>iot(t,a,e,r)),fG(t,e,r)};uge.exports=AG;AG.sync=cge});var gge=_((v3t,pG)=>{"use strict";var Age=ige(),_c=Ie("fs"),PT=Ie("path"),pge=fge(),Vu=QI(),bT=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},xT=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},kT=(t,e)=>t.get(Vu(e)),Qv=(t,e,r)=>t.set(Vu(e),r),sot=(t,e)=>{_c.stat(t,(r,s)=>{(r||!s.isDirectory())&&(r=new xT(t,r&&r.code||"ENOTDIR")),e(r)})};pG.exports=(t,e,r)=>{t=Vu(t);let s=e.umask,a=e.mode|448,n=(a&s)!==0,c=e.uid,f=e.gid,p=typeof c=="number"&&typeof f=="number"&&(c!==e.processUid||f!==e.processGid),h=e.preserve,E=e.unlink,C=e.cache,S=Vu(e.cwd),b=(N,U)=>{N?r(N):(Qv(C,t,!0),U&&p?pge(U,c,f,W=>b(W)):n?_c.chmod(t,a,r):r())};if(C&&kT(C,t)===!0)return b();if(t===S)return sot(t,b);if(h)return Age(t,{mode:a}).then(N=>b(null,N),b);let T=Vu(PT.relative(S,t)).split("/");QT(S,T,a,C,E,S,null,b)};var QT=(t,e,r,s,a,n,c,f)=>{if(!e.length)return f(null,c);let p=e.shift(),h=Vu(PT.resolve(t+"/"+p));if(kT(s,h))return QT(h,e,r,s,a,n,c,f);_c.mkdir(h,r,hge(h,e,r,s,a,n,c,f))},hge=(t,e,r,s,a,n,c,f)=>p=>{p?_c.lstat(t,(h,E)=>{if(h)h.path=h.path&&Vu(h.path),f(h);else if(E.isDirectory())QT(t,e,r,s,a,n,c,f);else if(a)_c.unlink(t,C=>{if(C)return f(C);_c.mkdir(t,r,hge(t,e,r,s,a,n,c,f))});else{if(E.isSymbolicLink())return f(new bT(t,t+"/"+e.join("/")));f(p)}}):(c=c||t,QT(t,e,r,s,a,n,c,f))},oot=t=>{let e=!1,r="ENOTDIR";try{e=_c.statSync(t).isDirectory()}catch(s){r=s.code}finally{if(!e)throw new xT(t,r)}};pG.exports.sync=(t,e)=>{t=Vu(t);let r=e.umask,s=e.mode|448,a=(s&r)!==0,n=e.uid,c=e.gid,f=typeof n=="number"&&typeof c=="number"&&(n!==e.processUid||c!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,C=Vu(e.cwd),S=N=>{Qv(E,t,!0),N&&f&&pge.sync(N,n,c),a&&_c.chmodSync(t,s)};if(E&&kT(E,t)===!0)return S();if(t===C)return oot(C),S();if(p)return S(Age.sync(t,s));let I=Vu(PT.relative(C,t)).split("/"),T=null;for(let N=I.shift(),U=C;N&&(U+="/"+N);N=I.shift())if(U=Vu(PT.resolve(U)),!kT(E,U))try{_c.mkdirSync(U,s),T=T||U,Qv(E,U,!0)}catch{let ee=_c.lstatSync(U);if(ee.isDirectory()){Qv(E,U,!0);continue}else if(h){_c.unlinkSync(U),_c.mkdirSync(U,s),T=T||U,Qv(E,U,!0);continue}else if(ee.isSymbolicLink())return new bT(U,U+"/"+I.join("/"))}return S(T)}});var gG=_((S3t,dge)=>{var hG=Object.create(null),{hasOwnProperty:aot}=Object.prototype;dge.exports=t=>(aot.call(hG,t)||(hG[t]=t.normalize("NFKD")),hG[t])});var Ige=_((D3t,Ege)=>{var mge=Ie("assert"),lot=gG(),cot=FI(),{join:yge}=Ie("path"),uot=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,fot=uot==="win32";Ege.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((C,S)=>(C.length&&(S=yge(C[C.length-1],S)),C.push(S||"/"),C),[]),s=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(C=>t.get(C)),dirs:[...E.dirs].map(C=>t.get(C))}},n=h=>{let{paths:E,dirs:C}=a(h);return E.every(S=>S[0]===h)&&C.every(S=>S[0]instanceof Set&&S[0].has(h))},c=h=>s.has(h)||!n(h)?!1:(s.add(h),h(()=>f(h)),!0),f=h=>{if(!s.has(h))return!1;let{paths:E,dirs:C}=e.get(h),S=new Set;return E.forEach(b=>{let I=t.get(b);mge.equal(I[0],h),I.length===1?t.delete(b):(I.shift(),typeof I[0]=="function"?S.add(I[0]):I[0].forEach(T=>S.add(T)))}),C.forEach(b=>{let I=t.get(b);mge(I[0]instanceof Set),I[0].size===1&&I.length===1?t.delete(b):I[0].size===1?(I.shift(),S.add(I[0])):I[0].delete(h)}),s.delete(h),S.forEach(b=>c(b)),!0};return{check:n,reserve:(h,E)=>{h=fot?["win32 parallelization disabled"]:h.map(S=>lot(cot(yge(S))).toLowerCase());let C=new Set(h.map(S=>r(S)).reduce((S,b)=>S.concat(b)));return e.set(E,{dirs:C,paths:h}),h.forEach(S=>{let b=t.get(S);b?b.push(E):t.set(S,[E])}),C.forEach(S=>{let b=t.get(S);b?b[b.length-1]instanceof Set?b[b.length-1].add(E):b.push(new Set([E])):t.set(S,[new Set([E])])}),c(E)}}}});var Bge=_((P3t,wge)=>{var Aot=process.platform,pot=Aot==="win32",hot=global.__FAKE_TESTING_FS__||Ie("fs"),{O_CREAT:got,O_TRUNC:dot,O_WRONLY:mot,UV_FS_O_FILEMAP:Cge=0}=hot.constants,yot=pot&&!!Cge,Eot=512*1024,Iot=Cge|dot|got|mot;wge.exports=yot?t=>t"w"});var vG=_((b3t,Lge)=>{"use strict";var Cot=Ie("assert"),wot=BT(),Mn=Ie("fs"),Bot=GI(),Jp=Ie("path"),Fge=gge(),vge=v6(),vot=Ige(),Sot=S6(),Xl=QI(),Dot=FI(),Pot=gG(),Sge=Symbol("onEntry"),yG=Symbol("checkFs"),Dge=Symbol("checkFs2"),FT=Symbol("pruneCache"),EG=Symbol("isReusable"),Hc=Symbol("makeFs"),IG=Symbol("file"),CG=Symbol("directory"),NT=Symbol("link"),Pge=Symbol("symlink"),bge=Symbol("hardlink"),xge=Symbol("unsupported"),kge=Symbol("checkPath"),_0=Symbol("mkdir"),Zo=Symbol("onError"),RT=Symbol("pending"),Qge=Symbol("pend"),JI=Symbol("unpend"),dG=Symbol("ended"),mG=Symbol("maybeClose"),wG=Symbol("skip"),Rv=Symbol("doChown"),Tv=Symbol("uid"),Fv=Symbol("gid"),Nv=Symbol("checkedCwd"),Nge=Ie("crypto"),Oge=Bge(),bot=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,Ov=bot==="win32",xot=(t,e)=>{if(!Ov)return Mn.unlink(t,e);let r=t+".DELETE."+Nge.randomBytes(16).toString("hex");Mn.rename(t,r,s=>{if(s)return e(s);Mn.unlink(r,e)})},kot=t=>{if(!Ov)return Mn.unlinkSync(t);let e=t+".DELETE."+Nge.randomBytes(16).toString("hex");Mn.renameSync(t,e),Mn.unlinkSync(e)},Rge=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Tge=t=>Pot(Dot(Xl(t))).toLowerCase(),Qot=(t,e)=>{e=Tge(e);for(let r of t.keys()){let s=Tge(r);(s===e||s.indexOf(e+"/")===0)&&t.delete(r)}},Rot=t=>{for(let e of t.keys())t.delete(e)},Lv=class extends wot{constructor(e){if(e||(e={}),e.ondone=r=>{this[dG]=!0,this[mG]()},super(e),this[Nv]=!1,this.reservations=vot(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[RT]=0,this[dG]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||Ov,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Xl(Jp.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[Sge](r))}warn(e,r,s={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(s.recoverable=!1),super.warn(e,r,s)}[mG](){this[dG]&&this[RT]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[kge](e){if(this.strip){let r=Xl(e.path).split("/");if(r.length=this.strip)e.linkpath=s.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=Xl(e.path),s=r.split("/");if(s.includes("..")||Ov&&/^[a-z]:\.\.$/i.test(s[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=Sot(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Jp.isAbsolute(e.path)?e.absolute=Xl(Jp.resolve(e.path)):e.absolute=Xl(Jp.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:Xl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Jp.win32.parse(e.absolute);e.absolute=r+vge.encode(e.absolute.substr(r.length));let{root:s}=Jp.win32.parse(e.path);e.path=s+vge.encode(e.path.substr(s.length))}return!0}[Sge](e){if(!this[kge](e))return e.resume();switch(Cot.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[yG](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[xge](e)}}[Zo](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[JI](),r.resume())}[_0](e,r,s){Fge(Xl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},s)}[Rv](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[Tv](e){return Rge(this.uid,e.uid,this.processUid)}[Fv](e){return Rge(this.gid,e.gid,this.processGid)}[IG](e,r){let s=e.mode&4095||this.fmode,a=new Bot.WriteStream(e.absolute,{flags:Oge(e.size),mode:s,autoClose:!1});a.on("error",p=>{a.fd&&Mn.close(a.fd,()=>{}),a.write=()=>!0,this[Zo](p,e),r()});let n=1,c=p=>{if(p){a.fd&&Mn.close(a.fd,()=>{}),this[Zo](p,e),r();return}--n===0&&Mn.close(a.fd,h=>{h?this[Zo](h,e):this[JI](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let C=e.atime||new Date,S=e.mtime;Mn.futimes(E,C,S,b=>b?Mn.utimes(h,C,S,I=>c(I&&b)):c())}if(this[Rv](e)){n++;let C=this[Tv](e),S=this[Fv](e);Mn.fchown(E,C,S,b=>b?Mn.chown(h,C,S,I=>c(I&&b)):c())}c()});let f=this.transform&&this.transform(e)||e;f!==e&&(f.on("error",p=>{this[Zo](p,e),r()}),e.pipe(f)),f.pipe(a)}[CG](e,r){let s=e.mode&4095||this.dmode;this[_0](e.absolute,s,a=>{if(a){this[Zo](a,e),r();return}let n=1,c=f=>{--n===0&&(r(),this[JI](),e.resume())};e.mtime&&!this.noMtime&&(n++,Mn.utimes(e.absolute,e.atime||new Date,e.mtime,c)),this[Rv](e)&&(n++,Mn.chown(e.absolute,this[Tv](e),this[Fv](e),c)),c()})}[xge](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[Pge](e,r){this[NT](e,e.linkpath,"symlink",r)}[bge](e,r){let s=Xl(Jp.resolve(this.cwd,e.linkpath));this[NT](e,s,"link",r)}[Qge](){this[RT]++}[JI](){this[RT]--,this[mG]()}[wG](e){this[JI](),e.resume()}[EG](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!Ov}[yG](e){this[Qge]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,s=>this[Dge](e,s))}[FT](e){e.type==="SymbolicLink"?Rot(this.dirCache):e.type!=="Directory"&&Qot(this.dirCache,e.absolute)}[Dge](e,r){this[FT](e);let s=f=>{this[FT](e),r(f)},a=()=>{this[_0](this.cwd,this.dmode,f=>{if(f){this[Zo](f,e),s();return}this[Nv]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let f=Xl(Jp.dirname(e.absolute));if(f!==this.cwd)return this[_0](f,this.dmode,p=>{if(p){this[Zo](p,e),s();return}c()})}c()},c=()=>{Mn.lstat(e.absolute,(f,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[wG](e),s();return}if(f||this[EG](e,p))return this[Hc](null,e,s);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=C=>this[Hc](C,e,s);return h?Mn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return Mn.rmdir(e.absolute,h=>this[Hc](h,e,s))}if(e.absolute===this.cwd)return this[Hc](null,e,s);xot(e.absolute,h=>this[Hc](h,e,s))})};this[Nv]?n():a()}[Hc](e,r,s){if(e){this[Zo](e,r),s();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[IG](r,s);case"Link":return this[bge](r,s);case"SymbolicLink":return this[Pge](r,s);case"Directory":case"GNUDumpDir":return this[CG](r,s)}}[NT](e,r,s,a){Mn[s](r,e.absolute,n=>{n?this[Zo](n,e):(this[JI](),e.resume()),a()})}},TT=t=>{try{return[null,t()]}catch(e){return[e,null]}},BG=class extends Lv{[Hc](e,r){return super[Hc](e,r,()=>{})}[yG](e){if(this[FT](e),!this[Nv]){let n=this[_0](this.cwd,this.dmode);if(n)return this[Zo](n,e);this[Nv]=!0}if(e.absolute!==this.cwd){let n=Xl(Jp.dirname(e.absolute));if(n!==this.cwd){let c=this[_0](n,this.dmode);if(c)return this[Zo](c,e)}}let[r,s]=TT(()=>Mn.lstatSync(e.absolute));if(s&&(this.keep||this.newer&&s.mtime>e.mtime))return this[wG](e);if(r||this[EG](e,s))return this[Hc](null,e);if(s.isDirectory()){if(e.type==="Directory"){let c=!this.noChmod&&e.mode&&(s.mode&4095)!==e.mode,[f]=c?TT(()=>{Mn.chmodSync(e.absolute,e.mode)}):[];return this[Hc](f,e)}let[n]=TT(()=>Mn.rmdirSync(e.absolute));this[Hc](n,e)}let[a]=e.absolute===this.cwd?[]:TT(()=>kot(e.absolute));this[Hc](a,e)}[IG](e,r){let s=e.mode&4095||this.fmode,a=f=>{let p;try{Mn.closeSync(n)}catch(h){p=h}(f||p)&&this[Zo](f||p,e),r()},n;try{n=Mn.openSync(e.absolute,Oge(e.size),s)}catch(f){return a(f)}let c=this.transform&&this.transform(e)||e;c!==e&&(c.on("error",f=>this[Zo](f,e)),e.pipe(c)),c.on("data",f=>{try{Mn.writeSync(n,f,0,f.length)}catch(p){a(p)}}),c.on("end",f=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{Mn.futimesSync(n,h,E)}catch(C){try{Mn.utimesSync(e.absolute,h,E)}catch{p=C}}}if(this[Rv](e)){let h=this[Tv](e),E=this[Fv](e);try{Mn.fchownSync(n,h,E)}catch(C){try{Mn.chownSync(e.absolute,h,E)}catch{p=p||C}}}a(p)})}[CG](e,r){let s=e.mode&4095||this.dmode,a=this[_0](e.absolute,s);if(a){this[Zo](a,e),r();return}if(e.mtime&&!this.noMtime)try{Mn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[Rv](e))try{Mn.chownSync(e.absolute,this[Tv](e),this[Fv](e))}catch{}r(),e.resume()}[_0](e,r){try{return Fge.sync(Xl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(s){return s}}[NT](e,r,s,a){try{Mn[s+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[Zo](n,e)}}};Lv.Sync=BG;Lge.exports=Lv});var jge=_((x3t,Hge)=>{"use strict";var Tot=DI(),OT=vG(),Uge=Ie("fs"),_ge=GI(),Mge=Ie("path"),SG=FI();Hge.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let s=Tot(t);if(s.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!s.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Fot(s,e),s.file&&s.sync?Not(s):s.file?Oot(s,r):s.sync?Lot(s):Mot(s)};var Fot=(t,e)=>{let r=new Map(e.map(n=>[SG(n),!0])),s=t.filter,a=(n,c)=>{let f=c||Mge.parse(n).root||".",p=n===f?!1:r.has(n)?r.get(n):a(Mge.dirname(n),f);return r.set(n,p),p};t.filter=s?(n,c)=>s(n,c)&&a(SG(n)):n=>a(SG(n))},Not=t=>{let e=new OT.Sync(t),r=t.file,s=Uge.statSync(r),a=t.maxReadSize||16*1024*1024;new _ge.ReadStreamSync(r,{readSize:a,size:s.size}).pipe(e)},Oot=(t,e)=>{let r=new OT(t),s=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((c,f)=>{r.on("error",f),r.on("close",c),Uge.stat(a,(p,h)=>{if(p)f(p);else{let E=new _ge.ReadStream(a,{readSize:s,size:h.size});E.on("error",f),E.pipe(r)}})});return e?n.then(e,e):n},Lot=t=>new OT.Sync(t),Mot=t=>new OT(t)});var Gge=_(bs=>{"use strict";bs.c=bs.create=v0e();bs.r=bs.replace=oG();bs.t=bs.list=vT();bs.u=bs.update=T0e();bs.x=bs.extract=jge();bs.Pack=cT();bs.Unpack=vG();bs.Parse=BT();bs.ReadEntry=YR();bs.WriteEntry=N6();bs.Header=TI();bs.Pax=JR();bs.types=m6()});var DG,qge,H0,Mv,Uv,Wge=Ze(()=>{DG=ut(Ld()),qge=Ie("worker_threads"),H0=Symbol("kTaskInfo"),Mv=class{constructor(e,r){this.fn=e;this.limit=(0,DG.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},Uv=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,DG.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let s=this.workers.pop();s?s.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new qge.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[H0])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[H0].resolve(r),e[H0]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{e[H0]?.reject(r),e[H0]=null}),e.on("exit",r=>{r!==0&&e[H0]?.reject(new Error(`Worker exited with code ${r}`)),e[H0]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((s,a)=>{r[H0]={resolve:s,reject:a},r.postMessage(e)})})}}});var Vge=_((T3t,Yge)=>{var PG;Yge.exports.getContent=()=>(typeof PG>"u"&&(PG=Ie("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),PG)});var ps={};Vt(ps,{convertToZip:()=>jot,convertToZipWorker:()=>kG,extractArchiveTo:()=>Xge,getDefaultTaskPool:()=>zge,getTaskPoolForConfiguration:()=>Zge,makeArchiveFromDirectory:()=>Hot});function Uot(t,e){switch(t){case"async":return new Mv(kG,{poolSize:e});case"workers":return new Uv((0,xG.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function zge(){return typeof bG>"u"&&(bG=Uot("workers",fs.availableParallelism())),bG}function Zge(t){return typeof t>"u"?zge():Yl(_ot,t,()=>{let e=t.get("taskPoolMode"),r=t.get("taskPoolConcurrency");switch(e){case"async":return new Mv(kG,{poolSize:r});case"workers":return new Uv((0,xG.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function kG(t){let{tmpFile:e,tgz:r,compressionLevel:s,extractBufferOpts:a}=t,n=new As(e,{create:!0,level:s,stats:$a.makeDefaultStats()}),c=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await Xge(c,n,a),n.saveAndClose(),e}async function Hot(t,{baseFs:e=new Yn,prefixPath:r=vt.root,compressionLevel:s,inMemory:a=!1}={}){let n;if(a)n=new As(null,{level:s});else{let f=await ce.mktempPromise(),p=J.join(f,"archive.zip");n=new As(p,{create:!0,level:s})}let c=J.resolve(vt.root,r);return await n.copyPromise(c,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function jot(t,e={}){let r=await ce.mktempPromise(),s=J.join(r,"archive.zip"),a=e.compressionLevel??e.configuration?.get("compressionLevel")??"mixed",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??Zge(e.configuration)).run({tmpFile:s,tgz:t,compressionLevel:a,extractBufferOpts:n}),new As(s,{level:e.compressionLevel})}async function*Got(t){let e=new Kge.default.Parse,r=new Jge.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",s=>{r.write(s)}),e.on("error",s=>{r.destroy(s)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let s of r){let a=s;yield a,a.resume()}}async function Xge(t,e,{stripComponents:r=0,prefixPath:s=vt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let c=n.path.split(/\//g);return!!(c.some(f=>f==="..")||c.length<=r)}for await(let n of Got(t)){if(a(n))continue;let c=J.normalize(fe.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(c.length<=r)continue;let f=c.slice(r).join("/"),p=J.join(s,f),h=420;switch((n.type==="Directory"||(n.mode??0)&73)&&(h|=73),n.type){case"Directory":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.writeFileSync(p,await WE(n),{mode:h}),e.utimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(J.dirname(p),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,fi.SAFE_TIME,fi.SAFE_TIME);break}}return e}var Jge,Kge,xG,bG,_ot,$ge=Ze(()=>{Ge();Dt();eA();Jge=Ie("stream"),Kge=ut(Gge());Wge();bc();xG=ut(Vge());_ot=new WeakMap});var tde=_((QG,ede)=>{(function(t,e){typeof QG=="object"?ede.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(QG,function(){function t(a,n){var c=n?"\u2514":"\u251C";return a?c+="\u2500 ":c+="\u2500\u2500\u2510",c}function e(a,n){var c=[];for(var f in a)a.hasOwnProperty(f)&&(n&&typeof a[f]=="function"||c.push(f));return c}function r(a,n,c,f,p,h,E){var C="",S=0,b,I,T=f.slice(0);if(T.push([n,c])&&f.length>0&&(f.forEach(function(U,W){W>0&&(C+=(U[1]?" ":"\u2502")+" "),!I&&U[0]===n&&(I=!0)}),C+=t(a,c)+a,p&&(typeof n!="object"||n instanceof Date)&&(C+=": "+n),I&&(C+=" (circular ref.)"),E(C)),!I&&typeof n=="object"){var N=e(n,h);N.forEach(function(U){b=++S===N.length,r(U,n[U],b,T,p,h,E)})}}var s={};return s.asLines=function(a,n,c,f){var p=typeof c!="function"?c:!1;r(".",a,!1,[],n,p,f||c)},s.asTree=function(a,n,c){var f="";return r(".",a,!1,[],n,c,function(p){f+=p+` `}),f},s})});var xs={};Vt(xs,{emitList:()=>qot,emitTree:()=>sde,treeNodeToJson:()=>ide,treeNodeToTreeify:()=>nde});function nde(t,{configuration:e}){let r={},s=0,a=(n,c)=>{let f=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of f){if(!h)continue;let{label:E,value:C,children:S}=h,b=[];typeof E<"u"&&b.push(zd(e,E,2)),typeof C<"u"&&b.push(Ht(e,C[0],C[1])),b.length===0&&b.push(zd(e,`${p}`,2));let I=b.join(": ").trim(),T=`\0${s++}\0`,N=c[`${T}${I}`]={};typeof S<"u"&&a(S,N)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return a(t.children,r),r}function ide(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Zd(r.value[0],r.value[1])}let s=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,c]of s)c&&(a[Wot(n)]=e(c));return typeof r.value>"u"?a:{value:Zd(r.value[0],r.value[1]),children:a}};return e(t)}function qot(t,{configuration:e,stdout:r,json:s}){let a=t.map(n=>({value:n}));sde({children:a},{configuration:e,stdout:r,json:s})}function sde(t,{configuration:e,stdout:r,json:s,separators:a=0}){if(s){let c=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let f of c)f&&r.write(`${JSON.stringify(ide(f))} `);return}let n=(0,rde.asTree)(nde(t,{configuration:e}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 $1`).replace(/^│\n/,"")),a>=2)for(let c=0;c<2;++c)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 $2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function Wot(t){return typeof t=="string"?t.replace(/^\0[0-9]+\0/,""):t}var rde,ode=Ze(()=>{rde=ut(tde());xc()});var LT,ade=Ze(()=>{LT=class{constructor(e){this.releaseFunction=e;this.map=new Map}addOrCreate(e,r){let s=this.map.get(e);if(typeof s<"u"){if(s.refCount<=0)throw new Error(`Race condition in RefCountedMap. While adding a new key the refCount is: ${s.refCount} for ${JSON.stringify(e)}`);return s.refCount++,{value:s.value,release:()=>this.release(e)}}else{let a=r();return this.map.set(e,{refCount:1,value:a}),{value:a,release:()=>this.release(e)}}}release(e){let r=this.map.get(e);if(!r)throw new Error(`Unbalanced calls to release. No known instances of: ${JSON.stringify(e)}`);let s=r.refCount;if(s<=0)throw new Error(`Unbalanced calls to release. Too many release vs alloc refcount would become: ${s-1} of ${JSON.stringify(e)}`);s==1?(this.map.delete(e),this.releaseFunction(r.value)):r.refCount--}}});function _v(t){let e=t.match(Yot);if(!e?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var lde,RG,TG,MT,Kr,Yot,FG=Ze(()=>{Ge();Dt();Dt();eA();lde=Ie("crypto"),RG=ut(Ie("fs"));ade();Rc();I0();bc();Wo();TG=YE(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),MT=YE(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Kr=class t{constructor(e,{configuration:r,immutable:s=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.refCountedZipFsCache=new LT(e=>{e.discardAndClose()});this.cacheId=`-${(0,lde.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=s,this.check=a;let{cacheSpec:n,cacheKey:c}=t.getCacheKey(r);this.cacheSpec=n,this.cacheKey=c}static async find(e,{immutable:r,check:s}={}){let a=new t(e.get("cacheFolder"),{configuration:e,immutable:r,check:s});return await a.setup(),a}static getCacheKey(e){let r=e.get("compressionLevel"),s=r!=="mixed"?`c${r}`:"";return{cacheKey:[MT,s].join(""),cacheSpec:s}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${nI(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=_v(r).hash.slice(0,10);return`${nI(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:s}=_v(e);if(r===null||r{let pe=new As,Be=J.join(vt.root,P8(e));return pe.mkdirSync(Be,{recursive:!0}),pe.writeJsonSync(J.join(Be,Er.manifest),{name:un(e),mocked:!0}),pe},E=async(pe,{isColdHit:Be,controlPath:Ce=null})=>{if(Ce===null&&c.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!Be?_v(r).cacheKey:this.cacheKey,we=!c.skipIntegrityCheck||!r?`${g}/${await vQ(pe)}`:r;if(Ce!==null){let Ae=!c.skipIntegrityCheck||!r?`${this.cacheKey}/${await vQ(Ce)}`:r;if(we!==Ae)throw new jt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let ye=null;switch(r!==null&&we!==r&&(this.check?ye="throw":_v(r).cacheKey!==_v(we).cacheKey?ye="update":ye=this.configuration.get("checksumBehavior")),ye){case null:case"update":return{isValid:!0,hash:we};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new jt(18,"The remote archive doesn't match the expected checksum")}},C=async pe=>{if(!n)throw new Error(`Cache check required but no loader configured for ${Yr(this.configuration,e)}`);let Be=await n(),Ce=Be.getRealPath();Be.saveAndClose(),await ce.chmodPromise(Ce,420);let g=await E(pe,{controlPath:Ce,isColdHit:!1});if(!g.isValid)throw new Error("Assertion failed: Expected a valid checksum");return g.hash},S=async()=>{if(f===null||!await ce.existsPromise(f)){let pe=await n(),Be=pe.getRealPath();return pe.saveAndClose(),{source:"loader",path:Be}}return{source:"mirror",path:f}},b=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${Yr(this.configuration,e)}`);if(this.immutable)throw new jt(56,`Cache entry required but missing for ${Yr(this.configuration,e)}`);let{path:pe,source:Be}=await S(),{hash:Ce}=await E(pe,{isColdHit:!0}),g=this.getLocatorPath(e,Ce),we=[];Be!=="mirror"&&f!==null&&we.push(async()=>{let Ae=`${f}${this.cacheId}`;await ce.copyFilePromise(pe,Ae,RG.default.constants.COPYFILE_FICLONE),await ce.chmodPromise(Ae,420),await ce.renamePromise(Ae,f)}),(!c.mirrorWriteOnly||f===null)&&we.push(async()=>{let Ae=`${g}${this.cacheId}`;await ce.copyFilePromise(pe,Ae,RG.default.constants.COPYFILE_FICLONE),await ce.chmodPromise(Ae,420),await ce.renamePromise(Ae,g)});let ye=c.mirrorWriteOnly?f??g:g;return await Promise.all(we.map(Ae=>Ae())),[!1,ye,Ce]},I=async()=>{let Be=(async()=>{let Ce=c.unstablePackages?.has(e.locatorHash),g=Ce||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,we=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,ye=!!c.mockedPackages?.has(e.locatorHash)&&(!this.check||!we),Ae=ye||we,se=Ae?s:a;if(se&&se(),Ae){let X=null,De=g;if(!ye)if(this.check)X=await C(De);else{let Te=await E(De,{isColdHit:!1});if(Te.isValid)X=Te.hash;else return b()}return[ye,De,X]}else{if(this.immutable&&Ce)throw new jt(56,`Cache entry required but missing for ${Yr(this.configuration,e)}; consider defining ${he.pretty(this.configuration,"supportedArchitectures",he.Type.CODE)} to cache packages for multiple systems`);return b()}})();this.mutexes.set(e.locatorHash,Be);try{return await Be}finally{this.mutexes.delete(e.locatorHash)}};for(let pe;pe=this.mutexes.get(e.locatorHash);)await pe;let[T,N,U]=await I();T||this.markedFiles.add(N);let W=()=>this.refCountedZipFsCache.addOrCreate(N,()=>T?h():new As(N,{baseFs:p,readOnly:!0})),ee,ie=new oE(()=>G4(()=>(ee=W(),ee.value),pe=>`Failed to open the cache entry for ${Yr(this.configuration,e)}: ${pe}`),J),ue=new _f(N,{baseFs:ie,pathUtils:J}),le=()=>{ee?.release()},me=c.unstablePackages?.has(e.locatorHash)?null:U;return[ue,le,me]}},Yot=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var UT,cde=Ze(()=>{UT=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(UT||{})});var Vot,KI,NG=Ze(()=>{Dt();wc();Tp();Wo();Vot=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,s)=>`${r}#commit=${s}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",s,a)=>`https://${r}github.com/${s}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>xQ({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],KI=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let s=J.join(e.cwd,Er.lockfile);if(!ce.existsSync(s))return;let a=await ce.readFilePromise(s,"utf8"),n=as(a);if(Object.hasOwn(n,"__metadata"))return;let c=this.resolutions=new Map;for(let f of Object.keys(n)){let p=HB(f);if(!p){r.reportWarning(14,`Failed to parse the string "${f}" into a proper descriptor`);continue}let h=cl(p.range)?On(p,`npm:${p.range}`):p,{version:E,resolved:C}=n[f];if(!C)continue;let S;for(let[I,T]of Vot){let N=C.match(I);if(N){S=T(E,...N);break}}if(!S){r.reportWarning(14,`${ni(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${C}")`);continue}let b=h;try{let I=em(h.range),T=HB(I.selector,!0);T&&(b=T)}catch{}c.set(h.descriptorHash,Ws(b,S))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=B8(a),c=s.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(c,r,s)}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var lA,ude=Ze(()=>{Rc();Ev();xc();lA=class extends Ao{constructor({configuration:r,stdout:s,suggestInstall:a=!0}){super();this.errorCount=0;TB(this,{configuration:r}),this.configuration=r,this.stdout=s,this.suggestInstall=a}static async start(r,s){let a=new this(r);try{await s(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,s){return s()}async startSectionPromise(r,s){return await s()}startTimerSync(r,s,a){return(typeof s=="function"?s:a)()}async startTimerPromise(r,s,a){return await(typeof s=="function"?s:a)()}reportSeparator(){}reportInfo(r,s){}reportWarning(r,s){}reportError(r,s){this.errorCount+=1,this.stdout.write(`${Ht(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${s} `)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,s){}async finalize(){this.errorCount>0&&(this.stdout.write(` `),this.stdout.write(`${Ht(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. `),this.suggestInstall&&this.stdout.write(`${Ht(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. `))}formatNameWithHyperlink(r){return jj(r,{configuration:this.configuration,json:!1})}}});var zI,OG=Ze(()=>{Wo();zI=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(DQ(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,s){let a=s.project.storedResolutions.get(e.descriptorHash);if(a){let c=s.project.originalPackages.get(a);if(c)return[c]}let n=s.project.originalPackages.get(DQ(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let s=r.project.originalPackages.get(e.locatorHash);if(!s)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return s}}});function Kp(){}function Jot(t,e,r,s,a){for(var n=0,c=e.length,f=0,p=0;nb.length?T:b}),h.value=t.join(E)}else h.value=t.join(r.slice(f,f+h.count));f+=h.count,h.added||(p+=h.count)}}var S=e[c-1];return c>1&&typeof S.value=="string"&&(S.added||S.removed)&&t.equals("",S.value)&&(e[c-2].value+=S.value,e.pop()),e}function Kot(t){return{newPos:t.newPos,components:t.components.slice(0)}}function zot(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function pde(t,e,r){return r=zot(r,{ignoreWhitespace:!0}),HG.diff(t,e,r)}function Zot(t,e,r){return jG.diff(t,e,r)}function _T(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?_T=function(e){return typeof e}:_T=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},_T(t)}function LG(t){return eat(t)||tat(t)||rat(t)||nat()}function eat(t){if(Array.isArray(t))return MG(t)}function tat(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function rat(t,e){if(t){if(typeof t=="string")return MG(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return MG(t,e)}}function MG(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,s=new Array(e);r"u"&&(c.context=4);var f=Zot(r,s,c);if(!f)return;f.push({value:"",lines:[]});function p(U){return U.map(function(W){return" "+W})}for(var h=[],E=0,C=0,S=[],b=1,I=1,T=function(W){var ee=f[W],ie=ee.lines||ee.value.replace(/\n$/,"").split(` `);if(ee.lines=ie,ee.added||ee.removed){var ue;if(!E){var le=f[W-1];E=b,C=I,le&&(S=c.context>0?p(le.lines.slice(-c.context)):[],E-=S.length,C-=S.length)}(ue=S).push.apply(ue,LG(ie.map(function(Ae){return(ee.added?"+":"-")+Ae}))),ee.added?I+=ie.length:b+=ie.length}else{if(E)if(ie.length<=c.context*2&&W=f.length-2&&ie.length<=c.context){var g=/\n$/.test(r),we=/\n$/.test(s),ye=ie.length==0&&S.length>Ce.oldLines;!g&&ye&&r.length>0&&S.splice(Ce.oldLines,0,"\\ No newline at end of file"),(!g&&!ye||!we)&&S.push("\\ No newline at end of file")}h.push(Ce),E=0,C=0,S=[]}b+=ie.length,I+=ie.length}},N=0;N{Kp.prototype={diff:function(e,r){var s=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=s.callback;typeof s=="function"&&(a=s,s={}),this.options=s;var n=this;function c(T){return a?(setTimeout(function(){a(void 0,T)},0),!0):T}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var f=r.length,p=e.length,h=1,E=f+p;s.maxEditLength&&(E=Math.min(E,s.maxEditLength));var C=[{newPos:-1,components:[]}],S=this.extractCommon(C[0],r,e,0);if(C[0].newPos+1>=f&&S+1>=p)return c([{value:this.join(r),count:r.length}]);function b(){for(var T=-1*h;T<=h;T+=2){var N=void 0,U=C[T-1],W=C[T+1],ee=(W?W.newPos:0)-T;U&&(C[T-1]=void 0);var ie=U&&U.newPos+1=f&&ee+1>=p)return c(Jot(n,N.components,r,e,n.useLongestToken));C[T]=N}h++}if(a)(function T(){setTimeout(function(){if(h>E)return a();b()||T()},0)})();else for(;h<=E;){var I=b();if(I)return I}},pushComponent:function(e,r,s){var a=e[e.length-1];a&&a.added===r&&a.removed===s?e[e.length-1]={count:a.count+1,added:r,removed:s}:e.push({count:1,added:r,removed:s})},extractCommon:function(e,r,s,a){for(var n=r.length,c=s.length,f=e.newPos,p=f-a,h=0;f+1"u"?r:c}:s;return typeof t=="string"?t:JSON.stringify(UG(t,null,null,a),a," ")};Hv.equals=function(t,e){return Kp.prototype.equals.call(Hv,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};_G=new Kp;_G.tokenize=function(t){return t.slice()};_G.join=_G.removeEmpty=function(t){return t}});var HT,gde=Ze(()=>{Rc();HT=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,s){return this.resolver.bindDescriptor(e,r,s)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,s){throw new jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,s,a){throw new jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var ki,qG=Ze(()=>{Rc();ki=class extends Ao{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,s){return(typeof r=="function"?r:s)()}async startTimerPromise(e,r,s){return await(typeof r=="function"?r:s)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var dde,ZI,WG=Ze(()=>{Dt();dde=ut(wQ());oI();tm();xc();I0();Tp();Wo();ZI=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Ut.tryFind(this.cwd)??new Ut,this.relativeCwd=J.relative(this.project.cwd,this.cwd)||vt.dot;let e=this.manifest.name?this.manifest.name:Da(null,`${this.computeCandidateName()}-${cs(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=On(e,`${Ei.protocol}${this.relativeCwd}`),this.anchoredLocator=Ws(e,`${Ei.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let s=await(0,dde.default)(r,{cwd:fe.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});s.sort(),await s.reduce(async(a,n)=>{let c=J.resolve(this.cwd,fe.toPortablePath(n)),f=await ce.existsPromise(J.join(c,"package.json"));await a,f&&this.workspacesCwds.add(c)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${GB(this.project.configuration,this)} (${Ht(this.project.configuration,J.join(this.cwd,Er.manifest),ht.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),s=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(s===Ei.protocol&&J.normalize(a)===this.relativeCwd||s===Ei.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=cl(a);return n?s===Ei.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${J.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Ut.hardDependencies}={}){let r=new Set,s=a=>{for(let n of e)for(let c of a.manifest[n].values()){let f=this.project.tryWorkspaceByDescriptor(c);f===null||r.has(f)||(r.add(f),s(f))}};return s(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ut.hardDependencies}={}){let r=new Set,s=a=>{for(let n of this.project.workspaces)e.some(f=>[...n.manifest[f].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&_B(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),s(n))};return s(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let s of r.workspacesCwds){let a=this.project.workspacesByCwd.get(s);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=J.join(this.cwd,Ut.fileName),s=`${JSON.stringify(e,null,this.manifest.indent)} `;await ce.changeFilePromise(r,s,{automaticNewlines:!0}),this.manifest.raw=e}}});function uat({project:t,allDescriptors:e,allResolutions:r,allPackages:s,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:c=new Map,peerWarnings:f=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,C=[],S=new Map,b=new Map,I=new Map,T=new Map,N=new Map,U=new Map(t.workspaces.map(le=>{let me=le.anchoredLocator.locatorHash,pe=s.get(me);if(typeof pe>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[me,LB(pe)]})),W=()=>{let le=ce.mktempSync(),me=J.join(le,"stacktrace.log"),pe=String(C.length+1).length,Be=C.map((Ce,g)=>`${`${g+1}.`.padStart(pe," ")} ${ll(Ce)} `).join("");throw ce.writeFileSync(me,Be),ce.detachTemp(le),new jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${fe.fromPortablePath(me)}`)},ee=le=>{let me=r.get(le.descriptorHash);if(typeof me>"u")throw new Error("Assertion failed: The resolution should have been registered");let pe=s.get(me);if(!pe)throw new Error("Assertion failed: The package could not be found");return pe},ie=(le,me,pe,{top:Be,optional:Ce})=>{C.length>1e3&&W(),C.push(me);let g=ue(le,me,pe,{top:Be,optional:Ce});return C.pop(),g},ue=(le,me,pe,{top:Be,optional:Ce})=>{if(Ce||n.delete(me.locatorHash),a.has(me.locatorHash))return;a.add(me.locatorHash);let g=s.get(me.locatorHash);if(!g)throw new Error(`Assertion failed: The package (${Yr(t.configuration,me)}) should have been registered`);let we=new Set,ye=new Map,Ae=[],se=[],X=[],De=[];for(let Te of Array.from(g.dependencies.values())){if(g.peerDependencies.has(Te.identHash)&&g.locatorHash!==Be)continue;if(kp(Te))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");h.delete(Te.descriptorHash);let mt=Ce;if(!mt){let ke=g.dependenciesMeta.get(un(Te));if(typeof ke<"u"){let it=ke.get(null);typeof it<"u"&&it.optional&&(mt=!0)}}let j=r.get(Te.descriptorHash);if(!j)throw new Error(`Assertion failed: The resolution (${ni(t.configuration,Te)}) should have been registered`);let rt=U.get(j)||s.get(j);if(!rt)throw new Error(`Assertion failed: The package (${j}, resolved from ${ni(t.configuration,Te)}) should have been registered`);if(rt.peerDependencies.size===0){ie(Te,rt,new Map,{top:Be,optional:mt});continue}let Fe,Ne,be=new Set,Ve=new Map;Ae.push(()=>{Fe=S8(Te,me.locatorHash),Ne=D8(rt,me.locatorHash),g.dependencies.set(Te.identHash,Fe),r.set(Fe.descriptorHash,Ne.locatorHash),e.set(Fe.descriptorHash,Fe),s.set(Ne.locatorHash,Ne),Pp(T,Ne.locatorHash).add(Fe.descriptorHash),we.add(Ne.locatorHash)}),se.push(()=>{N.set(Ne.locatorHash,Ve);for(let ke of Ne.peerDependencies.values()){let Ue=Yl(ye,ke.identHash,()=>{let x=pe.get(ke.identHash)??null,w=g.dependencies.get(ke.identHash);return!w&&UB(me,ke)&&(le.identHash===me.identHash?w=le:(w=On(me,le.range),e.set(w.descriptorHash,w),r.set(w.descriptorHash,me.locatorHash),h.delete(w.descriptorHash),x=null)),w||(w=On(ke,"missing:")),{subject:me,ident:ke,provided:w,root:!x,requests:new Map,hash:`p${cs(me.locatorHash,ke.identHash).slice(0,6)}`}}).provided;if(Ue.range==="missing:"&&Ne.dependencies.has(ke.identHash)){Ne.peerDependencies.delete(ke.identHash);continue}if(Ve.set(ke.identHash,{requester:Ne,descriptor:ke,meta:Ne.peerDependenciesMeta.get(un(ke)),children:new Map}),Ne.dependencies.set(ke.identHash,Ue),kp(Ue)){let x=r.get(Ue.descriptorHash);Pp(I,x).add(Ne.locatorHash)}S.set(Ue.identHash,Ue),Ue.range==="missing:"&&be.add(Ue.identHash)}Ne.dependencies=new Map(qs(Ne.dependencies,([ke,it])=>un(it)))}),X.push(()=>{if(!s.has(Ne.locatorHash))return;let ke=E.get(rt.locatorHash);typeof ke=="number"&&ke>=2&&W();let it=E.get(rt.locatorHash),Ue=typeof it<"u"?it+1:1;E.set(rt.locatorHash,Ue),ie(Fe,Ne,Ve,{top:Be,optional:mt}),E.set(rt.locatorHash,Ue-1)}),De.push(()=>{let ke=r.get(Fe.descriptorHash);if(typeof ke>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let it=N.get(ke);if(typeof it>"u")throw new Error("Assertion failed: Expected the peer requests to be registered");for(let Ue of ye.values()){let x=it.get(Ue.ident.identHash);x&&(Ue.requests.set(Fe.descriptorHash,x),p.set(Ue.hash,Ue),Ue.root||pe.get(Ue.ident.identHash)?.children.set(Fe.descriptorHash,x))}if(s.has(Ne.locatorHash))for(let Ue of be)Ne.dependencies.delete(Ue)})}for(let Te of[...Ae,...se])Te();for(let Te of we){we.delete(Te);let mt=s.get(Te),j=cs(rI(mt).locatorHash,...Array.from(mt.dependencies.values(),be=>{let Ve=be.range!=="missing:"?r.get(be.descriptorHash):"missing:";if(typeof Ve>"u")throw new Error(`Assertion failed: Expected the resolution for ${ni(t.configuration,be)} to have been registered`);return Ve===Be?`${Ve} (top)`:Ve})),rt=b.get(j);if(typeof rt>"u"){b.set(j,mt);continue}let Fe=Pp(T,rt.locatorHash);for(let be of T.get(mt.locatorHash)??[])r.set(be,rt.locatorHash),Fe.add(be);s.delete(mt.locatorHash),a.delete(mt.locatorHash),we.delete(mt.locatorHash);let Ne=I.get(mt.locatorHash);if(Ne!==void 0){let be=Pp(I,rt.locatorHash);for(let Ve of Ne)be.add(Ve),we.add(Ve)}}for(let Te of[...X,...De])Te()};for(let le of t.workspaces){let me=le.anchoredLocator;h.delete(le.anchoredDescriptor.descriptorHash),ie(le.anchoredDescriptor,me,new Map,{top:me.locatorHash,optional:!1})}for(let le of p.values()){if(!le.root)continue;let me=s.get(le.subject.locatorHash);if(typeof me>"u")continue;for(let Be of le.requests.values()){let Ce=`p${cs(le.subject.locatorHash,un(le.ident),Be.requester.locatorHash).slice(0,6)}`;c.set(Ce,{subject:le.subject.locatorHash,requested:le.ident,rootRequester:Be.requester.locatorHash,allRequesters:Array.from(qB(Be),g=>g.requester.locatorHash)})}let pe=[...qB(le)];if(le.provided.range!=="missing:"){let Be=ee(le.provided),Ce=Be.version??"0.0.0",g=ye=>{if(ye.startsWith(Ei.protocol)){if(!t.tryWorkspaceByLocator(Be))return null;ye=ye.slice(Ei.protocol.length),(ye==="^"||ye==="~")&&(ye="*")}return ye},we=!0;for(let ye of pe){let Ae=g(ye.descriptor.range);if(Ae===null){we=!1;continue}if(!Xf(Ce,Ae)){we=!1;let se=`p${cs(le.subject.locatorHash,un(le.ident),ye.requester.locatorHash).slice(0,6)}`;f.push({type:1,subject:me,requested:le.ident,requester:ye.requester,version:Ce,hash:se,requirementCount:pe.length})}}if(!we){let ye=pe.map(Ae=>g(Ae.descriptor.range));f.push({type:3,node:le,range:ye.includes(null)?null:x8(ye),hash:le.hash})}}else{let Be=!0;for(let Ce of pe)if(!Ce.meta?.optional){Be=!1;let g=`p${cs(le.subject.locatorHash,un(le.ident),Ce.requester.locatorHash).slice(0,6)}`;f.push({type:0,subject:me,requested:le.ident,requester:Ce.requester,hash:g})}Be||f.push({type:2,node:le,hash:le.hash})}}}function*fat(t){let e=new Map;if("children"in t)e.set(t,t);else for(let r of t.requests.values())e.set(r,r);for(let[r,s]of e){yield{request:r,root:s};for(let a of r.children.values())e.has(a)||e.set(a,s)}}function Aat(t,e){let r=[],s=[],a=!1;for(let n of t.peerWarnings)if(!(n.type===1||n.type===0)){if(!t.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let c=t.storedResolutions.get(n.node.provided.descriptorHash);if(typeof c>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let f=t.storedPackages.get(c);if(typeof f>"u")throw new Error("Assertion failed: Expected the package to be registered");let p=p0(fat(n.node),({request:C,root:S})=>Xf(f.version??"0.0.0",C.descriptor.range)?p0.skip:C===S?Xi(t.configuration,C.requester):`${Xi(t.configuration,C.requester)} (via ${Xi(t.configuration,S.requester)})`),h=[...qB(n.node)].length>1?"and other dependencies request":"requests",E=n.range?iI(t.configuration,n.range):Ht(t.configuration,"but they have non-overlapping ranges!","redBright");r.push(`${Xi(t.configuration,n.node.ident)} is listed by your project with version ${jB(t.configuration,f.version??"0.0.0")} (${Ht(t.configuration,n.hash,ht.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let c=n.node.requests.size>1?" and other dependencies":"";s.push(`${Yr(t.configuration,n.node.subject)} doesn't provide ${Xi(t.configuration,n.node.ident)} (${Ht(t.configuration,n.hash,ht.CODE)}), requested by ${Xi(t.configuration,n.node.requests.values().next().value.requester)}${c}.`)}}e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Ht(t.configuration,"yarn explain peer-requirements ",ht.CODE)} for details, where ${Ht(t.configuration,"",ht.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of qs(r,c=>JE.default(c)))e.reportWarning(60,n);for(let n of qs(s,c=>JE.default(c)))e.reportWarning(2,n)}),a&&e.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Ht(t.configuration,"yarn explain peer-requirements",ht.CODE)} for details.`)}var jT,GT,Ede,JG,VG,KG,qT,sat,oat,mde,aat,lat,cat,$l,YG,WT,yde,Rt,Ide=Ze(()=>{Dt();Dt();wc();Yt();jT=Ie("crypto");GG();ql();GT=ut(Ld()),Ede=ut(Ai()),JG=Ie("util"),VG=ut(Ie("v8")),KG=ut(Ie("zlib"));FG();av();NG();OG();oI();R8();Rc();gde();Ev();qG();tm();WG();OQ();xc();I0();bc();hR();Vj();Tp();Wo();qT=YE(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),sat=3,oat=/ *, */g,mde=/\/$/,aat=32,lat=(0,JG.promisify)(KG.default.gzip),cat=(0,JG.promisify)(KG.default.gunzip),$l=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))($l||{}),YG={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},WT=(a=>(a[a.NotProvided=0]="NotProvided",a[a.NotCompatible=1]="NotCompatible",a[a.NodeNotProvided=2]="NodeNotProvided",a[a.NodeNotCompatible=3]="NodeNotCompatible",a))(WT||{}),yde=t=>cs(`${sat}`,t),Rt=class t{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new nt(`No project found in ${r}`);let s=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,ce.existsSync(J.join(n,Er.manifest))){s=n;break}a=J.dirname(n)}let c=new t(e.projectCwd,{configuration:e});ze.telemetry?.reportProject(c.cwd),await c.setupResolutions(),await c.setupWorkspaces(),ze.telemetry?.reportWorkspaceCount(c.workspaces.length),ze.telemetry?.reportDependencyCount(c.workspaces.reduce((I,T)=>I+T.manifest.dependencies.size+T.manifest.devDependencies.size,0));let f=c.tryWorkspaceByCwd(s);if(f)return{project:c,workspace:f,locator:f.anchoredLocator};let p=await c.findLocatorForLocation(`${s}/`,{strict:!0});if(p)return{project:c,locator:p,workspace:null};let h=Ht(e,c.cwd,ht.PATH),E=Ht(e,J.relative(c.cwd,s),ht.PATH),C=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,S=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,b=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new nt(`The nearest package directory (${Ht(e,s,ht.PATH)}) doesn't seem to be part of the project declared in ${Ht(e,c.cwd,ht.PATH)}. ${[C,S,b].join(` `)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=J.join(this.cwd,Er.lockfile),r=this.configuration.get("defaultLanguageName");if(ce.existsSync(e)){let s=await ce.readFilePromise(e,"utf8");this.lockFileChecksum=yde(s);let a=as(s);if(a.__metadata){let n=a.__metadata.version,c=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${f})`);let h=Qp(p.resolution,!0),E=new Ut;E.load(p,{yamlCompatibilityMode:!0});let C=E.version,S=E.languageName||r,b=p.linkType.toUpperCase(),I=p.conditions??null,T=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,W=E.peerDependenciesMeta,ee=E.bin;if(p.checksum!=null){let ue=typeof c<"u"&&!p.checksum.includes("/")?`${c}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,ue)}let ie={...h,version:C,languageName:S,linkType:b,conditions:I,dependencies:T,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:W,bin:ee};this.originalPackages.set(ie.locatorHash,ie);for(let ue of f.split(oat)){let le=C0(ue);n<=6&&(le=this.configuration.normalizeDependency(le),le=On(le,le.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(le.descriptorHash,le),this.storedResolutions.set(le.descriptorHash,h.locatorHash)}}}else s.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,GT.default)(4),s=async(a,n)=>{if(e.has(n))return a;e.add(n);let c=new ZI(n,{project:this});await r(()=>c.setup());let f=a.then(()=>{this.addWorkspace(c)});return Array.from(c.workspacesCwds).reduce(s,f)};await s(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${Xi(this.configuration,e.anchoredLocator)}: ${fe.fromPortablePath(e.cwd)} conflicts with ${fe.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){J.isAbsolute(e)||(e=J.resolve(this.cwd,e)),e=J.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let s of this.workspaces)J.relative(s.cwd,e).startsWith("../")||r&&r.cwd.length>=s.cwd.length||(r=s);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Xi(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(Ei.protocol)){let s=e.range.slice(Ei.protocol.length);if(s!=="^"&&s!=="~"&&s!=="*"&&!cl(s))return this.tryWorkspaceByCwd(s)}let r=this.tryWorkspaceByIdent(e);return r===null||(kp(e)&&(e=MB(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${ni(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Gu(e)&&(e=rI(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${Yr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if("descriptorHash"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof r<"u"&&!s.has(r)&&this.deleteLocator(r)}if("locatorHash"in e){this.deleteLocator(e.locatorHash);for(let[r,s]of this.storedResolutions)s===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[s,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(s)}for(let s of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(s,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(s.locatorHash);let n=r.get(s.locatorHash);if(n){r.delete(s.locatorHash);for(let c of n)this.deleteDescriptor(c)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,s]of e.dependencies)kp(s)&&e.dependencies.set(r,MB(s))}getDependencyMeta(e,r){let s={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(un(e));if(!n)return s;let c=n.get(null);if(c&&Object.assign(s,c),r===null||!Ede.default.valid(r))return s;for(let[f,p]of n)f!==null&&f===r&&Object.assign(s,p);return s}async findLocatorForLocation(e,{strict:r=!1}={}){let s=new ki,a=this.configuration.getLinkers(),n={project:this,report:s};for(let c of a){let f=await c.findPackageLocator(e,n);if(f){if(r&&(await c.findPackageLocation(f,n)).replace(mde,"")!==e.replace(mde,""))continue;return f}}return null}async loadUserConfig(){let e=J.join(this.cwd,".pnp.cjs");await ce.existsPromise(e)&&bp(e).setup();let r=J.join(this.cwd,"yarn.config.cjs");return await ce.existsPromise(r)?bp(r):null}async preparePackage(e,{resolver:r,resolveOptions:s}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[c,f]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,f,this,n,f,{resolver:r,resolveOptions:s});if(!UB(f,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,s);n.dependencies.set(c,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),s=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new KI(a);await n.setup(this,{report:e.report});let c=e.lockfileOnly?[new HT(a)]:[n,a],f=new rm([new zI(a),...c]),p=new rm([...c]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:f}:{project:this,report:e.report,resolver:f,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},C=new Map,S=new Map,b=new Map,I=new Map,T=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,W=new Set,ee=[],ie=lj(),ue=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ao.progressViaTitle(),async se=>{let X=async rt=>{let Fe=await qE(async()=>await f.resolve(rt,E),ke=>`${Yr(this.configuration,rt)}: ${ke}`);if(!_B(rt,Fe))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${Yr(this.configuration,rt)} to ${Yr(this.configuration,Fe)})`);I.set(Fe.locatorHash,Fe),!r.delete(Fe.locatorHash)&&!this.tryWorkspaceByLocator(Fe)&&s.push(Fe);let be=await this.preparePackage(Fe,{resolver:f,resolveOptions:E}),Ve=Uu([...be.dependencies.values()].map(ke=>j(ke)));return ee.push(Ve),Ve.catch(()=>{}),S.set(be.locatorHash,be),be},De=async rt=>{let Fe=T.get(rt.locatorHash);if(typeof Fe<"u")return Fe;let Ne=Promise.resolve().then(()=>X(rt));return T.set(rt.locatorHash,Ne),Ne},Te=async(rt,Fe)=>{let Ne=await j(Fe);return C.set(rt.descriptorHash,rt),b.set(rt.descriptorHash,Ne.locatorHash),Ne},mt=async rt=>{se.setTitle(ni(this.configuration,rt));let Fe=this.resolutionAliases.get(rt.descriptorHash);if(typeof Fe<"u")return Te(rt,this.storedDescriptors.get(Fe));let Ne=f.getResolutionDependencies(rt,E),be=Object.fromEntries(await Uu(Object.entries(Ne).map(async([it,Ue])=>{let x=f.bindDescriptor(Ue,U,E),w=await j(x);return W.add(w.locatorHash),[it,w]}))),ke=(await qE(async()=>await f.getCandidates(rt,be,E),it=>`${ni(this.configuration,rt)}: ${it}`))[0];if(typeof ke>"u")throw new jt(82,`${ni(this.configuration,rt)}: No candidates found`);if(e.checkResolutions){let{locators:it}=await p.getSatisfying(rt,be,[ke],{...E,resolver:p});if(!it.find(Ue=>Ue.locatorHash===ke.locatorHash))throw new jt(78,`Invalid resolution ${FB(this.configuration,rt,ke)}`)}return C.set(rt.descriptorHash,rt),b.set(rt.descriptorHash,ke.locatorHash),De(ke)},j=rt=>{let Fe=N.get(rt.descriptorHash);if(typeof Fe<"u")return Fe;C.set(rt.descriptorHash,rt);let Ne=Promise.resolve().then(()=>mt(rt));return N.set(rt.descriptorHash,Ne),Ne};for(let rt of this.workspaces){let Fe=rt.anchoredDescriptor;ee.push(j(Fe))}for(;ee.length>0;){let rt=[...ee];ee.length=0,await Uu(rt)}});let le=Wl(r.values(),se=>this.tryWorkspaceByLocator(se)?Wl.skip:se);if(s.length>0||le.length>0){let se=new Set(this.workspaces.flatMap(rt=>{let Fe=S.get(rt.anchoredLocator.locatorHash);if(!Fe)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(Fe.dependencies.values(),Ne=>{let be=b.get(Ne.descriptorHash);if(!be)throw new Error("Assertion failed: The resolution should have been registered");return be})})),X=rt=>se.has(rt.locatorHash)?"0":"1",De=rt=>ll(rt),Te=qs(s,[X,De]),mt=qs(le,[X,De]),j=e.report.getRecommendedLength();Te.length>0&&e.report.reportInfo(85,`${Ht(this.configuration,"+",ht.ADDED)} ${Xk(this.configuration,Te,j)}`),mt.length>0&&e.report.reportInfo(85,`${Ht(this.configuration,"-",ht.REMOVED)} ${Xk(this.configuration,mt,j)}`)}let me=new Set(this.resolutionAliases.values()),pe=new Set(S.keys()),Be=new Set,Ce=new Map,g=[],we=new Map;uat({project:this,accessibleLocators:Be,volatileDescriptors:me,optionalBuilds:pe,peerRequirements:Ce,peerWarnings:g,peerRequirementNodes:we,allDescriptors:C,allResolutions:b,allPackages:S});for(let se of W)pe.delete(se);for(let se of me)C.delete(se),b.delete(se);let ye=new Set,Ae=new Set;for(let se of S.values())se.conditions!=null&&pe.has(se.locatorHash)&&(QQ(se,ue)||(QQ(se,ie)&&e.report.reportWarningOnce(77,`${Yr(this.configuration,se)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ht(this.configuration,"supportedArchitectures",ht.SETTING)} setting`),Ae.add(se.locatorHash)),ye.add(se.locatorHash));this.storedResolutions=b,this.storedDescriptors=C,this.storedPackages=S,this.accessibleLocators=Be,this.conditionalLocators=ye,this.disabledLocators=Ae,this.originalPackages=I,this.optionalBuilds=pe,this.peerRequirements=Ce,this.peerWarnings=g,this.peerRequirementNodes=we}async fetchEverything({cache:e,report:r,fetcher:s,mode:a,persistProject:n=!0}){let c={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},f=s||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:f,report:r,cacheOptions:c},h=Array.from(new Set(qs(this.storedResolutions.values(),[I=>{let T=this.storedPackages.get(I);if(!T)throw new Error("Assertion failed: The locator should have been registered");return ll(T)}])));a==="update-lockfile"&&(h=h.filter(I=>!this.storedChecksums.has(I)));let E=!1,C=Ao.progressViaCounter(h.length);await r.reportProgress(C);let S=(0,GT.default)(aat);if(await Uu(h.map(I=>S(async()=>{let T=this.storedPackages.get(I);if(!T)throw new Error("Assertion failed: The locator should have been registered");if(Gu(T))return;let N;try{N=await f.fetch(T,p)}catch(U){U.message=`${Yr(this.configuration,T)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(T.locatorHash,N.checksum):this.storedChecksums.delete(T.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{C.tick()}))),E)throw E;let b=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||b){let T=(await Promise.all([...r.cacheMisses].map(async le=>{let me=this.storedPackages.get(le),pe=this.storedChecksums.get(le)??null,Be=e.getLocatorPath(me,pe);return(await ce.statPromise(Be)).size}))).reduce((le,me)=>le+me,0)-(b?.size??0),N=r.cacheMisses.size,U=b?.count??0,W=`${Wk(N,{zero:"No new packages",one:"A package was",more:`${Ht(this.configuration,N,ht.NUMBER)} packages were`})} added to the project`,ee=`${Wk(U,{zero:"none were",one:"one was",more:`${Ht(this.configuration,U,ht.NUMBER)} were`})} removed`,ie=T!==0?` (${Ht(this.configuration,T,ht.SIZE_DIFF)})`:"",ue=U>0?N>0?`${W}, and ${ee}${ie}.`:`${W}, but ${ee}${ie}.`:`${W}${ie}.`;r.reportInfo(13,ue)}}async linkEverything({cache:e,report:r,fetcher:s,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},c=s||this.configuration.makeFetcher(),f={checksums:this.storedChecksums,project:this,cache:e,fetcher:c,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(ye=>{let Ae=ye.makeInstaller(h),se=ye.getCustomDataKey(),X=this.linkersCustomData.get(se);return typeof X<"u"&&Ae.attachCustomData(X),[ye,Ae]})),C=new Map,S=new Map,b=new Map,I=new Map(await Uu([...this.accessibleLocators].map(async ye=>{let Ae=this.storedPackages.get(ye);if(!Ae)throw new Error("Assertion failed: The locator should have been registered");return[ye,await c.fetch(Ae,f)]}))),T=[],N=new Set,U=[];for(let ye of this.accessibleLocators){let Ae=this.storedPackages.get(ye);if(typeof Ae>"u")throw new Error("Assertion failed: The locator should have been registered");let se=I.get(Ae.locatorHash);if(typeof se>"u")throw new Error("Assertion failed: The fetch result should have been registered");let X=[],De=mt=>{X.push(mt)},Te=this.tryWorkspaceByLocator(Ae);if(Te!==null){let mt=[],{scripts:j}=Te.manifest;for(let Fe of["preinstall","install","postinstall"])j.has(Fe)&&mt.push({type:0,script:Fe});try{for(let[Fe,Ne]of E)if(Fe.supportsPackage(Ae,h)&&(await Ne.installPackage(Ae,se,{holdFetchResult:De})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{X.length===0?se.releaseFs?.():T.push(Uu(X).catch(()=>{}).then(()=>{se.releaseFs?.()}))}let rt=J.join(se.packageFs.getRealPath(),se.prefixPath);S.set(Ae.locatorHash,rt),!Gu(Ae)&&mt.length>0&&b.set(Ae.locatorHash,{buildDirectives:mt,buildLocations:[rt]})}else{let mt=p.find(Fe=>Fe.supportsPackage(Ae,h));if(!mt)throw new jt(12,`${Yr(this.configuration,Ae)} isn't supported by any available linker`);let j=E.get(mt);if(!j)throw new Error("Assertion failed: The installer should have been registered");let rt;try{rt=await j.installPackage(Ae,se,{holdFetchResult:De})}finally{X.length===0?se.releaseFs?.():T.push(Uu(X).then(()=>{}).then(()=>{se.releaseFs?.()}))}C.set(Ae.locatorHash,mt),S.set(Ae.locatorHash,rt.packageLocation),rt.buildRequest&&rt.packageLocation&&(rt.buildRequest.skipped?(N.add(Ae.locatorHash),this.skippedBuilds.has(Ae.locatorHash)||U.push([Ae,rt.buildRequest.explain])):b.set(Ae.locatorHash,{buildDirectives:rt.buildRequest.directives,buildLocations:[rt.packageLocation]}))}}let W=new Map;for(let ye of this.accessibleLocators){let Ae=this.storedPackages.get(ye);if(!Ae)throw new Error("Assertion failed: The locator should have been registered");let se=this.tryWorkspaceByLocator(Ae)!==null,X=async(De,Te)=>{let mt=S.get(Ae.locatorHash);if(typeof mt>"u")throw new Error(`Assertion failed: The package (${Yr(this.configuration,Ae)}) should have been registered`);let j=[];for(let rt of Ae.dependencies.values()){let Fe=this.storedResolutions.get(rt.descriptorHash);if(typeof Fe>"u")throw new Error(`Assertion failed: The resolution (${ni(this.configuration,rt)}, from ${Yr(this.configuration,Ae)})should have been registered`);let Ne=this.storedPackages.get(Fe);if(typeof Ne>"u")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ni(this.configuration,rt)}) should have been registered`);let be=this.tryWorkspaceByLocator(Ne)===null?C.get(Fe):null;if(typeof be>"u")throw new Error(`Assertion failed: The package (${Fe}, resolved from ${ni(this.configuration,rt)}) should have been registered`);be===De||be===null?S.get(Ne.locatorHash)!==null&&j.push([rt,Ne]):!se&&mt!==null&&xB(W,Fe).push(mt)}mt!==null&&await Te.attachInternalDependencies(Ae,j)};if(se)for(let[De,Te]of E)De.supportsPackage(Ae,h)&&await X(De,Te);else{let De=C.get(Ae.locatorHash);if(!De)throw new Error("Assertion failed: The linker should have been found");let Te=E.get(De);if(!Te)throw new Error("Assertion failed: The installer should have been registered");await X(De,Te)}}for(let[ye,Ae]of W){let se=this.storedPackages.get(ye);if(!se)throw new Error("Assertion failed: The package should have been registered");let X=C.get(se.locatorHash);if(!X)throw new Error("Assertion failed: The linker should have been found");let De=E.get(X);if(!De)throw new Error("Assertion failed: The installer should have been registered");await De.attachExternalDependents(se,Ae)}let ee=new Map;for(let[ye,Ae]of E){let se=await Ae.finalizeInstall();for(let X of se?.records??[])X.buildRequest.skipped?(N.add(X.locator.locatorHash),this.skippedBuilds.has(X.locator.locatorHash)||U.push([X.locator,X.buildRequest.explain])):b.set(X.locator.locatorHash,{buildDirectives:X.buildRequest.directives,buildLocations:X.buildLocations});typeof se?.customData<"u"&&ee.set(ye.getCustomDataKey(),se.customData)}if(this.linkersCustomData=ee,await Uu(T),a==="skip-build")return;for(let[,ye]of qs(U,([Ae])=>ll(Ae)))ye(r);let ie=new Set(b.keys()),ue=(0,jT.createHash)("sha512");ue.update(process.versions.node),await this.configuration.triggerHook(ye=>ye.globalHashGeneration,this,ye=>{ue.update("\0"),ue.update(ye)});let le=ue.digest("hex"),me=new Map,pe=ye=>{let Ae=me.get(ye.locatorHash);if(typeof Ae<"u")return Ae;let se=this.storedPackages.get(ye.locatorHash);if(typeof se>"u")throw new Error("Assertion failed: The package should have been registered");let X=(0,jT.createHash)("sha512");X.update(ye.locatorHash),me.set(ye.locatorHash,"");for(let De of se.dependencies.values()){let Te=this.storedResolutions.get(De.descriptorHash);if(typeof Te>"u")throw new Error(`Assertion failed: The resolution (${ni(this.configuration,De)}) should have been registered`);let mt=this.storedPackages.get(Te);if(typeof mt>"u")throw new Error("Assertion failed: The package should have been registered");X.update(pe(mt))}return Ae=X.digest("hex"),me.set(ye.locatorHash,Ae),Ae},Be=(ye,Ae)=>{let se=(0,jT.createHash)("sha512");se.update(le),se.update(pe(ye));for(let X of Ae)se.update(X);return se.digest("hex")},Ce=new Map,g=!1,we=ye=>{let Ae=new Set([ye.locatorHash]);for(let se of Ae){let X=this.storedPackages.get(se);if(!X)throw new Error("Assertion failed: The package should have been registered");for(let De of X.dependencies.values()){let Te=this.storedResolutions.get(De.descriptorHash);if(!Te)throw new Error(`Assertion failed: The resolution (${ni(this.configuration,De)}) should have been registered`);if(Te!==ye.locatorHash&&ie.has(Te))return!1;let mt=this.storedPackages.get(Te);if(!mt)throw new Error("Assertion failed: The package should have been registered");let j=this.tryWorkspaceByLocator(mt);if(j){if(j.anchoredLocator.locatorHash!==ye.locatorHash&&ie.has(j.anchoredLocator.locatorHash))return!1;Ae.add(j.anchoredLocator.locatorHash)}Ae.add(Te)}}return!0};for(;ie.size>0;){let ye=ie.size,Ae=[];for(let se of ie){let X=this.storedPackages.get(se);if(!X)throw new Error("Assertion failed: The package should have been registered");if(!we(X))continue;let De=b.get(X.locatorHash);if(!De)throw new Error("Assertion failed: The build directive should have been registered");let Te=Be(X,De.buildLocations);if(this.storedBuildState.get(X.locatorHash)===Te){Ce.set(X.locatorHash,Te),ie.delete(se);continue}g||(await this.persistInstallStateFile(),g=!0),this.storedBuildState.has(X.locatorHash)?r.reportInfo(8,`${Yr(this.configuration,X)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${Yr(this.configuration,X)} must be built because it never has been before or the last one failed`);let mt=De.buildLocations.map(async j=>{if(!J.isAbsolute(j))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${j})`);for(let rt of De.buildDirectives){let Fe=`# This file contains the result of Yarn building a package (${ll(X)}) `;switch(rt.type){case 0:Fe+=`# Script name: ${rt.script} `;break;case 1:Fe+=`# Script code: ${rt.script} `;break}let Ne=null;if(!await ce.mktempPromise(async Ve=>{let ke=J.join(Ve,"build.log"),{stdout:it,stderr:Ue}=this.configuration.getSubprocessStreams(ke,{header:Fe,prefix:Yr(this.configuration,X),report:r}),x;try{switch(rt.type){case 0:x=await OR(X,rt.script,[],{cwd:j,project:this,stdin:Ne,stdout:it,stderr:Ue});break;case 1:x=await Gj(X,rt.script,[],{cwd:j,project:this,stdin:Ne,stdout:it,stderr:Ue});break}}catch(y){Ue.write(y.stack),x=1}if(it.end(),Ue.end(),x===0)return!0;ce.detachTemp(Ve);let w=`${Yr(this.configuration,X)} couldn't be built successfully (exit code ${Ht(this.configuration,x,ht.NUMBER)}, logs can be found here: ${Ht(this.configuration,ke,ht.PATH)})`,P=this.optionalBuilds.has(X.locatorHash);return P?r.reportInfo(9,w):r.reportError(9,w),zpe&&r.reportFold(fe.fromPortablePath(ke),ce.readFileSync(ke,"utf8")),P}))return!1}return!0});Ae.push(...mt,Promise.allSettled(mt).then(j=>{ie.delete(se),j.every(rt=>rt.status==="fulfilled"&&rt.value===!0)&&Ce.set(X.locatorHash,Te)}))}if(await Uu(Ae),ye===ie.size){let se=Array.from(ie).map(X=>{let De=this.storedPackages.get(X);if(!De)throw new Error("Assertion failed: The package should have been registered");return Yr(this.configuration,De)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${se})`);break}}this.storedBuildState=Ce,this.skippedBuilds=N}async installWithNewReport(e,r){return(await Ot.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get("nodeLinker");ze.telemetry?.reportInstall(r);let s=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&e.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,C)=>{e.report.reportWarning(E,C)},reportError:(E,C)=>{e.report.reportError(E,C),s=!0}})}),s)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,C]of E)for(let S of C)S.status="inactive";let n=J.join(this.cwd,Er.lockfile),c=null;if(e.immutable)try{c=await ce.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new jt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):E}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{Aat(this,e.report);for(let[,E]of a)for(let[,C]of E)for(let S of C)if(S.userProvided){let b=Ht(this.configuration,S,ht.PACKAGE_EXTENSION);switch(S.status){case"inactive":e.report.reportWarning(68,`${b}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${b}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(c!==null){let E=Ed(c,this.generateLockfile());if(E!==c){let C=hde(n,n,c,E,void 0,void 0,{maxEditLength:100});if(C){e.report.reportSeparator();for(let S of C.hunks){e.report.reportInfo(null,`@@ -${S.oldStart},${S.oldLines} +${S.newStart},${S.newLines} @@`);for(let b of S.lines)b.startsWith("+")?e.report.reportError(28,Ht(this.configuration,b,ht.ADDED)):b.startsWith("-")?e.report.reportError(28,Ht(this.configuration,b,ht.REMOVED)):e.report.reportInfo(null,Ht(this.configuration,b,"grey"))}e.report.reportSeparator()}throw new jt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,C]of E)for(let S of C)S.userProvided&&S.status==="active"&&ze.telemetry?.reportPackageExtension(Zd(S,ht.PACKAGE_EXTENSION));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e)});let f=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(f.map(async E=>SQ(E,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Ht(this.configuration,"mode=update-lockfile",ht.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(f.map(async C=>SQ(C,{cwd:this.cwd})));for(let C=0;C{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,C)=>{e.report.reportWarning(E,C)},reportError:(E,C)=>{e.report.reportError(E,C),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,c]of this.storedResolutions.entries()){let f=e.get(c);f||e.set(c,f=new Set),f.add(n)}let r={},{cacheKey:s}=Kr.getCacheKey(this.configuration);r.__metadata={version:qT,cacheKey:s};for(let[n,c]of e.entries()){let f=this.originalPackages.get(n);if(!f)continue;let p=[];for(let C of c){let S=this.storedDescriptors.get(C);if(!S)throw new Error("Assertion failed: The descriptor should have been registered");p.push(S)}let h=p.map(C=>al(C)).sort().join(", "),E=new Ut;E.version=f.linkType==="HARD"?f.version:"0.0.0-use.local",E.languageName=f.languageName,E.dependencies=new Map(f.dependencies),E.peerDependencies=new Map(f.peerDependencies),E.dependenciesMeta=new Map(f.dependenciesMeta),E.peerDependenciesMeta=new Map(f.peerDependenciesMeta),E.bin=new Map(f.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:f.linkType.toLowerCase(),resolution:ll(f),checksum:this.storedChecksums.get(f.locatorHash),conditions:f.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. `,`# Manual changes might be lost - proceed with caution! `].join("")} `+nl(r)}async persistLockfile(){let e=J.join(this.cwd,Er.lockfile),r="";try{r=await ce.readFilePromise(e,"utf8")}catch{}let s=this.generateLockfile(),a=Ed(r,s);a!==r&&(await ce.writeFilePromise(e,a),this.lockFileChecksum=yde(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let c of Object.values(YG))e.push(...c);let r=Kd(this,e),s=VG.default.serialize(r),a=cs(s);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await ce.mkdirPromise(J.dirname(n),{recursive:!0}),await ce.writeFilePromise(n,await lat(s)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:s=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let c=await cat(await ce.readFilePromise(a));n=VG.default.deserialize(c),this.installStateChecksum=cs(c)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),s&&Object.assign(this,Kd(n,YG.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,Kd(n,YG.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ki}),await this.persistInstallStateFile()}async persist(){let e=(0,GT.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let s=new Set([".gitignore"]);if(!j8(e.cwd,this.cwd)||!await ce.existsPromise(e.cwd))return null;let a=[];for(let c of await ce.readdirPromise(e.cwd)){if(s.has(c))continue;let f=J.resolve(e.cwd,c);e.markedFiles.has(f)||(e.immutable?r.reportError(56,`${Ht(this.configuration,J.basename(f),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(ce.lstatPromise(f).then(async p=>(await ce.removePromise(f),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((c,f)=>c+f,0)}}}});function pat(t){let s=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),c=n+a,f=t.state.lastTips??s*864e5,p=f+864e5+8*36e5-t.timeZone,h=c<=t.timeNow,E=p<=t.timeNow,C=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(C={},C.lastUpdate=h?t.timeNow:n,C.lastTips=f,C.blocks=h?{}:t.state.blocks,C.displayedTips=t.state.displayedTips),{nextState:C,triggerUpdate:h,triggerTips:E,nextTips:E?s*864e5:f}}var XI,Cde=Ze(()=>{Dt();yv();I0();AR();bc();Tp();XI=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let s=this.getRegistryPath();this.isNew=!ce.existsSync(s),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),s=f=>f&&fn?Xf(fn,f):!1,a=e.map((f,p)=>p).filter(f=>e[f]&&s(e[f]?.selector));if(a.length===0)return null;let n=a.filter(f=>!r.has(f));if(n.length===0){let f=Math.floor(a.length*.2);this.displayedTips=f>0?this.displayedTips.slice(-f):[],n=a.filter(p=>!r.has(p))}let c=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(c),this.commitTips(),e[c]}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){Pp(this.values,e).add(r)}reportEnumerator(e,r){Pp(this.enumerators,e).add(cs(r))}reportHit(e,r="*"){let s=j4(this.hits,e),a=Yl(s,r,()=>0);s.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return J.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),s;try{s=ce.readJsonSync(r)}catch{s={}}let{nextState:a,triggerUpdate:n,triggerTips:c,nextTips:f}=pat({state:s,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=f,this.displayedTips=s.displayedTips??[],a!==null)try{ce.mkdirSync(J.dirname(r),{recursive:!0}),ce.writeJsonSync(r,a)}catch{return!1}if(c&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=s.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=C=>aj(h,C,{configuration:this.configuration}).catch(()=>{});for(let[C,S]of Object.entries(s.blocks??{})){if(Object.keys(S).length===0)continue;let b=S;b.userId=C,b.reportType="primary";for(let N of Object.keys(b.enumerators??{}))b.enumerators[N]=b.enumerators[N].length;E(b);let I=new Map,T=20;for(let[N,U]of Object.entries(b.values))U.length>0&&I.set(N,U.slice(0,T));for(;I.size>0;){let N={};N.userId=C,N.reportType="secondary",N.metrics={};for(let[U,W]of I)N.metrics[U]=W.shift(),W.length===0&&I.delete(U);E(N)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=ce.readJsonSync(e)}catch{r={}}let s=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[s]=a[s]??{};for(let c of this.hits.keys()){let f=n.hits=n.hits??{},p=f[c]=f[c]??{};for(let[h,E]of this.hits.get(c))p[h]=(p[h]??0)+E}for(let c of["values","enumerators"])for(let f of this[c].keys()){let p=n[c]=n[c]??{};p[f]=[...new Set([...p[f]??[],...this[c].get(f)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),ce.mkdirSync(J.dirname(e),{recursive:!0}),ce.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var jv={};Vt(jv,{BuildDirectiveType:()=>UT,CACHE_CHECKPOINT:()=>TG,CACHE_VERSION:()=>MT,Cache:()=>Kr,Configuration:()=>ze,DEFAULT_RC_FILENAME:()=>hj,FormatType:()=>ope,InstallMode:()=>$l,LEGACY_PLUGINS:()=>ov,LOCKFILE_VERSION:()=>qT,LegacyMigrationResolver:()=>KI,LightReport:()=>lA,LinkType:()=>VE,LockfileResolver:()=>zI,Manifest:()=>Ut,MessageName:()=>Br,MultiFetcher:()=>aI,PackageExtensionStatus:()=>Y4,PackageExtensionType:()=>W4,PeerWarningType:()=>WT,Project:()=>Rt,Report:()=>Ao,ReportError:()=>jt,SettingsType:()=>wI,StreamReport:()=>Ot,TAG_REGEXP:()=>Mp,TelemetryManager:()=>XI,ThrowReport:()=>ki,VirtualFetcher:()=>lI,WindowsLinkType:()=>ER,Workspace:()=>ZI,WorkspaceFetcher:()=>cI,WorkspaceResolver:()=>Ei,YarnVersion:()=>fn,execUtils:()=>qr,folderUtils:()=>NQ,formatUtils:()=>he,hashUtils:()=>Nn,httpUtils:()=>ln,miscUtils:()=>je,nodeUtils:()=>fs,parseMessageName:()=>jx,reportOptionDeprecations:()=>SI,scriptUtils:()=>In,semverUtils:()=>Fr,stringifyMessageName:()=>Yf,structUtils:()=>G,tgzUtils:()=>ps,treeUtils:()=>xs});var Ge=Ze(()=>{gR();OQ();xc();I0();AR();bc();hR();Vj();Tp();Wo();$ge();ode();FG();av();av();cde();NG();ude();OG();oI();Gx();Q8();Ide();Rc();Ev();Cde();qG();T8();F8();tm();WG();yv();ule()});var Pde=_((OHt,qv)=>{"use strict";var gat=process.env.TERM_PROGRAM==="Hyper",dat=process.platform==="win32",vde=process.platform==="linux",zG={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Sde=Object.assign({},zG,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),Dde=Object.assign({},zG,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:vde?"\u25B8":"\u276F",pointerSmall:vde?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});qv.exports=dat&&!gat?Sde:Dde;Reflect.defineProperty(qv.exports,"common",{enumerable:!1,value:zG});Reflect.defineProperty(qv.exports,"windows",{enumerable:!1,value:Sde});Reflect.defineProperty(qv.exports,"other",{enumerable:!1,value:Dde})});var Ju=_((LHt,ZG)=>{"use strict";var mat=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),yat=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,bde=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let c=n.open=`\x1B[${n.codes[0]}m`,f=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(f)&&(h=h.replace(p,f+c));let C=c+h+f;return E?C.replace(/\r*\n/g,`${f}$&${c}`):C},n},r=(n,c,f)=>typeof n=="function"?n(c):n.wrap(c,f),s=(n,c)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let f=""+n,p=f.includes(` `),h=c.length;for(h>0&&c.includes("unstyle")&&(c=[...new Set(["unstyle",...c])].reverse());h-- >0;)f=r(t.styles[c[h]],f,p);return f},a=(n,c,f)=>{t.styles[n]=e({name:n,codes:c}),(t.keys[f]||(t.keys[f]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>s(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=yat,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,c)=>{let f=typeof c=="string"?t[c]:c;if(typeof f!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");f.stack||(Reflect.defineProperty(f,"name",{value:n}),t.styles[n]=f,f.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>s(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(f.stack):f.stack,p}})},t.theme=n=>{if(!mat(n))throw new TypeError("Expected theme to be an object");for(let c of Object.keys(n))t.alias(c,n[c]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Pde(),t.define=a,t};ZG.exports=bde();ZG.exports.create=bde});var Xo=_(pn=>{"use strict";var Eat=Object.prototype.toString,jc=Ju(),xde=!1,XG=[],kde={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};pn.longest=(t,e)=>t.reduce((r,s)=>Math.max(r,e?s[e].length:s.length),0);pn.hasColor=t=>!!t&&jc.hasColor(t);var VT=pn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);pn.nativeType=t=>Eat.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");pn.isAsyncFn=t=>pn.nativeType(t)==="asyncfunction";pn.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";pn.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;pn.scrollDown=(t=[])=>[...t.slice(1),t[0]];pn.scrollUp=(t=[])=>[t.pop(),...t];pn.reorder=(t=[])=>{let e=t.slice();return e.sort((r,s)=>r.index>s.index?1:r.index{let s=t.length,a=r===s?0:r<0?s-1:r,n=t[e];t[e]=t[a],t[a]=n};pn.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};pn.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};pn.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:s=` `+r,width:a=80}=e,n=(s+r).match(/[^\S\n]/g)||[];a-=n.length;let c=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,f=t.trim(),p=new RegExp(c,"g"),h=f.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(s)};pn.unmute=t=>{let e=t.stack.find(s=>jc.keys.color.includes(s));return e?jc[e]:t.stack.find(s=>s.slice(2)==="bg")?jc[e.slice(2)]:s=>s};pn.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";pn.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(s=>jc.keys.color.includes(s));if(e){let s=jc["bg"+pn.pascal(e)];return s?s.black:t}let r=t.stack.find(s=>s.slice(0,2)==="bg");return r?jc[r.slice(2).toLowerCase()]||t:jc.none};pn.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(s=>jc.keys.color.includes(s)),r=t.stack.find(s=>s.slice(0,2)==="bg");if(e&&!r)return jc[kde[e]||e];if(r){let s=r.slice(2).toLowerCase(),a=kde[s];return a&&jc["bg"+pn.pascal(a)]||t}return jc.none};pn.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),s=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+s};pn.set=(t={},e="",r)=>e.split(".").reduce((s,a,n,c)=>{let f=c.length-1>n?s[a]||{}:r;return!pn.isObject(f)&&n{let s=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return s??r};pn.mixin=(t,e)=>{if(!VT(t))return e;if(!VT(e))return t;for(let r of Object.keys(e)){let s=Object.getOwnPropertyDescriptor(e,r);if(s.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&VT(s.value)){let a=Object.getOwnPropertyDescriptor(t,r);VT(a.value)?t[r]=pn.merge({},t[r],e[r]):Reflect.defineProperty(t,r,s)}else Reflect.defineProperty(t,r,s);else Reflect.defineProperty(t,r,s)}return t};pn.merge=(...t)=>{let e={};for(let r of t)pn.mixin(e,r);return e};pn.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let s of Object.keys(r)){let a=r[s];typeof a=="function"?pn.define(t,s,a.bind(e)):pn.define(t,s,a)}};pn.onExit=t=>{let e=(r,s)=>{xde||(xde=!0,XG.forEach(a=>a()),r===!0&&process.exit(128+s))};XG.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),XG.push(t)};pn.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};pn.defineExport=(t,e,r)=>{let s;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){s=a},get(){return s?s():r()}})}});var Qde=_(rC=>{"use strict";rC.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};rC.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};rC.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};rC.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};rC.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var Fde=_((_Ht,Tde)=>{"use strict";var Rde=Ie("readline"),Iat=Qde(),Cat=/^(?:\x1b)([a-zA-Z0-9])$/,wat=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,Bat={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function vat(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function Sat(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var JT=(t="",e={})=>{let r,s={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=s.sequence||""),s.sequence=s.sequence||t||s.name,t==="\r")s.raw=void 0,s.name="return";else if(t===` `)s.name="enter";else if(t===" ")s.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")s.name="backspace",s.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")s.name="escape",s.meta=t.length===2;else if(t===" "||t==="\x1B ")s.name="space",s.meta=t.length===2;else if(t<="")s.name=String.fromCharCode(t.charCodeAt(0)+97-1),s.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")s.name="number";else if(t.length===1&&t>="a"&&t<="z")s.name=t;else if(t.length===1&&t>="A"&&t<="Z")s.name=t.toLowerCase(),s.shift=!0;else if(r=Cat.exec(t))s.meta=!0,s.shift=/^[A-Z]$/.test(r[1]);else if(r=wat.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(s.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),c=(r[3]||r[5]||1)-1;s.ctrl=!!(c&4),s.meta=!!(c&10),s.shift=!!(c&1),s.code=n,s.name=Bat[n],s.shift=vat(n)||s.shift,s.ctrl=Sat(n)||s.ctrl}return s};JT.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let s=Rde.createInterface({terminal:!0,input:r});Rde.emitKeypressEvents(r,s);let a=(f,p)=>e(f,JT(f,p),s),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),s.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),s.pause(),s.close()}};JT.action=(t,e,r)=>{let s={...Iat,...r};return e.ctrl?(e.action=s.ctrl[e.name],e):e.option&&s.option?(e.action=s.option[e.name],e):e.shift?(e.action=s.shift[e.name],e):(e.action=s.keys[e.name],e)};Tde.exports=JT});var Ode=_((HHt,Nde)=>{"use strict";Nde.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(e)for(let r of Object.keys(e)){let s=e[r];typeof s=="number"&&(s={interval:s}),Dat(t,r,s)}};function Dat(t,e,r={}){let s=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;s.frames=r.frames||[],s.loading=!0;let n=setInterval(()=>{s.ms=Date.now()-s.start,s.tick++,t.render()},a);return s.stop=()=>{s.loading=!1,clearInterval(n)},Reflect.defineProperty(s,"interval",{value:n}),t.once("close",()=>s.stop()),s.stop}});var Mde=_((jHt,Lde)=>{"use strict";var{define:Pat,width:bat}=Xo(),$G=class{constructor(e){let r=e.options;Pat(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=bat(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};Lde.exports=$G});var _de=_((GHt,Ude)=>{"use strict";var eq=Xo(),ho=Ju(),tq={default:ho.noop,noop:ho.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||eq.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||eq.complement(this.primary)},primary:ho.cyan,success:ho.green,danger:ho.magenta,strong:ho.bold,warning:ho.yellow,muted:ho.dim,disabled:ho.gray,dark:ho.dim.gray,underline:ho.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};tq.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(ho.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(ho.visible=t.styles.visible);let e=eq.merge({},tq,t.styles);delete e.merge;for(let r of Object.keys(ho))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>ho[r]});for(let r of Object.keys(ho.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>ho[r]});return e};Ude.exports=tq});var jde=_((qHt,Hde)=>{"use strict";var rq=process.platform==="win32",zp=Ju(),xat=Xo(),nq={...zp.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:zp.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:zp.symbols.question,submitted:zp.symbols.check,cancelled:zp.symbols.cross},separator:{pending:zp.symbols.pointerSmall,submitted:zp.symbols.middot,cancelled:zp.symbols.middot},radio:{off:rq?"( )":"\u25EF",on:rq?"(*)":"\u25C9",disabled:rq?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};nq.merge=t=>{let e=xat.merge({},zp.symbols,nq,t.symbols);return delete e.merge,e};Hde.exports=nq});var qde=_((WHt,Gde)=>{"use strict";var kat=_de(),Qat=jde(),Rat=Xo();Gde.exports=t=>{t.options=Rat.merge({},t.options.theme,t.options),t.symbols=Qat.merge(t.options),t.styles=kat.merge(t.options)}});var Kde=_((Vde,Jde)=>{"use strict";var Wde=process.env.TERM_PROGRAM==="Apple_Terminal",Tat=Ju(),iq=Xo(),Ku=Jde.exports=Vde,Ui="\x1B[",Yde="\x07",sq=!1,j0=Ku.code={bell:Yde,beep:Yde,beginning:`${Ui}G`,down:`${Ui}J`,esc:Ui,getPosition:`${Ui}6n`,hide:`${Ui}?25l`,line:`${Ui}2K`,lineEnd:`${Ui}K`,lineStart:`${Ui}1K`,restorePosition:Ui+(Wde?"8":"u"),savePosition:Ui+(Wde?"7":"s"),screen:`${Ui}2J`,show:`${Ui}?25h`,up:`${Ui}1J`},wm=Ku.cursor={get hidden(){return sq},hide(){return sq=!0,j0.hide},show(){return sq=!1,j0.show},forward:(t=1)=>`${Ui}${t}C`,backward:(t=1)=>`${Ui}${t}D`,nextLine:(t=1)=>`${Ui}E`.repeat(t),prevLine:(t=1)=>`${Ui}F`.repeat(t),up:(t=1)=>t?`${Ui}${t}A`:"",down:(t=1)=>t?`${Ui}${t}B`:"",right:(t=1)=>t?`${Ui}${t}C`:"",left:(t=1)=>t?`${Ui}${t}D`:"",to(t,e){return e?`${Ui}${e+1};${t+1}H`:`${Ui}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?wm.left(-t):t>0?wm.right(t):"",r+=e<0?wm.up(-e):e>0?wm.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:s,input:a,prompt:n,size:c,value:f}=t;if(s=iq.isPrimitive(s)?String(s):"",a=iq.isPrimitive(a)?String(a):"",f=iq.isPrimitive(f)?String(f):"",c){let p=Ku.cursor.up(c)+Ku.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Ku.cursor.left(h)),p}if(f||e){let p=!a&&s?-s.length:-a.length+r;return e&&(p-=e.length),a===""&&s&&!n.includes(s)&&(p+=s.length),Ku.cursor.move(p)}}},oq=Ku.erase={screen:j0.screen,up:j0.up,down:j0.down,line:j0.line,lineEnd:j0.lineEnd,lineStart:j0.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return oq.line+wm.to(0);let r=n=>[...Tat.unstyle(n)].length,s=t.split(/\r?\n/),a=0;for(let n of s)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(oq.line+wm.prevLine()).repeat(a-1)+oq.line+wm.to(0)}});var nC=_((YHt,Zde)=>{"use strict";var Fat=Ie("events"),zde=Ju(),aq=Fde(),Nat=Ode(),Oat=Mde(),Lat=qde(),pl=Xo(),Bm=Kde(),lq=class t extends Fat{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,Lat(this),Nat(this),this.state=new Oat(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=Uat(this.options.margin),this.setMaxListeners(0),Mat(this)}async keypress(e,r={}){this.keypressed=!0;let s=aq.action(e,aq(e,r),this.options.actions);this.state.keypress=s,this.emit("keypress",e,s),this.emit("state",this.state.clone());let a=this.options[s.action]||this[s.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,s);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Bm.code.beep)}cursorHide(){this.stdout.write(Bm.cursor.hide()),pl.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Bm.cursor.show())}write(e){e&&(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Bm.cursor.down(e)+Bm.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:s}=this.sections(),{cursor:a,initial:n="",input:c="",value:f=""}=this,p=this.state.size=s.length,h={after:r,cursor:a,initial:n,input:c,prompt:e,size:p,value:f},E=Bm.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:s}=this.state;s=zde.unstyle(s);let a=zde.unstyle(e),n=a.indexOf(s),c=a.slice(0,n),p=a.slice(n).split(` `),h=p[0],E=p[p.length-1],S=(s+(r?" "+r:"")).length,b=Se.call(this,this.value),this.result=()=>s.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,s){let{options:a,state:n,symbols:c,timers:f}=this,p=f&&f[e];n.timer=p;let h=a[e]||n[e]||c[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let C=await this.resolve(E,n,r,s);return!C&&r&&r[e]?this.resolve(h,n,r,s):C}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,s=this.state;return s.timer=r,pl.isObject(e)&&(e=e[s.status]||e.pending),pl.hasColor(e)?e:(this.styles[s.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return pl.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,s=this.state;s.timer=r;let a=e[s.status]||e.pending||s.separator,n=await this.resolve(a,s);return pl.isObject(n)&&(n=n[s.status]||n.pending),pl.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let s=await this.element("pointer",e,r);if(typeof s=="string"&&pl.hasColor(s))return s;if(s){let a=this.styles,n=this.index===r,c=n?a.primary:h=>h,f=await this.resolve(s[n?"on":"off"]||s,this.state),p=pl.hasColor(f)?f:c(f);return n?p:" ".repeat(f.length)}}async indicator(e,r){let s=await this.element("indicator",e,r);if(typeof s=="string"&&pl.hasColor(s))return s;if(s){let a=this.styles,n=e.enabled===!0,c=n?a.success:a.dark,f=s[n?"on":"off"]||s;return pl.hasColor(f)?f:c(f)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return pl.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return pl.resolve(this,e,...r)}get base(){return t.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||pl.height(this.stdout,25)}get width(){return this.options.columns||pl.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,s=[r,e].find(this.isValue.bind(this));return this.isValue(s)?s:this.initial}static get prompt(){return e=>new this(e).run()}};function Mat(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],s=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?s.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function Uat(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` `:" ",s=[];for(let a=0;a<4;a++){let n=r(a);e[a]?s.push(n.repeat(e[a])):s.push("")}return s}Zde.exports=lq});var eme=_((VHt,$de)=>{"use strict";var _at=Xo(),Xde={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return Xde.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};$de.exports=(t,e={})=>{let r=_at.merge({},Xde,e.roles);return r[t]||r.default}});var Wv=_((JHt,nme)=>{"use strict";var Hat=Ju(),jat=nC(),Gat=eme(),KT=Xo(),{reorder:cq,scrollUp:qat,scrollDown:Wat,isObject:tme,swap:Yat}=KT,uq=class extends jat{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:s,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");tme(r)&&(r=Object.keys(r)),Array.isArray(r)?(s!=null&&(this.index=this.findIndex(s)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(s!=null&&(r=s),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let s=[],a=0,n=async(c,f)=>{typeof c=="function"&&(c=await c.call(this)),c instanceof Promise&&(c=await c);for(let p=0;p(this.state.loadingChoices=!1,c))}async toChoice(e,r,s){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=Gat(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,KT.define(e,"parent",s),e.level=s?s.level+1:1,e.indent==null&&(e.indent=s?s.indent+" ":e.indent||""),e.path=s?s.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,Hat.unstyle(e.message).length));let c={...e};return e.reset=(f=c.input,p=c.value)=>{for(let h of Object.keys(c))e[h]=c[h];e.input=f,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,s){let a=await this.toChoice(e,r,s);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,s){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,s);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let s=e.parent;for(;s;){let a=s.choices.filter(n=>this.isDisabled(n));s.enabled=a.every(n=>n.enabled===!0),s=s.parent}return rme(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=s=>{let a=Number(s);if(a>this.choices.length-1)return this.alert();let n=this.focused,c=this.choices.find(f=>a===f.index);if(!c.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(c)===-1){let f=cq(this.choices),p=f.indexOf(c);if(n.index>p){let h=f.slice(p,p+this.limit),E=f.filter(C=>!h.includes(C));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=f.slice(h).concat(f.slice(0,h))}}return this.index=this.choices.indexOf(c),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(s=>{let a=this.choices.length,n=this.num,c=(f=!1,p)=>{clearTimeout(this.numberTimeout),f&&(p=r(n)),this.num="",s(p)};if(n==="0"||n.length===1&&+(n+"0")>a)return c(!0);if(Number(n)>a)return c(!1,this.alert());this.numberTimeout=setTimeout(()=>c(!0),this.delay)})}home(){return this.choices=cq(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=cq(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===0?this.alert():e>r&&s===0?this.scrollUp():(this.index=(s-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,s=this.index;return this.options.scroll===!1&&s===r-1?this.alert():e>r&&s===r-1?this.scrollDown():(this.index=(s+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=qat(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=Wat(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){Yat(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(s=>e[s]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(s=>!this.isDisabled(s));return e.enabled&&r.every(s=>this.isEnabled(s))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((s,a)=>(s[a]=this.find(a,r),s),{})}filter(e,r){let a=typeof e=="function"?e:(f,p)=>[f.name,p].includes(e),c=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?c.map(f=>f[r]):c}find(e,r){if(tme(e))return r?e[r]:e;let a=typeof e=="function"?e:(c,f)=>[c.name,f].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(c=>c.newChoice))return this.alert();let{reorder:r,sort:s}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&s!==!0&&(n=KT.reorder(n)),this.value=a?n.map(c=>c.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(s=>s.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let s=this.find(r);s&&(this.initial=s.index,this.focus(s,!0))}}}get choices(){return rme(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:s}=this,a=e.limit||this._limit||r.limit||s.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function rme(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(KT.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let s=r.choices.filter(a=>!t.isDisabled(a));r.enabled=s.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}nme.exports=uq});var G0=_((KHt,ime)=>{"use strict";var Vat=Wv(),fq=Xo(),Aq=class extends Vat{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let s=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!fq.hasColor(s)&&(s=this.styles.strong(s)),this.resolve(s,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),c=await this.resolve(e.hint,this.state,e,r);c&&!fq.hasColor(c)&&(c=this.styles.muted(c));let f=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],f+a+n,p,this.margin[1],c].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(fq.hasColor(p)||(p=this.styles.disabled(p)),h()):(s&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,c)=>await this.renderChoice(n,c)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let s=this.margin[0]+r.join(` `),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,s].filter(Boolean).join(` `)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,s="",a=await this.header(),n=await this.prefix(),c=await this.separator(),f=await this.message();this.options.promptLine!==!1&&(s=[n,f,c,""].join(" "),this.state.prompt=s);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();p&&(s+=p),h&&!s.includes(h)&&(s+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(s+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,s,E,C].filter(Boolean).join(` `)),this.write(this.margin[2]),this.restore()}};ime.exports=Aq});var ome=_((zHt,sme)=>{"use strict";var Jat=G0(),Kat=(t,e)=>{let r=t.toLowerCase();return s=>{let n=s.toLowerCase().indexOf(r),c=e(s.slice(n,n+r.length));return n>=0?s.slice(0,n)+c+s.slice(n+r.length):s}},pq=class extends Jat{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:s}=this.state;return this.input=s.slice(0,r)+e+s.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let s=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(s))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=Kat(this.input,e),s=this.choices;this.choices=s.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=s}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};sme.exports=pq});var gq=_((ZHt,ame)=>{"use strict";var hq=Xo();ame.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:s="",pos:a,showCursor:n=!0,color:c}=e,f=c||t.styles.placeholder,p=hq.inverse(t.styles.primary),h=T=>p(t.styles.black(T)),E=r,C=" ",S=h(C);if(t.blink&&t.blink.off===!0&&(h=T=>T,S=""),n&&a===0&&s===""&&r==="")return h(C);if(n&&a===0&&(r===s||r===""))return h(s[0])+f(s.slice(1));s=hq.isPrimitive(s)?`${s}`:"",r=hq.isPrimitive(r)?`${r}`:"";let b=s&&s.startsWith(r)&&s!==r,I=b?h(s[r.length]):S;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),I=""),n===!1&&(I=""),b){let T=t.styles.unstyle(E+I);return E+I+f(s.slice(T.length))}return E+I}});var zT=_((XHt,lme)=>{"use strict";var zat=Ju(),Zat=G0(),Xat=gq(),dq=class extends Zat{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:s,input:a}=r;return r.value=r.input=a.slice(0,s)+e+a.slice(s),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:s}=e;return e.value=e.input=s.slice(0,r-1)+s.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:s}=e;if(s[r]===void 0)return this.alert();let a=`${s}`.slice(0,r)+`${s}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:s}=e;return r&&r.startsWith(s)&&s!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let s=await this.resolve(e.separator,this.state,e,r)||":";return s?" "+this.styles.disabled(s):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:s,styles:a}=this,{cursor:n,initial:c="",name:f,hint:p,input:h=""}=e,{muted:E,submitted:C,primary:S,danger:b}=a,I=p,T=this.index===r,N=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),W=e.message;this.align==="right"&&(W=W.padStart(this.longest+1," ")),this.align==="left"&&(W=W.padEnd(this.longest+1," "));let ee=this.values[f]=h||c,ie=h?"success":"dark";await N.call(e,ee,this.state)!==!0&&(ie="danger");let ue=a[ie],le=ue(await this.indicator(e,r))+(e.pad||""),me=this.indent(e),pe=()=>[me,le,W+U,h,I].filter(Boolean).join(" ");if(s.submitted)return W=zat.unstyle(W),h=C(h),I="",pe();if(e.format)h=await e.format.call(this,h,e,r);else{let Be=this.styles.muted;h=Xat(this,{input:h,initial:c,pos:n,showCursor:T,color:Be})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[f]=await e.result.call(this,ee,e,r)),T&&(W=S(W)),e.error?h+=(h?" ":"")+b(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),pe()}async submit(){return this.value=this.values,super.base.submit.call(this)}};lme.exports=dq});var mq=_(($Ht,ume)=>{"use strict";var $at=zT(),elt=()=>{throw new Error("expected prompt to have a custom authenticate method")},cme=(t=elt)=>{class e extends $at{constructor(s){super(s)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(s){return cme(s)}}return e};ume.exports=cme()});var pme=_((ejt,Ame)=>{"use strict";var tlt=mq();function rlt(t,e){return t.username===this.options.username&&t.password===this.options.password}var fme=(t=rlt)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(s){return this.options.showPassword?s:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(s.length))}}];class r extends tlt.create(t){constructor(a){super({...a,choices:e})}static create(a){return fme(a)}}return r};Ame.exports=fme()});var ZT=_((tjt,hme)=>{"use strict";var nlt=nC(),{isPrimitive:ilt,hasColor:slt}=Xo(),yq=class extends nlt{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:s}=this;return s.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return ilt(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return slt(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=this.styles.muted(this.default),f=[s,n,c,a].filter(Boolean).join(" ");this.state.prompt=f;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),C=await this.error()||await this.hint(),S=await this.footer();C&&!f.includes(C)&&(E+=" "+C),f+=" "+E,this.clear(r),this.write([p,f,S].filter(Boolean).join(` `)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};hme.exports=yq});var dme=_((rjt,gme)=>{"use strict";var olt=ZT(),Eq=class extends olt{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};gme.exports=Eq});var yme=_((njt,mme)=>{"use strict";var alt=G0(),llt=zT(),iC=llt.prototype,Iq=class extends alt{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let s=this.focused,a=s.parent||{};return!s.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():iC.dispatch.call(this,e,r)}append(e,r){return iC.append.call(this,e,r)}delete(e,r){return iC.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?iC.next.call(this):super.next()}prev(){return this.focused.editable?iC.prev.call(this):super.prev()}async indicator(e,r){let s=e.indicator||"",a=e.editable?s:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?iC.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let s=r.parent?this.value[r.parent.name]:this.value;if(r.editable?s=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(s=r.enabled===!0),e=await r.validate(s,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};mme.exports=Iq});var vm=_((ijt,Eme)=>{"use strict";var clt=nC(),ult=gq(),{isPrimitive:flt}=Xo(),Cq=class extends clt{constructor(e){super(e),this.initial=flt(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let s=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!s||s.name!=="return")?this.append(` `,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:s}=this.state;this.input=`${s}`.slice(0,r)+e+`${s}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),s=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=s,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):ult(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),s=await this.separator(),a=await this.message(),n=[r,a,s].filter(Boolean).join(" ");this.state.prompt=n;let c=await this.header(),f=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!f.includes(p)&&(f+=" "+p),n+=" "+f,this.clear(e),this.write([c,n,h].filter(Boolean).join(` `)),this.restore()}};Eme.exports=Cq});var Cme=_((sjt,Ime)=>{"use strict";var Alt=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),XT=t=>Alt(t).filter(Boolean);Ime.exports=(t,e={},r="")=>{let{past:s=[],present:a=""}=e,n,c;switch(t){case"prev":case"undo":return n=s.slice(0,s.length-1),c=s[s.length-1]||"",{past:XT([r,...n]),present:c};case"next":case"redo":return n=s.slice(1),c=s[0]||"",{past:XT([...n,r]),present:c};case"save":return{past:XT([...s,r]),present:""};case"remove":return c=XT(s.filter(f=>f!==r)),a="",c.length&&(a=c.pop()),{past:c,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var Bq=_((ojt,Bme)=>{"use strict";var plt=vm(),wme=Cme(),wq=class extends plt{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let s=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:s},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=wme(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=wme("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};Bme.exports=wq});var Sme=_((ajt,vme)=>{"use strict";var hlt=vm(),vq=class extends hlt{format(){return""}};vme.exports=vq});var Pme=_((ljt,Dme)=>{"use strict";var glt=vm(),Sq=class extends glt{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};Dme.exports=Sq});var xme=_((cjt,bme)=>{"use strict";var dlt=G0(),Dq=class extends dlt{constructor(e){super({...e,multiple:!0})}};bme.exports=Dq});var bq=_((ujt,kme)=>{"use strict";var mlt=vm(),Pq=class extends mlt{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,s=this.toNumber(this.input);return s>this.max+r?this.alert():(this.input=`${s+r}`,this.render())}down(e){let r=e||this.minor,s=this.toNumber(this.input);return sthis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};kme.exports=Pq});var Rme=_((fjt,Qme)=>{Qme.exports=bq()});var Fme=_((Ajt,Tme)=>{"use strict";var ylt=vm(),xq=class extends ylt{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Tme.exports=xq});var Lme=_((pjt,Ome)=>{"use strict";var Elt=Ju(),Ilt=Wv(),Nme=Xo(),kq=class extends Ilt{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((s,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let s=0;s=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(s=>` ${s.name} - ${s.message}`)].map(s=>this.styles.muted(s)).join(` `)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let s=this.scaleLength-r.join("").length,a=Math.round(s/(r.length-1)),c=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),f=" ".repeat(this.widths[0]);return this.margin[3]+f+this.margin[1]+c}scaleIndicator(e,r,s){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,s);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let s=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return s.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!Nme.hasColor(n)&&(n=this.styles.muted(n));let c=I=>this.margin[3]+I.replace(/\s+$/,"").padEnd(this.widths[0]," "),f=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),C=this.margin[1]+this.margin[3];this.scaleLength=Elt.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-C.length);let b=Nme.wordWrap(h,{width:this.widths[0],newline:f}).split(` `).map(I=>c(I)+this.margin[1]);return s&&(E=this.styles.info(E),b=b.map(I=>this.styles.info(I))),b[0]+=E,this.linebreak&&b.push(""),[p+a,b.join(` `)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),s=await this.renderScaleHeading();return this.margin[0]+[s,...r.map(a=>a.join(" "))].join(` `)}async render(){let{submitted:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c="";this.options.promptLine!==!1&&(c=[s,n,a,""].join(" "),this.state.prompt=c);let f=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),C=await this.renderChoices(),S=await this.footer(),b=this.emptyError;p&&(c+=p),E&&!c.includes(E)&&(c+=" "+E),e&&!p&&!C.trim()&&this.multiple&&b!=null&&(c+=this.styles.danger(b)),this.clear(r),this.write([f,c,h,C,S].filter(Boolean).join(` `)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Ome.exports=kq});var _me=_((hjt,Ume)=>{"use strict";var Mme=Ju(),Clt=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",Rq=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Clt(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},wlt=async(t={},e={},r=s=>s)=>{let s=new Set,a=t.fields||[],n=t.template,c=[],f=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,C=()=>n[++E],S=()=>n[E+1],b=I=>{I.line=h,c.push(I)};for(b({type:"bos",value:""});Eie.name===U.key);U.field=a.find(ie=>ie.name===U.key),ee||(ee=new Rq(U),f.push(ee)),ee.lines.push(U.line-1);continue}let T=c[c.length-1];T.type==="text"&&T.line===h?T.value+=I:b({type:"text",value:I})}return b({type:"eos",value:""}),{input:n,tabstops:c,unique:s,keys:p,items:f}};Ume.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),s={...e.values,...e.initial},{tabstops:a,items:n,keys:c}=await wlt(e,s),f=Qq("result",t,e),p=Qq("format",t,e),h=Qq("validate",t,e,!0),E=t.isValue.bind(t);return async(C={},S=!1)=>{let b=0;C.required=r,C.items=n,C.keys=c,C.output="";let I=async(W,ee,ie,ue)=>{let le=await h(W,ee,ie,ue);return le===!1?"Invalid field "+ie.name:le};for(let W of a){let ee=W.value,ie=W.key;if(W.type!=="template"){ee&&(C.output+=ee);continue}if(W.type==="template"){let ue=n.find(Ce=>Ce.name===ie);e.required===!0&&C.required.add(ue.name);let le=[ue.input,C.values[ue.value],ue.value,ee].find(E),pe=(ue.field||{}).message||W.inner;if(S){let Ce=await I(C.values[ie],C,ue,b);if(Ce&&typeof Ce=="string"||Ce===!1){C.invalid.set(ie,Ce);continue}C.invalid.delete(ie);let g=await f(C.values[ie],C,ue,b);C.output+=Mme.unstyle(g);continue}ue.placeholder=!1;let Be=ee;ee=await p(ee,C,ue,b),le!==ee?(C.values[ie]=le,ee=t.styles.typing(le),C.missing.delete(pe)):(C.values[ie]=void 0,le=`<${pe}>`,ee=t.styles.primary(le),ue.placeholder=!0,C.required.has(ie)&&C.missing.add(pe)),C.missing.has(pe)&&C.validating&&(ee=t.styles.warning(le)),C.invalid.has(ie)&&C.validating&&(ee=t.styles.danger(le)),b===C.index&&(Be!==ee?ee=t.styles.underline(ee):ee=t.styles.heading(Mme.unstyle(ee))),b++}ee&&(C.output+=ee)}let T=C.output.split(` `).map(W=>" "+W),N=n.length,U=0;for(let W of n)C.invalid.has(W.name)&&W.lines.forEach(ee=>{T[ee][0]===" "&&(T[ee]=C.styles.danger(C.symbols.bullet)+T[ee].slice(1))}),t.isValue(C.values[W.name])&&U++;return C.completed=(U/N*100).toFixed(0),C.output=T.join(` `),C.output}};function Qq(t,e,r,s){return(a,n,c,f)=>typeof c.field[t]=="function"?c.field[t].call(e,a,n,c,f):[s,a].find(p=>e.isValue(p))}});var jme=_((gjt,Hme)=>{"use strict";var Blt=Ju(),vlt=_me(),Slt=nC(),Tq=class extends Slt{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await vlt(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let s=this.getItem(),a=s.input.slice(0,this.cursor),n=s.input.slice(this.cursor);this.input=s.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),s=e.input.slice(0,this.cursor-1);this.input=e.input=`${s}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:s,size:a}=this.state,n=[this.options.newline,` `].find(W=>W!=null),c=await this.prefix(),f=await this.separator(),p=await this.message(),h=[c,p,f].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),C=await this.error()||"",S=await this.hint()||"",b=s?"":await this.interpolate(this.state),I=this.state.key=r[e]||"",T=await this.format(I),N=await this.footer();T&&(h+=" "+T),S&&!T&&this.state.completed===0&&(h+=" "+S),this.clear(a);let U=[E,h,b,N,C.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:s,index:a}=this.state,n=r.find(c=>c.name===s[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:s,values:a}=this.state;if(e.size){let f="";for(let[p,h]of e)f+=`Invalid ${p}: ${h} `;return this.state.error=f,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let c=Blt.unstyle(s).split(` `).map(f=>f.slice(1)).join(` `);return this.value={values:a,result:c},super.submit()}};Hme.exports=Tq});var qme=_((djt,Gme)=>{"use strict";var Dlt="(Use + to sort)",Plt=G0(),Fq=class extends Plt{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Dlt].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let s=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+s:n+s}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Gme.exports=Fq});var Yme=_((mjt,Wme)=>{"use strict";var blt=Wv(),Nq=class extends blt{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(s=>this.styles.muted(s)),this.state.header=r.join(` `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let s of r)s.scale=xlt(5,this.options),s.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],s=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!s,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let s=this.index===r,a=this.term==="Hyper",n=a?9:8,c=a?"":" ",f=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=ee=>(ee?this.styles.success("\u25C9"):"\u25EF")+c,E=r+1+".",C=s?this.styles.heading:this.styles.noop,S=await this.resolve(e.message,this.state,e,r),b=this.indent(e),I=b+e.scale.map((ee,ie)=>h(ie===e.scaleIdx)).join(f),T=ee=>ee===e.scaleIdx?C(ee):ee,N=b+e.scale.map((ee,ie)=>T(ie)).join(p),U=()=>[E,S].filter(Boolean).join(" "),W=()=>[U(),I,N," "].filter(Boolean).join(` `);return s&&(I=this.styles.cyan(I),N=this.styles.cyan(N)),W()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(s,a)=>await this.renderChoice(s,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` `)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,s=await this.prefix(),a=await this.separator(),n=await this.message(),c=[s,n,a].filter(Boolean).join(" ");this.state.prompt=c;let f=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),C=await this.footer();(p||!h)&&(c+=" "+p),h&&!c.includes(h)&&(c+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(c+=this.styles.danger(this.emptyError)),this.clear(r),this.write([c,f,E,C].filter(Boolean).join(` `)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function xlt(t,e={}){if(Array.isArray(e.scale))return e.scale.map(s=>({...s}));let r=[];for(let s=1;s{Vme.exports=Bq()});var zme=_((Ejt,Kme)=>{"use strict";var klt=ZT(),Oq=class extends klt{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=s=>this.styles.primary.underline(s);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),s=await this.prefix(),a=await this.separator(),n=await this.message(),c=await this.format(),f=await this.error()||await this.hint(),p=await this.footer(),h=[s,n,a,c].join(" ");this.state.prompt=h,f&&!h.includes(f)&&(h+=" "+f),this.clear(e),this.write([r,h,p].filter(Boolean).join(` `)),this.write(this.margin[2]),this.restore()}};Kme.exports=Oq});var Xme=_((Ijt,Zme)=>{"use strict";var Qlt=G0(),Lq=class extends Qlt{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let s=await super.toChoices(e,r);if(s.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>s.length)throw new Error("Please specify the index of the correct answer from the list of choices");return s}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Zme.exports=Lq});var eye=_(Mq=>{"use strict";var $me=Xo(),ks=(t,e)=>{$me.defineExport(Mq,t,e),$me.defineExport(Mq,t.toLowerCase(),e)};ks("AutoComplete",()=>ome());ks("BasicAuth",()=>pme());ks("Confirm",()=>dme());ks("Editable",()=>yme());ks("Form",()=>zT());ks("Input",()=>Bq());ks("Invisible",()=>Sme());ks("List",()=>Pme());ks("MultiSelect",()=>xme());ks("Numeral",()=>Rme());ks("Password",()=>Fme());ks("Scale",()=>Lme());ks("Select",()=>G0());ks("Snippet",()=>jme());ks("Sort",()=>qme());ks("Survey",()=>Yme());ks("Text",()=>Jme());ks("Toggle",()=>zme());ks("Quiz",()=>Xme())});var rye=_((wjt,tye)=>{tye.exports={ArrayPrompt:Wv(),AuthPrompt:mq(),BooleanPrompt:ZT(),NumberPrompt:bq(),StringPrompt:vm()}});var Vv=_((Bjt,iye)=>{"use strict";var nye=Ie("assert"),_q=Ie("events"),q0=Xo(),zu=class extends _q{constructor(e,r){super(),this.options=q0.merge({},e),this.answers={...r}}register(e,r){if(q0.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}nye.equal(typeof r,"function","expected a function");let s=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[s]=r:this.prompts[s]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(q0.merge({},this.options,r))}catch(s){return Promise.reject(s)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=q0.merge({},this.options,e),{type:s,name:a}=e,{set:n,get:c}=q0;if(typeof s=="function"&&(s=await s.call(this,e,this.answers)),!s)return this.answers[a];nye(this.prompts[s],`Prompt "${s}" is not registered`);let f=new this.prompts[s](r),p=c(this.answers,a);f.state.answers=this.answers,f.enquirer=this,a&&f.on("submit",E=>{this.emit("answer",a,E,f),n(this.answers,a,E)});let h=f.emit.bind(f);return f.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",f,this),r.autofill&&p!=null?(f.value=f.input=p,r.autofill==="show"&&await f.submit()):p=f.value=await f.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||nC()}static get prompts(){return eye()}static get types(){return rye()}static get prompt(){let e=(r,...s)=>{let a=new this(...s),n=a.emit.bind(a);return a.emit=(...c)=>(e.emit(...c),n(...c)),a.prompt(r)};return q0.mixinEmitter(e,new _q),e}};q0.mixinEmitter(zu,new _q);var Uq=zu.prompts;for(let t of Object.keys(Uq)){let e=t.toLowerCase(),r=s=>new Uq[t](s).run();zu.prompt[e]=r,zu[e]=r,zu[t]||Reflect.defineProperty(zu,t,{get:()=>Uq[t]})}var Yv=t=>{q0.defineExport(zu,t,()=>zu.types[t])};Yv("ArrayPrompt");Yv("AuthPrompt");Yv("BooleanPrompt");Yv("NumberPrompt");Yv("StringPrompt");iye.exports=zu});var Aye=_((Y6t,_lt)=>{_lt.exports={name:"@yarnpkg/cli",version:"4.10.3",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-catalog":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-jsr":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^4.0.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-jsr","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools","@yarnpkg/plugin-catalog"]}},repository:{type:"git",url:"git+https://github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var t5=_((v9t,vye)=>{"use strict";vye.exports=function(e,r){r===!0&&(r=0);var s="";if(typeof e=="string")try{s=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(s=e.protocol);var a=s.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var Dye=_((S9t,Sye)=>{"use strict";var oct=t5();function act(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=oct(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}Sye.exports=act});var xye=_((D9t,bye)=>{"use strict";var lct=Dye();function cct(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var uct=cct(lct),fct="text/plain",Act="us-ascii",Pye=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),pct=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:s,data:a,hash:n}=r.groups,c=s.split(";");n=e?"":n;let f=!1;c[c.length-1]==="base64"&&(c.pop(),f=!0);let p=(c.shift()||"").toLowerCase(),E=[...c.map(C=>{let[S,b=""]=C.split("=").map(I=>I.trim());return S==="charset"&&(b=b.toLowerCase(),b===Act)?"":`${S}${b?`=${b}`:""}`}).filter(Boolean)];return f&&E.push("base64"),(E.length>0||p&&p!==fct)&&E.unshift(p),`data:${E.join(";")},${f?a.trim():a}${n?`#${n}`:""}`};function hct(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return pct(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let c=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,f=0,p="";for(;;){let E=c.exec(a.pathname);if(!E)break;let C=E[0],S=E.index,b=a.pathname.slice(f,S);p+=b.replace(/\/{2,}/g,"/"),p+=C,f=S+C.length}let h=a.pathname.slice(f,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let c=a.pathname.split("/"),f=c[c.length-1];Pye(f,e.removeDirectoryIndex)&&(c=c.slice(0,-1),a.pathname=c.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let c of[...a.searchParams.keys()])Pye(c,e.removeQueryParameters)&&a.searchParams.delete(c);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var r5=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,s=n=>{let c=new Error(n);throw c.subject_url=t,c};(typeof t!="string"||!t.trim())&&s("Invalid url."),t.length>r5.MAX_INPUT_LENGTH&&s("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=hct(t,e));let a=uct.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):s("URL parsing failed.")}return a};r5.MAX_INPUT_LENGTH=2048;bye.exports=r5});var Rye=_((P9t,Qye)=>{"use strict";var gct=t5();function kye(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=gct(t);if(t=t.substring(t.indexOf("://")+3),kye(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var dct=xye(),Tye=Rye();function mct(t){var e=dct(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),Tye(e.protocols)||e.protocols.length===0&&Tye(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}Fye.exports=mct});var Lye=_((x9t,Oye)=>{"use strict";var yct=Nye();function n5(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=yct(t),s=r.resource.split("."),a=null;switch(r.toString=function(N){return n5.stringify(this,N)},r.source=s.length>2?s.slice(1-s.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=s[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var c=a.indexOf("-",2),f=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),C=a.indexOf("raw",2),S=a.indexOf("edit",2);n=c>0?c-1:f>0?f-1:p>0?p-1:h>0?h-1:E>0?E-1:C>0?C-1:S>0?S-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var b=a.length>n&&a[n+1]==="-"?n+1:n;a.length>b+2&&["raw","src","blob","tree","edit"].indexOf(a[b+1])>=0&&(r.filepathtype=a[b+1],r.ref=a[b+2],a.length>b+3&&(r.filepath=a.slice(b+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var I=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,T=I.exec(r.pathname);return T!=null&&(r.source="bitbucket-server",T[1]==="users"?r.owner="~"+T[2]:r.owner=T[2],r.organization=r.owner,r.name=T[3],a=T[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}n5.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",s=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+s+"@"+t.resource+r+"/"+t.full_name+a:s+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+s+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?Ect(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+Ict(t)+a;default:return t.href}};function Ect(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function Ict(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}Oye.exports=n5});function Fct(t,e){return e===1&&Tct.has(t[0])}function nS(t){let e=Array.isArray(t)?t:Mu(t);return e.map((s,a)=>Qct.test(s)?`[${s}]`:Rct.test(s)&&!Fct(e,a)?`.${s}`:`[${JSON.stringify(s)}]`).join("").replace(/^\./,"")}function Nct(t,e){let r=[];if(e.methodName!==null&&r.push(he.pretty(t,e.methodName,he.Type.CODE)),e.file!==null){let s=[];s.push(he.pretty(t,e.file,he.Type.PATH)),e.line!==null&&(s.push(he.pretty(t,e.line,he.Type.NUMBER)),e.column!==null&&s.push(he.pretty(t,e.column,he.Type.NUMBER))),r.push(`(${s.join(he.pretty(t,":","grey"))})`)}return r.join(" ")}function nF(t,{manifestUpdates:e,reportedErrors:r},{fix:s}={}){let a=new Map,n=new Map,c=[...r.keys()].map(f=>[f,new Map]);for(let[f,p]of[...c,...e]){let h=r.get(f)?.map(b=>({text:b,fixable:!1}))??[],E=!1,C=t.getWorkspaceByCwd(f),S=C.manifest.exportTo({});for(let[b,I]of p){if(I.size>1){let T=[...I].map(([N,U])=>{let W=he.pretty(t.configuration,N,he.Type.INSPECT),ee=U.size>0?Nct(t.configuration,U.values().next().value):null;return ee!==null?` ${W} at ${ee}`:` ${W}`}).join("");h.push({text:`Conflict detected in constraint targeting ${he.pretty(t.configuration,b,he.Type.CODE)}; conflicting values are:${T}`,fixable:!1})}else{let[[T]]=I,N=va(S,b);if(JSON.stringify(N)===JSON.stringify(T))continue;if(!s){let U=typeof N>"u"?`Missing field ${he.pretty(t.configuration,b,he.Type.CODE)}; expected ${he.pretty(t.configuration,T,he.Type.INSPECT)}`:typeof T>"u"?`Extraneous field ${he.pretty(t.configuration,b,he.Type.CODE)} currently set to ${he.pretty(t.configuration,N,he.Type.INSPECT)}`:`Invalid field ${he.pretty(t.configuration,b,he.Type.CODE)}; expected ${he.pretty(t.configuration,T,he.Type.INSPECT)}, found ${he.pretty(t.configuration,N,he.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof T>"u"?A0(S,b):Jd(S,b,T),E=!0}E&&a.set(C,S)}h.length>0&&n.set(C,h)}return{changedWorkspaces:a,remainingErrors:n}}function Zye(t,{configuration:e}){let r={children:[]};for(let[s,a]of t){let n=[];for(let f of a){let p=f.text.split(/\n/);f.fixable&&(p[0]=`${he.pretty(e,"\u2699","gray")} ${p[0]}`),n.push({value:he.tuple(he.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:he.tuple(he.Type.NO_HINT,h)}))})}let c={value:he.tuple(he.Type.LOCATOR,s.anchoredLocator),children:je.sortMap(n,f=>f.value[1])};r.children.push(c)}return r.children=je.sortMap(r.children,s=>s.value[1]),r}var WC,Qct,Rct,Tct,iS=Ze(()=>{Ge();ql();WC=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let s=Object.hasOwn(e,r)?e[r]:void 0;if(typeof s>"u")continue;je.getArrayWithDefault(this.indexes[r],s).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let s=[],a;for(let[c,f]of r){let p=c,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){s.push([p,f]);continue}let E=new Set(h.get(f)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let C of a)E.has(C)||a.delete(C);if(a.size===0)break}let n=[...a??[]];return s.length>0&&(n=n.filter(c=>{for(let[f,p]of s)if(!(typeof p<"u"?Object.hasOwn(c,f)&&c[f]===p:Object.hasOwn(c,f)===!1))return!1;return!0})),n}},Qct=/^[0-9]+$/,Rct=/^[a-zA-Z0-9_]+$/,Tct=new Set(["scripts",...Ut.allDependencies])});var Xye=_((CYt,m5)=>{var Oct;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(!t.type.is_variable(f)&&!t.type.is_integer(f))s.throw_error(t.error.type("integer",f,n.indicator));else if(t.type.is_integer(f)&&f.value<0)s.throw_error(t.error.domain("not_less_than_zero",f,n.indicator));else{var p=new t.type.Term("length",[c,new t.type.Num(0,!1),f]);t.type.is_integer(f)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),s.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(f))s.throw_error(t.error.type("integer",f,n.indicator));else if(f.value<0)s.throw_error(t.error.domain("not_less_than_zero",f,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;C--)E[C].equals(E[C-1])&&E.splice(C,1);for(var S=new t.type.Term("[]"),C=E.length-1;C>=0;C--)S=new t.type.Term(".",[E[C],S]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[S,f])),a.substitution,a)])}}},"msort/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type("list",f,n.indicator));else{for(var p=[],h=c;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))s.throw_error(t.error.type("list",c,n.indicator));else{for(var E=p.sort(t.compare),C=new t.type.Term("[]"),S=E.length-1;S>=0;S--)C=new t.type.Term(".",[E[S],C]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[C,f])),a.substitution,a)])}}},"keysort/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type("list",f,n.indicator));else{for(var p=[],h,E=c;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){s.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){s.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))s.throw_error(t.error.type("list",c,n.indicator));else{for(var C=p.sort(t.compare),S=new t.type.Term("[]"),b=C.length-1;b>=0;b--)S=new t.type.Term(".",[new t.type.Term("-",[C[b],C[b].pair]),S]),delete C[b].pair;s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[S,f])),a.substitution,a)])}}},"take/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f)||t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(f))s.throw_error(t.error.type("list",f,n.indicator));else if(!t.type.is_integer(c))s.throw_error(t.error.type("integer",c,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type("list",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator==="./2";)E.push(C.args[0]),C=C.args[1],h--;if(h===0){for(var S=new t.type.Term("[]"),h=E.length-1;h>=0;h--)S=new t.type.Term(".",[E[h],S]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[S,p])),a.substitution,a)])}}},"drop/3":function(s,a,n){var c=n.args[0],f=n.args[1],p=n.args[2];if(t.type.is_variable(f)||t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(f))s.throw_error(t.error.type("list",f,n.indicator));else if(!t.type.is_integer(c))s.throw_error(t.error.type("integer",c,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))s.throw_error(t.error.type("list",p,n.indicator));else{for(var h=c.value,E=[],C=f;h>0&&C.indicator==="./2";)E.push(C.args[0]),C=C.args[1],h--;h===0&&s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[C,p])),a.substitution,a)])}},"reverse/2":function(s,a,n){var c=n.args[0],f=n.args[1],p=t.type.is_instantiated_list(c),h=t.type.is_instantiated_list(f);if(t.type.is_variable(c)&&t.type.is_variable(f))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(c)&&!t.type.is_fully_list(c))s.throw_error(t.error.type("list",c,n.indicator));else if(!t.type.is_variable(f)&&!t.type.is_fully_list(f))s.throw_error(t.error.type("list",f,n.indicator));else if(!p&&!h)s.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?c:f,C=new t.type.Term("[]",[]);E.indicator==="./2";)C=new t.type.Term(".",[E.args[0],C]),E=E.args[1];s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[C,p?f:c])),a.substitution,a)])}},"list_to_set/2":function(s,a,n){var c=n.args[0],f=n.args[1];if(t.type.is_variable(c))s.throw_error(t.error.instantiation(n.indicator));else{for(var p=c,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))s.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")s.throw_error(t.error.type("list",c,n.indicator));else{for(var E=[],C=new t.type.Term("[]",[]),S,b=0;b=0;b--)C=new t.type.Term(".",[E[b],C]);s.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[f,C])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof m5<"u"?m5.exports=function(s){t=s,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(Oct)});var pEe=_($r=>{"use strict";var Pm=process.platform==="win32",y5="aes-256-cbc",Lct="sha256",tEe="The current environment doesn't support interactive reading from TTY.",si=Ie("fs"),$ye=process.binding("tty_wrap").TTY,I5=Ie("child_process"),V0=Ie("path"),C5={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Zp="none",Xu,VC,eEe=!1,Y0,sF,E5,Mct=0,D5="",Dm=[],oF,rEe=!1,w5=!1,sS=!1;function nEe(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(s){return"#"+s.charCodeAt(0)+";"})}return sF.concat(function(r){var s=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&s.push("--"+a):r[a]==="string"&&t[a]&&s.push("--"+a,e(t[a]))}),s}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function Uct(t,e){function r(U){var W,ee="",ie;for(E5=E5||Ie("os").tmpdir();;){W=V0.join(E5,U+ee);try{ie=si.openSync(W,"wx")}catch(ue){if(ue.code==="EEXIST"){ee++;continue}else throw ue}si.closeSync(ie);break}return W}var s,a,n,c={},f,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),C=r("readline-sync.exit"),S=r("readline-sync.done"),b=Ie("crypto"),I,T,N;I=b.createHash(Lct),I.update(""+process.pid+Mct+++Math.random()),N=I.digest("hex"),T=b.createDecipher(y5,N),s=nEe(t),Pm?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+Y0+"%Q%"+s.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+C+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+y5+"%Q% %Q%"+N+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+S+"%Q%"]):(a="/bin/sh",n=["-c",'("'+Y0+'"'+s.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+C+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+y5+'" "'+N+'" >"'+h+'"; echo 1 >"'+S+'"']),sS&&sS("_execFileSync",s);try{I5.spawn(a,n,e)}catch(U){c.error=new Error(U.message),c.error.method="_execFileSync - spawn",c.error.program=a,c.error.args=n}for(;si.readFileSync(S,{encoding:t.encoding}).trim()!=="1";);return(f=si.readFileSync(C,{encoding:t.encoding}).trim())==="0"?c.input=T.update(si.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+T.final(t.encoding):(p=si.readFileSync(E,{encoding:t.encoding}).trim(),c.error=new Error(tEe+(p?` `+p:"")),c.error.method="_execFileSync",c.error.program=a,c.error.args=n,c.error.extMessage=p,c.error.exitCode=+f),si.unlinkSync(h),si.unlinkSync(E),si.unlinkSync(C),si.unlinkSync(S),c}function _ct(t){var e,r={},s,a={env:process.env,encoding:t.encoding};if(Y0||(Pm?process.env.PSModulePath?(Y0="powershell.exe",sF=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(Y0="cscript.exe",sF=["//nologo",__dirname+"\\read.cs.js"]):(Y0="/bin/sh",sF=[__dirname+"/read.sh"])),Pm&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),I5.execFileSync){e=nEe(t),sS&&sS("execFileSync",e);try{r.input=I5.execFileSync(Y0,e,a)}catch(n){s=n.stderr?(n.stderr+"").trim():"",r.error=new Error(tEe+(s?` `+s:"")),r.error.method="execFileSync",r.error.program=Y0,r.error.args=e,r.error.extMessage=s,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=Uct(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function B5(t){var e="",r=t.display,s=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=_ct(t);if(n.error)throw n.error;return n.input}return w5&&w5(t),function(){var n,c,f;function p(){return n||(n=process.binding("fs"),c=process.binding("constants")),n}if(typeof Zp=="string")if(Zp=null,Pm){if(f=function(h){var E=h.replace(/^\D+/,"").split("."),C=0;return(E[0]=+E[0])&&(C+=E[0]*1e4),(E[1]=+E[1])&&(C+=E[1]*100),(E[2]=+E[2])&&(C+=E[2]),C}(process.version),!(f>=20302&&f<40204||f>=5e4&&f<50100||f>=50600&&f<60200)&&process.stdin.isTTY)process.stdin.pause(),Zp=process.stdin.fd,VC=process.stdin._handle;else try{Zp=p().open("CONIN$",c.O_RDWR,parseInt("0666",8)),VC=new $ye(Zp,!0)}catch{}if(process.stdout.isTTY)Xu=process.stdout.fd;else{try{Xu=si.openSync("\\\\.\\CON","w")}catch{}if(typeof Xu!="number")try{Xu=p().open("CONOUT$",c.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Zp=si.openSync("/dev/tty","r"),VC=process.stdin._handle}catch{}}else try{Zp=si.openSync("/dev/tty","r"),VC=new $ye(Zp,!1)}catch{}if(process.stdout.isTTY)Xu=process.stdout.fd;else try{Xu=si.openSync("/dev/tty","w")}catch{}}}(),function(){var n,c,f=!t.hideEchoBack&&!t.keyIn,p,h,E,C,S;oF="";function b(I){return I===eEe?!0:VC.setRawMode(I)!==0?!1:(eEe=I,!0)}if(rEe||!VC||typeof Xu!="number"&&(t.display||!f)){e=a();return}if(t.display&&(si.writeSync(Xu,t.display),t.display=""),!t.displayOnly){if(!b(!f)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(c=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=si.readSync(Zp,p,0,h)}catch(I){if(I.code!=="EOF"){b(!1),e+=a();return}}if(E>0?(C=p.toString(t.encoding,0,E),oF+=C):(C=` `,oF+="\0"),C&&typeof(S=(C.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(C=S,n=!0),C&&(C=C.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),C&&c&&(C=C.replace(c,"")),C&&(f||(t.hideEchoBack?t.mask&&si.writeSync(Xu,new Array(C.length+1).join(t.mask)):si.writeSync(Xu,C)),e+=C),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!f&&!s&&si.writeSync(Xu,` `),b(!1)}}(),t.print&&!s&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` `),t.encoding),t.displayOnly?"":D5=t.keepWhitespace||t.keyIn?e:e.trim()}function Hct(t,e){var r=[];function s(a){a!=null&&(Array.isArray(a)?a.forEach(s):(!e||e(a))&&r.push(a))}return s(t),r}function P5(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function Vs(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(C5),t.unshift(C5))),t.reduce(function(s,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var c;if(a.hasOwnProperty(n))switch(c=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":c=c!=null?c+"":"",c&&n!=="limitMessage"&&(c=c.replace(/[\r\n]/g,"")),s[n]=c;break;case"bufferSize":!isNaN(c=parseInt(c,10))&&typeof c=="number"&&(s[n]=c);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":s[n]=!!c;break;case"limit":case"trueValue":case"falseValue":s[n]=Hct(c,function(f){var p=typeof f;return p==="string"||p==="number"||p==="function"||f instanceof RegExp}).map(function(f){return typeof f=="string"?f.replace(/[\r\n]/g,""):f});break;case"print":case"phContent":case"preCheck":s[n]=typeof c=="function"?c:void 0;break;case"prompt":case"display":s[n]=c??"";break}})),s},{})}function v5(t,e,r){return e.some(function(s){var a=typeof s;return a==="string"?r?t===s:t.toLowerCase()===s.toLowerCase():a==="number"?parseFloat(t)===s:a==="function"?s(t):s instanceof RegExp?s.test(t):!1})}function b5(t,e){var r=V0.normalize(Pm?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=V0.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+P5(r)+"(?=\\/|\\\\|$)",Pm?"i":""),"~")}function JC(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",s=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(c,f,p,h,E,C){var S;return f||typeof(S=e(E))!="string"?p:S?(h||"")+S+(C||""):""}return t.replace(s,n).replace(a,n)}function iEe(t,e,r){var s,a=[],n=-1,c=0,f="",p;function h(E,C){return C.length>3?(E.push(C[0]+"..."+C[C.length-1]),p=!0):C.length&&(E=E.concat(C)),E}return s=t.reduce(function(E,C){return E.concat((C+"").split(""))},[]).reduce(function(E,C){var S,b;return e||(C=C.toLowerCase()),S=/^\d$/.test(C)?1:/^[A-Z]$/.test(C)?2:/^[a-z]$/.test(C)?3:0,r&&S===0?f+=C:(b=C.charCodeAt(0),S&&S===n&&b===c+1?a.push(C):(E=h(E,a),a=[C],n=S),c=b),E},[]),s=h(s,a),f&&(s.push(f),p=!0),{values:s,suppressed:p}}function sEe(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function oEe(t,e){var r,s,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":s=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=iEe(s,e.caseSensitive),s=a.values):s=s.filter(function(c){var f=typeof c;return f==="string"||f==="number"}),r=sEe(s,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=D5;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=V0.basename(r):t==="cwdHome"&&(r=b5(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(c){return c.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=Dm[Dm.length-n]||"")}return r}function aEe(t){var e=/^(.)-(.)$/.exec(t),r="",s,a,n,c;if(!e)return null;for(s=e[1].charCodeAt(0),a=e[2].charCodeAt(0),c=s And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(b){return b==="charlist"?r.text:b==="length"?s+"..."+a:null}}),c,f,p,h,E,C,S;for(e=e||{},c=JC(e.charlist?e.charlist+"":"$",aEe),(isNaN(s=parseInt(e.min,10))||typeof s!="number")&&(s=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+P5(c)+"]{"+s+","+a+"}$"),r=iEe([c],n.caseSensitive,!0),r.text=sEe(r.values,r.suppressed),f=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!S;)n.limit=h,n.limitMessage=E,C=$r.question(t,n),n.limit=[C,""],n.limitMessage=p,S=$r.question(f,n);return C};function uEe(t,e,r){var s;function a(n){return s=r(n),!isNaN(s)&&typeof s=="number"}return $r.question(t,Vs({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),s}$r.questionInt=function(t,e){return uEe(t,e,function(r){return parseInt(r,10)})};$r.questionFloat=function(t,e){return uEe(t,e,parseFloat)};$r.questionPath=function(t,e){var r,s="",a=Vs({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var c,f,p;n=b5(n,!0),s="";function h(E){E.split(/\/|\\/).reduce(function(C,S){var b=V0.resolve(C+=S+V0.sep);if(!si.existsSync(b))si.mkdirSync(b);else if(!si.statSync(b).isDirectory())throw new Error("Non directory already exists: "+b);return C},"")}try{if(c=si.existsSync(n),r=c?si.realpathSync(n):V0.resolve(n),!e.hasOwnProperty("exists")&&!c||typeof e.exists=="boolean"&&e.exists!==c)return s=(c?"Already exists":"No such file or directory")+": "+r,!1;if(!c&&e.create&&(e.isDirectory?h(r):(h(V0.dirname(r)),si.closeSync(si.openSync(r,"w"))),r=si.realpathSync(r)),c&&(e.min||e.max||e.isFile||e.isDirectory)){if(f=si.statSync(r),e.isFile&&!f.isFile())return s="Not file: "+r,!1;if(e.isDirectory&&!f.isDirectory())return s="Not directory: "+r,!1;if(e.min&&f.size<+e.min||e.max&&f.size>+e.max)return s="Size "+f.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(s=p),!1}catch(E){return s=E+"",!1}return!0},phContent:function(n){return n==="error"?s:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),$r.question(t,a),r};function fEe(t,e){var r={},s={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(s[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=S5(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&s.hasOwnProperty(n)?s[n].apply(a,r.args.slice(1)):s.hasOwnProperty("_")?s._.apply(a,r.args):null,{res:a,forceNext:!1}},s.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),s.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=S5(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}$r.promptCL=function(t,e){var r=Vs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),s=fEe(t,r);return r.limit=s.limit,r.preCheck=s.preCheck,$r.prompt(r),s.args};$r.promptLoop=function(t,e){for(var r=Vs({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t($r.prompt(r)););};$r.promptCLLoop=function(t,e){var r=Vs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),s=fEe(t,r);for(r.limit=s.limit,r.preCheck=s.preCheck;$r.prompt(r),!s.hRes;);};$r.promptSimShell=function(t){return $r.prompt(Vs({hideEchoBack:!1,history:!0},t,{prompt:function(){return Pm?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function AEe(t,e,r){var s;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),s=$r.keyIn(t,Vs(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof s=="boolean"?s:""}$r.keyInYN=function(t,e){return AEe(t,e)};$r.keyInYNStrict=function(t,e){return AEe(t,e,"yn")};$r.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),$r.keyIn(t,Vs({limit:null},e,{hideEchoBack:!0,mask:""}))};$r.keyInSelect=function(t,e,r){var s=Vs({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},c=49,f=` `;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(c);a+=E,n[E]=h,f+="["+E+"] "+(p+"").trim()+` `,c=c===57?97:c+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,f+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` `),s.limit=a,f+=` `,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),f+=e),n[$r.keyIn(f,s).toLowerCase()]};$r.getRawInput=function(){return oF};function oS(t,e){var r;return e.length&&(r={},r[t]=e[0]),$r.setDefaultOptions(r)[t]}$r.setPrint=function(){return oS("print",arguments)};$r.setPrompt=function(){return oS("prompt",arguments)};$r.setEncoding=function(){return oS("encoding",arguments)};$r.setMask=function(){return oS("mask",arguments)};$r.setBufferSize=function(){return oS("bufferSize",arguments)}});var x5=_((BYt,ec)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(w,P,y){var F=tau_file_system.files[w];if(!F){if(y==="read")return null;F={path:w,text:"",type:P,get:function(z,Z){return Z===this.text.length||Z>this.text.length?"end_of_file":this.text.substring(Z,Z+z)},put:function(z,Z){return Z==="end_of_file"?(this.text+=z,!0):Z==="past_end_of_file"?null:(this.text=this.text.substring(0,Z)+z+this.text.substring(Z+z.length),!0)},get_byte:function(z){if(z==="end_of_stream")return-1;var Z=Math.floor(z/2);if(this.text.length<=Z)return-1;var $=n(this.text[Math.floor(z/2)],0);return z%2===0?$&255:$/256>>>0},put_byte:function(z,Z){var $=Z==="end_of_stream"?this.text.length:Math.floor(Z/2);if(this.text.length<$)return null;var oe=this.text.length===$?-1:n(this.text[Math.floor(Z/2)],0);return Z%2===0?(oe=oe/256>>>0,oe=(oe&255)<<8|z&255):(oe=oe&255,oe=(z&255)<<8|oe&255),this.text.length===$?this.text+=c(oe):this.text=this.text.substring(0,$)+c(oe)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[w]=F}return y==="write"&&(F.text=""),F}},tau_user_input={buffer:"",get:function(w,P){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function N(w,P){return w.get_flag("char_conversion").id==="on"?P.replace(/./g,function(y){return w.get_char_conversion(y)}):P}function U(w){this.thread=w,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var P,y=0,F=0,z=0,Z=[],$=!1;if(w){var oe=this.tokens[w-1];y=oe.len,P=N(this.thread,this.text.substr(oe.len)),F=oe.line,z=oe.start}else P=this.text;if(/^\s*$/.test(P))return null;for(;P!=="";){var xe=[],Re=!1;if(/^\n/.exec(P)!==null){F++,z=0,y++,P=P.replace(/\n/,""),$=!0;continue}for(var lt in T)if(T.hasOwnProperty(lt)){var Ct=T[lt].exec(P);Ct&&xe.push({value:Ct[0],name:lt,matches:Ct})}if(!xe.length)return this.set_last_tokens([{value:P,matches:[],name:"lexical",line:F,start:z}]);var oe=r(xe,function(br,Ir){return br.value.length>=Ir.value.length?br:Ir});switch(oe.start=z,oe.line=F,P=P.replace(oe.value,""),z+=oe.value.length,y+=oe.value.length,oe.name){case"atom":oe.raw=oe.value,oe.value.charAt(0)==="'"&&(oe.value=S(oe.value.substr(1,oe.value.length-2),"'"),oe.value===null&&(oe.name="lexical",oe.value="unknown escape sequence"));break;case"number":oe.float=oe.value.substring(0,2)!=="0x"&&oe.value.match(/[.eE]/)!==null&&oe.value!=="0'.",oe.value=I(oe.value),oe.blank=Re;break;case"string":var qt=oe.value.charAt(0);oe.value=S(oe.value.substr(1,oe.value.length-2),qt),oe.value===null&&(oe.name="lexical",oe.value="unknown escape sequence");break;case"whitespace":var ir=Z[Z.length-1];ir&&(ir.space=!0),Re=!0;continue;case"r_bracket":Z.length>0&&Z[Z.length-1].name==="l_bracket"&&(oe=Z.pop(),oe.name="atom",oe.value="{}",oe.raw="{}",oe.space=!1);break;case"r_brace":Z.length>0&&Z[Z.length-1].name==="l_brace"&&(oe=Z.pop(),oe.name="atom",oe.value="[]",oe.raw="[]",oe.space=!1);break}oe.len=y,Z.push(oe),Re=!1}var bt=this.set_last_tokens(Z);return bt.length===0?null:bt};function W(w,P,y,F,z){if(!P[y])return{type:f,value:x.error.syntax(P[y-1],"expression expected",!0)};var Z;if(F==="0"){var $=P[y];switch($.name){case"number":return{type:p,len:y+1,value:new x.type.Num($.value,$.float)};case"variable":return{type:p,len:y+1,value:new x.type.Var($.value)};case"string":var oe;switch(w.get_flag("double_quotes").id){case"atom":oe=new j($.value,[]);break;case"codes":oe=new j("[]",[]);for(var xe=$.value.length-1;xe>=0;xe--)oe=new j(".",[new x.type.Num(n($.value,xe),!1),oe]);break;case"chars":oe=new j("[]",[]);for(var xe=$.value.length-1;xe>=0;xe--)oe=new j(".",[new x.type.Term($.value.charAt(xe),[]),oe]);break}return{type:p,len:y+1,value:oe};case"l_paren":var bt=W(w,P,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:P[bt.len]&&P[bt.len].name==="r_paren"?(bt.len++,bt):{type:f,derived:!0,value:x.error.syntax(P[bt.len]?P[bt.len]:P[bt.len-1],") or operator expected",!P[bt.len])};case"l_bracket":var bt=W(w,P,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:P[bt.len]&&P[bt.len].name==="r_bracket"?(bt.len++,bt.value=new j("{}",[bt.value]),bt):{type:f,derived:!0,value:x.error.syntax(P[bt.len]?P[bt.len]:P[bt.len-1],"} or operator expected",!P[bt.len])}}var Re=ee(w,P,y,z);return Re.type===p||Re.derived||(Re=ie(w,P,y),Re.type===p||Re.derived)?Re:{type:f,derived:!1,value:x.error.syntax(P[y],"unexpected token")}}var lt=w.__get_max_priority(),Ct=w.__get_next_priority(F),qt=y;if(P[y].name==="atom"&&P[y+1]&&(P[y].space||P[y+1].name!=="l_paren")){var $=P[y++],ir=w.__lookup_operator_classes(F,$.value);if(ir&&ir.indexOf("fy")>-1){var bt=W(w,P,y,F,z);if(bt.type!==f)return $.value==="-"&&!$.space&&x.type.is_number(bt.value)?{value:new x.type.Num(-bt.value.value,bt.value.is_float),len:bt.len,type:p}:{value:new x.type.Term($.value,[bt.value]),len:bt.len,type:p};Z=bt}else if(ir&&ir.indexOf("fx")>-1){var bt=W(w,P,y,Ct,z);if(bt.type!==f)return{value:new x.type.Term($.value,[bt.value]),len:bt.len,type:p};Z=bt}}y=qt;var bt=W(w,P,y,Ct,z);if(bt.type===p){y=bt.len;var $=P[y];if(P[y]&&(P[y].name==="atom"&&w.__lookup_operator_classes(F,$.value)||P[y].name==="bar"&&w.__lookup_operator_classes(F,"|"))){var gn=Ct,br=F,ir=w.__lookup_operator_classes(F,$.value);if(ir.indexOf("xf")>-1)return{value:new x.type.Term($.value,[bt.value]),len:++bt.len,type:p};if(ir.indexOf("xfx")>-1){var Ir=W(w,P,y+1,gn,z);return Ir.type===p?{value:new x.type.Term($.value,[bt.value,Ir.value]),len:Ir.len,type:p}:(Ir.derived=!0,Ir)}else if(ir.indexOf("xfy")>-1){var Ir=W(w,P,y+1,br,z);return Ir.type===p?{value:new x.type.Term($.value,[bt.value,Ir.value]),len:Ir.len,type:p}:(Ir.derived=!0,Ir)}else if(bt.type!==f)for(;;){y=bt.len;var $=P[y];if($&&$.name==="atom"&&w.__lookup_operator_classes(F,$.value)){var ir=w.__lookup_operator_classes(F,$.value);if(ir.indexOf("yf")>-1)bt={value:new x.type.Term($.value,[bt.value]),len:++y,type:p};else if(ir.indexOf("yfx")>-1){var Ir=W(w,P,++y,gn,z);if(Ir.type===f)return Ir.derived=!0,Ir;y=Ir.len,bt={value:new x.type.Term($.value,[bt.value,Ir.value]),len:y,type:p}}else break}else break}}else Z={type:f,value:x.error.syntax(P[bt.len-1],"operator expected")};return bt}return bt}function ee(w,P,y,F){if(!P[y]||P[y].name==="atom"&&P[y].raw==="."&&!F&&(P[y].space||!P[y+1]||P[y+1].name!=="l_paren"))return{type:f,derived:!1,value:x.error.syntax(P[y-1],"unfounded token")};var z=P[y],Z=[];if(P[y].name==="atom"&&P[y].raw!==","){if(y++,P[y-1].space)return{type:p,len:y,value:new x.type.Term(z.value,Z)};if(P[y]&&P[y].name==="l_paren"){if(P[y+1]&&P[y+1].name==="r_paren")return{type:f,derived:!0,value:x.error.syntax(P[y+1],"argument expected")};var $=W(w,P,++y,"999",!0);if($.type===f)return $.derived?$:{type:f,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],"argument expected",!P[y])};for(Z.push($.value),y=$.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if($=W(w,P,y+1,"999",!0),$.type===f)return $.derived?$:{type:f,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};Z.push($.value),y=$.len}if(P[y]&&P[y].name==="r_paren")y++;else return{type:f,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],", or ) expected",!P[y])}}return{type:p,len:y,value:new x.type.Term(z.value,Z)}}return{type:f,derived:!1,value:x.error.syntax(P[y],"term expected")}}function ie(w,P,y){if(!P[y])return{type:f,derived:!1,value:x.error.syntax(P[y-1],"[ expected")};if(P[y]&&P[y].name==="l_brace"){var F=W(w,P,++y,"999",!0),z=[F.value],Z=void 0;if(F.type===f)return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:new x.type.Term("[]",[])}:{type:f,derived:!0,value:x.error.syntax(P[y],"] expected")};for(y=F.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if(F=W(w,P,y+1,"999",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};z.push(F.value),y=F.len}var $=!1;if(P[y]&&P[y].name==="bar"){if($=!0,F=W(w,P,y+1,"999",!0),F.type===f)return F.derived?F:{type:f,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};Z=F.value,y=F.len}return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:g(z,Z)}:{type:f,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],$?"] expected":", or | or ] expected",!P[y])}}return{type:f,derived:!1,value:x.error.syntax(P[y],"list expected")}}function ue(w,P,y){var F=P[y].line,z=W(w,P,y,w.__get_max_priority(),!1),Z=null,$;if(z.type!==f)if(y=z.len,P[y]&&P[y].name==="atom"&&P[y].raw===".")if(y++,x.type.is_term(z.value)){if(z.value.indicator===":-/2"?(Z=new x.type.Rule(z.value.args[0],Ce(z.value.args[1])),$={value:Z,len:y,type:p}):z.value.indicator==="-->/2"?(Z=pe(new x.type.Rule(z.value.args[0],z.value.args[1]),w),Z.body=Ce(Z.body),$={value:Z,len:y,type:x.type.is_rule(Z)?p:f}):(Z=new x.type.Rule(z.value,null),$={value:Z,len:y,type:p}),Z){var oe=Z.singleton_variables();oe.length>0&&w.throw_warning(x.warning.singleton(oe,Z.head.indicator,F))}return $}else return{type:f,value:x.error.syntax(P[y],"callable expected")};else return{type:f,value:x.error.syntax(P[y]?P[y]:P[y-1],". or operator expected")};return z}function le(w,P,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),z={},Z;F.new_text(P);var $=0,oe=F.get_tokens($);do{if(oe===null||!oe[$])break;var xe=ue(w,oe,$);if(xe.type===f)return new j("throw",[xe.value]);if(xe.value.body===null&&xe.value.head.indicator==="?-/1"){var Re=new it(w.session);Re.add_goal(xe.value.head.args[0]),Re.answer(function(Ct){x.type.is_error(Ct)?w.throw_warning(Ct.args[0]):(Ct===!1||Ct===null)&&w.throw_warning(x.warning.failed_goal(xe.value.head.args[0],xe.len))}),$=xe.len;var lt=!0}else if(xe.value.body===null&&xe.value.head.indicator===":-/1"){var lt=w.run_directive(xe.value.head.args[0]);$=xe.len,xe.value.head.args[0].indicator==="char_conversion/2"&&(oe=F.get_tokens($),$=0)}else{Z=xe.value.head.indicator,y.reconsult!==!1&&z[Z]!==!0&&!w.is_multifile_predicate(Z)&&(w.session.rules[Z]=a(w.session.rules[Z]||[],function(qt){return qt.dynamic}),z[Z]=!0);var lt=w.add_rule(xe.value,y);$=xe.len}if(!lt)return lt}while(!0);return!0}function me(w,P){var y=new U(w);y.new_text(P);var F=0;do{var z=y.get_tokens(F);if(z===null)break;var Z=W(w,z,0,w.__get_max_priority(),!1);if(Z.type!==f){var $=Z.len,oe=$;if(z[$]&&z[$].name==="atom"&&z[$].raw===".")w.add_goal(Ce(Z.value));else{var xe=z[$];return new j("throw",[x.error.syntax(xe||z[$-1],". or operator expected",!xe)])}F=Z.len+1}else return new j("throw",[Z.value])}while(!0);return!0}function pe(w,P){w=w.rename(P);var y=P.next_free_variable(),F=Be(w.body,y,P);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new j(w.head.id,w.head.args),w)}function Be(w,P,y){var F;if(x.type.is_term(w)&&w.indicator==="!/0")return{value:w,variable:P,error:!1};if(x.type.is_term(w)&&w.indicator===",/2"){var z=Be(w.args[0],P,y);if(z.error)return z;var Z=Be(w.args[1],z.variable,y);return Z.error?Z:{value:new j(",",[z.value,Z.value]),variable:Z.variable,error:!1}}else{if(x.type.is_term(w)&&w.indicator==="{}/1")return{value:w.args[0],variable:P,error:!1};if(x.type.is_empty_list(w))return{value:new j("true",[]),variable:P,error:!1};if(x.type.is_list(w)){F=y.next_free_variable();for(var $=w,oe;$.indicator==="./2";)oe=$,$=$.args[1];return x.type.is_variable($)?{value:x.error.instantiation("DCG"),variable:P,error:!0}:x.type.is_empty_list($)?(oe.args[1]=F,{value:new j("=",[P,w]),variable:F,error:!1}):{value:x.error.type("list",w,"DCG"),variable:P,error:!0}}else return x.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([P,F]),w=new j(w.id,w.args),{value:w,variable:F,error:!1}):{value:x.error.type("callable",w,"DCG"),variable:P,error:!0}}}function Ce(w){return x.type.is_variable(w)?new j("call",[w]):x.type.is_term(w)&&[",/2",";/2","->/2"].indexOf(w.indicator)!==-1?new j(w.id,[Ce(w.args[0]),Ce(w.args[1])]):w}function g(w,P){for(var y=P||new x.type.Term("[]",[]),F=w.length-1;F>=0;F--)y=new x.type.Term(".",[w[F],y]);return y}function we(w,P){for(var y=w.length-1;y>=0;y--)w[y]===P&&w.splice(y,1)}function ye(w){for(var P={},y=[],F=0;F=0;P--)if(w.charAt(P)==="/")return new j("/",[new j(w.substring(0,P)),new Te(parseInt(w.substring(P+1)),!1)])}function De(w){this.id=w}function Te(w,P){this.is_float=P!==void 0?P:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var mt=0;function j(w,P,y){this.ref=y||++mt,this.id=w,this.args=P||[],this.indicator=w+"/"+this.args.length}var rt=0;function Fe(w,P,y,F,z,Z){this.id=rt++,this.stream=w,this.mode=P,this.alias=y,this.type=F!==void 0?F:"text",this.reposition=z!==void 0?z:!0,this.eof_action=Z!==void 0?Z:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Ne(w){w=w||{},this.links=w}function be(w,P,y){P=P||new Ne,y=y||null,this.goal=w,this.substitution=P,this.parent=y}function Ve(w,P,y){this.head=w,this.body=P,this.dynamic=y||!1}function ke(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new it(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Fe(typeof ec<"u"&&ec.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Fe(typeof ec<"u"&&ec.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof ec<"u"&&ec.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(P){return P.substitution},this.format_error=function(P){return P.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function it(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function Ue(w,P,y){this.id=w,this.rules=P,this.exports=y,x.module[w]=this}Ue.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},De.prototype.unify=function(w,P){if(P&&e(w.variables(),this.id)!==-1&&!x.type.is_variable(w))return null;var y={};return y[this.id]=w,new Ne(y)},Te.prototype.unify=function(w,P){return x.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new Ne:null},j.prototype.unify=function(w,P){if(x.type.is_term(w)&&this.indicator===w.indicator){for(var y=new Ne,F=0;F=0){var F=this.args[0].value,z=Math.floor(F/26),Z=F%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[Z]+(z!==0?z:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(w)+"}";case"./2":for(var $="["+this.args[0].toString(w),oe=this.args[1];oe.indicator==="./2";)$+=", "+oe.args[0].toString(w),oe=oe.args[1];return oe.indicator!=="[]/0"&&($+="|"+oe.toString(w)),$+="]",$;case",/2":return"("+this.args[0].toString(w)+", "+this.args[1].toString(w)+")";default:var xe=this.id,Re=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Re===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(xe)&&xe!=="{}"&&xe!=="[]"&&(xe="'"+b(xe)+"'"),xe+(this.args.length?"("+s(this.args,function(ir){return ir.toString(w)}).join(", ")+")":"");var lt=Re.priority>P.priority||Re.priority===P.priority&&(Re.class==="xfy"&&this.indicator!==P.indicator||Re.class==="yfx"&&this.indicator!==P.indicator||this.indicator===P.indicator&&Re.class==="yfx"&&y==="right"||this.indicator===P.indicator&&Re.class==="xfy"&&y==="left");Re.indicator=this.indicator;var Ct=lt?"(":"",qt=lt?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Re.class)!==-1?Ct+xe+" "+this.args[0].toString(w,Re)+qt:["yf","xf"].indexOf(Re.class)!==-1?Ct+this.args[0].toString(w,Re)+" "+xe+qt:Ct+this.args[0].toString(w,Re,"left")+" "+this.id+" "+this.args[1].toString(w,Re,"right")+qt}},Fe.prototype.toString=function(w){return"("+this.id+")"},Ne.prototype.toString=function(w){var P="{";for(var y in this.links)this.links.hasOwnProperty(y)&&(P!=="{"&&(P+=", "),P+=y+"/"+this.links[y].toString(w));return P+="}",P},be.prototype.toString=function(w){return this.goal===null?"<"+this.substitution.toString(w)+">":"<"+this.goal.toString(w)+", "+this.substitution.toString(w)+">"},Ve.prototype.toString=function(w){return this.body?this.head.toString(w)+" :- "+this.body.toString(w)+".":this.head.toString(w)+"."},ke.prototype.toString=function(w){for(var P="",y=0;y=0;z--)F=new j(".",[P[z],F]);return F}return new j(this.id,s(this.args,function(Z){return Z.apply(w)}),this.ref)},Fe.prototype.apply=function(w){return this},Ve.prototype.apply=function(w){return new Ve(this.head.apply(w),this.body!==null?this.body.apply(w):null)},Ne.prototype.apply=function(w){var P,y={};for(P in this.links)this.links.hasOwnProperty(P)&&(y[P]=this.links[P].apply(w));return new Ne(y)},j.prototype.select=function(){for(var w=this;w.indicator===",/2";)w=w.args[0];return w},j.prototype.replace=function(w){return this.indicator===",/2"?this.args[0].indicator===",/2"?new j(",",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new j(",",[w,this.args[1]]):w},j.prototype.search=function(w){if(x.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var P=0;PP&&F0&&(P=this.head_point().substitution.domain());e(P,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id==="_")return new De(x.format_variable(this.session.rename));this.session.renamed_variables[w.id]=x.format_variable(this.session.rename)}return new De(this.session.renamed_variables[w.id])},ke.prototype.next_free_variable=function(){return this.thread.next_free_variable()},it.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());e(w,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new De(x.format_variable(this.session.rename))},ke.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},it.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},ke.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},it.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},ke.prototype.prepend=function(w){return this.thread.prepend(w)},it.prototype.prepend=function(w){for(var P=w.length-1;P>=0;P--)this.points.push(w[P])},ke.prototype.success=function(w,P){return this.thread.success(w,P)},it.prototype.success=function(w,y){var y=typeof y>"u"?w:y;this.prepend([new be(w.goal.replace(null),w.substitution,y)])},ke.prototype.throw_error=function(w){return this.thread.throw_error(w)},it.prototype.throw_error=function(w){this.prepend([new be(new j("throw",[w]),new Ne,null,null)])},ke.prototype.step_rule=function(w,P){return this.thread.step_rule(w,P)},it.prototype.step_rule=function(w,P){var y=P.indicator;if(w==="user"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:e(this.session.modules,w)===-1?[]:[w],z=0;z1)&&this.again()},ke.prototype.answers=function(w,P,y){return this.thread.answers(w,P,y)},it.prototype.answers=function(w,P,y){var F=P||1e3,z=this;if(P<=0){y&&y();return}this.answer(function(Z){w(Z),Z!==!1?setTimeout(function(){z.answers(w,P-1,y)},1):y&&y()})},ke.prototype.again=function(w){return this.thread.again(w)},it.prototype.again=function(w){for(var P,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):x.type.is_error(this.head_point().goal)?(P=this.session.format_error(this.points.pop()),this.points=[],z(P)):(this.debugger&&this.debugger_states.push(this.head_point()),P=this.session.format_success(this.points.pop()),z(P))}},ke.prototype.unfold=function(w){if(w.body===null)return!1;var P=w.head,y=w.body,F=y.select(),z=new it(this),Z=[];z.add_goal(F),z.step();for(var $=z.points.length-1;$>=0;$--){var oe=z.points[$],xe=P.apply(oe.substitution),Re=y.replace(oe.goal);Re!==null&&(Re=Re.apply(oe.substitution)),Z.push(new Ve(xe,Re))}var lt=this.rules[P.indicator],Ct=e(lt,w);return Z.length>0&&Ct!==-1?(lt.splice.apply(lt,[Ct,1].concat(Z)),!0):!1},it.prototype.unfold=function(w){return this.session.unfold(w)},De.prototype.interpret=function(w){return x.error.instantiation(w.level)},Te.prototype.interpret=function(w){return this},j.prototype.interpret=function(w){return x.type.is_unitary_list(this)?this.args[0].interpret(w):x.operate(w,this)},De.prototype.compare=function(w){return this.idw.id?1:0},Te.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.valuew.value)return 1},j.prototype.compare=function(w){if(this.args.lengthw.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var P=0;PF)return 1;if(w.constructor===Te){if(w.is_float&&P.is_float)return 0;if(w.is_float)return-1;if(P.is_float)return 1}return 0},is_substitution:function(w){return w instanceof Ne},is_state:function(w){return w instanceof be},is_rule:function(w){return w instanceof Ve},is_variable:function(w){return w instanceof De},is_stream:function(w){return w instanceof Fe},is_anonymous_var:function(w){return w instanceof De&&w.id==="_"},is_callable:function(w){return w instanceof j},is_number:function(w){return w instanceof Te},is_integer:function(w){return w instanceof Te&&!w.is_float},is_float:function(w){return w instanceof Te&&w.is_float},is_term:function(w){return w instanceof j},is_atom:function(w){return w instanceof j&&w.args.length===0},is_ground:function(w){if(w instanceof De)return!1;if(w instanceof j){for(var P=0;P0},is_list:function(w){return w instanceof j&&(w.indicator==="[]/0"||w.indicator==="./2")},is_empty_list:function(w){return w instanceof j&&w.indicator==="[]/0"},is_non_empty_list:function(w){return w instanceof j&&w.indicator==="./2"},is_fully_list:function(w){for(;w instanceof j&&w.indicator==="./2";)w=w.args[1];return w instanceof De||w instanceof j&&w.indicator==="[]/0"},is_instantiated_list:function(w){for(;w instanceof j&&w.indicator==="./2";)w=w.args[1];return w instanceof j&&w.indicator==="[]/0"},is_unitary_list:function(w){return w instanceof j&&w.indicator==="./2"&&w.args[1]instanceof j&&w.args[1].indicator==="[]/0"},is_character:function(w){return w instanceof j&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof Te&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof Te&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof j&&x.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof j&&x.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof j&&x.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof j&&w.indicator==="throw/1"},is_predicate_indicator:function(w){return w instanceof j&&w.indicator==="//2"&&w.args[0]instanceof j&&w.args[0].args.length===0&&w.args[1]instanceof Te&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof j&&w.args.length===0&&x.flag[w.id]!==void 0},is_value_flag:function(w,P){if(!x.type.is_flag(w))return!1;for(var y in x.flag[w.id].allowed)if(x.flag[w.id].allowed.hasOwnProperty(y)&&x.flag[w.id].allowed[y].equals(P))return!0;return!1},is_io_mode:function(w){return x.type.is_atom(w)&&["read","write","append"].indexOf(w.id)!==-1},is_stream_option:function(w){return x.type.is_term(w)&&(w.indicator==="alias/1"&&x.type.is_atom(w.args[0])||w.indicator==="reposition/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="type/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary")||w.indicator==="eof_action/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))},is_stream_position:function(w){return x.type.is_integer(w)&&w.value>=0||x.type.is_atom(w)&&(w.id==="end_of_stream"||w.id==="past_end_of_stream")},is_stream_property:function(w){return x.type.is_term(w)&&(w.indicator==="input/0"||w.indicator==="output/0"||w.indicator==="alias/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator==="file_name/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0]))||w.indicator==="position/1"&&(x.type.is_variable(w.args[0])||x.type.is_stream_position(w.args[0]))||w.indicator==="reposition/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))||w.indicator==="type/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="text"||w.args[0].id==="binary"))||w.indicator==="mode/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="read"||w.args[0].id==="write"||w.args[0].id==="append"))||w.indicator==="eof_action/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="error"||w.args[0].id==="eof_code"||w.args[0].id==="reset"))||w.indicator==="end_of_stream/1"&&(x.type.is_variable(w.args[0])||x.type.is_atom(w.args[0])&&(w.args[0].id==="at"||w.args[0].id==="past"||w.args[0].id==="not")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return x.type.is_term(w)&&["variables/1","variable_names/1","singletons/1"].indexOf(w.indicator)!==-1},is_write_option:function(w){return x.type.is_term(w)&&(w.indicator==="quoted/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="ignore_ops/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")||w.indicator==="numbervars/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false"))},is_close_option:function(w){return x.type.is_term(w)&&w.indicator==="force/1"&&x.type.is_atom(w.args[0])&&(w.args[0].id==="true"||w.args[0].id==="false")},is_modifiable_flag:function(w){return x.type.is_flag(w)&&x.flag[w.id].changeable},is_module:function(w){return w instanceof j&&w.indicator==="library/1"&&w.args[0]instanceof j&&w.args[0].args.length===0&&x.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(w){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(w,P){return w}},"-/1":{type_args:null,type_result:null,fn:function(w,P){return-w}},"\\/1":{type_args:!1,type_result:!1,fn:function(w,P){return~w}},"abs/1":{type_args:null,type_result:null,fn:function(w,P){return Math.abs(w)}},"sign/1":{type_args:null,type_result:null,fn:function(w,P){return Math.sign(w)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(w,P){return parseInt(w)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(w,P){return w-parseInt(w)}},"float/1":{type_args:null,type_result:!0,fn:function(w,P){return parseFloat(w)}},"floor/1":{type_args:!0,type_result:!1,fn:function(w,P){return Math.floor(w)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(w,P){return parseInt(w)}},"round/1":{type_args:!0,type_result:!1,fn:function(w,P){return Math.round(w)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(w,P){return Math.ceil(w)}},"sin/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.sin(w)}},"cos/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.cos(w)}},"tan/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.tan(w)}},"asin/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.asin(w)}},"acos/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.acos(w)}},"atan/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.atan(w)}},"atan2/2":{type_args:null,type_result:!0,fn:function(w,P,y){return Math.atan2(w,P)}},"exp/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.exp(w)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(w,P){return Math.sqrt(w)}},"log/1":{type_args:null,type_result:!0,fn:function(w,P){return w>0?Math.log(w):x.error.evaluation("undefined",P.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(w,P,y){return w+P}},"-/2":{type_args:null,type_result:null,fn:function(w,P,y){return w-P}},"*/2":{type_args:null,type_result:null,fn:function(w,P,y){return w*P}},"//2":{type_args:null,type_result:!0,fn:function(w,P,y){return P?w/P:x.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(w,P,y){return P?parseInt(w/P):x.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(w,P,y){return Math.pow(w,P)}},"^/2":{type_args:null,type_result:null,fn:function(w,P,y){return Math.pow(w,P)}},"<>/2":{type_args:!1,type_result:!1,fn:function(w,P,y){return w>>P}},"/\\/2":{type_args:!1,type_result:!1,fn:function(w,P,y){return w&P}},"\\//2":{type_args:!1,type_result:!1,fn:function(w,P,y){return w|P}},"xor/2":{type_args:!1,type_result:!1,fn:function(w,P,y){return w^P}},"rem/2":{type_args:!1,type_result:!1,fn:function(w,P,y){return P?w%P:x.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(w,P,y){return P?w-parseInt(w/P)*P:x.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(w,P,y){return Math.max(w,P)}},"min/2":{type_args:null,type_result:null,fn:function(w,P,y){return Math.min(w,P)}}}},directive:{"dynamic/1":function(w,P){var y=P.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_compound(y)||y.indicator!=="//2")w.throw_error(x.error.type("predicate_indicator",y,P.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))w.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type("atom",y.args[0],P.indicator));else if(!x.type.is_integer(y.args[1]))w.throw_error(x.error.type("integer",y.args[1],P.indicator));else{var F=P.args[0].args[0].id+"/"+P.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},"multifile/1":function(w,P){var y=P.args[0];x.type.is_variable(y)?w.throw_error(x.error.instantiation(P.indicator)):!x.type.is_compound(y)||y.indicator!=="//2"?w.throw_error(x.error.type("predicate_indicator",y,P.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?w.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?w.session.multifile_predicates[P.args[0].args[0].id+"/"+P.args[0].args[1].value]=!0:w.throw_error(x.error.type("integer",y.args[1],P.indicator)):w.throw_error(x.error.type("atom",y.args[0],P.indicator))},"set_prolog_flag/2":function(w,P){var y=P.args[0],F=P.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,F)?x.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(x.error.permission("modify","flag",y)):w.throw_error(x.error.domain("flag_value",new j("+",[y,F]),P.indicator)):w.throw_error(x.error.domain("prolog_flag",y,P.indicator)):w.throw_error(x.error.type("atom",y,P.indicator))},"use_module/1":function(w,P){var y=P.args[0];if(x.type.is_variable(y))w.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_term(y))w.throw_error(x.error.type("term",y,P.indicator));else if(x.type.is_module(y)){var F=y.args[0].id;e(w.session.modules,F)===-1&&w.session.modules.push(F)}},"char_conversion/2":function(w,P){var y=P.args[0],F=P.args[1];x.type.is_variable(y)||x.type.is_variable(F)?w.throw_error(x.error.instantiation(P.indicator)):x.type.is_character(y)?x.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(x.error.type("character",F,P.indicator)):w.throw_error(x.error.type("character",y,P.indicator))},"op/3":function(w,P){var y=P.args[0],F=P.args[1],z=P.args[2];if(x.type.is_variable(y)||x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_integer(y))w.throw_error(x.error.type("integer",y,P.indicator));else if(!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,P.indicator));else if(!x.type.is_atom(z))w.throw_error(x.error.type("atom",z,P.indicator));else if(y.value<0||y.value>1200)w.throw_error(x.error.domain("operator_priority",y,P.indicator));else if(z.id===",")w.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(z.id==="|"&&(y.value<1001||F.id.length!==3))w.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(F.id)===-1)w.throw_error(x.error.domain("operator_specifier",F,P.indicator));else{var Z={prefix:null,infix:null,postfix:null};for(var $ in w.session.__operators)if(w.session.__operators.hasOwnProperty($)){var oe=w.session.__operators[$][z.id];oe&&(e(oe,"fx")!==-1&&(Z.prefix={priority:$,type:"fx"}),e(oe,"fy")!==-1&&(Z.prefix={priority:$,type:"fy"}),e(oe,"xf")!==-1&&(Z.postfix={priority:$,type:"xf"}),e(oe,"yf")!==-1&&(Z.postfix={priority:$,type:"yf"}),e(oe,"xfx")!==-1&&(Z.infix={priority:$,type:"xfx"}),e(oe,"xfy")!==-1&&(Z.infix={priority:$,type:"xfy"}),e(oe,"yfx")!==-1&&(Z.infix={priority:$,type:"yfx"}))}var xe;switch(F.id){case"fy":case"fx":xe="prefix";break;case"yf":case"xf":xe="postfix";break;default:xe="infix";break}if(((Z.prefix&&xe==="prefix"||Z.postfix&&xe==="postfix"||Z.infix&&xe==="infix")&&Z[xe].type!==F.id||Z.infix&&xe==="postfix"||Z.postfix&&xe==="infix")&&y.value!==0)w.throw_error(x.error.permission("create","operator",z,P.indicator));else return Z[xe]&&(we(w.session.__operators[Z[xe].priority][z.id],F.id),w.session.__operators[Z[xe].priority][z.id].length===0&&delete w.session.__operators[Z[xe].priority][z.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][z.id]||(w.session.__operators[y.value][z.id]=[]),w.session.__operators[y.value][z.id].push(F.id)),!0}}},predicate:{"op/3":function(w,P,y){x.directive["op/3"](w,y)&&w.success(P)},"current_op/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2],$=[];for(var oe in w.session.__operators)for(var xe in w.session.__operators[oe])for(var Re=0;Re/2"){var F=w.points,z=w.session.format_success,Z=w.session.format_error;w.session.format_success=function(Re){return Re.substitution},w.session.format_error=function(Re){return Re.goal},w.points=[new be(y.args[0].args[0],P.substitution,P)];var $=function(Re){w.points=F,w.session.format_success=z,w.session.format_error=Z,Re===!1?w.prepend([new be(P.goal.replace(y.args[1]),P.substitution,P)]):x.type.is_error(Re)?w.throw_error(Re.args[0]):Re===null?(w.prepend([P]),w.__calls.shift()(null)):w.prepend([new be(P.goal.replace(y.args[0].args[1]).apply(Re),P.substitution.apply(Re),P)])};w.__calls.unshift($)}else{var oe=new be(P.goal.replace(y.args[0]),P.substitution,P),xe=new be(P.goal.replace(y.args[1]),P.substitution,P);w.prepend([oe,xe])}},"!/0":function(w,P,y){var F,z,Z=[];for(F=P,z=null;F.parent!==null&&F.parent.goal.search(y);)if(z=F,F=F.parent,F.goal!==null){var $=F.goal.select();if($&&$.id==="call"&&$.search(y)){F=z;break}}for(var oe=w.points.length-1;oe>=0;oe--){for(var xe=w.points[oe],Re=xe.parent;Re!==null&&Re!==F.parent;)Re=Re.parent;Re===null&&Re!==F.parent&&Z.push(xe)}w.points=Z.reverse(),w.success(P)},"\\+/1":function(w,P,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(w.level)):x.type.is_callable(F)?w.prepend([new be(P.goal.replace(new j(",",[new j(",",[new j("call",[F]),new j("!",[])]),new j("fail",[])])),P.substitution,P),new be(P.goal.replace(null),P.substitution,P)]):w.throw_error(x.error.type("callable",F,w.level))},"->/2":function(w,P,y){var F=P.goal.replace(new j(",",[y.args[0],new j(",",[new j("!"),y.args[1]])]));w.prepend([new be(F,P.substitution,P)])},"fail/0":function(w,P,y){},"false/0":function(w,P,y){},"true/0":function(w,P,y){w.success(P)},"call/1":se(1),"call/2":se(2),"call/3":se(3),"call/4":se(4),"call/5":se(5),"call/6":se(6),"call/7":se(7),"call/8":se(8),"once/1":function(w,P,y){var F=y.args[0];w.prepend([new be(P.goal.replace(new j(",",[new j("call",[F]),new j("!",[])])),P.substitution,P)])},"forall/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j("\\+",[new j(",",[new j("call",[F]),new j("\\+",[new j("call",[z])])])])),P.substitution,P)])},"repeat/0":function(w,P,y){w.prepend([new be(P.goal.replace(null),P.substitution,P),P])},"throw/1":function(w,P,y){x.type.is_variable(y.args[0])?w.throw_error(x.error.instantiation(w.level)):w.throw_error(y.args[0])},"catch/3":function(w,P,y){var F=w.points;w.points=[],w.prepend([new be(y.args[0],P.substitution,P)]);var z=w.session.format_success,Z=w.session.format_error;w.session.format_success=function(oe){return oe.substitution},w.session.format_error=function(oe){return oe.goal};var $=function(oe){var xe=w.points;if(w.points=F,w.session.format_success=z,w.session.format_error=Z,x.type.is_error(oe)){for(var Re=[],lt=w.points.length-1;lt>=0;lt--){for(var ir=w.points[lt],Ct=ir.parent;Ct!==null&&Ct!==P.parent;)Ct=Ct.parent;Ct===null&&Ct!==P.parent&&Re.push(ir)}w.points=Re;var qt=w.get_flag("occurs_check").indicator==="true/0",ir=new be,bt=x.unify(oe.args[0],y.args[1],qt);bt!==null?(ir.substitution=P.substitution.apply(bt),ir.goal=P.goal.replace(y.args[2]).apply(bt),ir.parent=P,w.prepend([ir])):w.throw_error(oe.args[0])}else if(oe!==!1){for(var gn=oe===null?[]:[new be(P.goal.apply(oe).replace(null),P.substitution.apply(oe),P)],br=[],lt=xe.length-1;lt>=0;lt--){br.push(xe[lt]);var Ir=xe[lt].goal!==null?xe[lt].goal.select():null;if(x.type.is_term(Ir)&&Ir.indicator==="!/0")break}var Or=s(br,function(nn){return nn.goal===null&&(nn.goal=new j("true",[])),nn=new be(P.goal.replace(new j("catch",[nn.goal,y.args[1],y.args[2]])),P.substitution.apply(nn.substitution),nn.parent),nn.exclude=y.args[0].variables(),nn}).reverse();w.prepend(Or),w.prepend(gn),oe===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift($)},"=/2":function(w,P,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=new be,Z=x.unify(y.args[0],y.args[1],F);Z!==null&&(z.goal=P.goal.apply(Z).replace(null),z.substitution=P.substitution.apply(Z),z.parent=P,w.prepend([z]))},"unify_with_occurs_check/2":function(w,P,y){var F=new be,z=x.unify(y.args[0],y.args[1],!0);z!==null&&(F.goal=P.goal.apply(z).replace(null),F.substitution=P.substitution.apply(z),F.parent=P,w.prepend([F]))},"\\=/2":function(w,P,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[0],y.args[1],F);z===null&&w.success(P)},"subsumes_term/2":function(w,P,y){var F=w.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[1],y.args[0],F);z!==null&&y.args[1].apply(z).equals(y.args[1])&&w.success(P)},"findall/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(z))w.throw_error(x.error.type("callable",z,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else{var $=w.next_free_variable(),oe=new j(",",[z,new j("=",[$,F])]),xe=w.points,Re=w.session.limit,lt=w.session.format_success;w.session.format_success=function(ir){return ir.substitution},w.add_goal(oe,!0,P);var Ct=[],qt=function(ir){if(ir!==!1&&ir!==null&&!x.type.is_error(ir))w.__calls.unshift(qt),Ct.push(ir.links[$.id]),w.session.limit=w.current_limit;else if(w.points=xe,w.session.limit=Re,w.session.format_success=lt,x.type.is_error(ir))w.throw_error(ir.args[0]);else if(w.current_limit>0){for(var bt=new j("[]"),gn=Ct.length-1;gn>=0;gn--)bt=new j(".",[Ct[gn],bt]);w.prepend([new be(P.goal.replace(new j("=",[Z,bt])),P.substitution,P)])}};w.__calls.unshift(qt)}},"bagof/3":function(w,P,y){var F,z=y.args[0],Z=y.args[1],$=y.args[2];if(x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(Z))w.throw_error(x.error.type("callable",Z,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))w.throw_error(x.error.type("list",$,y.indicator));else{var oe=w.next_free_variable(),xe;Z.indicator==="^/2"?(xe=Z.args[0].variables(),Z=Z.args[1]):xe=[],xe=xe.concat(z.variables());for(var Re=Z.variables().filter(function(Or){return e(xe,Or)===-1}),lt=new j("[]"),Ct=Re.length-1;Ct>=0;Ct--)lt=new j(".",[new De(Re[Ct]),lt]);var qt=new j(",",[Z,new j("=",[oe,new j(",",[lt,z])])]),ir=w.points,bt=w.session.limit,gn=w.session.format_success;w.session.format_success=function(Or){return Or.substitution},w.add_goal(qt,!0,P);var br=[],Ir=function(Or){if(Or!==!1&&Or!==null&&!x.type.is_error(Or)){w.__calls.unshift(Ir);var nn=!1,ai=Or.links[oe.id].args[0],Io=Or.links[oe.id].args[1];for(var ts in br)if(br.hasOwnProperty(ts)){var $s=br[ts];if($s.variables.equals(ai)){$s.answers.push(Io),nn=!0;break}}nn||br.push({variables:ai,answers:[Io]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=bt,w.session.format_success=gn,x.type.is_error(Or))w.throw_error(Or.args[0]);else if(w.current_limit>0){for(var Co=[],Hi=0;Hi=0;wo--)eo=new j(".",[Or[wo],eo]);Co.push(new be(P.goal.replace(new j(",",[new j("=",[lt,br[Hi].variables]),new j("=",[$,eo])])),P.substitution,P))}w.prepend(Co)}};w.__calls.unshift(Ir)}},"setof/3":function(w,P,y){var F,z=y.args[0],Z=y.args[1],$=y.args[2];if(x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(Z))w.throw_error(x.error.type("callable",Z,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))w.throw_error(x.error.type("list",$,y.indicator));else{var oe=w.next_free_variable(),xe;Z.indicator==="^/2"?(xe=Z.args[0].variables(),Z=Z.args[1]):xe=[],xe=xe.concat(z.variables());for(var Re=Z.variables().filter(function(Or){return e(xe,Or)===-1}),lt=new j("[]"),Ct=Re.length-1;Ct>=0;Ct--)lt=new j(".",[new De(Re[Ct]),lt]);var qt=new j(",",[Z,new j("=",[oe,new j(",",[lt,z])])]),ir=w.points,bt=w.session.limit,gn=w.session.format_success;w.session.format_success=function(Or){return Or.substitution},w.add_goal(qt,!0,P);var br=[],Ir=function(Or){if(Or!==!1&&Or!==null&&!x.type.is_error(Or)){w.__calls.unshift(Ir);var nn=!1,ai=Or.links[oe.id].args[0],Io=Or.links[oe.id].args[1];for(var ts in br)if(br.hasOwnProperty(ts)){var $s=br[ts];if($s.variables.equals(ai)){$s.answers.push(Io),nn=!0;break}}nn||br.push({variables:ai,answers:[Io]}),w.session.limit=w.current_limit}else if(w.points=ir,w.session.limit=bt,w.session.format_success=gn,x.type.is_error(Or))w.throw_error(Or.args[0]);else if(w.current_limit>0){for(var Co=[],Hi=0;Hi=0;wo--)eo=new j(".",[Or[wo],eo]);Co.push(new be(P.goal.replace(new j(",",[new j("=",[lt,br[Hi].variables]),new j("=",[$,eo])])),P.substitution,P))}w.prepend(Co)}};w.__calls.unshift(Ir)}},"functor/3":function(w,P,y){var F,z=y.args[0],Z=y.args[1],$=y.args[2];if(x.type.is_variable(z)&&(x.type.is_variable(Z)||x.type.is_variable($)))w.throw_error(x.error.instantiation("functor/3"));else if(!x.type.is_variable($)&&!x.type.is_integer($))w.throw_error(x.error.type("integer",y.args[2],"functor/3"));else if(!x.type.is_variable(Z)&&!x.type.is_atomic(Z))w.throw_error(x.error.type("atomic",y.args[1],"functor/3"));else if(x.type.is_integer(Z)&&x.type.is_integer($)&&$.value!==0)w.throw_error(x.error.type("atom",y.args[1],"functor/3"));else if(x.type.is_variable(z)){if(y.args[2].value>=0){for(var oe=[],xe=0;xe<$.value;xe++)oe.push(w.next_free_variable());var Re=x.type.is_integer(Z)?Z:new j(Z.id,oe);w.prepend([new be(P.goal.replace(new j("=",[z,Re])),P.substitution,P)])}}else{var lt=x.type.is_integer(z)?z:new j(z.id,[]),Ct=x.type.is_integer(z)?new Te(0,!1):new Te(z.args.length,!1),qt=new j(",",[new j("=",[lt,Z]),new j("=",[Ct,$])]);w.prepend([new be(P.goal.replace(qt),P.substitution,P)])}},"arg/3":function(w,P,y){if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))w.throw_error(x.error.instantiation(y.indicator));else if(y.args[0].value<0)w.throw_error(x.error.domain("not_less_than_zero",y.args[0],y.indicator));else if(!x.type.is_compound(y.args[1]))w.throw_error(x.error.type("compound",y.args[1],y.indicator));else{var F=y.args[0].value;if(F>0&&F<=y.args[1].args.length){var z=new j("=",[y.args[1].args[F-1],y.args[2]]);w.prepend([new be(P.goal.replace(z),P.substitution,P)])}}},"=../2":function(w,P,y){var F;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))w.throw_error(x.error.type("list",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var Z=[];for(F=y.args[1].args[1];F.indicator==="./2";)Z.push(F.args[0]),F=F.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):Z.length===0&&x.type.is_compound(y.args[1].args[0])?w.throw_error(x.error.type("atomic",y.args[1].args[0],y.indicator)):Z.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?w.throw_error(x.error.type("atom",y.args[1].args[0],y.indicator)):Z.length===0?w.prepend([new be(P.goal.replace(new j("=",[y.args[1].args[0],y.args[0]],P)),P.substitution,P)]):w.prepend([new be(P.goal.replace(new j("=",[new j(y.args[1].args[0].id,Z),y.args[0]])),P.substitution,P)])}}else{if(x.type.is_atomic(y.args[0]))F=new j(".",[y.args[0],new j("[]")]);else{F=new j("[]");for(var z=y.args[0].args.length-1;z>=0;z--)F=new j(".",[y.args[0].args[z],F]);F=new j(".",[new j(y.args[0].id),F])}w.prepend([new be(P.goal.replace(new j("=",[F,y.args[1]])),P.substitution,P)])}},"copy_term/2":function(w,P,y){var F=y.args[0].rename(w);w.prepend([new be(P.goal.replace(new j("=",[F,y.args[1]])),P.substitution,P.parent)])},"term_variables/2":function(w,P,y){var F=y.args[0],z=y.args[1];if(!x.type.is_fully_list(z))w.throw_error(x.error.type("list",z,y.indicator));else{var Z=g(s(ye(F.variables()),function($){return new De($)}));w.prepend([new be(P.goal.replace(new j("=",[z,Z])),P.substitution,P)])}},"clause/2":function(w,P,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))w.throw_error(x.error.type("callable",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var z in w.session.rules[y.args[0].indicator])if(w.session.rules[y.args[0].indicator].hasOwnProperty(z)){var Z=w.session.rules[y.args[0].indicator][z];w.session.renamed_variables={},Z=Z.rename(w),Z.body===null&&(Z.body=new j("true"));var $=new j(",",[new j("=",[Z.head,y.args[0]]),new j("=",[Z.body,y.args[1]])]);F.push(new be(P.goal.replace($),P.substitution,P))}w.prepend(F)}else w.throw_error(x.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(w,P,y){var F=y.args[0];if(!x.type.is_variable(F)&&(!x.type.is_compound(F)||F.indicator!=="//2"))w.throw_error(x.error.type("predicate_indicator",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[0])&&!x.type.is_atom(F.args[0]))w.throw_error(x.error.type("atom",F.args[0],y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_variable(F.args[1])&&!x.type.is_integer(F.args[1]))w.throw_error(x.error.type("integer",F.args[1],y.indicator));else{var z=[];for(var Z in w.session.rules)if(w.session.rules.hasOwnProperty(Z)){var $=Z.lastIndexOf("/"),oe=Z.substr(0,$),xe=parseInt(Z.substr($+1,Z.length-($+1))),Re=new j("/",[new j(oe),new Te(xe,!1)]),lt=new j("=",[Re,F]);z.push(new be(P.goal.replace(lt),P.substitution,P))}w.prepend(z)}},"asserta/1":function(w,P,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=Ce(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new Ve(F,z,!0)].concat(w.session.rules[F.indicator]),w.success(P)):w.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(x.error.type("callable",F,y.indicator))}},"assertz/1":function(w,P,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=Ce(y.args[0].args[1])):(F=y.args[0],z=null),x.type.is_callable(F)?z!==null&&!x.type.is_callable(z)?w.throw_error(x.error.type("callable",z,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new Ve(F,z,!0)),w.success(P)):w.throw_error(x.error.permission("modify","static_procedure",F.indicator,y.indicator)):w.throw_error(x.error.type("callable",F,y.indicator))}},"retract/1":function(w,P,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))w.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var F,z;if(y.args[0].indicator===":-/2"?(F=y.args[0].args[0],z=y.args[0].args[1]):(F=y.args[0],z=new j("true")),typeof P.retract>"u")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var Z=[],$=0;$w.get_flag("max_arity").value)w.throw_error(x.error.representation("max_arity",y.indicator));else{var F=y.args[0].args[0].id+"/"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(P)):w.throw_error(x.error.permission("modify","static_procedure",F,y.indicator))}},"atom_length/2":function(w,P,y){if(x.type.is_variable(y.args[0]))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))w.throw_error(x.error.type("atom",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))w.throw_error(x.error.type("integer",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(x.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var F=new Te(y.args[0].id.length,!1);w.prepend([new be(P.goal.replace(new j("=",[F,y.args[1]])),P.substitution,P)])}},"atom_concat/3":function(w,P,y){var F,z,Z=y.args[0],$=y.args[1],oe=y.args[2];if(x.type.is_variable(oe)&&(x.type.is_variable(Z)||x.type.is_variable($)))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_atom(Z))w.throw_error(x.error.type("atom",Z,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_atom($))w.throw_error(x.error.type("atom",$,y.indicator));else if(!x.type.is_variable(oe)&&!x.type.is_atom(oe))w.throw_error(x.error.type("atom",oe,y.indicator));else{var xe=x.type.is_variable(Z),Re=x.type.is_variable($);if(!xe&&!Re)z=new j("=",[oe,new j(Z.id+$.id)]),w.prepend([new be(P.goal.replace(z),P.substitution,P)]);else if(xe&&!Re)F=oe.id.substr(0,oe.id.length-$.id.length),F+$.id===oe.id&&(z=new j("=",[Z,new j(F)]),w.prepend([new be(P.goal.replace(z),P.substitution,P)]));else if(Re&&!xe)F=oe.id.substr(Z.id.length),Z.id+F===oe.id&&(z=new j("=",[$,new j(F)]),w.prepend([new be(P.goal.replace(z),P.substitution,P)]));else{for(var lt=[],Ct=0;Ct<=oe.id.length;Ct++){var qt=new j(oe.id.substr(0,Ct)),ir=new j(oe.id.substr(Ct));z=new j(",",[new j("=",[qt,Z]),new j("=",[ir,$])]),lt.push(new be(P.goal.replace(z),P.substitution,P))}w.prepend(lt)}}},"sub_atom/5":function(w,P,y){var F,z=y.args[0],Z=y.args[1],$=y.args[2],oe=y.args[3],xe=y.args[4];if(x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_integer(Z))w.throw_error(x.error.type("integer",Z,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_integer($))w.throw_error(x.error.type("integer",$,y.indicator));else if(!x.type.is_variable(oe)&&!x.type.is_integer(oe))w.throw_error(x.error.type("integer",oe,y.indicator));else if(x.type.is_integer(Z)&&Z.value<0)w.throw_error(x.error.domain("not_less_than_zero",Z,y.indicator));else if(x.type.is_integer($)&&$.value<0)w.throw_error(x.error.domain("not_less_than_zero",$,y.indicator));else if(x.type.is_integer(oe)&&oe.value<0)w.throw_error(x.error.domain("not_less_than_zero",oe,y.indicator));else{var Re=[],lt=[],Ct=[];if(x.type.is_variable(Z))for(F=0;F<=z.id.length;F++)Re.push(F);else Re.push(Z.value);if(x.type.is_variable($))for(F=0;F<=z.id.length;F++)lt.push(F);else lt.push($.value);if(x.type.is_variable(oe))for(F=0;F<=z.id.length;F++)Ct.push(F);else Ct.push(oe.value);var qt=[];for(var ir in Re)if(Re.hasOwnProperty(ir)){F=Re[ir];for(var bt in lt)if(lt.hasOwnProperty(bt)){var gn=lt[bt],br=z.id.length-F-gn;if(e(Ct,br)!==-1&&F+gn+br===z.id.length){var Ir=z.id.substr(F,gn);if(z.id===z.id.substr(0,F)+Ir+z.id.substr(F+gn,br)){var Or=new j("=",[new j(Ir),xe]),nn=new j("=",[Z,new Te(F)]),ai=new j("=",[$,new Te(gn)]),Io=new j("=",[oe,new Te(br)]),ts=new j(",",[new j(",",[new j(",",[nn,ai]),Io]),Or]);qt.push(new be(P.goal.replace(ts),P.substitution,P))}}}}w.prepend(qt)}},"atom_chars/2":function(w,P,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var oe=z,xe=x.type.is_variable(F),Re="";oe.indicator==="./2";){if(x.type.is_character(oe.args[0]))Re+=oe.args[0].id;else if(x.type.is_variable(oe.args[0])&&xe){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type("character",oe.args[0],y.indicator));return}oe=oe.args[1]}x.type.is_variable(oe)&&xe?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)?w.throw_error(x.error.type("list",z,y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[new j(Re),F])),P.substitution,P)])}else{for(var Z=new j("[]"),$=F.id.length-1;$>=0;$--)Z=new j(".",[new j(F.id.charAt($)),Z]);w.prepend([new be(P.goal.replace(new j("=",[z,Z])),P.substitution,P)])}},"atom_codes/2":function(w,P,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_variable(F)){for(var oe=z,xe=x.type.is_variable(F),Re="";oe.indicator==="./2";){if(x.type.is_character_code(oe.args[0]))Re+=c(oe.args[0].value);else if(x.type.is_variable(oe.args[0])&&xe){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.representation("character_code",y.indicator));return}oe=oe.args[1]}x.type.is_variable(oe)&&xe?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)?w.throw_error(x.error.type("list",z,y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[new j(Re),F])),P.substitution,P)])}else{for(var Z=new j("[]"),$=F.id.length-1;$>=0;$--)Z=new j(".",[new Te(n(F.id,$),!1),Z]);w.prepend([new be(P.goal.replace(new j("=",[z,Z])),P.substitution,P)])}},"char_code/2":function(w,P,y){var F=y.args[0],z=y.args[1];if(x.type.is_variable(F)&&x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_character(F))w.throw_error(x.error.type("character",F,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))w.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character_code(z))w.throw_error(x.error.representation("character_code",y.indicator));else if(x.type.is_variable(z)){var Z=new Te(n(F.id,0),!1);w.prepend([new be(P.goal.replace(new j("=",[Z,z])),P.substitution,P)])}else{var $=new j(c(z.value));w.prepend([new be(P.goal.replace(new j("=",[$,F])),P.substitution,P)])}},"number_chars/2":function(w,P,y){var F,z=y.args[0],Z=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(Z)){var oe=Z,xe=!0;for(F="";oe.indicator==="./2";){if(x.type.is_character(oe.args[0]))F+=oe.args[0].id;else if(x.type.is_variable(oe.args[0]))xe=!1;else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type("character",oe.args[0],y.indicator));return}oe=oe.args[1]}if(xe=xe&&x.type.is_empty_list(oe),!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)){w.throw_error(x.error.type("list",Z,y.indicator));return}if(!xe&&$){w.throw_error(x.error.instantiation(y.indicator));return}else if(xe)if(x.type.is_variable(oe)&&$){w.throw_error(x.error.instantiation(y.indicator));return}else{var Re=w.parse(F),lt=Re.value;!x.type.is_number(lt)||Re.tokens[Re.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[z,lt])),P.substitution,P)]);return}}if(!$){F=z.toString();for(var Ct=new j("[]"),qt=F.length-1;qt>=0;qt--)Ct=new j(".",[new j(F.charAt(qt)),Ct]);w.prepend([new be(P.goal.replace(new j("=",[Z,Ct])),P.substitution,P)])}}},"number_codes/2":function(w,P,y){var F,z=y.args[0],Z=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))w.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(Z)){var oe=Z,xe=!0;for(F="";oe.indicator==="./2";){if(x.type.is_character_code(oe.args[0]))F+=c(oe.args[0].value);else if(x.type.is_variable(oe.args[0]))xe=!1;else if(!x.type.is_variable(oe.args[0])){w.throw_error(x.error.type("character_code",oe.args[0],y.indicator));return}oe=oe.args[1]}if(xe=xe&&x.type.is_empty_list(oe),!x.type.is_empty_list(oe)&&!x.type.is_variable(oe)){w.throw_error(x.error.type("list",Z,y.indicator));return}if(!xe&&$){w.throw_error(x.error.instantiation(y.indicator));return}else if(xe)if(x.type.is_variable(oe)&&$){w.throw_error(x.error.instantiation(y.indicator));return}else{var Re=w.parse(F),lt=Re.value;!x.type.is_number(lt)||Re.tokens[Re.tokens.length-1].space?w.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[z,lt])),P.substitution,P)]);return}}if(!$){F=z.toString();for(var Ct=new j("[]"),qt=F.length-1;qt>=0;qt--)Ct=new j(".",[new Te(n(F,qt),!1),Ct]);w.prepend([new be(P.goal.replace(new j("=",[Z,Ct])),P.substitution,P)])}}},"upcase_atom/2":function(w,P,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type("atom",z,y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[z,new j(F.id.toUpperCase(),[])])),P.substitution,P)]):w.throw_error(x.error.type("atom",F,y.indicator))},"downcase_atom/2":function(w,P,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?!x.type.is_variable(z)&&!x.type.is_atom(z)?w.throw_error(x.error.type("atom",z,y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[z,new j(F.id.toLowerCase(),[])])),P.substitution,P)]):w.throw_error(x.error.type("atom",F,y.indicator))},"atomic_list_concat/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j("atomic_list_concat",[F,new j("",[]),z])),P.substitution,P)])},"atomic_list_concat/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(x.type.is_variable(z)||x.type.is_variable(F)&&x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_list(F))w.throw_error(x.error.type("list",F,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_atom(Z))w.throw_error(x.error.type("atom",Z,y.indicator));else if(x.type.is_variable(Z)){for(var oe="",xe=F;x.type.is_term(xe)&&xe.indicator==="./2";){if(!x.type.is_atom(xe.args[0])&&!x.type.is_number(xe.args[0])){w.throw_error(x.error.type("atomic",xe.args[0],y.indicator));return}oe!==""&&(oe+=z.id),x.type.is_atom(xe.args[0])?oe+=xe.args[0].id:oe+=""+xe.args[0].value,xe=xe.args[1]}oe=new j(oe,[]),x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(xe)||xe.indicator!=="[]/0"?w.throw_error(x.error.type("list",F,y.indicator)):w.prepend([new be(P.goal.replace(new j("=",[oe,Z])),P.substitution,P)])}else{var $=g(s(Z.id.split(z.id),function(Re){return new j(Re,[])}));w.prepend([new be(P.goal.replace(new j("=",[$,F])),P.substitution,P)])}},"@=/2":function(w,P,y){x.compare(y.args[0],y.args[1])>0&&w.success(P)},"@>=/2":function(w,P,y){x.compare(y.args[0],y.args[1])>=0&&w.success(P)},"compare/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(x.type.is_atom(F)&&["<",">","="].indexOf(F.id)===-1)w.throw_error(x.type.domain("order",F,y.indicator));else{var $=x.compare(z,Z);$=$===0?"=":$===-1?"<":">",w.prepend([new be(P.goal.replace(new j("=",[F,new j($,[])])),P.substitution,P)])}},"is/2":function(w,P,y){var F=y.args[1].interpret(w);x.type.is_number(F)?w.prepend([new be(P.goal.replace(new j("=",[y.args[0],F],w.level)),P.substitution,P)]):w.throw_error(F)},"between/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2];if(x.type.is_variable(F)||x.type.is_variable(z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(F))w.throw_error(x.error.type("integer",F,y.indicator));else if(!x.type.is_integer(z))w.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(Z)&&!x.type.is_integer(Z))w.throw_error(x.error.type("integer",Z,y.indicator));else if(x.type.is_variable(Z)){var $=[new be(P.goal.replace(new j("=",[Z,F])),P.substitution,P)];F.value=Z.value&&w.success(P)},"succ/2":function(w,P,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)&&x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(F)&&!x.type.is_integer(F)?w.throw_error(x.error.type("integer",F,y.indicator)):!x.type.is_variable(z)&&!x.type.is_integer(z)?w.throw_error(x.error.type("integer",z,y.indicator)):!x.type.is_variable(F)&&F.value<0?w.throw_error(x.error.domain("not_less_than_zero",F,y.indicator)):!x.type.is_variable(z)&&z.value<0?w.throw_error(x.error.domain("not_less_than_zero",z,y.indicator)):(x.type.is_variable(z)||z.value>0)&&(x.type.is_variable(F)?w.prepend([new be(P.goal.replace(new j("=",[F,new Te(z.value-1,!1)])),P.substitution,P)]):w.prepend([new be(P.goal.replace(new j("=",[z,new Te(F.value+1,!1)])),P.substitution,P)]))},"=:=/2":function(w,P,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F===0&&w.success(P)},"=\\=/2":function(w,P,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F!==0&&w.success(P)},"/2":function(w,P,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>0&&w.success(P)},">=/2":function(w,P,y){var F=x.arithmetic_compare(w,y.args[0],y.args[1]);x.type.is_term(F)?w.throw_error(F):F>=0&&w.success(P)},"var/1":function(w,P,y){x.type.is_variable(y.args[0])&&w.success(P)},"atom/1":function(w,P,y){x.type.is_atom(y.args[0])&&w.success(P)},"atomic/1":function(w,P,y){x.type.is_atomic(y.args[0])&&w.success(P)},"compound/1":function(w,P,y){x.type.is_compound(y.args[0])&&w.success(P)},"integer/1":function(w,P,y){x.type.is_integer(y.args[0])&&w.success(P)},"float/1":function(w,P,y){x.type.is_float(y.args[0])&&w.success(P)},"number/1":function(w,P,y){x.type.is_number(y.args[0])&&w.success(P)},"nonvar/1":function(w,P,y){x.type.is_variable(y.args[0])||w.success(P)},"ground/1":function(w,P,y){y.variables().length===0&&w.success(P)},"acyclic_term/1":function(w,P,y){for(var F=P.substitution.apply(P.substitution),z=y.args[0].variables(),Z=0;Z0?bt[bt.length-1]:null,bt!==null&&(qt=W(w,bt,0,w.__get_max_priority(),!1))}if(qt.type===p&&qt.len===bt.length-1&&gn.value==="."){qt=qt.value.rename(w);var br=new j("=",[z,qt]);if(oe.variables){var Ir=g(s(ye(qt.variables()),function(Or){return new De(Or)}));br=new j(",",[br,new j("=",[oe.variables,Ir])])}if(oe.variable_names){var Ir=g(s(ye(qt.variables()),function(nn){var ai;for(ai in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ai)&&w.session.renamed_variables[ai]===nn)break;return new j("=",[new j(ai,[]),new De(nn)])}));br=new j(",",[br,new j("=",[oe.variable_names,Ir])])}if(oe.singletons){var Ir=g(s(new Ve(qt,null).singleton_variables(),function(nn){var ai;for(ai in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(ai)&&w.session.renamed_variables[ai]===nn)break;return new j("=",[new j(ai,[]),new De(nn)])}));br=new j(",",[br,new j("=",[oe.singletons,Ir])])}w.prepend([new be(P.goal.replace(br),P.substitution,P)])}else qt.type===p?w.throw_error(x.error.syntax(bt[qt.len],"unexpected token",!1)):w.throw_error(qt.value)}}},"write/1":function(w,P,y){var F=y.args[0];w.prepend([new be(P.goal.replace(new j(",",[new j("current_output",[new De("S")]),new j("write",[new De("S"),F])])),P.substitution,P)])},"write/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j("write_term",[F,z,new j(".",[new j("quoted",[new j("false",[])]),new j(".",[new j("ignore_ops",[new j("false")]),new j(".",[new j("numbervars",[new j("true")]),new j("[]",[])])])])])),P.substitution,P)])},"writeq/1":function(w,P,y){var F=y.args[0];w.prepend([new be(P.goal.replace(new j(",",[new j("current_output",[new De("S")]),new j("writeq",[new De("S"),F])])),P.substitution,P)])},"writeq/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j("write_term",[F,z,new j(".",[new j("quoted",[new j("true",[])]),new j(".",[new j("ignore_ops",[new j("false")]),new j(".",[new j("numbervars",[new j("true")]),new j("[]",[])])])])])),P.substitution,P)])},"write_canonical/1":function(w,P,y){var F=y.args[0];w.prepend([new be(P.goal.replace(new j(",",[new j("current_output",[new De("S")]),new j("write_canonical",[new De("S"),F])])),P.substitution,P)])},"write_canonical/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j("write_term",[F,z,new j(".",[new j("quoted",[new j("true",[])]),new j(".",[new j("ignore_ops",[new j("true")]),new j(".",[new j("numbervars",[new j("false")]),new j("[]",[])])])])])),P.substitution,P)])},"write_term/2":function(w,P,y){var F=y.args[0],z=y.args[1];w.prepend([new be(P.goal.replace(new j(",",[new j("current_output",[new De("S")]),new j("write_term",[new De("S"),F,z])])),P.substitution,P)])},"write_term/3":function(w,P,y){var F=y.args[0],z=y.args[1],Z=y.args[2],$=x.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(x.type.is_variable(F)||x.type.is_variable(Z))w.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(Z))w.throw_error(x.error.type("list",Z,y.indicator));else if(!x.type.is_stream(F)&&!x.type.is_atom(F))w.throw_error(x.error.domain("stream_or_alias",F,y.indicator));else if(!x.type.is_stream($)||$.stream===null)w.throw_error(x.error.existence("stream",F,y.indicator));else if($.input)w.throw_error(x.error.permission("output","stream",F,y.indicator));else if($.type==="binary")w.throw_error(x.error.permission("output","binary_stream",F,y.indicator));else if($.position==="past_end_of_stream"&&$.eof_action==="error")w.throw_error(x.error.permission("output","past_end_of_stream",F,y.indicator));else{for(var oe={},xe=Z,Re;x.type.is_term(xe)&&xe.indicator==="./2";){if(Re=xe.args[0],x.type.is_variable(Re)){w.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Re)){w.throw_error(x.error.domain("write_option",Re,y.indicator));return}oe[Re.id]=Re.args[0].id==="true",xe=xe.args[1]}if(xe.indicator!=="[]/0"){x.type.is_variable(xe)?w.throw_error(x.error.instantiation(y.indicator)):w.throw_error(x.error.type("list",Z,y.indicator));return}else{oe.session=w.session;var lt=z.toString(oe);$.stream.put(lt,$.position),typeof $.position=="number"&&($.position+=lt.length),w.success(P)}}},"halt/0":function(w,P,y){w.points=[]},"halt/1":function(w,P,y){var F=y.args[0];x.type.is_variable(F)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(F)?w.points=[]:w.throw_error(x.error.type("integer",F,y.indicator))},"current_prolog_flag/2":function(w,P,y){var F=y.args[0],z=y.args[1];if(!x.type.is_variable(F)&&!x.type.is_atom(F))w.throw_error(x.error.type("atom",F,y.indicator));else if(!x.type.is_variable(F)&&!x.type.is_flag(F))w.throw_error(x.error.domain("prolog_flag",F,y.indicator));else{var Z=[];for(var $ in x.flag)if(x.flag.hasOwnProperty($)){var oe=new j(",",[new j("=",[new j($),F]),new j("=",[w.get_flag($),z])]);Z.push(new be(P.goal.replace(oe),P.substitution,P))}w.prepend(Z)}},"set_prolog_flag/2":function(w,P,y){var F=y.args[0],z=y.args[1];x.type.is_variable(F)||x.type.is_variable(z)?w.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(F)?x.type.is_flag(F)?x.type.is_value_flag(F,z)?x.type.is_modifiable_flag(F)?(w.session.flag[F.id]=z,w.success(P)):w.throw_error(x.error.permission("modify","flag",F)):w.throw_error(x.error.domain("flag_value",new j("+",[F,z]),y.indicator)):w.throw_error(x.error.domain("prolog_flag",F,y.indicator)):w.throw_error(x.error.type("atom",F,y.indicator))}},flag:{bounded:{allowed:[new j("true"),new j("false")],value:new j("true"),changeable:!1},max_integer:{allowed:[new Te(Number.MAX_SAFE_INTEGER)],value:new Te(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Te(Number.MIN_SAFE_INTEGER)],value:new Te(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new j("down"),new j("toward_zero")],value:new j("toward_zero"),changeable:!1},char_conversion:{allowed:[new j("on"),new j("off")],value:new j("on"),changeable:!0},debug:{allowed:[new j("on"),new j("off")],value:new j("off"),changeable:!0},max_arity:{allowed:[new j("unbounded")],value:new j("unbounded"),changeable:!1},unknown:{allowed:[new j("error"),new j("fail"),new j("warning")],value:new j("error"),changeable:!0},double_quotes:{allowed:[new j("chars"),new j("codes"),new j("atom")],value:new j("codes"),changeable:!0},occurs_check:{allowed:[new j("false"),new j("true")],value:new j("false"),changeable:!0},dialect:{allowed:[new j("tau")],value:new j("tau"),changeable:!1},version_data:{allowed:[new j("tau",[new Te(t.major,!1),new Te(t.minor,!1),new Te(t.patch,!1),new j(t.status)])],value:new j("tau",[new Te(t.major,!1),new Te(t.minor,!1),new Te(t.patch,!1),new j(t.status)]),changeable:!1},nodejs:{allowed:[new j("yes"),new j("no")],value:new j(typeof ec<"u"&&ec.exports?"yes":"no"),changeable:!1}},unify:function(w,P,y){y=y===void 0?!1:y;for(var F=[{left:w,right:P}],z={};F.length!==0;){var Z=F.pop();if(w=Z.left,P=Z.right,x.type.is_term(w)&&x.type.is_term(P)){if(w.indicator!==P.indicator)return null;for(var $=0;$z.value?1:0:z}else return F},operate:function(w,P){if(x.type.is_operator(P)){for(var y=x.type.is_operator(P),F=[],z,Z=!1,$=0;$w.get_flag("max_integer").value||z0?w.start+w.matches[0].length:w.start,z=y?new j("token_not_found"):new j("found",[new j(w.value.toString())]),Z=new j(".",[new j("line",[new Te(w.line+1)]),new j(".",[new j("column",[new Te(F+1)]),new j(".",[z,new j("[]",[])])])]);return new j("error",[new j("syntax_error",[new j(P)]),Z])},syntax_by_predicate:function(w,P){return new j("error",[new j("syntax_error",[new j(w)]),X(P)])}},warning:{singleton:function(w,P,y){for(var F=new j("[]"),z=w.length-1;z>=0;z--)F=new j(".",[new De(w[z]),F]);return new j("warning",[new j("singleton_variables",[F,X(P)]),new j(".",[new j("line",[new Te(y,!1)]),new j("[]")])])},failed_goal:function(w,P){return new j("warning",[new j("failed_goal",[w]),new j(".",[new j("line",[new Te(P,!1)]),new j("[]")])])}},format_variable:function(w){return"_"+w},format_answer:function(w,P,F){P instanceof ke&&(P=P.thread);var F=F||{};if(F.session=P?P.session:void 0,x.type.is_error(w))return"uncaught exception: "+w.args[0].toString();if(w===!1)return"false.";if(w===null)return"limit exceeded ;";var z=0,Z="";if(x.type.is_substitution(w)){var $=w.domain(!0);w=w.filter(function(Re,lt){return!x.type.is_variable(lt)||$.indexOf(lt.id)!==-1&&Re!==lt.id})}for(var oe in w.links)w.links.hasOwnProperty(oe)&&(z++,Z!==""&&(Z+=", "),Z+=oe.toString(F)+" = "+w.links[oe].toString(F));var xe=typeof P>"u"||P.points.length>0?" ;":".";return z===0?"true"+xe:Z+xe},flatten_error:function(w){if(!x.type.is_error(w))return null;w=w.args[0];var P={};return P.type=w.args[0].id,P.thrown=P.type==="syntax_error"?null:w.args[1].id,P.expected=null,P.found=null,P.representation=null,P.existence=null,P.existence_type=null,P.line=null,P.column=null,P.permission_operation=null,P.permission_type=null,P.evaluation_type=null,P.type==="type_error"||P.type==="domain_error"?(P.expected=w.args[0].args[0].id,P.found=w.args[0].args[1].toString()):P.type==="syntax_error"?w.args[1].indicator==="./2"?(P.expected=w.args[0].args[0].id,P.found=w.args[1].args[1].args[1].args[0],P.found=P.found.id==="token_not_found"?P.found.id:P.found.args[0].id,P.line=w.args[1].args[0].args[0].value,P.column=w.args[1].args[1].args[0].args[0].value):P.thrown=w.args[1].id:P.type==="permission_error"?(P.found=w.args[0].args[2].toString(),P.permission_operation=w.args[0].args[0].id,P.permission_type=w.args[0].args[1].id):P.type==="evaluation_error"?P.evaluation_type=w.args[0].args[0].id:P.type==="representation_error"?P.representation=w.args[0].args[0].id:P.type==="existence_error"&&(P.existence=w.args[0].args[1].toString(),P.existence_type=w.args[0].args[0].id),P},create:function(w){return new x.type.Session(w)}};typeof ec<"u"?ec.exports=x:window.pl=x})()});function hEe(t,e,r){t.prepend(r.map(s=>new hl.default.type.State(e.goal.replace(s),e.substitution,e)))}function k5(t){let e=dEe.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function mEe(t,e){dEe.set(t,e),t.consult(`:- use_module(library(${qct.id})).`)}var hl,gEe,J0,jct,Gct,dEe,qct,yEe=Ze(()=>{Ge();ql();hl=ut(x5()),gEe=ut(Ie("vm")),{is_atom:J0,is_variable:jct,is_instantiated_list:Gct}=hl.default.type;dEe=new WeakMap;qct=new hl.default.type.Module("constraints",{"project_workspaces_by_descriptor/3":(t,e,r)=>{let[s,a,n]=r.args;if(!J0(s)||!J0(a)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let c=G.parseIdent(s.id),f=G.makeDescriptor(c,a.id),h=k5(t).tryWorkspaceByDescriptor(f);jct(n)&&h!==null&&hEe(t,e,[new hl.default.type.Term("=",[n,new hl.default.type.Term(String(h.relativeCwd))])]),J0(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},"workspace_field/3":(t,e,r)=>{let[s,a,n]=r.args;if(!J0(s)||!J0(a)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let f=k5(t).tryWorkspaceByCwd(s.id);if(f==null)return;let p=va(f.manifest.raw,a.id);typeof p>"u"||hEe(t,e,[new hl.default.type.Term("=",[n,new hl.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},"workspace_field_test/3":(t,e,r)=>{let[s,a,n]=r.args;t.prepend([new hl.default.type.State(e.goal.replace(new hl.default.type.Term("workspace_field_test",[s,a,n,new hl.default.type.Term("[]",[])])),e.substitution,e)])},"workspace_field_test/4":(t,e,r)=>{let[s,a,n,c]=r.args;if(!J0(s)||!J0(a)||!J0(n)||!Gct(c)){t.throw_error(hl.default.error.instantiation(r.indicator));return}let p=k5(t).tryWorkspaceByCwd(s.id);if(p==null)return;let h=va(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[S,b]of c.toJavaScript().entries())E[`$${S}`]=b;gEe.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var aS={};Vt(aS,{Constraints:()=>R5,DependencyType:()=>wEe});function go(t){if(t instanceof KC.default.type.Num)return t.value;if(t instanceof KC.default.type.Term)switch(t.indicator){case"throw/1":return go(t.args[0]);case"error/1":return go(t.args[0]);case"error/2":if(t.args[0]instanceof KC.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(go(t.args[0]),...go(t.args[1]));{let e=go(t.args[0]);return e.message+=` (in ${go(t.args[1])})`,e}case"syntax_error/1":return new jt(43,`Syntax error: ${go(t.args[0])}`);case"existence_error/2":return new jt(44,`Existence error: ${go(t.args[0])} ${go(t.args[1])} not found`);case"instantiation_error/0":return new jt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:go(t.args[0])};case"column/1":return{column:go(t.args[0])};case"found/1":return{found:go(t.args[0])};case"./2":return[go(t.args[0])].concat(go(t.args[1]));case"//2":return`${go(t.args[0])}/${go(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function IEe(t){let e;try{e=go(t)}catch(r){throw typeof r=="string"?new jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function bm(t){return t.id==="null"?null:`${t.toJavaScript()}`}function Wct(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function K0(t){return typeof t=="string"?`'${t}'`:"[]"}var CEe,KC,wEe,EEe,Q5,R5,lS=Ze(()=>{Ge();Ge();Dt();CEe=ut(Xye()),KC=ut(x5());iS();yEe();(0,CEe.default)(KC.default);wEe=(s=>(s.Dependencies="dependencies",s.DevDependencies="devDependencies",s.PeerDependencies="peerDependencies",s))(wEe||{}),EEe=["dependencies","devDependencies","peerDependencies"];Q5=class{constructor(e,r){let s=1e3*e.workspaces.length;this.session=KC.default.create(s),mEe(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw IEe(r);for(;;){let s=await this.fetchNextAnswer();if(s===null)throw new jt(79,"Resolution limit exceeded");if(!s)break;if(s.id==="throw")throw IEe(s);yield s}}};R5=class t{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");ce.existsSync(r)&&(this.source=ce.readFileSync(r,"utf8"))}static async find(e){return new t(e)}getProjectDatabase(){let e="";for(let r of EEe)e+=`dependency_type(${r}). `;for(let r of this.project.workspacesByCwd.values()){let s=r.relativeCwd;e+=`workspace(${K0(s)}). `,e+=`workspace_ident(${K0(s)}, ${K0(G.stringifyIdent(r.anchoredLocator))}). `,e+=`workspace_version(${K0(s)}, ${K0(r.manifest.version)}). `;for(let a of EEe)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${K0(s)}, ${K0(G.stringifyIdent(n))}, ${K0(n.range)}, ${a}). `}return e+=`workspace(_) :- false. `,e+=`workspace_ident(_, _) :- false. `,e+=`workspace_version(_, _) :- false. `,e+=`workspace_has_dependency(_, _, _, _) :- false. `,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. `,e+=`gen_enforced_field(_, _, _) :- false. `,e}get fullSource(){return`${this.getProjectDatabase()} ${this.source} ${this.getDeclarations()}`}createSession(){return new Q5(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),s=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:c,dependencyType:f}of e){let p=nS([f,G.stringifyIdent(n)]),h=je.getMapWithDefault(s,a.cwd);je.getMapWithDefault(h,p).set(c??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:c}of r){let f=nS(n),p=je.getMapWithDefault(s,a.cwd);je.getMapWithDefault(p,f).set(JSON.parse(c)??void 0,new Set)}return{manifestUpdates:s,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let s of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=J.resolve(this.project.cwd,bm(s.links.WorkspaceCwd)),n=bm(s.links.DependencyIdent),c=bm(s.links.DependencyRange),f=bm(s.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=G.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:c,dependencyType:f})}return je.sortMap(r,[({dependencyRange:s})=>s!==null?"0":"1",({workspace:s})=>G.stringifyIdent(s.anchoredLocator),({dependencyIdent:s})=>G.stringifyIdent(s)])}async genEnforcedFields(e){let r=[];for await(let s of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=J.resolve(this.project.cwd,bm(s.links.WorkspaceCwd)),n=bm(s.links.FieldPath),c=Wct(s.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let f=this.project.getWorkspaceByCwd(a);r.push({workspace:f,fieldPath:n,fieldValue:c})}return je.sortMap(r,[({workspace:s})=>G.stringifyIdent(s.anchoredLocator),({fieldPath:s})=>s])}async*query(e){let r=this.createSession();for await(let s of r.makeQuery(e)){let a={};for(let[n,c]of Object.entries(s.links))n!=="_"&&(a[n]=bm(c));yield a}}}});var QEe=_(uF=>{"use strict";Object.defineProperty(uF,"__esModule",{value:!0});function BS(t){let e=[...t.caches],r=e.shift();return r===void 0?kEe():{get(s,a,n={miss:()=>Promise.resolve()}){return r.get(s,a,n).catch(()=>BS({caches:e}).get(s,a,n))},set(s,a){return r.set(s,a).catch(()=>BS({caches:e}).set(s,a))},delete(s){return r.delete(s).catch(()=>BS({caches:e}).delete(s))},clear(){return r.clear().catch(()=>BS({caches:e}).clear())}}}function kEe(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}uF.createFallbackableCache=BS;uF.createNullCache=kEe});var TEe=_((iJt,REe)=>{REe.exports=QEe()});var FEe=_(Y5=>{"use strict";Object.defineProperty(Y5,"__esModule",{value:!0});function uut(t={serializable:!0}){let e={};return{get(r,s,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let c=s(),f=a&&a.miss||(()=>Promise.resolve());return c.then(p=>f(p)).then(()=>c)},set(r,s){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(s):s,Promise.resolve(s)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}Y5.createInMemoryCache=uut});var OEe=_((oJt,NEe)=>{NEe.exports=FEe()});var MEe=_($u=>{"use strict";Object.defineProperty($u,"__esModule",{value:!0});function fut(t,e,r){let s={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===V5.WithinHeaders?s:{}},queryParameters(){return t===V5.WithinQueryParameters?s:{}}}}function Aut(t){let e=0,r=()=>(e++,new Promise(s=>{setTimeout(()=>{s(t(r))},Math.min(100*e,1e3))}));return t(r)}function LEe(t,e=(r,s)=>Promise.resolve()){return Object.assign(t,{wait(r){return LEe(t.then(s=>Promise.all([e(s,r),s])).then(s=>s[1]))}})}function put(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),s=t[e];t[e]=t[r],t[r]=s}return t}function hut(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function gut(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var dut="4.22.1",mut=t=>()=>t.transporter.requester.destroy(),V5={WithinQueryParameters:0,WithinHeaders:1};$u.AuthMode=V5;$u.addMethods=hut;$u.createAuth=fut;$u.createRetryablePromise=Aut;$u.createWaitablePromise=LEe;$u.destroy=mut;$u.encode=gut;$u.shuffle=put;$u.version=dut});var vS=_((lJt,UEe)=>{UEe.exports=MEe()});var _Ee=_(J5=>{"use strict";Object.defineProperty(J5,"__esModule",{value:!0});var yut={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};J5.MethodEnum=yut});var SS=_((uJt,HEe)=>{HEe.exports=_Ee()});var rIe=_(Wi=>{"use strict";Object.defineProperty(Wi,"__esModule",{value:!0});var GEe=SS();function K5(t,e){let r=t||{},s=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(s[a]=r[a])}),{data:Object.entries(s).length>0?s:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var DS={Read:1,Write:2,Any:3},sw={Up:1,Down:2,Timeouted:3},qEe=2*60*1e3;function Z5(t,e=sw.Up){return{...t,status:e,lastUpdate:Date.now()}}function WEe(t){return t.status===sw.Up||Date.now()-t.lastUpdate>qEe}function YEe(t){return t.status===sw.Timeouted&&Date.now()-t.lastUpdate<=qEe}function X5(t){return typeof t=="string"?{protocol:"https",url:t,accept:DS.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||DS.Any}}function Eut(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(Z5(r))))).then(r=>{let s=r.filter(f=>WEe(f)),a=r.filter(f=>YEe(f)),n=[...s,...a],c=n.length>0?n.map(f=>X5(f)):e;return{getTimeout(f,p){return(a.length===0&&f===0?1:a.length+3+f)*p},statelessHosts:c}})}var Iut=({isTimedOut:t,status:e})=>!t&&~~e===0,Cut=t=>{let e=t.status;return t.isTimedOut||Iut(t)||~~(e/100)!==2&&~~(e/100)!==4},wut=({status:t})=>~~(t/100)===2,But=(t,e)=>Cut(t)?e.onRetry(t):wut(t)?e.onSuccess(t):e.onFail(t);function jEe(t,e,r,s){let a=[],n=ZEe(r,s),c=XEe(t,s),f=r.method,p=r.method!==GEe.MethodEnum.Get?{}:{...r.data,...s.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...s.queryParameters},E=0,C=(S,b)=>{let I=S.pop();if(I===void 0)throw tIe(z5(a));let T={data:n,headers:c,method:f,url:KEe(I,r.path,h),connectTimeout:b(E,t.timeouts.connect),responseTimeout:b(E,s.timeout)},N=W=>{let ee={request:T,response:W,host:I,triesLeft:S.length};return a.push(ee),ee},U={onSuccess:W=>VEe(W),onRetry(W){let ee=N(W);return W.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",$5(ee)),t.hostsCache.set(I,Z5(I,W.isTimedOut?sw.Timeouted:sw.Down))]).then(()=>C(S,b))},onFail(W){throw N(W),JEe(W,z5(a))}};return t.requester.send(T).then(W=>But(W,U))};return Eut(t.hostsCache,e).then(S=>C([...S.statelessHosts].reverse(),S.getTimeout))}function vut(t){let{hostsCache:e,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,hosts:p,queryParameters:h,headers:E}=t,C={hostsCache:e,logger:r,requester:s,requestsCache:a,responsesCache:n,timeouts:c,userAgent:f,headers:E,queryParameters:h,hosts:p.map(S=>X5(S)),read(S,b){let I=K5(b,C.timeouts.read),T=()=>jEe(C,C.hosts.filter(W=>(W.accept&DS.Read)!==0),S,I);if((I.cacheable!==void 0?I.cacheable:S.cacheable)!==!0)return T();let U={request:S,mappedRequestOptions:I,transporter:{queryParameters:C.queryParameters,headers:C.headers}};return C.responsesCache.get(U,()=>C.requestsCache.get(U,()=>C.requestsCache.set(U,T()).then(W=>Promise.all([C.requestsCache.delete(U),W]),W=>Promise.all([C.requestsCache.delete(U),Promise.reject(W)])).then(([W,ee])=>ee)),{miss:W=>C.responsesCache.set(U,W)})},write(S,b){return jEe(C,C.hosts.filter(I=>(I.accept&DS.Write)!==0),S,K5(b,C.timeouts.write))}};return C}function Sut(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let s=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(s)===-1&&(e.value=`${e.value}${s}`),e}};return e}function VEe(t){try{return JSON.parse(t.content)}catch(e){throw eIe(e.message,t)}}function JEe({content:t,status:e},r){let s=t;try{s=JSON.parse(t).message}catch{}return $Ee(s,e,r)}function Dut(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function KEe(t,e,r){let s=zEe(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return s.length&&(a+=`?${s}`),a}function zEe(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Dut("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function ZEe(t,e){if(t.method===GEe.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function XEe(t,e){let r={...t.headers,...e.headers},s={};return Object.keys(r).forEach(a=>{let n=r[a];s[a.toLowerCase()]=n}),s}function z5(t){return t.map(e=>$5(e))}function $5(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function $Ee(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function eIe(t,e){return{name:"DeserializationError",message:t,response:e}}function tIe(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}Wi.CallEnum=DS;Wi.HostStatusEnum=sw;Wi.createApiError=$Ee;Wi.createDeserializationError=eIe;Wi.createMappedRequestOptions=K5;Wi.createRetryError=tIe;Wi.createStatefulHost=Z5;Wi.createStatelessHost=X5;Wi.createTransporter=vut;Wi.createUserAgent=Sut;Wi.deserializeFailure=JEe;Wi.deserializeSuccess=VEe;Wi.isStatefulHostTimeouted=YEe;Wi.isStatefulHostUp=WEe;Wi.serializeData=ZEe;Wi.serializeHeaders=XEe;Wi.serializeQueryParameters=zEe;Wi.serializeUrl=KEe;Wi.stackFrameWithoutCredentials=$5;Wi.stackTraceWithoutCredentials=z5});var PS=_((AJt,nIe)=>{nIe.exports=rIe()});var iIe=_(Z0=>{"use strict";Object.defineProperty(Z0,"__esModule",{value:!0});var ow=vS(),Put=PS(),bS=SS(),but=t=>{let e=t.region||"us",r=ow.createAuth(ow.AuthMode.WithinHeaders,t.appId,t.apiKey),s=Put.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return ow.addMethods({appId:a,transporter:s},t.methods)},xut=t=>(e,r)=>t.transporter.write({method:bS.MethodEnum.Post,path:"2/abtests",data:e},r),kut=t=>(e,r)=>t.transporter.write({method:bS.MethodEnum.Delete,path:ow.encode("2/abtests/%s",e)},r),Qut=t=>(e,r)=>t.transporter.read({method:bS.MethodEnum.Get,path:ow.encode("2/abtests/%s",e)},r),Rut=t=>e=>t.transporter.read({method:bS.MethodEnum.Get,path:"2/abtests"},e),Tut=t=>(e,r)=>t.transporter.write({method:bS.MethodEnum.Post,path:ow.encode("2/abtests/%s/stop",e)},r);Z0.addABTest=xut;Z0.createAnalyticsClient=but;Z0.deleteABTest=kut;Z0.getABTest=Qut;Z0.getABTests=Rut;Z0.stopABTest=Tut});var oIe=_((hJt,sIe)=>{sIe.exports=iIe()});var lIe=_(xS=>{"use strict";Object.defineProperty(xS,"__esModule",{value:!0});var e9=vS(),Fut=PS(),aIe=SS(),Nut=t=>{let e=t.region||"us",r=e9.createAuth(e9.AuthMode.WithinHeaders,t.appId,t.apiKey),s=Fut.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return e9.addMethods({appId:t.appId,transporter:s},t.methods)},Out=t=>e=>t.transporter.read({method:aIe.MethodEnum.Get,path:"1/strategies/personalization"},e),Lut=t=>(e,r)=>t.transporter.write({method:aIe.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);xS.createPersonalizationClient=Nut;xS.getPersonalizationStrategy=Out;xS.setPersonalizationStrategy=Lut});var uIe=_((dJt,cIe)=>{cIe.exports=lIe()});var vIe=_(Ft=>{"use strict";Object.defineProperty(Ft,"__esModule",{value:!0});var Jt=vS(),gl=PS(),Pr=SS(),Mut=Ie("crypto");function fF(t){let e=r=>t.request(r).then(s=>{if(t.batch!==void 0&&t.batch(s.hits),!t.shouldStop(s))return s.cursor?e({cursor:s.cursor}):e({page:(r.page||0)+1})});return e({})}var Uut=t=>{let e=t.appId,r=Jt.createAuth(t.authMode!==void 0?t.authMode:Jt.AuthMode.WithinHeaders,e,t.apiKey),s=gl.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:gl.CallEnum.Read},{url:`${e}.algolia.net`,accept:gl.CallEnum.Write}].concat(Jt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:s,appId:e,addAlgoliaAgent(n,c){s.userAgent.add({segment:n,version:c})},clearCache(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then(()=>{})}};return Jt.addMethods(a,t.methods)};function fIe(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function AIe(){return{name:"ObjectNotFoundError",message:"Object not found."}}function pIe(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var _ut=t=>(e,r)=>{let{queryParameters:s,...a}=r||{},n={acl:e,...s!==void 0?{queryParameters:s}:{}},c=(f,p)=>Jt.createRetryablePromise(h=>kS(t)(f.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:"1/keys",data:n},a),c)},Hut=t=>(e,r,s)=>{let a=gl.createMappedRequestOptions(s);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Pr.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},jut=t=>(e,r,s)=>t.transporter.write({method:Pr.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},s),Gut=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(s,a)=>aw(t)(s.taskID,a)),AF=t=>(e,r,s)=>{let a=(n,c)=>QS(t)(e,{methods:{waitTask:hs}}).waitTask(n.taskID,c);return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},s),a)},qut=t=>(e,r,s)=>AF(t)(e,r,{...s,scope:[hF.Rules]}),Wut=t=>(e,r,s)=>AF(t)(e,r,{...s,scope:[hF.Settings]}),Yut=t=>(e,r,s)=>AF(t)(e,r,{...s,scope:[hF.Synonyms]}),Vut=t=>(e,r)=>e.method===Pr.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),Jut=t=>(e,r)=>{let s=(a,n)=>Jt.createRetryablePromise(c=>kS(t)(e,n).then(c).catch(f=>{if(f.status!==404)throw f}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Delete,path:Jt.encode("1/keys/%s",e)},r),s)},Kut=t=>(e,r,s)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},zut=()=>(t,e)=>{let r=gl.serializeQueryParameters(e),s=Mut.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(s+r).toString("base64")},kS=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/keys/%s",e)},r),hIe=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/task/%s",e.toString())},r),Zut=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),Xut=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/logs"},e),$ut=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,s=e.match(r);if(s===null)throw pIe();return parseInt(s[1],10)-Math.round(new Date().getTime()/1e3)},eft=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/clusters/mapping/top"},e),tft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/clusters/mapping/%s",e)},r),rft=t=>e=>{let{retrieveMappings:r,...s}=e||{};return r===!0&&(s.getClusters=!0),t.transporter.read({method:Pr.MethodEnum.Get,path:"1/clusters/mapping/pending"},s)},QS=t=>(e,r={})=>{let s={transporter:t.transporter,appId:t.appId,indexName:e};return Jt.addMethods(s,r.methods)},nft=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/keys"},e),ift=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/clusters"},e),sft=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/indexes"},e),oft=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:"1/clusters/mapping"},e),aft=t=>(e,r,s)=>{let a=(n,c)=>QS(t)(e,{methods:{waitTask:hs}}).waitTask(n.taskID,c);return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},s),a)},lft=t=>(e,r)=>{let s=(a,n)=>Promise.all(Object.keys(a.taskID).map(c=>QS(t)(c,{methods:{waitTask:hs}}).waitTask(a.taskID[c],n)));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),s)},cft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),uft=t=>(e,r)=>{let s=e.map(a=>({...a,params:gl.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Pr.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:s},cacheable:!0},r)},fft=t=>(e,r)=>Promise.all(e.map(s=>{let{facetName:a,facetQuery:n,...c}=s.params;return QS(t)(s.indexName,{methods:{searchForFacetValues:CIe}}).searchForFacetValues(a,n,{...r,...c})})),Aft=t=>(e,r)=>{let s=gl.createMappedRequestOptions(r);return s.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Pr.MethodEnum.Delete,path:"1/clusters/mapping"},s)},pft=t=>(e,r,s)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},hft=t=>(e,r)=>{let s=(a,n)=>Jt.createRetryablePromise(c=>kS(t)(e,n).catch(f=>{if(f.status!==404)throw f;return c()}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/keys/%s/restore",e)},r),s)},gft=t=>(e,r,s)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},s),(n,c)=>aw(t)(n.taskID,c))},dft=t=>(e,r,s)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},s),mft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),yft=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(s,a)=>aw(t)(s.taskID,a)),Eft=t=>(e,r)=>{let s=Object.assign({},r),{queryParameters:a,...n}=r||{},c=a?{queryParameters:a}:{},f=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(s).filter(C=>f.indexOf(C)!==-1).every(C=>{if(Array.isArray(E[C])&&Array.isArray(s[C])){let S=E[C];return S.length===s[C].length&&S.every((b,I)=>b===s[C][I])}else return E[C]===s[C]}),h=(E,C)=>Jt.createRetryablePromise(S=>kS(t)(e,C).then(b=>p(b)?Promise.resolve():S()));return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Put,path:Jt.encode("1/keys/%s",e),data:c},n),h)},aw=t=>(e,r)=>Jt.createRetryablePromise(s=>hIe(t)(e,r).then(a=>a.status!=="published"?s():void 0)),gIe=t=>(e,r)=>{let s=(a,n)=>hs(t)(a.taskID,n);return Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),s)},Ift=t=>e=>fF({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),Cft=t=>e=>{let r={hitsPerPage:1e3,...e};return fF({shouldStop:s=>s.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},wft=t=>e=>{let r={hitsPerPage:1e3,...e};return fF({shouldStop:s=>s.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},pF=t=>(e,r,s)=>{let{batchSize:a,...n}=s||{},c={taskIDs:[],objectIDs:[]},f=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:C})),n).then(C=>(c.objectIDs=c.objectIDs.concat(C.objectIDs),c.taskIDs.push(C.taskID),E++,f(E)))};return Jt.createWaitablePromise(f(),(p,h)=>Promise.all(p.taskIDs.map(E=>hs(t)(E,h))))},Bft=t=>e=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/clear",t.indexName)},e),(r,s)=>hs(t)(r.taskID,s)),vft=t=>e=>{let{forwardToReplicas:r,...s}=e||{},a=gl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,c)=>hs(t)(n.taskID,c))},Sft=t=>e=>{let{forwardToReplicas:r,...s}=e||{},a=gl.createMappedRequestOptions(s);return r&&(a.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,c)=>hs(t)(n.taskID,c))},Dft=t=>(e,r)=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(s,a)=>hs(t)(s.taskID,a)),Pft=t=>e=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Delete,path:Jt.encode("1/indexes/%s",t.indexName)},e),(r,s)=>hs(t)(r.taskID,s)),bft=t=>(e,r)=>Jt.createWaitablePromise(dIe(t)([e],r).then(s=>({taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),dIe=t=>(e,r)=>{let s=e.map(a=>({objectID:a}));return pF(t)(s,km.DeleteObject,r)},xft=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Delete,path:Jt.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(c,f)=>hs(t)(c.taskID,f))},kft=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Delete,path:Jt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(c,f)=>hs(t)(c.taskID,f))},Qft=t=>e=>mIe(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Rft=t=>(e,r,s)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},s),Tft=t=>(e,r)=>{let{query:s,paginate:a,...n}=r||{},c=0,f=()=>IIe(t)(s||"",{...n,page:c}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:c};if(c++,a===!1||c>=p.nbPages)throw AIe();return f()});return f()},Fft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/indexes/%s/%s",t.indexName,e)},r),Nft=()=>(t,e)=>{for(let[r,s]of Object.entries(t.hits))if(s.objectID===e)return parseInt(r,10);return-1},Oft=t=>(e,r)=>{let{attributesToRetrieve:s,...a}=r||{},n=e.map(c=>({indexName:t.indexName,objectID:c,...s?{attributesToRetrieve:s}:{}}));return t.transporter.read({method:Pr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},Lft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),mIe=t=>e=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),Mft=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),yIe=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Get,path:Jt.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),Uft=t=>(e,r)=>Jt.createWaitablePromise(EIe(t)([e],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),EIe=t=>(e,r)=>{let{createIfNotExists:s,...a}=r||{},n=s?km.PartialUpdateObject:km.PartialUpdateObjectNoCreate;return pF(t)(e,n,a)},_ft=t=>(e,r)=>{let{safe:s,autoGenerateObjectIDIfNotExist:a,batchSize:n,...c}=r||{},f=(I,T,N,U)=>Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/operation",I),data:{operation:N,destination:T}},U),(W,ee)=>hs(t)(W.taskID,ee)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=t9({appId:t.appId,transporter:t.transporter,indexName:h}),C=[],S=f(t.indexName,h,"copy",{...c,scope:["settings","synonyms","rules"]});C.push(S);let b=(s?S.wait(c):S).then(()=>{let I=E(e,{...c,autoGenerateObjectIDIfNotExist:a,batchSize:n});return C.push(I),s?I.wait(c):I}).then(()=>{let I=f(h,t.indexName,"move",c);return C.push(I),s?I.wait(c):I}).then(()=>Promise.all(C)).then(([I,T,N])=>({objectIDs:T.objectIDs,taskIDs:[I.taskID,...T.taskIDs,N.taskID]}));return Jt.createWaitablePromise(b,(I,T)=>Promise.all(C.map(N=>N.wait(T))))},Hft=t=>(e,r)=>r9(t)(e,{...r,clearExistingRules:!0}),jft=t=>(e,r)=>n9(t)(e,{...r,clearExistingSynonyms:!0}),Gft=t=>(e,r)=>Jt.createWaitablePromise(t9(t)([e],r).then(s=>({objectID:s.objectIDs[0],taskID:s.taskIDs[0]})),(s,a)=>hs(t)(s.taskID,a)),t9=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:s,...a}=r||{},n=s?km.AddObject:km.UpdateObject;if(n===km.UpdateObject){for(let c of e)if(c.objectID===void 0)return Jt.createWaitablePromise(Promise.reject(fIe()))}return pF(t)(e,n,a)},qft=t=>(e,r)=>r9(t)([e],r),r9=t=>(e,r)=>{let{forwardToReplicas:s,clearExistingRules:a,...n}=r||{},c=gl.createMappedRequestOptions(n);return s&&(c.queryParameters.forwardToReplicas=1),a&&(c.queryParameters.clearExistingRules=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/rules/batch",t.indexName),data:e},c),(f,p)=>hs(t)(f.taskID,p))},Wft=t=>(e,r)=>n9(t)([e],r),n9=t=>(e,r)=>{let{forwardToReplicas:s,clearExistingSynonyms:a,replaceExistingSynonyms:n,...c}=r||{},f=gl.createMappedRequestOptions(c);return s&&(f.queryParameters.forwardToReplicas=1),(n||a)&&(f.queryParameters.replaceExistingSynonyms=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},f),(p,h)=>hs(t)(p.taskID,h))},IIe=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),CIe=t=>(e,r,s)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},s),wIe=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),BIe=t=>(e,r)=>t.transporter.read({method:Pr.MethodEnum.Post,path:Jt.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),Yft=t=>(e,r)=>{let{forwardToReplicas:s,...a}=r||{},n=gl.createMappedRequestOptions(a);return s&&(n.queryParameters.forwardToReplicas=1),Jt.createWaitablePromise(t.transporter.write({method:Pr.MethodEnum.Put,path:Jt.encode("1/indexes/%s/settings",t.indexName),data:e},n),(c,f)=>hs(t)(c.taskID,f))},hs=t=>(e,r)=>Jt.createRetryablePromise(s=>yIe(t)(e,r).then(a=>a.status!=="published"?s():void 0)),Vft={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",Inference:"inference",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},km={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},hF={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Jft={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},Kft={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Ft.ApiKeyACLEnum=Vft;Ft.BatchActionEnum=km;Ft.ScopeEnum=hF;Ft.StrategyEnum=Jft;Ft.SynonymEnum=Kft;Ft.addApiKey=_ut;Ft.assignUserID=Hut;Ft.assignUserIDs=jut;Ft.batch=gIe;Ft.browseObjects=Ift;Ft.browseRules=Cft;Ft.browseSynonyms=wft;Ft.chunkedBatch=pF;Ft.clearDictionaryEntries=Gut;Ft.clearObjects=Bft;Ft.clearRules=vft;Ft.clearSynonyms=Sft;Ft.copyIndex=AF;Ft.copyRules=qut;Ft.copySettings=Wut;Ft.copySynonyms=Yut;Ft.createBrowsablePromise=fF;Ft.createMissingObjectIDError=fIe;Ft.createObjectNotFoundError=AIe;Ft.createSearchClient=Uut;Ft.createValidUntilNotFoundError=pIe;Ft.customRequest=Vut;Ft.deleteApiKey=Jut;Ft.deleteBy=Dft;Ft.deleteDictionaryEntries=Kut;Ft.deleteIndex=Pft;Ft.deleteObject=bft;Ft.deleteObjects=dIe;Ft.deleteRule=xft;Ft.deleteSynonym=kft;Ft.exists=Qft;Ft.findAnswers=Rft;Ft.findObject=Tft;Ft.generateSecuredApiKey=zut;Ft.getApiKey=kS;Ft.getAppTask=hIe;Ft.getDictionarySettings=Zut;Ft.getLogs=Xut;Ft.getObject=Fft;Ft.getObjectPosition=Nft;Ft.getObjects=Oft;Ft.getRule=Lft;Ft.getSecuredApiKeyRemainingValidity=$ut;Ft.getSettings=mIe;Ft.getSynonym=Mft;Ft.getTask=yIe;Ft.getTopUserIDs=eft;Ft.getUserID=tft;Ft.hasPendingMappings=rft;Ft.initIndex=QS;Ft.listApiKeys=nft;Ft.listClusters=ift;Ft.listIndices=sft;Ft.listUserIDs=oft;Ft.moveIndex=aft;Ft.multipleBatch=lft;Ft.multipleGetObjects=cft;Ft.multipleQueries=uft;Ft.multipleSearchForFacetValues=fft;Ft.partialUpdateObject=Uft;Ft.partialUpdateObjects=EIe;Ft.removeUserID=Aft;Ft.replaceAllObjects=_ft;Ft.replaceAllRules=Hft;Ft.replaceAllSynonyms=jft;Ft.replaceDictionaryEntries=pft;Ft.restoreApiKey=hft;Ft.saveDictionaryEntries=gft;Ft.saveObject=Gft;Ft.saveObjects=t9;Ft.saveRule=qft;Ft.saveRules=r9;Ft.saveSynonym=Wft;Ft.saveSynonyms=n9;Ft.search=IIe;Ft.searchDictionaryEntries=dft;Ft.searchForFacetValues=CIe;Ft.searchRules=wIe;Ft.searchSynonyms=BIe;Ft.searchUserIDs=mft;Ft.setDictionarySettings=yft;Ft.setSettings=Yft;Ft.updateApiKey=Eft;Ft.waitAppTask=aw;Ft.waitTask=hs});var DIe=_((yJt,SIe)=>{SIe.exports=vIe()});var PIe=_(gF=>{"use strict";Object.defineProperty(gF,"__esModule",{value:!0});function zft(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var Zft={Debug:1,Info:2,Error:3};gF.LogLevelEnum=Zft;gF.createNullLogger=zft});var xIe=_((IJt,bIe)=>{bIe.exports=PIe()});var TIe=_(i9=>{"use strict";Object.defineProperty(i9,"__esModule",{value:!0});var kIe=Ie("http"),QIe=Ie("https"),Xft=Ie("url"),RIe={keepAlive:!0},$ft=new kIe.Agent(RIe),eAt=new QIe.Agent(RIe);function tAt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:s={}}={}){let a=e||t||$ft,n=r||t||eAt;return{send(c){return new Promise(f=>{let p=Xft.parse(c.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...s,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:c.method,headers:{...s&&s.headers?s.headers:{},...c.headers},...p.port!==void 0?{port:p.port||""}:{}},C=(p.protocol==="https:"?QIe:kIe).request(E,T=>{let N=[];T.on("data",U=>{N=N.concat(U)}),T.on("end",()=>{clearTimeout(b),clearTimeout(I),f({status:T.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),S=(T,N)=>setTimeout(()=>{C.abort(),f({status:0,content:N,isTimedOut:!0})},T*1e3),b=S(c.connectTimeout,"Connection timeout"),I;C.on("error",T=>{clearTimeout(b),clearTimeout(I),f({status:0,content:T.message,isTimedOut:!1})}),C.once("response",()=>{clearTimeout(b),I=S(c.responseTimeout,"Socket timeout")}),c.data!==void 0&&C.write(c.data),C.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}i9.createNodeHttpRequester=tAt});var NIe=_((wJt,FIe)=>{FIe.exports=TIe()});var UIe=_((BJt,MIe)=>{"use strict";var OIe=TEe(),rAt=OEe(),lw=oIe(),o9=vS(),s9=uIe(),Gt=DIe(),nAt=xIe(),iAt=NIe(),sAt=PS();function LIe(t,e,r){let s={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:iAt.createNodeHttpRequester(),logger:nAt.createNullLogger(),responsesCache:OIe.createNullCache(),requestsCache:OIe.createNullCache(),hostsCache:rAt.createInMemoryCache(),userAgent:sAt.createUserAgent(o9.version).add({segment:"Node.js",version:process.versions.node})},a={...s,...r},n=()=>c=>s9.createPersonalizationClient({...s,...c,methods:{getPersonalizationStrategy:s9.getPersonalizationStrategy,setPersonalizationStrategy:s9.setPersonalizationStrategy}});return Gt.createSearchClient({...a,methods:{search:Gt.multipleQueries,searchForFacetValues:Gt.multipleSearchForFacetValues,multipleBatch:Gt.multipleBatch,multipleGetObjects:Gt.multipleGetObjects,multipleQueries:Gt.multipleQueries,copyIndex:Gt.copyIndex,copySettings:Gt.copySettings,copyRules:Gt.copyRules,copySynonyms:Gt.copySynonyms,moveIndex:Gt.moveIndex,listIndices:Gt.listIndices,getLogs:Gt.getLogs,listClusters:Gt.listClusters,multipleSearchForFacetValues:Gt.multipleSearchForFacetValues,getApiKey:Gt.getApiKey,addApiKey:Gt.addApiKey,listApiKeys:Gt.listApiKeys,updateApiKey:Gt.updateApiKey,deleteApiKey:Gt.deleteApiKey,restoreApiKey:Gt.restoreApiKey,assignUserID:Gt.assignUserID,assignUserIDs:Gt.assignUserIDs,getUserID:Gt.getUserID,searchUserIDs:Gt.searchUserIDs,listUserIDs:Gt.listUserIDs,getTopUserIDs:Gt.getTopUserIDs,removeUserID:Gt.removeUserID,hasPendingMappings:Gt.hasPendingMappings,generateSecuredApiKey:Gt.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Gt.getSecuredApiKeyRemainingValidity,destroy:o9.destroy,clearDictionaryEntries:Gt.clearDictionaryEntries,deleteDictionaryEntries:Gt.deleteDictionaryEntries,getDictionarySettings:Gt.getDictionarySettings,getAppTask:Gt.getAppTask,replaceDictionaryEntries:Gt.replaceDictionaryEntries,saveDictionaryEntries:Gt.saveDictionaryEntries,searchDictionaryEntries:Gt.searchDictionaryEntries,setDictionarySettings:Gt.setDictionarySettings,waitAppTask:Gt.waitAppTask,customRequest:Gt.customRequest,initIndex:c=>f=>Gt.initIndex(c)(f,{methods:{batch:Gt.batch,delete:Gt.deleteIndex,findAnswers:Gt.findAnswers,getObject:Gt.getObject,getObjects:Gt.getObjects,saveObject:Gt.saveObject,saveObjects:Gt.saveObjects,search:Gt.search,searchForFacetValues:Gt.searchForFacetValues,waitTask:Gt.waitTask,setSettings:Gt.setSettings,getSettings:Gt.getSettings,partialUpdateObject:Gt.partialUpdateObject,partialUpdateObjects:Gt.partialUpdateObjects,deleteObject:Gt.deleteObject,deleteObjects:Gt.deleteObjects,deleteBy:Gt.deleteBy,clearObjects:Gt.clearObjects,browseObjects:Gt.browseObjects,getObjectPosition:Gt.getObjectPosition,findObject:Gt.findObject,exists:Gt.exists,saveSynonym:Gt.saveSynonym,saveSynonyms:Gt.saveSynonyms,getSynonym:Gt.getSynonym,searchSynonyms:Gt.searchSynonyms,browseSynonyms:Gt.browseSynonyms,deleteSynonym:Gt.deleteSynonym,clearSynonyms:Gt.clearSynonyms,replaceAllObjects:Gt.replaceAllObjects,replaceAllSynonyms:Gt.replaceAllSynonyms,searchRules:Gt.searchRules,getRule:Gt.getRule,deleteRule:Gt.deleteRule,saveRule:Gt.saveRule,saveRules:Gt.saveRules,replaceAllRules:Gt.replaceAllRules,browseRules:Gt.browseRules,clearRules:Gt.clearRules}}),initAnalytics:()=>c=>lw.createAnalyticsClient({...s,...c,methods:{addABTest:lw.addABTest,getABTest:lw.getABTest,getABTests:lw.getABTests,stopABTest:lw.stopABTest,deleteABTest:lw.deleteABTest}}),initPersonalization:n,initRecommendation:()=>c=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(c))}})}LIe.version=o9.version;MIe.exports=LIe});var l9=_((vJt,a9)=>{var _Ie=UIe();a9.exports=_Ie;a9.exports.default=_Ie});var f9=_((DJt,GIe)=>{"use strict";var jIe=Object.getOwnPropertySymbols,aAt=Object.prototype.hasOwnProperty,lAt=Object.prototype.propertyIsEnumerable;function cAt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function uAt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var s=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(s.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}GIe.exports=uAt()?Object.assign:function(t,e){for(var r,s=cAt(t),a,n=1;n{"use strict";var p9=f9(),cw=60103,YIe=60106;Dn.Fragment=60107;Dn.StrictMode=60108;Dn.Profiler=60114;var VIe=60109,JIe=60110,KIe=60112;Dn.Suspense=60113;var zIe=60115,ZIe=60116;typeof Symbol=="function"&&Symbol.for&&(Gc=Symbol.for,cw=Gc("react.element"),YIe=Gc("react.portal"),Dn.Fragment=Gc("react.fragment"),Dn.StrictMode=Gc("react.strict_mode"),Dn.Profiler=Gc("react.profiler"),VIe=Gc("react.provider"),JIe=Gc("react.context"),KIe=Gc("react.forward_ref"),Dn.Suspense=Gc("react.suspense"),zIe=Gc("react.memo"),ZIe=Gc("react.lazy"));var Gc,qIe=typeof Symbol=="function"&&Symbol.iterator;function fAt(t){return t===null||typeof t!="object"?null:(t=qIe&&t[qIe]||t["@@iterator"],typeof t=="function"?t:null)}function RS(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;r{"use strict";oCe.exports=sCe()});var yF=_((xJt,aCe)=>{function dAt(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}aCe.exports=dAt});var cCe=_((kJt,lCe)=>{var mAt=typeof global=="object"&&global&&global.Object===Object&&global;lCe.exports=mAt});var y9=_((QJt,uCe)=>{var yAt=cCe(),EAt=typeof self=="object"&&self&&self.Object===Object&&self,IAt=yAt||EAt||Function("return this")();uCe.exports=IAt});var ACe=_((RJt,fCe)=>{var CAt=y9(),wAt=function(){return CAt.Date.now()};fCe.exports=wAt});var hCe=_((TJt,pCe)=>{var BAt=/\s/;function vAt(t){for(var e=t.length;e--&&BAt.test(t.charAt(e)););return e}pCe.exports=vAt});var dCe=_((FJt,gCe)=>{var SAt=hCe(),DAt=/^\s+/;function PAt(t){return t&&t.slice(0,SAt(t)+1).replace(DAt,"")}gCe.exports=PAt});var E9=_((NJt,mCe)=>{var bAt=y9(),xAt=bAt.Symbol;mCe.exports=xAt});var CCe=_((OJt,ICe)=>{var yCe=E9(),ECe=Object.prototype,kAt=ECe.hasOwnProperty,QAt=ECe.toString,TS=yCe?yCe.toStringTag:void 0;function RAt(t){var e=kAt.call(t,TS),r=t[TS];try{t[TS]=void 0;var s=!0}catch{}var a=QAt.call(t);return s&&(e?t[TS]=r:delete t[TS]),a}ICe.exports=RAt});var BCe=_((LJt,wCe)=>{var TAt=Object.prototype,FAt=TAt.toString;function NAt(t){return FAt.call(t)}wCe.exports=NAt});var PCe=_((MJt,DCe)=>{var vCe=E9(),OAt=CCe(),LAt=BCe(),MAt="[object Null]",UAt="[object Undefined]",SCe=vCe?vCe.toStringTag:void 0;function _At(t){return t==null?t===void 0?UAt:MAt:SCe&&SCe in Object(t)?OAt(t):LAt(t)}DCe.exports=_At});var xCe=_((UJt,bCe)=>{function HAt(t){return t!=null&&typeof t=="object"}bCe.exports=HAt});var QCe=_((_Jt,kCe)=>{var jAt=PCe(),GAt=xCe(),qAt="[object Symbol]";function WAt(t){return typeof t=="symbol"||GAt(t)&&jAt(t)==qAt}kCe.exports=WAt});var NCe=_((HJt,FCe)=>{var YAt=dCe(),RCe=yF(),VAt=QCe(),TCe=NaN,JAt=/^[-+]0x[0-9a-f]+$/i,KAt=/^0b[01]+$/i,zAt=/^0o[0-7]+$/i,ZAt=parseInt;function XAt(t){if(typeof t=="number")return t;if(VAt(t))return TCe;if(RCe(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=RCe(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=YAt(t);var r=KAt.test(t);return r||zAt.test(t)?ZAt(t.slice(2),r?2:8):JAt.test(t)?TCe:+t}FCe.exports=XAt});var MCe=_((jJt,LCe)=>{var $At=yF(),I9=ACe(),OCe=NCe(),ept="Expected a function",tpt=Math.max,rpt=Math.min;function npt(t,e,r){var s,a,n,c,f,p,h=0,E=!1,C=!1,S=!0;if(typeof t!="function")throw new TypeError(ept);e=OCe(e)||0,$At(r)&&(E=!!r.leading,C="maxWait"in r,n=C?tpt(OCe(r.maxWait)||0,e):n,S="trailing"in r?!!r.trailing:S);function b(le){var me=s,pe=a;return s=a=void 0,h=le,c=t.apply(pe,me),c}function I(le){return h=le,f=setTimeout(U,e),E?b(le):c}function T(le){var me=le-p,pe=le-h,Be=e-me;return C?rpt(Be,n-pe):Be}function N(le){var me=le-p,pe=le-h;return p===void 0||me>=e||me<0||C&&pe>=n}function U(){var le=I9();if(N(le))return W(le);f=setTimeout(U,T(le))}function W(le){return f=void 0,S&&s?b(le):(s=a=void 0,c)}function ee(){f!==void 0&&clearTimeout(f),h=0,s=p=a=f=void 0}function ie(){return f===void 0?c:W(I9())}function ue(){var le=I9(),me=N(le);if(s=arguments,a=this,p=le,me){if(f===void 0)return I(p);if(C)return clearTimeout(f),f=setTimeout(U,e),b(p)}return f===void 0&&(f=setTimeout(U,e)),c}return ue.cancel=ee,ue.flush=ie,ue}LCe.exports=npt});var _Ce=_((GJt,UCe)=>{var ipt=MCe(),spt=yF(),opt="Expected a function";function apt(t,e,r){var s=!0,a=!0;if(typeof t!="function")throw new TypeError(opt);return spt(r)&&(s="leading"in r?!!r.leading:s,a="trailing"in r?!!r.trailing:a),ipt(t,e,{leading:s,maxWait:e,trailing:a})}UCe.exports=apt});var w9=_((qJt,C9)=>{"use strict";var Cn=C9.exports;C9.exports.default=Cn;var Zn="\x1B[",NS="\x1B]",fw="\x07",EF=";",HCe=process.env.TERM_PROGRAM==="Apple_Terminal";Cn.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?Zn+(t+1)+"G":Zn+(e+1)+";"+(t+1)+"H"};Cn.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=Zn+-t+"D":t>0&&(r+=Zn+t+"C"),e<0?r+=Zn+-e+"A":e>0&&(r+=Zn+e+"B"),r};Cn.cursorUp=(t=1)=>Zn+t+"A";Cn.cursorDown=(t=1)=>Zn+t+"B";Cn.cursorForward=(t=1)=>Zn+t+"C";Cn.cursorBackward=(t=1)=>Zn+t+"D";Cn.cursorLeft=Zn+"G";Cn.cursorSavePosition=HCe?"\x1B7":Zn+"s";Cn.cursorRestorePosition=HCe?"\x1B8":Zn+"u";Cn.cursorGetPosition=Zn+"6n";Cn.cursorNextLine=Zn+"E";Cn.cursorPrevLine=Zn+"F";Cn.cursorHide=Zn+"?25l";Cn.cursorShow=Zn+"?25h";Cn.eraseLines=t=>{let e="";for(let r=0;r[NS,"8",EF,EF,e,fw,t,NS,"8",EF,EF,fw].join("");Cn.image=(t,e={})=>{let r=`${NS}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+fw};Cn.iTerm={setCwd:(t=process.cwd())=>`${NS}50;CurrentDir=${t}${fw}`,annotation:(t,e={})=>{let r=`${NS}1337;`,s=typeof e.x<"u",a=typeof e.y<"u";if((s||a)&&!(s&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(s?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+fw}}});var GCe=_((WJt,B9)=>{"use strict";var jCe=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};B9.exports=jCe;B9.exports.default=jCe});var WCe=_((YJt,CF)=>{"use strict";var lpt=GCe(),IF=new WeakMap,qCe=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,s=0,a=t.displayName||t.name||"",n=function(...c){if(IF.set(n,++s),s===1)r=t.apply(this,c),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return lpt(n,t),IF.set(n,s),n};CF.exports=qCe;CF.exports.default=qCe;CF.exports.callCount=t=>{if(!IF.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return IF.get(t)}});var YCe=_((VJt,wF)=>{wF.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&wF.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&wF.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var D9=_((JJt,hw)=>{var Qi=global.process,Qm=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};Qm(Qi)?(VCe=Ie("assert"),Aw=YCe(),JCe=/^win/i.test(Qi.platform),OS=Ie("events"),typeof OS!="function"&&(OS=OS.EventEmitter),Qi.__signal_exit_emitter__?Js=Qi.__signal_exit_emitter__:(Js=Qi.__signal_exit_emitter__=new OS,Js.count=0,Js.emitted={}),Js.infinite||(Js.setMaxListeners(1/0),Js.infinite=!0),hw.exports=function(t,e){if(!Qm(global.process))return function(){};VCe.equal(typeof t,"function","a callback must be provided for exit handler"),pw===!1&&v9();var r="exit";e&&e.alwaysLast&&(r="afterexit");var s=function(){Js.removeListener(r,t),Js.listeners("exit").length===0&&Js.listeners("afterexit").length===0&&BF()};return Js.on(r,t),s},BF=function(){!pw||!Qm(global.process)||(pw=!1,Aw.forEach(function(e){try{Qi.removeListener(e,vF[e])}catch{}}),Qi.emit=SF,Qi.reallyExit=S9,Js.count-=1)},hw.exports.unload=BF,Rm=function(e,r,s){Js.emitted[e]||(Js.emitted[e]=!0,Js.emit(e,r,s))},vF={},Aw.forEach(function(t){vF[t]=function(){if(Qm(global.process)){var r=Qi.listeners(t);r.length===Js.count&&(BF(),Rm("exit",null,t),Rm("afterexit",null,t),JCe&&t==="SIGHUP"&&(t="SIGINT"),Qi.kill(Qi.pid,t))}}}),hw.exports.signals=function(){return Aw},pw=!1,v9=function(){pw||!Qm(global.process)||(pw=!0,Js.count+=1,Aw=Aw.filter(function(e){try{return Qi.on(e,vF[e]),!0}catch{return!1}}),Qi.emit=zCe,Qi.reallyExit=KCe)},hw.exports.load=v9,S9=Qi.reallyExit,KCe=function(e){Qm(global.process)&&(Qi.exitCode=e||0,Rm("exit",Qi.exitCode,null),Rm("afterexit",Qi.exitCode,null),S9.call(Qi,Qi.exitCode))},SF=Qi.emit,zCe=function(e,r){if(e==="exit"&&Qm(global.process)){r!==void 0&&(Qi.exitCode=r);var s=SF.apply(this,arguments);return Rm("exit",Qi.exitCode,null),Rm("afterexit",Qi.exitCode,null),s}else return SF.apply(this,arguments)}):hw.exports=function(){return function(){}};var VCe,Aw,JCe,OS,Js,BF,Rm,vF,pw,v9,S9,KCe,SF,zCe});var XCe=_((KJt,ZCe)=>{"use strict";var cpt=WCe(),upt=D9();ZCe.exports=cpt(()=>{upt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var P9=_(gw=>{"use strict";var fpt=XCe(),DF=!1;gw.show=(t=process.stderr)=>{t.isTTY&&(DF=!1,t.write("\x1B[?25h"))};gw.hide=(t=process.stderr)=>{t.isTTY&&(fpt(),DF=!0,t.write("\x1B[?25l"))};gw.toggle=(t,e)=>{t!==void 0&&(DF=t),DF?gw.show(e):gw.hide(e)}});var rwe=_(LS=>{"use strict";var twe=LS&&LS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(LS,"__esModule",{value:!0});var $Ce=twe(w9()),ewe=twe(P9()),Apt=(t,{showCursor:e=!1}={})=>{let r=0,s="",a=!1,n=c=>{!e&&!a&&(ewe.default.hide(),a=!0);let f=c+` `;f!==s&&(s=f,t.write($Ce.default.eraseLines(r)+f),r=f.split(` `).length)};return n.clear=()=>{t.write($Ce.default.eraseLines(r)),s="",r=0},n.done=()=>{s="",r=0,e||(ewe.default.show(),a=!1)},n};LS.default={create:Apt}});var nwe=_((XJt,ppt)=>{ppt.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var owe=_(tc=>{"use strict";var swe=nwe(),uA=process.env;Object.defineProperty(tc,"_vendors",{value:swe.map(function(t){return t.constant})});tc.name=null;tc.isPR=null;swe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(s){return iwe(s)});if(tc[t.constant]=r,r)switch(tc.name=t.name,typeof t.pr){case"string":tc.isPR=!!uA[t.pr];break;case"object":"env"in t.pr?tc.isPR=t.pr.env in uA&&uA[t.pr.env]!==t.pr.ne:"any"in t.pr?tc.isPR=t.pr.any.some(function(s){return!!uA[s]}):tc.isPR=iwe(t.pr);break;default:tc.isPR=null}});tc.isCI=!!(uA.CI||uA.CONTINUOUS_INTEGRATION||uA.BUILD_NUMBER||uA.RUN_ID||tc.name);function iwe(t){return typeof t=="string"?!!uA[t]:Object.keys(t).every(function(e){return uA[e]===t[e]})}});var lwe=_((eKt,awe)=>{"use strict";awe.exports=owe().isCI});var uwe=_((tKt,cwe)=>{"use strict";var hpt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};cwe.exports=(t,{include:e,exclude:r}={})=>{let s=a=>{let n=c=>typeof c=="string"?a===c:c.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of hpt(t.constructor.prototype)){if(n==="constructor"||!s(n))continue;let c=Reflect.getOwnPropertyDescriptor(a,n);c&&typeof c.value=="function"&&(t[n]=t[n].bind(t))}return t}});var dwe=_(Vn=>{"use strict";var mw,_S,kF,F9;typeof performance=="object"&&typeof performance.now=="function"?(fwe=performance,Vn.unstable_now=function(){return fwe.now()}):(b9=Date,Awe=b9.now(),Vn.unstable_now=function(){return b9.now()-Awe});var fwe,b9,Awe;typeof window>"u"||typeof MessageChannel!="function"?(dw=null,x9=null,k9=function(){if(dw!==null)try{var t=Vn.unstable_now();dw(!0,t),dw=null}catch(e){throw setTimeout(k9,0),e}},mw=function(t){dw!==null?setTimeout(mw,0,t):(dw=t,setTimeout(k9,0))},_S=function(t,e){x9=setTimeout(t,e)},kF=function(){clearTimeout(x9)},Vn.unstable_shouldYield=function(){return!1},F9=Vn.unstable_forceFrameRate=function(){}):(pwe=window.setTimeout,hwe=window.clearTimeout,typeof console<"u"&&(gwe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof gwe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")),MS=!1,US=null,PF=-1,Q9=5,R9=0,Vn.unstable_shouldYield=function(){return Vn.unstable_now()>=R9},F9=function(){},Vn.unstable_forceFrameRate=function(t){0>t||125>>1,a=t[s];if(a!==void 0&&0xF(c,r))p!==void 0&&0>xF(p,c)?(t[s]=p,t[f]=r,s=f):(t[s]=c,t[n]=r,s=n);else if(p!==void 0&&0>xF(p,r))t[s]=p,t[f]=r,s=f;else break e}}return e}return null}function xF(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var fA=[],X0=[],gpt=1,qc=null,$o=3,RF=!1,Tm=!1,HS=!1;function O9(t){for(var e=ef(X0);e!==null;){if(e.callback===null)QF(X0);else if(e.startTime<=t)QF(X0),e.sortIndex=e.expirationTime,N9(fA,e);else break;e=ef(X0)}}function L9(t){if(HS=!1,O9(t),!Tm)if(ef(fA)!==null)Tm=!0,mw(M9);else{var e=ef(X0);e!==null&&_S(L9,e.startTime-t)}}function M9(t,e){Tm=!1,HS&&(HS=!1,kF()),RF=!0;var r=$o;try{for(O9(e),qc=ef(fA);qc!==null&&(!(qc.expirationTime>e)||t&&!Vn.unstable_shouldYield());){var s=qc.callback;if(typeof s=="function"){qc.callback=null,$o=qc.priorityLevel;var a=s(qc.expirationTime<=e);e=Vn.unstable_now(),typeof a=="function"?qc.callback=a:qc===ef(fA)&&QF(fA),O9(e)}else QF(fA);qc=ef(fA)}if(qc!==null)var n=!0;else{var c=ef(X0);c!==null&&_S(L9,c.startTime-e),n=!1}return n}finally{qc=null,$o=r,RF=!1}}var dpt=F9;Vn.unstable_IdlePriority=5;Vn.unstable_ImmediatePriority=1;Vn.unstable_LowPriority=4;Vn.unstable_NormalPriority=3;Vn.unstable_Profiling=null;Vn.unstable_UserBlockingPriority=2;Vn.unstable_cancelCallback=function(t){t.callback=null};Vn.unstable_continueExecution=function(){Tm||RF||(Tm=!0,mw(M9))};Vn.unstable_getCurrentPriorityLevel=function(){return $o};Vn.unstable_getFirstCallbackNode=function(){return ef(fA)};Vn.unstable_next=function(t){switch($o){case 1:case 2:case 3:var e=3;break;default:e=$o}var r=$o;$o=e;try{return t()}finally{$o=r}};Vn.unstable_pauseExecution=function(){};Vn.unstable_requestPaint=dpt;Vn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=$o;$o=t;try{return e()}finally{$o=r}};Vn.unstable_scheduleCallback=function(t,e,r){var s=Vn.unstable_now();switch(typeof r=="object"&&r!==null?(r=r.delay,r=typeof r=="number"&&0s?(t.sortIndex=r,N9(X0,t),ef(fA)===null&&t===ef(X0)&&(HS?kF():HS=!0,_S(L9,r-s))):(t.sortIndex=a,N9(fA,t),Tm||RF||(Tm=!0,mw(M9))),t};Vn.unstable_wrapCallback=function(t){var e=$o;return function(){var r=$o;$o=e;try{return t.apply(this,arguments)}finally{$o=r}}}});var U9=_((nKt,mwe)=>{"use strict";mwe.exports=dwe()});var ywe=_((iKt,jS)=>{jS.exports=function(e){var r={},s=f9(),a=hn(),n=U9();function c(v){for(var D="https://reactjs.org/docs/error-decoder.html?invariant="+v,Q=1;Q_e||V[Se]!==ne[_e])return` `+V[Se].replace(" at new "," at ");while(1<=Se&&0<=_e);break}}}finally{ve=!1,Error.prepareStackTrace=Q}return(v=v?v.displayName||v.name:"")?oc(v):""}var ac=[],Oi=-1;function no(v){return{current:v}}function Tt(v){0>Oi||(v.current=ac[Oi],ac[Oi]=null,Oi--)}function xn(v,D){Oi++,ac[Oi]=v.current,v.current=D}var la={},ji=no(la),Li=no(!1),Na=la;function dn(v,D){var Q=v.type.contextTypes;if(!Q)return la;var H=v.stateNode;if(H&&H.__reactInternalMemoizedUnmaskedChildContext===D)return H.__reactInternalMemoizedMaskedChildContext;var V={},ne;for(ne in Q)V[ne]=D[ne];return H&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=D,v.__reactInternalMemoizedMaskedChildContext=V),V}function Kn(v){return v=v.childContextTypes,v!=null}function Au(){Tt(Li),Tt(ji)}function yh(v,D,Q){if(ji.current!==la)throw Error(c(168));xn(ji,D),xn(Li,Q)}function Oa(v,D,Q){var H=v.stateNode;if(v=D.childContextTypes,typeof H.getChildContext!="function")return Q;H=H.getChildContext();for(var V in H)if(!(V in v))throw Error(c(108,g(D)||"Unknown",V));return s({},Q,H)}function La(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||la,Na=ji.current,xn(ji,v),xn(Li,Li.current),!0}function Ma(v,D,Q){var H=v.stateNode;if(!H)throw Error(c(169));Q?(v=Oa(v,D,Na),H.__reactInternalMemoizedMergedChildContext=v,Tt(Li),Tt(ji),xn(ji,v)):Tt(Li),xn(Li,Q)}var $e=null,Ua=null,hf=n.unstable_now;hf();var lc=0,wn=8;function ca(v){if(1&v)return wn=15,1;if(2&v)return wn=14,2;if(4&v)return wn=13,4;var D=24&v;return D!==0?(wn=12,D):v&32?(wn=11,32):(D=192&v,D!==0?(wn=10,D):v&256?(wn=9,256):(D=3584&v,D!==0?(wn=8,D):v&4096?(wn=7,4096):(D=4186112&v,D!==0?(wn=6,D):(D=62914560&v,D!==0?(wn=5,D):v&67108864?(wn=4,67108864):v&134217728?(wn=3,134217728):(D=805306368&v,D!==0?(wn=2,D):1073741824&v?(wn=1,1073741824):(wn=8,v))))))}function LA(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function MA(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(c(358,v))}}function ua(v,D){var Q=v.pendingLanes;if(Q===0)return wn=0;var H=0,V=0,ne=v.expiredLanes,Se=v.suspendedLanes,_e=v.pingedLanes;if(ne!==0)H=ne,V=wn=15;else if(ne=Q&134217727,ne!==0){var pt=ne&~Se;pt!==0?(H=ca(pt),V=wn):(_e&=ne,_e!==0&&(H=ca(_e),V=wn))}else ne=Q&~Se,ne!==0?(H=ca(ne),V=wn):_e!==0&&(H=ca(_e),V=wn);if(H===0)return 0;if(H=31-rs(H),H=Q&((0>H?0:1<Q;Q++)D.push(v);return D}function Ha(v,D,Q){v.pendingLanes|=D;var H=D-1;v.suspendedLanes&=H,v.pingedLanes&=H,v=v.eventTimes,D=31-rs(D),v[D]=Q}var rs=Math.clz32?Math.clz32:uc,cc=Math.log,pu=Math.LN2;function uc(v){return v===0?32:31-(cc(v)/pu|0)|0}var ja=n.unstable_runWithPriority,Mi=n.unstable_scheduleCallback,Is=n.unstable_cancelCallback,vl=n.unstable_shouldYield,gf=n.unstable_requestPaint,fc=n.unstable_now,wi=n.unstable_getCurrentPriorityLevel,Qn=n.unstable_ImmediatePriority,Ac=n.unstable_UserBlockingPriority,Ke=n.unstable_NormalPriority,st=n.unstable_LowPriority,St=n.unstable_IdlePriority,lr={},te=gf!==void 0?gf:function(){},Ee=null,Oe=null,dt=!1,Et=fc(),Pt=1e4>Et?fc:function(){return fc()-Et};function tr(){switch(wi()){case Qn:return 99;case Ac:return 98;case Ke:return 97;case st:return 96;case St:return 95;default:throw Error(c(332))}}function An(v){switch(v){case 99:return Qn;case 98:return Ac;case 97:return Ke;case 96:return st;case 95:return St;default:throw Error(c(332))}}function li(v,D){return v=An(v),ja(v,D)}function Gi(v,D,Q){return v=An(v),Mi(v,D,Q)}function Rn(){if(Oe!==null){var v=Oe;Oe=null,Is(v)}Ga()}function Ga(){if(!dt&&Ee!==null){dt=!0;var v=0;try{var D=Ee;li(99,function(){for(;vTn?(_n=kr,kr=null):_n=kr.sibling;var zr=Xt(et,kr,gt[Tn],Zt);if(zr===null){kr===null&&(kr=_n);break}v&&kr&&zr.alternate===null&&D(et,kr),qe=ne(zr,qe,Tn),Xn===null?Dr=zr:Xn.sibling=zr,Xn=zr,kr=_n}if(Tn===gt.length)return Q(et,kr),Dr;if(kr===null){for(;TnTn?(_n=kr,kr=null):_n=kr.sibling;var ci=Xt(et,kr,zr.value,Zt);if(ci===null){kr===null&&(kr=_n);break}v&&kr&&ci.alternate===null&&D(et,kr),qe=ne(ci,qe,Tn),Xn===null?Dr=ci:Xn.sibling=ci,Xn=ci,kr=_n}if(zr.done)return Q(et,kr),Dr;if(kr===null){for(;!zr.done;Tn++,zr=gt.next())zr=Lr(et,zr.value,Zt),zr!==null&&(qe=ne(zr,qe,Tn),Xn===null?Dr=zr:Xn.sibling=zr,Xn=zr);return Dr}for(kr=H(et,kr);!zr.done;Tn++,zr=gt.next())zr=zn(kr,et,Tn,zr.value,Zt),zr!==null&&(v&&zr.alternate!==null&&kr.delete(zr.key===null?Tn:zr.key),qe=ne(zr,qe,Tn),Xn===null?Dr=zr:Xn.sibling=zr,Xn=zr);return v&&kr.forEach(function(Du){return D(et,Du)}),Dr}return function(et,qe,gt,Zt){var Dr=typeof gt=="object"&>!==null&>.type===E&>.key===null;Dr&&(gt=gt.props.children);var Xn=typeof gt=="object"&>!==null;if(Xn)switch(gt.$$typeof){case p:e:{for(Xn=gt.key,Dr=qe;Dr!==null;){if(Dr.key===Xn){switch(Dr.tag){case 7:if(gt.type===E){Q(et,Dr.sibling),qe=V(Dr,gt.props.children),qe.return=et,et=qe;break e}break;default:if(Dr.elementType===gt.type){Q(et,Dr.sibling),qe=V(Dr,gt.props),qe.ref=yt(et,Dr,gt),qe.return=et,et=qe;break e}}Q(et,Dr);break}else D(et,Dr);Dr=Dr.sibling}gt.type===E?(qe=kf(gt.props.children,et.mode,Zt,gt.key),qe.return=et,et=qe):(Zt=sd(gt.type,gt.key,gt.props,null,et.mode,Zt),Zt.ref=yt(et,qe,gt),Zt.return=et,et=Zt)}return Se(et);case h:e:{for(Dr=gt.key;qe!==null;){if(qe.key===Dr)if(qe.tag===4&&qe.stateNode.containerInfo===gt.containerInfo&&qe.stateNode.implementation===gt.implementation){Q(et,qe.sibling),qe=V(qe,gt.children||[]),qe.return=et,et=qe;break e}else{Q(et,qe);break}else D(et,qe);qe=qe.sibling}qe=Qo(gt,et.mode,Zt),qe.return=et,et=qe}return Se(et)}if(typeof gt=="string"||typeof gt=="number")return gt=""+gt,qe!==null&&qe.tag===6?(Q(et,qe.sibling),qe=V(qe,gt),qe.return=et,et=qe):(Q(et,qe),qe=P2(gt,et.mode,Zt),qe.return=et,et=qe),Se(et);if(mf(gt))return yi(et,qe,gt,Zt);if(Ce(gt))return za(et,qe,gt,Zt);if(Xn&&gu(et,gt),typeof gt>"u"&&!Dr)switch(et.tag){case 1:case 22:case 0:case 11:case 15:throw Error(c(152,g(et.type)||"Component"))}return Q(et,qe)}}var Mg=By(!0),e2=By(!1),vh={},ur=no(vh),Ki=no(vh),yf=no(vh);function qa(v){if(v===vh)throw Error(c(174));return v}function Ug(v,D){xn(yf,D),xn(Ki,v),xn(ur,vh),v=mt(D),Tt(ur),xn(ur,v)}function du(){Tt(ur),Tt(Ki),Tt(yf)}function Ef(v){var D=qa(yf.current),Q=qa(ur.current);D=j(Q,v.type,D),Q!==D&&(xn(Ki,v),xn(ur,D))}function wt(v){Ki.current===v&&(Tt(ur),Tt(Ki))}var di=no(0);function GA(v){for(var D=v;D!==null;){if(D.tag===13){var Q=D.memoizedState;if(Q!==null&&(Q=Q.dehydrated,Q===null||gr(Q)||Bo(Q)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if(D.flags&64)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===v)break;for(;D.sibling===null;){if(D.return===null||D.return===v)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}var Wa=null,Aa=null,Ya=!1;function _g(v,D){var Q=Ka(5,null,null,0);Q.elementType="DELETED",Q.type="DELETED",Q.stateNode=D,Q.return=v,Q.flags=8,v.lastEffect!==null?(v.lastEffect.nextEffect=Q,v.lastEffect=Q):v.firstEffect=v.lastEffect=Q}function Sh(v,D){switch(v.tag){case 5:return D=aa(D,v.type,v.pendingProps),D!==null?(v.stateNode=D,!0):!1;case 6:return D=FA(D,v.pendingProps),D!==null?(v.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function Hg(v){if(Ya){var D=Aa;if(D){var Q=D;if(!Sh(v,D)){if(D=Me(Q),!D||!Sh(v,D)){v.flags=v.flags&-1025|2,Ya=!1,Wa=v;return}_g(Wa,Q)}Wa=v,Aa=cu(D)}else v.flags=v.flags&-1025|2,Ya=!1,Wa=v}}function vy(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;Wa=v}function qA(v){if(!Z||v!==Wa)return!1;if(!Ya)return vy(v),Ya=!0,!1;var D=v.type;if(v.tag!==5||D!=="head"&&D!=="body"&&!it(D,v.memoizedProps))for(D=Aa;D;)_g(v,D),D=Me(D);if(vy(v),v.tag===13){if(!Z)throw Error(c(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(c(317));Aa=NA(v)}else Aa=Wa?Me(v.stateNode):null;return!0}function jg(){Z&&(Aa=Wa=null,Ya=!1)}var mu=[];function yu(){for(var v=0;vne))throw Error(c(301));ne+=1,bi=ns=null,D.updateQueue=null,If.current=re,v=Q(H,V)}while(Cf)}if(If.current=kt,D=ns!==null&&ns.next!==null,Eu=0,bi=ns=Gn=null,WA=!1,D)throw Error(c(300));return v}function is(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return bi===null?Gn.memoizedState=bi=v:bi=bi.next=v,bi}function bl(){if(ns===null){var v=Gn.alternate;v=v!==null?v.memoizedState:null}else v=ns.next;var D=bi===null?Gn.memoizedState:bi.next;if(D!==null)bi=D,ns=v;else{if(v===null)throw Error(c(310));ns=v,v={memoizedState:ns.memoizedState,baseState:ns.baseState,baseQueue:ns.baseQueue,queue:ns.queue,next:null},bi===null?Gn.memoizedState=bi=v:bi=bi.next=v}return bi}function bo(v,D){return typeof D=="function"?D(v):D}function wf(v){var D=bl(),Q=D.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var H=ns,V=H.baseQueue,ne=Q.pending;if(ne!==null){if(V!==null){var Se=V.next;V.next=ne.next,ne.next=Se}H.baseQueue=V=ne,Q.pending=null}if(V!==null){V=V.next,H=H.baseState;var _e=Se=ne=null,pt=V;do{var Wt=pt.lane;if((Eu&Wt)===Wt)_e!==null&&(_e=_e.next={lane:0,action:pt.action,eagerReducer:pt.eagerReducer,eagerState:pt.eagerState,next:null}),H=pt.eagerReducer===v?pt.eagerState:v(H,pt.action);else{var Sr={lane:Wt,action:pt.action,eagerReducer:pt.eagerReducer,eagerState:pt.eagerState,next:null};_e===null?(Se=_e=Sr,ne=H):_e=_e.next=Sr,Gn.lanes|=Wt,Xg|=Wt}pt=pt.next}while(pt!==null&&pt!==V);_e===null?ne=H:_e.next=Se,vo(H,D.memoizedState)||(Je=!0),D.memoizedState=H,D.baseState=ne,D.baseQueue=_e,Q.lastRenderedState=H}return[D.memoizedState,Q.dispatch]}function Bf(v){var D=bl(),Q=D.queue;if(Q===null)throw Error(c(311));Q.lastRenderedReducer=v;var H=Q.dispatch,V=Q.pending,ne=D.memoizedState;if(V!==null){Q.pending=null;var Se=V=V.next;do ne=v(ne,Se.action),Se=Se.next;while(Se!==V);vo(ne,D.memoizedState)||(Je=!0),D.memoizedState=ne,D.baseQueue===null&&(D.baseState=ne),Q.lastRenderedState=ne}return[ne,H]}function xl(v,D,Q){var H=D._getVersion;H=H(D._source);var V=y?D._workInProgressVersionPrimary:D._workInProgressVersionSecondary;if(V!==null?v=V===H:(v=v.mutableReadLanes,(v=(Eu&v)===v)&&(y?D._workInProgressVersionPrimary=H:D._workInProgressVersionSecondary=H,mu.push(D))),v)return Q(D._source);throw mu.push(D),Error(c(350))}function yn(v,D,Q,H){var V=so;if(V===null)throw Error(c(349));var ne=D._getVersion,Se=ne(D._source),_e=If.current,pt=_e.useState(function(){return xl(V,D,Q)}),Wt=pt[1],Sr=pt[0];pt=bi;var Lr=v.memoizedState,Xt=Lr.refs,zn=Xt.getSnapshot,yi=Lr.source;Lr=Lr.subscribe;var za=Gn;return v.memoizedState={refs:Xt,source:D,subscribe:H},_e.useEffect(function(){Xt.getSnapshot=Q,Xt.setSnapshot=Wt;var et=ne(D._source);if(!vo(Se,et)){et=Q(D._source),vo(Sr,et)||(Wt(et),et=Bs(za),V.mutableReadLanes|=et&V.pendingLanes),et=V.mutableReadLanes,V.entangledLanes|=et;for(var qe=V.entanglements,gt=et;0Q?98:Q,function(){v(!0)}),li(97m2&&(D.flags|=64,V=!0,ZA(H,!1),D.lanes=33554432)}else{if(!V)if(v=GA(ne),v!==null){if(D.flags|=64,V=!0,v=v.updateQueue,v!==null&&(D.updateQueue=v,D.flags|=4),ZA(H,!0),H.tail===null&&H.tailMode==="hidden"&&!ne.alternate&&!Ya)return D=D.lastEffect=H.lastEffect,D!==null&&(D.nextEffect=null),null}else 2*Pt()-H.renderingStartTime>m2&&Q!==1073741824&&(D.flags|=64,V=!0,ZA(H,!1),D.lanes=33554432);H.isBackwards?(ne.sibling=D.child,D.child=ne):(v=H.last,v!==null?v.sibling=ne:D.child=ne,H.last=ne)}return H.tail!==null?(v=H.tail,H.rendering=v,H.tail=v.sibling,H.lastEffect=D.lastEffect,H.renderingStartTime=Pt(),v.sibling=null,D=di.current,xn(di,V?D&1|2:D&1),v):null;case 23:case 24:return B2(),v!==null&&v.memoizedState!==null!=(D.memoizedState!==null)&&H.mode!=="unstable-defer-without-hiding"&&(D.flags|=4),null}throw Error(c(156,D.tag))}function jL(v){switch(v.tag){case 1:Kn(v.type)&&Au();var D=v.flags;return D&4096?(v.flags=D&-4097|64,v):null;case 3:if(du(),Tt(Li),Tt(ji),yu(),D=v.flags,D&64)throw Error(c(285));return v.flags=D&-4097|64,v;case 5:return wt(v),null;case 13:return Tt(di),D=v.flags,D&4096?(v.flags=D&-4097|64,v):null;case 19:return Tt(di),null;case 4:return du(),null;case 10:return Og(v),null;case 23:case 24:return B2(),null;default:return null}}function Yg(v,D){try{var Q="",H=D;do Q+=$1(H),H=H.return;while(H);var V=Q}catch(ne){V=` Error generating stack: `+ne.message+` `+ne.stack}return{value:v,source:D,stack:V}}function Vg(v,D){try{console.error(D.value)}catch(Q){setTimeout(function(){throw Q})}}var qL=typeof WeakMap=="function"?WeakMap:Map;function i2(v,D,Q){Q=Dl(-1,Q),Q.tag=3,Q.payload={element:null};var H=D.value;return Q.callback=function(){_y||(_y=!0,y2=H),Vg(v,D)},Q}function Jg(v,D,Q){Q=Dl(-1,Q),Q.tag=3;var H=v.type.getDerivedStateFromError;if(typeof H=="function"){var V=D.value;Q.payload=function(){return Vg(v,D),H(V)}}var ne=v.stateNode;return ne!==null&&typeof ne.componentDidCatch=="function"&&(Q.callback=function(){typeof H!="function"&&(hc===null?hc=new Set([this]):hc.add(this),Vg(v,D));var Se=D.stack;this.componentDidCatch(D.value,{componentStack:Se!==null?Se:""})}),Q}var WL=typeof WeakSet=="function"?WeakSet:Set;function s2(v){var D=v.ref;if(D!==null)if(typeof D=="function")try{D(null)}catch(Q){xf(v,Q)}else D.current=null}function xy(v,D){switch(D.tag){case 0:case 11:case 15:case 22:return;case 1:if(D.flags&256&&v!==null){var Q=v.memoizedProps,H=v.memoizedState;v=D.stateNode,D=v.getSnapshotBeforeUpdate(D.elementType===D.type?Q:So(D.type,Q),H),v.__reactInternalSnapshotBeforeUpdate=D}return;case 3:F&&D.flags&256&&Rs(D.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(c(163))}function Rh(v,D){if(D=D.updateQueue,D=D!==null?D.lastEffect:null,D!==null){var Q=D=D.next;do{if((Q.tag&v)===v){var H=Q.destroy;Q.destroy=void 0,H!==void 0&&H()}Q=Q.next}while(Q!==D)}}function ub(v,D,Q){switch(Q.tag){case 0:case 11:case 15:case 22:if(D=Q.updateQueue,D=D!==null?D.lastEffect:null,D!==null){v=D=D.next;do{if((v.tag&3)===3){var H=v.create;v.destroy=H()}v=v.next}while(v!==D)}if(D=Q.updateQueue,D=D!==null?D.lastEffect:null,D!==null){v=D=D.next;do{var V=v;H=V.next,V=V.tag,V&4&&V&1&&(vb(Q,v),eM(Q,v)),v=H}while(v!==D)}return;case 1:v=Q.stateNode,Q.flags&4&&(D===null?v.componentDidMount():(H=Q.elementType===Q.type?D.memoizedProps:So(Q.type,D.memoizedProps),v.componentDidUpdate(H,D.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),D=Q.updateQueue,D!==null&&Cy(Q,D,v);return;case 3:if(D=Q.updateQueue,D!==null){if(v=null,Q.child!==null)switch(Q.child.tag){case 5:v=Te(Q.child.stateNode);break;case 1:v=Q.child.stateNode}Cy(Q,D,v)}return;case 5:v=Q.stateNode,D===null&&Q.flags&4&&$s(v,Q.type,Q.memoizedProps,Q);return;case 6:return;case 4:return;case 12:return;case 13:Z&&Q.memoizedState===null&&(Q=Q.alternate,Q!==null&&(Q=Q.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null&&uu(Q))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(c(163))}function fb(v,D){if(F)for(var Q=v;;){if(Q.tag===5){var H=Q.stateNode;D?dh(H):to(Q.stateNode,Q.memoizedProps)}else if(Q.tag===6)H=Q.stateNode,D?mh(H):jn(H,Q.memoizedProps);else if((Q.tag!==23&&Q.tag!==24||Q.memoizedState===null||Q===v)&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===v)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===v)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}}function ky(v,D){if(Ua&&typeof Ua.onCommitFiberUnmount=="function")try{Ua.onCommitFiberUnmount($e,D)}catch{}switch(D.tag){case 0:case 11:case 14:case 15:case 22:if(v=D.updateQueue,v!==null&&(v=v.lastEffect,v!==null)){var Q=v=v.next;do{var H=Q,V=H.destroy;if(H=H.tag,V!==void 0)if(H&4)vb(D,Q);else{H=D;try{V()}catch(ne){xf(H,ne)}}Q=Q.next}while(Q!==v)}break;case 1:if(s2(D),v=D.stateNode,typeof v.componentWillUnmount=="function")try{v.props=D.memoizedProps,v.state=D.memoizedState,v.componentWillUnmount()}catch(ne){xf(D,ne)}break;case 5:s2(D);break;case 4:F?gb(v,D):z&&z&&(D=D.stateNode.containerInfo,v=ou(D),RA(D,v))}}function Ab(v,D){for(var Q=D;;)if(ky(v,Q),Q.child===null||F&&Q.tag===4){if(Q===D)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===D)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}else Q.child.return=Q,Q=Q.child}function Qy(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function pb(v){return v.tag===5||v.tag===3||v.tag===4}function hb(v){if(F){e:{for(var D=v.return;D!==null;){if(pb(D))break e;D=D.return}throw Error(c(160))}var Q=D;switch(D=Q.stateNode,Q.tag){case 5:var H=!1;break;case 3:D=D.containerInfo,H=!0;break;case 4:D=D.containerInfo,H=!0;break;default:throw Error(c(161))}Q.flags&16&&(Af(D),Q.flags&=-17);e:t:for(Q=v;;){for(;Q.sibling===null;){if(Q.return===null||pb(Q.return)){Q=null;break e}Q=Q.return}for(Q.sibling.return=Q.return,Q=Q.sibling;Q.tag!==5&&Q.tag!==6&&Q.tag!==18;){if(Q.flags&2||Q.child===null||Q.tag===4)continue t;Q.child.return=Q,Q=Q.child}if(!(Q.flags&2)){Q=Q.stateNode;break e}}H?o2(v,Q,D):a2(v,Q,D)}}function o2(v,D,Q){var H=v.tag,V=H===5||H===6;if(V)v=V?v.stateNode:v.stateNode.instance,D?eo(Q,v,D):Io(Q,v);else if(H!==4&&(v=v.child,v!==null))for(o2(v,D,Q),v=v.sibling;v!==null;)o2(v,D,Q),v=v.sibling}function a2(v,D,Q){var H=v.tag,V=H===5||H===6;if(V)v=V?v.stateNode:v.stateNode.instance,D?Hi(Q,v,D):ai(Q,v);else if(H!==4&&(v=v.child,v!==null))for(a2(v,D,Q),v=v.sibling;v!==null;)a2(v,D,Q),v=v.sibling}function gb(v,D){for(var Q=D,H=!1,V,ne;;){if(!H){H=Q.return;e:for(;;){if(H===null)throw Error(c(160));switch(V=H.stateNode,H.tag){case 5:ne=!1;break e;case 3:V=V.containerInfo,ne=!0;break e;case 4:V=V.containerInfo,ne=!0;break e}H=H.return}H=!0}if(Q.tag===5||Q.tag===6)Ab(v,Q),ne?QA(V,Q.stateNode):wo(V,Q.stateNode);else if(Q.tag===4){if(Q.child!==null){V=Q.stateNode.containerInfo,ne=!0,Q.child.return=Q,Q=Q.child;continue}}else if(ky(v,Q),Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===D)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===D)return;Q=Q.return,Q.tag===4&&(H=!1)}Q.sibling.return=Q.return,Q=Q.sibling}}function l2(v,D){if(F){switch(D.tag){case 0:case 11:case 14:case 15:case 22:Rh(3,D);return;case 1:return;case 5:var Q=D.stateNode;if(Q!=null){var H=D.memoizedProps;v=v!==null?v.memoizedProps:H;var V=D.type,ne=D.updateQueue;D.updateQueue=null,ne!==null&&Co(Q,ne,V,v,H,D)}return;case 6:if(D.stateNode===null)throw Error(c(162));Q=D.memoizedProps,ts(D.stateNode,v!==null?v.memoizedProps:Q,Q);return;case 3:Z&&(D=D.stateNode,D.hydrate&&(D.hydrate=!1,OA(D.containerInfo)));return;case 12:return;case 13:db(D),Kg(D);return;case 19:Kg(D);return;case 17:return;case 23:case 24:fb(D,D.memoizedState!==null);return}throw Error(c(163))}switch(D.tag){case 0:case 11:case 14:case 15:case 22:Rh(3,D);return;case 12:return;case 13:db(D),Kg(D);return;case 19:Kg(D);return;case 3:Z&&(Q=D.stateNode,Q.hydrate&&(Q.hydrate=!1,OA(Q.containerInfo)));break;case 23:case 24:return}e:if(z){switch(D.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:D=D.stateNode,RA(D.containerInfo,D.pendingChildren);break e}throw Error(c(163))}}function db(v){v.memoizedState!==null&&(d2=Pt(),F&&fb(v.child,!0))}function Kg(v){var D=v.updateQueue;if(D!==null){v.updateQueue=null;var Q=v.stateNode;Q===null&&(Q=v.stateNode=new WL),D.forEach(function(H){var V=rM.bind(null,v,H);Q.has(H)||(Q.add(H),H.then(V,V))})}}function YL(v,D){return v!==null&&(v=v.memoizedState,v===null||v.dehydrated!==null)?(D=D.memoizedState,D!==null&&D.dehydrated===null):!1}var Ry=0,Ty=1,Fy=2,zg=3,Ny=4;if(typeof Symbol=="function"&&Symbol.for){var Zg=Symbol.for;Ry=Zg("selector.component"),Ty=Zg("selector.has_pseudo_class"),Fy=Zg("selector.role"),zg=Zg("selector.test_id"),Ny=Zg("selector.text")}function Oy(v){var D=$(v);if(D!=null){if(typeof D.memoizedProps["data-testname"]!="string")throw Error(c(364));return D}if(v=ir(v),v===null)throw Error(c(362));return v.stateNode.current}function Sf(v,D){switch(D.$$typeof){case Ry:if(v.type===D.value)return!0;break;case Ty:e:{D=D.value,v=[v,0];for(var Q=0;Q";case Ty:return":has("+(Df(v)||"")+")";case Fy:return'[role="'+v.value+'"]';case Ny:return'"'+v.value+'"';case zg:return'[data-testname="'+v.value+'"]';default:throw Error(c(365,v))}}function c2(v,D){var Q=[];v=[v,0];for(var H=0;HV&&(V=Se),Q&=~ne}if(Q=V,Q=Pt()-Q,Q=(120>Q?120:480>Q?480:1080>Q?1080:1920>Q?1920:3e3>Q?3e3:4320>Q?4320:1960*JL(Q/1960))-Q,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}ws!==5&&(ws=2),pt=Yg(pt,_e),Xt=Se;do{switch(Xt.tag){case 3:ne=pt,Xt.flags|=4096,D&=-D,Xt.lanes|=D;var Xn=i2(Xt,ne,D);Iy(Xt,Xn);break e;case 1:ne=pt;var kr=Xt.type,Tn=Xt.stateNode;if(!(Xt.flags&64)&&(typeof kr.getDerivedStateFromError=="function"||Tn!==null&&typeof Tn.componentDidCatch=="function"&&(hc===null||!hc.has(Tn)))){Xt.flags|=4096,D&=-D,Xt.lanes|=D;var _n=Jg(Xt,ne,D);Iy(Xt,_n);break e}}Xt=Xt.return}while(Xt!==null)}Bb(Q)}catch(zr){D=zr,zi===Q&&Q!==null&&(zi=Q=Q.return);continue}break}while(!0)}function Cb(){var v=My.current;return My.current=kt,v===null?kt:v}function id(v,D){var Q=xr;xr|=16;var H=Cb();so===v&&Ns===D||Oh(v,D);do try{zL();break}catch(V){Ib(v,V)}while(!0);if(Fg(),xr=Q,My.current=H,zi!==null)throw Error(c(261));return so=null,Ns=0,ws}function zL(){for(;zi!==null;)wb(zi)}function ZL(){for(;zi!==null&&!vl();)wb(zi)}function wb(v){var D=Pb(v.alternate,v,XA);v.memoizedProps=v.pendingProps,D===null?Bb(v):zi=D,f2.current=null}function Bb(v){var D=v;do{var Q=D.alternate;if(v=D.return,D.flags&2048){if(Q=jL(D),Q!==null){Q.flags&=2047,zi=Q;return}v!==null&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}else{if(Q=HL(Q,D,XA),Q!==null){zi=Q;return}if(Q=D,Q.tag!==24&&Q.tag!==23||Q.memoizedState===null||XA&1073741824||!(Q.mode&4)){for(var H=0,V=Q.child;V!==null;)H|=V.lanes|V.childLanes,V=V.sibling;Q.childLanes=H}v!==null&&!(v.flags&2048)&&(v.firstEffect===null&&(v.firstEffect=D.firstEffect),D.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=D.firstEffect),v.lastEffect=D.lastEffect),1Pt()-d2?Oh(v,0):h2|=Q),ga(v,D)}function rM(v,D){var Q=v.stateNode;Q!==null&&Q.delete(D),D=0,D===0&&(D=v.mode,D&2?D&4?(Bu===0&&(Bu=Th),D=kn(62914560&~Bu),D===0&&(D=4194304)):D=tr()===99?1:2:D=1),Q=ko(),v=Gy(v,D),v!==null&&(Ha(v,D,Q),ga(v,Q))}var Pb;Pb=function(v,D,Q){var H=D.lanes;if(v!==null)if(v.memoizedProps!==D.pendingProps||Li.current)Je=!0;else if(Q&H)Je=!!(v.flags&16384);else{switch(Je=!1,D.tag){case 3:Py(D),jg();break;case 5:Ef(D);break;case 1:Kn(D.type)&&La(D);break;case 4:Ug(D,D.stateNode.containerInfo);break;case 10:Ng(D,D.memoizedProps.value);break;case 13:if(D.memoizedState!==null)return Q&D.child.childLanes?r2(v,D,Q):(xn(di,di.current&1),D=qn(v,D,Q),D!==null?D.sibling:null);xn(di,di.current&1);break;case 19:if(H=(Q&D.childLanes)!==0,v.flags&64){if(H)return lb(v,D,Q);D.flags|=64}var V=D.memoizedState;if(V!==null&&(V.rendering=null,V.tail=null,V.lastEffect=null),xn(di,di.current),H)break;return null;case 23:case 24:return D.lanes=0,mi(v,D,Q)}return qn(v,D,Q)}else Je=!1;switch(D.lanes=0,D.tag){case 2:if(H=D.type,v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,V=dn(D,ji.current),df(D,Q),V=qg(null,D,H,v,V,Q),D.flags|=1,typeof V=="object"&&V!==null&&typeof V.render=="function"&&V.$$typeof===void 0){if(D.tag=1,D.memoizedState=null,D.updateQueue=null,Kn(H)){var ne=!0;La(D)}else ne=!1;D.memoizedState=V.state!==null&&V.state!==void 0?V.state:null,Bh(D);var Se=H.getDerivedStateFromProps;typeof Se=="function"&&_A(D,H,Se,v),V.updater=HA,D.stateNode=V,V._reactInternals=D,Po(D,H,v,Q),D=t2(null,D,H,!0,ne,Q)}else D.tag=0,At(null,D,V,Q),D=D.child;return D;case 16:V=D.elementType;e:{switch(v!==null&&(v.alternate=null,D.alternate=null,D.flags|=2),v=D.pendingProps,ne=V._init,V=ne(V._payload),D.type=V,ne=D.tag=iM(V),v=So(V,v),ne){case 0:D=JA(null,D,V,v,Q);break e;case 1:D=ab(null,D,V,v,Q);break e;case 11:D=dr(null,D,V,v,Q);break e;case 14:D=vr(null,D,V,So(V.type,v),H,Q);break e}throw Error(c(306,V,""))}return D;case 0:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),JA(v,D,H,V,Q);case 1:return H=D.type,V=D.pendingProps,V=D.elementType===H?V:So(H,V),ab(v,D,H,V,Q);case 3:if(Py(D),H=D.updateQueue,v===null||H===null)throw Error(c(282));if(H=D.pendingProps,V=D.memoizedState,V=V!==null?V.element:null,Lg(v,D),UA(D,H,null,Q),H=D.memoizedState.element,H===V)jg(),D=qn(v,D,Q);else{if(V=D.stateNode,(ne=V.hydrate)&&(Z?(Aa=cu(D.stateNode.containerInfo),Wa=D,ne=Ya=!0):ne=!1),ne){if(Z&&(v=V.mutableSourceEagerHydrationData,v!=null))for(V=0;V=Wt&&ne>=Lr&&V<=Sr&&Se<=Xt){v.splice(D,1);break}else if(H!==Wt||Q.width!==pt.width||XtSe){if(!(ne!==Lr||Q.height!==pt.height||SrV)){Wt>H&&(pt.width+=Wt-H,pt.x=H),Srne&&(pt.height+=Lr-ne,pt.y=ne),XtQ&&(Q=Se)),Se ")+` No matching component was found for: `)+v.join(" > ")}return null},r.getPublicRootInstance=function(v){if(v=v.current,!v.child)return null;switch(v.child.tag){case 5:return Te(v.child.stateNode);default:return v.child.stateNode}},r.injectIntoDevTools=function(v){if(v={bundleType:v.bundleType,version:v.version,rendererPackageName:v.rendererPackageName,rendererConfig:v.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:f.ReactCurrentDispatcher,findHostInstanceByFiber:oM,findFiberByHostInstance:v.findFiberByHostInstance||aM,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")v=!1;else{var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!D.isDisabled&&D.supportsFiber)try{$e=D.inject(v),Ua=D}catch{}v=!0}return v},r.observeVisibleRects=function(v,D,Q,H){if(!qt)throw Error(c(363));v=u2(v,D);var V=nn(v,Q,H).disconnect;return{disconnect:function(){V()}}},r.registerMutableSourceForHydration=function(v,D){var Q=D._getVersion;Q=Q(D._source),v.mutableSourceEagerHydrationData==null?v.mutableSourceEagerHydrationData=[D,Q]:v.mutableSourceEagerHydrationData.push(D,Q)},r.runWithPriority=function(v,D){var Q=lc;try{return lc=v,D()}finally{lc=Q}},r.shouldSuspend=function(){return!1},r.unbatchedUpdates=function(v,D){var Q=xr;xr&=-2,xr|=8;try{return v(D)}finally{xr=Q,xr===0&&(Pf(),Rn())}},r.updateContainer=function(v,D,Q,H){var V=D.current,ne=ko(),Se=Bs(V);e:if(Q){Q=Q._reactInternals;t:{if(we(Q)!==Q||Q.tag!==1)throw Error(c(170));var _e=Q;do{switch(_e.tag){case 3:_e=_e.stateNode.context;break t;case 1:if(Kn(_e.type)){_e=_e.stateNode.__reactInternalMemoizedMergedChildContext;break t}}_e=_e.return}while(_e!==null);throw Error(c(171))}if(Q.tag===1){var pt=Q.type;if(Kn(pt)){Q=Oa(Q,pt,_e);break e}}Q=_e}else Q=la;return D.context===null?D.context=Q:D.pendingContext=Q,D=Dl(ne,Se),D.payload={element:v},H=H===void 0?null:H,H!==null&&(D.callback=H),Pl(V,D),Rl(V,Se,ne),Se},r}});var Iwe=_((sKt,Ewe)=>{"use strict";Ewe.exports=ywe()});var wwe=_((oKt,Cwe)=>{"use strict";var mpt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};Cwe.exports=mpt});var Dwe=_((aKt,Swe)=>{"use strict";var ypt=Object.assign||function(t){for(var e=1;e"}}]),t}(),Bwe=function(){TF(t,null,[{key:"fromJS",value:function(r){var s=r.width,a=r.height;return new t(s,a)}}]);function t(e,r){H9(this,t),this.width=e,this.height=r}return TF(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),vwe=function(){function t(e,r){H9(this,t),this.unit=e,this.value=r}return TF(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case tf.UNIT_POINT:return String(this.value);case tf.UNIT_PERCENT:return this.value+"%";case tf.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();Swe.exports=function(t,e){function r(c,f,p){var h=c[f];c[f]=function(){for(var E=arguments.length,C=Array(E),S=0;S1?C-1:0),b=1;b1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:tf.DIRECTION_LTR;return c.call(this,f,p,h)}),ypt({Config:e.Config,Node:e.Node,Layout:t("Layout",Ept),Size:t("Size",Bwe),Value:t("Value",vwe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},tf)}});var Pwe=_((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof Ie=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var s=nodeFS.readFileSync(e);return r?s:s.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,s){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):s()},a.onerror=s,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var s=enlargeMemory();if(!s)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var s=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return s},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,s,a,n){var c=getCFunc(e),f=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,s){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var c=typeof e=="string"?e:null,f;if(r==ALLOC_NONE?f=s:f=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,c?1:e.length)),a){var s=f,p;for(assert((f&3)==0),p=f+(n&-4);s>2]=0;for(p=f+n;s>0]=0;return f}if(c==="i8")return t.subarray||t.slice?HEAPU8.set(t,f):HEAPU8.set(new Uint8Array(t),f),f;for(var h=0,E,C,S;h>0],r|=s,!(s==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var c=1024,f;e>0;)f=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,c))),n=n?n+f:f,t+=c,e-=c;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var s,a,n,c,f,p,h="";;){if(s=t[e++],!s)return h;if(!(s&128)){h+=String.fromCharCode(s);continue}if(a=t[e++]&63,(s&224)==192){h+=String.fromCharCode((s&31)<<6|a);continue}if(n=t[e++]&63,(s&240)==224?s=(s&15)<<12|a<<6|n:(c=t[e++]&63,(s&248)==240?s=(s&7)<<18|a<<12|n<<6|c:(f=t[e++]&63,(s&252)==248?s=(s&3)<<24|a<<18|n<<12|c<<6|f:(p=t[e++]&63,s=(s&1)<<30|a<<24|n<<18|c<<12|f<<6|p))),s<65536)h+=String.fromCharCode(s);else{var E=s-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,s){if(!(s>0))return 0;for(var a=r,n=r+s-1,c=0;c=55296&&f<=57343&&(f=65536+((f&1023)<<10)|t.charCodeAt(++c)&1023),f<=127){if(r>=n)break;e[r++]=f}else if(f<=2047){if(r+1>=n)break;e[r++]=192|f>>6,e[r++]=128|f&63}else if(f<=65535){if(r+2>=n)break;e[r++]=224|f>>12,e[r++]=128|f>>6&63,e[r++]=128|f&63}else if(f<=2097151){if(r+3>=n)break;e[r++]=240|f>>18,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}else if(f<=67108863){if(r+4>=n)break;e[r++]=248|f>>24,e[r++]=128|f>>18&63,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}else{if(r+5>=n)break;e[r++]=252|f>>30,e[r++]=128|f>>24&63,e[r++]=128|f>>18&63,e[r++]=128|f>>12&63,e[r++]=128|f>>6&63,e[r++]=128|f&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&s<=57343&&(s=65536+((s&1023)<<10)|t.charCodeAt(++r)&1023),s<=127?++e:s<=2047?e+=2:s<=65535?e+=3:s<=2097151?e+=4:s<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),s=lengthBytesUTF8(r)+1,a=_malloc(s);stringToUTF8(r,a,s);var n=_malloc(4),c=e(a,0,0,n);if(getValue(n,"i32")===0&&c)return Pointer_stringify(c)}catch{}finally{a&&_free(a),n&&_free(n),c&&_free(c)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var s=demangle(r);return r===s?r:r+" ["+s+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` `+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var s=r>0?r:lengthBytesUTF8(t)+1,a=new Array(s),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(s&=255),e.push(String.fromCharCode(s))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var s,a;r&&(a=e+lengthBytesUTF8(t),s=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=s)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var s=0;s>0]=t.charCodeAt(s);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var s=e>>>16,a=e&65535,n=r>>>16,c=r&65535;return a*c+(s*c+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,s,a,n,c,f){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,s,a,n,c,f){return ASM_CONSTS[t](e,r,s,a,n,c,f)}function _emscripten_asm_const_iiiii(t,e,r,s,a){return ASM_CONSTS[t](e,r,s,a)}function _emscripten_asm_const_iiidddddd(t,e,r,s,a,n,c,f,p){return ASM_CONSTS[t](e,r,s,a,n,c,f,p)}function _emscripten_asm_const_iiididi(t,e,r,s,a,n,c){return ASM_CONSTS[t](e,r,s,a,n,c)}function _emscripten_asm_const_iiii(t,e,r,s){return ASM_CONSTS[t](e,r,s)}function _emscripten_asm_const_iiiid(t,e,r,s,a){return ASM_CONSTS[t](e,r,s,a)}function _emscripten_asm_const_iiiiii(t,e,r,s,a,n){return ASM_CONSTS[t](e,r,s,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(t,e,r,s){var a=arguments.length,n=a<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,r):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,s);else for(var f=t.length-1;f>=0;f--)(c=t[f])&&(n=(a<3?c(n):a>3?c(e,r,n):c(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,s){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=s/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var c=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,c)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(c){c.source===window&&c.data===s&&(c.stopPropagation(),r.shift()())};var a=n,r=[],s="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(f){r.push(f),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(f),window.postMessage({target:s})):window.postMessage(s,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,s,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=t,Browser.mainLoop.arg=s;var n;typeof s<"u"?n=function(){Module.dynCall_vi(t,s)}:n=function(){Module.dynCall_v(t)};var c=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,C=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=C:(C=C+.5,Browser.mainLoop.remainingBlockers=(8*E+C)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),c1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(c0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,c,f,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(c)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(c)}))}catch(b){Runtime.warnOnce("Blob constructor present but fails: "+b+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var C=Browser.URLObject.createObjectURL(h),S=new Image;S.onload=function(){assert(S.complete,"Image "+c+" could not be decoded");var I=document.createElement("canvas");I.width=S.width,I.height=S.height;var T=I.getContext("2d");T.drawImage(S,0,0),Module.preloadedImages[c]=I,Browser.URLObject.revokeObjectURL(C),f&&f(n)},S.onerror=function(I){console.log("Image "+C+" could not be decoded"),p&&p()},S.src=C},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,c,f,p){var h=!1;function E(T){h||(h=!0,Module.preloadedAudios[c]=T,f&&f(n))}function C(){h||(h=!0,Module.preloadedAudios[c]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var S=new Blob([n],{type:Browser.getMimetype(c)})}catch{return C()}var b=Browser.URLObject.createObjectURL(S),I=new Audio;I.addEventListener("canplaythrough",function(){E(I)},!1),I.onerror=function(N){if(h)return;console.log("warning: browser could not fully decode audio "+c+", trying slower base64 approach");function U(W){for(var ee="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ie="=",ue="",le=0,me=0,pe=0;pe=6;){var Be=le>>me-6&63;me-=6,ue+=ee[Be]}return me==2?(ue+=ee[(le&3)<<4],ue+=ie+ie):me==4&&(ue+=ee[(le&15)<<2],ue+=ie),ue}I.src="data:audio/x-"+c.substr(-3)+";base64,"+U(n),E(I)},I.src=b,Browser.safeSetTimeout(function(){E(I)},1e4)}else return C()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var s=Module.canvas;s&&(s.requestPointerLock=s.requestPointerLock||s.mozRequestPointerLock||s.webkitRequestPointerLock||s.msRequestPointerLock||function(){},s.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},s.exitPointerLock=s.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&s.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,s){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var c={antialias:!1,alpha:!1};if(s)for(var f in s)c[f]=s[f];n=GL.createContext(t,c),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var s=Module.canvas;function a(){Browser.isFullscreen=!1;var c=s.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===c?(s.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},s.exitFullscreen=s.exitFullscreen.bind(document),Browser.lockPointer&&s.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(c.parentNode.insertBefore(s,c),c.parentNode.removeChild(c),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(s)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");s.parentNode.insertBefore(n,s),n.appendChild(s),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(s,a,n){return Browser.requestFullscreen(s,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,s=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var c=t.touch;if(c===void 0)return;var f=c.pageX-(a+e.left),p=c.pageY-(n+e.top);f=f*(r/e.width),p=p*(s/e.height);var h={x:f,y:p};if(t.type==="touchstart")Browser.lastTouches[c.identifier]=h,Browser.touches[c.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[c.identifier];E||(E=h),Browser.lastTouches[c.identifier]=E,Browser.touches[c.identifier]=h}return}var C=t.pageX-(a+e.left),S=t.pageY-(n+e.top);C=C*(r/e.width),S=S*(s/e.height),Browser.mouseMovementX=C-Browser.mouseX,Browser.mouseMovementY=S-Browser.mouseY,Browser.mouseX=C,Browser.mouseY=S}},asyncLoad:function(t,e,r,s){var a=s?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var s=Module.canvas;Browser.updateCanvasDimensions(s,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var s=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(s/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(s){return(typeof FS>"u"||!(s instanceof FS.ErrnoError))&&abort(s),-s.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,C,S,b){if(h==1){var I=C&896;(I==128||I==256||I==384)&&(p="X const")}var T;return b?T=E.replace("X",p).replace("Y",S):T=p.replace("X",E).replace("Y",S),T.replace(/([*&]) (?=[*&])/g,"$1")}function s(p,h,E,C,S){throw new Error(p+" type "+E.replace("X",h+"?")+(C?" with flag "+C:"")+" in "+S)}function a(p,h,E,C,S,b,I,T){b===void 0&&(b="X"),T===void 0&&(T=1);var N=E(p);if(N)return N;var U=C(p),W=U.placeholderFlag,ee=e[W];I&&ee&&(b=r(I[2],I[0],b,ee[0],"?",!0));var ie;W==0&&(ie="Unbound"),W>=10&&(ie="Corrupt"),T>20&&(ie="Deeply nested"),ie&&s(ie,p,b,W,S||"?");var ue=U.paramList[0],le=a(ue,h,E,C,S,b,ee,T+1),me,pe={flags:ee[0],id:p,name:"",paramList:[le]},Be=[],Ce="?";switch(U.placeholderFlag){case 1:me=le.spec;break;case 2:if((le.flags&15360)==1024&&le.spec.ptrSize==1){pe.flags=7168;break}case 3:case 6:case 5:me=le.spec,le.flags&15360;break;case 8:Ce=""+U.paramList[1],pe.paramList.push(U.paramList[1]);break;case 9:for(var g=0,we=U.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),c=SYSCALLS.get(),f=a;return FS.llseek(r,f,c),HEAP32[n>>2]=r.position,r.getdents&&f===0&&c===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),s=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,C){var S=___syscall146.buffers[E];assert(S),C===0||C===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(S,0)),S.length=0):S.push(C)});for(var c=0;c>2],p=HEAP32[s+(c*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var s=_nbind.typeNameTbl.NBind.proto;return s.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var s=HEAPU32[t.pagePtr];if(s){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],s=new r(e);return typeIdTbl[e.id]=s,_nbind.typeNameTbl[e.name]=s,s}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var s=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(s=[s[0],s.slice(1)]),{paramList:s,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},s=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+s];if(!a)throw new Error("dynCall_"+s+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,s){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,s)):(r.arity=s,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var s=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return s.heap=a[r.ptrSize*8],s.ptrSize=r.ptrSize,s}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,s=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,s,r),s}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,s){return function(a){return pushCString(a,s)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(s){return!!s},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,s){return s&&s.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(s){__extends(a,s);function a(n,c,f,p){var h=s.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=c,C=f,S=p;if(n!==_nbind.ptrMarker){var b=h.__nbindConstructor.apply(h,arguments);E=4608,S=HEAPU32[b/4],C=HEAPU32[b/4+1]}var I={configurable:!0,enumerable:!1,value:null,writable:!1},T={__nbindFlags:E,__nbindPtr:C};S&&(T.__nbindShared=S,_nbind.mark(h));for(var N=0,U=Object.keys(T);N>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?c=Buffer.from(n):c=new Buffer(n),c.copy(s)}else getBuffer(s).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,s,a,n){try{Module.dynCall_viiiii(t,e,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,s){try{return Module.dynCall_fiff(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,s,a){try{Module.dynCall_viddi(t,e,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,s){try{Module.dynCall_vidd(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,s){try{return Module.dynCall_iiii(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,s){try{return Module.dynCall_diii(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,s,a,n){try{Module.dynCall_viiddi(t,e,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,s,a,n,c){try{Module.dynCall_viiiiii(t,e,r,s,a,n,c)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,s,a,n){try{return Module.dynCall_iiiiii(t,e,r,s,a,n)}catch(c){if(typeof c!="number"&&c!=="longjmp")throw c;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,s,a){try{Module.dynCall_viiid(t,e,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,s,a,n,c){try{Module.dynCall_viififi(t,e,r,s,a,n,c)}catch(f){if(typeof f!="number"&&f!=="longjmp")throw f;Module.setThrew(1,0)}}function invoke_viii(t,e,r,s){try{Module.dynCall_viii(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,s){try{Module.dynCall_viid(t,e,r,s)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(s){if(typeof s!="number"&&s!=="longjmp")throw s;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,s,a){try{Module.dynCall_viiii(t,e,r,s,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var s=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),c=new t.Uint8Array(r),f=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),C=e.DYNAMICTOP_PTR|0,S=e.tempDoublePtr|0,b=e.ABORT|0,I=e.STACKTOP|0,T=e.STACK_MAX|0,N=e.cttz_i8|0,U=e.___dso_handle|0,W=0,ee=0,ie=0,ue=0,le=t.NaN,me=t.Infinity,pe=0,Be=0,Ce=0,g=0,we=0,ye=0,Ae=t.Math.floor,se=t.Math.abs,X=t.Math.sqrt,De=t.Math.pow,Te=t.Math.cos,mt=t.Math.sin,j=t.Math.tan,rt=t.Math.acos,Fe=t.Math.asin,Ne=t.Math.atan,be=t.Math.atan2,Ve=t.Math.exp,ke=t.Math.log,it=t.Math.ceil,Ue=t.Math.imul,x=t.Math.min,w=t.Math.max,P=t.Math.clz32,y=t.Math.fround,F=e.abort,z=e.assert,Z=e.enlargeMemory,$=e.getTotalMemory,oe=e.abortOnCannotGrowMemory,xe=e.invoke_viiiii,Re=e.invoke_vif,lt=e.invoke_vid,Ct=e.invoke_fiff,qt=e.invoke_vi,ir=e.invoke_vii,bt=e.invoke_ii,gn=e.invoke_viddi,br=e.invoke_vidd,Ir=e.invoke_iiii,Or=e.invoke_diii,nn=e.invoke_di,ai=e.invoke_iid,Io=e.invoke_iii,ts=e.invoke_viiddi,$s=e.invoke_viiiiii,Co=e.invoke_dii,Hi=e.invoke_i,eo=e.invoke_iiiiii,wo=e.invoke_viiid,QA=e.invoke_viififi,Af=e.invoke_viii,dh=e.invoke_v,mh=e.invoke_viid,to=e.invoke_idd,jn=e.invoke_viiii,Rs=e._emscripten_asm_const_iiiii,ro=e._emscripten_asm_const_iiidddddd,ou=e._emscripten_asm_const_iiiid,au=e.__nbind_reference_external,lu=e._emscripten_asm_const_iiiiiiii,RA=e._removeAccessorPrefix,TA=e._typeModule,oa=e.__nbind_register_pool,aa=e.__decorate,FA=e._llvm_stackrestore,gr=e.___cxa_atexit,Bo=e.__extends,Me=e.__nbind_get_value_object,cu=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,Cr=e._emscripten_set_main_loop_timing,pf=e.__nbind_register_primitive,NA=e.__nbind_register_type,OA=e._emscripten_memcpy_big,uu=e.__nbind_register_function,fu=e.___setErrNo,oc=e.__nbind_register_class,ve=e.__nbind_finish,Nt=e._abort,ac=e._nbind_value,Oi=e._llvm_stacksave,no=e.___syscall54,Tt=e._defineHidden,xn=e._emscripten_set_main_loop,la=e._emscripten_get_now,ji=e.__nbind_register_callback_signature,Li=e._emscripten_asm_const_iiiiii,Na=e.__nbind_free_external,dn=e._emscripten_asm_const_iiii,Kn=e._emscripten_asm_const_iiididi,Au=e.___syscall6,yh=e._atexit,Oa=e.___syscall140,La=e.___syscall146,Ma=y(0);let $e=y(0);function Ua(o){o=o|0;var l=0;return l=I,I=I+o|0,I=I+15&-16,l|0}function hf(){return I|0}function lc(o){o=o|0,I=o}function wn(o,l){o=o|0,l=l|0,I=o,T=l}function ca(o,l){o=o|0,l=l|0,W||(W=o,ee=l)}function LA(o){o=o|0,ye=o}function MA(){return ye|0}function ua(){var o=0,l=0;Qr(8104,8,400)|0,Qr(8504,408,540)|0,o=9044,l=o+44|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));s[9088]=0,s[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,gr(17,8104,U|0)|0}function Bl(o){o=o|0,dt(o+948|0)}function Mt(o){return o=y(o),((fb(o)|0)&2147483647)>>>0>2139095040|0}function kn(o,l,u){o=o|0,l=l|0,u=u|0;e:do if(n[o+(l<<3)+4>>2]|0)o=o+(l<<3)|0;else{if((l|2|0)==3&&n[o+60>>2]|0){o=o+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[o+52>>2]|0){o=o+48|0;break e}break}default:}if(n[o+68>>2]|0){o=o+64|0;break}else{o=(l|1|0)==5?948:u;break}}while(!1);return o|0}function fa(o){o=o|0;var l=0;return l=_b(1e3)|0,Ha(o,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Qr(l|0,8104,1e3)|0,s[o+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=o,l|0}function Ha(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;d=I,I=I+16|0,A=d,l||(n[A>>2]=u,Wg(o,5,3197,A)),I=d}function rs(){return fa(956)|0}function cc(o){o=o|0;var l=0;return l=Kt(1e3)|0,pu(l,o),Ha(n[o+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function pu(o,l){o=o|0,l=l|0;var u=0;Qr(o|0,l|0,948)|0,Dy(o+948|0,l+948|0),u=o+960|0,o=l+960|0,l=u+40|0;do n[u>>2]=n[o>>2],u=u+4|0,o=o+4|0;while((u|0)<(l|0))}function uc(o){o=o|0;var l=0,u=0,A=0,d=0;if(l=o+944|0,u=n[l>>2]|0,u|0&&(ja(u+948|0,o)|0,n[l>>2]=0),u=Mi(o)|0,u|0){l=0;do n[(Is(o,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(u|0))}u=o+948|0,A=n[u>>2]|0,d=o+952|0,l=n[d>>2]|0,(l|0)!=(A|0)&&(n[d>>2]=l+(~((l+-4-A|0)>>>2)<<2)),vl(u),Hb(o),n[2276]=(n[2276]|0)+-1}function ja(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0;A=n[o>>2]|0,k=o+4|0,u=n[k>>2]|0,m=u;e:do if((A|0)==(u|0))d=A,B=4;else for(o=A;;){if((n[o>>2]|0)==(l|0)){d=o,B=4;break e}if(o=o+4|0,(o|0)==(u|0)){o=0;break}}while(!1);return(B|0)==4&&((d|0)!=(u|0)?(A=d+4|0,o=m-A|0,l=o>>2,l&&(Q2(d|0,A|0,o|0)|0,u=n[k>>2]|0),o=d+(l<<2)|0,(u|0)==(o|0)||(n[k>>2]=u+(~((u+-4-o|0)>>>2)<<2)),o=1):o=0),o|0}function Mi(o){return o=o|0,(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2|0}function Is(o,l){o=o|0,l=l|0;var u=0;return u=n[o+948>>2]|0,(n[o+952>>2]|0)-u>>2>>>0>l>>>0?o=n[u+(l<<2)>>2]|0:o=0,o|0}function vl(o){o=o|0;var l=0,u=0,A=0,d=0;A=I,I=I+32|0,l=A,d=n[o>>2]|0,u=(n[o+4>>2]|0)-d|0,((n[o+8>>2]|0)-d|0)>>>0>u>>>0&&(d=u>>2,ky(l,d,d,o+8|0),Ab(o,l),Qy(l)),I=A}function gf(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0;M=Mi(o)|0;do if(M|0){if((n[(Is(o,0)|0)+944>>2]|0)==(o|0)){if(!(ja(o+948|0,l)|0))break;Qr(l+400|0,8504,540)|0,n[l+944>>2]=0,Oe(o);break}B=n[(n[o+976>>2]|0)+12>>2]|0,k=o+948|0,R=(B|0)==0,u=0,m=0;do A=n[(n[k>>2]|0)+(m<<2)>>2]|0,(A|0)==(l|0)?Oe(o):(d=cc(A)|0,n[(n[k>>2]|0)+(u<<2)>>2]=d,n[d+944>>2]=o,R||gU[B&15](A,d,o,u),u=u+1|0),m=m+1|0;while((m|0)!=(M|0));if(u>>>0>>0){R=o+948|0,k=o+952|0,B=u,u=n[k>>2]|0;do m=(n[R>>2]|0)+(B<<2)|0,A=m+4|0,d=u-A|0,l=d>>2,l&&(Q2(m|0,A|0,d|0)|0,u=n[k>>2]|0),d=u,A=m+(l<<2)|0,(d|0)!=(A|0)&&(u=d+(~((d+-4-A|0)>>>2)<<2)|0,n[k>>2]=u),B=B+1|0;while((B|0)!=(M|0))}}while(!1)}function fc(o){o=o|0;var l=0,u=0,A=0,d=0;wi(o,(Mi(o)|0)==0,2491),wi(o,(n[o+944>>2]|0)==0,2545),l=o+948|0,u=n[l>>2]|0,A=o+952|0,d=n[A>>2]|0,(d|0)!=(u|0)&&(n[A>>2]=d+(~((d+-4-u|0)>>>2)<<2)),vl(l),l=o+976|0,u=n[l>>2]|0,Qr(o|0,8104,1e3)|0,s[u+2>>0]|0&&(n[o+4>>2]=2,n[o+12>>2]=4),n[l>>2]=u}function wi(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;d=I,I=I+16|0,A=d,l||(n[A>>2]=u,xo(o,5,3197,A)),I=d}function Qn(){return n[2276]|0}function Ac(){var o=0;return o=_b(20)|0,Ke((o|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[o>>2]=n[239],n[o+4>>2]=n[240],n[o+8>>2]=n[241],n[o+12>>2]=n[242],n[o+16>>2]=n[243],o|0}function Ke(o,l){o=o|0,l=l|0;var u=0,A=0;A=I,I=I+16|0,u=A,o||(n[u>>2]=l,xo(0,5,3197,u)),I=A}function st(o){o=o|0,Hb(o),n[2277]=(n[2277]|0)+-1}function St(o,l){o=o|0,l=l|0;var u=0;l?(wi(o,(Mi(o)|0)==0,2629),u=1):(u=0,l=0),n[o+964>>2]=l,n[o+988>>2]=u}function lr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,m=A+8|0,d=A+4|0,B=A,n[d>>2]=l,wi(o,(n[l+944>>2]|0)==0,2709),wi(o,(n[o+964>>2]|0)==0,2763),te(o),l=o+948|0,n[B>>2]=(n[l>>2]|0)+(u<<2),n[m>>2]=n[B>>2],Ee(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=o,Oe(o),I=A}function te(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;if(u=Mi(o)|0,u|0&&(n[(Is(o,0)|0)+944>>2]|0)!=(o|0)){A=n[(n[o+976>>2]|0)+12>>2]|0,d=o+948|0,m=(A|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=cc(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=o,m||gU[A&15](B,k,o,l),l=l+1|0;while((l|0)!=(u|0))}}function Ee(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0;tt=I,I=I+64|0,q=tt+52|0,k=tt+48|0,ae=tt+28|0,Ye=tt+24|0,Le=tt+20|0,Qe=tt,A=n[o>>2]|0,m=A,l=A+((n[l>>2]|0)-m>>2<<2)|0,A=o+4|0,d=n[A>>2]|0,B=o+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[u>>2],n[A>>2]=(n[A>>2]|0)+4;break}pb(o,l,d,l+4|0),l>>>0<=u>>>0&&(u=(n[A>>2]|0)>>>0>u>>>0?u+4|0:u),n[l>>2]=n[u>>2]}else{A=(d-m>>2)+1|0,d=O(o)|0,d>>>0>>0&&sn(o),L=n[o>>2]|0,M=(n[B>>2]|0)-L|0,m=M>>1,ky(Qe,M>>2>>>0>>1>>>0?m>>>0>>0?A:m:d,l-L>>2,o+8|0),L=Qe+8|0,A=n[L>>2]|0,m=Qe+12|0,M=n[m>>2]|0,B=M,R=A;do if((A|0)==(M|0)){if(M=Qe+4|0,A=n[M>>2]|0,Xe=n[Qe>>2]|0,d=Xe,A>>>0<=Xe>>>0){A=B-d>>1,A=A|0?A:1,ky(ae,A,A>>>2,n[Qe+16>>2]|0),n[Ye>>2]=n[M>>2],n[Le>>2]=n[L>>2],n[k>>2]=n[Ye>>2],n[q>>2]=n[Le>>2],o2(ae,k,q),A=n[Qe>>2]|0,n[Qe>>2]=n[ae>>2],n[ae>>2]=A,A=ae+4|0,Xe=n[M>>2]|0,n[M>>2]=n[A>>2],n[A>>2]=Xe,A=ae+8|0,Xe=n[L>>2]|0,n[L>>2]=n[A>>2],n[A>>2]=Xe,A=ae+12|0,Xe=n[m>>2]|0,n[m>>2]=n[A>>2],n[A>>2]=Xe,Qy(ae),A=n[L>>2]|0;break}m=A,B=((m-d>>2)+1|0)/-2|0,k=A+(B<<2)|0,d=R-m|0,m=d>>2,m&&(Q2(k|0,A|0,d|0)|0,A=n[M>>2]|0),Xe=k+(m<<2)|0,n[L>>2]=Xe,n[M>>2]=A+(B<<2),A=Xe}while(!1);n[A>>2]=n[u>>2],n[L>>2]=(n[L>>2]|0)+4,l=hb(o,Qe,l)|0,Qy(Qe)}while(!1);return I=tt,l|0}function Oe(o){o=o|0;var l=0;do{if(l=o+984|0,s[l>>0]|0)break;s[l>>0]=1,h[o+504>>2]=y(le),o=n[o+944>>2]|0}while(o|0)}function dt(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function Et(o){return o=o|0,n[o+944>>2]|0}function Pt(o){o=o|0,wi(o,(n[o+964>>2]|0)!=0,2832),Oe(o)}function tr(o){return o=o|0,(s[o+984>>0]|0)!=0|0}function An(o,l){o=o|0,l=l|0,s6e(o,l,400)|0&&(Qr(o|0,l|0,400)|0,Oe(o))}function li(o){o=o|0;var l=$e;return l=y(h[o+44>>2]),o=Mt(l)|0,y(o?y(0):l)}function Gi(o){o=o|0;var l=$e;return l=y(h[o+48>>2]),Mt(l)|0&&(l=s[(n[o+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function Rn(o,l){o=o|0,l=l|0,n[o+980>>2]=l}function Ga(o){return o=o|0,n[o+980>>2]|0}function my(o,l){o=o|0,l=l|0;var u=0;u=o+4|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function X1(o){return o=o|0,n[o+4>>2]|0}function vo(o,l){o=o|0,l=l|0;var u=0;u=o+8|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function yy(o){return o=o|0,n[o+8>>2]|0}function Eh(o,l){o=o|0,l=l|0;var u=0;u=o+12|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function $1(o){return o=o|0,n[o+12>>2]|0}function So(o,l){o=o|0,l=l|0;var u=0;u=o+16|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Ih(o){return o=o|0,n[o+16>>2]|0}function Ch(o,l){o=o|0,l=l|0;var u=0;u=o+20|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function hu(o){return o=o|0,n[o+20>>2]|0}function wh(o,l){o=o|0,l=l|0;var u=0;u=o+24|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Fg(o){return o=o|0,n[o+24>>2]|0}function Ng(o,l){o=o|0,l=l|0;var u=0;u=o+28|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Og(o){return o=o|0,n[o+28>>2]|0}function Ey(o,l){o=o|0,l=l|0;var u=0;u=o+32|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function df(o){return o=o|0,n[o+32>>2]|0}function Do(o,l){o=o|0,l=l|0;var u=0;u=o+36|0,(n[u>>2]|0)!=(l|0)&&(n[u>>2]=l,Oe(o))}function Sl(o){return o=o|0,n[o+36>>2]|0}function Bh(o,l){o=o|0,l=y(l);var u=0;u=o+40|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Lg(o,l){o=o|0,l=y(l);var u=0;u=o+44|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Dl(o,l){o=o|0,l=y(l);var u=0;u=o+48|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function Pl(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+52|0,d=o+56|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Iy(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+52|0,u=o+56|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function UA(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+52|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Cy(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function wy(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+132+(l<<3)|0,l=o+132+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function _A(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+132+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function HA(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function Y(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+60+(l<<3)|0,l=o+60+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function xt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+60+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function jA(o,l){o=o|0,l=l|0;var u=0;u=o+60+(l<<3)+4|0,(n[u>>2]|0)!=3&&(h[o+60+(l<<3)>>2]=y(le),n[u>>2]=3,Oe(o))}function Po(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function mf(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=m?0:2,d=o+204+(l<<3)|0,l=o+204+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function yt(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=l+204+(u<<3)|0,l=n[A+4>>2]|0,u=o,n[u>>2]=n[A>>2],n[u+4>>2]=l}function gu(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0,m=0;m=Mt(u)|0,A=(m^1)&1,d=o+276+(l<<3)|0,l=o+276+(l<<3)+4|0,m|y(h[d>>2])==u&&(n[l>>2]|0)==(A|0)||(h[d>>2]=u,n[l>>2]=A,Oe(o))}function By(o,l){return o=o|0,l=l|0,y(h[o+276+(l<<3)>>2])}function Mg(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+348|0,d=o+352|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function e2(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+348|0,u=o+352|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function vh(o){o=o|0;var l=0;l=o+352|0,(n[l>>2]|0)!=3&&(h[o+348>>2]=y(le),n[l>>2]=3,Oe(o))}function ur(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+348|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Ki(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+356|0,d=o+360|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function yf(o,l){o=o|0,l=y(l);var u=0,A=0;A=o+356|0,u=o+360|0,y(h[A>>2])==l&&(n[u>>2]|0)==2||(h[A>>2]=l,A=Mt(l)|0,n[u>>2]=A?3:2,Oe(o))}function qa(o){o=o|0;var l=0;l=o+360|0,(n[l>>2]|0)!=3&&(h[o+356>>2]=y(le),n[l>>2]=3,Oe(o))}function Ug(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+356|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function du(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+364|0,d=o+368|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Ef(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+364|0,d=o+368|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function wt(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+364|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function di(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+372|0,d=o+376|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function GA(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+372|0,d=o+376|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Wa(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+372|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Aa(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+380|0,d=o+384|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Ya(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+380|0,d=o+384|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function _g(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+380|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function Sh(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=(m^1)&1,A=o+388|0,d=o+392|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function Hg(o,l){o=o|0,l=y(l);var u=0,A=0,d=0,m=0;m=Mt(l)|0,u=m?0:2,A=o+388|0,d=o+392|0,m|y(h[A>>2])==l&&(n[d>>2]|0)==(u|0)||(h[A>>2]=l,n[d>>2]=u,Oe(o))}function vy(o,l){o=o|0,l=l|0;var u=0,A=0;A=l+388|0,u=n[A+4>>2]|0,l=o,n[l>>2]=n[A>>2],n[l+4>>2]=u}function qA(o,l){o=o|0,l=y(l);var u=0;u=o+396|0,y(h[u>>2])!=l&&(h[u>>2]=l,Oe(o))}function jg(o){return o=o|0,y(h[o+396>>2])}function mu(o){return o=o|0,y(h[o+400>>2])}function yu(o){return o=o|0,y(h[o+404>>2])}function If(o){return o=o|0,y(h[o+408>>2])}function Ts(o){return o=o|0,y(h[o+412>>2])}function Eu(o){return o=o|0,y(h[o+416>>2])}function Gn(o){return o=o|0,y(h[o+420>>2])}function ns(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+424+(l<<2)>>2])}function bi(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+448+(l<<2)>>2])}function WA(o,l){switch(o=o|0,l=l|0,wi(o,(l|0)<6,2918),l|0){case 0:{l=(n[o+496>>2]|0)==2?5:4;break}case 2:{l=(n[o+496>>2]|0)==2?4:5;break}default:}return y(h[o+472+(l<<2)>>2])}function Cf(o,l){o=o|0,l=l|0;var u=0,A=$e;return u=n[o+4>>2]|0,(u|0)==(n[l+4>>2]|0)?u?(A=y(h[o>>2]),o=y(se(y(A-y(h[l>>2]))))>2]=0,n[A+4>>2]=0,n[A+8>>2]=0,cu(A|0,o|0,l|0,0),xo(o,3,(s[A+11>>0]|0)<0?n[A>>2]|0:A,u),b6e(A),I=u}function is(o,l,u,A){o=y(o),l=y(l),u=u|0,A=A|0;var d=$e;o=y(o*l),d=y(cU(o,y(1)));do if(mn(d,y(0))|0)o=y(o-d);else{if(o=y(o-d),mn(d,y(1))|0){o=y(o+y(1));break}if(u){o=y(o+y(1));break}A||(d>y(.5)?d=y(1):(A=mn(d,y(.5))|0,d=y(A?1:0)),o=y(o+d))}while(!1);return y(o/l)}function bl(o,l,u,A,d,m,B,k,R,M,L,q,ae){o=o|0,l=y(l),u=u|0,A=y(A),d=d|0,m=y(m),B=B|0,k=y(k),R=y(R),M=y(M),L=y(L),q=y(q),ae=ae|0;var Ye=0,Le=$e,Qe=$e,tt=$e,Xe=$e,ct=$e,He=$e;return R>2]),Le!=y(0))?(tt=y(is(l,Le,0,0)),Xe=y(is(A,Le,0,0)),Qe=y(is(m,Le,0,0)),Le=y(is(k,Le,0,0))):(Qe=m,tt=l,Le=k,Xe=A),(d|0)==(o|0)?Ye=mn(Qe,tt)|0:Ye=0,(B|0)==(u|0)?ae=mn(Le,Xe)|0:ae=0,!Ye&&(ct=y(l-L),!(bo(o,ct,R)|0))&&!(wf(o,ct,d,R)|0)?Ye=Bf(o,ct,d,m,R)|0:Ye=1,!ae&&(He=y(A-q),!(bo(u,He,M)|0))&&!(wf(u,He,B,M)|0)?ae=Bf(u,He,B,k,M)|0:ae=1,ae=Ye&ae),ae|0}function bo(o,l,u){return o=o|0,l=y(l),u=y(u),(o|0)==1?o=mn(l,u)|0:o=0,o|0}function wf(o,l,u,A){return o=o|0,l=y(l),u=u|0,A=y(A),(o|0)==2&(u|0)==0?l>=A?o=1:o=mn(l,A)|0:o=0,o|0}function Bf(o,l,u,A,d){return o=o|0,l=y(l),u=u|0,A=y(A),d=y(d),(o|0)==2&(u|0)==2&A>l?d<=l?o=1:o=mn(l,d)|0:o=0,o|0}function xl(o,l,u,A,d,m,B,k,R,M,L){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=m|0,B=y(B),k=y(k),R=R|0,M=M|0,L=L|0;var q=0,ae=0,Ye=0,Le=0,Qe=$e,tt=$e,Xe=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Rr=0,Hr=0,cr=0,Hn=$e,Ro=$e,To=$e,Fo=0,Xa=0;cr=I,I=I+160|0,$t=cr+152|0,fr=cr+120|0,Gr=cr+104|0,He=cr+72|0,Le=cr+56|0,Lt=cr+8|0,ct=cr,We=(n[2279]|0)+1|0,n[2279]=We,Rr=o+984|0,s[Rr>>0]|0&&(n[o+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[o+516>>2]|0)==(A|0)?Hr=0:Xe=4,(Xe|0)==4&&(n[o+520>>2]=0,n[o+924>>2]=-1,n[o+928>>2]=-1,h[o+932>>2]=y(-1),h[o+936>>2]=y(-1),Hr=1);e:do if(n[o+964>>2]|0)if(Qe=y(yn(o,2,B)),tt=y(yn(o,0,B)),q=o+916|0,To=y(h[q>>2]),Ro=y(h[o+920>>2]),Hn=y(h[o+932>>2]),bl(d,l,m,u,n[o+924>>2]|0,To,n[o+928>>2]|0,Ro,Hn,y(h[o+936>>2]),Qe,tt,L)|0)Xe=22;else if(Ye=n[o+520>>2]|0,!Ye)Xe=21;else for(ae=0;;){if(q=o+524+(ae*24|0)|0,Hn=y(h[q>>2]),Ro=y(h[o+524+(ae*24|0)+4>>2]),To=y(h[o+524+(ae*24|0)+16>>2]),bl(d,l,m,u,n[o+524+(ae*24|0)+8>>2]|0,Hn,n[o+524+(ae*24|0)+12>>2]|0,Ro,To,y(h[o+524+(ae*24|0)+20>>2]),Qe,tt,L)|0){Xe=22;break e}if(ae=ae+1|0,ae>>>0>=Ye>>>0){Xe=21;break}}else{if(R){if(q=o+916|0,!(mn(y(h[q>>2]),l)|0)){Xe=21;break}if(!(mn(y(h[o+920>>2]),u)|0)){Xe=21;break}if((n[o+924>>2]|0)!=(d|0)){Xe=21;break}q=(n[o+928>>2]|0)==(m|0)?q:0,Xe=22;break}if(Ye=n[o+520>>2]|0,!Ye)Xe=21;else for(ae=0;;){if(q=o+524+(ae*24|0)|0,mn(y(h[q>>2]),l)|0&&mn(y(h[o+524+(ae*24|0)+4>>2]),u)|0&&(n[o+524+(ae*24|0)+8>>2]|0)==(d|0)&&(n[o+524+(ae*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(ae=ae+1|0,ae>>>0>=Ye>>>0){Xe=21;break}}}while(!1);do if((Xe|0)==21)s[11697]|0?(q=0,Xe=28):(q=0,Xe=31);else if((Xe|0)==22){if(ae=(s[11697]|0)!=0,!((q|0)!=0&(Hr^1)))if(ae){Xe=28;break}else{Xe=31;break}Le=q+16|0,n[o+908>>2]=n[Le>>2],Ye=q+20|0,n[o+912>>2]=n[Ye>>2],(s[11698]|0)==0|ae^1||(n[ct>>2]=Iu(We)|0,n[ct+4>>2]=We,xo(o,4,2972,ct),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),d=pa(d,R)|0,m=pa(m,R)|0,Xa=+y(h[Le>>2]),Fo=+y(h[Ye>>2]),n[Lt>>2]=d,n[Lt+4>>2]=m,E[Lt+8>>3]=+l,E[Lt+16>>3]=+u,E[Lt+24>>3]=Xa,E[Lt+32>>3]=Fo,n[Lt+40>>2]=M,xo(o,4,2989,Lt))}while(!1);return(Xe|0)==28&&(ae=Iu(We)|0,n[Le>>2]=ae,n[Le+4>>2]=We,n[Le+8>>2]=Hr?3047:11699,xo(o,4,3038,Le),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),Lt=pa(d,R)|0,Xe=pa(m,R)|0,n[He>>2]=Lt,n[He+4>>2]=Xe,E[He+8>>3]=+l,E[He+16>>3]=+u,n[He+24>>2]=M,xo(o,4,3049,He),Xe=31),(Xe|0)==31&&(Fs(o,l,u,A,d,m,B,k,R,L),s[11697]|0&&(ae=n[2279]|0,Lt=Iu(ae)|0,n[Gr>>2]=Lt,n[Gr+4>>2]=ae,n[Gr+8>>2]=Hr?3047:11699,xo(o,4,3083,Gr),ae=n[o+972>>2]|0,ae|0&&ip[ae&127](o),Lt=pa(d,R)|0,Gr=pa(m,R)|0,Fo=+y(h[o+908>>2]),Xa=+y(h[o+912>>2]),n[fr>>2]=Lt,n[fr+4>>2]=Gr,E[fr+8>>3]=Fo,E[fr+16>>3]=Xa,n[fr+24>>2]=M,xo(o,4,3092,fr)),n[o+516>>2]=A,q||(ae=o+520|0,q=n[ae>>2]|0,(q|0)==16&&(s[11697]|0&&xo(o,4,3124,$t),n[ae>>2]=0,q=0),R?q=o+916|0:(n[ae>>2]=q+1,q=o+524+(q*24|0)|0),h[q>>2]=l,h[q+4>>2]=u,n[q+8>>2]=d,n[q+12>>2]=m,n[q+16>>2]=n[o+908>>2],n[q+20>>2]=n[o+912>>2],q=0)),R&&(n[o+416>>2]=n[o+908>>2],n[o+420>>2]=n[o+912>>2],s[o+985>>0]=1,s[Rr>>0]=0),n[2279]=(n[2279]|0)+-1,n[o+512>>2]=n[2278],I=cr,Hr|(q|0)==0|0}function yn(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(K(o,l,u)),y(A+y(re(o,l,u)))}function xo(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=I,I=I+16|0,d=m,n[d>>2]=A,o?A=n[o+976>>2]|0:A=0,bh(A,o,l,u,d),I=m}function Iu(o){return o=o|0,(o>>>0>60?3201:3201+(60-o)|0)|0}function pa(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+32|0,u=d+12|0,A=d,n[u>>2]=n[254],n[u+4>>2]=n[255],n[u+8>>2]=n[256],n[A>>2]=n[257],n[A+4>>2]=n[258],n[A+8>>2]=n[259],(o|0)>2?o=11699:o=n[(l?A:u)+(o<<2)>>2]|0,I=d,o|0}function Fs(o,l,u,A,d,m,B,k,R,M){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=m|0,B=y(B),k=y(k),R=R|0,M=M|0;var L=0,q=0,ae=0,Ye=0,Le=$e,Qe=$e,tt=$e,Xe=$e,ct=$e,He=$e,We=$e,Lt=0,Gr=0,fr=0,$t=$e,Rr=$e,Hr=0,cr=$e,Hn=0,Ro=0,To=0,Fo=0,Xa=0,Wh=0,Yh=0,gc=0,Vh=0,Tf=0,Ff=0,Jh=0,Kh=0,zh=0,on=0,dc=0,Zh=0,bu=0,Xh=$e,$h=$e,Nf=$e,Of=$e,xu=$e,oo=0,Ll=0,ma=0,mc=0,op=0,ap=$e,Lf=$e,lp=$e,cp=$e,ao=$e,Ms=$e,yc=0,Wn=$e,up=$e,No=$e,ku=$e,Oo=$e,Qu=$e,fp=0,Ap=0,Ru=$e,lo=$e,Ec=0,pp=0,hp=0,gp=0,Nr=$e,ui=0,Us=0,Lo=0,co=0,Mr=0,Ar=0,Ic=0,zt=$e,dp=0,Bi=0;Ic=I,I=I+16|0,oo=Ic+12|0,Ll=Ic+8|0,ma=Ic+4|0,mc=Ic,wi(o,(d|0)==0|(Mt(l)|0)^1,3326),wi(o,(m|0)==0|(Mt(u)|0)^1,3406),Us=At(o,A)|0,n[o+496>>2]=Us,Mr=dr(2,Us)|0,Ar=dr(0,Us)|0,h[o+440>>2]=y(K(o,Mr,B)),h[o+444>>2]=y(re(o,Mr,B)),h[o+428>>2]=y(K(o,Ar,B)),h[o+436>>2]=y(re(o,Ar,B)),h[o+464>>2]=y(vr(o,Mr)),h[o+468>>2]=y(Un(o,Mr)),h[o+452>>2]=y(vr(o,Ar)),h[o+460>>2]=y(Un(o,Ar)),h[o+488>>2]=y(mi(o,Mr,B)),h[o+492>>2]=y(Cs(o,Mr,B)),h[o+476>>2]=y(mi(o,Ar,B)),h[o+484>>2]=y(Cs(o,Ar,B));do if(n[o+964>>2]|0)JA(o,l,u,d,m,B,k);else{if(Lo=o+948|0,co=(n[o+952>>2]|0)-(n[Lo>>2]|0)>>2,!co){ab(o,l,u,d,m,B,k);break}if(!R&&t2(o,l,u,d,m,B,k)|0)break;te(o),dc=o+508|0,s[dc>>0]=0,Mr=dr(n[o+4>>2]|0,Us)|0,Ar=Py(Mr,Us)|0,ui=de(Mr)|0,Zh=n[o+8>>2]|0,pp=o+28|0,bu=(n[pp>>2]|0)!=0,Oo=ui?B:k,Ru=ui?k:B,Xh=y(kh(o,Mr,B)),$h=y(r2(o,Mr,B)),Le=y(kh(o,Ar,B)),Qu=y(Va(o,Mr,B)),lo=y(Va(o,Ar,B)),fr=ui?d:m,Ec=ui?m:d,Nr=ui?Qu:lo,ct=ui?lo:Qu,ku=y(yn(o,2,B)),Xe=y(yn(o,0,B)),Qe=y(y(Xr(o+364|0,B))-Nr),tt=y(y(Xr(o+380|0,B))-Nr),He=y(y(Xr(o+372|0,k))-ct),We=y(y(Xr(o+388|0,k))-ct),Nf=ui?Qe:He,Of=ui?tt:We,ku=y(l-ku),l=y(ku-Nr),Mt(l)|0?Nr=l:Nr=y($n(y(pd(l,tt)),Qe)),up=y(u-Xe),l=y(up-ct),Mt(l)|0?No=l:No=y($n(y(pd(l,We)),He)),Qe=ui?Nr:No,Wn=ui?No:Nr;e:do if((fr|0)==1)for(A=0,q=0;;){if(L=Is(o,q)|0,!A)y(KA(L))>y(0)&&y(Qh(L))>y(0)?A=L:A=0;else if(n2(L)|0){Ye=0;break e}if(q=q+1|0,q>>>0>=co>>>0){Ye=A;break}}else Ye=0;while(!1);Lt=Ye+500|0,Gr=Ye+504|0,A=0,L=0,l=y(0),ae=0;do{if(q=n[(n[Lo>>2]|0)+(ae<<2)>>2]|0,(n[q+36>>2]|0)==1)by(q),s[q+985>>0]=1,s[q+984>>0]=0;else{vf(q),R&&Ph(q,At(q,Us)|0,Qe,Wn,Nr);do if((n[q+24>>2]|0)!=1)if((q|0)==(Ye|0)){n[Lt>>2]=n[2278],h[Gr>>2]=y(0);break}else{lb(o,q,Nr,d,No,Nr,No,m,Us,M);break}else L|0&&(n[L+960>>2]=q),n[q+960>>2]=0,L=q,A=A|0?A:q;while(!1);Ms=y(h[q+504>>2]),l=y(l+y(Ms+y(yn(q,Mr,Nr))))}ae=ae+1|0}while((ae|0)!=(co|0));for(To=l>Qe,yc=bu&((fr|0)==2&To)?1:fr,Hn=(Ec|0)==1,Xa=Hn&(R^1),Wh=(yc|0)==1,Yh=(yc|0)==2,gc=976+(Mr<<2)|0,Vh=(Ec|2|0)==2,zh=Hn&(bu^1),Tf=1040+(Ar<<2)|0,Ff=1040+(Mr<<2)|0,Jh=976+(Ar<<2)|0,Kh=(Ec|0)!=1,To=bu&((fr|0)!=0&To),Ro=o+976|0,Hn=Hn^1,l=Qe,Hr=0,Fo=0,Ms=y(0),xu=y(0);;){e:do if(Hr>>>0>>0)for(Gr=n[Lo>>2]|0,ae=0,We=y(0),He=y(0),tt=y(0),Qe=y(0),q=0,L=0,Ye=Hr;;){if(Lt=n[Gr+(Ye<<2)>>2]|0,(n[Lt+36>>2]|0)!=1&&(n[Lt+940>>2]=Fo,(n[Lt+24>>2]|0)!=1)){if(Xe=y(yn(Lt,Mr,Nr)),on=n[gc>>2]|0,u=y(Xr(Lt+380+(on<<3)|0,Oo)),ct=y(h[Lt+504>>2]),u=y(pd(u,ct)),u=y($n(y(Xr(Lt+364+(on<<3)|0,Oo)),u)),bu&(ae|0)!=0&y(Xe+y(He+u))>l){m=ae,Xe=We,fr=Ye;break e}Xe=y(Xe+u),u=y(He+Xe),Xe=y(We+Xe),n2(Lt)|0&&(tt=y(tt+y(KA(Lt))),Qe=y(Qe-y(ct*y(Qh(Lt))))),L|0&&(n[L+960>>2]=Lt),n[Lt+960>>2]=0,ae=ae+1|0,L=Lt,q=q|0?q:Lt}else Xe=We,u=He;if(Ye=Ye+1|0,Ye>>>0>>0)We=Xe,He=u;else{m=ae,fr=Ye;break}}else m=0,Xe=y(0),tt=y(0),Qe=y(0),q=0,fr=Hr;while(!1);on=tt>y(0)&tty(0)&QeOf&((Mt(Of)|0)^1))l=Of,on=51;else if(s[(n[Ro>>2]|0)+3>>0]|0)on=51;else{if($t!=y(0)&&y(KA(o))!=y(0)){on=53;break}l=Xe,on=53}while(!1);if((on|0)==51&&(on=0,Mt(l)|0?on=53:(Rr=y(l-Xe),cr=l)),(on|0)==53&&(on=0,Xe>2]|0,Ye=Rry(0),He=y(Rr/$t),tt=y(0),Xe=y(0),l=y(0),L=q;do u=y(Xr(L+380+(ae<<3)|0,Oo)),Qe=y(Xr(L+364+(ae<<3)|0,Oo)),Qe=y(pd(u,y($n(Qe,y(h[L+504>>2]))))),Ye?(u=y(Qe*y(Qh(L))),u!=y(-0)&&(zt=y(Qe-y(ct*u)),ap=y(qn(L,Mr,zt,cr,Nr)),zt!=ap)&&(tt=y(tt-y(ap-Qe)),l=y(l+u))):Lt&&(Lf=y(KA(L)),Lf!=y(0))&&(zt=y(Qe+y(He*Lf)),lp=y(qn(L,Mr,zt,cr,Nr)),zt!=lp)&&(tt=y(tt-y(lp-Qe)),Xe=y(Xe-Lf)),L=n[L+960>>2]|0;while(L|0);if(l=y(We+l),Qe=y(Rr+tt),op)l=y(0);else{ct=y($t+Xe),Ye=n[gc>>2]|0,Lt=Qey(0),ct=y(Qe/ct),l=y(0);do{zt=y(Xr(q+380+(Ye<<3)|0,Oo)),tt=y(Xr(q+364+(Ye<<3)|0,Oo)),tt=y(pd(zt,y($n(tt,y(h[q+504>>2]))))),Lt?(zt=y(tt*y(Qh(q))),Qe=y(-zt),zt!=y(-0)?(zt=y(He*Qe),Qe=y(qn(q,Mr,y(tt+(Gr?Qe:zt)),cr,Nr))):Qe=tt):ae&&(cp=y(KA(q)),cp!=y(0))?Qe=y(qn(q,Mr,y(tt+y(ct*cp)),cr,Nr)):Qe=tt,l=y(l-y(Qe-tt)),Xe=y(yn(q,Mr,Nr)),u=y(yn(q,Ar,Nr)),Qe=y(Qe+Xe),h[Ll>>2]=Qe,n[mc>>2]=1,tt=y(h[q+396>>2]);e:do if(Mt(tt)|0){L=Mt(Wn)|0;do if(!L){if(To|(io(q,Ar,Wn)|0|Hn)||(ss(o,q)|0)!=4||(n[(kl(q,Ar)|0)+4>>2]|0)==3||(n[(Ql(q,Ar)|0)+4>>2]|0)==3)break;h[oo>>2]=Wn,n[ma>>2]=1;break e}while(!1);if(io(q,Ar,Wn)|0){L=n[q+992+(n[Jh>>2]<<2)>>2]|0,zt=y(u+y(Xr(L,Wn))),h[oo>>2]=zt,L=Kh&(n[L+4>>2]|0)==2,n[ma>>2]=((Mt(zt)|0|L)^1)&1;break}else{h[oo>>2]=Wn,n[ma>>2]=L?0:2;break}}else zt=y(Qe-Xe),$t=y(zt/tt),zt=y(tt*zt),n[ma>>2]=1,h[oo>>2]=y(u+(ui?$t:zt));while(!1);Cu(q,Mr,cr,Nr,mc,Ll),Cu(q,Ar,Wn,Nr,ma,oo);do if(!(io(q,Ar,Wn)|0)&&(ss(o,q)|0)==4){if((n[(kl(q,Ar)|0)+4>>2]|0)==3){L=0;break}L=(n[(Ql(q,Ar)|0)+4>>2]|0)!=3}else L=0;while(!1);zt=y(h[Ll>>2]),$t=y(h[oo>>2]),dp=n[mc>>2]|0,Bi=n[ma>>2]|0,xl(q,ui?zt:$t,ui?$t:zt,Us,ui?dp:Bi,ui?Bi:dp,Nr,No,R&(L^1),3488,M)|0,s[dc>>0]=s[dc>>0]|s[q+508>>0],q=n[q+960>>2]|0}while(q|0)}}else l=y(0);if(l=y(Rr+l),Bi=l>0]=Bi|c[dc>>0],Yh&l>y(0)?(L=n[gc>>2]|0,n[o+364+(L<<3)+4>>2]|0&&(ao=y(Xr(o+364+(L<<3)|0,Oo)),ao>=y(0))?Qe=y($n(y(0),y(ao-y(cr-l)))):Qe=y(0)):Qe=l,Lt=Hr>>>0>>0,Lt){Ye=n[Lo>>2]|0,ae=Hr,L=0;do q=n[Ye+(ae<<2)>>2]|0,n[q+24>>2]|0||(L=((n[(kl(q,Mr)|0)+4>>2]|0)==3&1)+L|0,L=L+((n[(Ql(q,Mr)|0)+4>>2]|0)==3&1)|0),ae=ae+1|0;while((ae|0)!=(fr|0));L?(Xe=y(0),u=y(0)):on=101}else on=101;e:do if((on|0)==101)switch(on=0,Zh|0){case 1:{L=0,Xe=y(Qe*y(.5)),u=y(0);break e}case 2:{L=0,Xe=Qe,u=y(0);break e}case 3:{if(m>>>0<=1){L=0,Xe=y(0),u=y(0);break e}u=y((m+-1|0)>>>0),L=0,Xe=y(0),u=y(y($n(Qe,y(0)))/u);break e}case 5:{u=y(Qe/y((m+1|0)>>>0)),L=0,Xe=u;break e}case 4:{u=y(Qe/y(m>>>0)),L=0,Xe=y(u*y(.5));break e}default:{L=0,Xe=y(0),u=y(0);break e}}while(!1);if(l=y(Xh+Xe),Lt){tt=y(Qe/y(L|0)),ae=n[Lo>>2]|0,q=Hr,Qe=y(0);do{L=n[ae+(q<<2)>>2]|0;e:do if((n[L+36>>2]|0)!=1){switch(n[L+24>>2]|0){case 1:{if(ha(L,Mr)|0){if(!R)break e;zt=y(zA(L,Mr,cr)),zt=y(zt+y(vr(o,Mr))),zt=y(zt+y(K(L,Mr,Nr))),h[L+400+(n[Ff>>2]<<2)>>2]=zt;break e}break}case 0:if(Bi=(n[(kl(L,Mr)|0)+4>>2]|0)==3,zt=y(tt+l),l=Bi?zt:l,R&&(Bi=L+400+(n[Ff>>2]<<2)|0,h[Bi>>2]=y(l+y(h[Bi>>2]))),Bi=(n[(Ql(L,Mr)|0)+4>>2]|0)==3,zt=y(tt+l),l=Bi?zt:l,Xa){zt=y(u+y(yn(L,Mr,Nr))),Qe=Wn,l=y(l+y(zt+y(h[L+504>>2])));break e}else{l=y(l+y(u+y(ZA(L,Mr,Nr)))),Qe=y($n(Qe,y(ZA(L,Ar,Nr))));break e}default:}R&&(zt=y(Xe+y(vr(o,Mr))),Bi=L+400+(n[Ff>>2]<<2)|0,h[Bi>>2]=y(zt+y(h[Bi>>2])))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}else Qe=y(0);if(u=y($h+l),Vh?Xe=y(y(qn(o,Ar,y(lo+Qe),Ru,B))-lo):Xe=Wn,tt=y(y(qn(o,Ar,y(lo+(zh?Wn:Qe)),Ru,B))-lo),Lt&R){q=Hr;do{ae=n[(n[Lo>>2]|0)+(q<<2)>>2]|0;do if((n[ae+36>>2]|0)!=1){if((n[ae+24>>2]|0)==1){if(ha(ae,Ar)|0){if(zt=y(zA(ae,Ar,Wn)),zt=y(zt+y(vr(o,Ar))),zt=y(zt+y(K(ae,Ar,Nr))),L=n[Tf>>2]|0,h[ae+400+(L<<2)>>2]=zt,!(Mt(zt)|0))break}else L=n[Tf>>2]|0;zt=y(vr(o,Ar)),h[ae+400+(L<<2)>>2]=y(zt+y(K(ae,Ar,Nr)));break}L=ss(o,ae)|0;do if((L|0)==4){if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){on=139;break}if((n[(Ql(ae,Ar)|0)+4>>2]|0)==3){on=139;break}if(io(ae,Ar,Wn)|0){l=Le;break}dp=n[ae+908+(n[gc>>2]<<2)>>2]|0,n[oo>>2]=dp,l=y(h[ae+396>>2]),Bi=Mt(l)|0,Qe=(n[S>>2]=dp,y(h[S>>2])),Bi?l=tt:(Rr=y(yn(ae,Ar,Nr)),zt=y(Qe/l),l=y(l*Qe),l=y(Rr+(ui?zt:l))),h[Ll>>2]=l,h[oo>>2]=y(y(yn(ae,Mr,Nr))+Qe),n[ma>>2]=1,n[mc>>2]=1,Cu(ae,Mr,cr,Nr,ma,oo),Cu(ae,Ar,Wn,Nr,mc,Ll),l=y(h[oo>>2]),Rr=y(h[Ll>>2]),zt=ui?l:Rr,l=ui?Rr:l,Bi=((Mt(zt)|0)^1)&1,xl(ae,zt,l,Us,Bi,((Mt(l)|0)^1)&1,Nr,No,1,3493,M)|0,l=Le}else on=139;while(!1);e:do if((on|0)==139){on=0,l=y(Xe-y(ZA(ae,Ar,Nr)));do if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){if((n[(Ql(ae,Ar)|0)+4>>2]|0)!=3)break;l=y(Le+y($n(y(0),y(l*y(.5)))));break e}while(!1);if((n[(Ql(ae,Ar)|0)+4>>2]|0)==3){l=Le;break}if((n[(kl(ae,Ar)|0)+4>>2]|0)==3){l=y(Le+y($n(y(0),l)));break}switch(L|0){case 1:{l=Le;break e}case 2:{l=y(Le+y(l*y(.5)));break e}default:{l=y(Le+l);break e}}}while(!1);zt=y(Ms+l),Bi=ae+400+(n[Tf>>2]<<2)|0,h[Bi>>2]=y(zt+y(h[Bi>>2]))}while(!1);q=q+1|0}while((q|0)!=(fr|0))}if(Ms=y(Ms+tt),xu=y($n(xu,u)),m=Fo+1|0,fr>>>0>=co>>>0)break;l=cr,Hr=fr,Fo=m}do if(R){if(L=m>>>0>1,!L&&!(HL(o)|0))break;if(!(Mt(Wn)|0)){l=y(Wn-Ms);e:do switch(n[o+12>>2]|0){case 3:{Le=y(Le+l),He=y(0);break}case 2:{Le=y(Le+y(l*y(.5))),He=y(0);break}case 4:{Wn>Ms?He=y(l/y(m>>>0)):He=y(0);break}case 7:if(Wn>Ms){Le=y(Le+y(l/y(m<<1>>>0))),He=y(l/y(m>>>0)),He=L?He:y(0);break e}else{Le=y(Le+y(l*y(.5))),He=y(0);break e}case 6:{He=y(l/y(Fo>>>0)),He=Wn>Ms&L?He:y(0);break}default:He=y(0)}while(!1);if(m|0)for(Lt=1040+(Ar<<2)|0,Gr=976+(Ar<<2)|0,Ye=0,q=0;;){e:do if(q>>>0>>0)for(Qe=y(0),tt=y(0),l=y(0),ae=q;;){L=n[(n[Lo>>2]|0)+(ae<<2)>>2]|0;do if((n[L+36>>2]|0)!=1&&!(n[L+24>>2]|0)){if((n[L+940>>2]|0)!=(Ye|0))break e;if(jL(L,Ar)|0&&(zt=y(h[L+908+(n[Gr>>2]<<2)>>2]),l=y($n(l,y(zt+y(yn(L,Ar,Nr)))))),(ss(o,L)|0)!=5)break;ao=y(Yg(L)),ao=y(ao+y(K(L,0,Nr))),zt=y(h[L+912>>2]),zt=y(y(zt+y(yn(L,0,Nr)))-ao),ao=y($n(tt,ao)),zt=y($n(Qe,zt)),Qe=zt,tt=ao,l=y($n(l,y(ao+zt)))}while(!1);if(L=ae+1|0,L>>>0>>0)ae=L;else{ae=L;break}}else tt=y(0),l=y(0),ae=q;while(!1);if(ct=y(He+l),u=Le,Le=y(Le+ct),q>>>0>>0){Xe=y(u+tt),L=q;do{q=n[(n[Lo>>2]|0)+(L<<2)>>2]|0;e:do if((n[q+36>>2]|0)!=1&&!(n[q+24>>2]|0))switch(ss(o,q)|0){case 1:{zt=y(u+y(K(q,Ar,Nr))),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 3:{zt=y(y(Le-y(re(q,Ar,Nr)))-y(h[q+908+(n[Gr>>2]<<2)>>2])),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 2:{zt=y(u+y(y(ct-y(h[q+908+(n[Gr>>2]<<2)>>2]))*y(.5))),h[q+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 4:{if(zt=y(u+y(K(q,Ar,Nr))),h[q+400+(n[Lt>>2]<<2)>>2]=zt,io(q,Ar,Wn)|0||(ui?(Qe=y(h[q+908>>2]),l=y(Qe+y(yn(q,Mr,Nr))),tt=ct):(tt=y(h[q+912>>2]),tt=y(tt+y(yn(q,Ar,Nr))),l=ct,Qe=y(h[q+908>>2])),mn(l,Qe)|0&&mn(tt,y(h[q+912>>2]))|0))break e;xl(q,l,tt,Us,1,1,Nr,No,1,3501,M)|0;break e}case 5:{h[q+404>>2]=y(y(Xe-y(Yg(q)))+y(zA(q,0,Wn)));break e}default:break e}while(!1);L=L+1|0}while((L|0)!=(ae|0))}if(Ye=Ye+1|0,(Ye|0)==(m|0))break;q=ae}}}while(!1);if(h[o+908>>2]=y(qn(o,2,ku,B,B)),h[o+912>>2]=y(qn(o,0,up,k,B)),yc|0&&(fp=n[o+32>>2]|0,Ap=(yc|0)==2,!(Ap&(fp|0)!=2))?Ap&(fp|0)==2&&(l=y(Qu+cr),l=y($n(y(pd(l,y(Vg(o,Mr,xu,Oo)))),Qu)),on=198):(l=y(qn(o,Mr,xu,Oo,B)),on=198),(on|0)==198&&(h[o+908+(n[976+(Mr<<2)>>2]<<2)>>2]=l),Ec|0&&(hp=n[o+32>>2]|0,gp=(Ec|0)==2,!(gp&(hp|0)!=2))?gp&(hp|0)==2&&(l=y(lo+Wn),l=y($n(y(pd(l,y(Vg(o,Ar,y(lo+Ms),Ru)))),lo)),on=204):(l=y(qn(o,Ar,y(lo+Ms),Ru,B)),on=204),(on|0)==204&&(h[o+908+(n[976+(Ar<<2)>>2]<<2)>>2]=l),R){if((n[pp>>2]|0)==2){q=976+(Ar<<2)|0,ae=1040+(Ar<<2)|0,L=0;do Ye=Is(o,L)|0,n[Ye+24>>2]|0||(dp=n[q>>2]|0,zt=y(h[o+908+(dp<<2)>>2]),Bi=Ye+400+(n[ae>>2]<<2)|0,zt=y(zt-y(h[Bi>>2])),h[Bi>>2]=y(zt-y(h[Ye+908+(dp<<2)>>2]))),L=L+1|0;while((L|0)!=(co|0))}if(A|0){L=ui?yc:d;do qL(o,A,Nr,L,No,Us,M),A=n[A+960>>2]|0;while(A|0)}if(L=(Mr|2|0)==3,q=(Ar|2|0)==3,L|q){A=0;do ae=n[(n[Lo>>2]|0)+(A<<2)>>2]|0,(n[ae+36>>2]|0)!=1&&(L&&i2(o,ae,Mr),q&&i2(o,ae,Ar)),A=A+1|0;while((A|0)!=(co|0))}}}while(!1);I=Ic}function Dh(o,l){o=o|0,l=y(l);var u=0;Ha(o,l>=y(0),3147),u=l==y(0),h[o+4>>2]=u?y(0):l}function YA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=A|0;var d=$e,m=$e,B=0,k=0,R=0;n[2278]=(n[2278]|0)+1,vf(o),io(o,2,l)|0?(d=y(Xr(n[o+992>>2]|0,l)),R=1,d=y(d+y(yn(o,2,l)))):(d=y(Xr(o+380|0,l)),d>=y(0)?R=2:(R=((Mt(l)|0)^1)&1,d=l)),io(o,0,u)|0?(m=y(Xr(n[o+996>>2]|0,u)),k=1,m=y(m+y(yn(o,0,l)))):(m=y(Xr(o+388|0,u)),m>=y(0)?k=2:(k=((Mt(u)|0)^1)&1,m=u)),B=o+976|0,xl(o,d,m,A,R,k,l,u,1,3189,n[B>>2]|0)|0&&(Ph(o,n[o+496>>2]|0,l,u,l),VA(o,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),s[11696]|0)&&Gg(o,7)}function vf(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;k=I,I=I+32|0,B=k+24|0,m=k+16|0,A=k+8|0,d=k,u=0;do l=o+380+(u<<3)|0,n[o+380+(u<<3)+4>>2]|0&&(R=l,M=n[R+4>>2]|0,L=A,n[L>>2]=n[R>>2],n[L+4>>2]=M,L=o+364+(u<<3)|0,M=n[L+4>>2]|0,R=d,n[R>>2]=n[L>>2],n[R+4>>2]=M,n[m>>2]=n[A>>2],n[m+4>>2]=n[A+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],Cf(m,B)|0)||(l=o+348+(u<<3)|0),n[o+992+(u<<2)>>2]=l,u=u+1|0;while((u|0)!=2);I=k}function io(o,l,u){o=o|0,l=l|0,u=y(u);var A=0;switch(o=n[o+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[o+4>>2]|0){case 0:case 3:{o=0;break}case 1:{y(h[o>>2])>2])>2]|0){case 2:{l=y(y(y(h[o>>2])*l)/y(100));break}case 1:{l=y(h[o>>2]);break}default:l=y(le)}return y(l)}function Ph(o,l,u,A,d){o=o|0,l=l|0,u=y(u),A=y(A),d=y(d);var m=0,B=$e;l=n[o+944>>2]|0?l:1,m=dr(n[o+4>>2]|0,l)|0,l=Py(m,l)|0,u=y(ub(o,m,u)),A=y(ub(o,l,A)),B=y(u+y(K(o,m,d))),h[o+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,u=y(u+y(re(o,m,d))),h[o+400+(n[1e3+(m<<2)>>2]<<2)>>2]=u,u=y(A+y(K(o,l,d))),h[o+400+(n[1040+(l<<2)>>2]<<2)>>2]=u,d=y(A+y(re(o,l,d))),h[o+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function VA(o,l,u,A){o=o|0,l=y(l),u=y(u),A=y(A);var d=0,m=0,B=$e,k=$e,R=0,M=0,L=$e,q=0,ae=$e,Ye=$e,Le=$e,Qe=$e;if(l!=y(0)&&(d=o+400|0,Qe=y(h[d>>2]),m=o+404|0,Le=y(h[m>>2]),q=o+416|0,Ye=y(h[q>>2]),M=o+420|0,B=y(h[M>>2]),ae=y(Qe+u),L=y(Le+A),A=y(ae+Ye),k=y(L+B),R=(n[o+988>>2]|0)==1,h[d>>2]=y(is(Qe,l,0,R)),h[m>>2]=y(is(Le,l,0,R)),u=y(cU(y(Ye*l),y(1))),mn(u,y(0))|0?m=0:m=(mn(u,y(1))|0)^1,u=y(cU(y(B*l),y(1))),mn(u,y(0))|0?d=0:d=(mn(u,y(1))|0)^1,Qe=y(is(A,l,R&m,R&(m^1))),h[q>>2]=y(Qe-y(is(ae,l,0,R))),Qe=y(is(k,l,R&d,R&(d^1))),h[M>>2]=y(Qe-y(is(L,l,0,R))),m=(n[o+952>>2]|0)-(n[o+948>>2]|0)>>2,m|0)){d=0;do VA(Is(o,d)|0,l,ae,L),d=d+1|0;while((d|0)!=(m|0))}}function Sy(o,l,u,A,d){switch(o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,u|0){case 5:case 0:{o=dX(n[489]|0,A,d)|0;break}default:o=v6e(A,d)|0}return o|0}function Wg(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;d=I,I=I+16|0,m=d,n[m>>2]=A,bh(o,0,l,u,m),I=d}function bh(o,l,u,A,d){if(o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,o=o|0?o:956,LX[n[o+8>>2]&1](o,l,u,A,d)|0,(u|0)==5)Nt();else return}function pc(o,l,u){o=o|0,l=l|0,u=u|0,s[o+l>>0]=u&1}function Dy(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(xh(o,A),kt(o,n[l>>2]|0,n[u>>2]|0,A))}function xh(o,l){o=o|0,l=l|0;var u=0;if((O(o)|0)>>>0>>0&&sn(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function kt(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function O(o){return o=o|0,1073741823}function K(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+96>>2]|0?o=o+92|0:o=kn(o+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Je(o,u))}function re(o,l,u){return o=o|0,l=l|0,u=y(u),de(l)|0&&n[o+104>>2]|0?o=o+100|0:o=kn(o+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Je(o,u))}function de(o){return o=o|0,(o|1|0)==3|0}function Je(o,l){return o=o|0,l=y(l),(n[o+4>>2]|0)==3?l=y(0):l=y(Xr(o,l)),y(l)}function At(o,l){return o=o|0,l=l|0,o=n[o>>2]|0,(o|0?o:(l|0)>1?l:1)|0}function dr(o,l){o=o|0,l=l|0;var u=0;e:do if((l|0)==2){switch(o|0){case 2:{o=3;break e}case 3:break;default:{u=4;break e}}o=2}else u=4;while(!1);return o|0}function vr(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+312>>2]|0&&(u=y(h[o+308>>2]),u>=y(0))||(u=y($n(y(h[(kn(o+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function Un(o,l){o=o|0,l=l|0;var u=$e;return de(l)|0&&n[o+320>>2]|0&&(u=y(h[o+316>>2]),u>=y(0))||(u=y($n(y(h[(kn(o+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(u)}function mi(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+240>>2]|0&&(A=y(Xr(o+236|0,u)),A>=y(0))||(A=y($n(y(Xr(kn(o+204|0,n[1040+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function Cs(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return de(l)|0&&n[o+248>>2]|0&&(A=y(Xr(o+244|0,u)),A>=y(0))||(A=y($n(y(Xr(kn(o+204|0,n[1e3+(l<<2)>>2]|0,992)|0,u)),y(0)))),y(A)}function JA(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=$e,R=$e,M=$e,L=$e,q=$e,ae=$e,Ye=0,Le=0,Qe=0;Qe=I,I=I+16|0,Ye=Qe,Le=o+964|0,wi(o,(n[Le>>2]|0)!=0,3519),k=y(Va(o,2,l)),R=y(Va(o,0,l)),M=y(yn(o,2,l)),L=y(yn(o,0,l)),Mt(l)|0?q=l:q=y($n(y(0),y(y(l-M)-k))),Mt(u)|0?ae=u:ae=y($n(y(0),y(y(u-L)-R))),(A|0)==1&(d|0)==1?(h[o+908>>2]=y(qn(o,2,y(l-M),m,m)),l=y(qn(o,0,y(u-L),B,m))):(MX[n[Le>>2]&1](Ye,o,q,A,ae,d),q=y(k+y(h[Ye>>2])),ae=y(l-M),h[o+908>>2]=y(qn(o,2,(A|2|0)==2?q:ae,m,m)),ae=y(R+y(h[Ye+4>>2])),l=y(u-L),l=y(qn(o,0,(d|2|0)==2?ae:l,B,m))),h[o+912>>2]=l,I=Qe}function ab(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=$e,R=$e,M=$e,L=$e;M=y(Va(o,2,m)),k=y(Va(o,0,m)),L=y(yn(o,2,m)),R=y(yn(o,0,m)),l=y(l-L),h[o+908>>2]=y(qn(o,2,(A|2|0)==2?M:l,m,m)),u=y(u-R),h[o+912>>2]=y(qn(o,0,(d|2|0)==2?k:u,B,m))}function t2(o,l,u,A,d,m,B){o=o|0,l=y(l),u=y(u),A=A|0,d=d|0,m=y(m),B=y(B);var k=0,R=$e,M=$e;return k=(A|0)==2,!(l<=y(0)&k)&&!(u<=y(0)&(d|0)==2)&&!((A|0)==1&(d|0)==1)?o=0:(R=y(yn(o,0,m)),M=y(yn(o,2,m)),k=l>2]=y(qn(o,2,k?y(0):l,m,m)),l=y(u-R),k=u>2]=y(qn(o,0,k?y(0):l,B,m)),o=1),o|0}function Py(o,l){return o=o|0,l=l|0,Jg(o)|0?o=dr(2,l)|0:o=0,o|0}function kh(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(mi(o,l,u)),y(u+y(vr(o,l)))}function r2(o,l,u){return o=o|0,l=l|0,u=y(u),u=y(Cs(o,l,u)),y(u+y(Un(o,l)))}function Va(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(kh(o,l,u)),y(A+y(r2(o,l,u)))}function n2(o){return o=o|0,n[o+24>>2]|0?o=0:y(KA(o))!=y(0)?o=1:o=y(Qh(o))!=y(0),o|0}function KA(o){o=o|0;var l=$e;if(n[o+944>>2]|0){if(l=y(h[o+44>>2]),Mt(l)|0)return l=y(h[o+40>>2]),o=l>y(0)&((Mt(l)|0)^1),y(o?l:y(0))}else l=y(0);return y(l)}function Qh(o){o=o|0;var l=$e,u=0,A=$e;do if(n[o+944>>2]|0){if(l=y(h[o+48>>2]),Mt(l)|0){if(u=s[(n[o+976>>2]|0)+2>>0]|0,!(u<<24>>24)&&(A=y(h[o+40>>2]),A>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function by(o){o=o|0;var l=0,u=0;if(eE(o+400|0,0,540)|0,s[o+985>>0]=1,te(o),u=Mi(o)|0,u|0){l=o+948|0,o=0;do by(n[(n[l>>2]|0)+(o<<2)>>2]|0),o=o+1|0;while((o|0)!=(u|0))}}function lb(o,l,u,A,d,m,B,k,R,M){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=y(m),B=y(B),k=k|0,R=R|0,M=M|0;var L=0,q=$e,ae=0,Ye=0,Le=$e,Qe=$e,tt=0,Xe=$e,ct=0,He=$e,We=0,Lt=0,Gr=0,fr=0,$t=0,Rr=0,Hr=0,cr=0,Hn=0,Ro=0;Hn=I,I=I+16|0,Gr=Hn+12|0,fr=Hn+8|0,$t=Hn+4|0,Rr=Hn,cr=dr(n[o+4>>2]|0,R)|0,We=de(cr)|0,q=y(Xr(WL(l)|0,We?m:B)),Lt=io(l,2,m)|0,Hr=io(l,0,B)|0;do if(!(Mt(q)|0)&&!(Mt(We?u:d)|0)){if(L=l+504|0,!(Mt(y(h[L>>2]))|0)&&(!(s2(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[L>>2]=y($n(q,y(Va(l,cr,m))))}else ae=7;while(!1);do if((ae|0)==7){if(ct=We^1,!(ct|Lt^1)){B=y(Xr(n[l+992>>2]|0,m)),h[l+504>>2]=y($n(B,y(Va(l,2,m))));break}if(!(We|Hr^1)){B=y(Xr(n[l+996>>2]|0,B)),h[l+504>>2]=y($n(B,y(Va(l,0,m))));break}h[Gr>>2]=y(le),h[fr>>2]=y(le),n[$t>>2]=0,n[Rr>>2]=0,Xe=y(yn(l,2,m)),He=y(yn(l,0,m)),Lt?(Le=y(Xe+y(Xr(n[l+992>>2]|0,m))),h[Gr>>2]=Le,n[$t>>2]=1,Ye=1):(Ye=0,Le=y(le)),Hr?(q=y(He+y(Xr(n[l+996>>2]|0,B))),h[fr>>2]=q,n[Rr>>2]=1,L=1):(L=0,q=y(le)),ae=n[o+32>>2]|0,We&(ae|0)==2?ae=2:Mt(Le)|0&&!(Mt(u)|0)&&(h[Gr>>2]=u,n[$t>>2]=2,Ye=2,Le=u),!((ae|0)==2&ct)&&Mt(q)|0&&!(Mt(d)|0)&&(h[fr>>2]=d,n[Rr>>2]=2,L=2,q=d),Qe=y(h[l+396>>2]),tt=Mt(Qe)|0;do if(tt)ae=Ye;else{if((Ye|0)==1&ct){h[fr>>2]=y(y(Le-Xe)/Qe),n[Rr>>2]=1,L=1,ae=1;break}We&(L|0)==1?(h[Gr>>2]=y(Qe*y(q-He)),n[$t>>2]=1,L=1,ae=1):ae=Ye}while(!1);Ro=Mt(u)|0,Ye=(ss(o,l)|0)!=4,!(We|Lt|((A|0)!=1|Ro)|(Ye|(ae|0)==1))&&(h[Gr>>2]=u,n[$t>>2]=1,!tt)&&(h[fr>>2]=y(y(u-Xe)/Qe),n[Rr>>2]=1,L=1),!(Hr|ct|((k|0)!=1|(Mt(d)|0))|(Ye|(L|0)==1))&&(h[fr>>2]=d,n[Rr>>2]=1,!tt)&&(h[Gr>>2]=y(Qe*y(d-He)),n[$t>>2]=1),Cu(l,2,m,m,$t,Gr),Cu(l,0,B,m,Rr,fr),u=y(h[Gr>>2]),d=y(h[fr>>2]),xl(l,u,d,R,n[$t>>2]|0,n[Rr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(cr<<2)>>2]<<2)>>2]),h[l+504>>2]=y($n(B,y(Va(l,cr,m))))}while(!1);n[l+500>>2]=n[2278],I=Hn}function qn(o,l,u,A,d){return o=o|0,l=l|0,u=y(u),A=y(A),d=y(d),A=y(Vg(o,l,u,A)),y($n(A,y(Va(o,l,d))))}function ss(o,l){return o=o|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:o+16|0)>>2]|0,(l|0)==5&&Jg(n[o+4>>2]|0)|0&&(l=1),l|0}function kl(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,o+60+(l<<3)|0}function Ql(o,l){return o=o|0,l=l|0,de(l)|0&&n[o+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,o+60+(l<<3)|0}function Cu(o,l,u,A,d,m){switch(o=o|0,l=l|0,u=y(u),A=y(A),d=d|0,m=m|0,u=y(Xr(o+380+(n[976+(l<<2)>>2]<<3)|0,u)),u=y(u+y(yn(o,l,A))),n[d>>2]|0){case 2:case 1:{d=Mt(u)|0,A=y(h[m>>2]),h[m>>2]=d|A>2]=2,h[m>>2]=u);break}default:}}function ha(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(kn(o,4,948)|0)+4>>2]|0?o=1:o=(n[(kn(o,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function zA(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0;return o=o+132|0,de(l)|0&&(A=kn(o,4,948)|0,(n[A+4>>2]|0)!=0)?d=4:(A=kn(o,n[1040+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?d=4:u=y(0)),(d|0)==4&&(u=y(Xr(A,u))),y(u)}function ZA(o,l,u){o=o|0,l=l|0,u=y(u);var A=$e;return A=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),A=y(A+y(K(o,l,u))),y(A+y(re(o,l,u)))}function HL(o){o=o|0;var l=0,u=0,A=0;e:do if(Jg(n[o+4>>2]|0)|0)l=0;else if((n[o+16>>2]|0)!=5)if(u=Mi(o)|0,!u)l=0;else for(l=0;;){if(A=Is(o,l)|0,!(n[A+24>>2]|0)&&(n[A+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=u>>>0){l=0;break}}else l=1;while(!1);return l|0}function jL(o,l){o=o|0,l=l|0;var u=$e;return u=y(h[o+908+(n[976+(l<<2)>>2]<<2)>>2]),u>=y(0)&((Mt(u)|0)^1)|0}function Yg(o){o=o|0;var l=$e,u=0,A=0,d=0,m=0,B=0,k=0,R=$e;if(u=n[o+968>>2]|0,u)R=y(h[o+908>>2]),l=y(h[o+912>>2]),l=y(TX[u&0](o,R,l)),wi(o,(Mt(l)|0)^1,3573);else{m=Mi(o)|0;do if(m|0){for(u=0,d=0;;){if(A=Is(o,d)|0,n[A+940>>2]|0){B=8;break}if((n[A+24>>2]|0)!=1)if(k=(ss(o,A)|0)==5,k){u=A;break}else u=u|0?u:A;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!u)break;return l=y(Yg(u)),y(l+y(h[u+404>>2]))}while(!1);l=y(h[o+912>>2])}return y(l)}function Vg(o,l,u,A){o=o|0,l=l|0,u=y(u),A=y(A);var d=$e,m=0;return Jg(l)|0?(l=1,m=3):de(l)|0?(l=0,m=3):(A=y(le),d=y(le)),(m|0)==3&&(d=y(Xr(o+364+(l<<3)|0,A)),A=y(Xr(o+380+(l<<3)|0,A))),m=A=y(0)&((Mt(A)|0)^1)),u=m?A:u,m=d>=y(0)&((Mt(d)|0)^1)&u>2]|0,m)|0,Le=Py(tt,m)|0,Qe=de(tt)|0,q=y(yn(l,2,u)),ae=y(yn(l,0,u)),io(l,2,u)|0?k=y(q+y(Xr(n[l+992>>2]|0,u))):ha(l,2)|0&&xy(l,2)|0?(k=y(h[o+908>>2]),R=y(vr(o,2)),R=y(k-y(R+y(Un(o,2)))),k=y(zA(l,2,u)),k=y(qn(l,2,y(R-y(k+y(Rh(l,2,u)))),u,u))):k=y(le),io(l,0,d)|0?R=y(ae+y(Xr(n[l+996>>2]|0,d))):ha(l,0)|0&&xy(l,0)|0?(R=y(h[o+912>>2]),ct=y(vr(o,0)),ct=y(R-y(ct+y(Un(o,0)))),R=y(zA(l,0,d)),R=y(qn(l,0,y(ct-y(R+y(Rh(l,0,d)))),d,u))):R=y(le),M=Mt(k)|0,L=Mt(R)|0;do if(M^L&&(Ye=y(h[l+396>>2]),!(Mt(Ye)|0)))if(M){k=y(q+y(y(R-ae)*Ye));break}else{ct=y(ae+y(y(k-q)/Ye)),R=L?ct:R;break}while(!1);L=Mt(k)|0,M=Mt(R)|0,L|M&&(He=(L^1)&1,A=u>y(0)&((A|0)!=0&L),k=Qe?k:A?u:k,xl(l,k,R,m,Qe?He:A?2:He,L&(M^1)&1,k,R,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(yn(l,2,u))),R=y(h[l+912>>2]),R=y(R+y(yn(l,0,u)))),xl(l,k,R,m,1,1,k,R,1,3635,B)|0,xy(l,tt)|0&&!(ha(l,tt)|0)?(He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),ct=y(ct-y(Un(o,tt))),ct=y(ct-y(re(l,tt,u))),ct=y(ct-y(Rh(l,tt,Qe?u:d))),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct):Xe=21;do if((Xe|0)==21){if(!(ha(l,tt)|0)&&(n[o+8>>2]|0)==1){He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(y(ct-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct;break}!(ha(l,tt)|0)&&(n[o+8>>2]|0)==2&&(He=n[976+(tt<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(tt<<2)>>2]<<2)>>2]=ct)}while(!1);xy(l,Le)|0&&!(ha(l,Le)|0)?(He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),ct=y(ct-y(Un(o,Le))),ct=y(ct-y(re(l,Le,u))),ct=y(ct-y(Rh(l,Le,Qe?d:u))),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct):Xe=30;do if((Xe|0)==30&&!(ha(l,Le)|0)){if((ss(o,l)|0)==2){He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(y(ct-y(h[l+908+(He<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct;break}He=(ss(o,l)|0)==3,He^(n[o+28>>2]|0)==2&&(He=n[976+(Le<<2)>>2]|0,ct=y(h[o+908+(He<<2)>>2]),ct=y(ct-y(h[l+908+(He<<2)>>2])),h[l+400+(n[1040+(Le<<2)>>2]<<2)>>2]=ct)}while(!1)}function i2(o,l,u){o=o|0,l=l|0,u=u|0;var A=$e,d=0;d=n[976+(u<<2)>>2]|0,A=y(h[l+908+(d<<2)>>2]),A=y(y(h[o+908+(d<<2)>>2])-A),A=y(A-y(h[l+400+(n[1040+(u<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(u<<2)>>2]<<2)>>2]=A}function Jg(o){return o=o|0,(o|1|0)==1|0}function WL(o){o=o|0;var l=$e;switch(n[o+56>>2]|0){case 0:case 3:{l=y(h[o+40>>2]),l>y(0)&((Mt(l)|0)^1)?o=s[(n[o+976>>2]|0)+2>>0]|0?1056:992:o=1056;break}default:o=o+52|0}return o|0}function s2(o,l){return o=o|0,l=l|0,(s[o+l>>0]|0)!=0|0}function xy(o,l){return o=o|0,l=l|0,o=o+132|0,de(l)|0&&n[(kn(o,5,948)|0)+4>>2]|0?o=1:o=(n[(kn(o,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,o|0}function Rh(o,l,u){o=o|0,l=l|0,u=y(u);var A=0,d=0;return o=o+132|0,de(l)|0&&(A=kn(o,5,948)|0,(n[A+4>>2]|0)!=0)?d=4:(A=kn(o,n[1e3+(l<<2)>>2]|0,948)|0,n[A+4>>2]|0?d=4:u=y(0)),(d|0)==4&&(u=y(Xr(A,u))),y(u)}function ub(o,l,u){return o=o|0,l=l|0,u=y(u),ha(o,l)|0?u=y(zA(o,l,u)):u=y(-y(Rh(o,l,u))),y(u)}function fb(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function ky(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function Ab(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Qy(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function pb(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;if(B=o+4|0,k=n[B>>2]|0,d=k-A|0,m=d>>2,o=l+(m<<2)|0,o>>>0>>0){A=k;do n[A>>2]=n[o>>2],o=o+4|0,A=(n[B>>2]|0)+4|0,n[B>>2]=A;while(o>>>0>>0)}m|0&&Q2(k+(0-m<<2)|0,l|0,d|0)|0}function hb(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0;return k=l+4|0,R=n[k>>2]|0,d=n[o>>2]|0,B=u,m=B-d|0,A=R+(0-(m>>2)<<2)|0,n[k>>2]=A,(m|0)>0&&Qr(A|0,d|0,m|0)|0,d=o+4|0,m=l+8|0,A=(n[d>>2]|0)-B|0,(A|0)>0&&(Qr(n[m>>2]|0,u|0,A|0)|0,n[m>>2]=(n[m>>2]|0)+(A>>>2<<2)),B=n[o>>2]|0,n[o>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=o+8|0,u=l+12|0,o=n[B>>2]|0,n[B>>2]=n[u>>2],n[u>>2]=o,n[l>>2]=n[k>>2],R|0}function o2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[u>>2]|0,(B|0)!=(m|0)){d=o+8|0,u=((m+-4-B|0)>>>2)+1|0,o=B,A=n[d>>2]|0;do n[A>>2]=n[o>>2],A=(n[d>>2]|0)+4|0,n[d>>2]=A,o=o+4|0;while((o|0)!=(m|0));n[l>>2]=B+(u<<2)}}function a2(){ua()}function gb(){var o=0;return o=Kt(4)|0,l2(o),o|0}function l2(o){o=o|0,n[o>>2]=Ac()|0}function db(o){o=o|0,o|0&&(Kg(o),It(o))}function Kg(o){o=o|0,st(n[o>>2]|0)}function YL(o,l,u){o=o|0,l=l|0,u=u|0,pc(n[o>>2]|0,l,u)}function Ry(o,l){o=o|0,l=y(l),Dh(n[o>>2]|0,l)}function Ty(o,l){return o=o|0,l=l|0,s2(n[o>>2]|0,l)|0}function Fy(){var o=0;return o=Kt(8)|0,zg(o,0),o|0}function zg(o,l){o=o|0,l=l|0,l?l=fa(n[l>>2]|0)|0:l=rs()|0,n[o>>2]=l,n[o+4>>2]=0,Rn(l,o)}function Ny(o){o=o|0;var l=0;return l=Kt(8)|0,zg(l,o),l|0}function Zg(o){o=o|0,o|0&&(Oy(o),It(o))}function Oy(o){o=o|0;var l=0;uc(n[o>>2]|0),l=o+4|0,o=n[l>>2]|0,n[l>>2]=0,o|0&&(Sf(o),It(o))}function Sf(o){o=o|0,Df(o)}function Df(o){o=o|0,o=n[o>>2]|0,o|0&&Na(o|0)}function c2(o){return o=o|0,Ga(o)|0}function u2(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Sf(l),It(l)),fc(n[o>>2]|0)}function Ly(o,l){o=o|0,l=l|0,An(n[o>>2]|0,n[l>>2]|0)}function VL(o,l){o=o|0,l=l|0,wh(n[o>>2]|0,l)}function JL(o,l,u){o=o|0,l=l|0,u=+u,Cy(n[o>>2]|0,l,y(u))}function My(o,l,u){o=o|0,l=l|0,u=+u,wy(n[o>>2]|0,l,y(u))}function f2(o,l){o=o|0,l=l|0,Eh(n[o>>2]|0,l)}function A2(o,l){o=o|0,l=l|0,So(n[o>>2]|0,l)}function xr(o,l){o=o|0,l=l|0,Ch(n[o>>2]|0,l)}function so(o,l){o=o|0,l=l|0,my(n[o>>2]|0,l)}function zi(o,l){o=o|0,l=l|0,Ng(n[o>>2]|0,l)}function Ns(o,l){o=o|0,l=l|0,vo(n[o>>2]|0,l)}function XA(o,l,u){o=o|0,l=l|0,u=+u,HA(n[o>>2]|0,l,y(u))}function p2(o,l,u){o=o|0,l=l|0,u=+u,Y(n[o>>2]|0,l,y(u))}function ws(o,l){o=o|0,l=l|0,jA(n[o>>2]|0,l)}function Uy(o,l){o=o|0,l=l|0,Ey(n[o>>2]|0,l)}function Th(o,l){o=o|0,l=l|0,Do(n[o>>2]|0,l)}function Xg(o,l){o=o|0,l=+l,Bh(n[o>>2]|0,y(l))}function Fh(o,l){o=o|0,l=+l,Pl(n[o>>2]|0,y(l))}function h2(o,l){o=o|0,l=+l,Iy(n[o>>2]|0,y(l))}function g2(o,l){o=o|0,l=+l,Lg(n[o>>2]|0,y(l))}function d2(o,l){o=o|0,l=+l,Dl(n[o>>2]|0,y(l))}function m2(o,l){o=o|0,l=+l,Mg(n[o>>2]|0,y(l))}function Pf(o,l){o=o|0,l=+l,e2(n[o>>2]|0,y(l))}function sr(o){o=o|0,vh(n[o>>2]|0)}function _y(o,l){o=o|0,l=+l,Ki(n[o>>2]|0,y(l))}function y2(o,l){o=o|0,l=+l,yf(n[o>>2]|0,y(l))}function hc(o){o=o|0,qa(n[o>>2]|0)}function bf(o,l){o=o|0,l=+l,du(n[o>>2]|0,y(l))}function $g(o,l){o=o|0,l=+l,Ef(n[o>>2]|0,y(l))}function ed(o,l){o=o|0,l=+l,di(n[o>>2]|0,y(l))}function E2(o,l){o=o|0,l=+l,GA(n[o>>2]|0,y(l))}function I2(o,l){o=o|0,l=+l,Aa(n[o>>2]|0,y(l))}function wu(o,l){o=o|0,l=+l,Ya(n[o>>2]|0,y(l))}function td(o,l){o=o|0,l=+l,Sh(n[o>>2]|0,y(l))}function C2(o,l){o=o|0,l=+l,Hg(n[o>>2]|0,y(l))}function Hy(o,l){o=o|0,l=+l,qA(n[o>>2]|0,y(l))}function Bu(o,l,u){o=o|0,l=l|0,u=+u,gu(n[o>>2]|0,l,y(u))}function jy(o,l,u){o=o|0,l=l|0,u=+u,Po(n[o>>2]|0,l,y(u))}function rd(o,l,u){o=o|0,l=l|0,u=+u,mf(n[o>>2]|0,l,y(u))}function nd(o){return o=o|0,Fg(n[o>>2]|0)|0}function ko(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,_A(d,n[l>>2]|0,u),Bs(o,d),I=A}function Bs(o,l){o=o|0,l=l|0,Rl(o,n[l+4>>2]|0,+y(h[l>>2]))}function Rl(o,l,u){o=o|0,l=l|0,u=+u,n[o>>2]=l,E[o+8>>3]=u}function Gy(o){return o=o|0,$1(n[o>>2]|0)|0}function ga(o){return o=o|0,Ih(n[o>>2]|0)|0}function mb(o){return o=o|0,hu(n[o>>2]|0)|0}function Nh(o){return o=o|0,X1(n[o>>2]|0)|0}function w2(o){return o=o|0,Og(n[o>>2]|0)|0}function KL(o){return o=o|0,yy(n[o>>2]|0)|0}function yb(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,xt(d,n[l>>2]|0,u),Bs(o,d),I=A}function Eb(o){return o=o|0,df(n[o>>2]|0)|0}function qy(o){return o=o|0,Sl(n[o>>2]|0)|0}function B2(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,UA(A,n[l>>2]|0),Bs(o,A),I=u}function Oh(o){return o=o|0,+ +y(li(n[o>>2]|0))}function Ib(o){return o=o|0,+ +y(Gi(n[o>>2]|0))}function Cb(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,ur(A,n[l>>2]|0),Bs(o,A),I=u}function id(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Ug(A,n[l>>2]|0),Bs(o,A),I=u}function zL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,wt(A,n[l>>2]|0),Bs(o,A),I=u}function ZL(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,Wa(A,n[l>>2]|0),Bs(o,A),I=u}function wb(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,_g(A,n[l>>2]|0),Bs(o,A),I=u}function Bb(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,vy(A,n[l>>2]|0),Bs(o,A),I=u}function $A(o){return o=o|0,+ +y(jg(n[o>>2]|0))}function XL(o,l){return o=o|0,l=l|0,+ +y(By(n[o>>2]|0,l))}function $L(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,yt(d,n[l>>2]|0,u),Bs(o,d),I=A}function vu(o,l,u){o=o|0,l=l|0,u=u|0,lr(n[o>>2]|0,n[l>>2]|0,u)}function eM(o,l){o=o|0,l=l|0,gf(n[o>>2]|0,n[l>>2]|0)}function vb(o){return o=o|0,Mi(n[o>>2]|0)|0}function tM(o){return o=o|0,o=Et(n[o>>2]|0)|0,o?o=c2(o)|0:o=0,o|0}function Sb(o,l){return o=o|0,l=l|0,o=Is(n[o>>2]|0,l)|0,o?o=c2(o)|0:o=0,o|0}function xf(o,l){o=o|0,l=l|0;var u=0,A=0;A=Kt(4)|0,Db(A,l),u=o+4|0,l=n[u>>2]|0,n[u>>2]=A,l|0&&(Sf(l),It(l)),St(n[o>>2]|0,1)}function Db(o,l){o=o|0,l=l|0,sM(o,l)}function rM(o,l,u,A,d,m){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,Pb(k,Ga(l)|0,+u,A,+d,m),h[o>>2]=y(+E[k>>3]),h[o+4>>2]=y(+E[k+8>>3]),I=B}function Pb(o,l,u,A,d,m){o=o|0,l=l|0,u=+u,A=A|0,d=+d,m=m|0;var B=0,k=0,R=0,M=0,L=0;B=I,I=I+32|0,L=B+8|0,M=B+20|0,R=B,k=B+16|0,E[L>>3]=u,n[M>>2]=A,E[R>>3]=d,n[k>>2]=m,Wy(o,n[l+4>>2]|0,L,M,R,k),I=B}function Wy(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0;B=I,I=I+16|0,k=B,Fl(k),l=Os(l)|0,bb(o,l,+E[u>>3],n[A>>2]|0,+E[d>>3],n[m>>2]|0),Nl(k),I=B}function Os(o){return o=o|0,n[o>>2]|0}function bb(o,l,u,A,d,m){o=o|0,l=l|0,u=+u,A=A|0,d=+d,m=m|0;var B=0;B=da(v2()|0)|0,u=+Ja(u),A=Yy(A)|0,d=+Ja(d),nM(o,Kn(0,B|0,l|0,+u,A|0,+d,Yy(m)|0)|0)}function v2(){var o=0;return s[7608]|0||(D2(9120),o=7608,n[o>>2]=1,n[o+4>>2]=0),9120}function da(o){return o=o|0,n[o+8>>2]|0}function Ja(o){return o=+o,+ +kf(o)}function Yy(o){return o=o|0,sd(o)|0}function nM(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+32|0,u=d,A=l,A&1?(Ka(u,0),Me(A|0,u|0)|0,S2(o,u),iM(u)):(n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]),I=d}function Ka(o,l){o=o|0,l=l|0,Su(o,l),n[o+8>>2]=0,s[o+24>>0]=0}function S2(o,l){o=o|0,l=l|0,l=l+8|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2]}function iM(o){o=o|0,s[o+24>>0]=0}function Su(o,l){o=o|0,l=l|0,n[o>>2]=l}function sd(o){return o=o|0,o|0}function kf(o){return o=+o,+o}function D2(o){o=o|0,Qo(o,P2()|0,4)}function P2(){return 1064}function Qo(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=ji(l|0,u+1|0)|0}function sM(o,l){o=o|0,l=l|0,l=n[l>>2]|0,n[o>>2]=l,au(l|0)}function xb(o){o=o|0;var l=0,u=0;u=o+4|0,l=n[u>>2]|0,n[u>>2]=0,l|0&&(Sf(l),It(l)),St(n[o>>2]|0,0)}function kb(o){o=o|0,Pt(n[o>>2]|0)}function Vy(o){return o=o|0,tr(n[o>>2]|0)|0}function oM(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,YA(n[o>>2]|0,y(l),y(u),A)}function aM(o){return o=o|0,+ +y(mu(n[o>>2]|0))}function v(o){return o=o|0,+ +y(If(n[o>>2]|0))}function D(o){return o=o|0,+ +y(yu(n[o>>2]|0))}function Q(o){return o=o|0,+ +y(Ts(n[o>>2]|0))}function H(o){return o=o|0,+ +y(Eu(n[o>>2]|0))}function V(o){return o=o|0,+ +y(Gn(n[o>>2]|0))}function ne(o,l){o=o|0,l=l|0,E[o>>3]=+y(mu(n[l>>2]|0)),E[o+8>>3]=+y(If(n[l>>2]|0)),E[o+16>>3]=+y(yu(n[l>>2]|0)),E[o+24>>3]=+y(Ts(n[l>>2]|0)),E[o+32>>3]=+y(Eu(n[l>>2]|0)),E[o+40>>3]=+y(Gn(n[l>>2]|0))}function Se(o,l){return o=o|0,l=l|0,+ +y(ns(n[o>>2]|0,l))}function _e(o,l){return o=o|0,l=l|0,+ +y(bi(n[o>>2]|0,l))}function pt(o,l){return o=o|0,l=l|0,+ +y(WA(n[o>>2]|0,l))}function Wt(){return Qn()|0}function Sr(){Lr(),Xt(),zn(),yi(),za(),et()}function Lr(){u4e(11713,4938,1)}function Xt(){x_e(10448)}function zn(){u_e(10408)}function yi(){TUe(10324)}function za(){HLe(10096)}function et(){qe(9132)}function qe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Rr=0,Hr=0,cr=0,Hn=0,Ro=0,To=0,Fo=0,Xa=0,Wh=0,Yh=0,gc=0,Vh=0,Tf=0,Ff=0,Jh=0,Kh=0,zh=0,on=0,dc=0,Zh=0,bu=0,Xh=0,$h=0,Nf=0,Of=0,xu=0,oo=0,Ll=0,ma=0,mc=0,op=0,ap=0,Lf=0,lp=0,cp=0,ao=0,Ms=0,yc=0,Wn=0,up=0,No=0,ku=0,Oo=0,Qu=0,fp=0,Ap=0,Ru=0,lo=0,Ec=0,pp=0,hp=0,gp=0,Nr=0,ui=0,Us=0,Lo=0,co=0,Mr=0,Ar=0,Ic=0;l=I,I=I+672|0,u=l+656|0,Ic=l+648|0,Ar=l+640|0,Mr=l+632|0,co=l+624|0,Lo=l+616|0,Us=l+608|0,ui=l+600|0,Nr=l+592|0,gp=l+584|0,hp=l+576|0,pp=l+568|0,Ec=l+560|0,lo=l+552|0,Ru=l+544|0,Ap=l+536|0,fp=l+528|0,Qu=l+520|0,Oo=l+512|0,ku=l+504|0,No=l+496|0,up=l+488|0,Wn=l+480|0,yc=l+472|0,Ms=l+464|0,ao=l+456|0,cp=l+448|0,lp=l+440|0,Lf=l+432|0,ap=l+424|0,op=l+416|0,mc=l+408|0,ma=l+400|0,Ll=l+392|0,oo=l+384|0,xu=l+376|0,Of=l+368|0,Nf=l+360|0,$h=l+352|0,Xh=l+344|0,bu=l+336|0,Zh=l+328|0,dc=l+320|0,on=l+312|0,zh=l+304|0,Kh=l+296|0,Jh=l+288|0,Ff=l+280|0,Tf=l+272|0,Vh=l+264|0,gc=l+256|0,Yh=l+248|0,Wh=l+240|0,Xa=l+232|0,Fo=l+224|0,To=l+216|0,Ro=l+208|0,Hn=l+200|0,cr=l+192|0,Hr=l+184|0,Rr=l+176|0,$t=l+168|0,fr=l+160|0,Gr=l+152|0,Lt=l+144|0,We=l+136|0,He=l+128|0,ct=l+120|0,Xe=l+112|0,tt=l+104|0,Qe=l+96|0,Le=l+88|0,Ye=l+80|0,ae=l+72|0,q=l+64|0,L=l+56|0,M=l+48|0,R=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,A=l,gt(o,3646),Zt(o,3651,2)|0,Dr(o,3665,2)|0,Xn(o,3682,18)|0,n[Ic>>2]=19,n[Ic+4>>2]=0,n[u>>2]=n[Ic>>2],n[u+4>>2]=n[Ic+4>>2],kr(o,3690,u)|0,n[Ar>>2]=1,n[Ar+4>>2]=0,n[u>>2]=n[Ar>>2],n[u+4>>2]=n[Ar+4>>2],Tn(o,3696,u)|0,n[Mr>>2]=2,n[Mr+4>>2]=0,n[u>>2]=n[Mr>>2],n[u+4>>2]=n[Mr+4>>2],_n(o,3706,u)|0,n[co>>2]=1,n[co+4>>2]=0,n[u>>2]=n[co>>2],n[u+4>>2]=n[co+4>>2],zr(o,3722,u)|0,n[Lo>>2]=2,n[Lo+4>>2]=0,n[u>>2]=n[Lo>>2],n[u+4>>2]=n[Lo+4>>2],zr(o,3734,u)|0,n[Us>>2]=3,n[Us+4>>2]=0,n[u>>2]=n[Us>>2],n[u+4>>2]=n[Us+4>>2],_n(o,3753,u)|0,n[ui>>2]=4,n[ui+4>>2]=0,n[u>>2]=n[ui>>2],n[u+4>>2]=n[ui+4>>2],_n(o,3769,u)|0,n[Nr>>2]=5,n[Nr+4>>2]=0,n[u>>2]=n[Nr>>2],n[u+4>>2]=n[Nr+4>>2],_n(o,3783,u)|0,n[gp>>2]=6,n[gp+4>>2]=0,n[u>>2]=n[gp>>2],n[u+4>>2]=n[gp+4>>2],_n(o,3796,u)|0,n[hp>>2]=7,n[hp+4>>2]=0,n[u>>2]=n[hp>>2],n[u+4>>2]=n[hp+4>>2],_n(o,3813,u)|0,n[pp>>2]=8,n[pp+4>>2]=0,n[u>>2]=n[pp>>2],n[u+4>>2]=n[pp+4>>2],_n(o,3825,u)|0,n[Ec>>2]=3,n[Ec+4>>2]=0,n[u>>2]=n[Ec>>2],n[u+4>>2]=n[Ec+4>>2],zr(o,3843,u)|0,n[lo>>2]=4,n[lo+4>>2]=0,n[u>>2]=n[lo>>2],n[u+4>>2]=n[lo+4>>2],zr(o,3853,u)|0,n[Ru>>2]=9,n[Ru+4>>2]=0,n[u>>2]=n[Ru>>2],n[u+4>>2]=n[Ru+4>>2],_n(o,3870,u)|0,n[Ap>>2]=10,n[Ap+4>>2]=0,n[u>>2]=n[Ap>>2],n[u+4>>2]=n[Ap+4>>2],_n(o,3884,u)|0,n[fp>>2]=11,n[fp+4>>2]=0,n[u>>2]=n[fp>>2],n[u+4>>2]=n[fp+4>>2],_n(o,3896,u)|0,n[Qu>>2]=1,n[Qu+4>>2]=0,n[u>>2]=n[Qu>>2],n[u+4>>2]=n[Qu+4>>2],ci(o,3907,u)|0,n[Oo>>2]=2,n[Oo+4>>2]=0,n[u>>2]=n[Oo>>2],n[u+4>>2]=n[Oo+4>>2],ci(o,3915,u)|0,n[ku>>2]=3,n[ku+4>>2]=0,n[u>>2]=n[ku>>2],n[u+4>>2]=n[ku+4>>2],ci(o,3928,u)|0,n[No>>2]=4,n[No+4>>2]=0,n[u>>2]=n[No>>2],n[u+4>>2]=n[No+4>>2],ci(o,3948,u)|0,n[up>>2]=5,n[up+4>>2]=0,n[u>>2]=n[up>>2],n[u+4>>2]=n[up+4>>2],ci(o,3960,u)|0,n[Wn>>2]=6,n[Wn+4>>2]=0,n[u>>2]=n[Wn>>2],n[u+4>>2]=n[Wn+4>>2],ci(o,3974,u)|0,n[yc>>2]=7,n[yc+4>>2]=0,n[u>>2]=n[yc>>2],n[u+4>>2]=n[yc+4>>2],ci(o,3983,u)|0,n[Ms>>2]=20,n[Ms+4>>2]=0,n[u>>2]=n[Ms>>2],n[u+4>>2]=n[Ms+4>>2],kr(o,3999,u)|0,n[ao>>2]=8,n[ao+4>>2]=0,n[u>>2]=n[ao>>2],n[u+4>>2]=n[ao+4>>2],ci(o,4012,u)|0,n[cp>>2]=9,n[cp+4>>2]=0,n[u>>2]=n[cp>>2],n[u+4>>2]=n[cp+4>>2],ci(o,4022,u)|0,n[lp>>2]=21,n[lp+4>>2]=0,n[u>>2]=n[lp>>2],n[u+4>>2]=n[lp+4>>2],kr(o,4039,u)|0,n[Lf>>2]=10,n[Lf+4>>2]=0,n[u>>2]=n[Lf>>2],n[u+4>>2]=n[Lf+4>>2],ci(o,4053,u)|0,n[ap>>2]=11,n[ap+4>>2]=0,n[u>>2]=n[ap>>2],n[u+4>>2]=n[ap+4>>2],ci(o,4065,u)|0,n[op>>2]=12,n[op+4>>2]=0,n[u>>2]=n[op>>2],n[u+4>>2]=n[op+4>>2],ci(o,4084,u)|0,n[mc>>2]=13,n[mc+4>>2]=0,n[u>>2]=n[mc>>2],n[u+4>>2]=n[mc+4>>2],ci(o,4097,u)|0,n[ma>>2]=14,n[ma+4>>2]=0,n[u>>2]=n[ma>>2],n[u+4>>2]=n[ma+4>>2],ci(o,4117,u)|0,n[Ll>>2]=15,n[Ll+4>>2]=0,n[u>>2]=n[Ll>>2],n[u+4>>2]=n[Ll+4>>2],ci(o,4129,u)|0,n[oo>>2]=16,n[oo+4>>2]=0,n[u>>2]=n[oo>>2],n[u+4>>2]=n[oo+4>>2],ci(o,4148,u)|0,n[xu>>2]=17,n[xu+4>>2]=0,n[u>>2]=n[xu>>2],n[u+4>>2]=n[xu+4>>2],ci(o,4161,u)|0,n[Of>>2]=18,n[Of+4>>2]=0,n[u>>2]=n[Of>>2],n[u+4>>2]=n[Of+4>>2],ci(o,4181,u)|0,n[Nf>>2]=5,n[Nf+4>>2]=0,n[u>>2]=n[Nf>>2],n[u+4>>2]=n[Nf+4>>2],zr(o,4196,u)|0,n[$h>>2]=6,n[$h+4>>2]=0,n[u>>2]=n[$h>>2],n[u+4>>2]=n[$h+4>>2],zr(o,4206,u)|0,n[Xh>>2]=7,n[Xh+4>>2]=0,n[u>>2]=n[Xh>>2],n[u+4>>2]=n[Xh+4>>2],zr(o,4217,u)|0,n[bu>>2]=3,n[bu+4>>2]=0,n[u>>2]=n[bu>>2],n[u+4>>2]=n[bu+4>>2],Du(o,4235,u)|0,n[Zh>>2]=1,n[Zh+4>>2]=0,n[u>>2]=n[Zh>>2],n[u+4>>2]=n[Zh+4>>2],lM(o,4251,u)|0,n[dc>>2]=4,n[dc+4>>2]=0,n[u>>2]=n[dc>>2],n[u+4>>2]=n[dc+4>>2],Du(o,4263,u)|0,n[on>>2]=5,n[on+4>>2]=0,n[u>>2]=n[on>>2],n[u+4>>2]=n[on+4>>2],Du(o,4279,u)|0,n[zh>>2]=6,n[zh+4>>2]=0,n[u>>2]=n[zh>>2],n[u+4>>2]=n[zh+4>>2],Du(o,4293,u)|0,n[Kh>>2]=7,n[Kh+4>>2]=0,n[u>>2]=n[Kh>>2],n[u+4>>2]=n[Kh+4>>2],Du(o,4306,u)|0,n[Jh>>2]=8,n[Jh+4>>2]=0,n[u>>2]=n[Jh>>2],n[u+4>>2]=n[Jh+4>>2],Du(o,4323,u)|0,n[Ff>>2]=9,n[Ff+4>>2]=0,n[u>>2]=n[Ff>>2],n[u+4>>2]=n[Ff+4>>2],Du(o,4335,u)|0,n[Tf>>2]=2,n[Tf+4>>2]=0,n[u>>2]=n[Tf>>2],n[u+4>>2]=n[Tf+4>>2],lM(o,4353,u)|0,n[Vh>>2]=12,n[Vh+4>>2]=0,n[u>>2]=n[Vh>>2],n[u+4>>2]=n[Vh+4>>2],od(o,4363,u)|0,n[gc>>2]=1,n[gc+4>>2]=0,n[u>>2]=n[gc>>2],n[u+4>>2]=n[gc+4>>2],ep(o,4376,u)|0,n[Yh>>2]=2,n[Yh+4>>2]=0,n[u>>2]=n[Yh>>2],n[u+4>>2]=n[Yh+4>>2],ep(o,4388,u)|0,n[Wh>>2]=13,n[Wh+4>>2]=0,n[u>>2]=n[Wh>>2],n[u+4>>2]=n[Wh+4>>2],od(o,4402,u)|0,n[Xa>>2]=14,n[Xa+4>>2]=0,n[u>>2]=n[Xa>>2],n[u+4>>2]=n[Xa+4>>2],od(o,4411,u)|0,n[Fo>>2]=15,n[Fo+4>>2]=0,n[u>>2]=n[Fo>>2],n[u+4>>2]=n[Fo+4>>2],od(o,4421,u)|0,n[To>>2]=16,n[To+4>>2]=0,n[u>>2]=n[To>>2],n[u+4>>2]=n[To+4>>2],od(o,4433,u)|0,n[Ro>>2]=17,n[Ro+4>>2]=0,n[u>>2]=n[Ro>>2],n[u+4>>2]=n[Ro+4>>2],od(o,4446,u)|0,n[Hn>>2]=18,n[Hn+4>>2]=0,n[u>>2]=n[Hn>>2],n[u+4>>2]=n[Hn+4>>2],od(o,4458,u)|0,n[cr>>2]=3,n[cr+4>>2]=0,n[u>>2]=n[cr>>2],n[u+4>>2]=n[cr+4>>2],ep(o,4471,u)|0,n[Hr>>2]=1,n[Hr+4>>2]=0,n[u>>2]=n[Hr>>2],n[u+4>>2]=n[Hr+4>>2],Qb(o,4486,u)|0,n[Rr>>2]=10,n[Rr+4>>2]=0,n[u>>2]=n[Rr>>2],n[u+4>>2]=n[Rr+4>>2],Du(o,4496,u)|0,n[$t>>2]=11,n[$t+4>>2]=0,n[u>>2]=n[$t>>2],n[u+4>>2]=n[$t+4>>2],Du(o,4508,u)|0,n[fr>>2]=3,n[fr+4>>2]=0,n[u>>2]=n[fr>>2],n[u+4>>2]=n[fr+4>>2],lM(o,4519,u)|0,n[Gr>>2]=4,n[Gr+4>>2]=0,n[u>>2]=n[Gr>>2],n[u+4>>2]=n[Gr+4>>2],yke(o,4530,u)|0,n[Lt>>2]=19,n[Lt+4>>2]=0,n[u>>2]=n[Lt>>2],n[u+4>>2]=n[Lt+4>>2],Eke(o,4542,u)|0,n[We>>2]=12,n[We+4>>2]=0,n[u>>2]=n[We>>2],n[u+4>>2]=n[We+4>>2],Ike(o,4554,u)|0,n[He>>2]=13,n[He+4>>2]=0,n[u>>2]=n[He>>2],n[u+4>>2]=n[He+4>>2],Cke(o,4568,u)|0,n[ct>>2]=2,n[ct+4>>2]=0,n[u>>2]=n[ct>>2],n[u+4>>2]=n[ct+4>>2],wke(o,4578,u)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[u>>2]=n[Xe>>2],n[u+4>>2]=n[Xe+4>>2],Bke(o,4587,u)|0,n[tt>>2]=22,n[tt+4>>2]=0,n[u>>2]=n[tt>>2],n[u+4>>2]=n[tt+4>>2],kr(o,4602,u)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[u>>2]=n[Qe>>2],n[u+4>>2]=n[Qe+4>>2],kr(o,4619,u)|0,n[Le>>2]=14,n[Le+4>>2]=0,n[u>>2]=n[Le>>2],n[u+4>>2]=n[Le+4>>2],vke(o,4629,u)|0,n[Ye>>2]=1,n[Ye+4>>2]=0,n[u>>2]=n[Ye>>2],n[u+4>>2]=n[Ye+4>>2],Ske(o,4637,u)|0,n[ae>>2]=4,n[ae+4>>2]=0,n[u>>2]=n[ae>>2],n[u+4>>2]=n[ae+4>>2],ep(o,4653,u)|0,n[q>>2]=5,n[q+4>>2]=0,n[u>>2]=n[q>>2],n[u+4>>2]=n[q+4>>2],ep(o,4669,u)|0,n[L>>2]=6,n[L+4>>2]=0,n[u>>2]=n[L>>2],n[u+4>>2]=n[L+4>>2],ep(o,4686,u)|0,n[M>>2]=7,n[M+4>>2]=0,n[u>>2]=n[M>>2],n[u+4>>2]=n[M+4>>2],ep(o,4701,u)|0,n[R>>2]=8,n[R+4>>2]=0,n[u>>2]=n[R>>2],n[u+4>>2]=n[R+4>>2],ep(o,4719,u)|0,n[k>>2]=9,n[k+4>>2]=0,n[u>>2]=n[k>>2],n[u+4>>2]=n[k+4>>2],ep(o,4736,u)|0,n[B>>2]=21,n[B+4>>2]=0,n[u>>2]=n[B>>2],n[u+4>>2]=n[B+4>>2],Dke(o,4754,u)|0,n[m>>2]=2,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],Qb(o,4772,u)|0,n[d>>2]=3,n[d+4>>2]=0,n[u>>2]=n[d>>2],n[u+4>>2]=n[d+4>>2],Qb(o,4790,u)|0,n[A>>2]=4,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],Qb(o,4808,u)|0,I=l}function gt(o,l){o=o|0,l=l|0;var u=0;u=RLe()|0,n[o>>2]=u,TLe(u,l),jh(n[o>>2]|0)}function Zt(o,l,u){return o=o|0,l=l|0,u=u|0,yLe(o,Bn(l)|0,u,0),o|0}function Dr(o,l,u){return o=o|0,l=l|0,u=u|0,rLe(o,Bn(l)|0,u,0),o|0}function Xn(o,l,u){return o=o|0,l=l|0,u=u|0,jOe(o,Bn(l)|0,u,0),o|0}function kr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DOe(o,l,d),I=A,o|0}function Tn(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aOe(o,l,d),I=A,o|0}function _n(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],WNe(o,l,d),I=A,o|0}function zr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xNe(o,l,d),I=A,o|0}function ci(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],pNe(o,l,d),I=A,o|0}function Du(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZFe(o,l,d),I=A,o|0}function lM(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],NFe(o,l,d),I=A,o|0}function od(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aFe(o,l,d),I=A,o|0}function ep(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],WTe(o,l,d),I=A,o|0}function Qb(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xTe(o,l,d),I=A,o|0}function yke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],pTe(o,l,d),I=A,o|0}function Eke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ZRe(o,l,d),I=A,o|0}function Ike(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ORe(o,l,d),I=A,o|0}function Cke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],CRe(o,l,d),I=A,o|0}function wke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iRe(o,l,d),I=A,o|0}function Bke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],HQe(o,l,d),I=A,o|0}function vke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],SQe(o,l,d),I=A,o|0}function Ske(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],aQe(o,l,d),I=A,o|0}function Dke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Pke(o,l,d),I=A,o|0}function Pke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bke(o,u,d,1),I=A}function Bn(o){return o=o|0,o|0}function bke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=cM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=xke(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,kke(m,A)|0,A),I=d}function cM(){var o=0,l=0;if(s[7616]|0||(pz(9136),gr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(_r(9136)|0)){o=9136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));pz(9136)}return 9136}function xke(o){return o=o|0,0}function kke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=cM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Az(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(Tke(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function vn(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0;B=I,I=I+32|0,ae=B+24|0,q=B+20|0,R=B+16|0,L=B+12|0,M=B+8|0,k=B+4|0,Ye=B,n[q>>2]=l,n[R>>2]=u,n[L>>2]=A,n[M>>2]=d,n[k>>2]=m,m=o+28|0,n[Ye>>2]=n[m>>2],n[ae>>2]=n[Ye>>2],Qke(o+24|0,ae,q,L,M,R,k)|0,n[m>>2]=n[n[m>>2]>>2],I=B}function Qke(o,l,u,A,d,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,o=Rke(l)|0,l=Kt(24)|0,fz(l+4|0,n[u>>2]|0,n[A>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[o>>2],n[o>>2]=l,l|0}function Rke(o){return o=o|0,n[o>>2]|0}function fz(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=d,n[o+16>>2]=m}function yr(o,l){return o=o|0,l=l|0,l|o|0}function Az(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function Tke(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=Fke(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,Nke(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Az(m,A,u),n[R>>2]=(n[R>>2]|0)+12,Oke(o,k),Lke(k),I=M;return}}function Fke(o){return o=o|0,357913941}function Nke(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function Oke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function Lke(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function pz(o){o=o|0,_ke(o)}function Mke(o){o=o|0,Uke(o+24|0)}function _r(o){return o=o|0,n[o>>2]|0}function Uke(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function _ke(o){o=o|0;var l=0;l=en()|0,tn(o,2,3,l,Hke()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function en(){return 9228}function Hke(){return 1140}function jke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=Gke(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=qke(l,A)|0,I=u,l|0}function tn(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,n[o>>2]=l,n[o+4>>2]=u,n[o+8>>2]=A,n[o+12>>2]=d,n[o+16>>2]=m}function Gke(o){return o=o|0,(n[(cM()|0)+24>>2]|0)+(o*12|0)|0}function qke(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+48|0,A=d,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sp[u&31](A,o),A=Wke(A)|0,I=d,A|0}function Wke(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=uM(hz()|0)|0,A?(fM(l,A),AM(u,l),Yke(o,u),o=pM(l)|0):o=Vke(o)|0,I=d,o|0}function hz(){var o=0;return s[7632]|0||(nQe(9184),gr(25,9184,U|0)|0,o=7632,n[o>>2]=1,n[o+4>>2]=0),9184}function uM(o){return o=o|0,n[o+36>>2]|0}function fM(o,l){o=o|0,l=l|0,n[o>>2]=l,n[o+4>>2]=o,n[o+8>>2]=0}function AM(o,l){o=o|0,l=l|0,n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=0}function Yke(o,l){o=o|0,l=l|0,Zke(l,o,o+8|0,o+16|0,o+24|0,o+32|0,o+40|0)|0}function pM(o){return o=o|0,n[(n[o+4>>2]|0)+8>>2]|0}function Vke(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0;R=I,I=I+16|0,u=R+4|0,A=R,d=Tl(8)|0,m=d,B=Kt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[o>>2],k=k+4|0,o=o+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Kt(8)|0,B=n[l>>2]|0,n[A>>2]=0,n[u>>2]=n[A>>2],gz(k,B,u),n[d>>2]=k,I=R,m|0}function gz(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1092,n[u+12>>2]=l,n[o+4>>2]=u}function Jke(o){o=o|0,$y(o),It(o)}function Kke(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function zke(o){o=o|0,It(o)}function Zke(o,l,u,A,d,m,B){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,m=Xke(n[o>>2]|0,l,u,A,d,m,B)|0,B=o+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function Xke(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0;var k=0,R=0;return k=I,I=I+16|0,R=k,Fl(R),o=Os(o)|0,B=$ke(o,+E[l>>3],+E[u>>3],+E[A>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Nl(R),I=k,B|0}function $ke(o,l,u,A,d,m,B){o=o|0,l=+l,u=+u,A=+A,d=+d,m=+m,B=+B;var k=0;return k=da(eQe()|0)|0,l=+Ja(l),u=+Ja(u),A=+Ja(A),d=+Ja(d),m=+Ja(m),ro(0,k|0,o|0,+l,+u,+A,+d,+m,+ +Ja(B))|0}function eQe(){var o=0;return s[7624]|0||(tQe(9172),o=7624,n[o>>2]=1,n[o+4>>2]=0),9172}function tQe(o){o=o|0,Qo(o,rQe()|0,6)}function rQe(){return 1112}function nQe(o){o=o|0,Lh(o)}function iQe(o){o=o|0,dz(o+24|0),mz(o+16|0)}function dz(o){o=o|0,oQe(o)}function mz(o){o=o|0,sQe(o)}function sQe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function oQe(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function Lh(o){o=o|0;var l=0;n[o+16>>2]=0,n[o+20>>2]=0,l=o+24|0,n[l>>2]=0,n[o+28>>2]=l,n[o+36>>2]=0,s[o+40>>0]=0,s[o+41>>0]=0}function aQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lQe(o,u,d,0),I=A}function lQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=hM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cQe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,uQe(m,A)|0,A),I=d}function hM(){var o=0,l=0;if(s[7640]|0||(Ez(9232),gr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(_r(9232)|0)){o=9232,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Ez(9232)}return 9232}function cQe(o){return o=o|0,0}function uQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=hM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],yz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fQe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function yz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=AQe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,pQe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],yz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,hQe(o,k),gQe(k),I=M;return}}function AQe(o){return o=o|0,357913941}function pQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function hQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function gQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Ez(o){o=o|0,yQe(o)}function dQe(o){o=o|0,mQe(o+24|0)}function mQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yQe(o){o=o|0;var l=0;l=en()|0,tn(o,2,1,l,EQe()|0,3),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function EQe(){return 1144}function IQe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0;var m=0,B=0,k=0,R=0;m=I,I=I+16|0,B=m+8|0,k=m,R=CQe(o)|0,o=n[R+4>>2]|0,n[k>>2]=n[R>>2],n[k+4>>2]=o,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],wQe(l,B,u,A,d),I=m}function CQe(o){return o=o|0,(n[(hM()|0)+24>>2]|0)+(o*12|0)|0}function wQe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0;var m=0,B=0,k=0,R=0,M=0;M=I,I=I+16|0,B=M+2|0,k=M+1|0,R=M,m=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(m=n[(n[o>>2]|0)+m>>2]|0),Qf(B,u),u=+Rf(B,u),Qf(k,A),A=+Rf(k,A),tp(R,d),R=rp(R,d)|0,FX[m&1](o,u,A,R),I=M}function Qf(o,l){o=o|0,l=+l}function Rf(o,l){return o=o|0,l=+l,+ +vQe(l)}function tp(o,l){o=o|0,l=l|0}function rp(o,l){return o=o|0,l=l|0,BQe(l)|0}function BQe(o){return o=o|0,o|0}function vQe(o){return o=+o,+o}function SQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DQe(o,u,d,1),I=A}function DQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=gM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=PQe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,bQe(m,A)|0,A),I=d}function gM(){var o=0,l=0;if(s[7648]|0||(Cz(9268),gr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(_r(9268)|0)){o=9268,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Cz(9268)}return 9268}function PQe(o){return o=o|0,0}function bQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=gM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Iz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(xQe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Iz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function xQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=kQe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,QQe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Iz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,RQe(o,k),TQe(k),I=M;return}}function kQe(o){return o=o|0,357913941}function QQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function RQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function TQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Cz(o){o=o|0,OQe(o)}function FQe(o){o=o|0,NQe(o+24|0)}function NQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function OQe(o){o=o|0;var l=0;l=en()|0,tn(o,2,4,l,LQe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function LQe(){return 1160}function MQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=UQe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=_Qe(l,A)|0,I=u,l|0}function UQe(o){return o=o|0,(n[(gM()|0)+24>>2]|0)+(o*12|0)|0}function _Qe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),wz(gd[u&31](o)|0)|0}function wz(o){return o=o|0,o&1|0}function HQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jQe(o,u,d,0),I=A}function jQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=dM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=GQe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,qQe(m,A)|0,A),I=d}function dM(){var o=0,l=0;if(s[7656]|0||(vz(9304),gr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(_r(9304)|0)){o=9304,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));vz(9304)}return 9304}function GQe(o){return o=o|0,0}function qQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=dM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Bz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(WQe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Bz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function WQe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=YQe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,VQe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Bz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,JQe(o,k),KQe(k),I=M;return}}function YQe(o){return o=o|0,357913941}function VQe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function JQe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function KQe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function vz(o){o=o|0,XQe(o)}function zQe(o){o=o|0,ZQe(o+24|0)}function ZQe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function XQe(o){o=o|0;var l=0;l=en()|0,tn(o,2,5,l,$Qe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function $Qe(){return 1164}function eRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=tRe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rRe(l,d,u),I=A}function tRe(o){return o=o|0,(n[(dM()|0)+24>>2]|0)+(o*12|0)|0}function rRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Mh(d,u),u=Uh(d,u)|0,sp[A&31](o,u),_h(d),I=m}function Mh(o,l){o=o|0,l=l|0,nRe(o,l)}function Uh(o,l){return o=o|0,l=l|0,o|0}function _h(o){o=o|0,Sf(o)}function nRe(o,l){o=o|0,l=l|0,mM(o,l)}function mM(o,l){o=o|0,l=l|0,n[o>>2]=l}function iRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sRe(o,u,d,0),I=A}function sRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=yM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=oRe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,aRe(m,A)|0,A),I=d}function yM(){var o=0,l=0;if(s[7664]|0||(Dz(9340),gr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(_r(9340)|0)){o=9340,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Dz(9340)}return 9340}function oRe(o){return o=o|0,0}function aRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=yM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Sz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(lRe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Sz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function lRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=cRe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,uRe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Sz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,fRe(o,k),ARe(k),I=M;return}}function cRe(o){return o=o|0,357913941}function uRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function fRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function ARe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Dz(o){o=o|0,gRe(o)}function pRe(o){o=o|0,hRe(o+24|0)}function hRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function gRe(o){o=o|0;var l=0;l=en()|0,tn(o,2,4,l,dRe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function dRe(){return 1180}function mRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=yRe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=ERe(l,d,u)|0,I=A,u|0}function yRe(o){return o=o|0,(n[(yM()|0)+24>>2]|0)+(o*12|0)|0}function ERe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),ad(d,u),d=ld(d,u)|0,d=Rb(hU[A&15](o,d)|0)|0,I=m,d|0}function ad(o,l){o=o|0,l=l|0}function ld(o,l){return o=o|0,l=l|0,IRe(l)|0}function Rb(o){return o=o|0,o|0}function IRe(o){return o=o|0,o|0}function CRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wRe(o,u,d,0),I=A}function wRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=EM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=BRe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,vRe(m,A)|0,A),I=d}function EM(){var o=0,l=0;if(s[7672]|0||(bz(9376),gr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(_r(9376)|0)){o=9376,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));bz(9376)}return 9376}function BRe(o){return o=o|0,0}function vRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=EM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Pz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(SRe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Pz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function SRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=DRe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,PRe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Pz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,bRe(o,k),xRe(k),I=M;return}}function DRe(o){return o=o|0,357913941}function PRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function bRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function xRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function bz(o){o=o|0,RRe(o)}function kRe(o){o=o|0,QRe(o+24|0)}function QRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function RRe(o){o=o|0;var l=0;l=en()|0,tn(o,2,5,l,xz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function xz(){return 1196}function TRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=FRe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=NRe(l,A)|0,I=u,l|0}function FRe(o){return o=o|0,(n[(EM()|0)+24>>2]|0)+(o*12|0)|0}function NRe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),Rb(gd[u&31](o)|0)|0}function ORe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],LRe(o,u,d,1),I=A}function LRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=IM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=MRe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,URe(m,A)|0,A),I=d}function IM(){var o=0,l=0;if(s[7680]|0||(Qz(9412),gr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(_r(9412)|0)){o=9412,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Qz(9412)}return 9412}function MRe(o){return o=o|0,0}function URe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=IM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],kz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(_Re(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function kz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function _Re(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=HRe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,jRe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],kz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,GRe(o,k),qRe(k),I=M;return}}function HRe(o){return o=o|0,357913941}function jRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function GRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function qRe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Qz(o){o=o|0,VRe(o)}function WRe(o){o=o|0,YRe(o+24|0)}function YRe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function VRe(o){o=o|0;var l=0;l=en()|0,tn(o,2,6,l,Rz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Rz(){return 1200}function JRe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=KRe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=zRe(l,A)|0,I=u,l|0}function KRe(o){return o=o|0,(n[(IM()|0)+24>>2]|0)+(o*12|0)|0}function zRe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),Tb(gd[u&31](o)|0)|0}function Tb(o){return o=o|0,o|0}function ZRe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],XRe(o,u,d,0),I=A}function XRe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=CM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=$Re(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,eTe(m,A)|0,A),I=d}function CM(){var o=0,l=0;if(s[7688]|0||(Fz(9448),gr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(_r(9448)|0)){o=9448,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Fz(9448)}return 9448}function $Re(o){return o=o|0,0}function eTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=CM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Tz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(tTe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Tz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function tTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=rTe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,nTe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Tz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,iTe(o,k),sTe(k),I=M;return}}function rTe(o){return o=o|0,357913941}function nTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function iTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function sTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Fz(o){o=o|0,lTe(o)}function oTe(o){o=o|0,aTe(o+24|0)}function aTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function lTe(o){o=o|0;var l=0;l=en()|0,tn(o,2,6,l,Nz()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Nz(){return 1204}function cTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=uTe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fTe(l,d,u),I=A}function uTe(o){return o=o|0,(n[(CM()|0)+24>>2]|0)+(o*12|0)|0}function fTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),wM(d,u),d=BM(d,u)|0,sp[A&31](o,d),I=m}function wM(o,l){o=o|0,l=l|0}function BM(o,l){return o=o|0,l=l|0,ATe(l)|0}function ATe(o){return o=o|0,o|0}function pTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hTe(o,u,d,0),I=A}function hTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=vM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=gTe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,dTe(m,A)|0,A),I=d}function vM(){var o=0,l=0;if(s[7696]|0||(Lz(9484),gr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(_r(9484)|0)){o=9484,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Lz(9484)}return 9484}function gTe(o){return o=o|0,0}function dTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=vM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Oz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(mTe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Oz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function mTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=yTe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,ETe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Oz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,ITe(o,k),CTe(k),I=M;return}}function yTe(o){return o=o|0,357913941}function ETe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function ITe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function CTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Lz(o){o=o|0,vTe(o)}function wTe(o){o=o|0,BTe(o+24|0)}function BTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function vTe(o){o=o|0;var l=0;l=en()|0,tn(o,2,1,l,STe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function STe(){return 1212}function DTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=PTe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],bTe(l,m,u,A),I=d}function PTe(o){return o=o|0,(n[(vM()|0)+24>>2]|0)+(o*12|0)|0}function bTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),wM(m,u),m=BM(m,u)|0,ad(B,A),B=ld(B,A)|0,F2[d&15](o,m,B),I=k}function xTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kTe(o,u,d,1),I=A}function kTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=SM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=QTe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,RTe(m,A)|0,A),I=d}function SM(){var o=0,l=0;if(s[7704]|0||(Uz(9520),gr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(_r(9520)|0)){o=9520,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Uz(9520)}return 9520}function QTe(o){return o=o|0,0}function RTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=SM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Mz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(TTe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Mz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function TTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=FTe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,NTe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Mz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,OTe(o,k),LTe(k),I=M;return}}function FTe(o){return o=o|0,357913941}function NTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function OTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function LTe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Uz(o){o=o|0,_Te(o)}function MTe(o){o=o|0,UTe(o+24|0)}function UTe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function _Te(o){o=o|0;var l=0;l=en()|0,tn(o,2,1,l,HTe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function HTe(){return 1224}function jTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;return d=I,I=I+16|0,m=d+8|0,B=d,k=GTe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],A=+qTe(l,m,u),I=d,+A}function GTe(o){return o=o|0,(n[(SM()|0)+24>>2]|0)+(o*12|0)|0}function qTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,B=+kf(+OX[A&7](o,d)),I=m,+B}function WTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YTe(o,u,d,1),I=A}function YTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=DM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=VTe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,JTe(m,A)|0,A),I=d}function DM(){var o=0,l=0;if(s[7712]|0||(Hz(9556),gr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(_r(9556)|0)){o=9556,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Hz(9556)}return 9556}function VTe(o){return o=o|0,0}function JTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=DM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_z(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(KTe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function _z(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function KTe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=zTe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,ZTe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],_z(m,A,u),n[R>>2]=(n[R>>2]|0)+12,XTe(o,k),$Te(k),I=M;return}}function zTe(o){return o=o|0,357913941}function ZTe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function XTe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function $Te(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Hz(o){o=o|0,rFe(o)}function eFe(o){o=o|0,tFe(o+24|0)}function tFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function rFe(o){o=o|0;var l=0;l=en()|0,tn(o,2,5,l,nFe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function nFe(){return 1232}function iFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=sFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=+oFe(l,d),I=A,+u}function sFe(o){return o=o|0,(n[(DM()|0)+24>>2]|0)+(o*12|0)|0}function oFe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),+ +kf(+NX[u&15](o))}function aFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lFe(o,u,d,1),I=A}function lFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=PM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cFe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,uFe(m,A)|0,A),I=d}function PM(){var o=0,l=0;if(s[7720]|0||(Gz(9592),gr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(_r(9592)|0)){o=9592,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Gz(9592)}return 9592}function cFe(o){return o=o|0,0}function uFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=PM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],jz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fFe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function jz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=AFe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,pFe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],jz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,hFe(o,k),gFe(k),I=M;return}}function AFe(o){return o=o|0,357913941}function pFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function hFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function gFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Gz(o){o=o|0,yFe(o)}function dFe(o){o=o|0,mFe(o+24|0)}function mFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yFe(o){o=o|0;var l=0;l=en()|0,tn(o,2,7,l,EFe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function EFe(){return 1276}function IFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=CFe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=wFe(l,A)|0,I=u,l|0}function CFe(o){return o=o|0,(n[(PM()|0)+24>>2]|0)+(o*12|0)|0}function wFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;return d=I,I=I+16|0,A=d,u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sp[u&31](A,o),A=qz(A)|0,I=d,A|0}function qz(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=uM(Wz()|0)|0,A?(fM(l,A),AM(u,l),BFe(o,u),o=pM(l)|0):o=vFe(o)|0,I=d,o|0}function Wz(){var o=0;return s[7736]|0||(FFe(9640),gr(25,9640,U|0)|0,o=7736,n[o>>2]=1,n[o+4>>2]=0),9640}function BFe(o,l){o=o|0,l=l|0,bFe(l,o,o+8|0)|0}function vFe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Tl(8)|0,l=A,k=Kt(16)|0,n[k>>2]=n[o>>2],n[k+4>>2]=n[o+4>>2],n[k+8>>2]=n[o+8>>2],n[k+12>>2]=n[o+12>>2],m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],bM(o,m,d),n[A>>2]=o,I=u,l|0}function bM(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1244,n[u+12>>2]=l,n[o+4>>2]=u}function SFe(o){o=o|0,$y(o),It(o)}function DFe(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function PFe(o){o=o|0,It(o)}function bFe(o,l,u){return o=o|0,l=l|0,u=u|0,l=xFe(n[o>>2]|0,l,u)|0,u=o+4|0,n[(n[u>>2]|0)+8>>2]=l,n[(n[u>>2]|0)+8>>2]|0}function xFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;return A=I,I=I+16|0,d=A,Fl(d),o=Os(o)|0,u=kFe(o,n[l>>2]|0,+E[u>>3])|0,Nl(d),I=A,u|0}function kFe(o,l,u){o=o|0,l=l|0,u=+u;var A=0;return A=da(QFe()|0)|0,l=Yy(l)|0,ou(0,A|0,o|0,l|0,+ +Ja(u))|0}function QFe(){var o=0;return s[7728]|0||(RFe(9628),o=7728,n[o>>2]=1,n[o+4>>2]=0),9628}function RFe(o){o=o|0,Qo(o,TFe()|0,2)}function TFe(){return 1264}function FFe(o){o=o|0,Lh(o)}function NFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],OFe(o,u,d,1),I=A}function OFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=xM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=LFe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,MFe(m,A)|0,A),I=d}function xM(){var o=0,l=0;if(s[7744]|0||(Vz(9684),gr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(_r(9684)|0)){o=9684,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Vz(9684)}return 9684}function LFe(o){return o=o|0,0}function MFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=xM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Yz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(UFe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Yz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function UFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=_Fe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,HFe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Yz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,jFe(o,k),GFe(k),I=M;return}}function _Fe(o){return o=o|0,357913941}function HFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function jFe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function GFe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Vz(o){o=o|0,YFe(o)}function qFe(o){o=o|0,WFe(o+24|0)}function WFe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function YFe(o){o=o|0;var l=0;l=en()|0,tn(o,2,5,l,VFe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function VFe(){return 1280}function JFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=KFe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=zFe(l,d,u)|0,I=A,u|0}function KFe(o){return o=o|0,(n[(xM()|0)+24>>2]|0)+(o*12|0)|0}function zFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return B=I,I=I+32|0,d=B,m=B+16|0,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(m,u),m=rp(m,u)|0,F2[A&15](d,o,m),m=qz(d)|0,I=B,m|0}function ZFe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],XFe(o,u,d,1),I=A}function XFe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=kM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=$Fe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,eNe(m,A)|0,A),I=d}function kM(){var o=0,l=0;if(s[7752]|0||(Kz(9720),gr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(_r(9720)|0)){o=9720,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Kz(9720)}return 9720}function $Fe(o){return o=o|0,0}function eNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=kM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Jz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(tNe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Jz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function tNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=rNe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,nNe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Jz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,iNe(o,k),sNe(k),I=M;return}}function rNe(o){return o=o|0,357913941}function nNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function iNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function sNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Kz(o){o=o|0,lNe(o)}function oNe(o){o=o|0,aNe(o+24|0)}function aNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function lNe(o){o=o|0;var l=0;l=en()|0,tn(o,2,8,l,cNe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function cNe(){return 1288}function uNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;return u=I,I=I+16|0,A=u+8|0,d=u,m=fNe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],l=ANe(l,A)|0,I=u,l|0}function fNe(o){return o=o|0,(n[(kM()|0)+24>>2]|0)+(o*12|0)|0}function ANe(o,l){o=o|0,l=l|0;var u=0;return u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),sd(gd[u&31](o)|0)|0}function pNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hNe(o,u,d,0),I=A}function hNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=QM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=gNe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,dNe(m,A)|0,A),I=d}function QM(){var o=0,l=0;if(s[7760]|0||(Zz(9756),gr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(_r(9756)|0)){o=9756,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));Zz(9756)}return 9756}function gNe(o){return o=o|0,0}function dNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=QM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],zz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(mNe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function zz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function mNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=yNe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,ENe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],zz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,INe(o,k),CNe(k),I=M;return}}function yNe(o){return o=o|0,357913941}function ENe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function INe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function CNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function Zz(o){o=o|0,vNe(o)}function wNe(o){o=o|0,BNe(o+24|0)}function BNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function vNe(o){o=o|0;var l=0;l=en()|0,tn(o,2,8,l,SNe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function SNe(){return 1292}function DNe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=PNe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bNe(l,d,u),I=A}function PNe(o){return o=o|0,(n[(QM()|0)+24>>2]|0)+(o*12|0)|0}function bNe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),Qf(d,u),u=+Rf(d,u),RX[A&31](o,u),I=m}function xNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kNe(o,u,d,0),I=A}function kNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=RM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=QNe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,RNe(m,A)|0,A),I=d}function RM(){var o=0,l=0;if(s[7768]|0||($z(9792),gr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(_r(9792)|0)){o=9792,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));$z(9792)}return 9792}function QNe(o){return o=o|0,0}function RNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=RM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Xz(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(TNe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function Xz(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function TNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=FNe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,NNe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],Xz(m,A,u),n[R>>2]=(n[R>>2]|0)+12,ONe(o,k),LNe(k),I=M;return}}function FNe(o){return o=o|0,357913941}function NNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function ONe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function LNe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function $z(o){o=o|0,_Ne(o)}function MNe(o){o=o|0,UNe(o+24|0)}function UNe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function _Ne(o){o=o|0;var l=0;l=en()|0,tn(o,2,1,l,HNe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function HNe(){return 1300}function jNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=GNe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],qNe(l,m,u,A),I=d}function GNe(o){return o=o|0,(n[(RM()|0)+24>>2]|0)+(o*12|0)|0}function qNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),tp(m,u),m=rp(m,u)|0,Qf(B,A),A=+Rf(B,A),_X[d&15](o,m,A),I=k}function WNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YNe(o,u,d,0),I=A}function YNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=TM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=VNe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,JNe(m,A)|0,A),I=d}function TM(){var o=0,l=0;if(s[7776]|0||(tZ(9828),gr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(_r(9828)|0)){o=9828,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));tZ(9828)}return 9828}function VNe(o){return o=o|0,0}function JNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=TM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],eZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(KNe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function eZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function KNe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=zNe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,ZNe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],eZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,XNe(o,k),$Ne(k),I=M;return}}function zNe(o){return o=o|0,357913941}function ZNe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function XNe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function $Ne(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function tZ(o){o=o|0,rOe(o)}function eOe(o){o=o|0,tOe(o+24|0)}function tOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function rOe(o){o=o|0;var l=0;l=en()|0,tn(o,2,7,l,nOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function nOe(){return 1312}function iOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=sOe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],oOe(l,d,u),I=A}function sOe(o){return o=o|0,(n[(TM()|0)+24>>2]|0)+(o*12|0)|0}function oOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,sp[A&31](o,d),I=m}function aOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lOe(o,u,d,0),I=A}function lOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=FM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=cOe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,uOe(m,A)|0,A),I=d}function FM(){var o=0,l=0;if(s[7784]|0||(nZ(9864),gr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(_r(9864)|0)){o=9864,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));nZ(9864)}return 9864}function cOe(o){return o=o|0,0}function uOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=FM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],rZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(fOe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function rZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function fOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=AOe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,pOe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],rZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,hOe(o,k),gOe(k),I=M;return}}function AOe(o){return o=o|0,357913941}function pOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function hOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function gOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function nZ(o){o=o|0,yOe(o)}function dOe(o){o=o|0,mOe(o+24|0)}function mOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function yOe(o){o=o|0;var l=0;l=en()|0,tn(o,2,8,l,EOe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function EOe(){return 1320}function IOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=COe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wOe(l,d,u),I=A}function COe(o){return o=o|0,(n[(FM()|0)+24>>2]|0)+(o*12|0)|0}function wOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),BOe(d,u),d=vOe(d,u)|0,sp[A&31](o,d),I=m}function BOe(o,l){o=o|0,l=l|0}function vOe(o,l){return o=o|0,l=l|0,SOe(l)|0}function SOe(o){return o=o|0,o|0}function DOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],POe(o,u,d,0),I=A}function POe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=NM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=bOe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,xOe(m,A)|0,A),I=d}function NM(){var o=0,l=0;if(s[7792]|0||(sZ(9900),gr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(_r(9900)|0)){o=9900,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));sZ(9900)}return 9900}function bOe(o){return o=o|0,0}function xOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=NM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],iZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(kOe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function iZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function kOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=QOe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,ROe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],iZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,TOe(o,k),FOe(k),I=M;return}}function QOe(o){return o=o|0,357913941}function ROe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function TOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function FOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function sZ(o){o=o|0,LOe(o)}function NOe(o){o=o|0,OOe(o+24|0)}function OOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function LOe(o){o=o|0;var l=0;l=en()|0,tn(o,2,22,l,MOe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function MOe(){return 1344}function UOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0;u=I,I=I+16|0,A=u+8|0,d=u,m=_Oe(o)|0,o=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=o,n[A>>2]=n[d>>2],n[A+4>>2]=n[d+4>>2],HOe(l,A),I=u}function _Oe(o){return o=o|0,(n[(NM()|0)+24>>2]|0)+(o*12|0)|0}function HOe(o,l){o=o|0,l=l|0;var u=0;u=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(u=n[(n[o>>2]|0)+u>>2]|0),ip[u&127](o)}function jOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=OM()|0,o=GOe(u)|0,vn(m,l,d,o,qOe(u,A)|0,A)}function OM(){var o=0,l=0;if(s[7800]|0||(aZ(9936),gr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(_r(9936)|0)){o=9936,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));aZ(9936)}return 9936}function GOe(o){return o=o|0,o|0}function qOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=OM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(oZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(WOe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function oZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function WOe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=YOe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,VOe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,oZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,JOe(o,d),KOe(d),I=k;return}}function YOe(o){return o=o|0,536870911}function VOe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function JOe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function KOe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function aZ(o){o=o|0,XOe(o)}function zOe(o){o=o|0,ZOe(o+24|0)}function ZOe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function XOe(o){o=o|0;var l=0;l=en()|0,tn(o,1,23,l,Nz()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function $Oe(o,l){o=o|0,l=l|0,tLe(n[(eLe(o)|0)>>2]|0,l)}function eLe(o){return o=o|0,(n[(OM()|0)+24>>2]|0)+(o<<3)|0}function tLe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,wM(A,l),l=BM(A,l)|0,ip[o&127](l),I=u}function rLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=LM()|0,o=nLe(u)|0,vn(m,l,d,o,iLe(u,A)|0,A)}function LM(){var o=0,l=0;if(s[7808]|0||(cZ(9972),gr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(_r(9972)|0)){o=9972,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));cZ(9972)}return 9972}function nLe(o){return o=o|0,o|0}function iLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=LM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(lZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(sLe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function lZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function sLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=oLe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,aLe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,lZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,lLe(o,d),cLe(d),I=k;return}}function oLe(o){return o=o|0,536870911}function aLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function lLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function cLe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function cZ(o){o=o|0,ALe(o)}function uLe(o){o=o|0,fLe(o+24|0)}function fLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function ALe(o){o=o|0;var l=0;l=en()|0,tn(o,1,9,l,pLe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function pLe(){return 1348}function hLe(o,l){return o=o|0,l=l|0,dLe(n[(gLe(o)|0)>>2]|0,l)|0}function gLe(o){return o=o|0,(n[(LM()|0)+24>>2]|0)+(o<<3)|0}function dLe(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,uZ(A,l),l=fZ(A,l)|0,l=Rb(gd[o&31](l)|0)|0,I=u,l|0}function uZ(o,l){o=o|0,l=l|0}function fZ(o,l){return o=o|0,l=l|0,mLe(l)|0}function mLe(o){return o=o|0,o|0}function yLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=MM()|0,o=ELe(u)|0,vn(m,l,d,o,ILe(u,A)|0,A)}function MM(){var o=0,l=0;if(s[7816]|0||(pZ(10008),gr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(_r(10008)|0)){o=10008,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));pZ(10008)}return 10008}function ELe(o){return o=o|0,o|0}function ILe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=MM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(AZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(CLe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function AZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function CLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=wLe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,BLe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,AZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,vLe(o,d),SLe(d),I=k;return}}function wLe(o){return o=o|0,536870911}function BLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function vLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function SLe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function pZ(o){o=o|0,bLe(o)}function DLe(o){o=o|0,PLe(o+24|0)}function PLe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function bLe(o){o=o|0;var l=0;l=en()|0,tn(o,1,15,l,xz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function xLe(o){return o=o|0,QLe(n[(kLe(o)|0)>>2]|0)|0}function kLe(o){return o=o|0,(n[(MM()|0)+24>>2]|0)+(o<<3)|0}function QLe(o){return o=o|0,Rb(Vb[o&7]()|0)|0}function RLe(){var o=0;return s[7832]|0||(_Le(10052),gr(25,10052,U|0)|0,o=7832,n[o>>2]=1,n[o+4>>2]=0),10052}function TLe(o,l){o=o|0,l=l|0,n[o>>2]=FLe()|0,n[o+4>>2]=NLe()|0,n[o+12>>2]=l,n[o+8>>2]=OLe()|0,n[o+32>>2]=2}function FLe(){return 11709}function NLe(){return 1188}function OLe(){return Fb()|0}function LLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(MLe(u),It(u)):l|0&&(Oy(l),It(l))}function Hh(o,l){return o=o|0,l=l|0,l&o|0}function MLe(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function Fb(){var o=0;return s[7824]|0||(n[2511]=ULe()|0,n[2512]=0,o=7824,n[o>>2]=1,n[o+4>>2]=0),10044}function ULe(){return 0}function _Le(o){o=o|0,Lh(o)}function HLe(o){o=o|0;var l=0,u=0,A=0,d=0,m=0;l=I,I=I+32|0,u=l+24|0,m=l+16|0,d=l+8|0,A=l,jLe(o,4827),GLe(o,4834,3)|0,qLe(o,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[u>>2]=n[m>>2],n[u+4>>2]=n[m+4>>2],WLe(o,4841,u)|0,n[d>>2]=1,n[d+4>>2]=0,n[u>>2]=n[d>>2],n[u+4>>2]=n[d+4>>2],YLe(o,4871,u)|0,n[A>>2]=10,n[A+4>>2]=0,n[u>>2]=n[A>>2],n[u+4>>2]=n[A+4>>2],VLe(o,4891,u)|0,I=l}function jLe(o,l){o=o|0,l=l|0;var u=0;u=SUe()|0,n[o>>2]=u,DUe(u,l),jh(n[o>>2]|0)}function GLe(o,l,u){return o=o|0,l=l|0,u=u|0,cUe(o,Bn(l)|0,u,0),o|0}function qLe(o,l,u){return o=o|0,l=l|0,u=u|0,JMe(o,Bn(l)|0,u,0),o|0}function WLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xMe(o,l,d),I=A,o|0}function YLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uMe(o,l,d),I=A,o|0}function VLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=n[u+4>>2]|0,n[m>>2]=n[u>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],JLe(o,l,d),I=A,o|0}function JLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],KLe(o,u,d,1),I=A}function KLe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=UM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=zLe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,ZLe(m,A)|0,A),I=d}function UM(){var o=0,l=0;if(s[7840]|0||(gZ(10100),gr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(_r(10100)|0)){o=10100,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));gZ(10100)}return 10100}function zLe(o){return o=o|0,0}function ZLe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=UM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],hZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(XLe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function hZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function XLe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=$Le(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,eMe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],hZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,tMe(o,k),rMe(k),I=M;return}}function $Le(o){return o=o|0,357913941}function eMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function tMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function rMe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function gZ(o){o=o|0,sMe(o)}function nMe(o){o=o|0,iMe(o+24|0)}function iMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function sMe(o){o=o|0;var l=0;l=en()|0,tn(o,2,6,l,oMe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function oMe(){return 1364}function aMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;return A=I,I=I+16|0,d=A+8|0,m=A,B=lMe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],u=cMe(l,d,u)|0,I=A,u|0}function lMe(o){return o=o|0,(n[(UM()|0)+24>>2]|0)+(o*12|0)|0}function cMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),tp(d,u),d=rp(d,u)|0,d=wz(hU[A&15](o,d)|0)|0,I=m,d|0}function uMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fMe(o,u,d,0),I=A}function fMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=_M()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=AMe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,pMe(m,A)|0,A),I=d}function _M(){var o=0,l=0;if(s[7848]|0||(mZ(10136),gr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(_r(10136)|0)){o=10136,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));mZ(10136)}return 10136}function AMe(o){return o=o|0,0}function pMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=_M()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],dZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(hMe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function dZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function hMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=gMe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,dMe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],dZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,mMe(o,k),yMe(k),I=M;return}}function gMe(o){return o=o|0,357913941}function dMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function mMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function yMe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function mZ(o){o=o|0,CMe(o)}function EMe(o){o=o|0,IMe(o+24|0)}function IMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function CMe(o){o=o|0;var l=0;l=en()|0,tn(o,2,9,l,wMe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function wMe(){return 1372}function BMe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,d=A+8|0,m=A,B=vMe(o)|0,o=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=o,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],SMe(l,d,u),I=A}function vMe(o){return o=o|0,(n[(_M()|0)+24>>2]|0)+(o*12|0)|0}function SMe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=$e;m=I,I=I+16|0,d=m,A=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(A=n[(n[o>>2]|0)+A>>2]|0),DMe(d,u),B=y(PMe(d,u)),QX[A&1](o,B),I=m}function DMe(o,l){o=o|0,l=+l}function PMe(o,l){return o=o|0,l=+l,y(bMe(l))}function bMe(o){return o=+o,y(o)}function xMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,d=A+8|0,m=A,k=n[u>>2]|0,B=n[u+4>>2]|0,u=Bn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kMe(o,u,d,0),I=A}function kMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0,R=0,M=0,L=0;d=I,I=I+32|0,m=d+16|0,L=d+8|0,k=d,M=n[u>>2]|0,R=n[u+4>>2]|0,B=n[o>>2]|0,o=HM()|0,n[L>>2]=M,n[L+4>>2]=R,n[m>>2]=n[L>>2],n[m+4>>2]=n[L+4>>2],u=QMe(m)|0,n[k>>2]=M,n[k+4>>2]=R,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],vn(B,l,o,u,RMe(m,A)|0,A),I=d}function HM(){var o=0,l=0;if(s[7856]|0||(EZ(10172),gr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(_r(10172)|0)){o=10172,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));EZ(10172)}return 10172}function QMe(o){return o=o|0,0}function RMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0;return L=I,I=I+32|0,d=L+24|0,B=L+16|0,k=L,R=L+8|0,m=n[o>>2]|0,A=n[o+4>>2]|0,n[k>>2]=m,n[k+4>>2]=A,q=HM()|0,M=q+24|0,o=yr(l,4)|0,n[R>>2]=o,l=q+28|0,u=n[l>>2]|0,u>>>0<(n[q+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=A,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],yZ(u,d,o),o=(n[l>>2]|0)+12|0,n[l>>2]=o):(TMe(M,k,R),o=n[l>>2]|0),I=L,((o-(n[M>>2]|0)|0)/12|0)+-1|0}function yZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=n[l+4>>2]|0,n[o>>2]=n[l>>2],n[o+4>>2]=A,n[o+8>>2]=u}function TMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;if(M=I,I=I+48|0,A=M+32|0,B=M+24|0,k=M,R=o+4|0,d=(((n[R>>2]|0)-(n[o>>2]|0)|0)/12|0)+1|0,m=FMe(o)|0,m>>>0>>0)sn(o);else{L=n[o>>2]|0,ae=((n[o+8>>2]|0)-L|0)/12|0,q=ae<<1,NMe(k,ae>>>0>>1>>>0?q>>>0>>0?d:q:m,((n[R>>2]|0)-L|0)/12|0,o+8|0),R=k+8|0,m=n[R>>2]|0,d=n[l+4>>2]|0,u=n[u>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[A>>2]=n[B>>2],n[A+4>>2]=n[B+4>>2],yZ(m,A,u),n[R>>2]=(n[R>>2]|0)+12,OMe(o,k),LMe(k),I=M;return}}function FMe(o){return o=o|0,357913941}function NMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>357913941)Nt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u*12|0)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l*12|0)}function OMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function LMe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~(((A+-12-l|0)>>>0)/12|0)*12|0)),o=n[o>>2]|0,o|0&&It(o)}function EZ(o){o=o|0,_Me(o)}function MMe(o){o=o|0,UMe(o+24|0)}function UMe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~(((l+-12-A|0)>>>0)/12|0)*12|0)),It(u))}function _Me(o){o=o|0;var l=0;l=en()|0,tn(o,2,3,l,HMe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function HMe(){return 1380}function jMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+8|0,B=d,k=GMe(o)|0,o=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=o,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],qMe(l,m,u,A),I=d}function GMe(o){return o=o|0,(n[(HM()|0)+24>>2]|0)+(o*12|0)|0}function qMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;k=I,I=I+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,o=o+(l>>1)|0,l&1&&(d=n[(n[o>>2]|0)+d>>2]|0),tp(m,u),m=rp(m,u)|0,WMe(B,A),B=YMe(B,A)|0,F2[d&15](o,m,B),I=k}function WMe(o,l){o=o|0,l=l|0}function YMe(o,l){return o=o|0,l=l|0,VMe(l)|0}function VMe(o){return o=o|0,(o|0)!=0|0}function JMe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=jM()|0,o=KMe(u)|0,vn(m,l,d,o,zMe(u,A)|0,A)}function jM(){var o=0,l=0;if(s[7864]|0||(CZ(10208),gr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(_r(10208)|0)){o=10208,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));CZ(10208)}return 10208}function KMe(o){return o=o|0,o|0}function zMe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=jM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(IZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(ZMe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function IZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function ZMe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=XMe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,$Me(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,IZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,eUe(o,d),tUe(d),I=k;return}}function XMe(o){return o=o|0,536870911}function $Me(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function eUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function tUe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function CZ(o){o=o|0,iUe(o)}function rUe(o){o=o|0,nUe(o+24|0)}function nUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function iUe(o){o=o|0;var l=0;l=en()|0,tn(o,1,24,l,sUe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function sUe(){return 1392}function oUe(o,l){o=o|0,l=l|0,lUe(n[(aUe(o)|0)>>2]|0,l)}function aUe(o){return o=o|0,(n[(jM()|0)+24>>2]|0)+(o<<3)|0}function lUe(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,uZ(A,l),l=fZ(A,l)|0,ip[o&127](l),I=u}function cUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=GM()|0,o=uUe(u)|0,vn(m,l,d,o,fUe(u,A)|0,A)}function GM(){var o=0,l=0;if(s[7872]|0||(BZ(10244),gr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(_r(10244)|0)){o=10244,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));BZ(10244)}return 10244}function uUe(o){return o=o|0,o|0}function fUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=GM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(wZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(AUe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function wZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function AUe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=pUe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,hUe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,wZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,gUe(o,d),dUe(d),I=k;return}}function pUe(o){return o=o|0,536870911}function hUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function gUe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function dUe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function BZ(o){o=o|0,EUe(o)}function mUe(o){o=o|0,yUe(o+24|0)}function yUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function EUe(o){o=o|0;var l=0;l=en()|0,tn(o,1,16,l,IUe()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function IUe(){return 1400}function CUe(o){return o=o|0,BUe(n[(wUe(o)|0)>>2]|0)|0}function wUe(o){return o=o|0,(n[(GM()|0)+24>>2]|0)+(o<<3)|0}function BUe(o){return o=o|0,vUe(Vb[o&7]()|0)|0}function vUe(o){return o=o|0,o|0}function SUe(){var o=0;return s[7880]|0||(RUe(10280),gr(25,10280,U|0)|0,o=7880,n[o>>2]=1,n[o+4>>2]=0),10280}function DUe(o,l){o=o|0,l=l|0,n[o>>2]=PUe()|0,n[o+4>>2]=bUe()|0,n[o+12>>2]=l,n[o+8>>2]=xUe()|0,n[o+32>>2]=4}function PUe(){return 11711}function bUe(){return 1356}function xUe(){return Fb()|0}function kUe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(QUe(u),It(u)):l|0&&(Kg(l),It(l))}function QUe(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function RUe(o){o=o|0,Lh(o)}function TUe(o){o=o|0,FUe(o,4920),NUe(o)|0,OUe(o)|0}function FUe(o,l){o=o|0,l=l|0;var u=0;u=Wz()|0,n[o>>2]=u,n_e(u,l),jh(n[o>>2]|0)}function NUe(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,VUe()|0),o|0}function OUe(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,LUe()|0),o|0}function LUe(){var o=0;return s[7888]|0||(vZ(10328),gr(53,10328,U|0)|0,o=7888,n[o>>2]=1,n[o+4>>2]=0),_r(10328)|0||vZ(10328),10328}function cd(o,l){o=o|0,l=l|0,vn(o,0,l,0,0,0)}function vZ(o){o=o|0,_Ue(o),ud(o,10)}function MUe(o){o=o|0,UUe(o+24|0)}function UUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function _Ue(o){o=o|0;var l=0;l=en()|0,tn(o,5,1,l,qUe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function HUe(o,l,u){o=o|0,l=l|0,u=+u,jUe(o,l,u)}function ud(o,l){o=o|0,l=l|0,n[o+20>>2]=l}function jUe(o,l,u){o=o|0,l=l|0,u=+u;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+16|0,m=A+8|0,k=A+13|0,d=A,B=A+12|0,tp(k,l),n[m>>2]=rp(k,l)|0,Qf(B,u),E[d>>3]=+Rf(B,u),GUe(o,m,d),I=A}function GUe(o,l,u){o=o|0,l=l|0,u=u|0,Rl(o+8|0,n[l>>2]|0,+E[u>>3]),s[o+24>>0]=1}function qUe(){return 1404}function WUe(o,l){return o=o|0,l=+l,YUe(o,l)|0}function YUe(o,l){o=o|0,l=+l;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return A=I,I=I+16|0,m=A+4|0,B=A+8|0,k=A,d=Tl(8)|0,u=d,R=Kt(16)|0,tp(m,o),o=rp(m,o)|0,Qf(B,l),Rl(R,o,+Rf(B,l)),B=u+4|0,n[B>>2]=R,o=Kt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],bM(o,B,m),n[d>>2]=o,I=A,u|0}function VUe(){var o=0;return s[7896]|0||(SZ(10364),gr(54,10364,U|0)|0,o=7896,n[o>>2]=1,n[o+4>>2]=0),_r(10364)|0||SZ(10364),10364}function SZ(o){o=o|0,zUe(o),ud(o,55)}function JUe(o){o=o|0,KUe(o+24|0)}function KUe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function zUe(o){o=o|0;var l=0;l=en()|0,tn(o,5,4,l,e_e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function ZUe(o){o=o|0,XUe(o)}function XUe(o){o=o|0,$Ue(o)}function $Ue(o){o=o|0,DZ(o+8|0),s[o+24>>0]=1}function DZ(o){o=o|0,n[o>>2]=0,E[o+8>>3]=0}function e_e(){return 1424}function t_e(){return r_e()|0}function r_e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Tl(8)|0,o=u,A=Kt(16)|0,DZ(A),m=o+4|0,n[m>>2]=A,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],bM(A,m,d),n[u>>2]=A,I=l,o|0}function n_e(o,l){o=o|0,l=l|0,n[o>>2]=i_e()|0,n[o+4>>2]=s_e()|0,n[o+12>>2]=l,n[o+8>>2]=o_e()|0,n[o+32>>2]=5}function i_e(){return 11710}function s_e(){return 1416}function o_e(){return Nb()|0}function a_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(l_e(u),It(u)):l|0&&It(l)}function l_e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function Nb(){var o=0;return s[7904]|0||(n[2600]=c_e()|0,n[2601]=0,o=7904,n[o>>2]=1,n[o+4>>2]=0),10400}function c_e(){return n[357]|0}function u_e(o){o=o|0,f_e(o,4926),A_e(o)|0}function f_e(o,l){o=o|0,l=l|0;var u=0;u=hz()|0,n[o>>2]=u,B_e(u,l),jh(n[o>>2]|0)}function A_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,p_e()|0),o|0}function p_e(){var o=0;return s[7912]|0||(PZ(10412),gr(56,10412,U|0)|0,o=7912,n[o>>2]=1,n[o+4>>2]=0),_r(10412)|0||PZ(10412),10412}function PZ(o){o=o|0,d_e(o),ud(o,57)}function h_e(o){o=o|0,g_e(o+24|0)}function g_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function d_e(o){o=o|0;var l=0;l=en()|0,tn(o,5,5,l,I_e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function m_e(o){o=o|0,y_e(o)}function y_e(o){o=o|0,E_e(o)}function E_e(o){o=o|0;var l=0,u=0;l=o+8|0,u=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(u|0));s[o+56>>0]=1}function I_e(){return 1432}function C_e(){return w_e()|0}function w_e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0,k=0;B=I,I=I+16|0,o=B+4|0,l=B,u=Tl(8)|0,A=u,d=Kt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=A+4|0,n[m>>2]=d,k=Kt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[o>>2]=n[l>>2],gz(k,m,o),n[u>>2]=k,I=B,A|0}function B_e(o,l){o=o|0,l=l|0,n[o>>2]=v_e()|0,n[o+4>>2]=S_e()|0,n[o+12>>2]=l,n[o+8>>2]=D_e()|0,n[o+32>>2]=6}function v_e(){return 11704}function S_e(){return 1436}function D_e(){return Nb()|0}function P_e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(b_e(u),It(u)):l|0&&It(l)}function b_e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function x_e(o){o=o|0,k_e(o,4933),Q_e(o)|0,R_e(o)|0}function k_e(o,l){o=o|0,l=l|0;var u=0;u=r4e()|0,n[o>>2]=u,n4e(u,l),jh(n[o>>2]|0)}function Q_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,Y_e()|0),o|0}function R_e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,T_e()|0),o|0}function T_e(){var o=0;return s[7920]|0||(bZ(10452),gr(58,10452,U|0)|0,o=7920,n[o>>2]=1,n[o+4>>2]=0),_r(10452)|0||bZ(10452),10452}function bZ(o){o=o|0,O_e(o),ud(o,1)}function F_e(o){o=o|0,N_e(o+24|0)}function N_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function O_e(o){o=o|0;var l=0;l=en()|0,tn(o,5,1,l,__e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function L_e(o,l,u){o=o|0,l=+l,u=+u,M_e(o,l,u)}function M_e(o,l,u){o=o|0,l=+l,u=+u;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,m=A+8|0,k=A+17|0,d=A,B=A+16|0,Qf(k,l),E[m>>3]=+Rf(k,l),Qf(B,u),E[d>>3]=+Rf(B,u),U_e(o,m,d),I=A}function U_e(o,l,u){o=o|0,l=l|0,u=u|0,xZ(o+8|0,+E[l>>3],+E[u>>3]),s[o+24>>0]=1}function xZ(o,l,u){o=o|0,l=+l,u=+u,E[o>>3]=l,E[o+8>>3]=u}function __e(){return 1472}function H_e(o,l){return o=+o,l=+l,j_e(o,l)|0}function j_e(o,l){o=+o,l=+l;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return A=I,I=I+16|0,B=A+4|0,k=A+8|0,R=A,d=Tl(8)|0,u=d,m=Kt(16)|0,Qf(B,o),o=+Rf(B,o),Qf(k,l),xZ(m,o,+Rf(k,l)),k=u+4|0,n[k>>2]=m,m=Kt(8)|0,k=n[k>>2]|0,n[R>>2]=0,n[B>>2]=n[R>>2],kZ(m,k,B),n[d>>2]=m,I=A,u|0}function kZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1452,n[u+12>>2]=l,n[o+4>>2]=u}function G_e(o){o=o|0,$y(o),It(o)}function q_e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function W_e(o){o=o|0,It(o)}function Y_e(){var o=0;return s[7928]|0||(QZ(10488),gr(59,10488,U|0)|0,o=7928,n[o>>2]=1,n[o+4>>2]=0),_r(10488)|0||QZ(10488),10488}function QZ(o){o=o|0,K_e(o),ud(o,60)}function V_e(o){o=o|0,J_e(o+24|0)}function J_e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function K_e(o){o=o|0;var l=0;l=en()|0,tn(o,5,6,l,$_e()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function z_e(o){o=o|0,Z_e(o)}function Z_e(o){o=o|0,X_e(o)}function X_e(o){o=o|0,RZ(o+8|0),s[o+24>>0]=1}function RZ(o){o=o|0,n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,n[o+12>>2]=0}function $_e(){return 1492}function e4e(){return t4e()|0}function t4e(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Tl(8)|0,o=u,A=Kt(16)|0,RZ(A),m=o+4|0,n[m>>2]=A,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],kZ(A,m,d),n[u>>2]=A,I=l,o|0}function r4e(){var o=0;return s[7936]|0||(c4e(10524),gr(25,10524,U|0)|0,o=7936,n[o>>2]=1,n[o+4>>2]=0),10524}function n4e(o,l){o=o|0,l=l|0,n[o>>2]=i4e()|0,n[o+4>>2]=s4e()|0,n[o+12>>2]=l,n[o+8>>2]=o4e()|0,n[o+32>>2]=7}function i4e(){return 11700}function s4e(){return 1484}function o4e(){return Nb()|0}function a4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(l4e(u),It(u)):l|0&&It(l)}function l4e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function c4e(o){o=o|0,Lh(o)}function u4e(o,l,u){o=o|0,l=l|0,u=u|0,o=Bn(l)|0,l=f4e(u)|0,u=A4e(u,0)|0,j4e(o,l,u,qM()|0,0)}function f4e(o){return o=o|0,o|0}function A4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=qM()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(FZ(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(E4e(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function qM(){var o=0,l=0;if(s[7944]|0||(TZ(10568),gr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(_r(10568)|0)){o=10568,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));TZ(10568)}return 10568}function TZ(o){o=o|0,g4e(o)}function p4e(o){o=o|0,h4e(o+24|0)}function h4e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function g4e(o){o=o|0;var l=0;l=en()|0,tn(o,1,17,l,Rz()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function d4e(o){return o=o|0,y4e(n[(m4e(o)|0)>>2]|0)|0}function m4e(o){return o=o|0,(n[(qM()|0)+24>>2]|0)+(o<<3)|0}function y4e(o){return o=o|0,Tb(Vb[o&7]()|0)|0}function FZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function E4e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=I4e(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,C4e(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,FZ(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,w4e(o,d),B4e(d),I=k;return}}function I4e(o){return o=o|0,536870911}function C4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function w4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function B4e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function v4e(){S4e()}function S4e(){D4e(10604)}function D4e(o){o=o|0,P4e(o,4955)}function P4e(o,l){o=o|0,l=l|0;var u=0;u=b4e()|0,n[o>>2]=u,x4e(u,l),jh(n[o>>2]|0)}function b4e(){var o=0;return s[7952]|0||(M4e(10612),gr(25,10612,U|0)|0,o=7952,n[o>>2]=1,n[o+4>>2]=0),10612}function x4e(o,l){o=o|0,l=l|0,n[o>>2]=T4e()|0,n[o+4>>2]=F4e()|0,n[o+12>>2]=l,n[o+8>>2]=N4e()|0,n[o+32>>2]=8}function jh(o){o=o|0;var l=0,u=0;l=I,I=I+16|0,u=l,Jy()|0,n[u>>2]=o,k4e(10608,u),I=l}function Jy(){return s[11714]|0||(n[2652]=0,gr(62,10608,U|0)|0,s[11714]=1),10608}function k4e(o,l){o=o|0,l=l|0;var u=0;u=Kt(8)|0,n[u+4>>2]=n[l>>2],n[u>>2]=n[o>>2],n[o>>2]=u}function Q4e(o){o=o|0,R4e(o)}function R4e(o){o=o|0;var l=0,u=0;if(l=n[o>>2]|0,l|0)do u=l,l=n[l>>2]|0,It(u);while(l|0);n[o>>2]=0}function T4e(){return 11715}function F4e(){return 1496}function N4e(){return Fb()|0}function O4e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(L4e(u),It(u)):l|0&&It(l)}function L4e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function M4e(o){o=o|0,Lh(o)}function U4e(o,l){o=o|0,l=l|0;var u=0,A=0;Jy()|0,u=n[2652]|0;e:do if(u|0){for(;A=n[u+4>>2]|0,!(A|0&&!(gX(WM(A)|0,o)|0));)if(u=n[u>>2]|0,!u)break e;_4e(A,l)}while(!1)}function WM(o){return o=o|0,n[o+12>>2]|0}function _4e(o,l){o=o|0,l=l|0;var u=0;o=o+36|0,u=n[o>>2]|0,u|0&&(Sf(u),It(u)),u=Kt(4)|0,Db(u,l),n[o>>2]=u}function YM(){return s[11716]|0||(n[2664]=0,gr(63,10656,U|0)|0,s[11716]=1),10656}function NZ(){var o=0;return s[11717]|0?o=n[2665]|0:(H4e(),n[2665]=1504,s[11717]=1,o=1504),o|0}function H4e(){s[11740]|0||(s[11718]=yr(yr(8,0)|0,0)|0,s[11719]=yr(yr(0,0)|0,0)|0,s[11720]=yr(yr(0,16)|0,0)|0,s[11721]=yr(yr(8,0)|0,0)|0,s[11722]=yr(yr(0,0)|0,0)|0,s[11723]=yr(yr(8,0)|0,0)|0,s[11724]=yr(yr(0,0)|0,0)|0,s[11725]=yr(yr(8,0)|0,0)|0,s[11726]=yr(yr(0,0)|0,0)|0,s[11727]=yr(yr(8,0)|0,0)|0,s[11728]=yr(yr(0,0)|0,0)|0,s[11729]=yr(yr(0,0)|0,32)|0,s[11730]=yr(yr(0,0)|0,32)|0,s[11740]=1)}function OZ(){return 1572}function j4e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0,L=0;m=I,I=I+32|0,L=m+16|0,M=m+12|0,R=m+8|0,k=m+4|0,B=m,n[L>>2]=o,n[M>>2]=l,n[R>>2]=u,n[k>>2]=A,n[B>>2]=d,YM()|0,G4e(10656,L,M,R,k,B),I=m}function G4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0;B=Kt(24)|0,fz(B+4|0,n[l>>2]|0,n[u>>2]|0,n[A>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[o>>2],n[o>>2]=B}function LZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0,ct=0;if(ct=I,I=I+32|0,Le=ct+20|0,Qe=ct+8|0,tt=ct+4|0,Xe=ct,l=n[l>>2]|0,l|0){Ye=Le+4|0,R=Le+8|0,M=Qe+4|0,L=Qe+8|0,q=Qe+8|0,ae=Le+8|0;do{if(B=l+4|0,k=VM(B)|0,k|0){if(d=b2(k)|0,n[Le>>2]=0,n[Ye>>2]=0,n[R>>2]=0,A=(x2(k)|0)+1|0,q4e(Le,A),A|0)for(;A=A+-1|0,Pu(Qe,n[d>>2]|0),m=n[Ye>>2]|0,m>>>0<(n[ae>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[Ye>>2]=(n[Ye>>2]|0)+4):JM(Le,Qe),A;)d=d+4|0;A=k2(k)|0,n[Qe>>2]=0,n[M>>2]=0,n[L>>2]=0;e:do if(n[A>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?W4e(Qe,A):(n[d>>2]=n[A>>2],n[M>>2]=(n[M>>2]|0)+4),A=A+4|0,!(n[A>>2]|0))break e;d=n[M>>2]|0,m=n[q>>2]|0}while(!1);n[tt>>2]=Ob(B)|0,n[Xe>>2]=_r(k)|0,Y4e(u,o,tt,Xe,Le,Qe),KM(Qe),np(Le)}l=n[l>>2]|0}while(l|0)}I=ct}function VM(o){return o=o|0,n[o+12>>2]|0}function b2(o){return o=o|0,n[o+12>>2]|0}function x2(o){return o=o|0,n[o+16>>2]|0}function q4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+32|0,u=d,A=n[o>>2]|0,(n[o+8>>2]|0)-A>>2>>>0>>0&&(WZ(u,l,(n[o+4>>2]|0)-A>>2,o+8|0),YZ(o,u),VZ(u)),I=d}function JM(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,d=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=qZ(o)|0,m>>>0>>0)sn(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,R=M>>1,WZ(u,M>>2>>>0>>1>>>0?R>>>0>>0?d:R:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,YZ(o,u),VZ(u),I=B;return}}function k2(o){return o=o|0,n[o+8>>2]|0}function W4e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0;if(B=I,I=I+32|0,u=B,A=o+4|0,d=((n[A>>2]|0)-(n[o>>2]|0)>>2)+1|0,m=GZ(o)|0,m>>>0>>0)sn(o);else{k=n[o>>2]|0,M=(n[o+8>>2]|0)-k|0,R=M>>1,f3e(u,M>>2>>>0>>1>>>0?R>>>0>>0?d:R:m,(n[A>>2]|0)-k>>2,o+8|0),m=u+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,A3e(o,u),p3e(u),I=B;return}}function Ob(o){return o=o|0,n[o>>2]|0}function Y4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,V4e(o,l,u,A,d,m)}function KM(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function np(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-4-A|0)>>>2)<<2)),It(u))}function V4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,R=0,M=0,L=0,q=0;B=I,I=I+48|0,L=B+40|0,k=B+32|0,q=B+24|0,R=B+12|0,M=B,Fl(k),o=Os(o)|0,n[q>>2]=n[l>>2],u=n[u>>2]|0,A=n[A>>2]|0,zM(R,d),J4e(M,m),n[L>>2]=n[q>>2],K4e(o,L,u,A,R,M),KM(M),np(R),Nl(k),I=B}function zM(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(c3e(o,A),u3e(o,n[l>>2]|0,n[u>>2]|0,A))}function J4e(o,l){o=o|0,l=l|0;var u=0,A=0;n[o>>2]=0,n[o+4>>2]=0,n[o+8>>2]=0,u=l+4|0,A=(n[u>>2]|0)-(n[l>>2]|0)>>2,A|0&&(a3e(o,A),l3e(o,n[l>>2]|0,n[u>>2]|0,A))}function K4e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,R=0,M=0,L=0,q=0;B=I,I=I+32|0,L=B+28|0,q=B+24|0,k=B+12|0,R=B,M=da(z4e()|0)|0,n[q>>2]=n[l>>2],n[L>>2]=n[q>>2],l=fd(L)|0,u=MZ(u)|0,A=ZM(A)|0,n[k>>2]=n[d>>2],L=d+4|0,n[k+4>>2]=n[L>>2],q=d+8|0,n[k+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[d>>2]=0,d=XM(k)|0,n[R>>2]=n[m>>2],L=m+4|0,n[R+4>>2]=n[L>>2],q=m+8|0,n[R+8>>2]=n[q>>2],n[q>>2]=0,n[L>>2]=0,n[m>>2]=0,lu(0,M|0,o|0,l|0,u|0,A|0,d|0,Z4e(R)|0)|0,KM(R),np(k),I=B}function z4e(){var o=0;return s[7968]|0||(s3e(10708),o=7968,n[o>>2]=1,n[o+4>>2]=0),10708}function fd(o){return o=o|0,_Z(o)|0}function MZ(o){return o=o|0,UZ(o)|0}function ZM(o){return o=o|0,Tb(o)|0}function XM(o){return o=o|0,$4e(o)|0}function Z4e(o){return o=o|0,X4e(o)|0}function X4e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Tl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=UZ(n[(n[o>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function UZ(o){return o=o|0,o|0}function $4e(o){o=o|0;var l=0,u=0,A=0;if(A=(n[o+4>>2]|0)-(n[o>>2]|0)|0,u=A>>2,A=Tl(A+4|0)|0,n[A>>2]=u,u|0){l=0;do n[A+4+(l<<2)>>2]=_Z((n[o>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(u|0))}return A|0}function _Z(o){o=o|0;var l=0,u=0,A=0,d=0;return d=I,I=I+32|0,l=d+12|0,u=d,A=uM(HZ()|0)|0,A?(fM(l,A),AM(u,l),Nje(o,u),o=pM(l)|0):o=e3e(o)|0,I=d,o|0}function HZ(){var o=0;return s[7960]|0||(i3e(10664),gr(25,10664,U|0)|0,o=7960,n[o>>2]=1,n[o+4>>2]=0),10664}function e3e(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Tl(8)|0,l=A,k=Kt(4)|0,n[k>>2]=n[o>>2],m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],jZ(o,m,d),n[A>>2]=o,I=u,l|0}function jZ(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1656,n[u+12>>2]=l,n[o+4>>2]=u}function t3e(o){o=o|0,$y(o),It(o)}function r3e(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function n3e(o){o=o|0,It(o)}function i3e(o){o=o|0,Lh(o)}function s3e(o){o=o|0,Qo(o,o3e()|0,5)}function o3e(){return 1676}function a3e(o,l){o=o|0,l=l|0;var u=0;if((GZ(o)|0)>>>0>>0&&sn(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function l3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function GZ(o){return o=o|0,1073741823}function c3e(o,l){o=o|0,l=l|0;var u=0;if((qZ(o)|0)>>>0>>0&&sn(o),l>>>0>1073741823)Nt();else{u=Kt(l<<2)|0,n[o+4>>2]=u,n[o>>2]=u,n[o+8>>2]=u+(l<<2);return}}function u3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,A=o+4|0,o=u-l|0,(o|0)>0&&(Qr(n[A>>2]|0,l|0,o|0)|0,n[A>>2]=(n[A>>2]|0)+(o>>>2<<2))}function qZ(o){return o=o|0,1073741823}function f3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function A3e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function p3e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function WZ(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>1073741823)Nt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<2)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<2)}function YZ(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function VZ(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-4-l|0)>>>2)<<2)),o=n[o>>2]|0,o|0&&It(o)}function h3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;if(Qe=I,I=I+32|0,L=Qe+20|0,q=Qe+12|0,M=Qe+16|0,ae=Qe+4|0,Ye=Qe,Le=Qe+8|0,k=NZ()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(R=n[k+8>>2]|0,k=n[k+4>>2]|0;Pu(L,B),g3e(o,L,k,R),m=m+4|0,B=n[m>>2]|0,B;)R=R+1|0,k=k+1|0;if(m=OZ()|0,B=n[m>>2]|0,B|0)do Pu(L,B),n[q>>2]=n[m+4>>2],d3e(l,L,q),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[(Jy()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,Pu(L,n[(Ky(l)|0)>>2]|0),n[q>>2]=WM(l)|0,m3e(u,L,q),m=n[m>>2]|0;while(m|0);if(Pu(M,0),m=YM()|0,n[L>>2]=n[M>>2],LZ(L,m,d),m=n[(Jy()|0)>>2]|0,m|0){o=L+4|0,l=L+8|0,u=L+8|0;do{if(R=n[m+4>>2]|0,Pu(q,n[(Ky(R)|0)>>2]|0),y3e(ae,JZ(R)|0),B=n[ae>>2]|0,B|0){n[L>>2]=0,n[o>>2]=0,n[l>>2]=0;do Pu(Ye,n[(Ky(n[B+4>>2]|0)|0)>>2]|0),k=n[o>>2]|0,k>>>0<(n[u>>2]|0)>>>0?(n[k>>2]=n[Ye>>2],n[o>>2]=(n[o>>2]|0)+4):JM(L,Ye),B=n[B>>2]|0;while(B|0);E3e(A,q,L),np(L)}n[Le>>2]=n[q>>2],M=KZ(R)|0,n[L>>2]=n[Le>>2],LZ(L,M,d),mz(ae),m=n[m>>2]|0}while(m|0)}I=Qe}function g3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,Q3e(o,l,u,A)}function d3e(o,l,u){o=o|0,l=l|0,u=u|0,k3e(o,l,u)}function Ky(o){return o=o|0,o|0}function m3e(o,l,u){o=o|0,l=l|0,u=u|0,D3e(o,l,u)}function JZ(o){return o=o|0,o+16|0}function y3e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;if(m=I,I=I+16|0,d=m+8|0,u=m,n[o>>2]=0,A=n[l>>2]|0,n[d>>2]=A,n[u>>2]=o,u=S3e(u)|0,A|0){if(A=Kt(12)|0,B=(zZ(d)|0)+4|0,o=n[B+4>>2]|0,l=A+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=o,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)o=A;else for(l=A;o=Kt(12)|0,R=(zZ(d)|0)+4|0,k=n[R+4>>2]|0,B=o+4|0,n[B>>2]=n[R>>2],n[B+4>>2]=k,n[l>>2]=o,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=o;n[o>>2]=n[u>>2],n[u>>2]=A}I=m}function E3e(o,l,u){o=o|0,l=l|0,u=u|0,I3e(o,l,u)}function KZ(o){return o=o|0,o+24|0}function I3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+24|0,d=A+16|0,k=A+12|0,m=A,Fl(d),o=Os(o)|0,n[k>>2]=n[l>>2],zM(m,u),n[B>>2]=n[k>>2],C3e(o,B,m),np(m),Nl(d),I=A}function C3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=I,I=I+32|0,B=A+16|0,k=A+12|0,d=A,m=da(w3e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=fd(B)|0,n[d>>2]=n[u>>2],B=u+4|0,n[d+4>>2]=n[B>>2],k=u+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[u>>2]=0,Rs(0,m|0,o|0,l|0,XM(d)|0)|0,np(d),I=A}function w3e(){var o=0;return s[7976]|0||(B3e(10720),o=7976,n[o>>2]=1,n[o+4>>2]=0),10720}function B3e(o){o=o|0,Qo(o,v3e()|0,2)}function v3e(){return 1732}function S3e(o){return o=o|0,n[o>>2]|0}function zZ(o){return o=o|0,n[o>>2]|0}function D3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,d=A+8|0,B=A,Fl(d),o=Os(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],ZZ(o,m,u),Nl(d),I=A}function ZZ(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+16|0,m=A+4|0,B=A,d=da(P3e()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=fd(m)|0,Rs(0,d|0,o|0,l|0,MZ(u)|0)|0,I=A}function P3e(){var o=0;return s[7984]|0||(b3e(10732),o=7984,n[o>>2]=1,n[o+4>>2]=0),10732}function b3e(o){o=o|0,Qo(o,x3e()|0,2)}function x3e(){return 1744}function k3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;A=I,I=I+32|0,m=A+16|0,d=A+8|0,B=A,Fl(d),o=Os(o)|0,n[B>>2]=n[l>>2],u=n[u>>2]|0,n[m>>2]=n[B>>2],ZZ(o,m,u),Nl(d),I=A}function Q3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+32|0,B=d+16|0,m=d+8|0,k=d,Fl(m),o=Os(o)|0,n[k>>2]=n[l>>2],u=s[u>>0]|0,A=s[A>>0]|0,n[B>>2]=n[k>>2],R3e(o,B,u,A),Nl(m),I=d}function R3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,B=d+4|0,k=d,m=da(T3e()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=fd(B)|0,u=zy(u)|0,Li(0,m|0,o|0,l|0,u|0,zy(A)|0)|0,I=d}function T3e(){var o=0;return s[7992]|0||(N3e(10744),o=7992,n[o>>2]=1,n[o+4>>2]=0),10744}function zy(o){return o=o|0,F3e(o)|0}function F3e(o){return o=o|0,o&255|0}function N3e(o){o=o|0,Qo(o,O3e()|0,3)}function O3e(){return 1756}function L3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;switch(ae=I,I=I+32|0,k=ae+8|0,R=ae+4|0,M=ae+20|0,L=ae,mM(o,0),A=Fje(l)|0,n[k>>2]=0,q=k+4|0,n[q>>2]=0,n[k+8>>2]=0,A<<24>>24){case 0:{s[M>>0]=0,M3e(R,u,M),Lb(o,R)|0,Df(R);break}case 8:{q=iU(l)|0,s[M>>0]=8,Pu(L,n[q+4>>2]|0),U3e(R,u,M,L,q+8|0),Lb(o,R)|0,Df(R);break}case 9:{if(m=iU(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,Pu(R,n[d>>2]|0),A=n[q>>2]|0,A>>>0<(n[B>>2]|0)>>>0?(n[A>>2]=n[R>>2],n[q>>2]=(n[q>>2]|0)+4):JM(k,R),l;)d=d+4|0;s[M>>0]=9,Pu(L,n[m+8>>2]|0),_3e(R,u,M,L,k),Lb(o,R)|0,Df(R);break}default:q=iU(l)|0,s[M>>0]=A,Pu(L,n[q+4>>2]|0),H3e(R,u,M,L),Lb(o,R)|0,Df(R)}np(k),I=ae}function M3e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;A=I,I=I+16|0,d=A,Fl(d),l=Os(l)|0,e8e(o,l,s[u>>0]|0),Nl(d),I=A}function Lb(o,l){o=o|0,l=l|0;var u=0;return u=n[o>>2]|0,u|0&&Na(u|0),n[o>>2]=n[l>>2],n[l>>2]=0,o|0}function U3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0;m=I,I=I+32|0,k=m+16|0,B=m+8|0,R=m,Fl(B),l=Os(l)|0,u=s[u>>0]|0,n[R>>2]=n[A>>2],d=n[d>>2]|0,n[k>>2]=n[R>>2],z3e(o,l,u,k,d),Nl(B),I=m}function _3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0;m=I,I=I+32|0,R=m+24|0,B=m+16|0,M=m+12|0,k=m,Fl(B),l=Os(l)|0,u=s[u>>0]|0,n[M>>2]=n[A>>2],zM(k,d),n[R>>2]=n[M>>2],Y3e(o,l,u,R,k),np(k),Nl(B),I=m}function H3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+32|0,B=d+16|0,m=d+8|0,k=d,Fl(m),l=Os(l)|0,u=s[u>>0]|0,n[k>>2]=n[A>>2],n[B>>2]=n[k>>2],j3e(o,l,u,B),Nl(m),I=d}function j3e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0,B=0,k=0;d=I,I=I+16|0,m=d+4|0,k=d,B=da(G3e()|0)|0,u=zy(u)|0,n[k>>2]=n[A>>2],n[m>>2]=n[k>>2],Mb(o,Rs(0,B|0,l|0,u|0,fd(m)|0)|0),I=d}function G3e(){var o=0;return s[8e3]|0||(q3e(10756),o=8e3,n[o>>2]=1,n[o+4>>2]=0),10756}function Mb(o,l){o=o|0,l=l|0,mM(o,l)}function q3e(o){o=o|0,Qo(o,W3e()|0,2)}function W3e(){return 1772}function Y3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0;m=I,I=I+32|0,R=m+16|0,M=m+12|0,B=m,k=da(V3e()|0)|0,u=zy(u)|0,n[M>>2]=n[A>>2],n[R>>2]=n[M>>2],A=fd(R)|0,n[B>>2]=n[d>>2],R=d+4|0,n[B+4>>2]=n[R>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[R>>2]=0,n[d>>2]=0,Mb(o,Li(0,k|0,l|0,u|0,A|0,XM(B)|0)|0),np(B),I=m}function V3e(){var o=0;return s[8008]|0||(J3e(10768),o=8008,n[o>>2]=1,n[o+4>>2]=0),10768}function J3e(o){o=o|0,Qo(o,K3e()|0,3)}function K3e(){return 1784}function z3e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0;m=I,I=I+16|0,k=m+4|0,R=m,B=da(Z3e()|0)|0,u=zy(u)|0,n[R>>2]=n[A>>2],n[k>>2]=n[R>>2],A=fd(k)|0,Mb(o,Li(0,B|0,l|0,u|0,A|0,ZM(d)|0)|0),I=m}function Z3e(){var o=0;return s[8016]|0||(X3e(10780),o=8016,n[o>>2]=1,n[o+4>>2]=0),10780}function X3e(o){o=o|0,Qo(o,$3e()|0,3)}function $3e(){return 1800}function e8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;A=da(t8e()|0)|0,Mb(o,dn(0,A|0,l|0,zy(u)|0)|0)}function t8e(){var o=0;return s[8024]|0||(r8e(10792),o=8024,n[o>>2]=1,n[o+4>>2]=0),10792}function r8e(o){o=o|0,Qo(o,n8e()|0,1)}function n8e(){return 1816}function i8e(){s8e(),o8e(),a8e()}function s8e(){n[2702]=SX(65536)|0}function o8e(){P8e(10856)}function a8e(){l8e(10816)}function l8e(o){o=o|0,c8e(o,5044),u8e(o)|0}function c8e(o,l){o=o|0,l=l|0;var u=0;u=HZ()|0,n[o>>2]=u,C8e(u,l),jh(n[o>>2]|0)}function u8e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,f8e()|0),o|0}function f8e(){var o=0;return s[8032]|0||(XZ(10820),gr(64,10820,U|0)|0,o=8032,n[o>>2]=1,n[o+4>>2]=0),_r(10820)|0||XZ(10820),10820}function XZ(o){o=o|0,h8e(o),ud(o,25)}function A8e(o){o=o|0,p8e(o+24|0)}function p8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function h8e(o){o=o|0;var l=0;l=en()|0,tn(o,5,18,l,y8e()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function g8e(o,l){o=o|0,l=l|0,d8e(o,l)}function d8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;u=I,I=I+16|0,A=u,d=u+4|0,ad(d,l),n[A>>2]=ld(d,l)|0,m8e(o,A),I=u}function m8e(o,l){o=o|0,l=l|0,$Z(o+4|0,n[l>>2]|0),s[o+8>>0]=1}function $Z(o,l){o=o|0,l=l|0,n[o>>2]=l}function y8e(){return 1824}function E8e(o){return o=o|0,I8e(o)|0}function I8e(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0;return u=I,I=I+16|0,d=u+4|0,B=u,A=Tl(8)|0,l=A,k=Kt(4)|0,ad(d,o),$Z(k,ld(d,o)|0),m=l+4|0,n[m>>2]=k,o=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],jZ(o,m,d),n[A>>2]=o,I=u,l|0}function Tl(o){o=o|0;var l=0,u=0;return o=o+7&-8,o>>>0<=32768&&(l=n[2701]|0,o>>>0<=(65536-l|0)>>>0)?(u=(n[2702]|0)+l|0,n[2701]=l+o,o=u):(o=SX(o+8|0)|0,n[o>>2]=n[2703],n[2703]=o,o=o+8|0),o|0}function C8e(o,l){o=o|0,l=l|0,n[o>>2]=w8e()|0,n[o+4>>2]=B8e()|0,n[o+12>>2]=l,n[o+8>>2]=v8e()|0,n[o+32>>2]=9}function w8e(){return 11744}function B8e(){return 1832}function v8e(){return Nb()|0}function S8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(D8e(u),It(u)):l|0&&It(l)}function D8e(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function P8e(o){o=o|0,b8e(o,5052),x8e(o)|0,k8e(o,5058,26)|0,Q8e(o,5069,1)|0,R8e(o,5077,10)|0,T8e(o,5087,19)|0,F8e(o,5094,27)|0}function b8e(o,l){o=o|0,l=l|0;var u=0;u=Dje()|0,n[o>>2]=u,Pje(u,l),jh(n[o>>2]|0)}function x8e(o){o=o|0;var l=0;return l=n[o>>2]|0,cd(l,Aje()|0),o|0}function k8e(o,l,u){return o=o|0,l=l|0,u=u|0,JHe(o,Bn(l)|0,u,0),o|0}function Q8e(o,l,u){return o=o|0,l=l|0,u=u|0,THe(o,Bn(l)|0,u,0),o|0}function R8e(o,l,u){return o=o|0,l=l|0,u=u|0,fHe(o,Bn(l)|0,u,0),o|0}function T8e(o,l,u){return o=o|0,l=l|0,u=u|0,z8e(o,Bn(l)|0,u,0),o|0}function eX(o,l){o=o|0,l=l|0;var u=0,A=0;e:for(;;){for(u=n[2703]|0;;){if((u|0)==(l|0))break e;if(A=n[u>>2]|0,n[2703]=A,!u)u=A;else break}It(u)}n[2701]=o}function F8e(o,l,u){return o=o|0,l=l|0,u=u|0,N8e(o,Bn(l)|0,u,0),o|0}function N8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=$M()|0,o=O8e(u)|0,vn(m,l,d,o,L8e(u,A)|0,A)}function $M(){var o=0,l=0;if(s[8040]|0||(rX(10860),gr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(_r(10860)|0)){o=10860,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));rX(10860)}return 10860}function O8e(o){return o=o|0,o|0}function L8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=$M()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(tX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(M8e(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function tX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function M8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=U8e(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,_8e(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,tX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,H8e(o,d),j8e(d),I=k;return}}function U8e(o){return o=o|0,536870911}function _8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function H8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function j8e(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function rX(o){o=o|0,W8e(o)}function G8e(o){o=o|0,q8e(o+24|0)}function q8e(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function W8e(o){o=o|0;var l=0;l=en()|0,tn(o,1,11,l,Y8e()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function Y8e(){return 1840}function V8e(o,l,u){o=o|0,l=l|0,u=u|0,K8e(n[(J8e(o)|0)>>2]|0,l,u)}function J8e(o){return o=o|0,(n[($M()|0)+24>>2]|0)+(o<<3)|0}function K8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;A=I,I=I+16|0,m=A+1|0,d=A,ad(m,l),l=ld(m,l)|0,ad(d,u),u=ld(d,u)|0,sp[o&31](l,u),I=A}function z8e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=eU()|0,o=Z8e(u)|0,vn(m,l,d,o,X8e(u,A)|0,A)}function eU(){var o=0,l=0;if(s[8048]|0||(iX(10896),gr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(_r(10896)|0)){o=10896,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));iX(10896)}return 10896}function Z8e(o){return o=o|0,o|0}function X8e(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=eU()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(nX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):($8e(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function nX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function $8e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=eHe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,tHe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,nX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,rHe(o,d),nHe(d),I=k;return}}function eHe(o){return o=o|0,536870911}function tHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function rHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function nHe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function iX(o){o=o|0,oHe(o)}function iHe(o){o=o|0,sHe(o+24|0)}function sHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function oHe(o){o=o|0;var l=0;l=en()|0,tn(o,1,11,l,aHe()|0,1),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function aHe(){return 1852}function lHe(o,l){return o=o|0,l=l|0,uHe(n[(cHe(o)|0)>>2]|0,l)|0}function cHe(o){return o=o|0,(n[(eU()|0)+24>>2]|0)+(o<<3)|0}function uHe(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,ad(A,l),l=ld(A,l)|0,l=Tb(gd[o&31](l)|0)|0,I=u,l|0}function fHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=tU()|0,o=AHe(u)|0,vn(m,l,d,o,pHe(u,A)|0,A)}function tU(){var o=0,l=0;if(s[8056]|0||(oX(10932),gr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(_r(10932)|0)){o=10932,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));oX(10932)}return 10932}function AHe(o){return o=o|0,o|0}function pHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=tU()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(sX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(hHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function sX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function hHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=gHe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,dHe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,sX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,mHe(o,d),yHe(d),I=k;return}}function gHe(o){return o=o|0,536870911}function dHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function mHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function yHe(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function oX(o){o=o|0,CHe(o)}function EHe(o){o=o|0,IHe(o+24|0)}function IHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function CHe(o){o=o|0;var l=0;l=en()|0,tn(o,1,7,l,wHe()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function wHe(){return 1860}function BHe(o,l,u){return o=o|0,l=l|0,u=u|0,SHe(n[(vHe(o)|0)>>2]|0,l,u)|0}function vHe(o){return o=o|0,(n[(tU()|0)+24>>2]|0)+(o<<3)|0}function SHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0;return A=I,I=I+32|0,B=A+12|0,m=A+8|0,k=A,R=A+16|0,d=A+4|0,DHe(R,l),PHe(k,R,l),Mh(d,u),u=Uh(d,u)|0,n[B>>2]=n[k>>2],F2[o&15](m,B,u),u=bHe(m)|0,Df(m),_h(d),I=A,u|0}function DHe(o,l){o=o|0,l=l|0}function PHe(o,l,u){o=o|0,l=l|0,u=u|0,xHe(o,u)}function bHe(o){return o=o|0,Os(o)|0}function xHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0;d=I,I=I+16|0,u=d,A=l,A&1?(kHe(u,0),Me(A|0,u|0)|0,QHe(o,u),RHe(u)):n[o>>2]=n[l>>2],I=d}function kHe(o,l){o=o|0,l=l|0,Su(o,l),n[o+4>>2]=0,s[o+8>>0]=0}function QHe(o,l){o=o|0,l=l|0,n[o>>2]=n[l+4>>2]}function RHe(o){o=o|0,s[o+8>>0]=0}function THe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=rU()|0,o=FHe(u)|0,vn(m,l,d,o,NHe(u,A)|0,A)}function rU(){var o=0,l=0;if(s[8064]|0||(lX(10968),gr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(_r(10968)|0)){o=10968,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));lX(10968)}return 10968}function FHe(o){return o=o|0,o|0}function NHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=rU()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(aX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(OHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function aX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function OHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=LHe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,MHe(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,aX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,UHe(o,d),_He(d),I=k;return}}function LHe(o){return o=o|0,536870911}function MHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function UHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function _He(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function lX(o){o=o|0,GHe(o)}function HHe(o){o=o|0,jHe(o+24|0)}function jHe(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function GHe(o){o=o|0;var l=0;l=en()|0,tn(o,1,1,l,qHe()|0,5),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function qHe(){return 1872}function WHe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,VHe(n[(YHe(o)|0)>>2]|0,l,u,A,d,m)}function YHe(o){return o=o|0,(n[(rU()|0)+24>>2]|0)+(o<<3)|0}function VHe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,R=0,M=0,L=0,q=0;B=I,I=I+32|0,k=B+16|0,R=B+12|0,M=B+8|0,L=B+4|0,q=B,Mh(k,l),l=Uh(k,l)|0,Mh(R,u),u=Uh(R,u)|0,Mh(M,A),A=Uh(M,A)|0,Mh(L,d),d=Uh(L,d)|0,Mh(q,m),m=Uh(q,m)|0,kX[o&1](l,u,A,d,m),_h(q),_h(L),_h(M),_h(R),_h(k),I=B}function JHe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;m=n[o>>2]|0,d=nU()|0,o=KHe(u)|0,vn(m,l,d,o,zHe(u,A)|0,A)}function nU(){var o=0,l=0;if(s[8072]|0||(uX(11004),gr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(_r(11004)|0)){o=11004,l=o+36|0;do n[o>>2]=0,o=o+4|0;while((o|0)<(l|0));uX(11004)}return 11004}function KHe(o){return o=o|0,o|0}function zHe(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0,k=0,R=0;return k=I,I=I+16|0,d=k,m=k+4|0,n[d>>2]=o,R=nU()|0,B=R+24|0,l=yr(l,4)|0,n[m>>2]=l,u=R+28|0,A=n[u>>2]|0,A>>>0<(n[R+32>>2]|0)>>>0?(cX(A,o,l),l=(n[u>>2]|0)+8|0,n[u>>2]=l):(ZHe(B,d,m),l=n[u>>2]|0),I=k,(l-(n[B>>2]|0)>>3)+-1|0}function cX(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,n[o+4>>2]=u}function ZHe(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0;if(k=I,I=I+32|0,d=k,m=o+4|0,B=((n[m>>2]|0)-(n[o>>2]|0)>>3)+1|0,A=XHe(o)|0,A>>>0>>0)sn(o);else{R=n[o>>2]|0,L=(n[o+8>>2]|0)-R|0,M=L>>2,$He(d,L>>3>>>0>>1>>>0?M>>>0>>0?B:M:A,(n[m>>2]|0)-R>>3,o+8|0),B=d+8|0,cX(n[B>>2]|0,n[l>>2]|0,n[u>>2]|0),n[B>>2]=(n[B>>2]|0)+8,eje(o,d),tje(d),I=k;return}}function XHe(o){return o=o|0,536870911}function $He(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0;n[o+12>>2]=0,n[o+16>>2]=A;do if(l)if(l>>>0>536870911)Nt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[o>>2]=d,A=d+(u<<3)|0,n[o+8>>2]=A,n[o+4>>2]=A,n[o+12>>2]=d+(l<<3)}function eje(o,l){o=o|0,l=l|0;var u=0,A=0,d=0,m=0,B=0;A=n[o>>2]|0,B=o+4|0,m=l+4|0,d=(n[B>>2]|0)-A|0,u=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=u,(d|0)>0?(Qr(u|0,A|0,d|0)|0,A=m,u=n[m>>2]|0):A=m,m=n[o>>2]|0,n[o>>2]=u,n[A>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=o+8|0,B=l+12|0,o=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=o,n[l>>2]=n[A>>2]}function tje(o){o=o|0;var l=0,u=0,A=0;l=n[o+4>>2]|0,u=o+8|0,A=n[u>>2]|0,(A|0)!=(l|0)&&(n[u>>2]=A+(~((A+-8-l|0)>>>3)<<3)),o=n[o>>2]|0,o|0&&It(o)}function uX(o){o=o|0,ije(o)}function rje(o){o=o|0,nje(o+24|0)}function nje(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function ije(o){o=o|0;var l=0;l=en()|0,tn(o,1,12,l,sje()|0,2),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function sje(){return 1896}function oje(o,l,u){o=o|0,l=l|0,u=u|0,lje(n[(aje(o)|0)>>2]|0,l,u)}function aje(o){return o=o|0,(n[(nU()|0)+24>>2]|0)+(o<<3)|0}function lje(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;A=I,I=I+16|0,m=A+4|0,d=A,cje(m,l),l=uje(m,l)|0,Mh(d,u),u=Uh(d,u)|0,sp[o&31](l,u),_h(d),I=A}function cje(o,l){o=o|0,l=l|0}function uje(o,l){return o=o|0,l=l|0,fje(l)|0}function fje(o){return o=o|0,o|0}function Aje(){var o=0;return s[8080]|0||(fX(11040),gr(70,11040,U|0)|0,o=8080,n[o>>2]=1,n[o+4>>2]=0),_r(11040)|0||fX(11040),11040}function fX(o){o=o|0,gje(o),ud(o,71)}function pje(o){o=o|0,hje(o+24|0)}function hje(o){o=o|0;var l=0,u=0,A=0;u=n[o>>2]|0,A=u,u|0&&(o=o+4|0,l=n[o>>2]|0,(l|0)!=(u|0)&&(n[o>>2]=l+(~((l+-8-A|0)>>>3)<<3)),It(u))}function gje(o){o=o|0;var l=0;l=en()|0,tn(o,5,7,l,Eje()|0,0),n[o+24>>2]=0,n[o+28>>2]=0,n[o+32>>2]=0}function dje(o){o=o|0,mje(o)}function mje(o){o=o|0,yje(o)}function yje(o){o=o|0,s[o+8>>0]=1}function Eje(){return 1936}function Ije(){return Cje()|0}function Cje(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0;return l=I,I=I+16|0,d=l+4|0,B=l,u=Tl(8)|0,o=u,m=o+4|0,n[m>>2]=Kt(1)|0,A=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],wje(A,m,d),n[u>>2]=A,I=l,o|0}function wje(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]=l,u=Kt(16)|0,n[u+4>>2]=0,n[u+8>>2]=0,n[u>>2]=1916,n[u+12>>2]=l,n[o+4>>2]=u}function Bje(o){o=o|0,$y(o),It(o)}function vje(o){o=o|0,o=n[o+12>>2]|0,o|0&&It(o)}function Sje(o){o=o|0,It(o)}function Dje(){var o=0;return s[8088]|0||(Tje(11076),gr(25,11076,U|0)|0,o=8088,n[o>>2]=1,n[o+4>>2]=0),11076}function Pje(o,l){o=o|0,l=l|0,n[o>>2]=bje()|0,n[o+4>>2]=xje()|0,n[o+12>>2]=l,n[o+8>>2]=kje()|0,n[o+32>>2]=10}function bje(){return 11745}function xje(){return 1940}function kje(){return Fb()|0}function Qje(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,(Hh(A,896)|0)==512?u|0&&(Rje(u),It(u)):l|0&&It(l)}function Rje(o){o=o|0,o=n[o+4>>2]|0,o|0&&Gh(o)}function Tje(o){o=o|0,Lh(o)}function Pu(o,l){o=o|0,l=l|0,n[o>>2]=l}function iU(o){return o=o|0,n[o>>2]|0}function Fje(o){return o=o|0,s[n[o>>2]>>0]|0}function Nje(o,l){o=o|0,l=l|0;var u=0,A=0;u=I,I=I+16|0,A=u,n[A>>2]=n[o>>2],Oje(l,A)|0,I=u}function Oje(o,l){o=o|0,l=l|0;var u=0;return u=Lje(n[o>>2]|0,l)|0,l=o+4|0,n[(n[l>>2]|0)+8>>2]=u,n[(n[l>>2]|0)+8>>2]|0}function Lje(o,l){o=o|0,l=l|0;var u=0,A=0;return u=I,I=I+16|0,A=u,Fl(A),o=Os(o)|0,l=Mje(o,n[l>>2]|0)|0,Nl(A),I=u,l|0}function Fl(o){o=o|0,n[o>>2]=n[2701],n[o+4>>2]=n[2703]}function Mje(o,l){o=o|0,l=l|0;var u=0;return u=da(Uje()|0)|0,dn(0,u|0,o|0,ZM(l)|0)|0}function Nl(o){o=o|0,eX(n[o>>2]|0,n[o+4>>2]|0)}function Uje(){var o=0;return s[8096]|0||(_je(11120),o=8096,n[o>>2]=1,n[o+4>>2]=0),11120}function _je(o){o=o|0,Qo(o,Hje()|0,1)}function Hje(){return 1948}function jje(){Gje()}function Gje(){var o=0,l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;if(Le=I,I=I+16|0,L=Le+4|0,q=Le,oa(65536,10804,n[2702]|0,10812),u=NZ()|0,l=n[u>>2]|0,o=n[l>>2]|0,o|0)for(A=n[u+8>>2]|0,u=n[u+4>>2]|0;pf(o|0,c[u>>0]|0|0,s[A>>0]|0),l=l+4|0,o=n[l>>2]|0,o;)A=A+1|0,u=u+1|0;if(o=OZ()|0,l=n[o>>2]|0,l|0)do NA(l|0,n[o+4>>2]|0),o=o+8|0,l=n[o>>2]|0;while(l|0);NA(qje()|0,5167),M=Jy()|0,o=n[M>>2]|0;e:do if(o|0){do Wje(n[o+4>>2]|0),o=n[o>>2]|0;while(o|0);if(o=n[M>>2]|0,o|0){R=M;do{for(;d=o,o=n[o>>2]|0,d=n[d+4>>2]|0,!!(Yje(d)|0);)if(n[q>>2]=R,n[L>>2]=n[q>>2],Vje(M,L)|0,!o)break e;if(Jje(d),R=n[R>>2]|0,l=AX(d)|0,m=Oi()|0,B=I,I=I+((1*(l<<2)|0)+15&-16)|0,k=I,I=I+((1*(l<<2)|0)+15&-16)|0,l=n[(JZ(d)|0)>>2]|0,l|0)for(u=B,A=k;n[u>>2]=n[(Ky(n[l+4>>2]|0)|0)>>2],n[A>>2]=n[l+8>>2],l=n[l>>2]|0,l;)u=u+4|0,A=A+4|0;Qe=Ky(d)|0,l=Kje(d)|0,u=AX(d)|0,A=zje(d)|0,oc(Qe|0,l|0,B|0,k|0,u|0,A|0,WM(d)|0),FA(m|0)}while(o|0)}}while(!1);if(o=n[(YM()|0)>>2]|0,o|0)do Qe=o+4|0,M=VM(Qe)|0,d=k2(M)|0,m=b2(M)|0,B=(x2(M)|0)+1|0,k=Ub(M)|0,R=pX(Qe)|0,M=_r(M)|0,L=Ob(Qe)|0,q=sU(Qe)|0,uu(0,d|0,m|0,B|0,k|0,R|0,M|0,L|0,q|0,oU(Qe)|0),o=n[o>>2]|0;while(o|0);o=n[(Jy()|0)>>2]|0;e:do if(o|0){t:for(;;){if(l=n[o+4>>2]|0,l|0&&(ae=n[(Ky(l)|0)>>2]|0,Ye=n[(KZ(l)|0)>>2]|0,Ye|0)){u=Ye;do{l=u+4|0,A=VM(l)|0;r:do if(A|0)switch(_r(A)|0){case 0:break t;case 4:case 3:case 2:{k=k2(A)|0,R=b2(A)|0,M=(x2(A)|0)+1|0,L=Ub(A)|0,q=_r(A)|0,Qe=Ob(l)|0,uu(ae|0,k|0,R|0,M|0,L|0,0,q|0,Qe|0,sU(l)|0,oU(l)|0);break r}case 1:{B=k2(A)|0,k=b2(A)|0,R=(x2(A)|0)+1|0,M=Ub(A)|0,L=pX(l)|0,q=_r(A)|0,Qe=Ob(l)|0,uu(ae|0,B|0,k|0,R|0,M|0,L|0,q|0,Qe|0,sU(l)|0,oU(l)|0);break r}case 5:{M=k2(A)|0,L=b2(A)|0,q=(x2(A)|0)+1|0,Qe=Ub(A)|0,uu(ae|0,M|0,L|0,q|0,Qe|0,Zje(A)|0,_r(A)|0,0,0,0);break r}default:break r}while(!1);u=n[u>>2]|0}while(u|0)}if(o=n[o>>2]|0,!o)break e}Nt()}while(!1);ve(),I=Le}function qje(){return 11703}function Wje(o){o=o|0,s[o+40>>0]=0}function Yje(o){return o=o|0,(s[o+40>>0]|0)!=0|0}function Vje(o,l){return o=o|0,l=l|0,l=Xje(l)|0,o=n[l>>2]|0,n[l>>2]=n[o>>2],It(o),n[l>>2]|0}function Jje(o){o=o|0,s[o+40>>0]=1}function AX(o){return o=o|0,n[o+20>>2]|0}function Kje(o){return o=o|0,n[o+8>>2]|0}function zje(o){return o=o|0,n[o+32>>2]|0}function Ub(o){return o=o|0,n[o+4>>2]|0}function pX(o){return o=o|0,n[o+4>>2]|0}function sU(o){return o=o|0,n[o+8>>2]|0}function oU(o){return o=o|0,n[o+16>>2]|0}function Zje(o){return o=o|0,n[o+20>>2]|0}function Xje(o){return o=o|0,n[o>>2]|0}function _b(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0,ct=0,He=0,We=0,Lt=0;Lt=I,I=I+16|0,ae=Lt;do if(o>>>0<245){if(M=o>>>0<11?16:o+11&-8,o=M>>>3,q=n[2783]|0,u=q>>>o,u&3|0)return l=(u&1^1)+o|0,o=11172+(l<<1<<2)|0,u=o+8|0,A=n[u>>2]|0,d=A+8|0,m=n[d>>2]|0,(o|0)==(m|0)?n[2783]=q&~(1<>2]=o,n[u>>2]=m),We=l<<3,n[A+4>>2]=We|3,We=A+We+4|0,n[We>>2]=n[We>>2]|1,We=d,I=Lt,We|0;if(L=n[2785]|0,M>>>0>L>>>0){if(u|0)return l=2<>>12&16,l=l>>>B,u=l>>>5&8,l=l>>>u,d=l>>>2&4,l=l>>>d,o=l>>>1&2,l=l>>>o,A=l>>>1&1,A=(u|B|d|o|A)+(l>>>A)|0,l=11172+(A<<1<<2)|0,o=l+8|0,d=n[o>>2]|0,B=d+8|0,u=n[B>>2]|0,(l|0)==(u|0)?(o=q&~(1<>2]=l,n[o>>2]=u,o=q),m=(A<<3)-M|0,n[d+4>>2]=M|3,A=d+M|0,n[A+4>>2]=m|1,n[A+m>>2]=m,L|0&&(d=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=u),n[2785]=m,n[2788]=A,We=B,I=Lt,We|0;if(k=n[2784]|0,k){if(u=(k&0-k)+-1|0,B=u>>>12&16,u=u>>>B,m=u>>>5&8,u=u>>>m,R=u>>>2&4,u=u>>>R,A=u>>>1&2,u=u>>>A,o=u>>>1&1,o=n[11436+((m|B|R|A|o)+(u>>>o)<<2)>>2]|0,u=(n[o+4>>2]&-8)-M|0,A=n[o+16+(((n[o+16>>2]|0)==0&1)<<2)>>2]|0,!A)R=o,m=u;else{do B=(n[A+4>>2]&-8)-M|0,R=B>>>0>>0,u=R?B:u,o=R?A:o,A=n[A+16+(((n[A+16>>2]|0)==0&1)<<2)>>2]|0;while(A|0);R=o,m=u}if(B=R+M|0,R>>>0>>0){d=n[R+24>>2]|0,l=n[R+12>>2]|0;do if((l|0)==(R|0)){if(o=R+20|0,l=n[o>>2]|0,!l&&(o=R+16|0,l=n[o>>2]|0,!l)){u=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0,u=l}else u=n[R+8>>2]|0,n[u+12>>2]=l,n[l+8>>2]=u,u=l;while(!1);do if(d|0){if(l=n[R+28>>2]|0,o=11436+(l<<2)|0,(R|0)==(n[o>>2]|0)){if(n[o>>2]=u,!u){n[2784]=k&~(1<>2]|0)!=(R|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=d,l=n[R+16>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),l=n[R+20>>2]|0,l|0&&(n[u+20>>2]=l,n[l+24>>2]=u)}while(!1);return m>>>0<16?(We=m+M|0,n[R+4>>2]=We|3,We=R+We+4|0,n[We>>2]=n[We>>2]|1):(n[R+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,L|0&&(A=n[2788]|0,l=L>>>3,u=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=q|l,l=u,o=u+8|0),n[o>>2]=A,n[l+12>>2]=A,n[A+8>>2]=l,n[A+12>>2]=u),n[2785]=m,n[2788]=B),We=R+8|0,I=Lt,We|0}else q=M}else q=M}else q=M}else if(o>>>0<=4294967231)if(o=o+11|0,M=o&-8,R=n[2784]|0,R){A=0-M|0,o=o>>>8,o?M>>>0>16777215?k=31:(q=(o+1048320|0)>>>16&8,He=o<>>16&4,He=He<>>16&2,k=14-(L|q|k)+(He<>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,u=n[11436+(k<<2)>>2]|0;e:do if(!u)u=0,o=0,He=57;else for(o=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[u+4>>2]&-8)-M|0,d>>>0>>0)if(d)o=u,A=d;else{o=u,A=0,d=u,He=61;break e}if(d=n[u+20>>2]|0,u=n[u+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(u|0)?m:d,d=(u|0)==0,d){u=m,He=57;break}else B=B<<((d^1)&1)}while(!1);if((He|0)==57){if((u|0)==0&(o|0)==0){if(o=2<>>12&16,q=q>>>B,m=q>>>5&8,q=q>>>m,k=q>>>2&4,q=q>>>k,L=q>>>1&2,q=q>>>L,u=q>>>1&1,o=0,u=n[11436+((m|B|k|L|u)+(q>>>u)<<2)>>2]|0}u?(d=u,He=61):(k=o,B=A)}if((He|0)==61)for(;;)if(He=0,u=(n[d+4>>2]&-8)-M|0,q=u>>>0>>0,u=q?u:A,o=q?d:o,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)A=u,He=61;else{k=o,B=u;break}if(k|0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return We=0,I=Lt,We|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(o=k+20|0,l=n[o>>2]|0,!l&&(o=k+16|0,l=n[o>>2]|0,!l)){l=0;break}for(;;){if(u=l+20|0,A=n[u>>2]|0,A|0){l=A,o=u;continue}if(u=l+16|0,A=n[u>>2]|0,A)l=A,o=u;else break}n[o>>2]=0}else We=n[k+8>>2]|0,n[We+12>>2]=l,n[l+8>>2]=We;while(!1);do if(d){if(o=n[k+28>>2]|0,u=11436+(o<<2)|0,(k|0)==(n[u>>2]|0)){if(n[u>>2]=l,!l){A=R&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){A=R;break}n[l+24>>2]=d,o=n[k+16>>2]|0,o|0&&(n[l+16>>2]=o,n[o+24>>2]=l),o=n[k+20>>2]|0,o&&(n[l+20>>2]=o,n[o+24>>2]=l),A=R}else A=R;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=u;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,l=14-(ct|He|l)+(We<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,u=11436+(l<<2)|0,n[m+28>>2]=l,o=m+16|0,n[o+4>>2]=0,n[o>>2]=0,o=1<>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}for(o=B<<((l|0)==31?0:25-(l>>>1)|0),u=n[u>>2]|0;;){if((n[u+4>>2]&-8|0)==(B|0)){He=97;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=96;break}}if((He|0)==96){n[A>>2]=m,n[m+24>>2]=u,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((He|0)==97){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=m,n[He>>2]=m,n[m+8>>2]=We,n[m+12>>2]=u,n[m+24>>2]=0;break}}else We=B+M|0,n[k+4>>2]=We|3,We=k+We+4|0,n[We>>2]=n[We>>2]|1;while(!1);return We=k+8|0,I=Lt,We|0}else q=M}else q=M;else q=-1;while(!1);if(u=n[2785]|0,u>>>0>=q>>>0)return l=u-q|0,o=n[2788]|0,l>>>0>15?(We=o+q|0,n[2788]=We,n[2785]=l,n[We+4>>2]=l|1,n[We+l>>2]=l,n[o+4>>2]=q|3):(n[2785]=0,n[2788]=0,n[o+4>>2]=u|3,We=o+u+4|0,n[We>>2]=n[We>>2]|1),We=o+8|0,I=Lt,We|0;if(B=n[2786]|0,B>>>0>q>>>0)return ct=B-q|0,n[2786]=ct,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=ct|1,n[We+4>>2]=q|3,We=We+8|0,I=Lt,We|0;if(n[2901]|0?o=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,o=ae&-16^1431655768,n[ae>>2]=o,n[2901]=o,o=4096),k=q+48|0,R=q+47|0,m=o+R|0,d=0-o|0,M=m&d,M>>>0<=q>>>0||(o=n[2893]|0,o|0&&(L=n[2891]|0,ae=L+M|0,ae>>>0<=L>>>0|ae>>>0>o>>>0)))return We=0,I=Lt,We|0;e:do if(n[2894]&4)l=0,He=133;else{u=n[2789]|0;t:do if(u){for(A=11580;o=n[A>>2]|0,!(o>>>0<=u>>>0&&(Qe=A+4|0,(o+(n[Qe>>2]|0)|0)>>>0>u>>>0));)if(o=n[A+8>>2]|0,o)A=o;else{He=118;break t}if(l=m-B&d,l>>>0<2147483647)if(o=qh(l|0)|0,(o|0)==((n[A>>2]|0)+(n[Qe>>2]|0)|0)){if((o|0)!=-1){B=l,m=o,He=135;break e}}else A=o,He=126;else l=0}else He=118;while(!1);do if((He|0)==118)if(u=qh(0)|0,(u|0)!=-1&&(l=u,Ye=n[2902]|0,Le=Ye+-1|0,l=(Le&l|0?(Le+l&0-Ye)-l|0:0)+M|0,Ye=n[2891]|0,Le=l+Ye|0,l>>>0>q>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Le>>>0<=Ye>>>0|Le>>>0>Qe>>>0){l=0;break}if(o=qh(l|0)|0,(o|0)==(u|0)){B=l,m=u,He=135;break e}else A=o,He=126}else l=0;while(!1);do if((He|0)==126){if(u=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(A|0)!=-1)))if((A|0)==-1){l=0;break}else{B=l,m=A,He=135;break e}if(o=n[2903]|0,o=R-l+o&0-o,o>>>0>=2147483647){B=l,m=A,He=135;break e}if((qh(o|0)|0)==-1){qh(u|0)|0,l=0;break}else{B=o+l|0,m=A,He=135;break e}}while(!1);n[2894]=n[2894]|4,He=133}while(!1);if((He|0)==133&&M>>>0<2147483647&&(ct=qh(M|0)|0,Qe=qh(0)|0,tt=Qe-ct|0,Xe=tt>>>0>(q+40|0)>>>0,!((ct|0)==-1|Xe^1|ct>>>0>>0&((ct|0)!=-1&(Qe|0)!=-1)^1))&&(B=Xe?tt:l,m=ct,He=135),(He|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),R=n[2789]|0;do if(R){for(l=11580;;){if(o=n[l>>2]|0,u=l+4|0,A=n[u>>2]|0,(m|0)==(o+A|0)){He=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((He|0)==145&&!(n[l+12>>2]&8|0)&&R>>>0>>0&R>>>0>=o>>>0){n[u>>2]=A+B,We=R+8|0,We=We&7|0?0-We&7:0,He=R+We|0,We=(n[2786]|0)+(B-We)|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),u=m+B|0,l=11580;;){if((n[l>>2]|0)==(u|0)){He=153;break}if(o=n[l+8>>2]|0,o)l=o;else break}if((He|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,L=l+4|0,n[L>>2]=(n[L>>2]|0)+B,L=m+8|0,L=m+(L&7|0?0-L&7:0)|0,l=u+8|0,l=u+(l&7|0?0-l&7:0)|0,M=L+q|0,k=l-L-q|0,n[L+4>>2]=q|3;do if((l|0)!=(R|0)){if((l|0)==(n[2788]|0)){We=(n[2785]|0)+k|0,n[2785]=We,n[2788]=M,n[M+4>>2]=We|1,n[M+We>>2]=We;break}if(o=n[l+4>>2]|0,(o&3|0)==1){B=o&-8,A=o>>>3;e:do if(o>>>0<256)if(o=n[l+8>>2]|0,u=n[l+12>>2]|0,(u|0)==(o|0)){n[2783]=n[2783]&~(1<>2]=u,n[u+8>>2]=o;break}else{m=n[l+24>>2]|0,o=n[l+12>>2]|0;do if((o|0)==(l|0)){if(A=l+16|0,u=A+4|0,o=n[u>>2]|0,!o)if(o=n[A>>2]|0,o)u=A;else{o=0;break}for(;;){if(A=o+20|0,d=n[A>>2]|0,d|0){o=d,u=A;continue}if(A=o+16|0,d=n[A>>2]|0,d)o=d,u=A;else break}n[u>>2]=0}else We=n[l+8>>2]|0,n[We+12>>2]=o,n[o+8>>2]=We;while(!1);if(!m)break;u=n[l+28>>2]|0,A=11436+(u<<2)|0;do if((l|0)!=(n[A>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=o,!o)break e}else{if(n[A>>2]=o,o|0)break;n[2784]=n[2784]&~(1<>2]=m,u=l+16|0,A=n[u>>2]|0,A|0&&(n[o+16>>2]=A,n[A+24>>2]=o),u=n[u+4>>2]|0,!u)break;n[o+20>>2]=u,n[u+24>>2]=o}while(!1);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=u;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,l=14-(ct|He|l)+(We<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(!1);if(A=11436+(l<<2)|0,n[M+28>>2]=l,o=M+16|0,n[o+4>>2]=0,n[o>>2]=0,o=n[2784]|0,u=1<>2]=M,n[M+24>>2]=A,n[M+12>>2]=M,n[M+8>>2]=M;break}for(o=d<<((l|0)==31?0:25-(l>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(d|0)){He=194;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=193;break}}if((He|0)==193){n[A>>2]=M,n[M+24>>2]=u,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((He|0)==194){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=M,n[He>>2]=M,n[M+8>>2]=We,n[M+12>>2]=u,n[M+24>>2]=0;break}}else We=(n[2786]|0)+k|0,n[2786]=We,n[2789]=M,n[M+4>>2]=We|1;while(!1);return We=L+8|0,I=Lt,We|0}for(l=11580;o=n[l>>2]|0,!(o>>>0<=R>>>0&&(We=o+(n[l+4>>2]|0)|0,We>>>0>R>>>0));)l=n[l+8>>2]|0;d=We+-47|0,o=d+8|0,o=d+(o&7|0?0-o&7:0)|0,d=R+16|0,o=o>>>0>>0?R:o,l=o+8|0,u=m+8|0,u=u&7|0?0-u&7:0,He=m+u|0,u=B+-40-u|0,n[2789]=He,n[2786]=u,n[He+4>>2]=u|1,n[He+u+4>>2]=40,n[2790]=n[2905],u=o+4|0,n[u>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=o+24|0;do He=l,l=l+4|0,n[l>>2]=7;while((He+8|0)>>>0>>0);if((o|0)!=(R|0)){if(m=o-R|0,n[u>>2]=n[u>>2]&-2,n[R+4>>2]=m|1,n[o>>2]=m,l=m>>>3,m>>>0<256){u=11172+(l<<1<<2)|0,o=n[2783]|0,l=1<>2]|0):(n[2783]=o|l,l=u,o=u+8|0),n[o>>2]=R,n[l+12>>2]=R,n[R+8>>2]=l,n[R+12>>2]=u;break}if(l=m>>>8,l?m>>>0>16777215?u=31:(He=(l+1048320|0)>>>16&8,We=l<>>16&4,We=We<>>16&2,u=14-(ct|He|u)+(We<>>15)|0,u=m>>>(u+7|0)&1|u<<1):u=0,A=11436+(u<<2)|0,n[R+28>>2]=u,n[R+20>>2]=0,n[d>>2]=0,l=n[2784]|0,o=1<>2]=R,n[R+24>>2]=A,n[R+12>>2]=R,n[R+8>>2]=R;break}for(o=m<<((u|0)==31?0:25-(u>>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(m|0)){He=216;break}if(A=u+16+(o>>>31<<2)|0,l=n[A>>2]|0,l)o=o<<1,u=l;else{He=215;break}}if((He|0)==215){n[A>>2]=R,n[R+24>>2]=u,n[R+12>>2]=R,n[R+8>>2]=R;break}else if((He|0)==216){He=u+8|0,We=n[He>>2]|0,n[We+12>>2]=R,n[He>>2]=R,n[R+8>>2]=We,n[R+12>>2]=u,n[R+24>>2]=0;break}}}else{We=n[2787]|0,(We|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do We=11172+(l<<1<<2)|0,n[We+12>>2]=We,n[We+8>>2]=We,l=l+1|0;while((l|0)!=32);We=m+8|0,We=We&7|0?0-We&7:0,He=m+We|0,We=B+-40-We|0,n[2789]=He,n[2786]=We,n[He+4>>2]=We|1,n[He+We+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>q>>>0)return ct=l-q|0,n[2786]=ct,We=n[2789]|0,He=We+q|0,n[2789]=He,n[He+4>>2]=ct|1,n[We+4>>2]=q|3,We=We+8|0,I=Lt,We|0}return n[(Zy()|0)>>2]=12,We=0,I=Lt,We|0}function Hb(o){o=o|0;var l=0,u=0,A=0,d=0,m=0,B=0,k=0,R=0;if(o){u=o+-8|0,d=n[2787]|0,o=n[o+-4>>2]|0,l=o&-8,R=u+l|0;do if(o&1)k=u,B=u;else{if(A=n[u>>2]|0,!(o&3)||(B=u+(0-A)|0,m=A+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(o=R+4|0,l=n[o>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[o>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(u=A>>>3,A>>>0<256)if(o=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(o|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=o,k=B,l=m;break}d=n[B+24>>2]|0,o=n[B+12>>2]|0;do if((o|0)==(B|0)){if(u=B+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{o=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=o,n[o+8>>2]=k;while(!1);if(d){if(l=n[B+28>>2]|0,u=11436+(l<<2)|0,(B|0)==(n[u>>2]|0)){if(n[u>>2]=o,!o){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=o,!o){k=B,l=m;break}n[o+24>>2]=d,l=B+16|0,u=n[l>>2]|0,u|0&&(n[o+16>>2]=u,n[u+24>>2]=o),l=n[l+4>>2]|0,l?(n[o+20>>2]=l,n[l+24>>2]=o,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=R>>>0)&&(o=R+4|0,A=n[o>>2]|0,!!(A&1))){if(A&2)n[o>>2]=A&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(o=n[2788]|0,(R|0)==(n[2789]|0)){if(R=(n[2786]|0)+l|0,n[2786]=R,n[2789]=k,n[k+4>>2]=R|1,(k|0)!=(o|0))return;n[2788]=0,n[2785]=0;return}if((R|0)==(o|0)){R=(n[2785]|0)+l|0,n[2785]=R,n[2788]=B,n[k+4>>2]=R|1,n[B+R>>2]=R;return}d=(A&-8)+l|0,u=A>>>3;do if(A>>>0<256)if(l=n[R+8>>2]|0,o=n[R+12>>2]|0,(o|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=o,n[o+8>>2]=l;break}else{m=n[R+24>>2]|0,o=n[R+12>>2]|0;do if((o|0)==(R|0)){if(u=R+16|0,l=u+4|0,o=n[l>>2]|0,!o)if(o=n[u>>2]|0,o)l=u;else{u=0;break}for(;;){if(u=o+20|0,A=n[u>>2]|0,A|0){o=A,l=u;continue}if(u=o+16|0,A=n[u>>2]|0,A)o=A,l=u;else break}n[l>>2]=0,u=o}else u=n[R+8>>2]|0,n[u+12>>2]=o,n[o+8>>2]=u,u=o;while(!1);if(m|0){if(o=n[R+28>>2]|0,l=11436+(o<<2)|0,(R|0)==(n[l>>2]|0)){if(n[l>>2]=u,!u){n[2784]=n[2784]&~(1<>2]|0)!=(R|0)&1)<<2)>>2]=u,!u)break;n[u+24>>2]=m,o=R+16|0,l=n[o>>2]|0,l|0&&(n[u+16>>2]=l,n[l+24>>2]=u),o=n[o+4>>2]|0,o|0&&(n[u+20>>2]=o,n[o+24>>2]=u)}}while(!1);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(o=d>>>3,d>>>0<256){u=11172+(o<<1<<2)|0,l=n[2783]|0,o=1<>2]|0):(n[2783]=l|o,o=u,l=u+8|0),n[l>>2]=k,n[o+12>>2]=k,n[k+8>>2]=o,n[k+12>>2]=u;return}o=d>>>8,o?d>>>0>16777215?o=31:(B=(o+1048320|0)>>>16&8,R=o<>>16&4,R=R<>>16&2,o=14-(m|B|o)+(R<>>15)|0,o=d>>>(o+7|0)&1|o<<1):o=0,A=11436+(o<<2)|0,n[k+28>>2]=o,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,u=1<>>1)|0),u=n[A>>2]|0;;){if((n[u+4>>2]&-8|0)==(d|0)){o=73;break}if(A=u+16+(l>>>31<<2)|0,o=n[A>>2]|0,o)l=l<<1,u=o;else{o=72;break}}if((o|0)==72){n[A>>2]=k,n[k+24>>2]=u,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((o|0)==73){B=u+8|0,R=n[B>>2]|0,n[R+12>>2]=k,n[B>>2]=k,n[k+8>>2]=R,n[k+12>>2]=u,n[k+24>>2]=0;break}}else n[2784]=l|u,n[A>>2]=k,n[k+24>>2]=A,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(R=(n[2791]|0)+-1|0,n[2791]=R,!R)o=11588;else return;for(;o=n[o>>2]|0,o;)o=o+8|0;n[2791]=-1}}}function $je(){return 11628}function e6e(o){o=o|0;var l=0,u=0;return l=I,I=I+16|0,u=l,n[u>>2]=n6e(n[o+60>>2]|0)|0,o=jb(Au(6,u|0)|0)|0,I=l,o|0}function hX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0;q=I,I=I+48|0,M=q+16|0,m=q,d=q+32|0,k=o+28|0,A=n[k>>2]|0,n[d>>2]=A,R=o+20|0,A=(n[R>>2]|0)-A|0,n[d+4>>2]=A,n[d+8>>2]=l,n[d+12>>2]=u,A=A+u|0,B=o+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=jb(La(146,m|0)|0)|0;e:do if((A|0)!=(m|0)){for(l=2;!((m|0)<0);)if(A=A-m|0,Ye=n[d+4>>2]|0,ae=m>>>0>Ye>>>0,d=ae?d+8|0:d,l=(ae<<31>>31)+l|0,Ye=m-(ae?Ye:0)|0,n[d>>2]=(n[d>>2]|0)+Ye,ae=d+4|0,n[ae>>2]=(n[ae>>2]|0)-Ye,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=jb(La(146,M|0)|0)|0,(A|0)==(m|0)){L=3;break e}n[o+16>>2]=0,n[k>>2]=0,n[R>>2]=0,n[o>>2]=n[o>>2]|32,(l|0)==2?u=0:u=u-(n[d+4>>2]|0)|0}else L=3;while(!1);return(L|0)==3&&(Ye=n[o+44>>2]|0,n[o+16>>2]=Ye+(n[o+48>>2]|0),n[k>>2]=Ye,n[R>>2]=Ye),I=q,u|0}function t6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;return d=I,I=I+32|0,m=d,A=d+20|0,n[m>>2]=n[o+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=A,n[m+16>>2]=u,(jb(Oa(140,m|0)|0)|0)<0?(n[A>>2]=-1,o=-1):o=n[A>>2]|0,I=d,o|0}function jb(o){return o=o|0,o>>>0>4294963200&&(n[(Zy()|0)>>2]=0-o,o=-1),o|0}function Zy(){return(r6e()|0)+64|0}function r6e(){return aU()|0}function aU(){return 2084}function n6e(o){return o=o|0,o|0}function i6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;return d=I,I=I+32|0,A=d,n[o+36>>2]=1,!(n[o>>2]&64|0)&&(n[A>>2]=n[o+60>>2],n[A+4>>2]=21523,n[A+8>>2]=d+16,no(54,A|0)|0)&&(s[o+75>>0]=-1),A=hX(o,l,u)|0,I=d,A|0}function gX(o,l){o=o|0,l=l|0;var u=0,A=0;if(u=s[o>>0]|0,A=s[l>>0]|0,!(u<<24>>24)||u<<24>>24!=A<<24>>24)o=A;else{do o=o+1|0,l=l+1|0,u=s[o>>0]|0,A=s[l>>0]|0;while(!(!(u<<24>>24)||u<<24>>24!=A<<24>>24));o=A}return(u&255)-(o&255)|0}function s6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0;e:do if(!u)o=0;else{for(;A=s[o>>0]|0,d=s[l>>0]|0,A<<24>>24==d<<24>>24;)if(u=u+-1|0,u)o=o+1|0,l=l+1|0;else{o=0;break e}o=(A&255)-(d&255)|0}while(!1);return o|0}function dX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0;Qe=I,I=I+224|0,L=Qe+120|0,q=Qe+80|0,Ye=Qe,Le=Qe+136|0,A=q,d=A+40|0;do n[A>>2]=0,A=A+4|0;while((A|0)<(d|0));return n[L>>2]=n[u>>2],(lU(0,l,L,Ye,q)|0)<0?u=-1:((n[o+76>>2]|0)>-1?ae=o6e(o)|0:ae=0,u=n[o>>2]|0,M=u&32,(s[o+74>>0]|0)<1&&(n[o>>2]=u&-33),A=o+48|0,n[A>>2]|0?u=lU(o,l,L,Ye,q)|0:(d=o+44|0,m=n[d>>2]|0,n[d>>2]=Le,B=o+28|0,n[B>>2]=Le,k=o+20|0,n[k>>2]=Le,n[A>>2]=80,R=o+16|0,n[R>>2]=Le+80,u=lU(o,l,L,Ye,q)|0,m&&(Yb[n[o+36>>2]&7](o,0,0)|0,u=n[k>>2]|0?u:-1,n[d>>2]=m,n[A>>2]=0,n[R>>2]=0,n[B>>2]=0,n[k>>2]=0)),A=n[o>>2]|0,n[o>>2]=A|M,ae|0&&a6e(o),u=A&32|0?-1:u),I=Qe,u|0}function lU(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Rr=0,Hr=0,cr=0;cr=I,I=I+64|0,fr=cr+16|0,$t=cr,Lt=cr+24|0,Rr=cr+8|0,Hr=cr+20|0,n[fr>>2]=l,ct=(o|0)!=0,He=Lt+40|0,We=He,Lt=Lt+39|0,Gr=Rr+4|0,B=0,m=0,L=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(Zy()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=s[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}tt=k+1|0,n[fr>>2]=tt,B=s[tt>>0]|0,k=tt}t:do if((Xe|0)==9)for(;;){if(Xe=0,(s[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[fr>>2]=k,(s[k>>0]|0)==37)Xe=9;else break}while(!1);if(B=B-l|0,ct&&vs(o,l,B),B|0){l=k;continue}R=k+1|0,B=(s[R>>0]|0)+-48|0,B>>>0<10?(tt=(s[k+2>>0]|0)==36,Qe=tt?B:-1,L=tt?1:L,R=tt?k+3|0:R):Qe=-1,n[fr>>2]=R,B=s[R>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,q=B;;){if(B=1<>2]=R,B=s[R>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;q=B}else M=0;while(!1);if(B<<24>>24==42){if(k=R+1|0,B=(s[k>>0]|0)+-48|0,B>>>0<10&&(s[R+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[A+((s[k>>0]|0)+-48<<3)>>2]|0,L=1,R=R+3|0;else{if(L|0){m=-1;break}ct?(L=(n[u>>2]|0)+3&-4,B=n[L>>2]|0,n[u>>2]=L+4,L=0,R=k):(B=0,L=0,R=k)}n[fr>>2]=R,tt=(B|0)<0,B=tt?0-B|0:B,M=tt?M|8192:M}else{if(B=mX(fr)|0,(B|0)<0){m=-1;break}R=n[fr>>2]|0}do if((s[R>>0]|0)==46){if((s[R+1>>0]|0)!=42){n[fr>>2]=R+1,k=mX(fr)|0,R=n[fr>>2]|0;break}if(q=R+2|0,k=(s[q>>0]|0)+-48|0,k>>>0<10&&(s[R+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[A+((s[q>>0]|0)+-48<<3)>>2]|0,R=R+4|0,n[fr>>2]=R;break}if(L|0){m=-1;break e}ct?(tt=(n[u>>2]|0)+3&-4,k=n[tt>>2]|0,n[u>>2]=tt+4):k=0,n[fr>>2]=q,R=q}else k=-1;while(!1);for(Le=0;;){if(((s[R>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(tt=R+1|0,n[fr>>2]=tt,q=s[(s[R>>0]|0)+-65+(5178+(Le*58|0))>>0]|0,ae=q&255,(ae+-1|0)>>>0<8)Le=ae,R=tt;else break}if(!(q<<24>>24)){m=-1;break}Ye=(Qe|0)>-1;do if(q<<24>>24==19)if(Ye){m=-1;break e}else Xe=49;else{if(Ye){n[d+(Qe<<2)>>2]=ae,Ye=A+(Qe<<3)|0,Qe=n[Ye+4>>2]|0,Xe=$t,n[Xe>>2]=n[Ye>>2],n[Xe+4>>2]=Qe,Xe=49;break}if(!ct){m=0;break e}yX($t,ae,u)}while(!1);if((Xe|0)==49&&(Xe=0,!ct)){B=0,l=tt;continue}R=s[R>>0]|0,R=(Le|0)!=0&(R&15|0)==3?R&-33:R,Ye=M&-65537,Qe=M&8192|0?Ye:M;t:do switch(R|0){case 110:switch((Le&255)<<24>>24){case 0:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 1:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 2:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=tt;continue e}case 3:{a[n[$t>>2]>>1]=m,B=0,l=tt;continue e}case 4:{s[n[$t>>2]>>0]=m,B=0,l=tt;continue e}case 6:{n[n[$t>>2]>>2]=m,B=0,l=tt;continue e}case 7:{B=n[$t>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=tt;continue e}default:{B=0,l=tt;continue e}}case 112:{R=120,k=k>>>0>8?k:8,l=Qe|8,Xe=61;break}case 88:case 120:{l=Qe,Xe=61;break}case 111:{R=$t,l=n[R>>2]|0,R=n[R+4>>2]|0,ae=c6e(l,R,He)|0,Ye=We-ae|0,M=0,q=5642,k=(Qe&8|0)==0|(k|0)>(Ye|0)?k:Ye+1|0,Ye=Qe,Xe=67;break}case 105:case 100:if(R=$t,l=n[R>>2]|0,R=n[R+4>>2]|0,(R|0)<0){l=Gb(0,0,l|0,R|0)|0,R=ye,M=$t,n[M>>2]=l,n[M+4>>2]=R,M=1,q=5642,Xe=66;break t}else{M=(Qe&2049|0)!=0&1,q=Qe&2048|0?5643:Qe&1|0?5644:5642,Xe=66;break t}case 117:{R=$t,M=0,q=5642,l=n[R>>2]|0,R=n[R+4>>2]|0,Xe=66;break}case 99:{s[Lt>>0]=n[$t>>2],l=Lt,M=0,q=5642,ae=He,R=1,k=Ye;break}case 109:{R=u6e(n[(Zy()|0)>>2]|0)|0,Xe=71;break}case 115:{R=n[$t>>2]|0,R=R|0?R:5652,Xe=71;break}case 67:{n[Rr>>2]=n[$t>>2],n[Gr>>2]=0,n[$t>>2]=Rr,ae=-1,R=Rr,Xe=75;break}case 83:{l=n[$t>>2]|0,k?(ae=k,R=l,Xe=75):(Ls(o,32,B,0,Qe),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=A6e(o,+E[$t>>3],B,k,Qe,R)|0,l=tt;continue e}default:M=0,q=5642,ae=He,R=k,k=Qe}while(!1);t:do if((Xe|0)==61)Qe=$t,Le=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,ae=l6e(Le,Qe,He,R&32)|0,q=(l&8|0)==0|(Le|0)==0&(Qe|0)==0,M=q?0:2,q=q?5642:5642+(R>>4)|0,Ye=l,l=Le,R=Qe,Xe=67;else if((Xe|0)==66)ae=Xy(l,R,He)|0,Ye=Qe,Xe=67;else if((Xe|0)==71)Xe=0,Qe=f6e(R,0,k)|0,Le=(Qe|0)==0,l=R,M=0,q=5642,ae=Le?R+k|0:Qe,R=Le?k:Qe-R|0,k=Ye;else if((Xe|0)==75){for(Xe=0,q=R,l=0,k=0;M=n[q>>2]|0,!(!M||(k=EX(Hr,M)|0,(k|0)<0|k>>>0>(ae-l|0)>>>0));)if(l=k+l|0,ae>>>0>l>>>0)q=q+4|0;else break;if((k|0)<0){m=-1;break e}if(Ls(o,32,B,l,Qe),!l)l=0,Xe=84;else for(M=0;;){if(k=n[R>>2]|0,!k){Xe=84;break t}if(k=EX(Hr,k)|0,M=k+M|0,(M|0)>(l|0)){Xe=84;break t}if(vs(o,Hr,k),M>>>0>=l>>>0){Xe=84;break}else R=R+4|0}}while(!1);if((Xe|0)==67)Xe=0,R=(l|0)!=0|(R|0)!=0,Qe=(k|0)!=0|R,R=((R^1)&1)+(We-ae)|0,l=Qe?ae:He,ae=He,R=Qe?(k|0)>(R|0)?k:R:k,k=(k|0)>-1?Ye&-65537:Ye;else if((Xe|0)==84){Xe=0,Ls(o,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=tt;continue}Le=ae-l|0,Ye=(R|0)<(Le|0)?Le:R,Qe=Ye+M|0,B=(B|0)<(Qe|0)?Qe:B,Ls(o,32,B,Qe,k),vs(o,q,M),Ls(o,48,B,Qe,k^65536),Ls(o,48,Ye,Le,0),vs(o,l,Le),Ls(o,32,B,Qe,k^8192),l=tt}e:do if((Xe|0)==87&&!o)if(!L)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(yX(A+(m<<3)|0,l,u),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return I=cr,m|0}function o6e(o){return o=o|0,0}function a6e(o){o=o|0}function vs(o,l,u){o=o|0,l=l|0,u=u|0,n[o>>2]&32||C6e(l,u,o)|0}function mX(o){o=o|0;var l=0,u=0,A=0;if(u=n[o>>2]|0,A=(s[u>>0]|0)+-48|0,A>>>0<10){l=0;do l=A+(l*10|0)|0,u=u+1|0,n[o>>2]=u,A=(s[u>>0]|0)+-48|0;while(A>>>0<10)}else l=0;return l|0}function yX(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,n[o>>2]=l;break e}case 10:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{A=(n[u>>2]|0)+3&-4,l=n[A>>2]|0,n[u>>2]=A+4,A=o,n[A>>2]=l,n[A+4>>2]=0;break e}case 12:{A=(n[u>>2]|0)+7&-8,l=A,d=n[l>>2]|0,l=n[l+4>>2]|0,n[u>>2]=A+8,A=o,n[A>>2]=d,n[A+4>>2]=l;break e}case 13:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,A=(A&65535)<<16>>16,d=o,n[d>>2]=A,n[d+4>>2]=((A|0)<0)<<31>>31;break e}case 14:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,d=o,n[d>>2]=A&65535,n[d+4>>2]=0;break e}case 15:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,A=(A&255)<<24>>24,d=o,n[d>>2]=A,n[d+4>>2]=((A|0)<0)<<31>>31;break e}case 16:{d=(n[u>>2]|0)+3&-4,A=n[d>>2]|0,n[u>>2]=d+4,d=o,n[d>>2]=A&255,n[d+4>>2]=0;break e}case 17:{d=(n[u>>2]|0)+7&-8,m=+E[d>>3],n[u>>2]=d+8,E[o>>3]=m;break e}case 18:{d=(n[u>>2]|0)+7&-8,m=+E[d>>3],n[u>>2]=d+8,E[o>>3]=m;break e}default:break e}while(!1);while(!1)}function l6e(o,l,u,A){if(o=o|0,l=l|0,u=u|0,A=A|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=c[5694+(o&15)>>0]|0|A,o=qb(o|0,l|0,4)|0,l=ye;while(!((o|0)==0&(l|0)==0));return u|0}function c6e(o,l,u){if(o=o|0,l=l|0,u=u|0,!((o|0)==0&(l|0)==0))do u=u+-1|0,s[u>>0]=o&7|48,o=qb(o|0,l|0,3)|0,l=ye;while(!((o|0)==0&(l|0)==0));return u|0}function Xy(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if(l>>>0>0|(l|0)==0&o>>>0>4294967295){for(;A=AU(o|0,l|0,10,0)|0,u=u+-1|0,s[u>>0]=A&255|48,A=o,o=fU(o|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&A>>>0>4294967295;)l=ye;l=o}else l=o;if(l)for(;u=u+-1|0,s[u>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return u|0}function u6e(o){return o=o|0,m6e(o,n[(d6e()|0)+188>>2]|0)|0}function f6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;m=l&255,A=(u|0)!=0;e:do if(A&(o&3|0)!=0)for(d=l&255;;){if((s[o>>0]|0)==d<<24>>24){B=6;break e}if(o=o+1|0,u=u+-1|0,A=(u|0)!=0,!(A&(o&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(A?B=6:u=0);e:do if((B|0)==6&&(d=l&255,(s[o>>0]|0)!=d<<24>>24)){A=Ue(m,16843009)|0;t:do if(u>>>0>3){for(;m=n[o>>2]^A,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(o=o+4|0,u=u+-4|0,u>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!u){u=0;break}for(;;){if((s[o>>0]|0)==d<<24>>24)break e;if(o=o+1|0,u=u+-1|0,!u){u=0;break}}}while(!1);return(u|0?o:0)|0}function Ls(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0;if(B=I,I=I+256|0,m=B,(u|0)>(A|0)&(d&73728|0)==0){if(d=u-A|0,eE(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=u-A|0;do vs(o,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}vs(o,m,d)}I=B}function EX(o,l){return o=o|0,l=l|0,o?o=h6e(o,l,0)|0:o=0,o|0}function A6e(o,l,u,A,d,m){o=o|0,l=+l,u=u|0,A=A|0,d=d|0,m=m|0;var B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0,Qe=0,tt=0,Xe=0,ct=0,He=0,We=0,Lt=0,Gr=0,fr=0,$t=0,Rr=0,Hr=0,cr=0,Hn=0;Hn=I,I=I+560|0,R=Hn+8|0,tt=Hn,cr=Hn+524|0,Hr=cr,M=Hn+512|0,n[tt>>2]=0,Rr=M+12|0,IX(l)|0,(ye|0)<0?(l=-l,fr=1,Gr=5659):(fr=(d&2049|0)!=0&1,Gr=d&2048|0?5662:d&1|0?5665:5660),IX(l)|0,$t=ye&2146435072;do if($t>>>0<2146435072|($t|0)==2146435072&!1){if(Ye=+p6e(l,tt)*2,B=Ye!=0,B&&(n[tt>>2]=(n[tt>>2]|0)+-1),ct=m|32,(ct|0)==97){Le=m&32,ae=Le|0?Gr+9|0:Gr,q=fr|2,B=12-A|0;do if(A>>>0>11|(B|0)==0)l=Ye;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((s[ae>>0]|0)==45){l=-(l+(-Ye-l));break}else{l=Ye+l-l;break}}while(!1);k=n[tt>>2]|0,B=(k|0)<0?0-k|0:k,B=Xy(B,((B|0)<0)<<31>>31,Rr)|0,(B|0)==(Rr|0)&&(B=M+11|0,s[B>>0]=48),s[B+-1>>0]=(k>>31&2)+43,L=B+-2|0,s[L>>0]=m+15,M=(A|0)<1,R=(d&8|0)==0,B=cr;do $t=~~l,k=B+1|0,s[B>>0]=c[5694+$t>>0]|Le,l=(l-+($t|0))*16,(k-Hr|0)==1&&!(R&(M&l==0))?(s[k>>0]=46,B=B+2|0):B=k;while(l!=0);$t=B-Hr|0,Hr=Rr-L|0,Rr=(A|0)!=0&($t+-2|0)<(A|0)?A+2|0:$t,B=Hr+q+Rr|0,Ls(o,32,u,B,d),vs(o,ae,q),Ls(o,48,u,B,d^65536),vs(o,cr,$t),Ls(o,48,Rr-$t|0,0,0),vs(o,L,Hr),Ls(o,32,u,B,d^8192);break}k=(A|0)<0?6:A,B?(B=(n[tt>>2]|0)+-28|0,n[tt>>2]=B,l=Ye*268435456):(l=Ye,B=n[tt>>2]|0),$t=(B|0)<0?R:R+288|0,R=$t;do We=~~l>>>0,n[R>>2]=We,R=R+4|0,l=(l-+(We>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=$t,q=R;;){if(L=(B|0)<29?B:29,B=q+-4|0,B>>>0>=M>>>0){R=0;do He=DX(n[B>>2]|0,0,L|0)|0,He=uU(He|0,ye|0,R|0,0)|0,We=ye,Xe=AU(He|0,We|0,1e9,0)|0,n[B>>2]=Xe,R=fU(He|0,We|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);R&&(M=M+-4|0,n[M>>2]=R)}for(R=q;!(R>>>0<=M>>>0);)if(B=R+-4|0,!(n[B>>2]|0))R=B;else break;if(B=(n[tt>>2]|0)-L|0,n[tt>>2]=B,(B|0)>0)q=R;else break}else M=$t;if((B|0)<0){A=((k+25|0)/9|0)+1|0,Qe=(ct|0)==102;do{if(Le=0-B|0,Le=(Le|0)<9?Le:9,M>>>0>>0){L=(1<>>Le,ae=0,B=M;do We=n[B>>2]|0,n[B>>2]=(We>>>Le)+ae,ae=Ue(We&L,q)|0,B=B+4|0;while(B>>>0>>0);B=n[M>>2]|0?M:M+4|0,ae?(n[R>>2]=ae,M=B,B=R+4|0):(M=B,B=R)}else M=n[M>>2]|0?M:M+4|0,B=R;R=Qe?$t:M,R=(B-R>>2|0)>(A|0)?R+(A<<2)|0:B,B=(n[tt>>2]|0)+Le|0,n[tt>>2]=B}while((B|0)<0);B=M,A=R}else B=M,A=R;if(We=$t,B>>>0>>0){if(R=(We-B>>2)*9|0,L=n[B>>2]|0,L>>>0>=10){M=10;do M=M*10|0,R=R+1|0;while(L>>>0>=M>>>0)}}else R=0;if(Qe=(ct|0)==103,Xe=(k|0)!=0,M=k-((ct|0)!=102?R:0)+((Xe&Qe)<<31>>31)|0,(M|0)<(((A-We>>2)*9|0)+-9|0)){if(M=M+9216|0,Le=$t+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){L=10;do L=L*10|0,M=M+1|0;while((M|0)!=9)}else L=10;if(q=n[Le>>2]|0,ae=(q>>>0)%(L>>>0)|0,M=(Le+4|0)==(A|0),M&(ae|0)==0)M=Le;else if(Ye=((q>>>0)/(L>>>0)|0)&1|0?9007199254740994:9007199254740992,He=(L|0)/2|0,l=ae>>>0>>0?.5:M&(ae|0)==(He|0)?1:1.5,fr&&(He=(s[Gr>>0]|0)==45,l=He?-l:l,Ye=He?-Ye:Ye),M=q-ae|0,n[Le>>2]=M,Ye+l!=Ye){if(He=M+L|0,n[Le>>2]=He,He>>>0>999999999)for(R=Le;M=R+-4|0,n[R>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),He=(n[M>>2]|0)+1|0,n[M>>2]=He,He>>>0>999999999;)R=M;else M=Le;if(R=(We-B>>2)*9|0,q=n[B>>2]|0,q>>>0>=10){L=10;do L=L*10|0,R=R+1|0;while(q>>>0>=L>>>0)}}else M=Le;M=M+4|0,M=A>>>0>M>>>0?M:A,He=B}else M=A,He=B;for(ct=M;;){if(ct>>>0<=He>>>0){tt=0;break}if(B=ct+-4|0,!(n[B>>2]|0))ct=B;else{tt=1;break}}A=0-R|0;do if(Qe)if(B=((Xe^1)&1)+k|0,(B|0)>(R|0)&(R|0)>-5?(L=m+-1|0,k=B+-1-R|0):(L=m+-2|0,k=B+-1|0),B=d&8,B)Le=B;else{if(tt&&(Lt=n[ct+-4>>2]|0,(Lt|0)!=0))if((Lt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Lt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((ct-We>>2)*9|0)+-9|0,(L|32|0)==102){Le=B-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}else{Le=B+R-M|0,Le=(Le|0)>0?Le:0,k=(k|0)<(Le|0)?k:Le,Le=0;break}}else L=m,Le=d&8;while(!1);if(Qe=k|Le,q=(Qe|0)!=0&1,ae=(L|32|0)==102,ae)Xe=0,B=(R|0)>0?R:0;else{if(B=(R|0)<0?A:R,B=Xy(B,((B|0)<0)<<31>>31,Rr)|0,M=Rr,(M-B|0)<2)do B=B+-1|0,s[B>>0]=48;while((M-B|0)<2);s[B+-1>>0]=(R>>31&2)+43,B=B+-2|0,s[B>>0]=L,Xe=B,B=M-B|0}if(B=fr+1+k+q+B|0,Ls(o,32,u,B,d),vs(o,Gr,fr),Ls(o,48,u,B,d^65536),ae){L=He>>>0>$t>>>0?$t:He,Le=cr+9|0,q=Le,ae=cr+8|0,M=L;do{if(R=Xy(n[M>>2]|0,0,Le)|0,(M|0)==(L|0))(R|0)==(Le|0)&&(s[ae>>0]=48,R=ae);else if(R>>>0>cr>>>0){eE(cr|0,48,R-Hr|0)|0;do R=R+-1|0;while(R>>>0>cr>>>0)}vs(o,R,q-R|0),M=M+4|0}while(M>>>0<=$t>>>0);if(Qe|0&&vs(o,5710,1),M>>>0>>0&(k|0)>0)for(;;){if(R=Xy(n[M>>2]|0,0,Le)|0,R>>>0>cr>>>0){eE(cr|0,48,R-Hr|0)|0;do R=R+-1|0;while(R>>>0>cr>>>0)}if(vs(o,R,(k|0)<9?k:9),M=M+4|0,R=k+-9|0,M>>>0>>0&(k|0)>9)k=R;else{k=R;break}}Ls(o,48,k+9|0,9,0)}else{if(Qe=tt?ct:He+4|0,(k|0)>-1){tt=cr+9|0,Le=(Le|0)==0,A=tt,q=0-Hr|0,ae=cr+8|0,L=He;do{R=Xy(n[L>>2]|0,0,tt)|0,(R|0)==(tt|0)&&(s[ae>>0]=48,R=ae);do if((L|0)==(He|0)){if(M=R+1|0,vs(o,R,1),Le&(k|0)<1){R=M;break}vs(o,5710,1),R=M}else{if(R>>>0<=cr>>>0)break;eE(cr|0,48,R+q|0)|0;do R=R+-1|0;while(R>>>0>cr>>>0)}while(!1);Hr=A-R|0,vs(o,R,(k|0)>(Hr|0)?Hr:k),k=k-Hr|0,L=L+4|0}while(L>>>0>>0&(k|0)>-1)}Ls(o,48,k+18|0,18,0),vs(o,Xe,Rr-Xe|0)}Ls(o,32,u,B,d^8192)}else cr=(m&32|0)!=0,B=fr+3|0,Ls(o,32,u,B,d&-65537),vs(o,Gr,fr),vs(o,l!=l|!1?cr?5686:5690:cr?5678:5682,3),Ls(o,32,u,B,d^8192);while(!1);return I=Hn,((B|0)<(u|0)?u:B)|0}function IX(o){o=+o;var l=0;return E[S>>3]=o,l=n[S>>2]|0,ye=n[S+4>>2]|0,l|0}function p6e(o,l){return o=+o,l=l|0,+ +CX(o,l)}function CX(o,l){o=+o,l=l|0;var u=0,A=0,d=0;switch(E[S>>3]=o,u=n[S>>2]|0,A=n[S+4>>2]|0,d=qb(u|0,A|0,52)|0,d&2047){case 0:{o!=0?(o=+CX(o*18446744073709552e3,l),u=(n[l>>2]|0)+-64|0):u=0,n[l>>2]=u;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[S>>2]=u,n[S+4>>2]=A&-2146435073|1071644672,o=+E[S>>3]}return+o}function h6e(o,l,u){o=o|0,l=l|0,u=u|0;do if(o){if(l>>>0<128){s[o>>0]=l,o=1;break}if(!(n[n[(g6e()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){s[o>>0]=l,o=1;break}else{n[(Zy()|0)>>2]=84,o=-1;break}if(l>>>0<2048){s[o>>0]=l>>>6|192,s[o+1>>0]=l&63|128,o=2;break}if(l>>>0<55296|(l&-8192|0)==57344){s[o>>0]=l>>>12|224,s[o+1>>0]=l>>>6&63|128,s[o+2>>0]=l&63|128,o=3;break}if((l+-65536|0)>>>0<1048576){s[o>>0]=l>>>18|240,s[o+1>>0]=l>>>12&63|128,s[o+2>>0]=l>>>6&63|128,s[o+3>>0]=l&63|128,o=4;break}else{n[(Zy()|0)>>2]=84,o=-1;break}}else o=1;while(!1);return o|0}function g6e(){return aU()|0}function d6e(){return aU()|0}function m6e(o,l){o=o|0,l=l|0;var u=0,A=0;for(A=0;;){if((c[5712+A>>0]|0)==(o|0)){o=2;break}if(u=A+1|0,(u|0)==87){u=5800,A=87,o=5;break}else A=u}if((o|0)==2&&(A?(u=5800,o=5):u=5800),(o|0)==5)for(;;){do o=u,u=u+1|0;while(s[o>>0]|0);if(A=A+-1|0,A)o=5;else break}return y6e(u,n[l+20>>2]|0)|0}function y6e(o,l){return o=o|0,l=l|0,E6e(o,l)|0}function E6e(o,l){return o=o|0,l=l|0,l?l=I6e(n[l>>2]|0,n[l+4>>2]|0,o)|0:l=0,(l|0?l:o)|0}function I6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0;ae=(n[o>>2]|0)+1794895138|0,m=Ad(n[o+8>>2]|0,ae)|0,A=Ad(n[o+12>>2]|0,ae)|0,d=Ad(n[o+16>>2]|0,ae)|0;e:do if(m>>>0>>2>>>0&&(q=l-(m<<2)|0,A>>>0>>0&d>>>0>>0)&&!((d|A)&3|0)){for(q=A>>>2,L=d>>>2,M=0;;){if(k=m>>>1,R=M+k|0,B=R<<1,d=B+q|0,A=Ad(n[o+(d<<2)>>2]|0,ae)|0,d=Ad(n[o+(d+1<<2)>>2]|0,ae)|0,!(d>>>0>>0&A>>>0<(l-d|0)>>>0)){A=0;break e}if(s[o+(d+A)>>0]|0){A=0;break e}if(A=gX(u,o+d|0)|0,!A)break;if(A=(A|0)<0,(m|0)==1){A=0;break e}else M=A?M:R,m=A?k:m-k|0}A=B+L|0,d=Ad(n[o+(A<<2)>>2]|0,ae)|0,A=Ad(n[o+(A+1<<2)>>2]|0,ae)|0,A>>>0>>0&d>>>0<(l-A|0)>>>0?A=s[o+(A+d)>>0]|0?0:o+A|0:A=0}else A=0;while(!1);return A|0}function Ad(o,l){o=o|0,l=l|0;var u=0;return u=xX(o|0)|0,(l|0?u:o)|0}function C6e(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0,k=0;A=u+16|0,d=n[A>>2]|0,d?m=5:w6e(u)|0?A=0:(d=n[A>>2]|0,m=5);e:do if((m|0)==5){if(k=u+20|0,B=n[k>>2]|0,A=B,(d-B|0)>>>0>>0){A=Yb[n[u+36>>2]&7](u,o,l)|0;break}t:do if((s[u+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=o;break t}if(d=B+-1|0,(s[o+d>>0]|0)==10)break;B=d}if(A=Yb[n[u+36>>2]&7](u,o,B)|0,A>>>0>>0)break e;m=B,d=o+B|0,l=l-B|0,A=n[k>>2]|0}else m=0,d=o;while(!1);Qr(A|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,A=m+l|0}while(!1);return A|0}function w6e(o){o=o|0;var l=0,u=0;return l=o+74|0,u=s[l>>0]|0,s[l>>0]=u+255|u,l=n[o>>2]|0,l&8?(n[o>>2]=l|32,o=-1):(n[o+8>>2]=0,n[o+4>>2]=0,u=n[o+44>>2]|0,n[o+28>>2]=u,n[o+20>>2]=u,n[o+16>>2]=u+(n[o+48>>2]|0),o=0),o|0}function $n(o,l){o=y(o),l=y(l);var u=0,A=0;u=wX(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=wX(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?l:o;break}else{o=o>2]=o,n[S>>2]|0|0}function pd(o,l){o=y(o),l=y(l);var u=0,A=0;u=BX(o)|0;do if((u&2147483647)>>>0<=2139095040){if(A=BX(l)|0,(A&2147483647)>>>0<=2139095040)if((A^u|0)<0){o=(u|0)<0?o:l;break}else{o=o>2]=o,n[S>>2]|0|0}function cU(o,l){o=y(o),l=y(l);var u=0,A=0,d=0,m=0,B=0,k=0,R=0,M=0;m=(h[S>>2]=o,n[S>>2]|0),k=(h[S>>2]=l,n[S>>2]|0),u=m>>>23&255,B=k>>>23&255,R=m&-2147483648,d=k<<1;e:do if(d|0&&!((u|0)==255|((B6e(l)|0)&2147483647)>>>0>2139095040)){if(A=m<<1,A>>>0<=d>>>0)return l=y(o*y(0)),y((A|0)==(d|0)?l:o);if(u)A=m&8388607|8388608;else{if(u=m<<9,(u|0)>-1){A=u,u=0;do u=u+-1|0,A=A<<1;while((A|0)>-1)}else u=0;A=m<<1-u}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=A-k|0,m=(d|0)>-1;t:do if((u|0)>(B|0)){for(;;){if(m)if(d)A=d;else break;if(A=A<<1,u=u+-1|0,d=A-k|0,m=(d|0)>-1,(u|0)<=(B|0))break t}l=y(o*y(0));break e}while(!1);if(m)if(d)A=d;else{l=y(o*y(0));break}if(A>>>0<8388608)do A=A<<1,u=u+-1|0;while(A>>>0<8388608);(u|0)>0?u=A+-8388608|u<<23:u=A>>>(1-u|0),l=(n[S>>2]=u|R,y(h[S>>2]))}else M=3;while(!1);return(M|0)==3&&(l=y(o*l),l=y(l/l)),y(l)}function B6e(o){return o=y(o),h[S>>2]=o,n[S>>2]|0|0}function v6e(o,l){return o=o|0,l=l|0,dX(n[582]|0,o,l)|0}function sn(o){o=o|0,Nt()}function $y(o){o=o|0}function S6e(o,l){return o=o|0,l=l|0,0}function D6e(o){return o=o|0,(vX(o+4|0)|0)==-1?(ip[n[(n[o>>2]|0)+8>>2]&127](o),o=1):o=0,o|0}function vX(o){o=o|0;var l=0;return l=n[o>>2]|0,n[o>>2]=l+-1,l+-1|0}function Gh(o){o=o|0,D6e(o)|0&&P6e(o)}function P6e(o){o=o|0;var l=0;l=o+8|0,n[l>>2]|0&&(vX(l)|0)!=-1||ip[n[(n[o>>2]|0)+16>>2]&127](o)}function Kt(o){o=o|0;var l=0;for(l=o|0?o:1;o=_b(l)|0,!(o|0);){if(o=x6e()|0,!o){o=0;break}UX[o&0]()}return o|0}function SX(o){return o=o|0,Kt(o)|0}function It(o){o=o|0,Hb(o)}function b6e(o){o=o|0,(s[o+11>>0]|0)<0&&It(n[o>>2]|0)}function x6e(){var o=0;return o=n[2923]|0,n[2923]=o+0,o|0}function k6e(){}function Gb(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,A=l-A-(u>>>0>o>>>0|0)>>>0,ye=A,o-u>>>0|0|0}function uU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,u=o+u>>>0,ye=l+A+(u>>>0>>0|0)>>>0,u|0|0}function eE(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0,B=0;if(m=o+u|0,l=l&255,(u|0)>=67){for(;o&3;)s[o>>0]=l,o=o+1|0;for(A=m&-4|0,d=A-64|0,B=l|l<<8|l<<16|l<<24;(o|0)<=(d|0);)n[o>>2]=B,n[o+4>>2]=B,n[o+8>>2]=B,n[o+12>>2]=B,n[o+16>>2]=B,n[o+20>>2]=B,n[o+24>>2]=B,n[o+28>>2]=B,n[o+32>>2]=B,n[o+36>>2]=B,n[o+40>>2]=B,n[o+44>>2]=B,n[o+48>>2]=B,n[o+52>>2]=B,n[o+56>>2]=B,n[o+60>>2]=B,o=o+64|0;for(;(o|0)<(A|0);)n[o>>2]=B,o=o+4|0}for(;(o|0)<(m|0);)s[o>>0]=l,o=o+1|0;return m-u|0}function DX(o,l,u){return o=o|0,l=l|0,u=u|0,(u|0)<32?(ye=l<>>32-u,o<>>u,o>>>u|(l&(1<>>u-32|0)}function Qr(o,l,u){o=o|0,l=l|0,u=u|0;var A=0,d=0,m=0;if((u|0)>=8192)return OA(o|0,l|0,u|0)|0;if(m=o|0,d=o+u|0,(o&3)==(l&3)){for(;o&3;){if(!u)return m|0;s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0,u=u-1|0}for(u=d&-4|0,A=u-64|0;(o|0)<=(A|0);)n[o>>2]=n[l>>2],n[o+4>>2]=n[l+4>>2],n[o+8>>2]=n[l+8>>2],n[o+12>>2]=n[l+12>>2],n[o+16>>2]=n[l+16>>2],n[o+20>>2]=n[l+20>>2],n[o+24>>2]=n[l+24>>2],n[o+28>>2]=n[l+28>>2],n[o+32>>2]=n[l+32>>2],n[o+36>>2]=n[l+36>>2],n[o+40>>2]=n[l+40>>2],n[o+44>>2]=n[l+44>>2],n[o+48>>2]=n[l+48>>2],n[o+52>>2]=n[l+52>>2],n[o+56>>2]=n[l+56>>2],n[o+60>>2]=n[l+60>>2],o=o+64|0,l=l+64|0;for(;(o|0)<(u|0);)n[o>>2]=n[l>>2],o=o+4|0,l=l+4|0}else for(u=d-4|0;(o|0)<(u|0);)s[o>>0]=s[l>>0]|0,s[o+1>>0]=s[l+1>>0]|0,s[o+2>>0]=s[l+2>>0]|0,s[o+3>>0]=s[l+3>>0]|0,o=o+4|0,l=l+4|0;for(;(o|0)<(d|0);)s[o>>0]=s[l>>0]|0,o=o+1|0,l=l+1|0;return m|0}function PX(o){o=o|0;var l=0;return l=s[N+(o&255)>>0]|0,(l|0)<8?l|0:(l=s[N+(o>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=s[N+(o>>16&255)>>0]|0,(l|0)<8?l+16|0:(s[N+(o>>>24)>>0]|0)+24|0))}function bX(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0;var m=0,B=0,k=0,R=0,M=0,L=0,q=0,ae=0,Ye=0,Le=0;if(L=o,R=l,M=R,B=u,ae=A,k=ae,!M)return m=(d|0)!=0,k?m?(n[d>>2]=o|0,n[d+4>>2]=l&0,ae=0,d=0,ye=ae,d|0):(ae=0,d=0,ye=ae,d|0):(m&&(n[d>>2]=(L>>>0)%(B>>>0),n[d+4>>2]=0),ae=0,d=(L>>>0)/(B>>>0)>>>0,ye=ae,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=31){q=m+1|0,k=31-m|0,l=m-31>>31,B=q,o=L>>>(q>>>0)&l|M<>>(q>>>0)&l,m=0,k=L<>2]=o|0,n[d+4>>2]=R|l&0,ae=0,d=0,ye=ae,d|0):(ae=0,d=0,ye=ae,d|0)}if(m=B-1|0,m&B|0){k=(P(B|0)|0)+33-(P(M|0)|0)|0,Le=64-k|0,q=32-k|0,R=q>>31,Ye=k-32|0,l=Ye>>31,B=k,o=q-1>>31&M>>>(Ye>>>0)|(M<>>(k>>>0))&l,l=l&M>>>(k>>>0),m=L<>>(Ye>>>0))&R|L<>31;break}return d|0&&(n[d>>2]=m&L,n[d+4>>2]=0),(B|0)==1?(Ye=R|l&0,Le=o|0|0,ye=Ye,Le|0):(Le=PX(B|0)|0,Ye=M>>>(Le>>>0)|0,Le=M<<32-Le|L>>>(Le>>>0)|0,ye=Ye,Le|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),Ye=0,Le=(M>>>0)/(B>>>0)>>>0,ye=Ye,Le|0;if(!L)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(k>>>0)),Ye=0,Le=(M>>>0)/(k>>>0)>>>0,ye=Ye,Le|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=o|0,n[d+4>>2]=m&M|l&0),Ye=0,Le=M>>>((PX(k|0)|0)>>>0),ye=Ye,Le|0;if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,o=M<>>(l>>>0),l=M>>>(l>>>0),m=0,k=L<>2]=o|0,n[d+4>>2]=R|l&0,Ye=0,Le=0,ye=Ye,Le|0):(Ye=0,Le=0,ye=Ye,Le|0)}while(!1);if(!B)M=k,R=0,k=0;else{q=u|0|0,L=ae|A&0,M=uU(q|0,L|0,-1,-1)|0,u=ye,R=k,k=0;do A=R,R=m>>>31|R<<1,m=k|m<<1,A=o<<1|A>>>31|0,ae=o>>>31|l<<1|0,Gb(M|0,u|0,A|0,ae|0)|0,Le=ye,Ye=Le>>31|((Le|0)<0?-1:0)<<1,k=Ye&1,o=Gb(A|0,ae|0,Ye&q|0,(((Le|0)<0?-1:0)>>31|((Le|0)<0?-1:0)<<1)&L|0)|0,l=ye,B=B-1|0;while(B|0);M=R,R=0}return B=0,d|0&&(n[d>>2]=o,n[d+4>>2]=l),Ye=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|R,Le=(m<<1|0)&-2|k,ye=Ye,Le|0}function fU(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,bX(o,l,u,A,0)|0}function qh(o){o=o|0;var l=0,u=0;return u=o+15&-16|0,l=n[C>>2]|0,o=l+u|0,(u|0)>0&(o|0)<(l|0)|(o|0)<0?(oe()|0,fu(12),-1):(n[C>>2]=o,(o|0)>($()|0)&&!(Z()|0)?(n[C>>2]=l,fu(12),-1):l|0)}function Q2(o,l,u){o=o|0,l=l|0,u=u|0;var A=0;if((l|0)<(o|0)&(o|0)<(l+u|0)){for(A=o,l=l+u|0,o=o+u|0;(u|0)>0;)o=o-1|0,l=l-1|0,u=u-1|0,s[o>>0]=s[l>>0]|0;o=A}else Qr(o,l,u)|0;return o|0}function AU(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0;var d=0,m=0;return m=I,I=I+16|0,d=m|0,bX(o,l,u,A,d)|0,I=m,ye=n[d+4>>2]|0,n[d>>2]|0|0}function xX(o){return o=o|0,(o&255)<<24|(o>>8&255)<<16|(o>>16&255)<<8|o>>>24|0}function Q6e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,kX[o&1](l|0,u|0,A|0,d|0,m|0)}function R6e(o,l,u){o=o|0,l=l|0,u=y(u),QX[o&1](l|0,y(u))}function T6e(o,l,u){o=o|0,l=l|0,u=+u,RX[o&31](l|0,+u)}function F6e(o,l,u,A){return o=o|0,l=l|0,u=y(u),A=y(A),y(TX[o&0](l|0,y(u),y(A)))}function N6e(o,l){o=o|0,l=l|0,ip[o&127](l|0)}function O6e(o,l,u){o=o|0,l=l|0,u=u|0,sp[o&31](l|0,u|0)}function L6e(o,l){return o=o|0,l=l|0,gd[o&31](l|0)|0}function M6e(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0,FX[o&1](l|0,+u,+A,d|0)}function U6e(o,l,u,A){o=o|0,l=l|0,u=+u,A=+A,EGe[o&1](l|0,+u,+A)}function _6e(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,Yb[o&7](l|0,u|0,A|0)|0}function H6e(o,l,u,A){return o=o|0,l=l|0,u=u|0,A=A|0,+IGe[o&1](l|0,u|0,A|0)}function j6e(o,l){return o=o|0,l=l|0,+NX[o&15](l|0)}function G6e(o,l,u){return o=o|0,l=l|0,u=+u,CGe[o&1](l|0,+u)|0}function q6e(o,l,u){return o=o|0,l=l|0,u=u|0,hU[o&15](l|0,u|0)|0}function W6e(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=+A,d=+d,m=m|0,wGe[o&1](l|0,u|0,+A,+d,m|0)}function Y6e(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,B=B|0,BGe[o&1](l|0,u|0,A|0,d|0,m|0,B|0)}function V6e(o,l,u){return o=o|0,l=l|0,u=u|0,+OX[o&7](l|0,u|0)}function J6e(o){return o=o|0,Vb[o&7]()|0}function K6e(o,l,u,A,d,m){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,LX[o&1](l|0,u|0,A|0,d|0,m|0)|0}function z6e(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=+d,vGe[o&1](l|0,u|0,A|0,+d)}function Z6e(o,l,u,A,d,m,B){o=o|0,l=l|0,u=u|0,A=y(A),d=d|0,m=y(m),B=B|0,MX[o&1](l|0,u|0,y(A),d|0,y(m),B|0)}function X6e(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F2[o&15](l|0,u|0,A|0)}function $6e(o){o=o|0,UX[o&0]()}function eGe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,_X[o&15](l|0,u|0,+A)}function tGe(o,l,u){return o=o|0,l=+l,u=+u,SGe[o&1](+l,+u)|0}function rGe(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,gU[o&15](l|0,u|0,A|0,d|0)}function nGe(o,l,u,A,d){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,F(0)}function iGe(o,l){o=o|0,l=y(l),F(1)}function Za(o,l){o=o|0,l=+l,F(2)}function sGe(o,l,u){return o=o|0,l=y(l),u=y(u),F(3),$e}function wr(o){o=o|0,F(4)}function R2(o,l){o=o|0,l=l|0,F(5)}function Ol(o){return o=o|0,F(6),0}function oGe(o,l,u,A){o=o|0,l=+l,u=+u,A=A|0,F(7)}function aGe(o,l,u){o=o|0,l=+l,u=+u,F(8)}function lGe(o,l,u){return o=o|0,l=l|0,u=u|0,F(9),0}function cGe(o,l,u){return o=o|0,l=l|0,u=u|0,F(10),0}function hd(o){return o=o|0,F(11),0}function uGe(o,l){return o=o|0,l=+l,F(12),0}function T2(o,l){return o=o|0,l=l|0,F(13),0}function fGe(o,l,u,A,d){o=o|0,l=l|0,u=+u,A=+A,d=d|0,F(14)}function AGe(o,l,u,A,d,m){o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,m=m|0,F(15)}function pU(o,l){return o=o|0,l=l|0,F(16),0}function pGe(){return F(17),0}function hGe(o,l,u,A,d){return o=o|0,l=l|0,u=u|0,A=A|0,d=d|0,F(18),0}function gGe(o,l,u,A){o=o|0,l=l|0,u=u|0,A=+A,F(19)}function dGe(o,l,u,A,d,m){o=o|0,l=l|0,u=y(u),A=A|0,d=y(d),m=m|0,F(20)}function Wb(o,l,u){o=o|0,l=l|0,u=u|0,F(21)}function mGe(){F(22)}function tE(o,l,u){o=o|0,l=l|0,u=+u,F(23)}function yGe(o,l){return o=+o,l=+l,F(24),0}function rE(o,l,u,A){o=o|0,l=l|0,u=u|0,A=A|0,F(25)}var kX=[nGe,h3e],QX=[iGe,Ry],RX=[Za,Xg,Fh,h2,g2,d2,m2,Pf,_y,y2,bf,$g,ed,E2,I2,wu,td,C2,Hy,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za,Za],TX=[sGe],ip=[wr,$y,Jke,Kke,zke,SFe,DFe,PFe,G_e,q_e,W_e,t3e,r3e,n3e,Bje,vje,Sje,Bl,Zg,u2,sr,hc,xb,kb,Mke,iQe,dQe,FQe,zQe,pRe,kRe,WRe,oTe,wTe,MTe,eFe,dFe,qFe,oNe,wNe,MNe,eOe,dOe,NOe,zOe,uLe,DLe,db,nMe,EMe,MMe,rUe,mUe,MUe,JUe,ZUe,h_e,m_e,F_e,V_e,z_e,p4e,Q4e,dz,A8e,G8e,iHe,EHe,HHe,rje,pje,dje,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr,wr],sp=[R2,Ly,VL,f2,A2,xr,so,zi,Ns,ws,Uy,Th,B2,Cb,id,zL,ZL,wb,Bb,eM,xf,ne,UOe,$Oe,oUe,g8e,U4e,eX,R2,R2,R2,R2],gd=[Ol,e6e,Ny,nd,Gy,ga,mb,Nh,w2,KL,Eb,qy,vb,tM,Vy,xLe,CUe,d4e,E8e,Tl,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol,Ol],FX=[oGe,oM],EGe=[aGe,L_e],Yb=[lGe,hX,t6e,i6e,mRe,JFe,aMe,BHe],IGe=[cGe,jTe],NX=[hd,Oh,Ib,$A,aM,v,D,Q,H,V,hd,hd,hd,hd,hd,hd],CGe=[uGe,WUe],hU=[T2,S6e,Sb,jke,MQe,TRe,JRe,IFe,uNe,hLe,Ty,lHe,T2,T2,T2,T2],wGe=[fGe,IQe],BGe=[AGe,WHe],OX=[pU,XL,Se,_e,pt,iFe,pU,pU],Vb=[pGe,Wt,Fy,gb,t_e,C_e,e4e,Ije],LX=[hGe,Sy],vGe=[gGe,jNe],MX=[dGe,rM],F2=[Wb,ko,yb,$L,vu,eRe,cTe,iOe,IOe,YL,L3e,V8e,oje,Wb,Wb,Wb],UX=[mGe],_X=[tE,JL,My,XA,p2,Bu,jy,rd,DNe,BMe,HUe,tE,tE,tE,tE,tE],SGe=[yGe,H_e],gU=[rE,DTe,LLe,jMe,kUe,a_e,P_e,a4e,O4e,S8e,Qje,rE,rE,rE,rE,rE];return{_llvm_bswap_i32:xX,dynCall_idd:tGe,dynCall_i:J6e,_i64Subtract:Gb,___udivdi3:fU,dynCall_vif:R6e,setThrew:ca,dynCall_viii:X6e,_bitshift64Lshr:qb,_bitshift64Shl:DX,dynCall_vi:N6e,dynCall_viiddi:W6e,dynCall_diii:H6e,dynCall_iii:q6e,_memset:eE,_sbrk:qh,_memcpy:Qr,__GLOBAL__sub_I_Yoga_cpp:a2,dynCall_vii:O6e,___uremdi3:AU,dynCall_vid:T6e,stackAlloc:Ua,_nbind_init:jje,getTempRet0:MA,dynCall_di:j6e,dynCall_iid:G6e,setTempRet0:LA,_i64Add:uU,dynCall_fiff:F6e,dynCall_iiii:_6e,_emscripten_get_global_libc:$je,dynCall_viid:eGe,dynCall_viiid:z6e,dynCall_viififi:Z6e,dynCall_ii:L6e,__GLOBAL__sub_I_Binding_cc:i8e,dynCall_viiii:rGe,dynCall_iiiiii:K6e,stackSave:hf,dynCall_viiiii:Q6e,__GLOBAL__sub_I_nbind_cc:Sr,dynCall_vidd:U6e,_free:Hb,runPostSets:k6e,dynCall_viiiiii:Y6e,establishStackSpace:wn,_memmove:Q2,stackRestore:lc,_malloc:_b,__GLOBAL__sub_I_common_cc:v4e,dynCall_viddi:M6e,dynCall_dii:V6e,dynCall_v:$6e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function s(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];s();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(s){r=s(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var Fm=_((cKt,bwe)=>{"use strict";var Ipt=Dwe(),Cpt=Pwe(),j9=!1,G9=null;Cpt({},function(t,e){if(!j9){if(j9=!0,t)throw t;G9=e}});if(!j9)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");bwe.exports=Ipt(G9.bind,G9.lib)});var W9=_((uKt,q9)=>{"use strict";var xwe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);q9.exports=xwe;q9.exports.default=xwe});var Qwe=_((fKt,kwe)=>{"use strict";kwe.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var GS=_((AKt,Y9)=>{"use strict";var wpt=dk(),Bpt=W9(),vpt=Qwe(),Rwe=t=>{if(typeof t!="string"||t.length===0||(t=wpt(t),t.length===0))return 0;t=t.replace(vpt()," ");let e=0;for(let r=0;r=127&&s<=159||s>=768&&s<=879||(s>65535&&r++,e+=Bpt(s)?2:1)}return e};Y9.exports=Rwe;Y9.exports.default=Rwe});var J9=_((pKt,V9)=>{"use strict";var Spt=GS(),Twe=t=>{let e=0;for(let r of t.split(` `))e=Math.max(e,Spt(r));return e};V9.exports=Twe;V9.exports.default=Twe});var Fwe=_(qS=>{"use strict";var Dpt=qS&&qS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(qS,"__esModule",{value:!0});var Ppt=Dpt(J9()),K9={};qS.default=t=>{if(t.length===0)return{width:0,height:0};if(K9[t])return K9[t];let e=Ppt.default(t),r=t.split(` `).length;return K9[t]={width:e,height:r},{width:e,height:r}}});var Nwe=_(WS=>{"use strict";var bpt=WS&&WS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(WS,"__esModule",{value:!0});var Pn=bpt(Fm()),xpt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?Pn.default.POSITION_TYPE_ABSOLUTE:Pn.default.POSITION_TYPE_RELATIVE)},kpt=(t,e)=>{"marginLeft"in e&&t.setMargin(Pn.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(Pn.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(Pn.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(Pn.default.EDGE_BOTTOM,e.marginBottom||0)},Qpt=(t,e)=>{"paddingLeft"in e&&t.setPadding(Pn.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(Pn.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(Pn.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(Pn.default.EDGE_BOTTOM,e.paddingBottom||0)},Rpt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(Pn.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(Pn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(Pn.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(Pn.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(Pn.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(Pn.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(Pn.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(Pn.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(Pn.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(Pn.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(Pn.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(Pn.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(Pn.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(Pn.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(Pn.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(Pn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(Pn.default.JUSTIFY_SPACE_AROUND))},Tpt=(t,e)=>{var r,s;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((s=e.minHeight)!==null&&s!==void 0?s:0))},Fpt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?Pn.default.DISPLAY_FLEX:Pn.default.DISPLAY_NONE)},Npt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(Pn.default.EDGE_TOP,r),t.setBorder(Pn.default.EDGE_BOTTOM,r),t.setBorder(Pn.default.EDGE_LEFT,r),t.setBorder(Pn.default.EDGE_RIGHT,r)}};WS.default=(t,e={})=>{xpt(t,e),kpt(t,e),Qpt(t,e),Rpt(t,e),Tpt(t,e),Fpt(t,e),Npt(t,e)}});var Mwe=_((dKt,Lwe)=>{"use strict";var YS=GS(),Opt=dk(),Lpt=sk(),Z9=new Set(["\x1B","\x9B"]),Mpt=39,Owe=t=>`${Z9.values().next().value}[${t}m`,Upt=t=>t.split(" ").map(e=>YS(e)),z9=(t,e,r)=>{let s=[...e],a=!1,n=YS(Opt(t[t.length-1]));for(let[c,f]of s.entries()){let p=YS(f);if(n+p<=r?t[t.length-1]+=f:(t.push(f),n=0),Z9.has(f))a=!0;else if(a&&f==="m"){a=!1;continue}a||(n+=p,n===r&&c0&&t.length>1&&(t[t.length-2]+=t.pop())},_pt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(YS(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},Hpt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let s="",a="",n,c=Upt(t),f=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(f[f.length-1]=f[f.length-1].trimLeft());let E=YS(f[f.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(f.push(""),E=0),(E>0||r.trim===!1)&&(f[f.length-1]+=" ",E++)),r.hard&&c[p]>e){let C=e-E,S=1+Math.floor((c[p]-C-1)/e);Math.floor((c[p]-1)/e)e&&E>0&&c[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){z9(f,h,e);continue}f[f.length-1]+=h}r.trim!==!1&&(f=f.map(_pt)),s=f.join(` `);for(let[p,h]of[...s].entries()){if(a+=h,Z9.has(h)){let C=parseFloat(/\d[^m]*/.exec(s.slice(p,p+4)));n=C===Mpt?null:C}let E=Lpt.codes.get(Number(n));n&&E&&(s[p+1]===` `?a+=Owe(E):h===` `&&(a+=Owe(n)))}return a};Lwe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` `).split(` `).map(s=>Hpt(s,e,r)).join(` `)});var Hwe=_((mKt,_we)=>{"use strict";var Uwe="[\uD800-\uDBFF][\uDC00-\uDFFF]",jpt=t=>t&&t.exact?new RegExp(`^${Uwe}$`):new RegExp(Uwe,"g");_we.exports=jpt});var X9=_((yKt,Wwe)=>{"use strict";var Gpt=W9(),qpt=Hwe(),jwe=sk(),qwe=["\x1B","\x9B"],FF=t=>`${qwe[0]}[${t}m`,Gwe=(t,e,r)=>{let s=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let c=jwe.codes.get(parseInt(a,10));if(c){let f=t.indexOf(c.toString());f>=0?t.splice(f,1):s.push(FF(e?c:n))}else if(e){s.push(FF(0));break}else s.push(FF(n))}if(e&&(s=s.filter((a,n)=>s.indexOf(a)===n),r!==void 0)){let a=FF(jwe.codes.get(parseInt(r,10)));s=s.reduce((n,c)=>c===a?[c,...n]:[...n,c],[])}return s.join("")};Wwe.exports=(t,e,r)=>{let s=[...t.normalize()],a=[];r=typeof r=="number"?r:s.length;let n=!1,c,f=0,p="";for(let[h,E]of s.entries()){let C=!1;if(qwe.includes(E)){let S=/\d[^m]*/.exec(t.slice(h,h+18));c=S&&S.length>0?S[0]:void 0,fe&&f<=r)p+=E;else if(f===e&&!n&&c!==void 0)p=Gwe(a);else if(f>=r){p+=Gwe(a,!0,c);break}}return p}});var Vwe=_((EKt,Ywe)=>{"use strict";var $0=X9(),Wpt=GS();function NF(t,e,r){if(t.charAt(e)===" ")return e;for(let s=1;s<=3;s++)if(r){if(t.charAt(e+s)===" ")return e+s}else if(t.charAt(e-s)===" ")return e-s;return e}Ywe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:s,space:a,preferTruncationOnSpace:n}=r,c="\u2026",f=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return c;let p=Wpt(t);if(p<=e)return t;if(s==="start"){if(n){let h=NF(t,p-e+1,!0);return c+$0(t,h,p).trim()}return a===!0&&(c+=" ",f=2),c+$0(t,p-e+f,p)}if(s==="middle"){a===!0&&(c=" "+c+" ",f=3);let h=Math.floor(e/2);if(n){let E=NF(t,h),C=NF(t,p-(e-h)+1,!0);return $0(t,0,E)+c+$0(t,C,p).trim()}return $0(t,0,h)+c+$0(t,p-(e-h)+f,p)}if(s==="end"){if(n){let h=NF(t,e-1);return $0(t,0,h)+c}return a===!0&&(c=" "+c,f=2),$0(t,0,e-f)+c}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${s}`)}});var eW=_(VS=>{"use strict";var Jwe=VS&&VS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(VS,"__esModule",{value:!0});var Ypt=Jwe(Mwe()),Vpt=Jwe(Vwe()),$9={};VS.default=(t,e,r)=>{let s=t+String(e)+String(r);if($9[s])return $9[s];let a=t;if(r==="wrap"&&(a=Ypt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=Vpt.default(t,e,{position:n})}return $9[s]=a,a}});var rW=_(tW=>{"use strict";Object.defineProperty(tW,"__esModule",{value:!0});var Kwe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let s="";r.nodeName==="#text"?s=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(s=Kwe(r)),s.length>0&&typeof r.internal_transform=="function"&&(s=r.internal_transform(s))),e+=s}return e};tW.default=Kwe});var nW=_(Pi=>{"use strict";var JS=Pi&&Pi.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Pi,"__esModule",{value:!0});Pi.setTextNodeValue=Pi.createTextNode=Pi.setStyle=Pi.setAttribute=Pi.removeChildNode=Pi.insertBeforeNode=Pi.appendChildNode=Pi.createNode=Pi.TEXT_NAME=void 0;var Jpt=JS(Fm()),zwe=JS(Fwe()),Kpt=JS(Nwe()),zpt=JS(eW()),Zpt=JS(rW());Pi.TEXT_NAME="#text";Pi.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:Jpt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(Xpt.bind(null,r))),r};Pi.appendChildNode=(t,e)=>{var r;e.parentNode&&Pi.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&OF(t)};Pi.insertBeforeNode=(t,e,r)=>{var s,a;e.parentNode&&Pi.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((s=t.yogaNode)===null||s===void 0||s.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&OF(t)};Pi.removeChildNode=(t,e)=>{var r,s;e.yogaNode&&((s=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||s===void 0||s.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&OF(t)};Pi.setAttribute=(t,e,r)=>{t.attributes[e]=r};Pi.setStyle=(t,e)=>{t.style=e,t.yogaNode&&Kpt.default(t.yogaNode,e)};Pi.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return Pi.setTextNodeValue(e,t),e};var Xpt=function(t,e){var r,s;let a=t.nodeName==="#text"?t.nodeValue:Zpt.default(t),n=zwe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let c=(s=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&s!==void 0?s:"wrap",f=zpt.default(a,e,c);return zwe.default(f)},Zwe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:Zwe(t.parentNode)},OF=t=>{let e=Zwe(t);e?.markDirty()};Pi.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,OF(t)}});var r1e=_(KS=>{"use strict";var t1e=KS&&KS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(KS,"__esModule",{value:!0});var Xwe=U9(),$pt=t1e(Iwe()),$we=t1e(Fm()),ea=nW(),e1e=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};KS.default=$pt.default({schedulePassiveEffects:Xwe.unstable_scheduleCallback,cancelPassiveEffects:Xwe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>!1,shouldDeprioritizeSubtree:()=>!1,resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,s=e==="ink-text"||e==="ink-virtual-text";return r===s?t:{isInsideText:s}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,s)=>{if(s.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&s.isInsideText?"ink-virtual-text":t,n=ea.createNode(a);for(let[c,f]of Object.entries(e))c!=="children"&&(c==="style"?ea.setStyle(n,f):c==="internal_transform"?n.internal_transform=f:c==="internal_static"?n.internal_static=!0:ea.setAttribute(n,c,f));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return ea.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{ea.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{ea.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay($we.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay($we.default.DISPLAY_FLEX)},appendInitialChild:ea.appendChildNode,appendChild:ea.appendChildNode,insertBefore:ea.insertBeforeNode,finalizeInitialChildren:(t,e,r,s)=>(t.internal_static&&(s.isStaticDirty=!0,s.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:ea.appendChildNode,insertInContainerBefore:ea.insertBeforeNode,removeChildFromContainer:(t,e)=>{ea.removeChildNode(t,e),e1e(e.yogaNode)},prepareUpdate:(t,e,r,s,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},c=Object.keys(s);for(let f of c)if(s[f]!==r[f]){if(f==="style"&&typeof s.style=="object"&&typeof r.style=="object"){let h=s.style,E=r.style,C=Object.keys(h);for(let S of C){if(S==="borderStyle"||S==="borderColor"){if(typeof n.style!="object"){let b={};n.style=b}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[S]!==E[S]){if(typeof n.style!="object"){let b={};n.style=b}n.style[S]=h[S]}}continue}n[f]=s[f]}return n},commitUpdate:(t,e)=>{for(let[r,s]of Object.entries(e))r!=="children"&&(r==="style"?ea.setStyle(t,s):r==="internal_transform"?t.internal_transform=s:r==="internal_static"?t.internal_static=!0:ea.setAttribute(t,r,s))},commitTextUpdate:(t,e,r)=>{ea.setTextNodeValue(t,r)},removeChild:(t,e)=>{ea.removeChildNode(t,e),e1e(e.yogaNode)}})});var i1e=_((vKt,n1e)=>{"use strict";n1e.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let s=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(s,r.indent.repeat(e))}});var s1e=_(zS=>{"use strict";var eht=zS&&zS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(zS,"__esModule",{value:!0});var LF=eht(Fm());zS.default=t=>t.getComputedWidth()-t.getComputedPadding(LF.default.EDGE_LEFT)-t.getComputedPadding(LF.default.EDGE_RIGHT)-t.getComputedBorder(LF.default.EDGE_LEFT)-t.getComputedBorder(LF.default.EDGE_RIGHT)});var o1e=_((DKt,tht)=>{tht.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var l1e=_((PKt,iW)=>{"use strict";var a1e=o1e();iW.exports=a1e;iW.exports.default=a1e});var sW=_(XS=>{"use strict";var rht=XS&&XS.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(XS,"__esModule",{value:!0});var ZS=rht(RE()),nht=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,iht=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,MF=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);XS.default=(t,e,r)=>{if(!e)return t;if(e in ZS.default){let a=MF(e,r);return ZS.default[a](t)}if(e.startsWith("#")){let a=MF("hex",r);return ZS.default[a](e)(t)}if(e.startsWith("ansi")){let a=iht.exec(e);if(!a)return t;let n=MF(a[1],r),c=Number(a[2]);return ZS.default[n](c)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=nht.exec(e);if(!a)return t;let n=MF(a[1],r),c=Number(a[2]),f=Number(a[3]),p=Number(a[4]);return ZS.default[n](c,f,p)(t)}return t}});var u1e=_($S=>{"use strict";var c1e=$S&&$S.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty($S,"__esModule",{value:!0});var sht=c1e(l1e()),oW=c1e(sW());$S.default=(t,e,r,s)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),c=r.style.borderColor,f=sht.default[r.style.borderStyle],p=oW.default(f.topLeft+f.horizontal.repeat(a-2)+f.topRight,c,"foreground"),h=(oW.default(f.vertical,c,"foreground")+` `).repeat(n-2),E=oW.default(f.bottomLeft+f.horizontal.repeat(a-2)+f.bottomRight,c,"foreground");s.write(t,e,p,{transformers:[]}),s.write(t,e+1,h,{transformers:[]}),s.write(t+a-1,e+1,h,{transformers:[]}),s.write(t,e+n-1,E,{transformers:[]})}}});var A1e=_(eD=>{"use strict";var Nm=eD&&eD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(eD,"__esModule",{value:!0});var oht=Nm(Fm()),aht=Nm(J9()),lht=Nm(i1e()),cht=Nm(eW()),uht=Nm(s1e()),fht=Nm(rW()),Aht=Nm(u1e()),pht=(t,e)=>{var r;let s=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(s){let a=s.getComputedLeft(),n=s.getComputedTop();e=` `.repeat(n)+lht.default(e,a)}return e},f1e=(t,e,r)=>{var s;let{offsetX:a=0,offsetY:n=0,transformers:c=[],skipStaticElements:f}=r;if(f&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===oht.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),C=c;if(typeof t.internal_transform=="function"&&(C=[t.internal_transform,...c]),t.nodeName==="ink-text"){let S=fht.default(t);if(S.length>0){let b=aht.default(S),I=uht.default(p);if(b>I){let T=(s=t.style.textWrap)!==null&&s!==void 0?s:"wrap";S=cht.default(S,I,T)}S=pht(t,S),e.write(h,E,S,{transformers:C})}return}if(t.nodeName==="ink-box"&&Aht.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let S of t.childNodes)f1e(S,e,{offsetX:h,offsetY:E,transformers:C,skipStaticElements:f})}};eD.default=f1e});var g1e=_(tD=>{"use strict";var h1e=tD&&tD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tD,"__esModule",{value:!0});var p1e=h1e(X9()),hht=h1e(GS()),aW=class{constructor(e){this.writes=[];let{width:r,height:s}=e;this.width=r,this.height=s}write(e,r,s,a){let{transformers:n}=a;s&&this.writes.push({x:e,y:r,text:s,transformers:n})}get(){let e=[];for(let s=0;ss.trimRight()).join(` `),height:e.length}}};tD.default=aW});var y1e=_(rD=>{"use strict";var lW=rD&&rD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rD,"__esModule",{value:!0});var ght=lW(Fm()),d1e=lW(A1e()),m1e=lW(g1e());rD.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,ght.default.DIRECTION_LTR);let s=new m1e.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});d1e.default(t,s,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new m1e.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),d1e.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:c}=s.get();return{output:n,outputHeight:c,staticOutput:a?`${a.get().output} `:""}}return{output:"",outputHeight:0,staticOutput:""}}});var w1e=_((TKt,C1e)=>{"use strict";var E1e=Ie("stream"),I1e=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],cW={},dht=t=>{let e=new E1e.PassThrough,r=new E1e.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let s=new console.Console(e,r);for(let a of I1e)cW[a]=console[a],console[a]=s[a];return()=>{for(let a of I1e)console[a]=cW[a];cW={}}};C1e.exports=dht});var fW=_(uW=>{"use strict";Object.defineProperty(uW,"__esModule",{value:!0});uW.default=new WeakMap});var pW=_(AW=>{"use strict";Object.defineProperty(AW,"__esModule",{value:!0});var mht=hn(),B1e=mht.createContext({exit:()=>{}});B1e.displayName="InternalAppContext";AW.default=B1e});var gW=_(hW=>{"use strict";Object.defineProperty(hW,"__esModule",{value:!0});var yht=hn(),v1e=yht.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});v1e.displayName="InternalStdinContext";hW.default=v1e});var mW=_(dW=>{"use strict";Object.defineProperty(dW,"__esModule",{value:!0});var Eht=hn(),S1e=Eht.createContext({stdout:void 0,write:()=>{}});S1e.displayName="InternalStdoutContext";dW.default=S1e});var EW=_(yW=>{"use strict";Object.defineProperty(yW,"__esModule",{value:!0});var Iht=hn(),D1e=Iht.createContext({stderr:void 0,write:()=>{}});D1e.displayName="InternalStderrContext";yW.default=D1e});var UF=_(IW=>{"use strict";Object.defineProperty(IW,"__esModule",{value:!0});var Cht=hn(),P1e=Cht.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{},focus:()=>{}});P1e.displayName="InternalFocusContext";IW.default=P1e});var x1e=_((_Kt,b1e)=>{"use strict";var wht=/[|\\{}()[\]^$+*?.-]/g;b1e.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(wht,"\\$&")}});var T1e=_((HKt,R1e)=>{"use strict";var Bht=x1e(),vht=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",Q1e=[].concat(Ie("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));Q1e.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var CW=class t{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=t.nodeInternals()),"cwd"in e||(e.cwd=vht),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,Sht(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...Q1e]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` `)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let s=!1,a=null,n=[];return e.forEach(c=>{if(c=c.replace(/\\/g,"/"),this._internals.some(p=>p.test(c)))return;let f=/^\s*at /.test(c);s?c=c.trimEnd().replace(/^(\s+)at /,"$1"):(c=c.trim(),f&&(c=c.slice(3))),c=c.replace(`${this._cwd}/`,""),c&&(f?(a&&(n.push(a),a=null),n.push(c)):(s=!0,a=c))}),n.map(c=>`${r}${c} `).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:s}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=s,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:s,stackTraceLimit:a}=Error;Error.prepareStackTrace=(f,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:c}=n;return Object.assign(Error,{prepareStackTrace:s,stackTraceLimit:a}),c}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let s={line:r.getLineNumber(),column:r.getColumnNumber()};k1e(s,r.getFileName(),this._cwd),r.isConstructor()&&(s.constructor=!0),r.isEval()&&(s.evalOrigin=r.getEvalOrigin()),r.isNative()&&(s.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(s.type=a);let n=r.getFunctionName();n&&(s.function=n);let c=r.getMethodName();return c&&n!==c&&(s.method=c),s}parseLine(e){let r=e&&e.match(Dht);if(!r)return null;let s=r[1]==="new",a=r[2],n=r[3],c=r[4],f=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],C=r[9],S=r[10]==="native",b=r[11]===")",I,T={};if(E&&(T.line=Number(E)),C&&(T.column=Number(C)),b&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")N++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(N--,N===-1&&h.charAt(U-1)===" ")){let W=h.slice(0,U-1);h=h.slice(U+1),a+=` (${W}`;break}}if(a){let N=a.match(Pht);N&&(a=N[1],I=N[2])}return k1e(T,h,this._cwd),s&&(T.constructor=!0),n&&(T.evalOrigin=n,T.evalLine=f,T.evalColumn=p,T.evalFile=c&&c.replace(/\\/g,"/")),S&&(T.native=!0),a&&(T.function=a),I&&a!==I&&(T.method=I),T}};function k1e(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function Sht(t){if(t.length===0)return[];let e=t.map(r=>Bht(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var Dht=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),Pht=/^(.*?) \[as (.*?)\]$/;R1e.exports=CW});var N1e=_((jKt,F1e)=>{"use strict";F1e.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var L1e=_((GKt,O1e)=>{"use strict";var bht=N1e(),xht=(t,e)=>{let r=[],s=t-e,a=t+e;for(let n=s;n<=a;n++)r.push(n);return r};O1e.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=bht(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},xht(e,r.around).filter(s=>t[s-1]!==void 0).map(s=>({line:s,value:t[s-1]}))}});var _F=_(rf=>{"use strict";var kht=rf&&rf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Qht=rf&&rf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Rht=rf&&rf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&kht(e,t,r);return Qht(e,t),e},Tht=rf&&rf.__rest||function(t,e){var r={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(r[s]=t[s]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,s=Object.getOwnPropertySymbols(t);a{var{children:r}=t,s=Tht(t,["children"]);let a=Object.assign(Object.assign({},s),{marginLeft:s.marginLeft||s.marginX||s.margin||0,marginRight:s.marginRight||s.marginX||s.margin||0,marginTop:s.marginTop||s.marginY||s.margin||0,marginBottom:s.marginBottom||s.marginY||s.margin||0,paddingLeft:s.paddingLeft||s.paddingX||s.padding||0,paddingRight:s.paddingRight||s.paddingX||s.padding||0,paddingTop:s.paddingTop||s.paddingY||s.padding||0,paddingBottom:s.paddingBottom||s.paddingY||s.padding||0});return M1e.default.createElement("ink-box",{ref:e,style:a},r)});wW.displayName="Box";wW.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};rf.default=wW});var SW=_(nD=>{"use strict";var BW=nD&&nD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nD,"__esModule",{value:!0});var Fht=BW(hn()),yw=BW(RE()),U1e=BW(sW()),vW=({color:t,backgroundColor:e,dimColor:r,bold:s,italic:a,underline:n,strikethrough:c,inverse:f,wrap:p,children:h})=>{if(h==null)return null;let E=C=>(r&&(C=yw.default.dim(C)),t&&(C=U1e.default(C,t,"foreground")),e&&(C=U1e.default(C,e,"background")),s&&(C=yw.default.bold(C)),a&&(C=yw.default.italic(C)),n&&(C=yw.default.underline(C)),c&&(C=yw.default.strikethrough(C)),f&&(C=yw.default.inverse(C)),C);return Fht.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};vW.displayName="Text";vW.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};nD.default=vW});var G1e=_(nf=>{"use strict";var Nht=nf&&nf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Oht=nf&&nf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Lht=nf&&nf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&Nht(e,t,r);return Oht(e,t),e},iD=nf&&nf.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nf,"__esModule",{value:!0});var _1e=Lht(Ie("fs")),Qs=iD(hn()),H1e=iD(T1e()),Mht=iD(L1e()),$p=iD(_F()),AA=iD(SW()),j1e=new H1e.default({cwd:process.cwd(),internals:H1e.default.nodeInternals()}),Uht=({error:t})=>{let e=t.stack?t.stack.split(` `).slice(1):void 0,r=e?j1e.parseLine(e[0]):void 0,s,a=0;if(r?.file&&r?.line&&_1e.existsSync(r.file)){let n=_1e.readFileSync(r.file,"utf8");if(s=Mht.default(n,r.line),s)for(let{line:c}of s)a=Math.max(a,String(c).length)}return Qs.default.createElement($p.default,{flexDirection:"column",padding:1},Qs.default.createElement($p.default,null,Qs.default.createElement(AA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),Qs.default.createElement(AA.default,null," ",t.message)),r&&Qs.default.createElement($p.default,{marginTop:1},Qs.default.createElement(AA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&s&&Qs.default.createElement($p.default,{marginTop:1,flexDirection:"column"},s.map(({line:n,value:c})=>Qs.default.createElement($p.default,{key:n},Qs.default.createElement($p.default,{width:a+1},Qs.default.createElement(AA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),Qs.default.createElement(AA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+c)))),t.stack&&Qs.default.createElement($p.default,{marginTop:1,flexDirection:"column"},t.stack.split(` `).slice(1).map(n=>{let c=j1e.parseLine(n);return c?Qs.default.createElement($p.default,{key:n},Qs.default.createElement(AA.default,{dimColor:!0},"- "),Qs.default.createElement(AA.default,{dimColor:!0,bold:!0},c.function),Qs.default.createElement(AA.default,{dimColor:!0,color:"gray"}," ","(",c.file,":",c.line,":",c.column,")")):Qs.default.createElement($p.default,{key:n},Qs.default.createElement(AA.default,{dimColor:!0},"- "),Qs.default.createElement(AA.default,{dimColor:!0,bold:!0},n))})))};nf.default=Uht});var W1e=_(sf=>{"use strict";var _ht=sf&&sf.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Hht=sf&&sf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),jht=sf&&sf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&_ht(e,t,r);return Hht(e,t),e},Lm=sf&&sf.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sf,"__esModule",{value:!0});var Om=jht(hn()),q1e=Lm(P9()),Ght=Lm(pW()),qht=Lm(gW()),Wht=Lm(mW()),Yht=Lm(EW()),Vht=Lm(UF()),Jht=Lm(G1e()),Kht=" ",zht="\x1B[Z",Zht="\x1B",HF=class extends Om.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===Zht&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===Kht&&this.focusNext(),e===zht&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focus=e=>{this.setState(r=>r.focusables.some(a=>a?.id===e)?{activeFocusId:e}:r)},this.focusNext=()=>{this.setState(e=>{var r;let s=(r=e.focusables[0])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findNextFocusable(e)||s}})},this.focusPrevious=()=>{this.setState(e=>{var r;let s=(r=e.focusables[e.focusables.length-1])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findPreviousFocusable(e)||s}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(s=>{let a=s.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...s.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(s=>s.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(s=>s.id!==e?s:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(s=>s.id!==e?s:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{var r;let s=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=s+1;a{var r;let s=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=s-1;a>=0;a--)if(!((r=e.focusables[a])===null||r===void 0)&&r.isActive)return e.focusables[a].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return Om.default.createElement(Ght.default.Provider,{value:{exit:this.handleExit}},Om.default.createElement(qht.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},Om.default.createElement(Wht.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},Om.default.createElement(Yht.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},Om.default.createElement(Vht.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?Om.default.createElement(Jht.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){q1e.default.hide(this.props.stdout)}componentWillUnmount(){q1e.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};sf.default=HF;HF.displayName="InternalApp"});var J1e=_(of=>{"use strict";var Xht=of&&of.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),$ht=of&&of.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),e0t=of&&of.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&Xht(e,t,r);return $ht(e,t),e},af=of&&of.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(of,"__esModule",{value:!0});var t0t=af(hn()),Y1e=_Ce(),r0t=af(rwe()),n0t=af(w9()),i0t=af(lwe()),s0t=af(uwe()),DW=af(r1e()),o0t=af(y1e()),a0t=af(D9()),l0t=af(w1e()),c0t=e0t(nW()),u0t=af(fW()),f0t=af(W1e()),Ew=process.env.CI==="false"?!1:i0t.default,V1e=()=>{},PW=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:s,staticOutput:a}=o0t.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` `;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(Ew){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),s>=this.options.stdout.rows){this.options.stdout.write(n0t.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},s0t.default(this),this.options=e,this.rootNode=c0t.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:Y1e(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=r0t.default.create(e.stdout),this.throttledLog=e.debug?this.log:Y1e(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=DW.default.createContainer(this.rootNode,0,!1,null),this.unsubscribeExit=a0t.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),Ew||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=t0t.default.createElement(f0t.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);DW.default.updateContainer(r,this.container,null,V1e)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(Ew){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(Ew){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),Ew?this.options.stdout.write(this.lastOutput+` `):this.options.debug||this.log.done(),this.isUnmounted=!0,DW.default.updateContainer(null,this.container,null,V1e),u0t.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!Ew&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=l0t.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};of.default=PW});var z1e=_(sD=>{"use strict";var K1e=sD&&sD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sD,"__esModule",{value:!0});var A0t=K1e(J1e()),jF=K1e(fW()),p0t=Ie("stream"),h0t=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},g0t(e)),s=d0t(r.stdout,()=>new A0t.default(r));return s.render(t),{rerender:s.render,unmount:()=>s.unmount(),waitUntilExit:s.waitUntilExit,cleanup:()=>jF.default.delete(r.stdout),clear:s.clear}};sD.default=h0t;var g0t=(t={})=>t instanceof p0t.Stream?{stdout:t,stdin:process.stdin}:t,d0t=(t,e)=>{let r;return jF.default.has(t)?r=jF.default.get(t):(r=e(),jF.default.set(t,r)),r}});var X1e=_(eh=>{"use strict";var m0t=eh&&eh.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r),Object.defineProperty(t,s,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),y0t=eh&&eh.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),E0t=eh&&eh.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&m0t(e,t,r);return y0t(e,t),e};Object.defineProperty(eh,"__esModule",{value:!0});var oD=E0t(hn()),Z1e=t=>{let{items:e,children:r,style:s}=t,[a,n]=oD.useState(0),c=oD.useMemo(()=>e.slice(a),[e,a]);oD.useLayoutEffect(()=>{n(e.length)},[e.length]);let f=c.map((h,E)=>r(h,a+E)),p=oD.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},s),[s]);return oD.default.createElement("ink-box",{internal_static:!0,style:p},f)};Z1e.displayName="Static";eh.default=Z1e});var e2e=_(aD=>{"use strict";var I0t=aD&&aD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(aD,"__esModule",{value:!0});var C0t=I0t(hn()),$1e=({children:t,transform:e})=>t==null?null:C0t.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);$1e.displayName="Transform";aD.default=$1e});var r2e=_(lD=>{"use strict";var w0t=lD&&lD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lD,"__esModule",{value:!0});var B0t=w0t(hn()),t2e=({count:t=1})=>B0t.default.createElement("ink-text",null,` `.repeat(t));t2e.displayName="Newline";lD.default=t2e});var s2e=_(cD=>{"use strict";var n2e=cD&&cD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cD,"__esModule",{value:!0});var v0t=n2e(hn()),S0t=n2e(_F()),i2e=()=>v0t.default.createElement(S0t.default,{flexGrow:1});i2e.displayName="Spacer";cD.default=i2e});var GF=_(uD=>{"use strict";var D0t=uD&&uD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uD,"__esModule",{value:!0});var P0t=hn(),b0t=D0t(gW()),x0t=()=>P0t.useContext(b0t.default);uD.default=x0t});var a2e=_(fD=>{"use strict";var k0t=fD&&fD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(fD,"__esModule",{value:!0});var o2e=hn(),Q0t=k0t(GF()),R0t=(t,e={})=>{let{stdin:r,setRawMode:s,internal_exitOnCtrlC:a}=Q0t.default();o2e.useEffect(()=>{if(e.isActive!==!1)return s(!0),()=>{s(!1)}},[e.isActive,s]),o2e.useEffect(()=>{if(e.isActive===!1)return;let n=c=>{let f=String(c),p={upArrow:f==="\x1B[A",downArrow:f==="\x1B[B",leftArrow:f==="\x1B[D",rightArrow:f==="\x1B[C",pageDown:f==="\x1B[6~",pageUp:f==="\x1B[5~",return:f==="\r",escape:f==="\x1B",ctrl:!1,shift:!1,tab:f===" "||f==="\x1B[Z",backspace:f==="\b",delete:f==="\x7F"||f==="\x1B[3~",meta:!1};f<=""&&!p.return&&(f=String.fromCharCode(f.charCodeAt(0)+97-1),p.ctrl=!0),f.startsWith("\x1B")&&(f=f.slice(1),p.meta=!0);let h=f>="A"&&f<="Z",E=f>="\u0410"&&f<="\u042F";f.length===1&&(h||E)&&(p.shift=!0),p.tab&&f==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(f=""),(!(f==="c"&&p.ctrl)||!a)&&t(f,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[e.isActive,r,a,t])};fD.default=R0t});var l2e=_(AD=>{"use strict";var T0t=AD&&AD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(AD,"__esModule",{value:!0});var F0t=hn(),N0t=T0t(pW()),O0t=()=>F0t.useContext(N0t.default);AD.default=O0t});var c2e=_(pD=>{"use strict";var L0t=pD&&pD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pD,"__esModule",{value:!0});var M0t=hn(),U0t=L0t(mW()),_0t=()=>M0t.useContext(U0t.default);pD.default=_0t});var u2e=_(hD=>{"use strict";var H0t=hD&&hD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hD,"__esModule",{value:!0});var j0t=hn(),G0t=H0t(EW()),q0t=()=>j0t.useContext(G0t.default);hD.default=q0t});var A2e=_(dD=>{"use strict";var f2e=dD&&dD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(dD,"__esModule",{value:!0});var gD=hn(),W0t=f2e(UF()),Y0t=f2e(GF()),V0t=({isActive:t=!0,autoFocus:e=!1,id:r}={})=>{let{isRawModeSupported:s,setRawMode:a}=Y0t.default(),{activeId:n,add:c,remove:f,activate:p,deactivate:h,focus:E}=gD.useContext(W0t.default),C=gD.useMemo(()=>r??Math.random().toString().slice(2,7),[r]);return gD.useEffect(()=>(c(C,{autoFocus:e}),()=>{f(C)}),[C,e]),gD.useEffect(()=>{t?p(C):h(C)},[t,C]),gD.useEffect(()=>{if(!(!s||!t))return a(!0),()=>{a(!1)}},[t]),{isFocused:!!C&&n===C,focus:E}};dD.default=V0t});var p2e=_(mD=>{"use strict";var J0t=mD&&mD.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(mD,"__esModule",{value:!0});var K0t=hn(),z0t=J0t(UF()),Z0t=()=>{let t=K0t.useContext(z0t.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious,focus:t.focus}};mD.default=Z0t});var h2e=_(bW=>{"use strict";Object.defineProperty(bW,"__esModule",{value:!0});bW.default=t=>{var e,r,s,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(s=t.yogaNode)===null||s===void 0?void 0:s.getComputedHeight())!==null&&a!==void 0?a:0}}});var Wc=_(mo=>{"use strict";Object.defineProperty(mo,"__esModule",{value:!0});var X0t=z1e();Object.defineProperty(mo,"render",{enumerable:!0,get:function(){return X0t.default}});var $0t=_F();Object.defineProperty(mo,"Box",{enumerable:!0,get:function(){return $0t.default}});var egt=SW();Object.defineProperty(mo,"Text",{enumerable:!0,get:function(){return egt.default}});var tgt=X1e();Object.defineProperty(mo,"Static",{enumerable:!0,get:function(){return tgt.default}});var rgt=e2e();Object.defineProperty(mo,"Transform",{enumerable:!0,get:function(){return rgt.default}});var ngt=r2e();Object.defineProperty(mo,"Newline",{enumerable:!0,get:function(){return ngt.default}});var igt=s2e();Object.defineProperty(mo,"Spacer",{enumerable:!0,get:function(){return igt.default}});var sgt=a2e();Object.defineProperty(mo,"useInput",{enumerable:!0,get:function(){return sgt.default}});var ogt=l2e();Object.defineProperty(mo,"useApp",{enumerable:!0,get:function(){return ogt.default}});var agt=GF();Object.defineProperty(mo,"useStdin",{enumerable:!0,get:function(){return agt.default}});var lgt=c2e();Object.defineProperty(mo,"useStdout",{enumerable:!0,get:function(){return lgt.default}});var cgt=u2e();Object.defineProperty(mo,"useStderr",{enumerable:!0,get:function(){return cgt.default}});var ugt=A2e();Object.defineProperty(mo,"useFocus",{enumerable:!0,get:function(){return ugt.default}});var fgt=p2e();Object.defineProperty(mo,"useFocusManager",{enumerable:!0,get:function(){return fgt.default}});var Agt=h2e();Object.defineProperty(mo,"measureElement",{enumerable:!0,get:function(){return Agt.default}})});var kW={};Vt(kW,{Gem:()=>xW});var g2e,Mm,xW,qF=Ze(()=>{g2e=ut(Wc()),Mm=ut(hn()),xW=(0,Mm.memo)(({active:t})=>{let e=(0,Mm.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,Mm.useMemo)(()=>t?"green":"yellow",[t]);return Mm.default.createElement(g2e.Text,{color:r},e)})});var m2e={};Vt(m2e,{useKeypress:()=>Um});function Um({active:t},e,r){let{stdin:s}=(0,d2e.useStdin)(),a=(0,WF.useCallback)((n,c)=>e(n,c),r);(0,WF.useEffect)(()=>{if(!(!t||!s))return s.on("keypress",a),()=>{s.off("keypress",a)}},[t,a,s])}var d2e,WF,yD=Ze(()=>{d2e=ut(Wc()),WF=ut(hn())});var E2e={};Vt(E2e,{FocusRequest:()=>y2e,useFocusRequest:()=>QW});var y2e,QW,RW=Ze(()=>{yD();y2e=(r=>(r.BEFORE="before",r.AFTER="after",r))(y2e||{}),QW=function({active:t},e,r){Um({active:t},(s,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var I2e={};Vt(I2e,{useListInput:()=>ED});var ED,YF=Ze(()=>{yD();ED=function(t,e,{active:r,minus:s,plus:a,set:n,loop:c=!0}){Um({active:r},(f,p)=>{let h=e.indexOf(t);switch(p.name){case s:{let E=h-1;if(c){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(c){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,c])}});var VF={};Vt(VF,{ScrollableItems:()=>pgt});var eg,dl,pgt,JF=Ze(()=>{eg=ut(Wc()),dl=ut(hn());RW();YF();pgt=({active:t=!0,children:e=[],radius:r=10,size:s=1,loop:a=!0,onFocusRequest:n,willReachEnd:c})=>{let f=N=>{if(N.key===null)throw new Error("Expected all children to have a key");return N.key},p=dl.default.Children.map(e,N=>f(N)),h=p[0],[E,C]=(0,dl.useState)(h),S=p.indexOf(E);(0,dl.useEffect)(()=>{p.includes(E)||C(h)},[e]),(0,dl.useEffect)(()=>{c&&S>=p.length-2&&c()},[S]),QW({active:t&&!!n},N=>{n?.(N)},[n]),ED(E,p,{active:t,minus:"up",plus:"down",set:C,loop:a});let b=S-r,I=S+r;I>p.length&&(b-=I-p.length,I=p.length),b<0&&(I+=-b,b=0),I>=p.length&&(I=p.length-1);let T=[];for(let N=b;N<=I;++N){let U=p[N],W=t&&U===E;T.push(dl.default.createElement(eg.Box,{key:U,height:s},dl.default.createElement(eg.Box,{marginLeft:1,marginRight:1},dl.default.createElement(eg.Text,null,W?dl.default.createElement(eg.Text,{color:"cyan",bold:!0},">"):" ")),dl.default.createElement(eg.Box,null,dl.default.cloneElement(e[N],{active:W}))))}return dl.default.createElement(eg.Box,{flexDirection:"column",width:"100%"},T)}});var C2e,th,w2e,TW,B2e,FW=Ze(()=>{C2e=ut(Wc()),th=ut(hn()),w2e=Ie("readline"),TW=th.default.createContext(null),B2e=({children:t})=>{let{stdin:e,setRawMode:r}=(0,C2e.useStdin)();(0,th.useEffect)(()=>{r&&r(!0),e&&(0,w2e.emitKeypressEvents)(e)},[e,r]);let[s,a]=(0,th.useState)(new Map),n=(0,th.useMemo)(()=>({getAll:()=>s,get:c=>s.get(c),set:(c,f)=>a(new Map([...s,[c,f]]))}),[s,a]);return th.default.createElement(TW.Provider,{value:n,children:t})}});var NW={};Vt(NW,{useMinistore:()=>hgt});function hgt(t,e){let r=(0,KF.useContext)(TW);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let s=(0,KF.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,s]}var KF,OW=Ze(()=>{KF=ut(hn());FW()});var ZF={};Vt(ZF,{renderForm:()=>ggt});async function ggt(t,e,{stdin:r,stdout:s,stderr:a}){let n,c=p=>{let{exit:h}=(0,zF.useApp)();Um({active:!0},(E,C)=>{C.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:f}=(0,zF.render)(LW.default.createElement(B2e,null,LW.default.createElement(t,{...e,useSubmit:c})),{stdin:r,stdout:s,stderr:a});return await f(),n}var zF,LW,XF=Ze(()=>{zF=ut(Wc()),LW=ut(hn());FW();yD()});var P2e=_(ID=>{"use strict";Object.defineProperty(ID,"__esModule",{value:!0});ID.UncontrolledTextInput=void 0;var S2e=hn(),MW=hn(),v2e=Wc(),_m=RE(),D2e=({value:t,placeholder:e="",focus:r=!0,mask:s,highlightPastedText:a=!1,showCursor:n=!0,onChange:c,onSubmit:f})=>{let[{cursorOffset:p,cursorWidth:h},E]=MW.useState({cursorOffset:(t||"").length,cursorWidth:0});MW.useEffect(()=>{E(T=>{if(!r||!n)return T;let N=t||"";return T.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:T})},[t,r,n]);let C=a?h:0,S=s?s.repeat(t.length):t,b=S,I=e?_m.grey(e):void 0;if(n&&r){I=e.length>0?_m.inverse(e[0])+_m.grey(e.slice(1)):_m.inverse(" "),b=S.length>0?"":_m.inverse(" ");let T=0;for(let N of S)T>=p-C&&T<=p?b+=_m.inverse(N):b+=N,T++;S.length>0&&p===S.length&&(b+=_m.inverse(" "))}return v2e.useInput((T,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&T==="c"||N.tab||N.shift&&N.tab)return;if(N.return){f&&f(t);return}let U=p,W=t,ee=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(W=t.slice(0,p-1)+t.slice(p,t.length),U--):(W=t.slice(0,p)+T+t.slice(p,t.length),U+=T.length,T.length>1&&(ee=T.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:ee}),W!==t&&c(W)},{isActive:r}),S2e.createElement(v2e.Text,null,e?S.length>0?b:I:b)};ID.default=D2e;ID.UncontrolledTextInput=({initialValue:t="",...e})=>{let[r,s]=MW.useState(t);return S2e.createElement(D2e,Object.assign({},e,{value:r,onChange:s}))}});var k2e={};Vt(k2e,{Pad:()=>UW});var b2e,x2e,UW,_W=Ze(()=>{b2e=ut(Wc()),x2e=ut(hn()),UW=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return x2e.default.createElement(b2e.Text,{dimColor:!e},r)}});var Q2e={};Vt(Q2e,{ItemOptions:()=>dgt});var wD,tg,dgt,R2e=Ze(()=>{wD=ut(Wc()),tg=ut(hn());YF();qF();_W();dgt=function({active:t,skewer:e,options:r,value:s,onChange:a,sizes:n=[]}){let c=r.filter(({label:p})=>!!p).map(({value:p})=>p),f=r.findIndex(p=>p.value===s&&p.label!="");return ED(s,c,{active:t,minus:"left",plus:"right",set:a}),tg.default.createElement(tg.default.Fragment,null,r.map(({label:p},h)=>{let E=h===f,C=n[h]-1||0,S=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),b=Math.max(0,C-S.length-2);return p?tg.default.createElement(wD.Box,{key:p,width:C,marginLeft:1},tg.default.createElement(wD.Text,{wrap:"truncate"},tg.default.createElement(xW,{active:E})," ",p),e?tg.default.createElement(UW,{active:t,length:b}):null):tg.default.createElement(wD.Box,{key:`spacer-${h}`,width:C,marginLeft:1})}))}});var V2e=_((VZt,Y2e)=>{var ZW;Y2e.exports=()=>(typeof ZW>"u"&&(ZW=Ie("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),ZW)});var hBe=_((yXt,pBe)=>{var oY=Symbol("arg flag"),Yc=class t extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,t.prototype)}};function UD(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:s=!1}={}){if(!t)throw new Yc("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},c={};for(let f of Object.keys(t)){if(!f)throw new Yc("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(f[0]!=="-")throw new Yc(`argument key must start with '-' but found: '${f}'`,"ARG_CONFIG_NONOPT_KEY");if(f.length===1)throw new Yc(`argument key must have a name; singular '-' keys are not allowed: ${f}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[f]=="string"){n[f]=t[f];continue}let p=t[f],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(C,S,b=[])=>(b.push(E(C,S,b[b.length-1])),b),h=E===Boolean||E[oY]===!0}else if(typeof p=="function")h=p===Boolean||p[oY]===!0;else throw new Yc(`type missing or not a function or valid array type: ${f}`,"ARG_CONFIG_VAD_TYPE");if(f[1]!=="-"&&f.length>2)throw new Yc(`short argument keys (with a single hyphen) must have only one character: ${f}`,"ARG_CONFIG_SHORTOPT_TOOLONG");c[f]=[p,h]}for(let f=0,p=e.length;f0){a._=a._.concat(e.slice(f));break}if(h==="--"){a._=a._.concat(e.slice(f+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(C=>`-${C}`);for(let C=0;C1&&e[f+1][0]==="-"&&!(e[f+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(N===Number||typeof BigInt<"u"&&N===BigInt))){let W=b===T?"":` (alias for ${T})`;throw new Yc(`option requires argument: ${b}${W}`,"ARG_MISSING_REQUIRED_LONGARG")}a[T]=N(e[f+1],T,a[T]),++f}else a[T]=N(I,T,a[T])}}else a._.push(h)}return a}UD.flag=t=>(t[oY]=!0,t);UD.COUNT=UD.flag((t,e,r)=>(r||0)+1);UD.ArgError=Yc;pBe.exports=UD});var wBe=_((JXt,CBe)=>{var uY;CBe.exports=()=>(typeof uY>"u"&&(uY=Ie("zlib").brotliDecompressSync(Buffer.from("W7YZIYpg4/ADhvxMjEQIGwcAGt8pgGWBbYj0o7UviYayJiw3vPFeTWWzdDZyI4g/zgB3ckSMeng+3aqqyQXxrRke/8Sqq0wDa5K1CuJ/ezX/3z9fZ50Gk2s5pcrpxSnVo3lixZWXGAHDxdl15uF/qnNnmbDSZHOomC6KSBu2bPKR50q1+UC6iJWq1rOp1jRMYxXuzFYYDpzTV4Je9yHEA03SbVpbvGIj/FQJeL7mh66qm3q9nguUEq1qZdc5Bn12j6J2/kKrr2lzEef375uWG0mAuCZIlekoidc4xutCHUUBu+q+d8U26Bl0A9ACxME4cD051ryqev+hu9GDRYNcCVxyjXWRjAtdFk8QbxhxKJvFUmkvPyEM1vBe/pU5naPXNGFth1H+DrZxgMyxYUJtZhbCaRtLz27ruqft3aYkgfCKiCF2X2y+j35IelDY2sSHrMOWZSUQ/ub3Y5mPrFirEXvpHAx4f9Rs/55yglK8C2Wx18DfjESbpWL5Uxafo02ms1ZJqz/dtngtnMql1YJ+v71s08jzoZlHGNE7NvPPiEXF3le+xheXLcUhOThn/6HG0jL516CHg6SeKYP/iC4fUokGT71K5LM7212ZyHT2QzO2dMJGJ1tpT7XjAjQYVWBIR2RJBjCjJxuzntxFq6x96E/kH0A/snZ/1w3kBnPChH8d4GdAjrG0oDZrAfb/C4KgIV+fEmjqxTLdJnB4PF7VGbJgQxu7OPuYJkVxZ7Bi+rub4dQCXGP+EAZk/mUFvUvi4pxd/N0U/HHhuh3F4lj5iO6bVyhvIQyNSyZRtBrzQOMO7JFSRbHsfiNEDB8IXTG4CSDMi3KKtNtQqRCwbDtpfUezkpqP+JuqmwsuZcL2NkgQjEedwMnFr6TCWRvXQwPUXAD+lhMwu+lNro/7VpwXEtxj8hHtrXMOADNQ4cFD7h+rxUrlZko0NfmIb8I54Nos5DONiyQQZmP9ow+RKkJ0i1cgfUQ4aUBgwp+rKUzly6REWSPwLqbpA+zAVnNGNZB8Uu1qeJ6vkhPp8u2pwbnk4QZnmIaTvHCgzBbcRDjvDv2eCf6WdNfch/zVQ+jk+T+kQD6NLl38f7xoh1ZEDAryVb1wCLBHFy0aE3FuZY73LGF3dKslVQu59ysM5G4pYvnKAU9damJz/0eknF708c2eC6wBHcdur37hekn2fh9EgmYq/4RWTQHrNglQkyMyDBAoFL+hHT3BjXoy96O8psGR+QTvg4XW5KdjMGCj0atxV61XAJlhVBWA/HvRqn+8qL4h2gNT9Yj7mznFCcCaVC6Uvr6DLEmJcs5J6fPPjBB8kkPjz6vQ4AmU99Vqs809/uySk4TSwfKNaXmfh0UsyzkMy09SgFWth+lu7VtImU9KhadmM4sd5KZZ2jZW/I2qLTj50XNwv3jOwlLMU69B22pogDPr1gYaobzhO+HRC6tF0ryj65xKZ2hgiQOI36RLUjllTXiDVwG8UKh+kgT6u45VlC95L2DZXrPln6Uko337svBb6fCfIF+p/F5+YeWijIfxC4z0qcEXZsDAJnXWDqKtIuVjmya4DHUjndKETXIMIHFKCFAmcsVmtu99MVy37vZRymW3R9rJR7/+82E484JOGqGW0mJDAo5bHOdYZjmS2DXSmhOCfs1LMQXjpoyEHpEctD1t2lmXU9QqlPY4Wb2xVynNDz4PcGyFK9+5Dv9ZKh9cfz0lr7A2S4g6g/BGTGzLJW7pxCq7Yoougq4Uzu7gVbfeSI8FCIj0OJ5BDmPpI2ioFgE4Q82q0iREfbgxfrEUz2gmkxSPRF2Z0uylN6krioG0dMdUewkyUdKRoGT2czC2BSmrmlf67wzXCu6+hlENc0YAAHnU8ifl6W4VjxKe3Gwn24DMgiG+HwWQrBnLSnsZ86BxcsDTk3ARbIx+yAZSPA0YffDCJtGaiC6JIqqW4IHC6NikeQ+A8+Iyq/LIan+Tomj4e84V+3DedENFS5MC9eqkCuh1fs9cOm6BTseTMjhtfPXFoTzAk7cpW2qwpSL8fHTeMSHVXLdUWrc2aZoqNOLevM3c5KGk8XFvCPZ7k+WyP5putfYT9bhWBHwyy35+QqoY9xAyeSiyN/Ow+de8dEVxjiO/1/TdUwIyC4LBQgjzh9NSDX1DFDVj81S3SNrrcoskAwU+MfkV5qRqO3GSCUCiPAkBBqqlSRWct75lqe4fTsrja5xDx8KNq26ZgwXNkKn69zIjzJ76RGpANs0ahAwhnfp9QPAk23SNIcHP/nVWhaJsIcXf7P2ZQYfAtgxIp5RAqdVVk3T5ZyXzGUUPyQ5DcHQpCOxCiyk2lFkLtOEE0xzugED1vI8S1U/4Y5jlZgGVM2bvTY8xPPpsvuHu5KyrEecMGIigi0WOLtR5g6OD95i9BmSl24ORZsYMf0ZusSSNq7qSRpQCLUe2BbB40bdsFJBmrLH+FXLczUK0WyUf9B0xk+lYqk6yXzmQYPVf3e4xlUbETyNDp7m59l7XHZNtJpbcgOMYLatBVKxjLGKSMIc0s3R1rZqWlHgABmx+eRyqfgqrt8T0AMdw/j0OY4oX9D4ymSMsiD6cJvyyQEuJKxB+tI0MNcy9784oIq+H+n6FqEZl1wihMarly7SOuO3KfrI0BZudTh6W6FPhx4m5eioQazCRNsnfFn1jRymtjVt0htfNi8QOOi79TUBwqDfqgtH7ms/mPCuZ5deTajrWhrxFlk+yYdWzpcHjuIk5S6c0pvA4RWKQhW0ZrlcpTLGiiihb227YY4IsOUOpafaanHlrFz7L+kyXTB/vMKf+wOcJrKJvpq/aDf2+oNNC9Nc9wFQP9BZfh68s3LsbQfyIlBOc95FoUOAeTW23njcxvoxurud1/XZ6IdaTrP3vsJ13AATa9njnpzaW/4ICcmkU+INciDjNr6DRTLOHPIOzF7HzXtiXFsainupUGqfh8nIUW1vGlbYBeAwn04D4NPsjJYFIrzko/1jViy0NwT65o0usO95lc/3sz/HM0lqNSFrepApkLuArH7MLk4Ud2FpCkHxxlVt3rrBOMa8tQt/aO8s6UaNd1oE9Mvb1ZfjlY4KdXhvNNHXKM5S6zxuj93bUaUFTFs0hXlBIyzyvhqqwtH3J57JCDfVqilT2+4v1T7RV/lc1IMp3jGuhyfkV6Rhd3OCiE7ElRGRCEDNHXazuEzKPP9lfqZ4l/rrpuXVydf/Eny+O48Cu1LPqAb3hPsyELxbyuE/EmXNcy0UNUFcsWhYzAY09S3+HOthcOAFEbCGK72x47AIAlbKq1LOqxZyGnOiLqTIzF82ko/YMPdZA1u35gWi2dXytsg6Dx73BLHPvNbr0+ZbGWhn2K8Jng+R75gfUN+TnNozA27QvgezhtGt3cw465Ve1o6BxRtgYL/mZIfKl2N4Q7I9rchlh+uVgH0tVBdKxp3lySqXkD2YbQzzh3uz4xRdomZ1A0OH9IGa1Moud+rbztgKiAzHAxOOTNxy+ZtPWnPWTHFDmlIfZMmvpU7jOtakpxejjhh3gYIcd9vH3766rS4/UFJnzFQuS0BeljjW9MY2mGhjFisY2jAFticOIgG9ntAnTVOx/Yy5wYdIMjLjLXrvgDQUGJ2runk1niyi1G0LrgH4rFw9bfuT6UzCP+8QwxdNPdnDsLWzHkrwSWt/EAfY6AZevfFPtcMsZU4t7aWrvJLiN70CzN8AUHnfzquATdPr342AYsZJj/rQ72YddOnbdf4ZzY7yPw7cgZmQlSBdfDqfJPpqzeNOPVaEY+l/2XNAeCstnNhZQKwtmH6sAAXfl9yuVJTi/magBJAxUbivQRKHCyxBmEl8pPIyk0MPq58LYx1iJkVg9Iu1/yLotS1F4y2fD1mm3CQnrphi6KURxydEshzi6W58CRn7afwPntq4bq12rzdlnlsD5AZMAyRK9fQbQNR3rAdvfG8eZ1/n49icsiUssBfYXK2iaVlUfYTkZj8RMpBxtxdRlWMQdELGlRPqWZl5tRPf9fJ/XNgd7YU2olh2VjW/2gfo+va+tfFyeFjvq5tvTMtNkHTcqKR5T/YL38aDImuvqm10LfhjkhzJpP2K6G/7Qz/MFdWlNGiycVs65WCOOXqVPufVResqbv/sPJNAktAUAwPhi63Y6F9EJDPBVfDmEQVpbSmcpl0j3HnvjFA3L2msqZBFphCBEaxuBKrmeqAtKa2iKoHEdDJ9Re1Jrx4j8QT2ybiTKEcJyHLIHDJojd9NcftJIuh2YHY0x6Bb++6Dtf73UpsIZgrnS9nakE9ayWlk/r8Xrn0ibW4deGgt/KZT7x/2x6RvB2ShOP7WGVQMNDVgaBhsnKr5ToiegazDrScH4zauteqNk3sSykTXx1cR5MShxFZIHlDrqsHJWesyrJTQuNJx3mpA1nnINBmWSVchFUD9VXSX7sfHXHd1lEiOGTPrlOZQvqoU5V4gAKctLd2jLXOFtZ5fCFa7OBcZaKHyJQSBUARJu/+vkVkg+ov0n6lYKPFHQ/Gakx0ns6IWc4q3pt7r5sN39Is12vWpTncKUOPL+nqmgO8T6zm6Xb8Xhcil+8mSH5ZNVnWpD4GdqwUP2FkiAZoDl3YBlwPHA2HKLD81OKdAeDXVGK+EJopfaq7XkIzhqBWRh6whrxOusdiIV1tbhid5K+ZYeB4HwUhV1v2P11U+MAOWZGNYlXX3eMjD1fm6kjSGKHa72+lLHiMM7K+dEhVNDTc51NUWwSsXcx3c84m0RLdbxv5g8h3R4D2/1BbYbT7zOCo5dXtmzSmHViTZxvZqbwz4jSj6wc/sYabvhhfy73XKz26oz/+T71R/G1frWlc4obxqaDTWIj9HG98/3+rPtnE9tjas3Yyn9UhO2PJErMN7DKinTMlksp05+GakYwb4ZAA4zQZSqrGyHsktqctSjTpMtaVdA4DwemhPyrmwcW+0NlDL9MrhvGiOS+eVu4bCo4jj9d/SV0i1kFZ5CTs/WjOU6Ml9d3JAf6pE89rv73/vApw9U3w11fy0wbP0WCX6V8c7Bmr8t7vhpBemDewoSVo6ghefic5xgecP8ysYyB1QC+Dk2JoiXTkwaEIU1d720dCIf5y0SYm9l5quKY2Yv5LeiFNbtLS98NQJ5mQs12Cp7BsJHzT1c5GLsm+hdKkAzxKA7R7hGPuIauQaNttK6XTBT1OZG5cM6ovLs52W7MA/HNbkjpwAuvzgnrg3T+Df1s3q8GIwwxlHfYvXfxUKsTx5t4cEZxsk2700PH3l3brazpnHEDDa1MLF2q1QGTvUpRt5Xbp+OMr5USgxt07r7JXR95TxwfnGIp8ocvTW1d5vunjz2oyORJzC+vrJ1drWx3XfYJGe7VlkOVPoHuYz49GYjmCXQp9EtzfUaAzKBEBTuhkU0cPYMcpaoLK3XiQtHd+dz6/GxMtpNFEOIqr0AiJGrBH+Gp+sNad0n9quQM4hqu5ohrF2G1Szx6s11MVqJRvd3QlxH8+mQ+4E54gFHyoz5iuQ77qXp49kehksFrzuZSI40Y3aR3T/Z/OnRX2egHXHoibXzcFFK19vVfCXReF6ItIzYw+U1Nx6UkwuJpcdR47EGr/xKs8UOEyZ6V/eJxtxF/qmtW9265WzSrqwNewgxToBKfVnkUrJdmiQIaNqb9r+UDgDuArRTpUUPqMzysWTQQIJbd+Xr9V8aUEpZ0371aZhhI/84RfW+dmtpjRn+yQIllTg7FK5LV0lyUk8eAITuqxaZfESPTa/QEWwg9+66Rbpmc1CBY/Oqk6pNubyv5segdfcpYgTsEpbzVndcExR7oEc4eJRw57hvSNN+AqH8ziy3hOB19jKuML6MKFSCuRVcix9x84zYfUftMusmkOvyGNUGrnKM7tw5Wmrsih6RTdtXe8+O1S6E0TMl8bL59GuZcXke7MfxnQvRvECXjo+1BQOpd75XyPL9Yfm8fLNjZzbMwk0ZgqVv3bFA+7Qu+xFgxwsJbo83PhOeNr6Mcq18n4EtGQhvrzAwQY61aBoMIv3G/FBw/SgYaPrk9ng1MffgnFfcJDNP/5se7spF7Gox82SeuOpiPaXZZFnKIF/5zLH1TMGUJHR8ySsXitq4sIuBlyykqukQhDEiN2DRUBDh2Z1M2h1BQtmcQpxhs8HJ13hVVENSgG3lOPlazd3sYmG92GvbvPbpKJip1q+WDwbQtfa8RkSKAoaY2IgQoLo/rJtMq71UR2VJ5T6Y85hL0JGFT56IQmcCseQ8ouKnL0Vwrs0bxTpbwScO+JYPcMBt3zvI6rqGpHxkDDMm9yLuWS7gRlOktJMAq1M6P2pDQkNcx6QSTmuWmHwHYEgskf9zZa6WdV2o23rX5hg78wKfLDaBkXcnI6ylSbSp+2NEzZ2NQOCt8NQGNc80A5OulHFQhCx8WkzDwEvXT419TFAuCmp18MmKi0ydLVgc7MPg6wnWJ51o6EnXvuOyp+/TJS56u6yiomDYxB3XXpSIxWyztaGhjqXYmOGcdu2bvO3UQcdXidioZ8lJawPuUAF+3VaoJIj6eF0KIrbdhZCmxWD2czpmWFKEMrycyV2MBqzr17lW7xVM/WdWWR/TkO941KAzOxL44QS9OU/M+5Py/kS9Jzg3d3/e2siuhogdsRGdGUYUno62enVUsYpt60mhAk2Y86s60H1QPA0/7U9nydqtBysJKQGT0WrdGcdUns62evVUsYrtHUmjMs2EVNi9Li7OKcOHj96u926XXb9AFnfg0lveGOVK6cWJuUZCQdM2WDBocMGB4RpkNVrvo321gNLF5WNEk22kk4oZaW+BmTxmd0QqgclRBtjJfCMoq8FXtRoFDHSKW0d5nxUtS+oABoxQc9Gg7h78va6jiDbpW7dwrVuEo2m9km21wjB1x61EvLs5trGzerpHde31jqvFWFp/cHhRrjnm2lAcCLsHxu/TsvafBu9P3vuT954F6Rpt25Gks9N3C4e2kfurO0y6v6/y9D7K0/s0T82aRk2bplVjlin5fpEdtwAql0Rk1G07gIufdqJB1j4w3t5FUPApCSdEkGznnFN/k6Ft2fVA5rZ0qVvQgDely/xvUvMgFRWKLUrcedIlqbk4VVnq4GvlqxyXhagrDku8eyTMEeKWnMjfW/94EspJUbqxpihAdFeLGbU8OzHdDcT/9Z7c0OY/vwHm6h4wc0fwj3w/2w4nCLptJ5MXXwad0U4YyFqFVitCvFv1IGnSo23W5yI4R3dYF2y6O0ze3oG6u/tRp7wPgyl57aYPfA7KJfKlgEmWlEkQl84CSFEfeHAnk5mhg6C6Fw/sGFW6Mo1pGPQWx+L8rzYlmce0abEbvNLIdGPj/JEvB4u7ow/zpzjZf36STbphaAbHf3YUksjbVSlOf1crtroPP5bOnfnydVL6zNkulKLzeEN7Cg+3k34rS9tTc670/JVgLvRawvNqKF/jfz/aZytcHkZ29OBZtQXoBGupMUboqsk59ai14cMpj3XHxVnFzFzTzuEyXuF/bnmKFvMTwYFG/UmoxS8ueocx3waoBBQ0G4KSOGHB55gKRMk8DNS5KxLExF7GTe9jU7wGN9vlFEeBD6lF+26RT6RInLpnDDmzERW31XTRHtxL2N7xoxb6onLubI49gVZ09Zq1x6C0t5mdk5WhD4LjxJ55oU7toCwbmZbLiCMR2lBcSk05iRcSma1hWDZdjl6tD94ohLBMSWwy2AbGyv/jbi7dLoGlT/ezqOm33fIA0b/aD18vTsI9I/N4HIIsxuU4uJe7c2Xj3R08xAjfKZAbbgibJqG0MjSEvWVDjki2UkNf13Vd13XUZC0DTx2bDwbsBH8fj2Hxn6DbLxEPq/QhLzcJEp4urxiMY8FRXecFSmDgL14S640Qkkhm+fzdV+xXWGM/p09EFViqjiv6KuiXzHphc4vol9T/UsKbIW5OB0bLOtsC4eR6duJtnxq8FgL0Lpb2B5aLpXyGjDHrCkDHMFTmn8sdIroYt/UVzIKjk0PhbBlisKdX5l/L1+wSG1cHztxB4XqXCgSDSR+TV7Oaxi448DHsYvT6BucMDab0e3AJM6gAeRCVHSNODMzz5zOIaOkle/XBj9NE6FinCSQ0r9ITp6mlDqKb7Ffl4A88ULI0Qp1awaBjjbwaNjId7GhM5vKZ4BQb8vzJnXnbEjajStV9ZlEnYp+8Tq5/az27/kPe/63evzvv/y7v3773POrXvx6DjGCuX2H1kcSQanT+WKPiUsJliz5KOWnC5wk9WtlvJcjJAmQ2USOgId3v/FZARaaO3jZadHXWqJNf9Chrfw8pjHoDJ81McWojt2MfyR0uO722bmS33+BDLNVDDXbIKGyZ9d3occQjO1dc/GhydaLE3ZBuyGdMvDiCkk4dx9G47sGU/sbZM7F6QYmOmLm2zvQyXV0fcr+Yped1XYdi9Ve12efh93r6EjM/DHkXkVq/DZErtsF/9zbH2d+CnbitS3X413Zg7t9DfDu1xEiWz66j5CVH/JaBKNZl2Uo79Uul1Eqx5nIXS/Fb72/3/i16//a975d58Zvt7Fc5JPT2anmarAlrp365mvUPoZ1S93AIK7p+waHQxZJIOzXbNGs2mqbR6ItJ+Zcs7Ko9BC9z2EBfFAtDOKfO6qJZfnNDFjdAdnqqv6fToPqZxig9IK2oNhX6hZTqIVGuFRt96Zr998DmmIdqnz3UlycZX/hnsVjV6Z/UYKJXpeHqK//49+ea+69+Y9DheUDnPA5RVw9nnh+gJ01XJrNjI+MmfyzWM2YXsb34d9x0eFoY4aOaWSOt+XZUtITHcMqWcE2v0v2ZqL5Xu1C8f3MBErrnQW05ul+zM7hk87HOqTQo1y+1znZ8UvvlU/fbMvKvj+Ec0Cv2YE/3W0LwoJvFgQPr9GUpjfYejnSnUJnRheU059qwNpKX1/RbakgJ9nKb9MuARm91wSk7wrb7lAWNEM6voL9MaLjsON1y2VA+P2Rh6rXMyJRspXjbjDretCxLwtqvve0ed0UAJclesqbidU5hxOL9IUu1WHeXZehNLzQMY+yfjIlGu3ArXU2LcpIDh0koQTTy/f/X69ul/mEyAr2S/PHEOfMyXbymM+Riva1xymz+fon2M7SEKpt5DOUz48NHqDB/7I0ILMB9Sk1n5MIp7OcrvIAw2epfCVC9UwyNSdl1Kx+x2IM9OMWgtAdQiKHeLax0/E0ZD2s52JOR+hEXA17aT9nSE0zFLExj3hUS5y0U5tPttXeNRUeWoaVHuht7j3knrVmLeIunqu3zqSZgzmdG+HgVKwNW9A8vCsuyFwzMOmdd5qHy2cBnCaG3AKokR0AW9RefKmI5BfHIVyw5s4Yg1DtB9xhszA270uiOCB8D+BenA20hHOpl/MVWCROFC1DAeQ10fu99qMpsQA8jfhDDoUqBCvJRW6J2pzqLnt8Mzoj/+ekeL2XRRgJhJ3qb4AXTV4aK/3Y3vY6DuN920Okd2WOPp08DfE1bQkBfPhf2f4DSORjXtwn7CaReEMU94zGEFKTW0gxHkFXd4qE5SclFXH4NMVNp557O+j7FT7iQMsPUhbdC4JFMphbansagkmu3SH+D8LNgaHeFLw6CrbEbe9Vvr8JjssSHy2DhhuD4J9OY24/T0N2HnjpwQr23izNcsz0OTSgl6HbYHxguT1X310zImOVKEYMeUTve3Caiih2i/Czr9SFu412TwspMTMhTno+cIq7hkm4/V5CUox/7c1LiVCYDfTsMn+WAjI9oYruk+Mo2Fo39BNc3n+Fuxm5sPUOUVNJY11ZkOjsYivrJcAqrKj0/E+pcq5R1JXIYouWzjPw4+8Fsa4xP40kzxBQRuX+KakC/OtjLXnhDoB98jWRcVUB0x5gjcQWCep0B31VeC+0coDBmXyeakM5adQ/eh/7DR3gxgfShsfABlCf+cKbAAh9HQze7MGeX+twMOnuJiQ+V+N33tl40X/z4OMPZbxu8iEMGUKL5peB+LtMHkAhzON15jSF9EsiaLx/i9SQyA52R4z1Zd04/SI7TsnSOQHSk2Idexi3ZU3b3iaPVM0mfFXp26lVupSzmHmPD3xtj+cLJZFNiFr+RpouhImOd70A4yRE5fwSUJds25rGVOMthYLt4Z2DSQFF0FQ9zmcrSfCGV/gGCU+jXsDv8b8QGX430pERs7CdIhk4yBwsLKgdIgbu0hcK5O8Jw1pMBa4ppsY9pAY6lQ/R5JbWsXMzFeY+nxzUeF0pNFweHkRrmg3sT+yX+zzad81iYfQIFKcv7qZ5jArC7UGZ8N9AUrzc87uCCavsUcfDghX26yBUJ7fCUD58hJ+f7Gsrlr0kDvDWVE81YkASoPUhifNjDekl9cHWdao+BmJNy4wAdUKtohv3KpWRhIiruWpp1zHYXYXjLs/gTOoqL5L8wRKt86ZHL8/uhqpz/8eFl8aLVkeWEkVAmh0IvSiFrMjlbEZL33lYnGjWSbveG/f5x/6X+I/0iVg3/Y/JMH08I895zjFmjl47uh99Gpo+wToBxddQPh1NszyEGDRSWwVzajG3tTtuqBnyMJouYE9hUF8UgvDKF+gq7LUjeLWNZ+uwVIIBWsoULBbto+RFS7N1YMgN9MbFBzQkuWhVEW+HdC6Z3sbtg3DwQa3MQiu3VnCXH1aTpb1lHY8/36jN7xdolzctdbjwZua2JJT12FSQJhM5JrMzdeKijSeVwHx8r7U9jSaED+XF6FzQ5dpthmAgOY1Rj+NkgxgNDkQ/AcHtrAQve1bcQLUwC3KUo5GyBTXRwvi+LMf1S5HDn1wTI/UnOFQiy7TVVD3755WuaEh/hRccyHVqVGR4o7Y6d1HakUEalTvswRZUYfWWbzdY36zTlQkk85VpLOQd3k9fUb+2EE4WyoHe5c7XHNnjP5wIBExdVhlh9miYTFY+a6/dlWUQU6N+HkvTbsv5mtRfaDwTwGj2I6MYz52z2o1fJ+/sGytq2u3e5crJzze4RDn+bVadJSgRec0QxcUQcHihrVCCK5rRVHGkYNTICvQWMqabLpiXatW69ON6sy/QgJ674u6+V+IlvY+ENFQoG81NSA7/6jObtmuI5gXPd+Q7Grd6WRVsIR9KCsjde2WZzkhum7VuwInzdrFTFRrqYT6DXkfQk9cuwN7jZOqAJHSj05LX8OQWzpo37SCt8WjBGYN50o0F76Gf+oFu7p73k8vE0vOuo/jjEm2O2BhwMHAP0+VdGTD8P4PH4D71h5BkJKXUGNH8CJFoGLT8zJWij5g95rjeJH47SO4yW02WexMt7zR2C46ThSWcSm2JqWjT+GG7AcgvHQadqUcDKjdTgE4Ub0tqlEPpgKTmZNw5Jd1DAs3rKAzp8+0furclUDr28+5dZUW/ybEfjBB1++nHXKXtuk+nz8sW76+dLvLtycDstCBCmkspzzcjvTQI8k2ho6fE0WKsuq4LQfxmyVjnHcKLJi3T4/vRqNd0ozdijYGNzct6ITHM6ORtfniyESPNWMBTbWRxSNGkFv8uZqfxpl42DVOGkrvP/ssJ1gbh9XdnQiSRXTq/kmpw7H7LM8XKtXwxfvoYW0APq+JvGSv0M+5lUhiAzwAq8O66O0f8qTS6MEIOUWjijJ0/ZCraxaJPhkpX49yAonqXZ8zAwX2tkIDp5IjjD2kvb1G6/QeVVv7qD5azxLHBpIWbI28rx6q+5D9nzUwkP2wOlDKsGw2/SJiOao4BPWyCXjRg2OXuPp228KdglNL17euvPYXUSGBO6FYxo42R6Ol7yNtW/MZD86somgsK1PR/IVstv3srrKUkbFnPBbpYYeNJs+p2w2fbfKnBxxi4zYK7cvr9ckBhxe+otENmKYn/Hh1YAZQEdReEZ5ZBRnwCO/G6kdDYuIw0Ewd60xZpkj209Bvh9LMJrLiT1tNsrTYy1wbxFCNgOzk8xPkzWye03VL3Jh6qQLRjTkth129p5IUhBfiDQyd131I/tLXEMJnRGwQBV2/X/L7Tv+VC3uYHo0zXq4CWw844CUJqYfDJLqkwaItbIreQF6svTa0TNvScy8r0j7VlLVqczG4USLIqC775j6VhD470dyQzM/16xBeQEy/X6tkgJQKSjL5N6J41QlPCxGHScYuYvTpJGcdVYq+bObbZdZK4v3BtLj3Vc5+/lTWrcSfyvc8LBExCmWLfJviNBX8c8ixX6VGS5VYWp0jjli1CeUgoHzA9zkDBbBM54ESqVKQecS1vWexQpK5UIsOMNSa8NYkRp25MkRpwF7OIQyAb9X8sZuPXgmsD1jbSFA+uweZsQNqGkYVPkBXLSphKJ/C2lIHdCfVKfqbkqTyl5co2vummREV3HZ+qbZBG5yG4G95Znbq56Dh1zYuOGWXhKoRyb+Fq7KYYV9bVJUk52DYc3VFLhlL6Qbkoy8G2Y0tCpCwXcwVBxu6GeicCChN24faPn9IB8cUD+hp3kvjKceZpSsmXP5PCO5piSt/bn+PL/gjVPgvub5jOgq7nNIaA3OqQMljSz8Vs0rD9t2BhzyPEOmpLsqlFtyJQZL8zLy1xJiDiVKOcrWuUdHtDEfILHwsqHsjuc8FY1AQqqj9eGqVtxRTYRMTGYUZPE4S0WfJ7DiRMfTADsQnDHlF+OA64ySBzOxLfNpOdwckf2zFgMQtG7JaygfYm/Xvw9GLu8hdlSf5mZO8coUGi87cEu+Y2LcFASUicf9TgShhXtYI3pZqFK75aBuQY4QLKNtM+1d+law/utG9LwahWnCLwRv2mZrbU9nOtnqcE70KSReJShsp72y7S/NvKWAfQRjoi1hHYvXngDd0xJtKeAJg5TRRkrhIwdD2+5YDWTXpv6DWka7njyJ3+KJ3+ql3gDYkvh5wUtLDo7+x9ieXW7fMMHUWgcF9g4dzHAQDaKZEPGOivoKFfwWcBZEKSo9f64bgDtRu+MPsXwiyfxVF1+9ouXD9TfFJT+mvASGsFIkW04E4Pk6QFt/jaUtQ+ZUuzJm9j6/E1sfV68/A43r5150Wch4uvNOOkKwHBFMfC7OBFob4hFCGp6WE7iMnUzu+OULbC1d1CLoInDP8ACxjiWgSE/N6YVpp7avokMwyJ+T72/AKOx0QfXthxqCYC8cSJmmpAjbQEAMqTtI3Sc4z8IyLiqpdSijDyR65ax/vmBXGOjz03+f8tZx+O5Pq6N68X6jbUb6+X6zbWba++XA1iv1+1SNtra53qtx+VDZn2YHxK7fIHWrz98HTqCd60G6juzQjrYVZbhi8pE3/QYc9NomQ0Ez+9ELpyaKyqpDcrLMGJxPKsFO6YEofopC46C2AU7LtgY3R7Jod8407Id+KwUE4DZ5JrV7K42vTUGtSV/5+TE6t3TkI8mEcr80pHiDMQzGQ1hxfO/y2KChIqxdMavftJ1c9UFSCMVMDhdHj4AcSbd8jJoOKd4kMTB89rjpiZbMCu3kS53nzKehcAb3L+r+II9l2iMFRVUVD+ghglHv0jaQVzLFJXt3QS763tfKo8V6UTxoNRxEVVDX5FLgavrZibQVdQMDHbs5/+WxpStii6woTFaBmXZFROE9Cc3+y0pEAdFxkpOzSBsLtPtWNJKigbwPmO1C5k25PgE3hLaORZi10reiVD1UnELZIw6fn4pYJGMoyUlnw4c04dUt+qZptvBhw33Lnd2iZTSWh3rJtWIpPFc/3Qsy4lMm45lNy2aqY8+aC7gidvQhQrxfmuaAiWKtWtGY43OmmJYnNr2XYMaVcnXosYANFzD8uGEQjAUioJFLJBRFuXNuOukSso2slYR0KLSAhz5lY7q1rroavP1eEGAcASAWbjfnBFK9IswYgGHA5BdQjJew7u4ZXaC3QTgGcaIUYyPEiSucelWSTuXUiG1LMXM8oIR+RU9W0qjNFg6fBugXD10ZeHkvyTrC4Cla5/q5MLq9memnJ8lQjCaYJPvnoYyXm2ByZjV6ZOL7d09CEUvdcIvF389YLM5OPeyxfBWUjiPqMfIGvgOBfjPGQW12cBc/YzZbxgYu92wRiOrYixVM5dG6fmqo6ZX6CK/bqqHboDFCUp73KU/YIS7DEu6Unw0H6X96WuVb2l36CMPyTLgjvFdAFCTA5kmyl1S7/mZ3xOqv651jJX+TnIfP193JOZKKEWTMhhvn1StNy/Twhd1gpgysTnFNWFl5O6/5cP/R2zcJU9ikalZB8sbL1Z4Ok5UqgiX/ZQTaOO+5+zXNcLvODwG2b+8dHsI0r9OSS/UZ0+h01p/chHZu2TvLVMaEqJxkyj10YV5yHd58pbHPIclCt5CeKNcMx5kSr+GsBUhcyT7lr/mRnyR2Sm9tpjpf7a3oR+H00IabdcdATsFp/9yGGPCLqqwyl6lpt9D97XV5mjcim80uvhG6AXM+Ewx4CBr4XXIIwZsYzkWKHrwhWZJM+ztSWXd2ErNAGPs+ZFpa5NxBrm8rN0tHrzoHNExuwMoB6SdGGldMXKFhcy+q99NjgYngNDKRu/vTPALyd3ZcCWg+pv3uW7lylwtESPVrRTHvPIJI9lH0z7FB8MQN0tddxm55q+hZSlHGn4HTIn1qYnBdytlMSEyfTXVh7rpRGakuXPD0vtF8W3QbN8GXgUrwbCybkIaMR9UGREBwaoa8M7qqGTpuHj6ekl9tZxBBouoxbJlLapftgCK1NIrtr6K9YBROQ1UBbINXOiw0wZ5r9zagqRBDFMQFyvzYFnYh8Ig5NoqlDFqSEd+WHiCEAafi3IUpXVePI8oy9fD7QDRWKpQMrIqyRqLMSAn7evHjrNRNKspUBOCq2ytGVeT8T2eOTeau8+WOvHmiLE/AOUmcgVQdwJVlvDgr8UFuw7pcXJArQozzSJo+2DmaKYphScNeSxACQsp4f1xmomLafbNNzK90dk4tdjwL9inPgZWECkUUjcBKLkATF/pFDq3q8VP1dnDEtXN6Ihxx26oXeBRLim6qo5s7nyCeEWn9uc4raEXSDlPqk/bHO1i2XXkIP/zF9RvnkQR1T4ftxeicKzDz7xlegnxpauHhn1hcP/Emh+vsw2CVHWC4V27XblqaC/xkO4YPJP6LpL6KEyLE9VbxKK813gqpcNy7oalqhJ92RanoMF1xUVtyRG0U31KceJT0bR5h8su5sVyAHil2LnWe4QPLNbS1lk5FefiiG2b3IX12+Ez+3Z7RbSvqVxtWcghZBStcIfYtE4wk9ZR0TB2axfOFw3iX6FdlE8tJFwqKr5D0HGTnZ3zvS1qvLEybAAHRSseffG3+vDgpSuyckW9TQTYbPc05tmGMPtCymY/OwC/7KqvBxPavQi/2pToMKv3ysfwamTLeW4bZrqKADs4q67jiKN2/yyucS8StnHeTg/Lm3VqVUHAVfyb0yLTUgpwCgBLocswkQtPaQ8d+y6cBWs1Annqp1igcpQLpghOOVHYg82cXYEYICfygPOL5hvAd9ShDTg5xbEaVI4yaS2ZQQ3+DYY1n1xCJa7Ue2KRIeZIgZQBem1NmIOBfPvonVqOs77IChs0HqPbdpjbrlhTT2YRFnSfOQcEsQG+w33eotwEpkbN3MOv8VvQIfmuY7vd1kG8WnVvzMxnZYubJHccY6zt3Iqw3jp0ehCj26dOpVzveIQ+JdBs7z9mi1F1WRHbG1nCZKkjzXeZWRsmAVuV63K+6fxczgXicHNOJ1byuXpDxgsiM4vGlf37hbCEojg5vBE/THcQU9c5ulMBqczQkatKAOyj1PTEHtuASZ7plKRQ86aNZPWcDTKBdjsZ8Q2H5ayc9oD/mPycHq6U+1y4P8yFbZkvfoLHvnE+hzdismty7Na2YWmYHREuaa7nfhBpxqKVsf0TI1f917qMKTieUfdlNsEnYhT7TbcgKFvREH46deSh9qjtW9KUSpPOWMqONNPcL1F4LUzN2UCO89sAnoX1H/WtjHdkqMtYzswsd1El/me4hRszg6YO0GgWxNuH38Tm2nUIAdMxaZmEKJ8L4rRiAe5WH7Hg8W8njHEcVDB2flFwshvQiuTLoN0XbKrhWHNW+CSKj/6oZf6TL52UpV5UHr/4fY3zbEnkSctnyS1fq8mlfy7IDBeKTRksjn5uKai+tWArnq4FyLGWTCS9Ajp60isRCoFJi1+ndJekdhnWAhnveiA6icBgsxQzkEVrAjZALn3tw/1UmTqKt8m1OdOY/v38fB3j4mcnBX2rrU1uGtLz+9jTF4/o6Ytlk4O5NiiyTKBCLOwKP7HhZqG1fQnBYtxks9dVZRHYDpVvtIokwERT7NPeSwnKqAWGHxPsiAL6YvVI+BBMtunYk+99NOWWtyiadeaGwCbDFz+OFqnQM9GPHlQ5/Lnt3tnrRWyXyaR/4mO/E/fv65K911gFohqGSVGLnzgM71eBIw8LF2+BLqq+mPqi8ovIVdliBIwN+MDY4zKOxfyM4zPjWIdHsZM19d1SrB7nmiLRA8+AP2XBcFaAm6B/sJ2iJA8=","base64")).toString()),uY)});var PBe=_((dY,mY)=>{(function(t){dY&&typeof dY=="object"&&typeof mY<"u"?mY.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var QBe=_((Y$t,kBe)=>{"use strict";yY.ifExists=mdt;var Dw=Ie("util"),Vc=Ie("path"),bBe=PBe(),hdt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,gdt={createPwshFile:!0,createCmdFile:bBe(),fs:Ie("fs")},ddt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function xBe(t){let e={...gdt,...t},r=e.fs;return e.fs_={chmod:r.chmod?Dw.promisify(r.chmod):async()=>{},mkdir:Dw.promisify(r.mkdir),readFile:Dw.promisify(r.readFile),stat:Dw.promisify(r.stat),unlink:Dw.promisify(r.unlink),writeFile:Dw.promisify(r.writeFile)},e}async function yY(t,e,r){let s=xBe(r);await s.fs_.stat(t),await Edt(t,e,s)}function mdt(t,e,r){return yY(t,e,r).catch(()=>{})}function ydt(t,e){return e.fs_.unlink(t).catch(()=>{})}async function Edt(t,e,r){let s=await vdt(t,r);return await Idt(e,r),Cdt(t,e,s,r)}function Idt(t,e){return e.fs_.mkdir(Vc.dirname(t),{recursive:!0})}function Cdt(t,e,r,s){let a=xBe(s),n=[{generator:Pdt,extension:""}];return a.createCmdFile&&n.push({generator:Ddt,extension:".cmd"}),a.createPwshFile&&n.push({generator:bdt,extension:".ps1"}),Promise.all(n.map(c=>Sdt(t,e+c.extension,r,c.generator,a)))}function wdt(t,e){return ydt(t,e)}function Bdt(t,e){return xdt(t,e)}async function vdt(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(hdt);if(!a){let n=Vc.extname(t).toLowerCase();return{program:ddt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function Sdt(t,e,r,s,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",c=[r.additionalArgs,n].filter(f=>f).join(" ");return a=Object.assign({},a,{prog:r.program,args:c}),await wdt(e,a),await a.fs_.writeFile(e,s(t,e,a),"utf8"),Bdt(e,a)}function Ddt(t,e,r){let a=Vc.relative(Vc.dirname(e),t).split("/").join("\\"),n=Vc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,c,f=r.prog,p=r.args||"",h=EY(r.nodePath).win32;f?(c=`"%~dp0\\${f}.exe"`,a=n):(f=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",C=h?`@SET NODE_PATH=${h}\r `:"";return c?C+=`@IF EXIST ${c} (\r ${c} ${p} ${a} ${E}%*\r ) ELSE (\r @SETLOCAL\r @SET PATHEXT=%PATHEXT:;.JS;=;%\r ${f} ${p} ${a} ${E}%*\r )\r `:C+=`@${f} ${p} ${a} ${E}%*\r `,C}function Pdt(t,e,r){let s=Vc.relative(Vc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;s=s.split("\\").join("/");let c=Vc.isAbsolute(s)?`"${s}"`:`"$basedir/${s}"`,f=r.args||"",p=EY(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,s=c):(a=c,f="",s="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") case \`uname\` in *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; esac `,C=r.nodePath?`export NODE_PATH="${p}" `:"";return n?E+=`${C}if [ -x ${n} ]; then exec ${n} ${f} ${s} ${h}"$@" else exec ${a} ${f} ${s} ${h}"$@" fi `:E+=`${C}${a} ${f} ${s} ${h}"$@" exit $? `,E}function bdt(t,e,r){let s=Vc.relative(Vc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,c;s=s.split("\\").join("/");let f=Vc.isAbsolute(s)?`"${s}"`:`"$basedir/${s}"`,p=r.args||"",h=EY(r.nodePath),E=h.win32,C=h.posix;n?(c=`"$basedir/${r.prog}$exe"`,s=f):(n=f,p="",s="");let S=r.progArgs?`${r.progArgs.join(" ")} `:"",b=`#!/usr/bin/env pwsh $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent $exe="" ${r.nodePath?`$env_node_path=$env:NODE_PATH $env:NODE_PATH="${E}" `:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { # Fix case when both the Windows and Linux builds of Node # are installed in the same directory $exe=".exe" }`;return r.nodePath&&(b+=` else { $env:NODE_PATH="${C}" }`),c?b+=` $ret=0 if (Test-Path ${c}) { # Support pipeline input if ($MyInvocation.ExpectingInput) { $input | & ${c} ${p} ${s} ${S}$args } else { & ${c} ${p} ${s} ${S}$args } $ret=$LASTEXITCODE } else { # Support pipeline input if ($MyInvocation.ExpectingInput) { $input | & ${n} ${p} ${s} ${S}$args } else { & ${n} ${p} ${s} ${S}$args } $ret=$LASTEXITCODE } ${r.nodePath?`$env:NODE_PATH=$env_node_path `:""}exit $ret `:b+=` # Support pipeline input if ($MyInvocation.ExpectingInput) { $input | & ${n} ${p} ${s} ${S}$args } else { & ${n} ${p} ${s} ${S}$args } ${r.nodePath?`$env:NODE_PATH=$env_node_path `:""}exit $LASTEXITCODE `,b}function xdt(t,e){return e.fs_.chmod(t,493)}function EY(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Vc.delimiter):Array.from(t),r={};for(let s=0;s`/mnt/${f.toLowerCase()}`):e[s];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[s]={win32:a,posix:n}}return r}kBe.exports=yY});var TY=_((Ctr,zBe)=>{zBe.exports=Ie("stream")});var eve=_((wtr,$Be)=>{"use strict";function ZBe(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,s)}return r}function cmt(t){for(var e=1;e0?this.tail.next=s:this.head=s,this.tail=s,++this.length}},{key:"unshift",value:function(r){var s={data:r,next:this.head};this.length===0&&(this.tail=s),this.head=s,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var s=this.head,a=""+s.data;s=s.next;)a+=r+s.data;return a}},{key:"concat",value:function(r){if(this.length===0)return AN.alloc(0);for(var s=AN.allocUnsafe(r>>>0),a=this.head,n=0;a;)dmt(a.data,s,n),n+=a.data.length,a=a.next;return s}},{key:"consume",value:function(r,s){var a;return rc.length?c.length:r;if(f===c.length?n+=c:n+=c.slice(0,r),r-=f,r===0){f===c.length?(++a,s.next?this.head=s.next:this.head=this.tail=null):(this.head=s,s.data=c.slice(f));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var s=AN.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(s),r-=a.data.length;a=a.next;){var c=a.data,f=r>c.length?c.length:r;if(c.copy(s,s.length-r,0,f),r-=f,r===0){f===c.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=c.slice(f));break}++n}return this.length-=n,s}},{key:gmt,value:function(r,s){return FY(this,cmt({},s,{depth:0,customInspect:!1}))}}]),t}()});var OY=_((Btr,rve)=>{"use strict";function mmt(t,e){var r=this,s=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return s||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(NY,this,t)):process.nextTick(NY,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(pN,r):(r._writableState.errorEmitted=!0,process.nextTick(tve,r,n)):process.nextTick(tve,r,n):e?(process.nextTick(pN,r),e(n)):process.nextTick(pN,r)}),this)}function tve(t,e){NY(t,e),pN(t)}function pN(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function ymt(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function NY(t,e){t.emit("error",e)}function Emt(t,e){var r=t._readableState,s=t._writableState;r&&r.autoDestroy||s&&s.autoDestroy?t.destroy(e):t.emit("error",e)}rve.exports={destroy:mmt,undestroy:ymt,errorOrDestroy:Emt}});var lg=_((vtr,sve)=>{"use strict";var ive={};function Kc(t,e,r){r||(r=Error);function s(n,c,f){return typeof e=="string"?e:e(n,c,f)}class a extends r{constructor(c,f,p){super(s(c,f,p))}}a.prototype.name=r.name,a.prototype.code=t,ive[t]=a}function nve(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(s=>String(s)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function Imt(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function Cmt(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function wmt(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Kc("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Kc("ERR_INVALID_ARG_TYPE",function(t,e,r){let s;typeof e=="string"&&Imt(e,"not ")?(s="must not be",e=e.replace(/^not /,"")):s="must be";let a;if(Cmt(t," argument"))a=`The ${t} ${s} ${nve(e,"type")}`;else{let n=wmt(t,".")?"property":"argument";a=`The "${t}" ${n} ${s} ${nve(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Kc("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Kc("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Kc("ERR_STREAM_PREMATURE_CLOSE","Premature close");Kc("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Kc("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Kc("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Kc("ERR_STREAM_WRITE_AFTER_END","write after end");Kc("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Kc("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Kc("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");sve.exports.codes=ive});var LY=_((Str,ove)=>{"use strict";var Bmt=lg().codes.ERR_INVALID_OPT_VALUE;function vmt(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function Smt(t,e,r,s){var a=vmt(e,s,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=s?r:"highWaterMark";throw new Bmt(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}ove.exports={getHighWaterMark:Smt}});var ave=_((Dtr,MY)=>{typeof Object.create=="function"?MY.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:MY.exports=function(e,r){if(r){e.super_=r;var s=function(){};s.prototype=r.prototype,e.prototype=new s,e.prototype.constructor=e}}});var cg=_((Ptr,_Y)=>{try{if(UY=Ie("util"),typeof UY.inherits!="function")throw"";_Y.exports=UY.inherits}catch{_Y.exports=ave()}var UY});var cve=_((btr,lve)=>{lve.exports=Ie("util").deprecate});var GY=_((xtr,gve)=>{"use strict";gve.exports=Yi;function fve(t){var e=this;this.next=null,this.entry=null,this.finish=function(){Xmt(e,t)}}var Rw;Yi.WritableState=XD;var Dmt={deprecate:cve()},Ave=TY(),gN=Ie("buffer").Buffer,Pmt=global.Uint8Array||function(){};function bmt(t){return gN.from(t)}function xmt(t){return gN.isBuffer(t)||t instanceof Pmt}var jY=OY(),kmt=LY(),Qmt=kmt.getHighWaterMark,ug=lg().codes,Rmt=ug.ERR_INVALID_ARG_TYPE,Tmt=ug.ERR_METHOD_NOT_IMPLEMENTED,Fmt=ug.ERR_MULTIPLE_CALLBACK,Nmt=ug.ERR_STREAM_CANNOT_PIPE,Omt=ug.ERR_STREAM_DESTROYED,Lmt=ug.ERR_STREAM_NULL_VALUES,Mmt=ug.ERR_STREAM_WRITE_AFTER_END,Umt=ug.ERR_UNKNOWN_ENCODING,Tw=jY.errorOrDestroy;cg()(Yi,Ave);function _mt(){}function XD(t,e,r){Rw=Rw||Ym(),t=t||{},typeof r!="boolean"&&(r=e instanceof Rw),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=Qmt(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var s=t.decodeStrings===!1;this.decodeStrings=!s,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){Vmt(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new fve(this)}XD.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(XD.prototype,"buffer",{get:Dmt.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var hN;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(hN=Function.prototype[Symbol.hasInstance],Object.defineProperty(Yi,Symbol.hasInstance,{value:function(e){return hN.call(this,e)?!0:this!==Yi?!1:e&&e._writableState instanceof XD}})):hN=function(e){return e instanceof this};function Yi(t){Rw=Rw||Ym();var e=this instanceof Rw;if(!e&&!hN.call(Yi,this))return new Yi(t);this._writableState=new XD(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),Ave.call(this)}Yi.prototype.pipe=function(){Tw(this,new Nmt)};function Hmt(t,e){var r=new Mmt;Tw(t,r),process.nextTick(e,r)}function jmt(t,e,r,s){var a;return r===null?a=new Lmt:typeof r!="string"&&!e.objectMode&&(a=new Rmt("chunk",["string","Buffer"],r)),a?(Tw(t,a),process.nextTick(s,a),!1):!0}Yi.prototype.write=function(t,e,r){var s=this._writableState,a=!1,n=!s.objectMode&&xmt(t);return n&&!gN.isBuffer(t)&&(t=bmt(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=s.defaultEncoding),typeof r!="function"&&(r=_mt),s.ending?Hmt(this,r):(n||jmt(this,s,t,r))&&(s.pendingcb++,a=qmt(this,s,n,t,e,r)),a};Yi.prototype.cork=function(){this._writableState.corked++};Yi.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&pve(this,t))};Yi.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new Umt(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Yi.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Gmt(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=gN.from(e,r)),e}Object.defineProperty(Yi.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function qmt(t,e,r,s,a,n){if(!r){var c=Gmt(e,s,a);s!==c&&(r=!0,a="buffer",s=c)}var f=e.objectMode?1:s.length;e.length+=f;var p=e.length{"use strict";var $mt=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};mve.exports=dA;var dve=YY(),WY=GY();cg()(dA,dve);for(qY=$mt(WY.prototype),dN=0;dN{var yN=Ie("buffer"),ah=yN.Buffer;function yve(t,e){for(var r in t)e[r]=t[r]}ah.from&&ah.alloc&&ah.allocUnsafe&&ah.allocUnsafeSlow?Eve.exports=yN:(yve(yN,VY),VY.Buffer=Fw);function Fw(t,e,r){return ah(t,e,r)}yve(ah,Fw);Fw.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return ah(t,e,r)};Fw.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var s=ah(t);return e!==void 0?typeof r=="string"?s.fill(e,r):s.fill(e):s.fill(0),s};Fw.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return ah(t)};Fw.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return yN.SlowBuffer(t)}});var zY=_(wve=>{"use strict";var KY=Ive().Buffer,Cve=KY.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function ryt(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function nyt(t){var e=ryt(t);if(typeof e!="string"&&(KY.isEncoding===Cve||!Cve(t)))throw new Error("Unknown encoding: "+t);return e||t}wve.StringDecoder=$D;function $D(t){this.encoding=nyt(t);var e;switch(this.encoding){case"utf16le":this.text=cyt,this.end=uyt,e=4;break;case"utf8":this.fillLast=oyt,e=4;break;case"base64":this.text=fyt,this.end=Ayt,e=3;break;default:this.write=pyt,this.end=hyt;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=KY.allocUnsafe(e)}$D.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function iyt(t,e,r){var s=e.length-1;if(s=0?(a>0&&(t.lastNeed=a-1),a):--s=0?(a>0&&(t.lastNeed=a-2),a):--s=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function syt(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function oyt(t){var e=this.lastTotal-this.lastNeed,r=syt(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function ayt(t,e){var r=iyt(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var s=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,s),t.toString("utf8",e,s)}function lyt(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function cyt(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var s=r.charCodeAt(r.length-1);if(s>=55296&&s<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function uyt(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function fyt(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Ayt(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function pyt(t){return t.toString(this.encoding)}function hyt(t){return t&&t.length?this.write(t):""}});var EN=_((Rtr,Sve)=>{"use strict";var Bve=lg().codes.ERR_STREAM_PREMATURE_CLOSE;function gyt(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,s=new Array(r),a=0;a{"use strict";var IN;function fg(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var yyt=EN(),Ag=Symbol("lastResolve"),Vm=Symbol("lastReject"),eP=Symbol("error"),CN=Symbol("ended"),Jm=Symbol("lastPromise"),ZY=Symbol("handlePromise"),Km=Symbol("stream");function pg(t,e){return{value:t,done:e}}function Eyt(t){var e=t[Ag];if(e!==null){var r=t[Km].read();r!==null&&(t[Jm]=null,t[Ag]=null,t[Vm]=null,e(pg(r,!1)))}}function Iyt(t){process.nextTick(Eyt,t)}function Cyt(t,e){return function(r,s){t.then(function(){if(e[CN]){r(pg(void 0,!0));return}e[ZY](r,s)},s)}}var wyt=Object.getPrototypeOf(function(){}),Byt=Object.setPrototypeOf((IN={get stream(){return this[Km]},next:function(){var e=this,r=this[eP];if(r!==null)return Promise.reject(r);if(this[CN])return Promise.resolve(pg(void 0,!0));if(this[Km].destroyed)return new Promise(function(c,f){process.nextTick(function(){e[eP]?f(e[eP]):c(pg(void 0,!0))})});var s=this[Jm],a;if(s)a=new Promise(Cyt(s,this));else{var n=this[Km].read();if(n!==null)return Promise.resolve(pg(n,!1));a=new Promise(this[ZY])}return this[Jm]=a,a}},fg(IN,Symbol.asyncIterator,function(){return this}),fg(IN,"return",function(){var e=this;return new Promise(function(r,s){e[Km].destroy(null,function(a){if(a){s(a);return}r(pg(void 0,!0))})})}),IN),wyt),vyt=function(e){var r,s=Object.create(Byt,(r={},fg(r,Km,{value:e,writable:!0}),fg(r,Ag,{value:null,writable:!0}),fg(r,Vm,{value:null,writable:!0}),fg(r,eP,{value:null,writable:!0}),fg(r,CN,{value:e._readableState.endEmitted,writable:!0}),fg(r,ZY,{value:function(n,c){var f=s[Km].read();f?(s[Jm]=null,s[Ag]=null,s[Vm]=null,n(pg(f,!1))):(s[Ag]=n,s[Vm]=c)},writable:!0}),r));return s[Jm]=null,yyt(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=s[Vm];n!==null&&(s[Jm]=null,s[Ag]=null,s[Vm]=null,n(a)),s[eP]=a;return}var c=s[Ag];c!==null&&(s[Jm]=null,s[Ag]=null,s[Vm]=null,c(pg(void 0,!0))),s[CN]=!0}),e.on("readable",Iyt.bind(null,s)),s};Dve.exports=vyt});var Qve=_((Ftr,kve)=>{"use strict";function bve(t,e,r,s,a,n,c){try{var f=t[n](c),p=f.value}catch(h){r(h);return}f.done?e(p):Promise.resolve(p).then(s,a)}function Syt(t){return function(){var e=this,r=arguments;return new Promise(function(s,a){var n=t.apply(e,r);function c(p){bve(n,s,a,c,f,"next",p)}function f(p){bve(n,s,a,c,f,"throw",p)}c(void 0)})}}function xve(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(t);e&&(s=s.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,s)}return r}function Dyt(t){for(var e=1;e{"use strict";Hve.exports=bn;var Nw;bn.ReadableState=Nve;var Ntr=Ie("events").EventEmitter,Fve=function(e,r){return e.listeners(r).length},rP=TY(),wN=Ie("buffer").Buffer,kyt=global.Uint8Array||function(){};function Qyt(t){return wN.from(t)}function Ryt(t){return wN.isBuffer(t)||t instanceof kyt}var XY=Ie("util"),cn;XY&&XY.debuglog?cn=XY.debuglog("stream"):cn=function(){};var Tyt=eve(),sV=OY(),Fyt=LY(),Nyt=Fyt.getHighWaterMark,BN=lg().codes,Oyt=BN.ERR_INVALID_ARG_TYPE,Lyt=BN.ERR_STREAM_PUSH_AFTER_EOF,Myt=BN.ERR_METHOD_NOT_IMPLEMENTED,Uyt=BN.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Ow,$Y,eV;cg()(bn,rP);var tP=sV.errorOrDestroy,tV=["error","close","destroy","pause","resume"];function _yt(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function Nve(t,e,r){Nw=Nw||Ym(),t=t||{},typeof r!="boolean"&&(r=e instanceof Nw),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=Nyt(this,t,"readableHighWaterMark",r),this.buffer=new Tyt,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Ow||(Ow=zY().StringDecoder),this.decoder=new Ow(t.encoding),this.encoding=t.encoding)}function bn(t){if(Nw=Nw||Ym(),!(this instanceof bn))return new bn(t);var e=this instanceof Nw;this._readableState=new Nve(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),rP.call(this)}Object.defineProperty(bn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}});bn.prototype.destroy=sV.destroy;bn.prototype._undestroy=sV.undestroy;bn.prototype._destroy=function(t,e){e(t)};bn.prototype.push=function(t,e){var r=this._readableState,s;return r.objectMode?s=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=wN.from(t,e),e=""),s=!0),Ove(this,t,e,!1,s)};bn.prototype.unshift=function(t){return Ove(this,t,null,!0,!1)};function Ove(t,e,r,s,a){cn("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,Gyt(t,n);else{var c;if(a||(c=Hyt(n,e)),c)tP(t,c);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==wN.prototype&&(e=Qyt(e)),s)n.endEmitted?tP(t,new Uyt):rV(t,n,e,!0);else if(n.ended)tP(t,new Lyt);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?rV(t,n,e,!1):iV(t,n)):rV(t,n,e,!1)}else s||(n.reading=!1,iV(t,n))}return!n.ended&&(n.length=Rve?t=Rve:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function Tve(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=jyt(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}bn.prototype.read=function(t){cn("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return cn("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?nV(this):vN(this),null;if(t=Tve(t,e),t===0&&e.ended)return e.length===0&&nV(this),null;var s=e.needReadable;cn("need readable",s),(e.length===0||e.length-t0?a=Uve(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&nV(this)),a!==null&&this.emit("data",a),a};function Gyt(t,e){if(cn("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?vN(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Lve(t)))}}function vN(t){var e=t._readableState;cn("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(cn("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Lve,t))}function Lve(t){var e=t._readableState;cn("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,oV(t)}function iV(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(qyt,t,e))}function qyt(t,e){for(;!e.reading&&!e.ended&&(e.length1&&_ve(s.pipes,t)!==-1)&&!h&&(cn("false write response, pause",s.awaitDrain),s.awaitDrain++),r.pause())}function S(N){cn("onerror",N),T(),t.removeListener("error",S),Fve(t,"error")===0&&tP(t,N)}_yt(t,"error",S);function b(){t.removeListener("finish",I),T()}t.once("close",b);function I(){cn("onfinish"),t.removeListener("close",b),T()}t.once("finish",I);function T(){cn("unpipe"),r.unpipe(t)}return t.emit("pipe",r),s.flowing||(cn("pipe resume"),r.resume()),t};function Wyt(t){return function(){var r=t._readableState;cn("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&Fve(t,"data")&&(r.flowing=!0,oV(t))}}bn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var s=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,s.flowing!==!1&&this.resume()):t==="readable"&&!s.endEmitted&&!s.readableListening&&(s.readableListening=s.needReadable=!0,s.flowing=!1,s.emittedReadable=!1,cn("on readable",s.length,s.reading),s.length?vN(this):s.reading||process.nextTick(Yyt,this)),r};bn.prototype.addListener=bn.prototype.on;bn.prototype.removeListener=function(t,e){var r=rP.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(Mve,this),r};bn.prototype.removeAllListeners=function(t){var e=rP.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(Mve,this),e};function Mve(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function Yyt(t){cn("readable nexttick read 0"),t.read(0)}bn.prototype.resume=function(){var t=this._readableState;return t.flowing||(cn("resume"),t.flowing=!t.readableListening,Vyt(this,t)),t.paused=!1,this};function Vyt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(Jyt,t,e))}function Jyt(t,e){cn("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),oV(t),e.flowing&&!e.reading&&t.read(0)}bn.prototype.pause=function(){return cn("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(cn("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function oV(t){var e=t._readableState;for(cn("flow",e.flowing);e.flowing&&t.read()!==null;);}bn.prototype.wrap=function(t){var e=this,r=this._readableState,s=!1;t.on("end",function(){if(cn("wrapped end"),r.decoder&&!r.ended){var c=r.decoder.end();c&&c.length&&e.push(c)}e.push(null)}),t.on("data",function(c){if(cn("wrapped data"),r.decoder&&(c=r.decoder.write(c)),!(r.objectMode&&c==null)&&!(!r.objectMode&&(!c||!c.length))){var f=e.push(c);f||(s=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(f){return function(){return t[f].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function nV(t){var e=t._readableState;cn("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(Kyt,e,t))}function Kyt(t,e){if(cn("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(bn.from=function(t,e){return eV===void 0&&(eV=Qve()),eV(bn,t,e)});function _ve(t,e){for(var r=0,s=t.length;r{"use strict";Gve.exports=lh;var SN=lg().codes,zyt=SN.ERR_METHOD_NOT_IMPLEMENTED,Zyt=SN.ERR_MULTIPLE_CALLBACK,Xyt=SN.ERR_TRANSFORM_ALREADY_TRANSFORMING,$yt=SN.ERR_TRANSFORM_WITH_LENGTH_0,DN=Ym();cg()(lh,DN);function eEt(t,e){var r=this._transformState;r.transforming=!1;var s=r.writecb;if(s===null)return this.emit("error",new Zyt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),s(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";Wve.exports=nP;var qve=aV();cg()(nP,qve);function nP(t){if(!(this instanceof nP))return new nP(t);qve.call(this,t)}nP.prototype._transform=function(t,e,r){r(null,t)}});var Zve=_((Utr,zve)=>{"use strict";var lV;function rEt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Kve=lg().codes,nEt=Kve.ERR_MISSING_ARGS,iEt=Kve.ERR_STREAM_DESTROYED;function Vve(t){if(t)throw t}function sEt(t){return t.setHeader&&typeof t.abort=="function"}function oEt(t,e,r,s){s=rEt(s);var a=!1;t.on("close",function(){a=!0}),lV===void 0&&(lV=EN()),lV(t,{readable:e,writable:r},function(c){if(c)return s(c);a=!0,s()});var n=!1;return function(c){if(!a&&!n){if(n=!0,sEt(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();s(c||new iEt("pipe"))}}}function Jve(t){t()}function aEt(t,e){return t.pipe(e)}function lEt(t){return!t.length||typeof t[t.length-1]!="function"?Vve:t.pop()}function cEt(){for(var t=arguments.length,e=new Array(t),r=0;r0;return oEt(c,p,h,function(E){a||(a=E),E&&n.forEach(Jve),!p&&(n.forEach(Jve),s(a))})});return e.reduce(aEt)}zve.exports=cEt});var Lw=_((zc,sP)=>{var iP=Ie("stream");process.env.READABLE_STREAM==="disable"&&iP?(sP.exports=iP.Readable,Object.assign(sP.exports,iP),sP.exports.Stream=iP):(zc=sP.exports=YY(),zc.Stream=iP||zc,zc.Readable=zc,zc.Writable=GY(),zc.Duplex=Ym(),zc.Transform=aV(),zc.PassThrough=Yve(),zc.finished=EN(),zc.pipeline=Zve())});var eSe=_((_tr,$ve)=>{"use strict";var{Buffer:cf}=Ie("buffer"),Xve=Symbol.for("BufferList");function Ci(t){if(!(this instanceof Ci))return new Ci(t);Ci._init.call(this,t)}Ci._init=function(e){Object.defineProperty(this,Xve,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};Ci.prototype._new=function(e){return new Ci(e)};Ci.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let s=0;sthis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};Ci.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};Ci.prototype.copy=function(e,r,s,a){if((typeof s!="number"||s<0)&&(s=0),(typeof a!="number"||a>this.length)&&(a=this.length),s>=this.length||a<=0)return e||cf.alloc(0);let n=!!e,c=this._offset(s),f=a-s,p=f,h=n&&r||0,E=c[1];if(s===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:cf.concat(this._bufs,this.length);for(let C=0;CS)this._bufs[C].copy(e,h,E),h+=S;else{this._bufs[C].copy(e,h,E,E+p),h+=S;break}p-=S,E&&(E=0)}return e.length>h?e.slice(0,h):e};Ci.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let s=this._offset(e),a=this._offset(r),n=this._bufs.slice(s[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),s[1]!==0&&(n[0]=n[0].slice(s[1])),this._new(n)};Ci.prototype.toString=function(e,r,s){return this.slice(r,s).toString(e)};Ci.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};Ci.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let s=this._offset(e),a=s[0],n=s[1];for(;a=t.length){let p=c.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=c.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};Ci.prototype._match=function(t,e){if(this.length-t{"use strict";var cV=Lw().Duplex,uEt=cg(),oP=eSe();function ra(t){if(!(this instanceof ra))return new ra(t);if(typeof t=="function"){this._callback=t;let e=function(s){this._callback&&(this._callback(s),this._callback=null)}.bind(this);this.on("pipe",function(s){s.on("error",e)}),this.on("unpipe",function(s){s.removeListener("error",e)}),t=null}oP._init.call(this,t),cV.call(this)}uEt(ra,cV);Object.assign(ra.prototype,oP.prototype);ra.prototype._new=function(e){return new ra(e)};ra.prototype._write=function(e,r,s){this._appendBuffer(e),typeof s=="function"&&s()};ra.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};ra.prototype.end=function(e){cV.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};ra.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};ra.prototype._isBufferList=function(e){return e instanceof ra||e instanceof oP||ra.isBufferList(e)};ra.isBufferList=oP.isBufferList;PN.exports=ra;PN.exports.BufferListStream=ra;PN.exports.BufferList=oP});var AV=_(Uw=>{var fEt=Buffer.alloc,AEt="0000000000000000000",pEt="7777777777777777777",rSe=48,nSe=Buffer.from("ustar\0","binary"),hEt=Buffer.from("00","binary"),gEt=Buffer.from("ustar ","binary"),dEt=Buffer.from(" \0","binary"),mEt=parseInt("7777",8),aP=257,fV=263,yEt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},EEt=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},IEt=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},iSe=function(t,e,r,s){for(;re?pEt.slice(0,e)+" ":AEt.slice(0,e-t.length)+t+" "};function CEt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],s=t.length-1;s>0;s--){var a=t[s];e?r.push(a):r.push(255-a)}var n=0,c=r.length;for(s=0;s=Math.pow(10,r)&&r++,e+r+t};Uw.decodeLongPath=function(t,e){return Mw(t,0,t.length,e)};Uw.encodePax=function(t){var e="";t.name&&(e+=uV(" path="+t.name+` `)),t.linkname&&(e+=uV(" linkpath="+t.linkname+` `));var r=t.pax;if(r)for(var s in r)e+=uV(" "+s+"="+r[s]+` `);return Buffer.from(e)};Uw.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;s+=s?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(s)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(hg(t.mode&mEt,6),100),e.write(hg(t.uid,6),108),e.write(hg(t.gid,6),116),e.write(hg(t.size,11),124),e.write(hg(t.mtime.getTime()/1e3|0,11),136),e[156]=rSe+IEt(t.type),t.linkname&&e.write(t.linkname,157),nSe.copy(e,aP),hEt.copy(e,fV),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(hg(t.devmajor||0,6),329),e.write(hg(t.devminor||0,6),337),s&&e.write(s,345),e.write(hg(sSe(e),6),148),e)};Uw.decode=function(t,e,r){var s=t[156]===0?0:t[156]-rSe,a=Mw(t,0,100,e),n=gg(t,100,8),c=gg(t,108,8),f=gg(t,116,8),p=gg(t,124,12),h=gg(t,136,12),E=EEt(s),C=t[157]===0?null:Mw(t,157,100,e),S=Mw(t,265,32),b=Mw(t,297,32),I=gg(t,329,8),T=gg(t,337,8),N=sSe(t);if(N===8*32)return null;if(N!==gg(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(nSe.compare(t,aP,aP+6)===0)t[345]&&(a=Mw(t,345,155,e)+"/"+a);else if(!(gEt.compare(t,aP,aP+6)===0&&dEt.compare(t,fV,fV+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return s===0&&a&&a[a.length-1]==="/"&&(s=5),{name:a,mode:n,uid:c,gid:f,size:p,mtime:new Date(1e3*h),type:E,linkname:C,uname:S,gname:b,devmajor:I,devminor:T}}});var ASe=_((Gtr,fSe)=>{var aSe=Ie("util"),wEt=tSe(),lP=AV(),lSe=Lw().Writable,cSe=Lw().PassThrough,uSe=function(){},oSe=function(t){return t&=511,t&&512-t},BEt=function(t,e){var r=new bN(t,e);return r.end(),r},vEt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},bN=function(t,e){this._parent=t,this.offset=e,cSe.call(this,{autoDestroy:!1})};aSe.inherits(bN,cSe);bN.prototype.destroy=function(t){this._parent.destroy(t)};var ch=function(t){if(!(this instanceof ch))return new ch(t);lSe.call(this,t),t=t||{},this._offset=0,this._buffer=wEt(),this._missing=0,this._partial=!1,this._onparse=uSe,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,s=function(){e._continue()},a=function(S){if(e._locked=!1,S)return e.destroy(S);e._stream||s()},n=function(){e._stream=null;var S=oSe(e._header.size);S?e._parse(S,c):e._parse(512,C),e._locked||s()},c=function(){e._buffer.consume(oSe(e._header.size)),e._parse(512,C),s()},f=function(){var S=e._header.size;e._paxGlobal=lP.decodePax(r.slice(0,S)),r.consume(S),n()},p=function(){var S=e._header.size;e._pax=lP.decodePax(r.slice(0,S)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(S),n()},h=function(){var S=e._header.size;this._gnuLongPath=lP.decodeLongPath(r.slice(0,S),t.filenameEncoding),r.consume(S),n()},E=function(){var S=e._header.size;this._gnuLongLinkPath=lP.decodeLongPath(r.slice(0,S),t.filenameEncoding),r.consume(S),n()},C=function(){var S=e._offset,b;try{b=e._header=lP.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(I){e.emit("error",I)}if(r.consume(512),!b){e._parse(512,C),s();return}if(b.type==="gnu-long-path"){e._parse(b.size,h),s();return}if(b.type==="gnu-long-link-path"){e._parse(b.size,E),s();return}if(b.type==="pax-global-header"){e._parse(b.size,f),s();return}if(b.type==="pax-header"){e._parse(b.size,p),s();return}if(e._gnuLongPath&&(b.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(b.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=b=vEt(b,e._pax),e._pax=null),e._locked=!0,!b.size||b.type==="directory"){e._parse(512,C),e.emit("entry",b,BEt(e,S),a);return}e._stream=new bN(e,S),e.emit("entry",b,e._stream,a),e._parse(b.size,n),s()};this._onheader=C,this._parse(512,C)};aSe.inherits(ch,lSe);ch.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};ch.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};ch.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=uSe,this._overflow?this._write(this._overflow,void 0,t):t()}};ch.prototype._write=function(t,e,r){if(!this._destroyed){var s=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(c=t.slice(n),t=t.slice(0,n)),s?s.end(t):a.append(t),this._overflow=c,this._onparse()}};ch.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};fSe.exports=ch});var hSe=_((qtr,pSe)=>{pSe.exports=Ie("fs").constants||Ie("constants")});var ESe=_((Wtr,ySe)=>{var _w=hSe(),gSe=aH(),kN=cg(),SEt=Buffer.alloc,dSe=Lw().Readable,Hw=Lw().Writable,DEt=Ie("string_decoder").StringDecoder,xN=AV(),PEt=parseInt("755",8),bEt=parseInt("644",8),mSe=SEt(1024),hV=function(){},pV=function(t,e){e&=511,e&&t.push(mSe.slice(0,512-e))};function xEt(t){switch(t&_w.S_IFMT){case _w.S_IFBLK:return"block-device";case _w.S_IFCHR:return"character-device";case _w.S_IFDIR:return"directory";case _w.S_IFIFO:return"fifo";case _w.S_IFLNK:return"symlink"}return"file"}var QN=function(t){Hw.call(this),this.written=0,this._to=t,this._destroyed=!1};kN(QN,Hw);QN.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};QN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var RN=function(){Hw.call(this),this.linkname="",this._decoder=new DEt("utf-8"),this._destroyed=!1};kN(RN,Hw);RN.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};RN.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var cP=function(){Hw.call(this),this._destroyed=!1};kN(cP,Hw);cP.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};cP.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var mA=function(t){if(!(this instanceof mA))return new mA(t);dSe.call(this,t),this._drain=hV,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};kN(mA,dSe);mA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=hV);var s=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=xEt(t.mode)),t.mode||(t.mode=t.type==="directory"?PEt:bEt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return pV(s,t.size),a?process.nextTick(r):this._drain=r,new cP}if(t.type==="symlink"&&!t.linkname){var n=new RN;return gSe(n,function(f){if(f)return s.destroy(),r(f);t.linkname=n.linkname,s._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new cP;var c=new QN(this);return this._stream=c,gSe(c,function(f){if(s._stream=null,f)return s.destroy(),r(f);if(c.written!==t.size)return s.destroy(),r(new Error("size mismatch"));pV(s,t.size),s._finalizing&&s.finalize(),r()}),c}};mA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(mSe),this.push(null))};mA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};mA.prototype._encode=function(t){if(!t.pax){var e=xN.encode(t);if(e){this.push(e);return}}this._encodePax(t)};mA.prototype._encodePax=function(t){var e=xN.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(xN.encode(r)),this.push(e),pV(this,e.length),r.size=t.size,r.type=t.type,this.push(xN.encode(r))};mA.prototype._read=function(t){var e=this._drain;this._drain=hV,e()};ySe.exports=mA});var ISe=_(gV=>{gV.extract=ASe();gV.pack=ESe()});var TSe=_(Ra=>{"use strict";var jEt=Ra&&Ra.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ra,"__esModule",{value:!0});Ra.Minipass=Ra.isWritable=Ra.isReadable=Ra.isStream=void 0;var bSe=typeof process=="object"&&process?process:{stdout:null,stderr:null},PV=Ie("node:events"),RSe=jEt(Ie("node:stream")),GEt=Ie("node:string_decoder"),qEt=t=>!!t&&typeof t=="object"&&(t instanceof HN||t instanceof RSe.default||(0,Ra.isReadable)(t)||(0,Ra.isWritable)(t));Ra.isStream=qEt;var WEt=t=>!!t&&typeof t=="object"&&t instanceof PV.EventEmitter&&typeof t.pipe=="function"&&t.pipe!==RSe.default.Writable.prototype.pipe;Ra.isReadable=WEt;var YEt=t=>!!t&&typeof t=="object"&&t instanceof PV.EventEmitter&&typeof t.write=="function"&&typeof t.end=="function";Ra.isWritable=YEt;var uh=Symbol("EOF"),fh=Symbol("maybeEmitEnd"),dg=Symbol("emittedEnd"),NN=Symbol("emittingEnd"),uP=Symbol("emittedError"),ON=Symbol("closed"),xSe=Symbol("read"),LN=Symbol("flush"),kSe=Symbol("flushChunk"),uf=Symbol("encoding"),Gw=Symbol("decoder"),Ks=Symbol("flowing"),fP=Symbol("paused"),qw=Symbol("resume"),zs=Symbol("buffer"),Qa=Symbol("pipes"),Zs=Symbol("bufferLength"),CV=Symbol("bufferPush"),MN=Symbol("bufferShift"),na=Symbol("objectMode"),es=Symbol("destroyed"),wV=Symbol("error"),BV=Symbol("emitData"),QSe=Symbol("emitEnd"),vV=Symbol("emitEnd2"),EA=Symbol("async"),SV=Symbol("abort"),UN=Symbol("aborted"),AP=Symbol("signal"),zm=Symbol("dataListeners"),rc=Symbol("discarded"),pP=t=>Promise.resolve().then(t),VEt=t=>t(),JEt=t=>t==="end"||t==="finish"||t==="prefinish",KEt=t=>t instanceof ArrayBuffer||!!t&&typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,zEt=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),_N=class{src;dest;opts;ondrain;constructor(e,r,s){this.src=e,this.dest=r,this.opts=s,this.ondrain=()=>e[qw](),this.dest.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(e){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},DV=class extends _N{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,s){super(e,r,s),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}},ZEt=t=>!!t.objectMode,XEt=t=>!t.objectMode&&!!t.encoding&&t.encoding!=="buffer",HN=class extends PV.EventEmitter{[Ks]=!1;[fP]=!1;[Qa]=[];[zs]=[];[na];[uf];[EA];[Gw];[uh]=!1;[dg]=!1;[NN]=!1;[ON]=!1;[uP]=null;[Zs]=0;[es]=!1;[AP];[UN]=!1;[zm]=0;[rc]=!1;writable=!0;readable=!0;constructor(...e){let r=e[0]||{};if(super(),r.objectMode&&typeof r.encoding=="string")throw new TypeError("Encoding and objectMode may not be used together");ZEt(r)?(this[na]=!0,this[uf]=null):XEt(r)?(this[uf]=r.encoding,this[na]=!1):(this[na]=!1,this[uf]=null),this[EA]=!!r.async,this[Gw]=this[uf]?new GEt.StringDecoder(this[uf]):null,r&&r.debugExposeBuffer===!0&&Object.defineProperty(this,"buffer",{get:()=>this[zs]}),r&&r.debugExposePipes===!0&&Object.defineProperty(this,"pipes",{get:()=>this[Qa]});let{signal:s}=r;s&&(this[AP]=s,s.aborted?this[SV]():s.addEventListener("abort",()=>this[SV]()))}get bufferLength(){return this[Zs]}get encoding(){return this[uf]}set encoding(e){throw new Error("Encoding must be set at instantiation time")}setEncoding(e){throw new Error("Encoding must be set at instantiation time")}get objectMode(){return this[na]}set objectMode(e){throw new Error("objectMode must be set at instantiation time")}get async(){return this[EA]}set async(e){this[EA]=this[EA]||!!e}[SV](){this[UN]=!0,this.emit("abort",this[AP]?.reason),this.destroy(this[AP]?.reason)}get aborted(){return this[UN]}set aborted(e){}write(e,r,s){if(this[UN])return!1;if(this[uh])throw new Error("write after end");if(this[es])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(s=r,r="utf8"),r||(r="utf8");let a=this[EA]?pP:VEt;if(!this[na]&&!Buffer.isBuffer(e)){if(zEt(e))e=Buffer.from(e.buffer,e.byteOffset,e.byteLength);else if(KEt(e))e=Buffer.from(e);else if(typeof e!="string")throw new Error("Non-contiguous data written to non-objectMode stream")}return this[na]?(this[Ks]&&this[Zs]!==0&&this[LN](!0),this[Ks]?this.emit("data",e):this[CV](e),this[Zs]!==0&&this.emit("readable"),s&&a(s),this[Ks]):e.length?(typeof e=="string"&&!(r===this[uf]&&!this[Gw]?.lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[uf]&&(e=this[Gw].write(e)),this[Ks]&&this[Zs]!==0&&this[LN](!0),this[Ks]?this.emit("data",e):this[CV](e),this[Zs]!==0&&this.emit("readable"),s&&a(s),this[Ks]):(this[Zs]!==0&&this.emit("readable"),s&&a(s),this[Ks])}read(e){if(this[es])return null;if(this[rc]=!1,this[Zs]===0||e===0||e&&e>this[Zs])return this[fh](),null;this[na]&&(e=null),this[zs].length>1&&!this[na]&&(this[zs]=[this[uf]?this[zs].join(""):Buffer.concat(this[zs],this[Zs])]);let r=this[xSe](e||null,this[zs][0]);return this[fh](),r}[xSe](e,r){if(this[na])this[MN]();else{let s=r;e===s.length||e===null?this[MN]():typeof s=="string"?(this[zs][0]=s.slice(e),r=s.slice(0,e),this[Zs]-=e):(this[zs][0]=s.subarray(e),r=s.subarray(0,e),this[Zs]-=e)}return this.emit("data",r),!this[zs].length&&!this[uh]&&this.emit("drain"),r}end(e,r,s){return typeof e=="function"&&(s=e,e=void 0),typeof r=="function"&&(s=r,r="utf8"),e!==void 0&&this.write(e,r),s&&this.once("end",s),this[uh]=!0,this.writable=!1,(this[Ks]||!this[fP])&&this[fh](),this}[qw](){this[es]||(!this[zm]&&!this[Qa].length&&(this[rc]=!0),this[fP]=!1,this[Ks]=!0,this.emit("resume"),this[zs].length?this[LN]():this[uh]?this[fh]():this.emit("drain"))}resume(){return this[qw]()}pause(){this[Ks]=!1,this[fP]=!0,this[rc]=!1}get destroyed(){return this[es]}get flowing(){return this[Ks]}get paused(){return this[fP]}[CV](e){this[na]?this[Zs]+=1:this[Zs]+=e.length,this[zs].push(e)}[MN](){return this[na]?this[Zs]-=1:this[Zs]-=this[zs][0].length,this[zs].shift()}[LN](e=!1){do;while(this[kSe](this[MN]())&&this[zs].length);!e&&!this[zs].length&&!this[uh]&&this.emit("drain")}[kSe](e){return this.emit("data",e),this[Ks]}pipe(e,r){if(this[es])return e;this[rc]=!1;let s=this[dg];return r=r||{},e===bSe.stdout||e===bSe.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,s?r.end&&e.end():(this[Qa].push(r.proxyErrors?new DV(this,e,r):new _N(this,e,r)),this[EA]?pP(()=>this[qw]()):this[qw]()),e}unpipe(e){let r=this[Qa].find(s=>s.dest===e);r&&(this[Qa].length===1?(this[Ks]&&this[zm]===0&&(this[Ks]=!1),this[Qa]=[]):this[Qa].splice(this[Qa].indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let s=super.on(e,r);if(e==="data")this[rc]=!1,this[zm]++,!this[Qa].length&&!this[Ks]&&this[qw]();else if(e==="readable"&&this[Zs]!==0)super.emit("readable");else if(JEt(e)&&this[dg])super.emit(e),this.removeAllListeners(e);else if(e==="error"&&this[uP]){let a=r;this[EA]?pP(()=>a.call(this,this[uP])):a.call(this,this[uP])}return s}removeListener(e,r){return this.off(e,r)}off(e,r){let s=super.off(e,r);return e==="data"&&(this[zm]=this.listeners("data").length,this[zm]===0&&!this[rc]&&!this[Qa].length&&(this[Ks]=!1)),s}removeAllListeners(e){let r=super.removeAllListeners(e);return(e==="data"||e===void 0)&&(this[zm]=0,!this[rc]&&!this[Qa].length&&(this[Ks]=!1)),r}get emittedEnd(){return this[dg]}[fh](){!this[NN]&&!this[dg]&&!this[es]&&this[zs].length===0&&this[uh]&&(this[NN]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[ON]&&this.emit("close"),this[NN]=!1)}emit(e,...r){let s=r[0];if(e!=="error"&&e!=="close"&&e!==es&&this[es])return!1;if(e==="data")return!this[na]&&!s?!1:this[EA]?(pP(()=>this[BV](s)),!0):this[BV](s);if(e==="end")return this[QSe]();if(e==="close"){if(this[ON]=!0,!this[dg]&&!this[es])return!1;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[uP]=s,super.emit(wV,s);let n=!this[AP]||this.listeners("error").length?super.emit("error",s):!1;return this[fh](),n}else if(e==="resume"){let n=super.emit("resume");return this[fh](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,...r);return this[fh](),a}[BV](e){for(let s of this[Qa])s.dest.write(e)===!1&&this.pause();let r=this[rc]?!1:super.emit("data",e);return this[fh](),r}[QSe](){return this[dg]?!1:(this[dg]=!0,this.readable=!1,this[EA]?(pP(()=>this[vV]()),!0):this[vV]())}[vV](){if(this[Gw]){let r=this[Gw].end();if(r){for(let s of this[Qa])s.dest.write(r);this[rc]||super.emit("data",r)}}for(let r of this[Qa])r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}async collect(){let e=Object.assign([],{dataLength:0});this[na]||(e.dataLength=0);let r=this.promise();return this.on("data",s=>{e.push(s),this[na]||(e.dataLength+=s.length)}),await r,e}async concat(){if(this[na])throw new Error("cannot concat in objectMode");let e=await this.collect();return this[uf]?e.join(""):Buffer.concat(e,e.dataLength)}async promise(){return new Promise((e,r)=>{this.on(es,()=>r(new Error("stream destroyed"))),this.on("error",s=>r(s)),this.on("end",()=>e())})}[Symbol.asyncIterator](){this[rc]=!1;let e=!1,r=async()=>(this.pause(),e=!0,{value:void 0,done:!0});return{next:()=>{if(e)return r();let a=this.read();if(a!==null)return Promise.resolve({done:!1,value:a});if(this[uh])return r();let n,c,f=C=>{this.off("data",p),this.off("end",h),this.off(es,E),r(),c(C)},p=C=>{this.off("error",f),this.off("end",h),this.off(es,E),this.pause(),n({value:C,done:!!this[uh]})},h=()=>{this.off("error",f),this.off("data",p),this.off(es,E),r(),n({done:!0,value:void 0})},E=()=>f(new Error("stream destroyed"));return new Promise((C,S)=>{c=S,n=C,this.once(es,E),this.once("error",f),this.once("end",h),this.once("data",p)})},throw:r,return:r,[Symbol.asyncIterator](){return this}}}[Symbol.iterator](){this[rc]=!1;let e=!1,r=()=>(this.pause(),this.off(wV,r),this.off(es,r),this.off("end",r),e=!0,{done:!0,value:void 0}),s=()=>{if(e)return r();let a=this.read();return a===null?r():{done:!1,value:a}};return this.once("end",r),this.once(wV,r),this.once(es,r),{next:s,throw:r,return:r,[Symbol.iterator](){return this}}}destroy(e){if(this[es])return e?this.emit("error",e):this.emit(es),this;this[es]=!0,this[rc]=!0,this[zs].length=0,this[Zs]=0;let r=this;return typeof r.close=="function"&&!this[ON]&&r.close(),e?this.emit("error",e):this.emit(es),this}static get isStream(){return Ra.isStream}};Ra.Minipass=HN});var OSe=_((prr,IA)=>{"use strict";var gP=Ie("crypto"),{Minipass:$Et}=TSe(),xV=["sha512","sha384","sha256"],QV=["sha512"],eIt=/^[a-z0-9+/]+(?:=?=?)$/i,tIt=/^([a-z0-9]+)-([^?]+)([?\S*]*)$/,rIt=/^([a-z0-9]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)?$/,nIt=/^[\x21-\x7E]+$/,dP=t=>t?.length?`?${t.join("?")}`:"",kV=class extends $Et{#t;#r;#i;constructor(e){super(),this.size=0,this.opts=e,this.#e(),e?.algorithms?this.algorithms=[...e.algorithms]:this.algorithms=[...QV],this.algorithm!==null&&!this.algorithms.includes(this.algorithm)&&this.algorithms.push(this.algorithm),this.hashes=this.algorithms.map(gP.createHash)}#e(){this.sri=this.opts?.integrity?nc(this.opts?.integrity,this.opts):null,this.expectedSize=this.opts?.size,this.sri?this.sri.isHash?(this.goodSri=!0,this.algorithm=this.sri.algorithm):(this.goodSri=!this.sri.isEmpty(),this.algorithm=this.sri.pickAlgorithm(this.opts)):this.algorithm=null,this.digests=this.goodSri?this.sri[this.algorithm]:null,this.optString=dP(this.opts?.options)}on(e,r){return e==="size"&&this.#r?r(this.#r):e==="integrity"&&this.#t?r(this.#t):e==="verified"&&this.#i?r(this.#i):super.on(e,r)}emit(e,r){return e==="end"&&this.#n(),super.emit(e,r)}write(e){return this.size+=e.length,this.hashes.forEach(r=>r.update(e)),super.write(e)}#n(){this.goodSri||this.#e();let e=nc(this.hashes.map((s,a)=>`${this.algorithms[a]}-${s.digest("base64")}${this.optString}`).join(" "),this.opts),r=this.goodSri&&e.match(this.sri,this.opts);if(typeof this.expectedSize=="number"&&this.size!==this.expectedSize){let s=new Error(`stream size mismatch when checking ${this.sri}. Wanted: ${this.expectedSize} Found: ${this.size}`);s.code="EBADSIZE",s.found=this.size,s.expected=this.expectedSize,s.sri=this.sri,this.emit("error",s)}else if(this.sri&&!r){let s=new Error(`${this.sri} integrity checksum failed when using ${this.algorithm}: wanted ${this.digests} but got ${e}. (${this.size} bytes)`);s.code="EINTEGRITY",s.found=e,s.expected=this.digests,s.algorithm=this.algorithm,s.sri=this.sri,this.emit("error",s)}else this.#r=this.size,this.emit("size",this.size),this.#t=e,this.emit("integrity",e),r&&(this.#i=r,this.emit("verified",r))}},Ah=class{get isHash(){return!0}constructor(e,r){let s=r?.strict;this.source=e.trim(),this.digest="",this.algorithm="",this.options=[];let a=this.source.match(s?rIt:tIt);if(!a||s&&!xV.includes(a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];n&&(this.options=n.slice(1).split("?"))}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}match(e,r){let s=nc(e,r);if(!s)return!1;if(s.isIntegrity){let a=s.pickAlgorithm(r,[this.algorithm]);if(!a)return!1;let n=s[a].find(c=>c.digest===this.digest);return n||!1}return s.digest===this.digest?s:!1}toString(e){return e?.strict&&!(xV.includes(this.algorithm)&&this.digest.match(eIt)&&this.options.every(r=>r.match(nIt)))?"":`${this.algorithm}-${this.digest}${dP(this.options)}`}};function FSe(t,e,r,s){let a=t!=="",n=!1,c="",f=s.length-1;for(let h=0;hs[a].find(c=>n.digest===c.digest)))throw new Error("hashes do not match, cannot update integrity")}else this[a]=s[a]}match(e,r){let s=nc(e,r);if(!s)return!1;let a=s.pickAlgorithm(r,Object.keys(this));return!!a&&this[a]&&s[a]&&this[a].find(n=>s[a].find(c=>n.digest===c.digest))||!1}pickAlgorithm(e,r){let s=e?.pickAlgorithm||fIt,a=Object.keys(this).filter(n=>r?.length?r.includes(n):!0);return a.length?a.reduce((n,c)=>s(n,c)||n):null}};IA.exports.parse=nc;function nc(t,e){if(!t)return null;if(typeof t=="string")return bV(t,e);if(t.algorithm&&t.digest){let r=new Zm;return r[t.algorithm]=[t],bV(hP(r,e),e)}else return bV(hP(t,e),e)}function bV(t,e){if(e?.single)return new Ah(t,e);let r=t.trim().split(/\s+/).reduce((s,a)=>{let n=new Ah(a,e);if(n.algorithm&&n.digest){let c=n.algorithm;s[c]||(s[c]=[]),s[c].push(n)}return s},new Zm);return r.isEmpty()?null:r}IA.exports.stringify=hP;function hP(t,e){return t.algorithm&&t.digest?Ah.prototype.toString.call(t,e):typeof t=="string"?hP(nc(t,e),e):Zm.prototype.toString.call(t,e)}IA.exports.fromHex=iIt;function iIt(t,e,r){let s=dP(r?.options);return nc(`${e}-${Buffer.from(t,"hex").toString("base64")}${s}`,r)}IA.exports.fromData=sIt;function sIt(t,e){let r=e?.algorithms||[...QV],s=dP(e?.options);return r.reduce((a,n)=>{let c=gP.createHash(n).update(t).digest("base64"),f=new Ah(`${n}-${c}${s}`,e);if(f.algorithm&&f.digest){let p=f.algorithm;a[p]||(a[p]=[]),a[p].push(f)}return a},new Zm)}IA.exports.fromStream=oIt;function oIt(t,e){let r=RV(e);return new Promise((s,a)=>{t.pipe(r),t.on("error",a),r.on("error",a);let n;r.on("integrity",c=>{n=c}),r.on("end",()=>s(n)),r.resume()})}IA.exports.checkData=aIt;function aIt(t,e,r){if(e=nc(e,r),!e||!Object.keys(e).length){if(r?.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let s=e.pickAlgorithm(r),a=gP.createHash(s).update(t).digest("base64"),n=nc({algorithm:s,digest:a}),c=n.match(e,r);if(r=r||{},c||!r.error)return c;if(typeof r.size=="number"&&t.length!==r.size){let f=new Error(`data size mismatch when checking ${e}. Wanted: ${r.size} Found: ${t.length}`);throw f.code="EBADSIZE",f.found=t.length,f.expected=r.size,f.sri=e,f}else{let f=new Error(`Integrity checksum failed when using ${s}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw f.code="EINTEGRITY",f.found=n,f.expected=e,f.algorithm=s,f.sri=e,f}}IA.exports.checkStream=lIt;function lIt(t,e,r){if(r=r||Object.create(null),r.integrity=e,e=nc(e,r),!e||!Object.keys(e).length)return Promise.reject(Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"}));let s=RV(r);return new Promise((a,n)=>{t.pipe(s),t.on("error",n),s.on("error",n);let c;s.on("verified",f=>{c=f}),s.on("end",()=>a(c)),s.resume()})}IA.exports.integrityStream=RV;function RV(t=Object.create(null)){return new kV(t)}IA.exports.create=cIt;function cIt(t){let e=t?.algorithms||[...QV],r=dP(t?.options),s=e.map(gP.createHash);return{update:function(a,n){return s.forEach(c=>c.update(a,n)),this},digest:function(){return e.reduce((n,c)=>{let f=s.shift().digest("base64"),p=new Ah(`${c}-${f}${r}`,t);if(p.algorithm&&p.digest){let h=p.algorithm;n[h]||(n[h]=[]),n[h].push(p)}return n},new Zm)}}}var uIt=gP.getHashes(),NSe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>uIt.includes(t));function fIt(t,e){return NSe.indexOf(t.toLowerCase())>=NSe.indexOf(e.toLowerCase())?t:e}});var TV=_(mg=>{"use strict";Object.defineProperty(mg,"__esModule",{value:!0});mg.Signature=mg.Envelope=void 0;mg.Envelope={fromJSON(t){return{payload:jN(t.payload)?Buffer.from(LSe(t.payload)):Buffer.alloc(0),payloadType:jN(t.payloadType)?globalThis.String(t.payloadType):"",signatures:globalThis.Array.isArray(t?.signatures)?t.signatures.map(e=>mg.Signature.fromJSON(e)):[]}},toJSON(t){let e={};return t.payload.length!==0&&(e.payload=MSe(t.payload)),t.payloadType!==""&&(e.payloadType=t.payloadType),t.signatures?.length&&(e.signatures=t.signatures.map(r=>mg.Signature.toJSON(r))),e}};mg.Signature={fromJSON(t){return{sig:jN(t.sig)?Buffer.from(LSe(t.sig)):Buffer.alloc(0),keyid:jN(t.keyid)?globalThis.String(t.keyid):""}},toJSON(t){let e={};return t.sig.length!==0&&(e.sig=MSe(t.sig)),t.keyid!==""&&(e.keyid=t.keyid),e}};function LSe(t){return Uint8Array.from(globalThis.Buffer.from(t,"base64"))}function MSe(t){return globalThis.Buffer.from(t).toString("base64")}function jN(t){return t!=null}});var _Se=_(GN=>{"use strict";Object.defineProperty(GN,"__esModule",{value:!0});GN.Timestamp=void 0;GN.Timestamp={fromJSON(t){return{seconds:USe(t.seconds)?globalThis.String(t.seconds):"0",nanos:USe(t.nanos)?globalThis.Number(t.nanos):0}},toJSON(t){let e={};return t.seconds!=="0"&&(e.seconds=t.seconds),t.nanos!==0&&(e.nanos=Math.round(t.nanos)),e}};function USe(t){return t!=null}});var Ww=_(Ur=>{"use strict";Object.defineProperty(Ur,"__esModule",{value:!0});Ur.TimeRange=Ur.X509CertificateChain=Ur.SubjectAlternativeName=Ur.X509Certificate=Ur.DistinguishedName=Ur.ObjectIdentifierValuePair=Ur.ObjectIdentifier=Ur.PublicKeyIdentifier=Ur.PublicKey=Ur.RFC3161SignedTimestamp=Ur.LogId=Ur.MessageSignature=Ur.HashOutput=Ur.SubjectAlternativeNameType=Ur.PublicKeyDetails=Ur.HashAlgorithm=void 0;Ur.hashAlgorithmFromJSON=jSe;Ur.hashAlgorithmToJSON=GSe;Ur.publicKeyDetailsFromJSON=qSe;Ur.publicKeyDetailsToJSON=WSe;Ur.subjectAlternativeNameTypeFromJSON=YSe;Ur.subjectAlternativeNameTypeToJSON=VSe;var AIt=_Se(),yl;(function(t){t[t.HASH_ALGORITHM_UNSPECIFIED=0]="HASH_ALGORITHM_UNSPECIFIED",t[t.SHA2_256=1]="SHA2_256",t[t.SHA2_384=2]="SHA2_384",t[t.SHA2_512=3]="SHA2_512",t[t.SHA3_256=4]="SHA3_256",t[t.SHA3_384=5]="SHA3_384"})(yl||(Ur.HashAlgorithm=yl={}));function jSe(t){switch(t){case 0:case"HASH_ALGORITHM_UNSPECIFIED":return yl.HASH_ALGORITHM_UNSPECIFIED;case 1:case"SHA2_256":return yl.SHA2_256;case 2:case"SHA2_384":return yl.SHA2_384;case 3:case"SHA2_512":return yl.SHA2_512;case 4:case"SHA3_256":return yl.SHA3_256;case 5:case"SHA3_384":return yl.SHA3_384;default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum HashAlgorithm")}}function GSe(t){switch(t){case yl.HASH_ALGORITHM_UNSPECIFIED:return"HASH_ALGORITHM_UNSPECIFIED";case yl.SHA2_256:return"SHA2_256";case yl.SHA2_384:return"SHA2_384";case yl.SHA2_512:return"SHA2_512";case yl.SHA3_256:return"SHA3_256";case yl.SHA3_384:return"SHA3_384";default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum HashAlgorithm")}}var rn;(function(t){t[t.PUBLIC_KEY_DETAILS_UNSPECIFIED=0]="PUBLIC_KEY_DETAILS_UNSPECIFIED",t[t.PKCS1_RSA_PKCS1V5=1]="PKCS1_RSA_PKCS1V5",t[t.PKCS1_RSA_PSS=2]="PKCS1_RSA_PSS",t[t.PKIX_RSA_PKCS1V5=3]="PKIX_RSA_PKCS1V5",t[t.PKIX_RSA_PSS=4]="PKIX_RSA_PSS",t[t.PKIX_RSA_PKCS1V15_2048_SHA256=9]="PKIX_RSA_PKCS1V15_2048_SHA256",t[t.PKIX_RSA_PKCS1V15_3072_SHA256=10]="PKIX_RSA_PKCS1V15_3072_SHA256",t[t.PKIX_RSA_PKCS1V15_4096_SHA256=11]="PKIX_RSA_PKCS1V15_4096_SHA256",t[t.PKIX_RSA_PSS_2048_SHA256=16]="PKIX_RSA_PSS_2048_SHA256",t[t.PKIX_RSA_PSS_3072_SHA256=17]="PKIX_RSA_PSS_3072_SHA256",t[t.PKIX_RSA_PSS_4096_SHA256=18]="PKIX_RSA_PSS_4096_SHA256",t[t.PKIX_ECDSA_P256_HMAC_SHA_256=6]="PKIX_ECDSA_P256_HMAC_SHA_256",t[t.PKIX_ECDSA_P256_SHA_256=5]="PKIX_ECDSA_P256_SHA_256",t[t.PKIX_ECDSA_P384_SHA_384=12]="PKIX_ECDSA_P384_SHA_384",t[t.PKIX_ECDSA_P521_SHA_512=13]="PKIX_ECDSA_P521_SHA_512",t[t.PKIX_ED25519=7]="PKIX_ED25519",t[t.PKIX_ED25519_PH=8]="PKIX_ED25519_PH",t[t.LMS_SHA256=14]="LMS_SHA256",t[t.LMOTS_SHA256=15]="LMOTS_SHA256"})(rn||(Ur.PublicKeyDetails=rn={}));function qSe(t){switch(t){case 0:case"PUBLIC_KEY_DETAILS_UNSPECIFIED":return rn.PUBLIC_KEY_DETAILS_UNSPECIFIED;case 1:case"PKCS1_RSA_PKCS1V5":return rn.PKCS1_RSA_PKCS1V5;case 2:case"PKCS1_RSA_PSS":return rn.PKCS1_RSA_PSS;case 3:case"PKIX_RSA_PKCS1V5":return rn.PKIX_RSA_PKCS1V5;case 4:case"PKIX_RSA_PSS":return rn.PKIX_RSA_PSS;case 9:case"PKIX_RSA_PKCS1V15_2048_SHA256":return rn.PKIX_RSA_PKCS1V15_2048_SHA256;case 10:case"PKIX_RSA_PKCS1V15_3072_SHA256":return rn.PKIX_RSA_PKCS1V15_3072_SHA256;case 11:case"PKIX_RSA_PKCS1V15_4096_SHA256":return rn.PKIX_RSA_PKCS1V15_4096_SHA256;case 16:case"PKIX_RSA_PSS_2048_SHA256":return rn.PKIX_RSA_PSS_2048_SHA256;case 17:case"PKIX_RSA_PSS_3072_SHA256":return rn.PKIX_RSA_PSS_3072_SHA256;case 18:case"PKIX_RSA_PSS_4096_SHA256":return rn.PKIX_RSA_PSS_4096_SHA256;case 6:case"PKIX_ECDSA_P256_HMAC_SHA_256":return rn.PKIX_ECDSA_P256_HMAC_SHA_256;case 5:case"PKIX_ECDSA_P256_SHA_256":return rn.PKIX_ECDSA_P256_SHA_256;case 12:case"PKIX_ECDSA_P384_SHA_384":return rn.PKIX_ECDSA_P384_SHA_384;case 13:case"PKIX_ECDSA_P521_SHA_512":return rn.PKIX_ECDSA_P521_SHA_512;case 7:case"PKIX_ED25519":return rn.PKIX_ED25519;case 8:case"PKIX_ED25519_PH":return rn.PKIX_ED25519_PH;case 14:case"LMS_SHA256":return rn.LMS_SHA256;case 15:case"LMOTS_SHA256":return rn.LMOTS_SHA256;default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum PublicKeyDetails")}}function WSe(t){switch(t){case rn.PUBLIC_KEY_DETAILS_UNSPECIFIED:return"PUBLIC_KEY_DETAILS_UNSPECIFIED";case rn.PKCS1_RSA_PKCS1V5:return"PKCS1_RSA_PKCS1V5";case rn.PKCS1_RSA_PSS:return"PKCS1_RSA_PSS";case rn.PKIX_RSA_PKCS1V5:return"PKIX_RSA_PKCS1V5";case rn.PKIX_RSA_PSS:return"PKIX_RSA_PSS";case rn.PKIX_RSA_PKCS1V15_2048_SHA256:return"PKIX_RSA_PKCS1V15_2048_SHA256";case rn.PKIX_RSA_PKCS1V15_3072_SHA256:return"PKIX_RSA_PKCS1V15_3072_SHA256";case rn.PKIX_RSA_PKCS1V15_4096_SHA256:return"PKIX_RSA_PKCS1V15_4096_SHA256";case rn.PKIX_RSA_PSS_2048_SHA256:return"PKIX_RSA_PSS_2048_SHA256";case rn.PKIX_RSA_PSS_3072_SHA256:return"PKIX_RSA_PSS_3072_SHA256";case rn.PKIX_RSA_PSS_4096_SHA256:return"PKIX_RSA_PSS_4096_SHA256";case rn.PKIX_ECDSA_P256_HMAC_SHA_256:return"PKIX_ECDSA_P256_HMAC_SHA_256";case rn.PKIX_ECDSA_P256_SHA_256:return"PKIX_ECDSA_P256_SHA_256";case rn.PKIX_ECDSA_P384_SHA_384:return"PKIX_ECDSA_P384_SHA_384";case rn.PKIX_ECDSA_P521_SHA_512:return"PKIX_ECDSA_P521_SHA_512";case rn.PKIX_ED25519:return"PKIX_ED25519";case rn.PKIX_ED25519_PH:return"PKIX_ED25519_PH";case rn.LMS_SHA256:return"LMS_SHA256";case rn.LMOTS_SHA256:return"LMOTS_SHA256";default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum PublicKeyDetails")}}var CA;(function(t){t[t.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED=0]="SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED",t[t.EMAIL=1]="EMAIL",t[t.URI=2]="URI",t[t.OTHER_NAME=3]="OTHER_NAME"})(CA||(Ur.SubjectAlternativeNameType=CA={}));function YSe(t){switch(t){case 0:case"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED":return CA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED;case 1:case"EMAIL":return CA.EMAIL;case 2:case"URI":return CA.URI;case 3:case"OTHER_NAME":return CA.OTHER_NAME;default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum SubjectAlternativeNameType")}}function VSe(t){switch(t){case CA.SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED:return"SUBJECT_ALTERNATIVE_NAME_TYPE_UNSPECIFIED";case CA.EMAIL:return"EMAIL";case CA.URI:return"URI";case CA.OTHER_NAME:return"OTHER_NAME";default:throw new globalThis.Error("Unrecognized enum value "+t+" for enum SubjectAlternativeNameType")}}Ur.HashOutput={fromJSON(t){return{algorithm:ds(t.algorithm)?jSe(t.algorithm):0,digest:ds(t.digest)?Buffer.from(Xm(t.digest)):Buffer.alloc(0)}},toJSON(t){let e={};return t.algorithm!==0&&(e.algorithm=GSe(t.algorithm)),t.digest.length!==0&&(e.digest=$m(t.digest)),e}};Ur.MessageSignature={fromJSON(t){return{messageDigest:ds(t.messageDigest)?Ur.HashOutput.fromJSON(t.messageDigest):void 0,signature:ds(t.signature)?Buffer.from(Xm(t.signature)):Buffer.alloc(0)}},toJSON(t){let e={};return t.messageDigest!==void 0&&(e.messageDigest=Ur.HashOutput.toJSON(t.messageDigest)),t.signature.length!==0&&(e.signature=$m(t.signature)),e}};Ur.LogId={fromJSON(t){return{keyId:ds(t.keyId)?Buffer.from(Xm(t.keyId)):Buffer.alloc(0)}},toJSON(t){let e={};return t.keyId.length!==0&&(e.keyId=$m(t.keyId)),e}};Ur.RFC3161SignedTimestamp={fromJSON(t){return{signedTimestamp:ds(t.signedTimestamp)?Buffer.from(Xm(t.signedTimestamp)):Buffer.alloc(0)}},toJSON(t){let e={};return t.signedTimestamp.length!==0&&(e.signedTimestamp=$m(t.signedTimestamp)),e}};Ur.PublicKey={fromJSON(t){return{rawBytes:ds(t.rawBytes)?Buffer.from(Xm(t.rawBytes)):void 0,keyDetails:ds(t.keyDetails)?qSe(t.keyDetails):0,validFor:ds(t.validFor)?Ur.TimeRange.fromJSON(t.validFor):void 0}},toJSON(t){let e={};return t.rawBytes!==void 0&&(e.rawBytes=$m(t.rawBytes)),t.keyDetails!==0&&(e.keyDetails=WSe(t.keyDetails)),t.validFor!==void 0&&(e.validFor=Ur.TimeRange.toJSON(t.validFor)),e}};Ur.PublicKeyIdentifier={fromJSON(t){return{hint:ds(t.hint)?globalThis.String(t.hint):""}},toJSON(t){let e={};return t.hint!==""&&(e.hint=t.hint),e}};Ur.ObjectIdentifier={fromJSON(t){return{id:globalThis.Array.isArray(t?.id)?t.id.map(e=>globalThis.Number(e)):[]}},toJSON(t){let e={};return t.id?.length&&(e.id=t.id.map(r=>Math.round(r))),e}};Ur.ObjectIdentifierValuePair={fromJSON(t){return{oid:ds(t.oid)?Ur.ObjectIdentifier.fromJSON(t.oid):void 0,value:ds(t.value)?Buffer.from(Xm(t.value)):Buffer.alloc(0)}},toJSON(t){let e={};return t.oid!==void 0&&(e.oid=Ur.ObjectIdentifier.toJSON(t.oid)),t.value.length!==0&&(e.value=$m(t.value)),e}};Ur.DistinguishedName={fromJSON(t){return{organization:ds(t.organization)?globalThis.String(t.organization):"",commonName:ds(t.commonName)?globalThis.String(t.commonName):""}},toJSON(t){let e={};return t.organization!==""&&(e.organization=t.organization),t.commonName!==""&&(e.commonName=t.commonName),e}};Ur.X509Certificate={fromJSON(t){return{rawBytes:ds(t.rawBytes)?Buffer.from(Xm(t.rawBytes)):Buffer.alloc(0)}},toJSON(t){let e={};return t.rawBytes.length!==0&&(e.rawBytes=$m(t.rawBytes)),e}};Ur.SubjectAlternativeName={fromJSON(t){return{type:ds(t.type)?YSe(t.type):0,identity:ds(t.regexp)?{$case:"regexp",regexp:globalThis.String(t.regexp)}:ds(t.value)?{$case:"value",value:globalThis.String(t.value)}:void 0}},toJSON(t){let e={};return t.type!==0&&(e.type=VSe(t.type)),t.identity?.$case==="regexp"?e.regexp=t.identity.regexp:t.identity?.$case==="value"&&(e.value=t.identity.value),e}};Ur.X509CertificateChain={fromJSON(t){return{certificates:globalThis.Array.isArray(t?.certificates)?t.certificates.map(e=>Ur.X509Certificate.fromJSON(e)):[]}},toJSON(t){let e={};return t.certificates?.length&&(e.certificates=t.certificates.map(r=>Ur.X509Certificate.toJSON(r))),e}};Ur.TimeRange={fromJSON(t){return{start:ds(t.start)?HSe(t.start):void 0,end:ds(t.end)?HSe(t.end):void 0}},toJSON(t){let e={};return t.start!==void 0&&(e.start=t.start.toISOString()),t.end!==void 0&&(e.end=t.end.toISOString()),e}};function Xm(t){return Uint8Array.from(globalThis.Buffer.from(t,"base64"))}function $m(t){return globalThis.Buffer.from(t).toString("base64")}function pIt(t){let e=(globalThis.Number(t.seconds)||0)*1e3;return e+=(t.nanos||0)/1e6,new globalThis.Date(e)}function HSe(t){return t instanceof globalThis.Date?t:typeof t=="string"?new globalThis.Date(t):pIt(AIt.Timestamp.fromJSON(t))}function ds(t){return t!=null}});var FV=_(ms=>{"use strict";Object.defineProperty(ms,"__esModule",{value:!0});ms.TransparencyLogEntry=ms.InclusionPromise=ms.InclusionProof=ms.Checkpoint=ms.KindVersion=void 0;var JSe=Ww();ms.KindVersion={fromJSON(t){return{kind:Ta(t.kind)?globalThis.String(t.kind):"",version:Ta(t.version)?globalThis.String(t.version):""}},toJSON(t){let e={};return t.kind!==""&&(e.kind=t.kind),t.version!==""&&(e.version=t.version),e}};ms.Checkpoint={fromJSON(t){return{envelope:Ta(t.envelope)?globalThis.String(t.envelope):""}},toJSON(t){let e={};return t.envelope!==""&&(e.envelope=t.envelope),e}};ms.InclusionProof={fromJSON(t){return{logIndex:Ta(t.logIndex)?globalThis.String(t.logIndex):"0",rootHash:Ta(t.rootHash)?Buffer.from(qN(t.rootHash)):Buffer.alloc(0),treeSize:Ta(t.treeSize)?globalThis.String(t.treeSize):"0",hashes:globalThis.Array.isArray(t?.hashes)?t.hashes.map(e=>Buffer.from(qN(e))):[],checkpoint:Ta(t.checkpoint)?ms.Checkpoint.fromJSON(t.checkpoint):void 0}},toJSON(t){let e={};return t.logIndex!=="0"&&(e.logIndex=t.logIndex),t.rootHash.length!==0&&(e.rootHash=WN(t.rootHash)),t.treeSize!=="0"&&(e.treeSize=t.treeSize),t.hashes?.length&&(e.hashes=t.hashes.map(r=>WN(r))),t.checkpoint!==void 0&&(e.checkpoint=ms.Checkpoint.toJSON(t.checkpoint)),e}};ms.InclusionPromise={fromJSON(t){return{signedEntryTimestamp:Ta(t.signedEntryTimestamp)?Buffer.from(qN(t.signedEntryTimestamp)):Buffer.alloc(0)}},toJSON(t){let e={};return t.signedEntryTimestamp.length!==0&&(e.signedEntryTimestamp=WN(t.signedEntryTimestamp)),e}};ms.TransparencyLogEntry={fromJSON(t){return{logIndex:Ta(t.logIndex)?globalThis.String(t.logIndex):"0",logId:Ta(t.logId)?JSe.LogId.fromJSON(t.logId):void 0,kindVersion:Ta(t.kindVersion)?ms.KindVersion.fromJSON(t.kindVersion):void 0,integratedTime:Ta(t.integratedTime)?globalThis.String(t.integratedTime):"0",inclusionPromise:Ta(t.inclusionPromise)?ms.InclusionPromise.fromJSON(t.inclusionPromise):void 0,inclusionProof:Ta(t.inclusionProof)?ms.InclusionProof.fromJSON(t.inclusionProof):void 0,canonicalizedBody:Ta(t.canonicalizedBody)?Buffer.from(qN(t.canonicalizedBody)):Buffer.alloc(0)}},toJSON(t){let e={};return t.logIndex!=="0"&&(e.logIndex=t.logIndex),t.logId!==void 0&&(e.logId=JSe.LogId.toJSON(t.logId)),t.kindVersion!==void 0&&(e.kindVersion=ms.KindVersion.toJSON(t.kindVersion)),t.integratedTime!=="0"&&(e.integratedTime=t.integratedTime),t.inclusionPromise!==void 0&&(e.inclusionPromise=ms.InclusionPromise.toJSON(t.inclusionPromise)),t.inclusionProof!==void 0&&(e.inclusionProof=ms.InclusionProof.toJSON(t.inclusionProof)),t.canonicalizedBody.length!==0&&(e.canonicalizedBody=WN(t.canonicalizedBody)),e}};function qN(t){return Uint8Array.from(globalThis.Buffer.from(t,"base64"))}function WN(t){return globalThis.Buffer.from(t).toString("base64")}function Ta(t){return t!=null}});var NV=_(Zc=>{"use strict";Object.defineProperty(Zc,"__esModule",{value:!0});Zc.Bundle=Zc.VerificationMaterial=Zc.TimestampVerificationData=void 0;var KSe=TV(),wA=Ww(),zSe=FV();Zc.TimestampVerificationData={fromJSON(t){return{rfc3161Timestamps:globalThis.Array.isArray(t?.rfc3161Timestamps)?t.rfc3161Timestamps.map(e=>wA.RFC3161SignedTimestamp.fromJSON(e)):[]}},toJSON(t){let e={};return t.rfc3161Timestamps?.length&&(e.rfc3161Timestamps=t.rfc3161Timestamps.map(r=>wA.RFC3161SignedTimestamp.toJSON(r))),e}};Zc.VerificationMaterial={fromJSON(t){return{content:yg(t.publicKey)?{$case:"publicKey",publicKey:wA.PublicKeyIdentifier.fromJSON(t.publicKey)}:yg(t.x509CertificateChain)?{$case:"x509CertificateChain",x509CertificateChain:wA.X509CertificateChain.fromJSON(t.x509CertificateChain)}:yg(t.certificate)?{$case:"certificate",certificate:wA.X509Certificate.fromJSON(t.certificate)}:void 0,tlogEntries:globalThis.Array.isArray(t?.tlogEntries)?t.tlogEntries.map(e=>zSe.TransparencyLogEntry.fromJSON(e)):[],timestampVerificationData:yg(t.timestampVerificationData)?Zc.TimestampVerificationData.fromJSON(t.timestampVerificationData):void 0}},toJSON(t){let e={};return t.content?.$case==="publicKey"?e.publicKey=wA.PublicKeyIdentifier.toJSON(t.content.publicKey):t.content?.$case==="x509CertificateChain"?e.x509CertificateChain=wA.X509CertificateChain.toJSON(t.content.x509CertificateChain):t.content?.$case==="certificate"&&(e.certificate=wA.X509Certificate.toJSON(t.content.certificate)),t.tlogEntries?.length&&(e.tlogEntries=t.tlogEntries.map(r=>zSe.TransparencyLogEntry.toJSON(r))),t.timestampVerificationData!==void 0&&(e.timestampVerificationData=Zc.TimestampVerificationData.toJSON(t.timestampVerificationData)),e}};Zc.Bundle={fromJSON(t){return{mediaType:yg(t.mediaType)?globalThis.String(t.mediaType):"",verificationMaterial:yg(t.verificationMaterial)?Zc.VerificationMaterial.fromJSON(t.verificationMaterial):void 0,content:yg(t.messageSignature)?{$case:"messageSignature",messageSignature:wA.MessageSignature.fromJSON(t.messageSignature)}:yg(t.dsseEnvelope)?{$case:"dsseEnvelope",dsseEnvelope:KSe.Envelope.fromJSON(t.dsseEnvelope)}:void 0}},toJSON(t){let e={};return t.mediaType!==""&&(e.mediaType=t.mediaType),t.verificationMaterial!==void 0&&(e.verificationMaterial=Zc.VerificationMaterial.toJSON(t.verificationMaterial)),t.content?.$case==="messageSignature"?e.messageSignature=wA.MessageSignature.toJSON(t.content.messageSignature):t.content?.$case==="dsseEnvelope"&&(e.dsseEnvelope=KSe.Envelope.toJSON(t.content.dsseEnvelope)),e}};function yg(t){return t!=null}});var OV=_(Ti=>{"use strict";Object.defineProperty(Ti,"__esModule",{value:!0});Ti.ClientTrustConfig=Ti.SigningConfig=Ti.TrustedRoot=Ti.CertificateAuthority=Ti.TransparencyLogInstance=void 0;var El=Ww();Ti.TransparencyLogInstance={fromJSON(t){return{baseUrl:ia(t.baseUrl)?globalThis.String(t.baseUrl):"",hashAlgorithm:ia(t.hashAlgorithm)?(0,El.hashAlgorithmFromJSON)(t.hashAlgorithm):0,publicKey:ia(t.publicKey)?El.PublicKey.fromJSON(t.publicKey):void 0,logId:ia(t.logId)?El.LogId.fromJSON(t.logId):void 0,checkpointKeyId:ia(t.checkpointKeyId)?El.LogId.fromJSON(t.checkpointKeyId):void 0}},toJSON(t){let e={};return t.baseUrl!==""&&(e.baseUrl=t.baseUrl),t.hashAlgorithm!==0&&(e.hashAlgorithm=(0,El.hashAlgorithmToJSON)(t.hashAlgorithm)),t.publicKey!==void 0&&(e.publicKey=El.PublicKey.toJSON(t.publicKey)),t.logId!==void 0&&(e.logId=El.LogId.toJSON(t.logId)),t.checkpointKeyId!==void 0&&(e.checkpointKeyId=El.LogId.toJSON(t.checkpointKeyId)),e}};Ti.CertificateAuthority={fromJSON(t){return{subject:ia(t.subject)?El.DistinguishedName.fromJSON(t.subject):void 0,uri:ia(t.uri)?globalThis.String(t.uri):"",certChain:ia(t.certChain)?El.X509CertificateChain.fromJSON(t.certChain):void 0,validFor:ia(t.validFor)?El.TimeRange.fromJSON(t.validFor):void 0}},toJSON(t){let e={};return t.subject!==void 0&&(e.subject=El.DistinguishedName.toJSON(t.subject)),t.uri!==""&&(e.uri=t.uri),t.certChain!==void 0&&(e.certChain=El.X509CertificateChain.toJSON(t.certChain)),t.validFor!==void 0&&(e.validFor=El.TimeRange.toJSON(t.validFor)),e}};Ti.TrustedRoot={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):"",tlogs:globalThis.Array.isArray(t?.tlogs)?t.tlogs.map(e=>Ti.TransparencyLogInstance.fromJSON(e)):[],certificateAuthorities:globalThis.Array.isArray(t?.certificateAuthorities)?t.certificateAuthorities.map(e=>Ti.CertificateAuthority.fromJSON(e)):[],ctlogs:globalThis.Array.isArray(t?.ctlogs)?t.ctlogs.map(e=>Ti.TransparencyLogInstance.fromJSON(e)):[],timestampAuthorities:globalThis.Array.isArray(t?.timestampAuthorities)?t.timestampAuthorities.map(e=>Ti.CertificateAuthority.fromJSON(e)):[]}},toJSON(t){let e={};return t.mediaType!==""&&(e.mediaType=t.mediaType),t.tlogs?.length&&(e.tlogs=t.tlogs.map(r=>Ti.TransparencyLogInstance.toJSON(r))),t.certificateAuthorities?.length&&(e.certificateAuthorities=t.certificateAuthorities.map(r=>Ti.CertificateAuthority.toJSON(r))),t.ctlogs?.length&&(e.ctlogs=t.ctlogs.map(r=>Ti.TransparencyLogInstance.toJSON(r))),t.timestampAuthorities?.length&&(e.timestampAuthorities=t.timestampAuthorities.map(r=>Ti.CertificateAuthority.toJSON(r))),e}};Ti.SigningConfig={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):"",caUrl:ia(t.caUrl)?globalThis.String(t.caUrl):"",oidcUrl:ia(t.oidcUrl)?globalThis.String(t.oidcUrl):"",tlogUrls:globalThis.Array.isArray(t?.tlogUrls)?t.tlogUrls.map(e=>globalThis.String(e)):[],tsaUrls:globalThis.Array.isArray(t?.tsaUrls)?t.tsaUrls.map(e=>globalThis.String(e)):[]}},toJSON(t){let e={};return t.mediaType!==""&&(e.mediaType=t.mediaType),t.caUrl!==""&&(e.caUrl=t.caUrl),t.oidcUrl!==""&&(e.oidcUrl=t.oidcUrl),t.tlogUrls?.length&&(e.tlogUrls=t.tlogUrls),t.tsaUrls?.length&&(e.tsaUrls=t.tsaUrls),e}};Ti.ClientTrustConfig={fromJSON(t){return{mediaType:ia(t.mediaType)?globalThis.String(t.mediaType):"",trustedRoot:ia(t.trustedRoot)?Ti.TrustedRoot.fromJSON(t.trustedRoot):void 0,signingConfig:ia(t.signingConfig)?Ti.SigningConfig.fromJSON(t.signingConfig):void 0}},toJSON(t){let e={};return t.mediaType!==""&&(e.mediaType=t.mediaType),t.trustedRoot!==void 0&&(e.trustedRoot=Ti.TrustedRoot.toJSON(t.trustedRoot)),t.signingConfig!==void 0&&(e.signingConfig=Ti.SigningConfig.toJSON(t.signingConfig)),e}};function ia(t){return t!=null}});var $Se=_(Vr=>{"use strict";Object.defineProperty(Vr,"__esModule",{value:!0});Vr.Input=Vr.Artifact=Vr.ArtifactVerificationOptions_ObserverTimestampOptions=Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions=Vr.ArtifactVerificationOptions_TimestampAuthorityOptions=Vr.ArtifactVerificationOptions_CtlogOptions=Vr.ArtifactVerificationOptions_TlogOptions=Vr.ArtifactVerificationOptions=Vr.PublicKeyIdentities=Vr.CertificateIdentities=Vr.CertificateIdentity=void 0;var ZSe=NV(),Eg=Ww(),XSe=OV();Vr.CertificateIdentity={fromJSON(t){return{issuer:gi(t.issuer)?globalThis.String(t.issuer):"",san:gi(t.san)?Eg.SubjectAlternativeName.fromJSON(t.san):void 0,oids:globalThis.Array.isArray(t?.oids)?t.oids.map(e=>Eg.ObjectIdentifierValuePair.fromJSON(e)):[]}},toJSON(t){let e={};return t.issuer!==""&&(e.issuer=t.issuer),t.san!==void 0&&(e.san=Eg.SubjectAlternativeName.toJSON(t.san)),t.oids?.length&&(e.oids=t.oids.map(r=>Eg.ObjectIdentifierValuePair.toJSON(r))),e}};Vr.CertificateIdentities={fromJSON(t){return{identities:globalThis.Array.isArray(t?.identities)?t.identities.map(e=>Vr.CertificateIdentity.fromJSON(e)):[]}},toJSON(t){let e={};return t.identities?.length&&(e.identities=t.identities.map(r=>Vr.CertificateIdentity.toJSON(r))),e}};Vr.PublicKeyIdentities={fromJSON(t){return{publicKeys:globalThis.Array.isArray(t?.publicKeys)?t.publicKeys.map(e=>Eg.PublicKey.fromJSON(e)):[]}},toJSON(t){let e={};return t.publicKeys?.length&&(e.publicKeys=t.publicKeys.map(r=>Eg.PublicKey.toJSON(r))),e}};Vr.ArtifactVerificationOptions={fromJSON(t){return{signers:gi(t.certificateIdentities)?{$case:"certificateIdentities",certificateIdentities:Vr.CertificateIdentities.fromJSON(t.certificateIdentities)}:gi(t.publicKeys)?{$case:"publicKeys",publicKeys:Vr.PublicKeyIdentities.fromJSON(t.publicKeys)}:void 0,tlogOptions:gi(t.tlogOptions)?Vr.ArtifactVerificationOptions_TlogOptions.fromJSON(t.tlogOptions):void 0,ctlogOptions:gi(t.ctlogOptions)?Vr.ArtifactVerificationOptions_CtlogOptions.fromJSON(t.ctlogOptions):void 0,tsaOptions:gi(t.tsaOptions)?Vr.ArtifactVerificationOptions_TimestampAuthorityOptions.fromJSON(t.tsaOptions):void 0,integratedTsOptions:gi(t.integratedTsOptions)?Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.fromJSON(t.integratedTsOptions):void 0,observerOptions:gi(t.observerOptions)?Vr.ArtifactVerificationOptions_ObserverTimestampOptions.fromJSON(t.observerOptions):void 0}},toJSON(t){let e={};return t.signers?.$case==="certificateIdentities"?e.certificateIdentities=Vr.CertificateIdentities.toJSON(t.signers.certificateIdentities):t.signers?.$case==="publicKeys"&&(e.publicKeys=Vr.PublicKeyIdentities.toJSON(t.signers.publicKeys)),t.tlogOptions!==void 0&&(e.tlogOptions=Vr.ArtifactVerificationOptions_TlogOptions.toJSON(t.tlogOptions)),t.ctlogOptions!==void 0&&(e.ctlogOptions=Vr.ArtifactVerificationOptions_CtlogOptions.toJSON(t.ctlogOptions)),t.tsaOptions!==void 0&&(e.tsaOptions=Vr.ArtifactVerificationOptions_TimestampAuthorityOptions.toJSON(t.tsaOptions)),t.integratedTsOptions!==void 0&&(e.integratedTsOptions=Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions.toJSON(t.integratedTsOptions)),t.observerOptions!==void 0&&(e.observerOptions=Vr.ArtifactVerificationOptions_ObserverTimestampOptions.toJSON(t.observerOptions)),e}};Vr.ArtifactVerificationOptions_TlogOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,performOnlineVerification:gi(t.performOnlineVerification)?globalThis.Boolean(t.performOnlineVerification):!1,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.performOnlineVerification!==!1&&(e.performOnlineVerification=t.performOnlineVerification),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_CtlogOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_TimestampAuthorityOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_TlogIntegratedTimestampOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.ArtifactVerificationOptions_ObserverTimestampOptions={fromJSON(t){return{threshold:gi(t.threshold)?globalThis.Number(t.threshold):0,disable:gi(t.disable)?globalThis.Boolean(t.disable):!1}},toJSON(t){let e={};return t.threshold!==0&&(e.threshold=Math.round(t.threshold)),t.disable!==!1&&(e.disable=t.disable),e}};Vr.Artifact={fromJSON(t){return{data:gi(t.artifactUri)?{$case:"artifactUri",artifactUri:globalThis.String(t.artifactUri)}:gi(t.artifact)?{$case:"artifact",artifact:Buffer.from(hIt(t.artifact))}:gi(t.artifactDigest)?{$case:"artifactDigest",artifactDigest:Eg.HashOutput.fromJSON(t.artifactDigest)}:void 0}},toJSON(t){let e={};return t.data?.$case==="artifactUri"?e.artifactUri=t.data.artifactUri:t.data?.$case==="artifact"?e.artifact=gIt(t.data.artifact):t.data?.$case==="artifactDigest"&&(e.artifactDigest=Eg.HashOutput.toJSON(t.data.artifactDigest)),e}};Vr.Input={fromJSON(t){return{artifactTrustRoot:gi(t.artifactTrustRoot)?XSe.TrustedRoot.fromJSON(t.artifactTrustRoot):void 0,artifactVerificationOptions:gi(t.artifactVerificationOptions)?Vr.ArtifactVerificationOptions.fromJSON(t.artifactVerificationOptions):void 0,bundle:gi(t.bundle)?ZSe.Bundle.fromJSON(t.bundle):void 0,artifact:gi(t.artifact)?Vr.Artifact.fromJSON(t.artifact):void 0}},toJSON(t){let e={};return t.artifactTrustRoot!==void 0&&(e.artifactTrustRoot=XSe.TrustedRoot.toJSON(t.artifactTrustRoot)),t.artifactVerificationOptions!==void 0&&(e.artifactVerificationOptions=Vr.ArtifactVerificationOptions.toJSON(t.artifactVerificationOptions)),t.bundle!==void 0&&(e.bundle=ZSe.Bundle.toJSON(t.bundle)),t.artifact!==void 0&&(e.artifact=Vr.Artifact.toJSON(t.artifact)),e}};function hIt(t){return Uint8Array.from(globalThis.Buffer.from(t,"base64"))}function gIt(t){return globalThis.Buffer.from(t).toString("base64")}function gi(t){return t!=null}});var mP=_(Xc=>{"use strict";var dIt=Xc&&Xc.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),Yw=Xc&&Xc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&dIt(e,t,r)};Object.defineProperty(Xc,"__esModule",{value:!0});Yw(TV(),Xc);Yw(NV(),Xc);Yw(Ww(),Xc);Yw(FV(),Xc);Yw(OV(),Xc);Yw($Se(),Xc)});var YN=_(Il=>{"use strict";Object.defineProperty(Il,"__esModule",{value:!0});Il.BUNDLE_V03_MEDIA_TYPE=Il.BUNDLE_V03_LEGACY_MEDIA_TYPE=Il.BUNDLE_V02_MEDIA_TYPE=Il.BUNDLE_V01_MEDIA_TYPE=void 0;Il.isBundleWithCertificateChain=mIt;Il.isBundleWithPublicKey=yIt;Il.isBundleWithMessageSignature=EIt;Il.isBundleWithDsseEnvelope=IIt;Il.BUNDLE_V01_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.1";Il.BUNDLE_V02_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.2";Il.BUNDLE_V03_LEGACY_MEDIA_TYPE="application/vnd.dev.sigstore.bundle+json;version=0.3";Il.BUNDLE_V03_MEDIA_TYPE="application/vnd.dev.sigstore.bundle.v0.3+json";function mIt(t){return t.verificationMaterial.content.$case==="x509CertificateChain"}function yIt(t){return t.verificationMaterial.content.$case==="publicKey"}function EIt(t){return t.content.$case==="messageSignature"}function IIt(t){return t.content.$case==="dsseEnvelope"}});var tDe=_(JN=>{"use strict";Object.defineProperty(JN,"__esModule",{value:!0});JN.toMessageSignatureBundle=wIt;JN.toDSSEBundle=BIt;var CIt=mP(),VN=YN();function wIt(t){return{mediaType:t.certificateChain?VN.BUNDLE_V02_MEDIA_TYPE:VN.BUNDLE_V03_MEDIA_TYPE,content:{$case:"messageSignature",messageSignature:{messageDigest:{algorithm:CIt.HashAlgorithm.SHA2_256,digest:t.digest},signature:t.signature}},verificationMaterial:eDe(t)}}function BIt(t){return{mediaType:t.certificateChain?VN.BUNDLE_V02_MEDIA_TYPE:VN.BUNDLE_V03_MEDIA_TYPE,content:{$case:"dsseEnvelope",dsseEnvelope:vIt(t)},verificationMaterial:eDe(t)}}function vIt(t){return{payloadType:t.artifactType,payload:t.artifact,signatures:[SIt(t)]}}function SIt(t){return{keyid:t.keyHint||"",sig:t.signature}}function eDe(t){return{content:DIt(t),tlogEntries:[],timestampVerificationData:{rfc3161Timestamps:[]}}}function DIt(t){return t.certificate?t.certificateChain?{$case:"x509CertificateChain",x509CertificateChain:{certificates:[{rawBytes:t.certificate}]}}:{$case:"certificate",certificate:{rawBytes:t.certificate}}:{$case:"publicKey",publicKey:{hint:t.keyHint||""}}}});var MV=_(KN=>{"use strict";Object.defineProperty(KN,"__esModule",{value:!0});KN.ValidationError=void 0;var LV=class extends Error{constructor(e,r){super(e),this.fields=r}};KN.ValidationError=LV});var UV=_(ey=>{"use strict";Object.defineProperty(ey,"__esModule",{value:!0});ey.assertBundle=PIt;ey.assertBundleV01=rDe;ey.isBundleV01=bIt;ey.assertBundleV02=xIt;ey.assertBundleLatest=kIt;var zN=MV();function PIt(t){let e=ZN(t);if(e.length>0)throw new zN.ValidationError("invalid bundle",e)}function rDe(t){let e=[];if(e.push(...ZN(t)),e.push(...QIt(t)),e.length>0)throw new zN.ValidationError("invalid v0.1 bundle",e)}function bIt(t){try{return rDe(t),!0}catch{return!1}}function xIt(t){let e=[];if(e.push(...ZN(t)),e.push(...nDe(t)),e.length>0)throw new zN.ValidationError("invalid v0.2 bundle",e)}function kIt(t){let e=[];if(e.push(...ZN(t)),e.push(...nDe(t)),e.push(...RIt(t)),e.length>0)throw new zN.ValidationError("invalid bundle",e)}function ZN(t){let e=[];if((t.mediaType===void 0||!t.mediaType.match(/^application\/vnd\.dev\.sigstore\.bundle\+json;version=\d\.\d/)&&!t.mediaType.match(/^application\/vnd\.dev\.sigstore\.bundle\.v\d\.\d\+json/))&&e.push("mediaType"),t.content===void 0)e.push("content");else switch(t.content.$case){case"messageSignature":t.content.messageSignature.messageDigest===void 0?e.push("content.messageSignature.messageDigest"):t.content.messageSignature.messageDigest.digest.length===0&&e.push("content.messageSignature.messageDigest.digest"),t.content.messageSignature.signature.length===0&&e.push("content.messageSignature.signature");break;case"dsseEnvelope":t.content.dsseEnvelope.payload.length===0&&e.push("content.dsseEnvelope.payload"),t.content.dsseEnvelope.signatures.length!==1?e.push("content.dsseEnvelope.signatures"):t.content.dsseEnvelope.signatures[0].sig.length===0&&e.push("content.dsseEnvelope.signatures[0].sig");break}if(t.verificationMaterial===void 0)e.push("verificationMaterial");else{if(t.verificationMaterial.content===void 0)e.push("verificationMaterial.content");else switch(t.verificationMaterial.content.$case){case"x509CertificateChain":t.verificationMaterial.content.x509CertificateChain.certificates.length===0&&e.push("verificationMaterial.content.x509CertificateChain.certificates"),t.verificationMaterial.content.x509CertificateChain.certificates.forEach((r,s)=>{r.rawBytes.length===0&&e.push(`verificationMaterial.content.x509CertificateChain.certificates[${s}].rawBytes`)});break;case"certificate":t.verificationMaterial.content.certificate.rawBytes.length===0&&e.push("verificationMaterial.content.certificate.rawBytes");break}t.verificationMaterial.tlogEntries===void 0?e.push("verificationMaterial.tlogEntries"):t.verificationMaterial.tlogEntries.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.logId===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].logId`),r.kindVersion===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].kindVersion`)})}return e}function QIt(t){let e=[];return t.verificationMaterial&&t.verificationMaterial.tlogEntries?.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionPromise===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].inclusionPromise`)}),e}function nDe(t){let e=[];return t.verificationMaterial&&t.verificationMaterial.tlogEntries?.length>0&&t.verificationMaterial.tlogEntries.forEach((r,s)=>{r.inclusionProof===void 0?e.push(`verificationMaterial.tlogEntries[${s}].inclusionProof`):r.inclusionProof.checkpoint===void 0&&e.push(`verificationMaterial.tlogEntries[${s}].inclusionProof.checkpoint`)}),e}function RIt(t){let e=[];return t.verificationMaterial?.content?.$case==="x509CertificateChain"&&e.push("verificationMaterial.content.$case"),e}});var sDe=_(BA=>{"use strict";Object.defineProperty(BA,"__esModule",{value:!0});BA.envelopeToJSON=BA.envelopeFromJSON=BA.bundleToJSON=BA.bundleFromJSON=void 0;var XN=mP(),iDe=YN(),_V=UV(),TIt=t=>{let e=XN.Bundle.fromJSON(t);switch(e.mediaType){case iDe.BUNDLE_V01_MEDIA_TYPE:(0,_V.assertBundleV01)(e);break;case iDe.BUNDLE_V02_MEDIA_TYPE:(0,_V.assertBundleV02)(e);break;default:(0,_V.assertBundleLatest)(e);break}return e};BA.bundleFromJSON=TIt;var FIt=t=>XN.Bundle.toJSON(t);BA.bundleToJSON=FIt;var NIt=t=>XN.Envelope.fromJSON(t);BA.envelopeFromJSON=NIt;var OIt=t=>XN.Envelope.toJSON(t);BA.envelopeToJSON=OIt});var EP=_(Zr=>{"use strict";Object.defineProperty(Zr,"__esModule",{value:!0});Zr.isBundleV01=Zr.assertBundleV02=Zr.assertBundleV01=Zr.assertBundleLatest=Zr.assertBundle=Zr.envelopeToJSON=Zr.envelopeFromJSON=Zr.bundleToJSON=Zr.bundleFromJSON=Zr.ValidationError=Zr.isBundleWithPublicKey=Zr.isBundleWithMessageSignature=Zr.isBundleWithDsseEnvelope=Zr.isBundleWithCertificateChain=Zr.BUNDLE_V03_MEDIA_TYPE=Zr.BUNDLE_V03_LEGACY_MEDIA_TYPE=Zr.BUNDLE_V02_MEDIA_TYPE=Zr.BUNDLE_V01_MEDIA_TYPE=Zr.toMessageSignatureBundle=Zr.toDSSEBundle=void 0;var oDe=tDe();Object.defineProperty(Zr,"toDSSEBundle",{enumerable:!0,get:function(){return oDe.toDSSEBundle}});Object.defineProperty(Zr,"toMessageSignatureBundle",{enumerable:!0,get:function(){return oDe.toMessageSignatureBundle}});var Ig=YN();Object.defineProperty(Zr,"BUNDLE_V01_MEDIA_TYPE",{enumerable:!0,get:function(){return Ig.BUNDLE_V01_MEDIA_TYPE}});Object.defineProperty(Zr,"BUNDLE_V02_MEDIA_TYPE",{enumerable:!0,get:function(){return Ig.BUNDLE_V02_MEDIA_TYPE}});Object.defineProperty(Zr,"BUNDLE_V03_LEGACY_MEDIA_TYPE",{enumerable:!0,get:function(){return Ig.BUNDLE_V03_LEGACY_MEDIA_TYPE}});Object.defineProperty(Zr,"BUNDLE_V03_MEDIA_TYPE",{enumerable:!0,get:function(){return Ig.BUNDLE_V03_MEDIA_TYPE}});Object.defineProperty(Zr,"isBundleWithCertificateChain",{enumerable:!0,get:function(){return Ig.isBundleWithCertificateChain}});Object.defineProperty(Zr,"isBundleWithDsseEnvelope",{enumerable:!0,get:function(){return Ig.isBundleWithDsseEnvelope}});Object.defineProperty(Zr,"isBundleWithMessageSignature",{enumerable:!0,get:function(){return Ig.isBundleWithMessageSignature}});Object.defineProperty(Zr,"isBundleWithPublicKey",{enumerable:!0,get:function(){return Ig.isBundleWithPublicKey}});var LIt=MV();Object.defineProperty(Zr,"ValidationError",{enumerable:!0,get:function(){return LIt.ValidationError}});var $N=sDe();Object.defineProperty(Zr,"bundleFromJSON",{enumerable:!0,get:function(){return $N.bundleFromJSON}});Object.defineProperty(Zr,"bundleToJSON",{enumerable:!0,get:function(){return $N.bundleToJSON}});Object.defineProperty(Zr,"envelopeFromJSON",{enumerable:!0,get:function(){return $N.envelopeFromJSON}});Object.defineProperty(Zr,"envelopeToJSON",{enumerable:!0,get:function(){return $N.envelopeToJSON}});var yP=UV();Object.defineProperty(Zr,"assertBundle",{enumerable:!0,get:function(){return yP.assertBundle}});Object.defineProperty(Zr,"assertBundleLatest",{enumerable:!0,get:function(){return yP.assertBundleLatest}});Object.defineProperty(Zr,"assertBundleV01",{enumerable:!0,get:function(){return yP.assertBundleV01}});Object.defineProperty(Zr,"assertBundleV02",{enumerable:!0,get:function(){return yP.assertBundleV02}});Object.defineProperty(Zr,"isBundleV01",{enumerable:!0,get:function(){return yP.isBundleV01}})});var IP=_(tO=>{"use strict";Object.defineProperty(tO,"__esModule",{value:!0});tO.ByteStream=void 0;var HV=class extends Error{},eO=class t{constructor(e){this.start=0,e?(this.buf=e,this.view=Buffer.from(e)):(this.buf=new ArrayBuffer(0),this.view=Buffer.from(this.buf))}get buffer(){return this.view.subarray(0,this.start)}get length(){return this.view.byteLength}get position(){return this.start}seek(e){this.start=e}slice(e,r){let s=e+r;if(s>this.length)throw new HV("request past end of buffer");return this.view.subarray(e,s)}appendChar(e){this.ensureCapacity(1),this.view[this.start]=e,this.start+=1}appendUint16(e){this.ensureCapacity(2);let r=new Uint16Array([e]),s=new Uint8Array(r.buffer);this.view[this.start]=s[1],this.view[this.start+1]=s[0],this.start+=2}appendUint24(e){this.ensureCapacity(3);let r=new Uint32Array([e]),s=new Uint8Array(r.buffer);this.view[this.start]=s[2],this.view[this.start+1]=s[1],this.view[this.start+2]=s[0],this.start+=3}appendView(e){this.ensureCapacity(e.length),this.view.set(e,this.start),this.start+=e.length}getBlock(e){if(e<=0)return Buffer.alloc(0);if(this.start+e>this.view.length)throw new Error("request past end of buffer");let r=this.view.subarray(this.start,this.start+e);return this.start+=e,r}getUint8(){return this.getBlock(1)[0]}getUint16(){let e=this.getBlock(2);return e[0]<<8|e[1]}ensureCapacity(e){if(this.start+e>this.view.byteLength){let r=t.BLOCK_SIZE+(e>t.BLOCK_SIZE?e:0);this.realloc(this.view.byteLength+r)}}realloc(e){let r=new ArrayBuffer(e),s=Buffer.from(r);s.set(this.view),this.buf=r,this.view=s}};tO.ByteStream=eO;eO.BLOCK_SIZE=1024});var rO=_(Vw=>{"use strict";Object.defineProperty(Vw,"__esModule",{value:!0});Vw.ASN1TypeError=Vw.ASN1ParseError=void 0;var jV=class extends Error{};Vw.ASN1ParseError=jV;var GV=class extends Error{};Vw.ASN1TypeError=GV});var lDe=_(nO=>{"use strict";Object.defineProperty(nO,"__esModule",{value:!0});nO.decodeLength=MIt;nO.encodeLength=UIt;var aDe=rO();function MIt(t){let e=t.getUint8();if(!(e&128))return e;let r=e&127;if(r>6)throw new aDe.ASN1ParseError("length exceeds 6 byte limit");let s=0;for(let a=0;a0n;)r.unshift(Number(e&255n)),e=e>>8n;return Buffer.from([128|r.length,...r])}});var uDe=_(Cg=>{"use strict";Object.defineProperty(Cg,"__esModule",{value:!0});Cg.parseInteger=jIt;Cg.parseStringASCII=cDe;Cg.parseTime=GIt;Cg.parseOID=qIt;Cg.parseBoolean=WIt;Cg.parseBitString=YIt;var _It=/^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/,HIt=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d{3})?Z$/;function jIt(t){let e=0,r=t.length,s=t[e],a=s>127,n=a?255:0;for(;s==n&&++e=50?1900:2e3,s[1]=a.toString()}return new Date(`${s[1]}-${s[2]}-${s[3]}T${s[4]}:${s[5]}:${s[6]}Z`)}function qIt(t){let e=0,r=t.length,s=t[e++],a=Math.floor(s/40),n=s%40,c=`${a}.${n}`,f=0;for(;e=f;--p)a.push(c>>p&1)}return a}});var ADe=_(iO=>{"use strict";Object.defineProperty(iO,"__esModule",{value:!0});iO.ASN1Tag=void 0;var fDe=rO(),ty={BOOLEAN:1,INTEGER:2,BIT_STRING:3,OCTET_STRING:4,OBJECT_IDENTIFIER:6,SEQUENCE:16,SET:17,PRINTABLE_STRING:19,UTC_TIME:23,GENERALIZED_TIME:24},qV={UNIVERSAL:0,APPLICATION:1,CONTEXT_SPECIFIC:2,PRIVATE:3},WV=class{constructor(e){if(this.number=e&31,this.constructed=(e&32)===32,this.class=e>>6,this.number===31)throw new fDe.ASN1ParseError("long form tags not supported");if(this.class===qV.UNIVERSAL&&this.number===0)throw new fDe.ASN1ParseError("unsupported tag 0x00")}isUniversal(){return this.class===qV.UNIVERSAL}isContextSpecific(e){let r=this.class===qV.CONTEXT_SPECIFIC;return e!==void 0?r&&this.number===e:r}isBoolean(){return this.isUniversal()&&this.number===ty.BOOLEAN}isInteger(){return this.isUniversal()&&this.number===ty.INTEGER}isBitString(){return this.isUniversal()&&this.number===ty.BIT_STRING}isOctetString(){return this.isUniversal()&&this.number===ty.OCTET_STRING}isOID(){return this.isUniversal()&&this.number===ty.OBJECT_IDENTIFIER}isUTCTime(){return this.isUniversal()&&this.number===ty.UTC_TIME}isGeneralizedTime(){return this.isUniversal()&&this.number===ty.GENERALIZED_TIME}toDER(){return this.number|(this.constructed?32:0)|this.class<<6}};iO.ASN1Tag=WV});var dDe=_(oO=>{"use strict";Object.defineProperty(oO,"__esModule",{value:!0});oO.ASN1Obj=void 0;var YV=IP(),ry=rO(),hDe=lDe(),Jw=uDe(),VIt=ADe(),sO=class{constructor(e,r,s){this.tag=e,this.value=r,this.subs=s}static parseBuffer(e){return gDe(new YV.ByteStream(e))}toDER(){let e=new YV.ByteStream;if(this.subs.length>0)for(let a of this.subs)e.appendView(a.toDER());else e.appendView(this.value);let r=e.buffer,s=new YV.ByteStream;return s.appendChar(this.tag.toDER()),s.appendView((0,hDe.encodeLength)(r.length)),s.appendView(r),s.buffer}toBoolean(){if(!this.tag.isBoolean())throw new ry.ASN1TypeError("not a boolean");return(0,Jw.parseBoolean)(this.value)}toInteger(){if(!this.tag.isInteger())throw new ry.ASN1TypeError("not an integer");return(0,Jw.parseInteger)(this.value)}toOID(){if(!this.tag.isOID())throw new ry.ASN1TypeError("not an OID");return(0,Jw.parseOID)(this.value)}toDate(){switch(!0){case this.tag.isUTCTime():return(0,Jw.parseTime)(this.value,!0);case this.tag.isGeneralizedTime():return(0,Jw.parseTime)(this.value,!1);default:throw new ry.ASN1TypeError("not a date")}}toBitString(){if(!this.tag.isBitString())throw new ry.ASN1TypeError("not a bit string");return(0,Jw.parseBitString)(this.value)}};oO.ASN1Obj=sO;function gDe(t){let e=new VIt.ASN1Tag(t.getUint8()),r=(0,hDe.decodeLength)(t),s=t.slice(t.position,r),a=t.position,n=[];if(e.constructed)n=pDe(t,r);else if(e.isOctetString())try{n=pDe(t,r)}catch{}return n.length===0&&t.seek(a+r),new sO(e,s,n)}function pDe(t,e){let r=t.position+e;if(r>t.length)throw new ry.ASN1ParseError("invalid length");let s=[];for(;t.position{"use strict";Object.defineProperty(aO,"__esModule",{value:!0});aO.ASN1Obj=void 0;var JIt=dDe();Object.defineProperty(aO,"ASN1Obj",{enumerable:!0,get:function(){return JIt.ASN1Obj}})});var Kw=_(wg=>{"use strict";var KIt=wg&&wg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(wg,"__esModule",{value:!0});wg.createPublicKey=zIt;wg.digest=ZIt;wg.verify=XIt;wg.bufferEqual=$It;var CP=KIt(Ie("crypto"));function zIt(t,e="spki"){return typeof t=="string"?CP.default.createPublicKey(t):CP.default.createPublicKey({key:t,format:"der",type:e})}function ZIt(t,...e){let r=CP.default.createHash(t);for(let s of e)r.update(s);return r.digest()}function XIt(t,e,r,s){try{return CP.default.verify(s,t,e,r)}catch{return!1}}function $It(t,e){try{return CP.default.timingSafeEqual(t,e)}catch{return!1}}});var mDe=_(VV=>{"use strict";Object.defineProperty(VV,"__esModule",{value:!0});VV.preAuthEncoding=tCt;var eCt="DSSEv1";function tCt(t,e){let r=[eCt,t.length,t,e.length,""].join(" ");return Buffer.concat([Buffer.from(r,"ascii"),e])}});var IDe=_(cO=>{"use strict";Object.defineProperty(cO,"__esModule",{value:!0});cO.base64Encode=rCt;cO.base64Decode=nCt;var yDe="base64",EDe="utf-8";function rCt(t){return Buffer.from(t,EDe).toString(yDe)}function nCt(t){return Buffer.from(t,yDe).toString(EDe)}});var CDe=_(KV=>{"use strict";Object.defineProperty(KV,"__esModule",{value:!0});KV.canonicalize=JV;function JV(t){let e="";if(t===null||typeof t!="object"||t.toJSON!=null)e+=JSON.stringify(t);else if(Array.isArray(t)){e+="[";let r=!0;t.forEach(s=>{r||(e+=","),r=!1,e+=JV(s)}),e+="]"}else{e+="{";let r=!0;Object.keys(t).sort().forEach(s=>{r||(e+=","),r=!1,e+=JSON.stringify(s),e+=":",e+=JV(t[s])}),e+="}"}return e}});var zV=_(uO=>{"use strict";Object.defineProperty(uO,"__esModule",{value:!0});uO.toDER=oCt;uO.fromDER=aCt;var iCt=/-----BEGIN (.*)-----/,sCt=/-----END (.*)-----/;function oCt(t){let e="";return t.split(` `).forEach(r=>{r.match(iCt)||r.match(sCt)||(e+=r)}),Buffer.from(e,"base64")}function aCt(t,e="CERTIFICATE"){let s=t.toString("base64").match(/.{1,64}/g)||"";return[`-----BEGIN ${e}-----`,...s,`-----END ${e}-----`].join(` `).concat(` `)}});var fO=_(zw=>{"use strict";Object.defineProperty(zw,"__esModule",{value:!0});zw.SHA2_HASH_ALGOS=zw.ECDSA_SIGNATURE_ALGOS=void 0;zw.ECDSA_SIGNATURE_ALGOS={"1.2.840.10045.4.3.1":"sha224","1.2.840.10045.4.3.2":"sha256","1.2.840.10045.4.3.3":"sha384","1.2.840.10045.4.3.4":"sha512"};zw.SHA2_HASH_ALGOS={"2.16.840.1.101.3.4.2.1":"sha256","2.16.840.1.101.3.4.2.2":"sha384","2.16.840.1.101.3.4.2.3":"sha512"}});var XV=_(AO=>{"use strict";Object.defineProperty(AO,"__esModule",{value:!0});AO.RFC3161TimestampVerificationError=void 0;var ZV=class extends Error{};AO.RFC3161TimestampVerificationError=ZV});var BDe=_(vA=>{"use strict";var lCt=vA&&vA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),cCt=vA&&vA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),uCt=vA&&vA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&lCt(e,t,r);return cCt(e,t),e};Object.defineProperty(vA,"__esModule",{value:!0});vA.TSTInfo=void 0;var wDe=uCt(Kw()),fCt=fO(),ACt=XV(),$V=class{constructor(e){this.root=e}get version(){return this.root.subs[0].toInteger()}get genTime(){return this.root.subs[4].toDate()}get messageImprintHashAlgorithm(){let e=this.messageImprintObj.subs[0].subs[0].toOID();return fCt.SHA2_HASH_ALGOS[e]}get messageImprintHashedMessage(){return this.messageImprintObj.subs[1].value}get raw(){return this.root.toDER()}verify(e){let r=wDe.digest(this.messageImprintHashAlgorithm,e);if(!wDe.bufferEqual(r,this.messageImprintHashedMessage))throw new ACt.RFC3161TimestampVerificationError("message imprint does not match artifact")}get messageImprintObj(){return this.root.subs[2]}};vA.TSTInfo=$V});var SDe=_(SA=>{"use strict";var pCt=SA&&SA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),hCt=SA&&SA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),gCt=SA&&SA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&pCt(e,t,r);return hCt(e,t),e};Object.defineProperty(SA,"__esModule",{value:!0});SA.RFC3161Timestamp=void 0;var dCt=lO(),e7=gCt(Kw()),vDe=fO(),wP=XV(),mCt=BDe(),yCt="1.2.840.113549.1.7.2",ECt="1.2.840.113549.1.9.16.1.4",ICt="1.2.840.113549.1.9.4",t7=class t{constructor(e){this.root=e}static parse(e){let r=dCt.ASN1Obj.parseBuffer(e);return new t(r)}get status(){return this.pkiStatusInfoObj.subs[0].toInteger()}get contentType(){return this.contentTypeObj.toOID()}get eContentType(){return this.eContentTypeObj.toOID()}get signingTime(){return this.tstInfo.genTime}get signerIssuer(){return this.signerSidObj.subs[0].value}get signerSerialNumber(){return this.signerSidObj.subs[1].value}get signerDigestAlgorithm(){let e=this.signerDigestAlgorithmObj.subs[0].toOID();return vDe.SHA2_HASH_ALGOS[e]}get signatureAlgorithm(){let e=this.signatureAlgorithmObj.subs[0].toOID();return vDe.ECDSA_SIGNATURE_ALGOS[e]}get signatureValue(){return this.signatureValueObj.value}get tstInfo(){return new mCt.TSTInfo(this.eContentObj.subs[0].subs[0])}verify(e,r){if(!this.timeStampTokenObj)throw new wP.RFC3161TimestampVerificationError("timeStampToken is missing");if(this.contentType!==yCt)throw new wP.RFC3161TimestampVerificationError(`incorrect content type: ${this.contentType}`);if(this.eContentType!==ECt)throw new wP.RFC3161TimestampVerificationError(`incorrect encapsulated content type: ${this.eContentType}`);this.tstInfo.verify(e),this.verifyMessageDigest(),this.verifySignature(r)}verifyMessageDigest(){let e=e7.digest(this.signerDigestAlgorithm,this.tstInfo.raw),r=this.messageDigestAttributeObj.subs[1].subs[0].value;if(!e7.bufferEqual(e,r))throw new wP.RFC3161TimestampVerificationError("signed data does not match tstInfo")}verifySignature(e){let r=this.signedAttrsObj.toDER();if(r[0]=49,!e7.verify(r,e,this.signatureValue,this.signatureAlgorithm))throw new wP.RFC3161TimestampVerificationError("signature verification failed")}get pkiStatusInfoObj(){return this.root.subs[0]}get timeStampTokenObj(){return this.root.subs[1]}get contentTypeObj(){return this.timeStampTokenObj.subs[0]}get signedDataObj(){return this.timeStampTokenObj.subs.find(r=>r.tag.isContextSpecific(0)).subs[0]}get encapContentInfoObj(){return this.signedDataObj.subs[2]}get signerInfosObj(){let e=this.signedDataObj;return e.subs[e.subs.length-1]}get signerInfoObj(){return this.signerInfosObj.subs[0]}get eContentTypeObj(){return this.encapContentInfoObj.subs[0]}get eContentObj(){return this.encapContentInfoObj.subs[1]}get signedAttrsObj(){return this.signerInfoObj.subs.find(r=>r.tag.isContextSpecific(0))}get messageDigestAttributeObj(){return this.signedAttrsObj.subs.find(r=>r.subs[0].tag.isOID()&&r.subs[0].toOID()===ICt)}get signerSidObj(){return this.signerInfoObj.subs[1]}get signerDigestAlgorithmObj(){return this.signerInfoObj.subs[2]}get signatureAlgorithmObj(){return this.signerInfoObj.subs[4]}get signatureValueObj(){return this.signerInfoObj.subs[5]}};SA.RFC3161Timestamp=t7});var DDe=_(pO=>{"use strict";Object.defineProperty(pO,"__esModule",{value:!0});pO.RFC3161Timestamp=void 0;var CCt=SDe();Object.defineProperty(pO,"RFC3161Timestamp",{enumerable:!0,get:function(){return CCt.RFC3161Timestamp}})});var bDe=_(DA=>{"use strict";var wCt=DA&&DA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),BCt=DA&&DA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),vCt=DA&&DA.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&wCt(e,t,r);return BCt(e,t),e};Object.defineProperty(DA,"__esModule",{value:!0});DA.SignedCertificateTimestamp=void 0;var SCt=vCt(Kw()),PDe=IP(),r7=class t{constructor(e){this.version=e.version,this.logID=e.logID,this.timestamp=e.timestamp,this.extensions=e.extensions,this.hashAlgorithm=e.hashAlgorithm,this.signatureAlgorithm=e.signatureAlgorithm,this.signature=e.signature}get datetime(){return new Date(Number(this.timestamp.readBigInt64BE()))}get algorithm(){switch(this.hashAlgorithm){case 0:return"none";case 1:return"md5";case 2:return"sha1";case 3:return"sha224";case 4:return"sha256";case 5:return"sha384";case 6:return"sha512";default:return"unknown"}}verify(e,r){let s=new PDe.ByteStream;return s.appendChar(this.version),s.appendChar(0),s.appendView(this.timestamp),s.appendUint16(1),s.appendView(e),s.appendUint16(this.extensions.byteLength),this.extensions.byteLength>0&&s.appendView(this.extensions),SCt.verify(s.buffer,r,this.signature,this.algorithm)}static parse(e){let r=new PDe.ByteStream(e),s=r.getUint8(),a=r.getBlock(32),n=r.getBlock(8),c=r.getUint16(),f=r.getBlock(c),p=r.getUint8(),h=r.getUint8(),E=r.getUint16(),C=r.getBlock(E);if(r.position!==e.length)throw new Error("SCT buffer length mismatch");return new t({version:s,logID:a,timestamp:n,extensions:f,hashAlgorithm:p,signatureAlgorithm:h,signature:C})}};DA.SignedCertificateTimestamp=r7});var c7=_(sa=>{"use strict";Object.defineProperty(sa,"__esModule",{value:!0});sa.X509SCTExtension=sa.X509SubjectKeyIDExtension=sa.X509AuthorityKeyIDExtension=sa.X509SubjectAlternativeNameExtension=sa.X509KeyUsageExtension=sa.X509BasicConstraintsExtension=sa.X509Extension=void 0;var DCt=IP(),PCt=bDe(),ph=class{constructor(e){this.root=e}get oid(){return this.root.subs[0].toOID()}get critical(){return this.root.subs.length===3?this.root.subs[1].toBoolean():!1}get value(){return this.extnValueObj.value}get valueObj(){return this.extnValueObj}get extnValueObj(){return this.root.subs[this.root.subs.length-1]}};sa.X509Extension=ph;var n7=class extends ph{get isCA(){return this.sequence.subs[0]?.toBoolean()??!1}get pathLenConstraint(){return this.sequence.subs.length>1?this.sequence.subs[1].toInteger():void 0}get sequence(){return this.extnValueObj.subs[0]}};sa.X509BasicConstraintsExtension=n7;var i7=class extends ph{get digitalSignature(){return this.bitString[0]===1}get keyCertSign(){return this.bitString[5]===1}get crlSign(){return this.bitString[6]===1}get bitString(){return this.extnValueObj.subs[0].toBitString()}};sa.X509KeyUsageExtension=i7;var s7=class extends ph{get rfc822Name(){return this.findGeneralName(1)?.value.toString("ascii")}get uri(){return this.findGeneralName(6)?.value.toString("ascii")}otherName(e){let r=this.findGeneralName(0);return r===void 0||r.subs[0].toOID()!==e?void 0:r.subs[1].subs[0].value.toString("ascii")}findGeneralName(e){return this.generalNames.find(r=>r.tag.isContextSpecific(e))}get generalNames(){return this.extnValueObj.subs[0].subs}};sa.X509SubjectAlternativeNameExtension=s7;var o7=class extends ph{get keyIdentifier(){return this.findSequenceMember(0)?.value}findSequenceMember(e){return this.sequence.subs.find(r=>r.tag.isContextSpecific(e))}get sequence(){return this.extnValueObj.subs[0]}};sa.X509AuthorityKeyIDExtension=o7;var a7=class extends ph{get keyIdentifier(){return this.extnValueObj.subs[0].value}};sa.X509SubjectKeyIDExtension=a7;var l7=class extends ph{constructor(e){super(e)}get signedCertificateTimestamps(){let e=this.extnValueObj.subs[0].value,r=new DCt.ByteStream(e),s=r.getUint16()+2,a=[];for(;r.position{"use strict";var bCt=ic&&ic.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),xCt=ic&&ic.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),kDe=ic&&ic.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&bCt(e,t,r);return xCt(e,t),e};Object.defineProperty(ic,"__esModule",{value:!0});ic.X509Certificate=ic.EXTENSION_OID_SCT=void 0;var kCt=lO(),xDe=kDe(Kw()),QCt=fO(),RCt=kDe(zV()),ny=c7(),TCt="2.5.29.14",FCt="2.5.29.15",NCt="2.5.29.17",OCt="2.5.29.19",LCt="2.5.29.35";ic.EXTENSION_OID_SCT="1.3.6.1.4.1.11129.2.4.2";var u7=class t{constructor(e){this.root=e}static parse(e){let r=typeof e=="string"?RCt.toDER(e):e,s=kCt.ASN1Obj.parseBuffer(r);return new t(s)}get tbsCertificate(){return this.tbsCertificateObj}get version(){return`v${(this.versionObj.subs[0].toInteger()+BigInt(1)).toString()}`}get serialNumber(){return this.serialNumberObj.value}get notBefore(){return this.validityObj.subs[0].toDate()}get notAfter(){return this.validityObj.subs[1].toDate()}get issuer(){return this.issuerObj.value}get subject(){return this.subjectObj.value}get publicKey(){return this.subjectPublicKeyInfoObj.toDER()}get signatureAlgorithm(){let e=this.signatureAlgorithmObj.subs[0].toOID();return QCt.ECDSA_SIGNATURE_ALGOS[e]}get signatureValue(){return this.signatureValueObj.value.subarray(1)}get subjectAltName(){let e=this.extSubjectAltName;return e?.uri||e?.rfc822Name}get extensions(){return this.extensionsObj?.subs[0]?.subs||[]}get extKeyUsage(){let e=this.findExtension(FCt);return e?new ny.X509KeyUsageExtension(e):void 0}get extBasicConstraints(){let e=this.findExtension(OCt);return e?new ny.X509BasicConstraintsExtension(e):void 0}get extSubjectAltName(){let e=this.findExtension(NCt);return e?new ny.X509SubjectAlternativeNameExtension(e):void 0}get extAuthorityKeyID(){let e=this.findExtension(LCt);return e?new ny.X509AuthorityKeyIDExtension(e):void 0}get extSubjectKeyID(){let e=this.findExtension(TCt);return e?new ny.X509SubjectKeyIDExtension(e):void 0}get extSCT(){let e=this.findExtension(ic.EXTENSION_OID_SCT);return e?new ny.X509SCTExtension(e):void 0}get isCA(){let e=this.extBasicConstraints?.isCA||!1;return this.extKeyUsage?e&&this.extKeyUsage.keyCertSign:e}extension(e){let r=this.findExtension(e);return r?new ny.X509Extension(r):void 0}verify(e){let r=e?.publicKey||this.publicKey,s=xDe.createPublicKey(r);return xDe.verify(this.tbsCertificate.toDER(),s,this.signatureValue,this.signatureAlgorithm)}validForDate(e){return this.notBefore<=e&&e<=this.notAfter}equals(e){return this.root.toDER().equals(e.root.toDER())}clone(){let e=this.root.toDER(),r=Buffer.alloc(e.length);return e.copy(r),t.parse(r)}findExtension(e){return this.extensions.find(r=>r.subs[0].toOID()===e)}get tbsCertificateObj(){return this.root.subs[0]}get signatureAlgorithmObj(){return this.root.subs[1]}get signatureValueObj(){return this.root.subs[2]}get versionObj(){return this.tbsCertificateObj.subs[0]}get serialNumberObj(){return this.tbsCertificateObj.subs[1]}get issuerObj(){return this.tbsCertificateObj.subs[3]}get validityObj(){return this.tbsCertificateObj.subs[4]}get subjectObj(){return this.tbsCertificateObj.subs[5]}get subjectPublicKeyInfoObj(){return this.tbsCertificateObj.subs[6]}get extensionsObj(){return this.tbsCertificateObj.subs.find(e=>e.tag.isContextSpecific(3))}};ic.X509Certificate=u7});var TDe=_(Bg=>{"use strict";Object.defineProperty(Bg,"__esModule",{value:!0});Bg.X509SCTExtension=Bg.X509Certificate=Bg.EXTENSION_OID_SCT=void 0;var RDe=QDe();Object.defineProperty(Bg,"EXTENSION_OID_SCT",{enumerable:!0,get:function(){return RDe.EXTENSION_OID_SCT}});Object.defineProperty(Bg,"X509Certificate",{enumerable:!0,get:function(){return RDe.X509Certificate}});var MCt=c7();Object.defineProperty(Bg,"X509SCTExtension",{enumerable:!0,get:function(){return MCt.X509SCTExtension}})});var Cl=_(Jn=>{"use strict";var UCt=Jn&&Jn.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),_Ct=Jn&&Jn.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),BP=Jn&&Jn.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&UCt(e,t,r);return _Ct(e,t),e};Object.defineProperty(Jn,"__esModule",{value:!0});Jn.X509SCTExtension=Jn.X509Certificate=Jn.EXTENSION_OID_SCT=Jn.ByteStream=Jn.RFC3161Timestamp=Jn.pem=Jn.json=Jn.encoding=Jn.dsse=Jn.crypto=Jn.ASN1Obj=void 0;var HCt=lO();Object.defineProperty(Jn,"ASN1Obj",{enumerable:!0,get:function(){return HCt.ASN1Obj}});Jn.crypto=BP(Kw());Jn.dsse=BP(mDe());Jn.encoding=BP(IDe());Jn.json=BP(CDe());Jn.pem=BP(zV());var jCt=DDe();Object.defineProperty(Jn,"RFC3161Timestamp",{enumerable:!0,get:function(){return jCt.RFC3161Timestamp}});var GCt=IP();Object.defineProperty(Jn,"ByteStream",{enumerable:!0,get:function(){return GCt.ByteStream}});var f7=TDe();Object.defineProperty(Jn,"EXTENSION_OID_SCT",{enumerable:!0,get:function(){return f7.EXTENSION_OID_SCT}});Object.defineProperty(Jn,"X509Certificate",{enumerable:!0,get:function(){return f7.X509Certificate}});Object.defineProperty(Jn,"X509SCTExtension",{enumerable:!0,get:function(){return f7.X509SCTExtension}})});var FDe=_(A7=>{"use strict";Object.defineProperty(A7,"__esModule",{value:!0});A7.extractJWTSubject=WCt;var qCt=Cl();function WCt(t){let e=t.split(".",3),r=JSON.parse(qCt.encoding.base64Decode(e[1]));switch(r.iss){case"https://accounts.google.com":case"https://oauth2.sigstore.dev/auth":return r.email;default:return r.sub}}});var NDe=_((Zrr,YCt)=>{YCt.exports={name:"@sigstore/sign",version:"3.1.0",description:"Sigstore signing library",main:"dist/index.js",types:"dist/index.d.ts",scripts:{clean:"shx rm -rf dist *.tsbuildinfo",build:"tsc --build",test:"jest"},files:["dist"],author:"bdehamer@github.com",license:"Apache-2.0",repository:{type:"git",url:"git+https://github.com/sigstore/sigstore-js.git"},bugs:{url:"https://github.com/sigstore/sigstore-js/issues"},homepage:"https://github.com/sigstore/sigstore-js/tree/main/packages/sign#readme",publishConfig:{provenance:!0},devDependencies:{"@sigstore/jest":"^0.0.0","@sigstore/mock":"^0.10.0","@sigstore/rekor-types":"^3.0.0","@types/make-fetch-happen":"^10.0.4","@types/promise-retry":"^1.1.6"},dependencies:{"@sigstore/bundle":"^3.1.0","@sigstore/core":"^2.0.0","@sigstore/protobuf-specs":"^0.4.0","make-fetch-happen":"^14.0.2","proc-log":"^5.0.0","promise-retry":"^2.0.1"},engines:{node:"^18.17.0 || >=20.5.0"}}});var LDe=_(Zw=>{"use strict";var VCt=Zw&&Zw.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Zw,"__esModule",{value:!0});Zw.getUserAgent=void 0;var ODe=VCt(Ie("os")),JCt=()=>{let t=NDe().version,e=process.version,r=ODe.default.platform(),s=ODe.default.arch();return`sigstore-js/${t} (Node ${e}) (${r}/${s})`};Zw.getUserAgent=JCt});var vg=_(Vi=>{"use strict";var KCt=Vi&&Vi.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),zCt=Vi&&Vi.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),MDe=Vi&&Vi.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;a{"use strict";Object.defineProperty(hO,"__esModule",{value:!0});hO.BaseBundleBuilder=void 0;var p7=class{constructor(e){this.signer=e.signer,this.witnesses=e.witnesses}async create(e){let r=await this.prepare(e).then(f=>this.signer.sign(f)),s=await this.package(e,r),a=await Promise.all(this.witnesses.map(f=>f.testify(s.content,ZCt(r.key)))),n=[],c=[];return a.forEach(({tlogEntries:f,rfc3161Timestamps:p})=>{n.push(...f??[]),c.push(...p??[])}),s.verificationMaterial.tlogEntries=n,s.verificationMaterial.timestampVerificationData={rfc3161Timestamps:c},s}async prepare(e){return e.data}};hO.BaseBundleBuilder=p7;function ZCt(t){switch(t.$case){case"publicKey":return t.publicKey;case"x509Certificate":return t.certificate}}});var d7=_(PA=>{"use strict";var XCt=PA&&PA.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),$Ct=PA&&PA.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),ewt=PA&&PA.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;a{"use strict";Object.defineProperty(gO,"__esModule",{value:!0});gO.DSSEBundleBuilder=void 0;var nwt=vg(),iwt=h7(),swt=d7(),m7=class extends iwt.BaseBundleBuilder{constructor(e){super(e),this.certificateChain=e.certificateChain??!1}async prepare(e){let r=_De(e);return nwt.dsse.preAuthEncoding(r.type,r.data)}async package(e,r){return(0,swt.toDSSEBundle)(_De(e),r,this.certificateChain)}};gO.DSSEBundleBuilder=m7;function _De(t){return{...t,type:t.type??""}}});var jDe=_(dO=>{"use strict";Object.defineProperty(dO,"__esModule",{value:!0});dO.MessageSignatureBundleBuilder=void 0;var owt=h7(),awt=d7(),y7=class extends owt.BaseBundleBuilder{constructor(e){super(e)}async package(e,r){return(0,awt.toMessageSignatureBundle)(e,r)}};dO.MessageSignatureBundleBuilder=y7});var GDe=_(Xw=>{"use strict";Object.defineProperty(Xw,"__esModule",{value:!0});Xw.MessageSignatureBundleBuilder=Xw.DSSEBundleBuilder=void 0;var lwt=HDe();Object.defineProperty(Xw,"DSSEBundleBuilder",{enumerable:!0,get:function(){return lwt.DSSEBundleBuilder}});var cwt=jDe();Object.defineProperty(Xw,"MessageSignatureBundleBuilder",{enumerable:!0,get:function(){return cwt.MessageSignatureBundleBuilder}})});var yO=_(mO=>{"use strict";Object.defineProperty(mO,"__esModule",{value:!0});mO.HTTPError=void 0;var E7=class extends Error{constructor({status:e,message:r,location:s}){super(`(${e}) ${r}`),this.statusCode=e,this.location=s}};mO.HTTPError=E7});var $w=_(SP=>{"use strict";Object.defineProperty(SP,"__esModule",{value:!0});SP.InternalError=void 0;SP.internalError=fwt;var uwt=yO(),EO=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.name=this.constructor.name,this.cause=s,this.code=e}};SP.InternalError=EO;function fwt(t,e,r){throw t instanceof uwt.HTTPError&&(r+=` - ${t.message}`),new EO({code:e,message:r,cause:t})}});var IO=_((anr,qDe)=>{qDe.exports=fetch});var WDe=_(e1=>{"use strict";var Awt=e1&&e1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e1,"__esModule",{value:!0});e1.CIContextProvider=void 0;var pwt=Awt(IO()),hwt=[gwt,dwt],I7=class{constructor(e="sigstore"){this.audience=e}async getToken(){return Promise.any(hwt.map(e=>e(this.audience))).catch(()=>Promise.reject("CI: no tokens available"))}};e1.CIContextProvider=I7;async function gwt(t){if(!process.env.ACTIONS_ID_TOKEN_REQUEST_URL||!process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN)return Promise.reject("no token available");let e=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);return e.searchParams.append("audience",t),(await(0,pwt.default)(e.href,{retry:2,headers:{Accept:"application/json",Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).json().then(s=>s.value)}async function dwt(){return process.env.SIGSTORE_ID_TOKEN?process.env.SIGSTORE_ID_TOKEN:Promise.reject("no token available")}});var YDe=_(CO=>{"use strict";Object.defineProperty(CO,"__esModule",{value:!0});CO.CIContextProvider=void 0;var mwt=WDe();Object.defineProperty(CO,"CIContextProvider",{enumerable:!0,get:function(){return mwt.CIContextProvider}})});var JDe=_((unr,VDe)=>{var ywt=Symbol("proc-log.meta");VDe.exports={META:ywt,output:{LEVELS:["standard","error","buffer","flush"],KEYS:{standard:"standard",error:"error",buffer:"buffer",flush:"flush"},standard:function(...t){return process.emit("output","standard",...t)},error:function(...t){return process.emit("output","error",...t)},buffer:function(...t){return process.emit("output","buffer",...t)},flush:function(...t){return process.emit("output","flush",...t)}},log:{LEVELS:["notice","error","warn","info","verbose","http","silly","timing","pause","resume"],KEYS:{notice:"notice",error:"error",warn:"warn",info:"info",verbose:"verbose",http:"http",silly:"silly",timing:"timing",pause:"pause",resume:"resume"},error:function(...t){return process.emit("log","error",...t)},notice:function(...t){return process.emit("log","notice",...t)},warn:function(...t){return process.emit("log","warn",...t)},info:function(...t){return process.emit("log","info",...t)},verbose:function(...t){return process.emit("log","verbose",...t)},http:function(...t){return process.emit("log","http",...t)},silly:function(...t){return process.emit("log","silly",...t)},timing:function(...t){return process.emit("log","timing",...t)},pause:function(){return process.emit("log","pause")},resume:function(){return process.emit("log","resume")}},time:{LEVELS:["start","end"],KEYS:{start:"start",end:"end"},start:function(t,e){process.emit("time","start",t);function r(){return process.emit("time","end",t)}if(typeof e=="function"){let s=e();return s&&s.finally?s.finally(r):(r(),s)}return r},end:function(t){return process.emit("time","end",t)}},input:{LEVELS:["start","end","read"],KEYS:{start:"start",end:"end",read:"read"},start:function(t){process.emit("input","start");function e(){return process.emit("input","end")}if(typeof t=="function"){let r=t();return r&&r.finally?r.finally(e):(e(),r)}return e},end:function(){return process.emit("input","end")},read:function(...t){let e,r,s=new Promise((a,n)=>{e=a,r=n});return process.emit("input","read",e,r,...t),s}}}});var ZDe=_((fnr,zDe)=>{"use strict";function KDe(t,e){for(let r in e)Object.defineProperty(t,r,{value:e[r],enumerable:!0,configurable:!0});return t}function Ewt(t,e,r){if(!t||typeof t=="string")throw new TypeError("Please pass an Error to err-code");r||(r={}),typeof e=="object"&&(r=e,e=void 0),e!=null&&(r.code=e);try{return KDe(t,r)}catch{r.message=t.message,r.stack=t.stack;let a=function(){};return a.prototype=Object.create(Object.getPrototypeOf(t)),KDe(new a,r)}}zDe.exports=Ewt});var $De=_((Anr,XDe)=>{function $c(t,e){typeof e=="boolean"&&(e={forever:e}),this._originalTimeouts=JSON.parse(JSON.stringify(t)),this._timeouts=t,this._options=e||{},this._maxRetryTime=e&&e.maxRetryTime||1/0,this._fn=null,this._errors=[],this._attempts=1,this._operationTimeout=null,this._operationTimeoutCb=null,this._timeout=null,this._operationStart=null,this._options.forever&&(this._cachedTimeouts=this._timeouts.slice(0))}XDe.exports=$c;$c.prototype.reset=function(){this._attempts=1,this._timeouts=this._originalTimeouts};$c.prototype.stop=function(){this._timeout&&clearTimeout(this._timeout),this._timeouts=[],this._cachedTimeouts=null};$c.prototype.retry=function(t){if(this._timeout&&clearTimeout(this._timeout),!t)return!1;var e=new Date().getTime();if(t&&e-this._operationStart>=this._maxRetryTime)return this._errors.unshift(new Error("RetryOperation timeout occurred")),!1;this._errors.push(t);var r=this._timeouts.shift();if(r===void 0)if(this._cachedTimeouts)this._errors.splice(this._errors.length-1,this._errors.length),this._timeouts=this._cachedTimeouts.slice(0),r=this._timeouts.shift();else return!1;var s=this,a=setTimeout(function(){s._attempts++,s._operationTimeoutCb&&(s._timeout=setTimeout(function(){s._operationTimeoutCb(s._attempts)},s._operationTimeout),s._options.unref&&s._timeout.unref()),s._fn(s._attempts)},r);return this._options.unref&&a.unref(),!0};$c.prototype.attempt=function(t,e){this._fn=t,e&&(e.timeout&&(this._operationTimeout=e.timeout),e.cb&&(this._operationTimeoutCb=e.cb));var r=this;this._operationTimeoutCb&&(this._timeout=setTimeout(function(){r._operationTimeoutCb()},r._operationTimeout)),this._operationStart=new Date().getTime(),this._fn(this._attempts)};$c.prototype.try=function(t){console.log("Using RetryOperation.try() is deprecated"),this.attempt(t)};$c.prototype.start=function(t){console.log("Using RetryOperation.start() is deprecated"),this.attempt(t)};$c.prototype.start=$c.prototype.try;$c.prototype.errors=function(){return this._errors};$c.prototype.attempts=function(){return this._attempts};$c.prototype.mainError=function(){if(this._errors.length===0)return null;for(var t={},e=null,r=0,s=0;s=r&&(e=a,r=c)}return e}});var ePe=_(iy=>{var Iwt=$De();iy.operation=function(t){var e=iy.timeouts(t);return new Iwt(e,{forever:t&&t.forever,unref:t&&t.unref,maxRetryTime:t&&t.maxRetryTime})};iy.timeouts=function(t){if(t instanceof Array)return[].concat(t);var e={retries:10,factor:2,minTimeout:1*1e3,maxTimeout:1/0,randomize:!1};for(var r in t)e[r]=t[r];if(e.minTimeout>e.maxTimeout)throw new Error("minTimeout is greater than maxTimeout");for(var s=[],a=0;a{tPe.exports=ePe()});var sPe=_((gnr,iPe)=>{"use strict";var Cwt=ZDe(),wwt=rPe(),Bwt=Object.prototype.hasOwnProperty;function nPe(t){return t&&t.code==="EPROMISERETRY"&&Bwt.call(t,"retried")}function vwt(t,e){var r,s;return typeof t=="object"&&typeof e=="function"&&(r=e,e=t,t=r),s=wwt.operation(e),new Promise(function(a,n){s.attempt(function(c){Promise.resolve().then(function(){return t(function(f){throw nPe(f)&&(f=f.retried),Cwt(new Error("Retrying"),"EPROMISERETRY",{retried:f})},c)}).then(a,function(f){nPe(f)&&(f=f.retried,s.retry(f||new Error))||n(f)})})})}iPe.exports=vwt});var wO=_(DP=>{"use strict";var aPe=DP&&DP.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(DP,"__esModule",{value:!0});DP.fetchWithRetry=Owt;var Swt=Ie("http2"),Dwt=aPe(IO()),oPe=JDe(),Pwt=aPe(sPe()),bwt=vg(),xwt=yO(),{HTTP2_HEADER_LOCATION:kwt,HTTP2_HEADER_CONTENT_TYPE:Qwt,HTTP2_HEADER_USER_AGENT:Rwt,HTTP_STATUS_INTERNAL_SERVER_ERROR:Twt,HTTP_STATUS_TOO_MANY_REQUESTS:Fwt,HTTP_STATUS_REQUEST_TIMEOUT:Nwt}=Swt.constants;async function Owt(t,e){return(0,Pwt.default)(async(r,s)=>{let a=e.method||"POST",n={[Rwt]:bwt.ua.getUserAgent(),...e.headers},c=await(0,Dwt.default)(t,{method:a,headers:n,body:e.body,timeout:e.timeout,retry:!1}).catch(f=>(oPe.log.http("fetch",`${a} ${t} attempt ${s} failed with ${f}`),r(f)));if(c.ok)return c;{let f=await Lwt(c);if(oPe.log.http("fetch",`${a} ${t} attempt ${s} failed with ${c.status}`),Mwt(c.status))return r(f);throw f}},Uwt(e.retry))}var Lwt=async t=>{let e=t.statusText,r=t.headers.get(kwt)||void 0;if(t.headers.get(Qwt)?.includes("application/json"))try{e=(await t.json()).message||e}catch{}return new xwt.HTTPError({status:t.status,message:e,location:r})},Mwt=t=>[Nwt,Fwt].includes(t)||t>=Twt,Uwt=t=>typeof t=="boolean"?{retries:t?1:0}:typeof t=="number"?{retries:t}:{retries:0,...t}});var lPe=_(BO=>{"use strict";Object.defineProperty(BO,"__esModule",{value:!0});BO.Fulcio=void 0;var _wt=wO(),C7=class{constructor(e){this.options=e}async createSigningCertificate(e){let{baseURL:r,retry:s,timeout:a}=this.options,n=`${r}/api/v2/signingCert`;return(await(0,_wt.fetchWithRetry)(n,{headers:{"Content-Type":"application/json"},body:JSON.stringify(e),timeout:a,retry:s})).json()}};BO.Fulcio=C7});var cPe=_(vO=>{"use strict";Object.defineProperty(vO,"__esModule",{value:!0});vO.CAClient=void 0;var Hwt=$w(),jwt=lPe(),w7=class{constructor(e){this.fulcio=new jwt.Fulcio({baseURL:e.fulcioBaseURL,retry:e.retry,timeout:e.timeout})}async createSigningCertificate(e,r,s){let a=Gwt(e,r,s);try{let n=await this.fulcio.createSigningCertificate(a);return(n.signedCertificateEmbeddedSct?n.signedCertificateEmbeddedSct:n.signedCertificateDetachedSct).chain.certificates}catch(n){(0,Hwt.internalError)(n,"CA_CREATE_SIGNING_CERTIFICATE_ERROR","error creating signing certificate")}}};vO.CAClient=w7;function Gwt(t,e,r){return{credentials:{oidcIdentityToken:t},publicKeyRequest:{publicKey:{algorithm:"ECDSA",content:e},proofOfPossession:r.toString("base64")}}}});var fPe=_(t1=>{"use strict";var qwt=t1&&t1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(t1,"__esModule",{value:!0});t1.EphemeralSigner=void 0;var uPe=qwt(Ie("crypto")),Wwt="ec",Ywt="P-256",B7=class{constructor(){this.keypair=uPe.default.generateKeyPairSync(Wwt,{namedCurve:Ywt})}async sign(e){let r=uPe.default.sign(null,e,this.keypair.privateKey),s=this.keypair.publicKey.export({format:"pem",type:"spki"}).toString("ascii");return{signature:r,key:{$case:"publicKey",publicKey:s}}}};t1.EphemeralSigner=B7});var APe=_(sy=>{"use strict";Object.defineProperty(sy,"__esModule",{value:!0});sy.FulcioSigner=sy.DEFAULT_FULCIO_URL=void 0;var v7=$w(),Vwt=vg(),Jwt=cPe(),Kwt=fPe();sy.DEFAULT_FULCIO_URL="https://fulcio.sigstore.dev";var S7=class{constructor(e){this.ca=new Jwt.CAClient({...e,fulcioBaseURL:e.fulcioBaseURL||sy.DEFAULT_FULCIO_URL}),this.identityProvider=e.identityProvider,this.keyHolder=e.keyHolder||new Kwt.EphemeralSigner}async sign(e){let r=await this.getIdentityToken(),s;try{s=Vwt.oidc.extractJWTSubject(r)}catch(f){throw new v7.InternalError({code:"IDENTITY_TOKEN_PARSE_ERROR",message:`invalid identity token: ${r}`,cause:f})}let a=await this.keyHolder.sign(Buffer.from(s));if(a.key.$case!=="publicKey")throw new v7.InternalError({code:"CA_CREATE_SIGNING_CERTIFICATE_ERROR",message:"unexpected format for signing key"});let n=await this.ca.createSigningCertificate(r,a.key.publicKey,a.signature);return{signature:(await this.keyHolder.sign(e)).signature,key:{$case:"x509Certificate",certificate:n[0]}}}async getIdentityToken(){try{return await this.identityProvider.getToken()}catch(e){throw new v7.InternalError({code:"IDENTITY_TOKEN_READ_ERROR",message:"error retrieving identity token",cause:e})}}};sy.FulcioSigner=S7});var hPe=_(r1=>{"use strict";Object.defineProperty(r1,"__esModule",{value:!0});r1.FulcioSigner=r1.DEFAULT_FULCIO_URL=void 0;var pPe=APe();Object.defineProperty(r1,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return pPe.DEFAULT_FULCIO_URL}});Object.defineProperty(r1,"FulcioSigner",{enumerable:!0,get:function(){return pPe.FulcioSigner}})});var mPe=_(SO=>{"use strict";Object.defineProperty(SO,"__esModule",{value:!0});SO.Rekor=void 0;var gPe=wO(),D7=class{constructor(e){this.options=e}async createEntry(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries`,f=await(await(0,gPe.fetchWithRetry)(n,{headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e),timeout:s,retry:a})).json();return dPe(f)}async getEntry(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/log/entries/${e}`,f=await(await(0,gPe.fetchWithRetry)(n,{method:"GET",headers:{Accept:"application/json"},timeout:s,retry:a})).json();return dPe(f)}};SO.Rekor=D7;function dPe(t){let e=Object.entries(t);if(e.length!=1)throw new Error("Received multiple entries in Rekor response");let[r,s]=e[0];return{...s,uuid:r}}});var EPe=_(DO=>{"use strict";Object.defineProperty(DO,"__esModule",{value:!0});DO.TLogClient=void 0;var yPe=$w(),zwt=yO(),Zwt=mPe(),P7=class{constructor(e){this.fetchOnConflict=e.fetchOnConflict??!1,this.rekor=new Zwt.Rekor({baseURL:e.rekorBaseURL,retry:e.retry,timeout:e.timeout})}async createEntry(e){let r;try{r=await this.rekor.createEntry(e)}catch(s){if(Xwt(s)&&this.fetchOnConflict){let a=s.location.split("/").pop()||"";try{r=await this.rekor.getEntry(a)}catch(n){(0,yPe.internalError)(n,"TLOG_FETCH_ENTRY_ERROR","error fetching tlog entry")}}else(0,yPe.internalError)(s,"TLOG_CREATE_ENTRY_ERROR","error creating tlog entry")}return r}};DO.TLogClient=P7;function Xwt(t){return t instanceof zwt.HTTPError&&t.statusCode===409&&t.location!==void 0}});var IPe=_(b7=>{"use strict";Object.defineProperty(b7,"__esModule",{value:!0});b7.toProposedEntry=e1t;var $wt=EP(),Sg=vg(),PP="sha256";function e1t(t,e,r="dsse"){switch(t.$case){case"dsseEnvelope":return r==="intoto"?n1t(t.dsseEnvelope,e):r1t(t.dsseEnvelope,e);case"messageSignature":return t1t(t.messageSignature,e)}}function t1t(t,e){let r=t.messageDigest.digest.toString("hex"),s=t.signature.toString("base64"),a=Sg.encoding.base64Encode(e);return{apiVersion:"0.0.1",kind:"hashedrekord",spec:{data:{hash:{algorithm:PP,value:r}},signature:{content:s,publicKey:{content:a}}}}}function r1t(t,e){let r=JSON.stringify((0,$wt.envelopeToJSON)(t)),s=Sg.encoding.base64Encode(e);return{apiVersion:"0.0.1",kind:"dsse",spec:{proposedContent:{envelope:r,verifiers:[s]}}}}function n1t(t,e){let r=Sg.crypto.digest(PP,t.payload).toString("hex"),s=i1t(t,e),a=Sg.encoding.base64Encode(t.payload.toString("base64")),n=Sg.encoding.base64Encode(t.signatures[0].sig.toString("base64")),c=t.signatures[0].keyid,f=Sg.encoding.base64Encode(e),p={payloadType:t.payloadType,payload:a,signatures:[{sig:n,publicKey:f}]};return c.length>0&&(p.signatures[0].keyid=c),{apiVersion:"0.0.2",kind:"intoto",spec:{content:{envelope:p,hash:{algorithm:PP,value:s},payloadHash:{algorithm:PP,value:r}}}}}function i1t(t,e){let r={payloadType:t.payloadType,payload:t.payload.toString("base64"),signatures:[{sig:t.signatures[0].sig.toString("base64"),publicKey:e}]};return t.signatures[0].keyid.length>0&&(r.signatures[0].keyid=t.signatures[0].keyid),Sg.crypto.digest(PP,Sg.json.canonicalize(r)).toString("hex")}});var CPe=_(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.RekorWitness=oy.DEFAULT_REKOR_URL=void 0;var s1t=vg(),o1t=EPe(),a1t=IPe();oy.DEFAULT_REKOR_URL="https://rekor.sigstore.dev";var x7=class{constructor(e){this.entryType=e.entryType,this.tlog=new o1t.TLogClient({...e,rekorBaseURL:e.rekorBaseURL||oy.DEFAULT_REKOR_URL})}async testify(e,r){let s=(0,a1t.toProposedEntry)(e,r,this.entryType),a=await this.tlog.createEntry(s);return l1t(a)}};oy.RekorWitness=x7;function l1t(t){let e=Buffer.from(t.logID,"hex"),r=s1t.encoding.base64Decode(t.body),s=JSON.parse(r),a=t?.verification?.signedEntryTimestamp?c1t(t.verification.signedEntryTimestamp):void 0,n=t?.verification?.inclusionProof?u1t(t.verification.inclusionProof):void 0;return{tlogEntries:[{logIndex:t.logIndex.toString(),logId:{keyId:e},integratedTime:t.integratedTime.toString(),kindVersion:{kind:s.kind,version:s.apiVersion},inclusionPromise:a,inclusionProof:n,canonicalizedBody:Buffer.from(t.body,"base64")}]}}function c1t(t){return{signedEntryTimestamp:Buffer.from(t,"base64")}}function u1t(t){return{logIndex:t.logIndex.toString(),treeSize:t.treeSize.toString(),rootHash:Buffer.from(t.rootHash,"hex"),hashes:t.hashes.map(e=>Buffer.from(e,"hex")),checkpoint:{envelope:t.checkpoint}}}});var wPe=_(PO=>{"use strict";Object.defineProperty(PO,"__esModule",{value:!0});PO.TimestampAuthority=void 0;var f1t=wO(),k7=class{constructor(e){this.options=e}async createTimestamp(e){let{baseURL:r,timeout:s,retry:a}=this.options,n=`${r}/api/v1/timestamp`;return(await(0,f1t.fetchWithRetry)(n,{headers:{"Content-Type":"application/json"},body:JSON.stringify(e),timeout:s,retry:a})).buffer()}};PO.TimestampAuthority=k7});var vPe=_(bO=>{"use strict";Object.defineProperty(bO,"__esModule",{value:!0});bO.TSAClient=void 0;var A1t=$w(),p1t=wPe(),h1t=vg(),BPe="sha256",Q7=class{constructor(e){this.tsa=new p1t.TimestampAuthority({baseURL:e.tsaBaseURL,retry:e.retry,timeout:e.timeout})}async createTimestamp(e){let r={artifactHash:h1t.crypto.digest(BPe,e).toString("base64"),hashAlgorithm:BPe};try{return await this.tsa.createTimestamp(r)}catch(s){(0,A1t.internalError)(s,"TSA_CREATE_TIMESTAMP_ERROR","error creating timestamp")}}};bO.TSAClient=Q7});var SPe=_(xO=>{"use strict";Object.defineProperty(xO,"__esModule",{value:!0});xO.TSAWitness=void 0;var g1t=vPe(),R7=class{constructor(e){this.tsa=new g1t.TSAClient({tsaBaseURL:e.tsaBaseURL,retry:e.retry,timeout:e.timeout})}async testify(e){let r=d1t(e);return{rfc3161Timestamps:[{signedTimestamp:await this.tsa.createTimestamp(r)}]}}};xO.TSAWitness=R7;function d1t(t){switch(t.$case){case"dsseEnvelope":return t.dsseEnvelope.signatures[0].sig;case"messageSignature":return t.messageSignature.signature}}});var PPe=_(Dg=>{"use strict";Object.defineProperty(Dg,"__esModule",{value:!0});Dg.TSAWitness=Dg.RekorWitness=Dg.DEFAULT_REKOR_URL=void 0;var DPe=CPe();Object.defineProperty(Dg,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return DPe.DEFAULT_REKOR_URL}});Object.defineProperty(Dg,"RekorWitness",{enumerable:!0,get:function(){return DPe.RekorWitness}});var m1t=SPe();Object.defineProperty(Dg,"TSAWitness",{enumerable:!0,get:function(){return m1t.TSAWitness}})});var F7=_(ys=>{"use strict";Object.defineProperty(ys,"__esModule",{value:!0});ys.TSAWitness=ys.RekorWitness=ys.DEFAULT_REKOR_URL=ys.FulcioSigner=ys.DEFAULT_FULCIO_URL=ys.CIContextProvider=ys.InternalError=ys.MessageSignatureBundleBuilder=ys.DSSEBundleBuilder=void 0;var bPe=GDe();Object.defineProperty(ys,"DSSEBundleBuilder",{enumerable:!0,get:function(){return bPe.DSSEBundleBuilder}});Object.defineProperty(ys,"MessageSignatureBundleBuilder",{enumerable:!0,get:function(){return bPe.MessageSignatureBundleBuilder}});var y1t=$w();Object.defineProperty(ys,"InternalError",{enumerable:!0,get:function(){return y1t.InternalError}});var E1t=YDe();Object.defineProperty(ys,"CIContextProvider",{enumerable:!0,get:function(){return E1t.CIContextProvider}});var xPe=hPe();Object.defineProperty(ys,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return xPe.DEFAULT_FULCIO_URL}});Object.defineProperty(ys,"FulcioSigner",{enumerable:!0,get:function(){return xPe.FulcioSigner}});var T7=PPe();Object.defineProperty(ys,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return T7.DEFAULT_REKOR_URL}});Object.defineProperty(ys,"RekorWitness",{enumerable:!0,get:function(){return T7.RekorWitness}});Object.defineProperty(ys,"TSAWitness",{enumerable:!0,get:function(){return T7.TSAWitness}})});var QPe=_(bP=>{"use strict";var kPe=bP&&bP.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(bP,"__esModule",{value:!0});bP.appDataPath=C1t;var I1t=kPe(Ie("os")),n1=kPe(Ie("path"));function C1t(t){let e=I1t.default.homedir();switch(process.platform){case"darwin":{let r=n1.default.join(e,"Library","Application Support");return n1.default.join(r,t)}case"win32":{let r=process.env.LOCALAPPDATA||n1.default.join(e,"AppData","Local");return n1.default.join(r,t,"Data")}default:{let r=process.env.XDG_DATA_HOME||n1.default.join(e,".local","share");return n1.default.join(r,t)}}}});var bA=_(wl=>{"use strict";Object.defineProperty(wl,"__esModule",{value:!0});wl.UnsupportedAlgorithmError=wl.CryptoError=wl.LengthOrHashMismatchError=wl.UnsignedMetadataError=wl.RepositoryError=wl.ValueError=void 0;var N7=class extends Error{};wl.ValueError=N7;var xP=class extends Error{};wl.RepositoryError=xP;var O7=class extends xP{};wl.UnsignedMetadataError=O7;var L7=class extends xP{};wl.LengthOrHashMismatchError=L7;var kO=class extends Error{};wl.CryptoError=kO;var M7=class extends kO{};wl.UnsupportedAlgorithmError=M7});var TPe=_(Pg=>{"use strict";Object.defineProperty(Pg,"__esModule",{value:!0});Pg.isDefined=w1t;Pg.isObject=RPe;Pg.isStringArray=B1t;Pg.isObjectArray=v1t;Pg.isStringRecord=S1t;Pg.isObjectRecord=D1t;function w1t(t){return t!==void 0}function RPe(t){return typeof t=="object"&&t!==null}function B1t(t){return Array.isArray(t)&&t.every(e=>typeof e=="string")}function v1t(t){return Array.isArray(t)&&t.every(RPe)}function S1t(t){return typeof t=="object"&&t!==null&&Object.keys(t).every(e=>typeof e=="string")&&Object.values(t).every(e=>typeof e=="string")}function D1t(t){return typeof t=="object"&&t!==null&&Object.keys(t).every(e=>typeof e=="string")&&Object.values(t).every(e=>typeof e=="object"&&e!==null)}});var _7=_((Fnr,OPe)=>{var FPe=",",P1t=":",b1t="[",x1t="]",k1t="{",Q1t="}";function U7(t){let e=[];if(typeof t=="string")e.push(NPe(t));else if(typeof t=="boolean")e.push(JSON.stringify(t));else if(Number.isInteger(t))e.push(JSON.stringify(t));else if(t===null)e.push(JSON.stringify(t));else if(Array.isArray(t)){e.push(b1t);let r=!0;t.forEach(s=>{r||e.push(FPe),r=!1,e.push(U7(s))}),e.push(x1t)}else if(typeof t=="object"){e.push(k1t);let r=!0;Object.keys(t).sort().forEach(s=>{r||e.push(FPe),r=!1,e.push(NPe(s)),e.push(P1t),e.push(U7(t[s]))}),e.push(Q1t)}else throw new TypeError("cannot encode "+t.toString());return e.join("")}function NPe(t){return'"'+t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'}OPe.exports={canonicalize:U7}});var LPe=_(i1=>{"use strict";var R1t=i1&&i1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(i1,"__esModule",{value:!0});i1.verifySignature=void 0;var T1t=_7(),F1t=R1t(Ie("crypto")),N1t=(t,e,r)=>{let s=Buffer.from((0,T1t.canonicalize)(t));return F1t.default.verify(void 0,s,e,Buffer.from(r,"hex"))};i1.verifySignature=N1t});var ff=_(eu=>{"use strict";var O1t=eu&&eu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),L1t=eu&&eu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),MPe=eu&&eu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&O1t(e,t,r);return L1t(e,t),e};Object.defineProperty(eu,"__esModule",{value:!0});eu.crypto=eu.guard=void 0;eu.guard=MPe(TPe());eu.crypto=MPe(LPe())});var ay=_(hh=>{"use strict";var M1t=hh&&hh.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hh,"__esModule",{value:!0});hh.Signed=hh.MetadataKind=void 0;hh.isMetadataKind=_1t;var U1t=M1t(Ie("util")),kP=bA(),H7=ff(),UPe=["1","0","31"],j7;(function(t){t.Root="root",t.Timestamp="timestamp",t.Snapshot="snapshot",t.Targets="targets"})(j7||(hh.MetadataKind=j7={}));function _1t(t){return typeof t=="string"&&Object.values(j7).includes(t)}var G7=class t{constructor(e){this.specVersion=e.specVersion||UPe.join(".");let r=this.specVersion.split(".");if(!(r.length===2||r.length===3)||!r.every(s=>H1t(s)))throw new kP.ValueError("Failed to parse specVersion");if(r[0]!=UPe[0])throw new kP.ValueError("Unsupported specVersion");this.expires=e.expires,this.version=e.version,this.unrecognizedFields=e.unrecognizedFields||{}}equals(e){return e instanceof t?this.specVersion===e.specVersion&&this.expires===e.expires&&this.version===e.version&&U1t.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}isExpired(e){return e||(e=new Date),e>=new Date(this.expires)}static commonFieldsFromJSON(e){let{spec_version:r,expires:s,version:a,...n}=e;if(H7.guard.isDefined(r)){if(typeof r!="string")throw new TypeError("spec_version must be a string")}else throw new kP.ValueError("spec_version is not defined");if(H7.guard.isDefined(s)){if(typeof s!="string")throw new TypeError("expires must be a string")}else throw new kP.ValueError("expires is not defined");if(H7.guard.isDefined(a)){if(typeof a!="number")throw new TypeError("version must be a number")}else throw new kP.ValueError("version is not defined");return{specVersion:r,expires:s,version:a,unrecognizedFields:n}}};hh.Signed=G7;function H1t(t){return!isNaN(Number(t))}});var QP=_(xg=>{"use strict";var _Pe=xg&&xg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xg,"__esModule",{value:!0});xg.TargetFile=xg.MetaFile=void 0;var HPe=_Pe(Ie("crypto")),RO=_Pe(Ie("util")),bg=bA(),QO=ff(),q7=class t{constructor(e){if(e.version<=0)throw new bg.ValueError("Metafile version must be at least 1");e.length!==void 0&&jPe(e.length),this.version=e.version,this.length=e.length,this.hashes=e.hashes,this.unrecognizedFields=e.unrecognizedFields||{}}equals(e){return e instanceof t?this.version===e.version&&this.length===e.length&&RO.default.isDeepStrictEqual(this.hashes,e.hashes)&&RO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}verify(e){if(this.length!==void 0&&e.length!==this.length)throw new bg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${e.length}`);this.hashes&&Object.entries(this.hashes).forEach(([r,s])=>{let a;try{a=HPe.default.createHash(r)}catch{throw new bg.LengthOrHashMismatchError(`Hash algorithm ${r} not supported`)}let n=a.update(e).digest("hex");if(n!==s)throw new bg.LengthOrHashMismatchError(`Expected hash ${s} but got ${n}`)})}toJSON(){let e={version:this.version,...this.unrecognizedFields};return this.length!==void 0&&(e.length=this.length),this.hashes&&(e.hashes=this.hashes),e}static fromJSON(e){let{version:r,length:s,hashes:a,...n}=e;if(typeof r!="number")throw new TypeError("version must be a number");if(QO.guard.isDefined(s)&&typeof s!="number")throw new TypeError("length must be a number");if(QO.guard.isDefined(a)&&!QO.guard.isStringRecord(a))throw new TypeError("hashes must be string keys and values");return new t({version:r,length:s,hashes:a,unrecognizedFields:n})}};xg.MetaFile=q7;var W7=class t{constructor(e){jPe(e.length),this.length=e.length,this.path=e.path,this.hashes=e.hashes,this.unrecognizedFields=e.unrecognizedFields||{}}get custom(){let e=this.unrecognizedFields.custom;return!e||Array.isArray(e)||typeof e!="object"?{}:e}equals(e){return e instanceof t?this.length===e.length&&this.path===e.path&&RO.default.isDeepStrictEqual(this.hashes,e.hashes)&&RO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}async verify(e){let r=0,s=Object.keys(this.hashes).reduce((a,n)=>{try{a[n]=HPe.default.createHash(n)}catch{throw new bg.LengthOrHashMismatchError(`Hash algorithm ${n} not supported`)}return a},{});for await(let a of e)r+=a.length,Object.values(s).forEach(n=>{n.update(a)});if(r!==this.length)throw new bg.LengthOrHashMismatchError(`Expected length ${this.length} but got ${r}`);Object.entries(s).forEach(([a,n])=>{let c=this.hashes[a],f=n.digest("hex");if(f!==c)throw new bg.LengthOrHashMismatchError(`Expected hash ${c} but got ${f}`)})}toJSON(){return{length:this.length,hashes:this.hashes,...this.unrecognizedFields}}static fromJSON(e,r){let{length:s,hashes:a,...n}=r;if(typeof s!="number")throw new TypeError("length must be a number");if(!QO.guard.isStringRecord(a))throw new TypeError("hashes must have string keys and values");return new t({length:s,path:e,hashes:a,unrecognizedFields:n})}};xg.TargetFile=W7;function jPe(t){if(t<0)throw new bg.ValueError("Length must be at least 0")}});var GPe=_(Y7=>{"use strict";Object.defineProperty(Y7,"__esModule",{value:!0});Y7.encodeOIDString=G1t;var j1t=6;function G1t(t){let e=t.split("."),r=parseInt(e[0],10)*40+parseInt(e[1],10),s=[];e.slice(2).forEach(n=>{let c=q1t(parseInt(n,10));s.push(...c)});let a=Buffer.from([r,...s]);return Buffer.from([j1t,a.length,...a])}function q1t(t){let e=[],r=0;for(;t>0;)e.unshift(t&127|r),t>>=7,r=128;return e}});var VPe=_(TP=>{"use strict";var W1t=TP&&TP.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(TP,"__esModule",{value:!0});TP.getPublicKey=K1t;var s1=W1t(Ie("crypto")),RP=bA(),V7=GPe(),TO=48,qPe=3,WPe=0,Y1t="1.3.101.112",V1t="1.2.840.10045.2.1",J1t="1.2.840.10045.3.1.7",J7="-----BEGIN PUBLIC KEY-----";function K1t(t){switch(t.keyType){case"rsa":return z1t(t);case"ed25519":return Z1t(t);case"ecdsa":case"ecdsa-sha2-nistp256":case"ecdsa-sha2-nistp384":return X1t(t);default:throw new RP.UnsupportedAlgorithmError(`Unsupported key type: ${t.keyType}`)}}function z1t(t){if(!t.keyVal.startsWith(J7))throw new RP.CryptoError("Invalid key format");let e=s1.default.createPublicKey(t.keyVal);switch(t.scheme){case"rsassa-pss-sha256":return{key:e,padding:s1.default.constants.RSA_PKCS1_PSS_PADDING};default:throw new RP.UnsupportedAlgorithmError(`Unsupported RSA scheme: ${t.scheme}`)}}function Z1t(t){let e;if(t.keyVal.startsWith(J7))e=s1.default.createPublicKey(t.keyVal);else{if(!YPe(t.keyVal))throw new RP.CryptoError("Invalid key format");e=s1.default.createPublicKey({key:$1t.hexToDER(t.keyVal),format:"der",type:"spki"})}return{key:e}}function X1t(t){let e;if(t.keyVal.startsWith(J7))e=s1.default.createPublicKey(t.keyVal);else{if(!YPe(t.keyVal))throw new RP.CryptoError("Invalid key format");e=s1.default.createPublicKey({key:e2t.hexToDER(t.keyVal),format:"der",type:"spki"})}return{key:e}}var $1t={hexToDER:t=>{let e=Buffer.from(t,"hex"),r=(0,V7.encodeOIDString)(Y1t),s=Buffer.concat([Buffer.concat([Buffer.from([TO]),Buffer.from([r.length]),r]),Buffer.concat([Buffer.from([qPe]),Buffer.from([e.length+1]),Buffer.from([WPe]),e])]);return Buffer.concat([Buffer.from([TO]),Buffer.from([s.length]),s])}},e2t={hexToDER:t=>{let e=Buffer.from(t,"hex"),r=Buffer.concat([Buffer.from([qPe]),Buffer.from([e.length+1]),Buffer.from([WPe]),e]),s=Buffer.concat([(0,V7.encodeOIDString)(V1t),(0,V7.encodeOIDString)(J1t)]),a=Buffer.concat([Buffer.from([TO]),Buffer.from([s.length]),s]);return Buffer.concat([Buffer.from([TO]),Buffer.from([a.length+r.length]),a,r])}},YPe=t=>/^[0-9a-fA-F]+$/.test(t)});var FO=_(o1=>{"use strict";var t2t=o1&&o1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(o1,"__esModule",{value:!0});o1.Key=void 0;var JPe=t2t(Ie("util")),FP=bA(),KPe=ff(),r2t=VPe(),K7=class t{constructor(e){let{keyID:r,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c}=e;this.keyID=r,this.keyType=s,this.scheme=a,this.keyVal=n,this.unrecognizedFields=c||{}}verifySignature(e){let r=e.signatures[this.keyID];if(!r)throw new FP.UnsignedMetadataError("no signature for key found in metadata");if(!this.keyVal.public)throw new FP.UnsignedMetadataError("no public key found");let s=(0,r2t.getPublicKey)({keyType:this.keyType,scheme:this.scheme,keyVal:this.keyVal.public}),a=e.signed.toJSON();try{if(!KPe.crypto.verifySignature(a,s,r.sig))throw new FP.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}catch(n){throw n instanceof FP.UnsignedMetadataError?n:new FP.UnsignedMetadataError(`failed to verify ${this.keyID} signature`)}}equals(e){return e instanceof t?this.keyID===e.keyID&&this.keyType===e.keyType&&this.scheme===e.scheme&&JPe.default.isDeepStrictEqual(this.keyVal,e.keyVal)&&JPe.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}toJSON(){return{keytype:this.keyType,scheme:this.scheme,keyval:this.keyVal,...this.unrecognizedFields}}static fromJSON(e,r){let{keytype:s,scheme:a,keyval:n,...c}=r;if(typeof s!="string")throw new TypeError("keytype must be a string");if(typeof a!="string")throw new TypeError("scheme must be a string");if(!KPe.guard.isStringRecord(n))throw new TypeError("keyval must be a string record");return new t({keyID:e,keyType:s,scheme:a,keyVal:n,unrecognizedFields:c})}};o1.Key=K7});var ebe=_((jnr,$Pe)=>{"use strict";$Pe.exports=ZPe;function ZPe(t,e,r){t instanceof RegExp&&(t=zPe(t,r)),e instanceof RegExp&&(e=zPe(e,r));var s=XPe(t,e,r);return s&&{start:s[0],end:s[1],pre:r.slice(0,s[0]),body:r.slice(s[0]+t.length,s[1]),post:r.slice(s[1]+e.length)}}function zPe(t,e){var r=e.match(t);return r?r[0]:null}ZPe.range=XPe;function XPe(t,e,r){var s,a,n,c,f,p=r.indexOf(t),h=r.indexOf(e,p+1),E=p;if(p>=0&&h>0){for(s=[],n=r.length;E>=0&&!f;)E==p?(s.push(E),p=r.indexOf(t,E+1)):s.length==1?f=[s.pop(),h]:(a=s.pop(),a=0?p:h;s.length&&(f=[n,c])}return f}});var lbe=_((Gnr,abe)=>{var tbe=ebe();abe.exports=s2t;var rbe="\0SLASH"+Math.random()+"\0",nbe="\0OPEN"+Math.random()+"\0",Z7="\0CLOSE"+Math.random()+"\0",ibe="\0COMMA"+Math.random()+"\0",sbe="\0PERIOD"+Math.random()+"\0";function z7(t){return parseInt(t,10)==t?parseInt(t,10):t.charCodeAt(0)}function n2t(t){return t.split("\\\\").join(rbe).split("\\{").join(nbe).split("\\}").join(Z7).split("\\,").join(ibe).split("\\.").join(sbe)}function i2t(t){return t.split(rbe).join("\\").split(nbe).join("{").split(Z7).join("}").split(ibe).join(",").split(sbe).join(".")}function obe(t){if(!t)return[""];var e=[],r=tbe("{","}",t);if(!r)return t.split(",");var s=r.pre,a=r.body,n=r.post,c=s.split(",");c[c.length-1]+="{"+a+"}";var f=obe(n);return n.length&&(c[c.length-1]+=f.shift(),c.push.apply(c,f)),e.push.apply(e,c),e}function s2t(t){return t?(t.substr(0,2)==="{}"&&(t="\\{\\}"+t.substr(2)),NP(n2t(t),!0).map(i2t)):[]}function o2t(t){return"{"+t+"}"}function a2t(t){return/^-?0\d/.test(t)}function l2t(t,e){return t<=e}function c2t(t,e){return t>=e}function NP(t,e){var r=[],s=tbe("{","}",t);if(!s)return[t];var a=s.pre,n=s.post.length?NP(s.post,!1):[""];if(/\$$/.test(s.pre))for(var c=0;c=0;if(!E&&!C)return s.post.match(/,.*\}/)?(t=s.pre+"{"+s.body+Z7+s.post,NP(t)):[t];var S;if(E)S=s.body.split(/\.\./);else if(S=obe(s.body),S.length===1&&(S=NP(S[0],!1).map(o2t),S.length===1))return n.map(function(Ce){return s.pre+S[0]+Ce});var b;if(E){var I=z7(S[0]),T=z7(S[1]),N=Math.max(S[0].length,S[1].length),U=S.length==3?Math.abs(z7(S[2])):1,W=l2t,ee=T0){var pe=new Array(me+1).join("0");ue<0?le="-"+pe+le.slice(1):le=pe+le}}b.push(le)}}else{b=[];for(var Be=0;Be{"use strict";Object.defineProperty(NO,"__esModule",{value:!0});NO.assertValidPattern=void 0;var u2t=1024*64,f2t=t=>{if(typeof t!="string")throw new TypeError("invalid pattern");if(t.length>u2t)throw new TypeError("pattern is too long")};NO.assertValidPattern=f2t});var fbe=_(OO=>{"use strict";Object.defineProperty(OO,"__esModule",{value:!0});OO.parseClass=void 0;var A2t={"[:alnum:]":["\\p{L}\\p{Nl}\\p{Nd}",!0],"[:alpha:]":["\\p{L}\\p{Nl}",!0],"[:ascii:]":["\\x00-\\x7f",!1],"[:blank:]":["\\p{Zs}\\t",!0],"[:cntrl:]":["\\p{Cc}",!0],"[:digit:]":["\\p{Nd}",!0],"[:graph:]":["\\p{Z}\\p{C}",!0,!0],"[:lower:]":["\\p{Ll}",!0],"[:print:]":["\\p{C}",!0],"[:punct:]":["\\p{P}",!0],"[:space:]":["\\p{Z}\\t\\r\\n\\v\\f",!0],"[:upper:]":["\\p{Lu}",!0],"[:word:]":["\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}",!0],"[:xdigit:]":["A-Fa-f0-9",!1]},OP=t=>t.replace(/[[\]\\-]/g,"\\$&"),p2t=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),ube=t=>t.join(""),h2t=(t,e)=>{let r=e;if(t.charAt(r)!=="[")throw new Error("not in a brace expression");let s=[],a=[],n=r+1,c=!1,f=!1,p=!1,h=!1,E=r,C="";e:for(;nC?s.push(OP(C)+"-"+OP(T)):T===C&&s.push(OP(T)),C="",n++;continue}if(t.startsWith("-]",n+1)){s.push(OP(T+"-")),n+=2;continue}if(t.startsWith("-",n+1)){C=T,n+=2;continue}s.push(OP(T)),n++}if(E{"use strict";Object.defineProperty(LO,"__esModule",{value:!0});LO.unescape=void 0;var g2t=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/\[([^\/\\])\]/g,"$1"):t.replace(/((?!\\).|^)\[([^\/\\])\]/g,"$1$2").replace(/\\([^\/])/g,"$1");LO.unescape=g2t});var eJ=_(HO=>{"use strict";Object.defineProperty(HO,"__esModule",{value:!0});HO.AST=void 0;var d2t=fbe(),UO=MO(),m2t=new Set(["!","?","+","*","@"]),Abe=t=>m2t.has(t),y2t="(?!(?:^|/)\\.\\.?(?:$|/))",_O="(?!\\.)",E2t=new Set(["[","."]),I2t=new Set(["..","."]),C2t=new Set("().*{}+?[]^$\\!"),w2t=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),$7="[^/]",pbe=$7+"*?",hbe=$7+"+?",X7=class t{type;#t;#r;#i=!1;#e=[];#n;#o;#l;#a=!1;#s;#c;#f=!1;constructor(e,r,s={}){this.type=e,e&&(this.#r=!0),this.#n=r,this.#t=this.#n?this.#n.#t:this,this.#s=this.#t===this?s:this.#t.#s,this.#l=this.#t===this?[]:this.#t.#l,e==="!"&&!this.#t.#a&&this.#l.push(this),this.#o=this.#n?this.#n.#e.length:0}get hasMagic(){if(this.#r!==void 0)return this.#r;for(let e of this.#e)if(typeof e!="string"&&(e.type||e.hasMagic))return this.#r=!0;return this.#r}toString(){return this.#c!==void 0?this.#c:this.type?this.#c=this.type+"("+this.#e.map(e=>String(e)).join("|")+")":this.#c=this.#e.map(e=>String(e)).join("")}#p(){if(this!==this.#t)throw new Error("should only call on root");if(this.#a)return this;this.toString(),this.#a=!0;let e;for(;e=this.#l.pop();){if(e.type!=="!")continue;let r=e,s=r.#n;for(;s;){for(let a=r.#o+1;!s.type&&atypeof r=="string"?r:r.toJSON()):[this.type,...this.#e.map(r=>r.toJSON())];return this.isStart()&&!this.type&&e.unshift([]),this.isEnd()&&(this===this.#t||this.#t.#a&&this.#n?.type==="!")&&e.push({}),e}isStart(){if(this.#t===this)return!0;if(!this.#n?.isStart())return!1;if(this.#o===0)return!0;let e=this.#n;for(let r=0;r{let[I,T,N,U]=typeof b=="string"?t.#h(b,this.#r,p):b.toRegExpSource(e);return this.#r=this.#r||N,this.#i=this.#i||U,I}).join(""),E="";if(this.isStart()&&typeof this.#e[0]=="string"&&!(this.#e.length===1&&I2t.has(this.#e[0]))){let I=E2t,T=r&&I.has(h.charAt(0))||h.startsWith("\\.")&&I.has(h.charAt(2))||h.startsWith("\\.\\.")&&I.has(h.charAt(4)),N=!r&&!e&&I.has(h.charAt(0));E=T?y2t:N?_O:""}let C="";return this.isEnd()&&this.#t.#a&&this.#n?.type==="!"&&(C="(?:$|\\/)"),[E+h+C,(0,UO.unescape)(h),this.#r=!!this.#r,this.#i]}let s=this.type==="*"||this.type==="+",a=this.type==="!"?"(?:(?!(?:":"(?:",n=this.#A(r);if(this.isStart()&&this.isEnd()&&!n&&this.type!=="!"){let p=this.toString();return this.#e=[p],this.type=null,this.#r=void 0,[p,(0,UO.unescape)(this.toString()),!1,!1]}let c=!s||e||r||!_O?"":this.#A(!0);c===n&&(c=""),c&&(n=`(?:${n})(?:${c})*?`);let f="";if(this.type==="!"&&this.#f)f=(this.isStart()&&!r?_O:"")+hbe;else{let p=this.type==="!"?"))"+(this.isStart()&&!r&&!e?_O:"")+pbe+")":this.type==="@"?")":this.type==="?"?")?":this.type==="+"&&c?")":this.type==="*"&&c?")?":`)${this.type}`;f=a+n+p}return[f,(0,UO.unescape)(n),this.#r=!!this.#r,this.#i]}#A(e){return this.#e.map(r=>{if(typeof r=="string")throw new Error("string type in extglob ast??");let[s,a,n,c]=r.toRegExpSource(e);return this.#i=this.#i||c,s}).filter(r=>!(this.isStart()&&this.isEnd())||!!r).join("|")}static#h(e,r,s=!1){let a=!1,n="",c=!1;for(let f=0;f{"use strict";Object.defineProperty(jO,"__esModule",{value:!0});jO.escape=void 0;var B2t=(t,{windowsPathsNoEscape:e=!1}={})=>e?t.replace(/[?*()[\]]/g,"[$&]"):t.replace(/[?*()[\]\\]/g,"\\$&");jO.escape=B2t});var Cbe=_(pr=>{"use strict";var v2t=pr&&pr.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pr,"__esModule",{value:!0});pr.unescape=pr.escape=pr.AST=pr.Minimatch=pr.match=pr.makeRe=pr.braceExpand=pr.defaults=pr.filter=pr.GLOBSTAR=pr.sep=pr.minimatch=void 0;var S2t=v2t(lbe()),GO=cbe(),mbe=eJ(),D2t=tJ(),P2t=MO(),b2t=(t,e,r={})=>((0,GO.assertValidPattern)(e),!r.nocomment&&e.charAt(0)==="#"?!1:new ly(e,r).match(t));pr.minimatch=b2t;var x2t=/^\*+([^+@!?\*\[\(]*)$/,k2t=t=>e=>!e.startsWith(".")&&e.endsWith(t),Q2t=t=>e=>e.endsWith(t),R2t=t=>(t=t.toLowerCase(),e=>!e.startsWith(".")&&e.toLowerCase().endsWith(t)),T2t=t=>(t=t.toLowerCase(),e=>e.toLowerCase().endsWith(t)),F2t=/^\*+\.\*+$/,N2t=t=>!t.startsWith(".")&&t.includes("."),O2t=t=>t!=="."&&t!==".."&&t.includes("."),L2t=/^\.\*+$/,M2t=t=>t!=="."&&t!==".."&&t.startsWith("."),U2t=/^\*+$/,_2t=t=>t.length!==0&&!t.startsWith("."),H2t=t=>t.length!==0&&t!=="."&&t!=="..",j2t=/^\?+([^+@!?\*\[\(]*)?$/,G2t=([t,e=""])=>{let r=ybe([t]);return e?(e=e.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(e)):r},q2t=([t,e=""])=>{let r=Ebe([t]);return e?(e=e.toLowerCase(),s=>r(s)&&s.toLowerCase().endsWith(e)):r},W2t=([t,e=""])=>{let r=Ebe([t]);return e?s=>r(s)&&s.endsWith(e):r},Y2t=([t,e=""])=>{let r=ybe([t]);return e?s=>r(s)&&s.endsWith(e):r},ybe=([t])=>{let e=t.length;return r=>r.length===e&&!r.startsWith(".")},Ebe=([t])=>{let e=t.length;return r=>r.length===e&&r!=="."&&r!==".."},Ibe=typeof process=="object"&&process?typeof process.env=="object"&&process.env&&process.env.__MINIMATCH_TESTING_PLATFORM__||process.platform:"posix",gbe={win32:{sep:"\\"},posix:{sep:"/"}};pr.sep=Ibe==="win32"?gbe.win32.sep:gbe.posix.sep;pr.minimatch.sep=pr.sep;pr.GLOBSTAR=Symbol("globstar **");pr.minimatch.GLOBSTAR=pr.GLOBSTAR;var V2t="[^/]",J2t=V2t+"*?",K2t="(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?",z2t="(?:(?!(?:\\/|^)\\.).)*?",Z2t=(t,e={})=>r=>(0,pr.minimatch)(r,t,e);pr.filter=Z2t;pr.minimatch.filter=pr.filter;var tu=(t,e={})=>Object.assign({},t,e),X2t=t=>{if(!t||typeof t!="object"||!Object.keys(t).length)return pr.minimatch;let e=pr.minimatch;return Object.assign((s,a,n={})=>e(s,a,tu(t,n)),{Minimatch:class extends e.Minimatch{constructor(a,n={}){super(a,tu(t,n))}static defaults(a){return e.defaults(tu(t,a)).Minimatch}},AST:class extends e.AST{constructor(a,n,c={}){super(a,n,tu(t,c))}static fromGlob(a,n={}){return e.AST.fromGlob(a,tu(t,n))}},unescape:(s,a={})=>e.unescape(s,tu(t,a)),escape:(s,a={})=>e.escape(s,tu(t,a)),filter:(s,a={})=>e.filter(s,tu(t,a)),defaults:s=>e.defaults(tu(t,s)),makeRe:(s,a={})=>e.makeRe(s,tu(t,a)),braceExpand:(s,a={})=>e.braceExpand(s,tu(t,a)),match:(s,a,n={})=>e.match(s,a,tu(t,n)),sep:e.sep,GLOBSTAR:pr.GLOBSTAR})};pr.defaults=X2t;pr.minimatch.defaults=pr.defaults;var $2t=(t,e={})=>((0,GO.assertValidPattern)(t),e.nobrace||!/\{(?:(?!\{).)*\}/.test(t)?[t]:(0,S2t.default)(t));pr.braceExpand=$2t;pr.minimatch.braceExpand=pr.braceExpand;var eBt=(t,e={})=>new ly(t,e).makeRe();pr.makeRe=eBt;pr.minimatch.makeRe=pr.makeRe;var tBt=(t,e,r={})=>{let s=new ly(e,r);return t=t.filter(a=>s.match(a)),s.options.nonull&&!t.length&&t.push(e),t};pr.match=tBt;pr.minimatch.match=pr.match;var dbe=/[?*]|[+@!]\(.*?\)|\[|\]/,rBt=t=>t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),ly=class{options;set;pattern;windowsPathsNoEscape;nonegate;negate;comment;empty;preserveMultipleSlashes;partial;globSet;globParts;nocase;isWindows;platform;windowsNoMagicRoot;regexp;constructor(e,r={}){(0,GO.assertValidPattern)(e),r=r||{},this.options=r,this.pattern=e,this.platform=r.platform||Ibe,this.isWindows=this.platform==="win32",this.windowsPathsNoEscape=!!r.windowsPathsNoEscape||r.allowWindowsEscape===!1,this.windowsPathsNoEscape&&(this.pattern=this.pattern.replace(/\\/g,"/")),this.preserveMultipleSlashes=!!r.preserveMultipleSlashes,this.regexp=null,this.negate=!1,this.nonegate=!!r.nonegate,this.comment=!1,this.empty=!1,this.partial=!!r.partial,this.nocase=!!this.options.nocase,this.windowsNoMagicRoot=r.windowsNoMagicRoot!==void 0?r.windowsNoMagicRoot:!!(this.isWindows&&this.nocase),this.globSet=[],this.globParts=[],this.set=[],this.make()}hasMagic(){if(this.options.magicalBraces&&this.set.length>1)return!0;for(let e of this.set)for(let r of e)if(typeof r!="string")return!0;return!1}debug(...e){}make(){let e=this.pattern,r=this.options;if(!r.nocomment&&e.charAt(0)==="#"){this.comment=!0;return}if(!e){this.empty=!0;return}this.parseNegate(),this.globSet=[...new Set(this.braceExpand())],r.debug&&(this.debug=(...n)=>console.error(...n)),this.debug(this.pattern,this.globSet);let s=this.globSet.map(n=>this.slashSplit(n));this.globParts=this.preprocess(s),this.debug(this.pattern,this.globParts);let a=this.globParts.map((n,c,f)=>{if(this.isWindows&&this.windowsNoMagicRoot){let p=n[0]===""&&n[1]===""&&(n[2]==="?"||!dbe.test(n[2]))&&!dbe.test(n[3]),h=/^[a-z]:/i.test(n[0]);if(p)return[...n.slice(0,4),...n.slice(4).map(E=>this.parse(E))];if(h)return[n[0],...n.slice(1).map(E=>this.parse(E))]}return n.map(p=>this.parse(p))});if(this.debug(this.pattern,a),this.set=a.filter(n=>n.indexOf(!1)===-1),this.isWindows)for(let n=0;n=2?(e=this.firstPhasePreProcess(e),e=this.secondPhasePreProcess(e)):r>=1?e=this.levelOneOptimize(e):e=this.adjascentGlobstarOptimize(e),e}adjascentGlobstarOptimize(e){return e.map(r=>{let s=-1;for(;(s=r.indexOf("**",s+1))!==-1;){let a=s;for(;r[a+1]==="**";)a++;a!==s&&r.splice(s,a-s)}return r})}levelOneOptimize(e){return e.map(r=>(r=r.reduce((s,a)=>{let n=s[s.length-1];return a==="**"&&n==="**"?s:a===".."&&n&&n!==".."&&n!=="."&&n!=="**"?(s.pop(),s):(s.push(a),s)},[]),r.length===0?[""]:r))}levelTwoFileOptimize(e){Array.isArray(e)||(e=this.slashSplit(e));let r=!1;do{if(r=!1,!this.preserveMultipleSlashes){for(let a=1;aa&&s.splice(a+1,c-a);let f=s[a+1],p=s[a+2],h=s[a+3];if(f!==".."||!p||p==="."||p===".."||!h||h==="."||h==="..")continue;r=!0,s.splice(a,1);let E=s.slice(0);E[a]="**",e.push(E),a--}if(!this.preserveMultipleSlashes){for(let c=1;cr.length)}partsMatch(e,r,s=!1){let a=0,n=0,c=[],f="";for(;aee?r=r.slice(ie):ee>ie&&(e=e.slice(ee)))}}let{optimizationLevel:n=1}=this.options;n>=2&&(e=this.levelTwoFileOptimize(e)),this.debug("matchOne",this,{file:e,pattern:r}),this.debug("matchOne",e.length,r.length);for(var c=0,f=0,p=e.length,h=r.length;c>> no match, partial?`,e,S,r,b),S===p))}let T;if(typeof E=="string"?(T=C===E,this.debug("string match",E,C,T)):(T=E.test(C),this.debug("pattern match",E,C,T)),!T)return!1}if(c===p&&f===h)return!0;if(c===p)return s;if(f===h)return c===p-1&&e[c]==="";throw new Error("wtf?")}braceExpand(){return(0,pr.braceExpand)(this.pattern,this.options)}parse(e){(0,GO.assertValidPattern)(e);let r=this.options;if(e==="**")return pr.GLOBSTAR;if(e==="")return"";let s,a=null;(s=e.match(U2t))?a=r.dot?H2t:_2t:(s=e.match(x2t))?a=(r.nocase?r.dot?T2t:R2t:r.dot?Q2t:k2t)(s[1]):(s=e.match(j2t))?a=(r.nocase?r.dot?q2t:G2t:r.dot?W2t:Y2t)(s):(s=e.match(F2t))?a=r.dot?O2t:N2t:(s=e.match(L2t))&&(a=M2t);let n=mbe.AST.fromGlob(e,this.options).toMMPattern();return a&&typeof n=="object"&&Reflect.defineProperty(n,"test",{value:a}),n}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let r=this.options,s=r.noglobstar?J2t:r.dot?K2t:z2t,a=new Set(r.nocase?["i"]:[]),n=e.map(p=>{let h=p.map(E=>{if(E instanceof RegExp)for(let C of E.flags.split(""))a.add(C);return typeof E=="string"?rBt(E):E===pr.GLOBSTAR?pr.GLOBSTAR:E._src});return h.forEach((E,C)=>{let S=h[C+1],b=h[C-1];E!==pr.GLOBSTAR||b===pr.GLOBSTAR||(b===void 0?S!==void 0&&S!==pr.GLOBSTAR?h[C+1]="(?:\\/|"+s+"\\/)?"+S:h[C]=s:S===void 0?h[C-1]=b+"(?:\\/|"+s+")?":S!==pr.GLOBSTAR&&(h[C-1]=b+"(?:\\/|\\/"+s+"\\/)"+S,h[C+1]=pr.GLOBSTAR))}),h.filter(E=>E!==pr.GLOBSTAR).join("/")}).join("|"),[c,f]=e.length>1?["(?:",")"]:["",""];n="^"+c+n+f+"$",this.negate&&(n="^(?!"+n+").+$");try{this.regexp=new RegExp(n,[...a].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,r=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&r)return!0;let s=this.options;this.isWindows&&(e=e.split("\\").join("/"));let a=this.slashSplit(e);this.debug(this.pattern,"split",a);let n=this.set;this.debug(this.pattern,"set",n);let c=a[a.length-1];if(!c)for(let f=a.length-2;!c&&f>=0;f--)c=a[f];for(let f=0;f{"use strict";var wbe=ru&&ru.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ru,"__esModule",{value:!0});ru.SuccinctRoles=ru.DelegatedRole=ru.Role=ru.TOP_LEVEL_ROLE_NAMES=void 0;var Bbe=wbe(Ie("crypto")),oBt=Cbe(),qO=wbe(Ie("util")),WO=bA(),cy=ff();ru.TOP_LEVEL_ROLE_NAMES=["root","targets","snapshot","timestamp"];var LP=class t{constructor(e){let{keyIDs:r,threshold:s,unrecognizedFields:a}=e;if(aBt(r))throw new WO.ValueError("duplicate key IDs found");if(s<1)throw new WO.ValueError("threshold must be at least 1");this.keyIDs=r,this.threshold=s,this.unrecognizedFields=a||{}}equals(e){return e instanceof t?this.threshold===e.threshold&&qO.default.isDeepStrictEqual(this.keyIDs,e.keyIDs)&&qO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields):!1}toJSON(){return{keyids:this.keyIDs,threshold:this.threshold,...this.unrecognizedFields}}static fromJSON(e){let{keyids:r,threshold:s,...a}=e;if(!cy.guard.isStringArray(r))throw new TypeError("keyids must be an array");if(typeof s!="number")throw new TypeError("threshold must be a number");return new t({keyIDs:r,threshold:s,unrecognizedFields:a})}};ru.Role=LP;function aBt(t){return new Set(t).size!==t.length}var rJ=class t extends LP{constructor(e){super(e);let{name:r,terminating:s,paths:a,pathHashPrefixes:n}=e;if(this.name=r,this.terminating=s,e.paths&&e.pathHashPrefixes)throw new WO.ValueError("paths and pathHashPrefixes are mutually exclusive");this.paths=a,this.pathHashPrefixes=n}equals(e){return e instanceof t?super.equals(e)&&this.name===e.name&&this.terminating===e.terminating&&qO.default.isDeepStrictEqual(this.paths,e.paths)&&qO.default.isDeepStrictEqual(this.pathHashPrefixes,e.pathHashPrefixes):!1}isDelegatedPath(e){if(this.paths)return this.paths.some(r=>cBt(e,r));if(this.pathHashPrefixes){let s=Bbe.default.createHash("sha256").update(e).digest("hex");return this.pathHashPrefixes.some(a=>s.startsWith(a))}return!1}toJSON(){let e={...super.toJSON(),name:this.name,terminating:this.terminating};return this.paths&&(e.paths=this.paths),this.pathHashPrefixes&&(e.path_hash_prefixes=this.pathHashPrefixes),e}static fromJSON(e){let{keyids:r,threshold:s,name:a,terminating:n,paths:c,path_hash_prefixes:f,...p}=e;if(!cy.guard.isStringArray(r))throw new TypeError("keyids must be an array of strings");if(typeof s!="number")throw new TypeError("threshold must be a number");if(typeof a!="string")throw new TypeError("name must be a string");if(typeof n!="boolean")throw new TypeError("terminating must be a boolean");if(cy.guard.isDefined(c)&&!cy.guard.isStringArray(c))throw new TypeError("paths must be an array of strings");if(cy.guard.isDefined(f)&&!cy.guard.isStringArray(f))throw new TypeError("path_hash_prefixes must be an array of strings");return new t({keyIDs:r,threshold:s,name:a,terminating:n,paths:c,pathHashPrefixes:f,unrecognizedFields:p})}};ru.DelegatedRole=rJ;var lBt=(t,e)=>t.map((r,s)=>[r,e[s]]);function cBt(t,e){let r=t.split("/"),s=e.split("/");return s.length!=r.length?!1:lBt(r,s).every(([a,n])=>(0,oBt.minimatch)(a,n))}var nJ=class t extends LP{constructor(e){super(e);let{bitLength:r,namePrefix:s}=e;if(r<=0||r>32)throw new WO.ValueError("bitLength must be between 1 and 32");this.bitLength=r,this.namePrefix=s,this.numberOfBins=Math.pow(2,r),this.suffixLen=(this.numberOfBins-1).toString(16).length}equals(e){return e instanceof t?super.equals(e)&&this.bitLength===e.bitLength&&this.namePrefix===e.namePrefix:!1}getRoleForTarget(e){let a=Bbe.default.createHash("sha256").update(e).digest().subarray(0,4),n=32-this.bitLength,f=(a.readUInt32BE()>>>n).toString(16).padStart(this.suffixLen,"0");return`${this.namePrefix}-${f}`}*getRoles(){for(let e=0;e{"use strict";var uBt=a1&&a1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(a1,"__esModule",{value:!0});a1.Root=void 0;var vbe=uBt(Ie("util")),sJ=ay(),Sbe=bA(),fBt=FO(),YO=iJ(),VO=ff(),oJ=class t extends sJ.Signed{constructor(e){if(super(e),this.type=sJ.MetadataKind.Root,this.keys=e.keys||{},this.consistentSnapshot=e.consistentSnapshot??!0,!e.roles)this.roles=YO.TOP_LEVEL_ROLE_NAMES.reduce((r,s)=>({...r,[s]:new YO.Role({keyIDs:[],threshold:1})}),{});else{let r=new Set(Object.keys(e.roles));if(!YO.TOP_LEVEL_ROLE_NAMES.every(s=>r.has(s)))throw new Sbe.ValueError("missing top-level role");this.roles=e.roles}}addKey(e,r){if(!this.roles[r])throw new Sbe.ValueError(`role ${r} does not exist`);this.roles[r].keyIDs.includes(e.keyID)||this.roles[r].keyIDs.push(e.keyID),this.keys[e.keyID]=e}equals(e){return e instanceof t?super.equals(e)&&this.consistentSnapshot===e.consistentSnapshot&&vbe.default.isDeepStrictEqual(this.keys,e.keys)&&vbe.default.isDeepStrictEqual(this.roles,e.roles):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,keys:ABt(this.keys),roles:pBt(this.roles),consistent_snapshot:this.consistentSnapshot,...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=sJ.Signed.commonFieldsFromJSON(e),{keys:a,roles:n,consistent_snapshot:c,...f}=r;if(typeof c!="boolean")throw new TypeError("consistent_snapshot must be a boolean");return new t({...s,keys:hBt(a),roles:gBt(n),consistentSnapshot:c,unrecognizedFields:f})}};a1.Root=oJ;function ABt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function pBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function hBt(t){let e;if(VO.guard.isDefined(t)){if(!VO.guard.isObjectRecord(t))throw new TypeError("keys must be an object");e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:fBt.Key.fromJSON(s,a)}),{})}return e}function gBt(t){let e;if(VO.guard.isDefined(t)){if(!VO.guard.isObjectRecord(t))throw new TypeError("roles must be an object");e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:YO.Role.fromJSON(a)}),{})}return e}});var cJ=_(JO=>{"use strict";Object.defineProperty(JO,"__esModule",{value:!0});JO.Signature=void 0;var lJ=class t{constructor(e){let{keyID:r,sig:s}=e;this.keyID=r,this.sig=s}toJSON(){return{keyid:this.keyID,sig:this.sig}}static fromJSON(e){let{keyid:r,sig:s}=e;if(typeof r!="string")throw new TypeError("keyid must be a string");if(typeof s!="string")throw new TypeError("sig must be a string");return new t({keyID:r,sig:s})}};JO.Signature=lJ});var AJ=_(l1=>{"use strict";var dBt=l1&&l1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(l1,"__esModule",{value:!0});l1.Snapshot=void 0;var mBt=dBt(Ie("util")),uJ=ay(),Pbe=QP(),Dbe=ff(),fJ=class t extends uJ.Signed{constructor(e){super(e),this.type=uJ.MetadataKind.Snapshot,this.meta=e.meta||{"targets.json":new Pbe.MetaFile({version:1})}}equals(e){return e instanceof t?super.equals(e)&&mBt.default.isDeepStrictEqual(this.meta,e.meta):!1}toJSON(){return{_type:this.type,meta:yBt(this.meta),spec_version:this.specVersion,version:this.version,expires:this.expires,...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=uJ.Signed.commonFieldsFromJSON(e),{meta:a,...n}=r;return new t({...s,meta:EBt(a),unrecognizedFields:n})}};l1.Snapshot=fJ;function yBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function EBt(t){let e;if(Dbe.guard.isDefined(t))if(Dbe.guard.isObjectRecord(t))e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:Pbe.MetaFile.fromJSON(a)}),{});else throw new TypeError("meta field is malformed");return e}});var bbe=_(c1=>{"use strict";var IBt=c1&&c1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(c1,"__esModule",{value:!0});c1.Delegations=void 0;var KO=IBt(Ie("util")),CBt=bA(),wBt=FO(),pJ=iJ(),zO=ff(),hJ=class t{constructor(e){if(this.keys=e.keys,this.unrecognizedFields=e.unrecognizedFields||{},e.roles&&Object.keys(e.roles).some(r=>pJ.TOP_LEVEL_ROLE_NAMES.includes(r)))throw new CBt.ValueError("Delegated role name conflicts with top-level role name");this.succinctRoles=e.succinctRoles,this.roles=e.roles}equals(e){return e instanceof t?KO.default.isDeepStrictEqual(this.keys,e.keys)&&KO.default.isDeepStrictEqual(this.roles,e.roles)&&KO.default.isDeepStrictEqual(this.unrecognizedFields,e.unrecognizedFields)&&KO.default.isDeepStrictEqual(this.succinctRoles,e.succinctRoles):!1}*rolesForTarget(e){if(this.roles)for(let r of Object.values(this.roles))r.isDelegatedPath(e)&&(yield{role:r.name,terminating:r.terminating});else this.succinctRoles&&(yield{role:this.succinctRoles.getRoleForTarget(e),terminating:!0})}toJSON(){let e={keys:BBt(this.keys),...this.unrecognizedFields};return this.roles?e.roles=vBt(this.roles):this.succinctRoles&&(e.succinct_roles=this.succinctRoles.toJSON()),e}static fromJSON(e){let{keys:r,roles:s,succinct_roles:a,...n}=e,c;return zO.guard.isObject(a)&&(c=pJ.SuccinctRoles.fromJSON(a)),new t({keys:SBt(r),roles:DBt(s),unrecognizedFields:n,succinctRoles:c})}};c1.Delegations=hJ;function BBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function vBt(t){return Object.values(t).map(e=>e.toJSON())}function SBt(t){if(!zO.guard.isObjectRecord(t))throw new TypeError("keys is malformed");return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:wBt.Key.fromJSON(r,s)}),{})}function DBt(t){let e;if(zO.guard.isDefined(t)){if(!zO.guard.isObjectArray(t))throw new TypeError("roles is malformed");e=t.reduce((r,s)=>{let a=pJ.DelegatedRole.fromJSON(s);return{...r,[a.name]:a}},{})}return e}});var mJ=_(u1=>{"use strict";var PBt=u1&&u1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(u1,"__esModule",{value:!0});u1.Targets=void 0;var xbe=PBt(Ie("util")),gJ=ay(),bBt=bbe(),xBt=QP(),ZO=ff(),dJ=class t extends gJ.Signed{constructor(e){super(e),this.type=gJ.MetadataKind.Targets,this.targets=e.targets||{},this.delegations=e.delegations}addTarget(e){this.targets[e.path]=e}equals(e){return e instanceof t?super.equals(e)&&xbe.default.isDeepStrictEqual(this.targets,e.targets)&&xbe.default.isDeepStrictEqual(this.delegations,e.delegations):!1}toJSON(){let e={_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,targets:kBt(this.targets),...this.unrecognizedFields};return this.delegations&&(e.delegations=this.delegations.toJSON()),e}static fromJSON(e){let{unrecognizedFields:r,...s}=gJ.Signed.commonFieldsFromJSON(e),{targets:a,delegations:n,...c}=r;return new t({...s,targets:QBt(a),delegations:RBt(n),unrecognizedFields:c})}};u1.Targets=dJ;function kBt(t){return Object.entries(t).reduce((e,[r,s])=>({...e,[r]:s.toJSON()}),{})}function QBt(t){let e;if(ZO.guard.isDefined(t))if(ZO.guard.isObjectRecord(t))e=Object.entries(t).reduce((r,[s,a])=>({...r,[s]:xBt.TargetFile.fromJSON(s,a)}),{});else throw new TypeError("targets must be an object");return e}function RBt(t){let e;if(ZO.guard.isDefined(t))if(ZO.guard.isObject(t))e=bBt.Delegations.fromJSON(t);else throw new TypeError("delegations must be an object");return e}});var CJ=_(XO=>{"use strict";Object.defineProperty(XO,"__esModule",{value:!0});XO.Timestamp=void 0;var yJ=ay(),kbe=QP(),EJ=ff(),IJ=class t extends yJ.Signed{constructor(e){super(e),this.type=yJ.MetadataKind.Timestamp,this.snapshotMeta=e.snapshotMeta||new kbe.MetaFile({version:1})}equals(e){return e instanceof t?super.equals(e)&&this.snapshotMeta.equals(e.snapshotMeta):!1}toJSON(){return{_type:this.type,spec_version:this.specVersion,version:this.version,expires:this.expires,meta:{"snapshot.json":this.snapshotMeta.toJSON()},...this.unrecognizedFields}}static fromJSON(e){let{unrecognizedFields:r,...s}=yJ.Signed.commonFieldsFromJSON(e),{meta:a,...n}=r;return new t({...s,snapshotMeta:TBt(a),unrecognizedFields:n})}};XO.Timestamp=IJ;function TBt(t){let e;if(EJ.guard.isDefined(t)){let r=t["snapshot.json"];if(!EJ.guard.isDefined(r)||!EJ.guard.isObject(r))throw new TypeError("missing snapshot.json in meta");e=kbe.MetaFile.fromJSON(r)}return e}});var Rbe=_(A1=>{"use strict";var FBt=A1&&A1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(A1,"__esModule",{value:!0});A1.Metadata=void 0;var NBt=_7(),Qbe=FBt(Ie("util")),f1=ay(),MP=bA(),OBt=aJ(),LBt=cJ(),MBt=AJ(),UBt=mJ(),_Bt=CJ(),wJ=ff(),BJ=class t{constructor(e,r,s){this.signed=e,this.signatures=r||{},this.unrecognizedFields=s||{}}sign(e,r=!0){let s=Buffer.from((0,NBt.canonicalize)(this.signed.toJSON())),a=e(s);r||(this.signatures={}),this.signatures[a.keyID]=a}verifyDelegate(e,r){let s,a={};switch(this.signed.type){case f1.MetadataKind.Root:a=this.signed.keys,s=this.signed.roles[e];break;case f1.MetadataKind.Targets:if(!this.signed.delegations)throw new MP.ValueError(`No delegations found for ${e}`);a=this.signed.delegations.keys,this.signed.delegations.roles?s=this.signed.delegations.roles[e]:this.signed.delegations.succinctRoles&&this.signed.delegations.succinctRoles.isDelegatedRole(e)&&(s=this.signed.delegations.succinctRoles);break;default:throw new TypeError("invalid metadata type")}if(!s)throw new MP.ValueError(`no delegation found for ${e}`);let n=new Set;if(s.keyIDs.forEach(c=>{let f=a[c];if(f)try{f.verifySignature(r),n.add(f.keyID)}catch{}}),n.sizer.toJSON()),signed:this.signed.toJSON(),...this.unrecognizedFields}}static fromJSON(e,r){let{signed:s,signatures:a,...n}=r;if(!wJ.guard.isDefined(s)||!wJ.guard.isObject(s))throw new TypeError("signed is not defined");if(e!==s._type)throw new MP.ValueError(`expected '${e}', got ${s._type}`);if(!wJ.guard.isObjectArray(a))throw new TypeError("signatures is not an array");let c;switch(e){case f1.MetadataKind.Root:c=OBt.Root.fromJSON(s);break;case f1.MetadataKind.Timestamp:c=_Bt.Timestamp.fromJSON(s);break;case f1.MetadataKind.Snapshot:c=MBt.Snapshot.fromJSON(s);break;case f1.MetadataKind.Targets:c=UBt.Targets.fromJSON(s);break;default:throw new TypeError("invalid metadata type")}let f={};return a.forEach(p=>{let h=LBt.Signature.fromJSON(p);if(f[h.keyID])throw new MP.ValueError(`multiple signatures found for keyid: ${h.keyID}`);f[h.keyID]=h}),new t(c,f,n)}};A1.Metadata=BJ});var $O=_(Fi=>{"use strict";Object.defineProperty(Fi,"__esModule",{value:!0});Fi.Timestamp=Fi.Targets=Fi.Snapshot=Fi.Signature=Fi.Root=Fi.Metadata=Fi.Key=Fi.TargetFile=Fi.MetaFile=Fi.ValueError=Fi.MetadataKind=void 0;var HBt=ay();Object.defineProperty(Fi,"MetadataKind",{enumerable:!0,get:function(){return HBt.MetadataKind}});var jBt=bA();Object.defineProperty(Fi,"ValueError",{enumerable:!0,get:function(){return jBt.ValueError}});var Tbe=QP();Object.defineProperty(Fi,"MetaFile",{enumerable:!0,get:function(){return Tbe.MetaFile}});Object.defineProperty(Fi,"TargetFile",{enumerable:!0,get:function(){return Tbe.TargetFile}});var GBt=FO();Object.defineProperty(Fi,"Key",{enumerable:!0,get:function(){return GBt.Key}});var qBt=Rbe();Object.defineProperty(Fi,"Metadata",{enumerable:!0,get:function(){return qBt.Metadata}});var WBt=aJ();Object.defineProperty(Fi,"Root",{enumerable:!0,get:function(){return WBt.Root}});var YBt=cJ();Object.defineProperty(Fi,"Signature",{enumerable:!0,get:function(){return YBt.Signature}});var VBt=AJ();Object.defineProperty(Fi,"Snapshot",{enumerable:!0,get:function(){return VBt.Snapshot}});var JBt=mJ();Object.defineProperty(Fi,"Targets",{enumerable:!0,get:function(){return JBt.Targets}});var KBt=CJ();Object.defineProperty(Fi,"Timestamp",{enumerable:!0,get:function(){return KBt.Timestamp}})});var Nbe=_((air,Fbe)=>{var p1=1e3,h1=p1*60,g1=h1*60,uy=g1*24,zBt=uy*7,ZBt=uy*365.25;Fbe.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return XBt(t);if(r==="number"&&isFinite(t))return e.long?evt(t):$Bt(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function XBt(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),s=(e[2]||"ms").toLowerCase();switch(s){case"years":case"year":case"yrs":case"yr":case"y":return r*ZBt;case"weeks":case"week":case"w":return r*zBt;case"days":case"day":case"d":return r*uy;case"hours":case"hour":case"hrs":case"hr":case"h":return r*g1;case"minutes":case"minute":case"mins":case"min":case"m":return r*h1;case"seconds":case"second":case"secs":case"sec":case"s":return r*p1;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}function $Bt(t){var e=Math.abs(t);return e>=uy?Math.round(t/uy)+"d":e>=g1?Math.round(t/g1)+"h":e>=h1?Math.round(t/h1)+"m":e>=p1?Math.round(t/p1)+"s":t+"ms"}function evt(t){var e=Math.abs(t);return e>=uy?eL(t,e,uy,"day"):e>=g1?eL(t,e,g1,"hour"):e>=h1?eL(t,e,h1,"minute"):e>=p1?eL(t,e,p1,"second"):t+" ms"}function eL(t,e,r,s){var a=e>=r*1.5;return Math.round(t/r)+" "+s+(a?"s":"")}});var vJ=_((lir,Obe)=>{function tvt(t){r.debug=r,r.default=r,r.coerce=p,r.disable=c,r.enable=a,r.enabled=f,r.humanize=Nbe(),r.destroy=h,Object.keys(t).forEach(E=>{r[E]=t[E]}),r.names=[],r.skips=[],r.formatters={};function e(E){let C=0;for(let S=0;S{if(le==="%%")return"%";ie++;let pe=r.formatters[me];if(typeof pe=="function"){let Be=N[ie];le=pe.call(U,Be),N.splice(ie,1),ie--}return le}),r.formatArgs.call(U,N),(U.log||r.log).apply(U,N)}return T.namespace=E,T.useColors=r.useColors(),T.color=r.selectColor(E),T.extend=s,T.destroy=r.destroy,Object.defineProperty(T,"enabled",{enumerable:!0,configurable:!1,get:()=>S!==null?S:(b!==r.namespaces&&(b=r.namespaces,I=r.enabled(E)),I),set:N=>{S=N}}),typeof r.init=="function"&&r.init(T),T}function s(E,C){let S=r(this.namespace+(typeof C>"u"?":":C)+E);return S.log=this.log,S}function a(E){r.save(E),r.namespaces=E,r.names=[],r.skips=[];let C=(typeof E=="string"?E:"").trim().replace(" ",",").split(",").filter(Boolean);for(let S of C)S[0]==="-"?r.skips.push(S.slice(1)):r.names.push(S)}function n(E,C){let S=0,b=0,I=-1,T=0;for(;S"-"+C)].join(",");return r.enable(""),E}function f(E){for(let C of r.skips)if(n(E,C))return!1;for(let C of r.names)if(n(E,C))return!0;return!1}function p(E){return E instanceof Error?E.stack||E.message:E}function h(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return r.enable(r.load()),r}Obe.exports=tvt});var Lbe=_((sc,tL)=>{sc.formatArgs=nvt;sc.save=ivt;sc.load=svt;sc.useColors=rvt;sc.storage=ovt();sc.destroy=(()=>{let t=!1;return()=>{t||(t=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();sc.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function rvt(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let t;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(t=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(t[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function nvt(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+tL.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;t.splice(1,0,e,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,a=>{a!=="%%"&&(r++,a==="%c"&&(s=r))}),t.splice(s,0,e)}sc.log=console.debug||console.log||(()=>{});function ivt(t){try{t?sc.storage.setItem("debug",t):sc.storage.removeItem("debug")}catch{}}function svt(){let t;try{t=sc.storage.getItem("debug")}catch{}return!t&&typeof process<"u"&&"env"in process&&(t=process.env.DEBUG),t}function ovt(){try{return localStorage}catch{}}tL.exports=vJ()(sc);var{formatters:avt}=tL.exports;avt.j=function(t){try{return JSON.stringify(t)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var Ube=_((Xs,nL)=>{var lvt=Ie("tty"),rL=Ie("util");Xs.init=gvt;Xs.log=Avt;Xs.formatArgs=uvt;Xs.save=pvt;Xs.load=hvt;Xs.useColors=cvt;Xs.destroy=rL.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");Xs.colors=[6,2,3,4,5,1];try{let t=Ie("supports-color");t&&(t.stderr||t).level>=2&&(Xs.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}Xs.inspectOpts=Object.keys(process.env).filter(t=>/^debug_/i.test(t)).reduce((t,e)=>{let r=e.substring(6).toLowerCase().replace(/_([a-z])/g,(a,n)=>n.toUpperCase()),s=process.env[e];return/^(yes|on|true|enabled)$/i.test(s)?s=!0:/^(no|off|false|disabled)$/i.test(s)?s=!1:s==="null"?s=null:s=Number(s),t[r]=s,t},{});function cvt(){return"colors"in Xs.inspectOpts?!!Xs.inspectOpts.colors:lvt.isatty(process.stderr.fd)}function uvt(t){let{namespace:e,useColors:r}=this;if(r){let s=this.color,a="\x1B[3"+(s<8?s:"8;5;"+s),n=` ${a};1m${e} \x1B[0m`;t[0]=n+t[0].split(` `).join(` `+n),t.push(a+"m+"+nL.exports.humanize(this.diff)+"\x1B[0m")}else t[0]=fvt()+e+" "+t[0]}function fvt(){return Xs.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Avt(...t){return process.stderr.write(rL.formatWithOptions(Xs.inspectOpts,...t)+` `)}function pvt(t){t?process.env.DEBUG=t:delete process.env.DEBUG}function hvt(){return process.env.DEBUG}function gvt(t){t.inspectOpts={};let e=Object.keys(Xs.inspectOpts);for(let r=0;re.trim()).join(" ")};Mbe.O=function(t){return this.inspectOpts.colors=this.useColors,rL.inspect(t,this.inspectOpts)}});var DJ=_((cir,SJ)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?SJ.exports=Lbe():SJ.exports=Ube()});var sL=_(Ji=>{"use strict";Object.defineProperty(Ji,"__esModule",{value:!0});Ji.DownloadHTTPError=Ji.DownloadLengthMismatchError=Ji.DownloadError=Ji.ExpiredMetadataError=Ji.EqualVersionError=Ji.BadVersionError=Ji.RepositoryError=Ji.PersistError=Ji.RuntimeError=Ji.ValueError=void 0;var PJ=class extends Error{};Ji.ValueError=PJ;var bJ=class extends Error{};Ji.RuntimeError=bJ;var xJ=class extends Error{};Ji.PersistError=xJ;var UP=class extends Error{};Ji.RepositoryError=UP;var iL=class extends UP{};Ji.BadVersionError=iL;var kJ=class extends iL{};Ji.EqualVersionError=kJ;var QJ=class extends UP{};Ji.ExpiredMetadataError=QJ;var _P=class extends Error{};Ji.DownloadError=_P;var RJ=class extends _P{};Ji.DownloadLengthMismatchError=RJ;var TJ=class extends _P{constructor(e,r){super(e),this.statusCode=r}};Ji.DownloadHTTPError=TJ});var Hbe=_(d1=>{"use strict";var NJ=d1&&d1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(d1,"__esModule",{value:!0});d1.withTempFile=void 0;var FJ=NJ(Ie("fs/promises")),dvt=NJ(Ie("os")),_be=NJ(Ie("path")),mvt=async t=>yvt(async e=>t(_be.default.join(e,"tempfile")));d1.withTempFile=mvt;var yvt=async t=>{let e=await FJ.default.realpath(dvt.default.tmpdir()),r=await FJ.default.mkdtemp(e+_be.default.sep);try{return await t(r)}finally{await FJ.default.rm(r,{force:!0,recursive:!0,maxRetries:3})}}});var LJ=_(kg=>{"use strict";var aL=kg&&kg.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kg,"__esModule",{value:!0});kg.DefaultFetcher=kg.BaseFetcher=void 0;var Evt=aL(DJ()),jbe=aL(Ie("fs")),Ivt=aL(IO()),Cvt=aL(Ie("util")),Gbe=sL(),wvt=Hbe(),Bvt=(0,Evt.default)("tuf:fetch"),oL=class{async downloadFile(e,r,s){return(0,wvt.withTempFile)(async a=>{let n=await this.fetch(e),c=0,f=jbe.default.createWriteStream(a);try{for await(let p of n){let h=Buffer.from(p);if(c+=h.length,c>r)throw new Gbe.DownloadLengthMismatchError("Max length reached");await vvt(f,h)}}finally{await Cvt.default.promisify(f.close).bind(f)()}return s(a)})}async downloadBytes(e,r){return this.downloadFile(e,r,async s=>{let a=jbe.default.createReadStream(s),n=[];for await(let c of a)n.push(c);return Buffer.concat(n)})}};kg.BaseFetcher=oL;var OJ=class extends oL{constructor(e={}){super(),this.timeout=e.timeout,this.retry=e.retry}async fetch(e){Bvt("GET %s",e);let r=await(0,Ivt.default)(e,{timeout:this.timeout,retry:this.retry});if(!r.ok||!r?.body)throw new Gbe.DownloadHTTPError("Failed to download",r.status);return r.body}};kg.DefaultFetcher=OJ;var vvt=async(t,e)=>new Promise((r,s)=>{t.write(e,a=>{a&&s(a),r(!0)})})});var qbe=_(lL=>{"use strict";Object.defineProperty(lL,"__esModule",{value:!0});lL.defaultConfig=void 0;lL.defaultConfig={maxRootRotations:256,maxDelegations:32,rootMaxLength:512e3,timestampMaxLength:16384,snapshotMaxLength:2e6,targetsMaxLength:5e6,prefixTargetsWithHash:!0,fetchTimeout:1e5,fetchRetries:void 0,fetchRetry:2}});var Wbe=_(cL=>{"use strict";Object.defineProperty(cL,"__esModule",{value:!0});cL.TrustedMetadataStore=void 0;var Es=$O(),_i=sL(),MJ=class{constructor(e){this.trustedSet={},this.referenceTime=new Date,this.loadTrustedRoot(e)}get root(){if(!this.trustedSet.root)throw new ReferenceError("No trusted root metadata");return this.trustedSet.root}get timestamp(){return this.trustedSet.timestamp}get snapshot(){return this.trustedSet.snapshot}get targets(){return this.trustedSet.targets}getRole(e){return this.trustedSet[e]}updateRoot(e){let r=JSON.parse(e.toString("utf8")),s=Es.Metadata.fromJSON(Es.MetadataKind.Root,r);if(s.signed.type!=Es.MetadataKind.Root)throw new _i.RepositoryError(`Expected 'root', got ${s.signed.type}`);if(this.root.verifyDelegate(Es.MetadataKind.Root,s),s.signed.version!=this.root.signed.version+1)throw new _i.BadVersionError(`Expected version ${this.root.signed.version+1}, got ${s.signed.version}`);return s.verifyDelegate(Es.MetadataKind.Root,s),this.trustedSet.root=s,s}updateTimestamp(e){if(this.snapshot)throw new _i.RuntimeError("Cannot update timestamp after snapshot");if(this.root.signed.isExpired(this.referenceTime))throw new _i.ExpiredMetadataError("Final root.json is expired");let r=JSON.parse(e.toString("utf8")),s=Es.Metadata.fromJSON(Es.MetadataKind.Timestamp,r);if(s.signed.type!=Es.MetadataKind.Timestamp)throw new _i.RepositoryError(`Expected 'timestamp', got ${s.signed.type}`);if(this.root.verifyDelegate(Es.MetadataKind.Timestamp,s),this.timestamp){if(s.signed.version{let p=n.signed.meta[c];if(!p)throw new _i.RepositoryError(`Missing file ${c} in new snapshot`);if(p.version{"use strict";Object.defineProperty(UJ,"__esModule",{value:!0});UJ.join=Dvt;var Svt=Ie("url");function Dvt(t,e){return new Svt.URL(Pvt(t)+bvt(e)).toString()}function Pvt(t){return t.endsWith("/")?t:t+"/"}function bvt(t){return t.startsWith("/")?t.slice(1):t}});var Vbe=_(nu=>{"use strict";var xvt=nu&&nu.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),kvt=nu&&nu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),jJ=nu&&nu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.prototype.hasOwnProperty.call(t,r)&&xvt(e,t,r);return kvt(e,t),e},Qvt=nu&&nu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nu,"__esModule",{value:!0});nu.Updater=void 0;var xA=$O(),Rvt=Qvt(DJ()),m1=jJ(Ie("fs")),uL=jJ(Ie("path")),Tvt=qbe(),fy=sL(),Fvt=LJ(),Nvt=Wbe(),HP=jJ(Ybe()),_J=(0,Rvt.default)("tuf:cache"),HJ=class{constructor(e){let{metadataDir:r,metadataBaseUrl:s,targetDir:a,targetBaseUrl:n,fetcher:c,config:f}=e;this.dir=r,this.metadataBaseUrl=s,this.targetDir=a,this.targetBaseUrl=n,this.forceCache=e.forceCache??!1;let p=this.loadLocalMetadata(xA.MetadataKind.Root);this.trustedSet=new Nvt.TrustedMetadataStore(p),this.config={...Tvt.defaultConfig,...f},this.fetcher=c||new Fvt.DefaultFetcher({timeout:this.config.fetchTimeout,retry:this.config.fetchRetries??this.config.fetchRetry})}async refresh(){if(this.forceCache)try{await this.loadTimestamp({checkRemote:!1})}catch{await this.loadRoot(),await this.loadTimestamp()}else await this.loadRoot(),await this.loadTimestamp();await this.loadSnapshot(),await this.loadTargets(xA.MetadataKind.Targets,xA.MetadataKind.Root)}async getTargetInfo(e){return this.trustedSet.targets||await this.refresh(),this.preorderDepthFirstWalk(e)}async downloadTarget(e,r,s){let a=r||this.generateTargetPath(e);if(!s){if(!this.targetBaseUrl)throw new fy.ValueError("Target base URL not set");s=this.targetBaseUrl}let n=e.path;if(this.trustedSet.root.signed.consistentSnapshot&&this.config.prefixTargetsWithHash){let p=Object.values(e.hashes),{dir:h,base:E}=uL.parse(n),C=`${p[0]}.${E}`;n=h?`${h}/${C}`:C}let f=HP.join(s,n);return await this.fetcher.downloadFile(f,e.length,async p=>{await e.verify(m1.createReadStream(p)),_J("WRITE %s",a),m1.copyFileSync(p,a)}),a}async findCachedTarget(e,r){r||(r=this.generateTargetPath(e));try{if(m1.existsSync(r))return await e.verify(m1.createReadStream(r)),r}catch{return}}loadLocalMetadata(e){let r=uL.join(this.dir,`${e}.json`);return _J("READ %s",r),m1.readFileSync(r)}async loadRoot(){let r=this.trustedSet.root.signed.version+1,s=r+this.config.maxRootRotations;for(let a=r;a0;){let{roleName:a,parentRoleName:n}=r.pop();if(s.has(a))continue;let c=(await this.loadTargets(a,n))?.signed;if(!c)continue;let f=c.targets?.[e];if(f)return f;if(s.add(a),c.delegations){let p=[],h=c.delegations.rolesForTarget(e);for(let{role:E,terminating:C}of h)if(p.push({roleName:E,parentRoleName:a}),C){r.splice(0);break}p.reverse(),r.push(...p)}}}generateTargetPath(e){if(!this.targetDir)throw new fy.ValueError("Target directory not set");let r=encodeURIComponent(e.path);return uL.join(this.targetDir,r)}persistMetadata(e,r){let s=encodeURIComponent(e);try{let a=uL.join(this.dir,`${s}.json`);_J("WRITE %s",a),m1.writeFileSync(a,r.toString("utf8"))}catch(a){throw new fy.PersistError(`Failed to persist metadata ${s} error: ${a}`)}}};nu.Updater=HJ});var Jbe=_(Qg=>{"use strict";Object.defineProperty(Qg,"__esModule",{value:!0});Qg.Updater=Qg.BaseFetcher=Qg.TargetFile=void 0;var Ovt=$O();Object.defineProperty(Qg,"TargetFile",{enumerable:!0,get:function(){return Ovt.TargetFile}});var Lvt=LJ();Object.defineProperty(Qg,"BaseFetcher",{enumerable:!0,get:function(){return Lvt.BaseFetcher}});var Mvt=Vbe();Object.defineProperty(Qg,"Updater",{enumerable:!0,get:function(){return Mvt.Updater}})});var qJ=_(fL=>{"use strict";Object.defineProperty(fL,"__esModule",{value:!0});fL.TUFError=void 0;var GJ=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.code=e,this.cause=s,this.name=this.constructor.name}};fL.TUFError=GJ});var Kbe=_(jP=>{"use strict";var Uvt=jP&&jP.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(jP,"__esModule",{value:!0});jP.readTarget=Hvt;var _vt=Uvt(Ie("fs")),AL=qJ();async function Hvt(t,e){let r=await jvt(t,e);return new Promise((s,a)=>{_vt.default.readFile(r,"utf-8",(n,c)=>{n?a(new AL.TUFError({code:"TUF_READ_TARGET_ERROR",message:`error reading target ${r}`,cause:n})):s(c)})})}async function jvt(t,e){let r;try{r=await t.getTargetInfo(e)}catch(a){throw new AL.TUFError({code:"TUF_REFRESH_METADATA_ERROR",message:"error refreshing TUF metadata",cause:a})}if(!r)throw new AL.TUFError({code:"TUF_FIND_TARGET_ERROR",message:`target ${e} not found`});let s=await t.findCachedTarget(r);if(!s)try{s=await t.downloadTarget(r)}catch(a){throw new AL.TUFError({code:"TUF_DOWNLOAD_TARGET_ERROR",message:`error downloading target ${s}`,cause:a})}return s}});var zbe=_((Iir,Gvt)=>{Gvt.exports={"https://tuf-repo-cdn.sigstore.dev":{"root.json":"ewogInNpZ25hdHVyZXMiOiBbCiAgewogICAia2V5aWQiOiAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICJzaWciOiAiMzA0NjAyMjEwMDhhYjFmNmYxN2Q0ZjllNmQ3ZGNmMWM4ODkxMmI2YjUzY2MxMDM4ODY0NGFlMWYwOWJjMzdhMDgyY2QwNjAwM2UwMjIxMDBlMTQ1ZWY0YzdiNzgyZDRlODEwN2I1MzQzN2U2NjlkMDQ3Njg5MmNlOTk5OTAzYWUzM2QxNDQ0ODM2Njk5NmU3IgogIH0sCiAgewogICAia2V5aWQiOiAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICJzaWciOiAiMzA0NTAyMjEwMGM3NjhiMmY4NmRhOTk1NjkwMTljMTYwYTA4MWRhNTRhZTM2YzM0YzBhMzEyMGQzY2I2OWI1M2I3ZDExMzc1OGUwMjIwNGY2NzE1MThmNjE3YjIwZDQ2NTM3ZmFlNmMzYjYzYmFlODkxM2Y0ZjE5NjIxNTYxMDVjYzRmMDE5YWMzNWM2YSIKICB9LAogIHsKICAgImtleWlkIjogIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAic2lnIjogIjMwNDUwMjIxMDBiNDQzNGU2OTk1ZDM2OGQyM2U3NDc1OWFjZDBjYjkwMTNjODNhNWQzNTExZjBmOTk3ZWM1NGM0NTZhZTQzNTBhMDIyMDE1YjBlMjY1ZDE4MmQyYjYxZGM3NGUxNTVkOThiM2MzZmJlNTY0YmEwNTI4NmFhMTRjOGRmMDJjOWI3NTY1MTYiCiAgfSwKICB7CiAgICJrZXlpZCI6ICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgInNpZyI6ICIzMDQ1MDIyMTAwODJjNTg0MTFkOTg5ZWI5Zjg2MTQxMDg1N2Q0MjM4MTU5MGVjOTQyNGRiZGFhNTFlNzhlZDEzNTE1NDMxOTA0ZTAyMjAxMTgxODVkYTZhNmMyOTQ3MTMxYzE3Nzk3ZTJiYjc2MjBjZTI2ZTVmMzAxZDFjZWFjNWYyYTdlNThmOWRjZjJlIgogIH0sCiAgewogICAia2V5aWQiOiAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIsCiAgICJzaWciOiAiMzA0NjAyMjEwMGM3ODUxMzg1NGNhZTljMzJlYWE2Yjg4ZTE4OTEyZjQ4MDA2YzI3NTdhMjU4ZjkxNzMxMmNhYmE3NTk0OGViOWUwMjIxMDBkOWUxYjRjZTBhZGZlOWZkMmUyMTQ4ZDdmYTI3YTJmNDBiYTExMjJiZDY5ZGE3NjEyZDhkMTc3NmIwMTNjOTFkIgogIH0sCiAgewogICAia2V5aWQiOiAiZmRmYTgzYTA3YjVhODM1ODliODdkZWQ0MWY3N2YzOWQyMzJhZDkxZjdjY2U1Mjg2OGRhY2QwNmJhMDg5ODQ5ZiIsCiAgICJzaWciOiAiMzA0NTAyMjA1NjQ4M2EyZDVkOWVhOWNlYzZlMTFlYWRmYjMzYzQ4NGI2MTQyOThmYWNhMTVhY2YxYzQzMWIxMWVkN2Y3MzRjMDIyMTAwZDBjMWQ3MjZhZjkyYTg3ZTRlNjY0NTljYTVhZGYzOGEwNWI0NGUxZjk0MzE4NDIzZjk1NGJhZThiY2E1YmIyZSIKICB9LAogIHsKICAgImtleWlkIjogImUyZjU5YWNiOTQ4ODUxOTQwN2UxOGNiZmM5MzI5NTEwYmUwM2MwNGFjYTk5MjlkMmYwMzAxMzQzZmVjODU1MjMiLAogICAic2lnIjogIjMwNDYwMjIxMDBkMDA0ZGU4ODAyNGMzMmRjNTY1M2E5ZjQ4NDNjZmM1MjE1NDI3MDQ4YWQ5NjAwZDJjZjljOTY5ZTZlZGZmM2QyMDIyMTAwZDllYmI3OThmNWZjNjZhZjEwODk5ZGVjZTAxNGE4NjI4Y2NmM2M1NDAyY2Q0YTQyNzAyMDc0NzJmOGY2ZTcxMiIKICB9LAogIHsKICAgImtleWlkIjogIjNjMzQ0YWEwNjhmZDRjYzRlODdkYzUwYjYxMmMwMjQzMWZiYzc3MWU5NTAwMzk5MzY4M2EyYjBiZjI2MGNmMGUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiN2IwOTk5NmM0NWNhMmQ0YjA1NjAzZTU2YmFlZmEyOTcxOGEwYjcxMTQ3Y2Y4YzZlNjYzNDliYWE2MTQ3N2RmMDIyMTAwYzRkYTgwYzcxN2I0ZmE3YmJhMGZkNWM3MmRhOGEwNDk5MzU4YjAxMzU4YjIzMDlmNDFkMTQ1NmVhMWU3ZTFkOSIKICB9LAogIHsKICAgImtleWlkIjogImVjODE2Njk3MzRlMDE3OTk2YzViODVmM2QwMmMzZGUxZGQ0NjM3YTE1MjAxOWZlMWFmMTI1ZDJmOTM2OGI5NWUiLAogICAic2lnIjogIjMwNDYwMjIxMDBiZTk3ODJjMzA3NDRlNDExYTgyZmE4NWI1MTM4ZDYwMWNlMTQ4YmMxOTI1OGFlYzY0ZTdlYzI0NDc4ZjM4ODEyMDIyMTAwY2FlZjYzZGNhZjFhNGI5YTUwMGQzYmQwZTNmMTY0ZWMxOGYxYjYzZDdhOTQ2MGQ5YWNhYjEwNjZkYjBmMDE2ZCIKICB9LAogIHsKICAgImtleWlkIjogIjFlMWQ2NWNlOThiMTBhZGRhZDQ3NjRmZWJmN2RkYTJkMDQzNmIzZDNhMzg5MzU3OWMwZGRkYWVhMjBlNTQ4NDkiLAogICAic2lnIjogIjMwNDUwMjIwNzQ2ZWMzZjg1MzRjZTU1NTMxZDBkMDFmZjY0OTY0ZWY0NDBkMWU3ZDJjNGMxNDI0MDliOGU5NzY5ZjFhZGE2ZjAyMjEwMGUzYjkyOWZjZDkzZWExOGZlYWEwODI1ODg3YTcyMTA0ODk4NzlhNjY3ODBjMDdhODNmNGJkNDZlMmYwOWFiM2IiCiAgfQogXSwKICJzaWduZWQiOiB7CiAgIl90eXBlIjogInJvb3QiLAogICJjb25zaXN0ZW50X3NuYXBzaG90IjogdHJ1ZSwKICAiZXhwaXJlcyI6ICIyMDI1LTAyLTE5VDA4OjA0OjMyWiIsCiAgImtleXMiOiB7CiAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFekJ6Vk9tSENQb2pNVkxTSTM2NFdpaVY4TlByRFxuNklnUnhWbGlza3ovdit5M0pFUjVtY1ZHY09ObGlEY1dNQzVKMmxmSG1qUE5QaGI0SDd4bThMemZTQT09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBzYW50aWFnb3RvcnJlcyIKICAgfSwKICAgIjYxNjQzODM4MTI1YjQ0MGI0MGRiNjk0MmY1Y2I1YTMxYzBkYzA0MzY4MzE2ZWIyYWFhNThiOTU5MDRhNTgyMjIiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVpbmlrU3NBUW1Za05lSDVlWXEvQ25JekxhYWNPXG54bFNhYXdRRE93cUt5L3RDcXhxNXh4UFNKYzIxSzRXSWhzOUd5T2tLZnp1ZVkzR0lMemNNSlo0Y1d3PT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2kta2V5b3duZXIiOiAiQGJvYmNhbGxhd2F5IgogICB9LAogICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRXk4WEtzbWhCWURJOEpjMEd3ekJ4ZUtheDBjbTVcblNUS0VVNjVIUEZ1blVuNDFzVDhwaTBGak00SWtIei9ZVW13bUxVTzBXdDdseGhqNkJrTElLNHFZQXc9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAZGxvcmVuYyIKICAgfSwKICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiOiB7CiAgICAia2V5aWRfaGFzaF9hbGdvcml0aG1zIjogWwogICAgICJzaGEyNTYiLAogICAgICJzaGE1MTIiCiAgICBdLAogICAgImtleXR5cGUiOiAiZWNkc2EiLAogICAgImtleXZhbCI6IHsKICAgICAicHVibGljIjogIi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXG5NRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUVXUmlHcjUraiszSjVTc0grWnRyNW5FMkgyd083XG5CVituTzNzOTNnTGNhMThxVE96SFkxb1d5QUdEeWtNU3NHVFVCU3Q5RCtBbjBLZktzRDJtZlNNNDJRPT1cbi0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLVxuIgogICAgfSwKICAgICJzY2hlbWUiOiAiZWNkc2Etc2hhMi1uaXN0cDI1NiIsCiAgICAieC10dWYtb24tY2ktb25saW5lLXVyaSI6ICJnY3BrbXM6Ly9wcm9qZWN0cy9zaWdzdG9yZS1yb290LXNpZ25pbmcvbG9jYXRpb25zL2dsb2JhbC9rZXlSaW5ncy9yb290L2NyeXB0b0tleXMvdGltZXN0YW1wIgogICB9LAogICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCI6IHsKICAgICJrZXlpZF9oYXNoX2FsZ29yaXRobXMiOiBbCiAgICAgInNoYTI1NiIsCiAgICAgInNoYTUxMiIKICAgIF0sCiAgICAia2V5dHlwZSI6ICJlY2RzYSIsCiAgICAia2V5dmFsIjogewogICAgICJwdWJsaWMiOiAiLS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS1cbk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTBnaHJoOTJMdzFZcjNpZEdWNVdxQ3RNREI4Q3hcbitEOGhkQzR3MlpMTklwbFZSb1ZHTHNrWWEzZ2hlTXlPamlKOGtQaTE1YVEyLy83UCtvajdVdkpQR3c9PVxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tXG4iCiAgICB9LAogICAgInNjaGVtZSI6ICJlY2RzYS1zaGEyLW5pc3RwMjU2IiwKICAgICJ4LXR1Zi1vbi1jaS1rZXlvd25lciI6ICJAam9zaHVhZ2wiCiAgIH0sCiAgICJlNzFhNTRkNTQzODM1YmE4NmFkYWQ5NDYwMzc5Yzc2NDFmYjg3MjZkMTY0ZWE3NjY4MDFhMWM1MjJhYmE3ZWEyIjogewogICAgImtleWlkX2hhc2hfYWxnb3JpdGhtcyI6IFsKICAgICAic2hhMjU2IiwKICAgICAic2hhNTEyIgogICAgXSwKICAgICJrZXl0eXBlIjogImVjZHNhIiwKICAgICJrZXl2YWwiOiB7CiAgICAgInB1YmxpYyI6ICItLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFRVhzejNTWlhGYjhqTVY0Mmo2cEpseWpialI4S1xuTjNCd29jZXhxNkxNSWI1cXNXS09RdkxOMTZOVWVmTGM0SHN3T291bVJzVlZhYWpTcFFTNmZvYmtSdz09XG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1cbiIKICAgIH0sCiAgICAic2NoZW1lIjogImVjZHNhLXNoYTItbmlzdHAyNTYiLAogICAgIngtdHVmLW9uLWNpLWtleW93bmVyIjogIkBtbm02NzgiCiAgIH0KICB9LAogICJyb2xlcyI6IHsKICAgInJvb3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI2ZjI2MDA4OWQ1OTIzZGFmMjAxNjZjYTY1N2M1NDNhZjYxODM0NmFiOTcxODg0YTk5OTYyYjAxOTg4YmJlMGMzIiwKICAgICAiZTcxYTU0ZDU0MzgzNWJhODZhZGFkOTQ2MDM3OWM3NjQxZmI4NzI2ZDE2NGVhNzY2ODAxYTFjNTIyYWJhN2VhMiIsCiAgICAgIjIyZjRjYWVjNmQ4ZTZmOTU1NWFmNjZiM2Q0YzNjYjA2YTNiYjIzZmRjN2UzOWM5MTZjNjFmNDYyZTZmNTJiMDYiLAogICAgICI2MTY0MzgzODEyNWI0NDBiNDBkYjY5NDJmNWNiNWEzMWMwZGMwNDM2ODMxNmViMmFhYTU4Yjk1OTA0YTU4MjIyIiwKICAgICAiYTY4N2U1YmY0ZmFiODJiMGVlNThkNDZlMDVjOTUzNTE0NWEyYzlhZmI0NThmNDNkNDJiNDVjYTBmZGNlMmE3MCIKICAgIF0sCiAgICAidGhyZXNob2xkIjogMwogICB9LAogICAic25hcHNob3QiOiB7CiAgICAia2V5aWRzIjogWwogICAgICI3MjQ3ZjBkYmFkODViMTQ3ZTE4NjNiYWRlNzYxMjQzY2M3ODVkY2I3YWE0MTBlNzEwNWRkM2QyYjYxYTM2ZDJjIgogICAgXSwKICAgICJ0aHJlc2hvbGQiOiAxLAogICAgIngtdHVmLW9uLWNpLWV4cGlyeS1wZXJpb2QiOiAzNjUwLAogICAgIngtdHVmLW9uLWNpLXNpZ25pbmctcGVyaW9kIjogMzY1CiAgIH0sCiAgICJ0YXJnZXRzIjogewogICAgImtleWlkcyI6IFsKICAgICAiNmYyNjAwODlkNTkyM2RhZjIwMTY2Y2E2NTdjNTQzYWY2MTgzNDZhYjk3MTg4NGE5OTk2MmIwMTk4OGJiZTBjMyIsCiAgICAgImU3MWE1NGQ1NDM4MzViYTg2YWRhZDk0NjAzNzljNzY0MWZiODcyNmQxNjRlYTc2NjgwMWExYzUyMmFiYTdlYTIiLAogICAgICIyMmY0Y2FlYzZkOGU2Zjk1NTVhZjY2YjNkNGMzY2IwNmEzYmIyM2ZkYzdlMzljOTE2YzYxZjQ2MmU2ZjUyYjA2IiwKICAgICAiNjE2NDM4MzgxMjViNDQwYjQwZGI2OTQyZjVjYjVhMzFjMGRjMDQzNjgzMTZlYjJhYWE1OGI5NTkwNGE1ODIyMiIsCiAgICAgImE2ODdlNWJmNGZhYjgyYjBlZTU4ZDQ2ZTA1Yzk1MzUxNDVhMmM5YWZiNDU4ZjQzZDQyYjQ1Y2EwZmRjZTJhNzAiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDMKICAgfSwKICAgInRpbWVzdGFtcCI6IHsKICAgICJrZXlpZHMiOiBbCiAgICAgIjcyNDdmMGRiYWQ4NWIxNDdlMTg2M2JhZGU3NjEyNDNjYzc4NWRjYjdhYTQxMGU3MTA1ZGQzZDJiNjFhMzZkMmMiCiAgICBdLAogICAgInRocmVzaG9sZCI6IDEsCiAgICAieC10dWYtb24tY2ktZXhwaXJ5LXBlcmlvZCI6IDcsCiAgICAieC10dWYtb24tY2ktc2lnbmluZy1wZXJpb2QiOiA0CiAgIH0KICB9LAogICJzcGVjX3ZlcnNpb24iOiAiMS4wIiwKICAidmVyc2lvbiI6IDEwLAogICJ4LXR1Zi1vbi1jaS1leHBpcnktcGVyaW9kIjogMTgyLAogICJ4LXR1Zi1vbi1jaS1zaWduaW5nLXBlcmlvZCI6IDMxCiB9Cn0=",targets:{"trusted_root.json":"ewogICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLmRldi5zaWdzdG9yZS50cnVzdGVkcm9vdCtqc29uO3ZlcnNpb249MC4xIiwKICAidGxvZ3MiOiBbCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vcmVrb3Iuc2lnc3RvcmUuZGV2IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUyRzJZKzJ0YWJkVFY1QmNHaUJJeDBhOWZBRndya0JibUxTR3RrczRMM3FYNnlZWTB6dWZCbmhDOFVyL2l5NTVHaFdQLzlBL2JZMkxoQzMwTTkrUll0dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDEtMTJUMTE6NTM6MjcuMDAwWiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAid05JOWF0UUdseitWV2ZPNkxSeWdINFFVZlkvOFc0UkZ3aVQ1aTVXUmdCMD0iCiAgICAgIH0KICAgIH0KICBdLAogICJjZXJ0aWZpY2F0ZUF1dGhvcml0aWVzIjogWwogICAgewogICAgICAic3ViamVjdCI6IHsKICAgICAgICAib3JnYW5pemF0aW9uIjogInNpZ3N0b3JlLmRldiIsCiAgICAgICAgImNvbW1vbk5hbWUiOiAic2lnc3RvcmUiCiAgICAgIH0sCiAgICAgICJ1cmkiOiAiaHR0cHM6Ly9mdWxjaW8uc2lnc3RvcmUuZGV2IiwKICAgICAgImNlcnRDaGFpbiI6IHsKICAgICAgICAiY2VydGlmaWNhdGVzIjogWwogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQitEQ0NBWDZnQXdJQkFnSVROVmtEWm9DaW9mUERzeTdkZm02Z2VMYnVoekFLQmdncWhrak9QUVFEQXpBcU1SVXdFd1lEVlFRS0V3eHphV2R6ZEc5eVpTNWtaWFl4RVRBUEJnTlZCQU1UQ0hOcFozTjBiM0psTUI0WERUSXhNRE13TnpBek1qQXlPVm9YRFRNeE1ESXlNekF6TWpBeU9Wb3dLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkxTeUE3SWk1aytwTk84WkVXWTB5bGVtV0Rvd09rTmEza0wrR1pFNVo1R1dlaEw5L0E5YlJOQTNSYnJzWjVpMEpjYXN0YVJMN1NwNWZwL2pENWR4cWMvVWRUVm5sdlMxNmFuKzJZZnN3ZS9RdUxvbFJVQ3JjT0UyKzJpQTUrdHpkNk5tTUdRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFFd0hRWURWUjBPQkJZRUZNakZIUUJCbWlRcE1sRWs2dzJ1U3UxS0J0UHNNQjhHQTFVZEl3UVlNQmFBRk1qRkhRQkJtaVFwTWxFazZ3MnVTdTFLQnRQc01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01IOGxpV0pmTXVpNnZYWEJoakRnWTRNd3NsbU4vVEp4VmUvODNXckZvbXdtTmYwNTZ5MVg0OEY5YzRtM2Ezb3pYQUl4QUtqUmF5NS9hai9qc0tLR0lrbVFhdGpJOHV1cEhyLytDeEZ2YUpXbXBZcU5rTERHUlUrOW9yemg1aEkyUnJjdWFRPT0iCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMDdUMDM6MjA6MjkuMDAwWiIsCiAgICAgICAgImVuZCI6ICIyMDIyLTEyLTMxVDIzOjU5OjU5Ljk5OVoiCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAic2lnc3RvcmUuZGV2IiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJzaWdzdG9yZSIKICAgICAgfSwKICAgICAgInVyaSI6ICJodHRwczovL2Z1bGNpby5zaWdzdG9yZS5kZXYiLAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlDR2pDQ0FhR2dBd0lCQWdJVUFMblZpVmZuVTBickphc21Sa0hybi9VbmZhUXdDZ1lJS29aSXpqMEVBd013S2pFVk1CTUdBMVVFQ2hNTWMybG5jM1J2Y21VdVpHVjJNUkV3RHdZRFZRUURFd2h6YVdkemRHOXlaVEFlRncweU1qQTBNVE15TURBMk1UVmFGdzB6TVRFd01EVXhNelUyTlRoYU1EY3hGVEFUQmdOVkJBb1RESE5wWjNOMGIzSmxMbVJsZGpFZU1Cd0dBMVVFQXhNVmMybG5jM1J2Y21VdGFXNTBaWEp0WldScFlYUmxNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRThSVlMveXNIK05PdnVEWnlQSVp0aWxnVUY5TmxhcllwQWQ5SFAxdkJCSDFVNUNWNzdMU1M3czBaaUg0bkU3SHY3cHRTNkx2dlIvU1RrNzk4TFZnTXpMbEo0SGVJZkYzdEhTYWV4TGNZcFNBU3Ixa1MwTi9SZ0JKei85aldDaVhubzNzd2VUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0V3WURWUjBsQkF3d0NnWUlLd1lCQlFVSEF3TXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJBREFkQmdOVkhRNEVGZ1FVMzlQcHoxWWtFWmI1cU5qcEtGV2l4aTRZWkQ4d0h3WURWUjBqQkJnd0ZvQVVXTUFlWDVGRnBXYXBlc3lRb1pNaTBDckZ4Zm93Q2dZSUtvWkl6ajBFQXdNRFp3QXdaQUl3UENzUUs0RFlpWllEUElhRGk1SEZLbmZ4WHg2QVNTVm1FUmZzeW5ZQmlYMlg2U0pSblpVODQvOURaZG5GdnZ4bUFqQk90NlFwQmxjNEovMER4dmtUQ3FwY2x2emlMNkJDQ1BuamRsSUIzUHUzQnhzUG15Z1VZN0lpMnpiZENkbGlpb3c9IgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUI5ekNDQVh5Z0F3SUJBZ0lVQUxaTkFQRmR4SFB3amVEbG9Ed3lZQ2hBTy80d0NnWUlLb1pJemowRUF3TXdLakVWTUJNR0ExVUVDaE1NYzJsbmMzUnZjbVV1WkdWMk1SRXdEd1lEVlFRREV3aHphV2R6ZEc5eVpUQWVGdzB5TVRFd01EY3hNelUyTlRsYUZ3MHpNVEV3TURVeE16VTJOVGhhTUNveEZUQVRCZ05WQkFvVERITnBaM04wYjNKbExtUmxkakVSTUE4R0ExVUVBeE1JYzJsbmMzUnZjbVV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBVDdYZUZUNHJiM1BRR3dTNElhanRMazMvT2xucGdhbmdhQmNsWXBzWUJyNWkrNHluQjA3Y2ViM0xQME9JT1pkeGV4WDY5YzVpVnV5SlJRK0h6MDV5aStVRjN1QldBbEhwaVM1c2gwK0gyR0hFN1NYcmsxRUM1bTFUcjE5TDlnZzkyall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUll3QjVma1VXbFpxbDZ6SkNoa3lMUUtzWEYrakFmQmdOVkhTTUVHREFXZ0JSWXdCNWZrVVdsWnFsNnpKQ2hreUxRS3NYRitqQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUFqMW5IZVhacCsxM05XQk5hK0VEc0RQOEcxV1dnMXRDTVdQL1dIUHFwYVZvMGpoc3dlTkZaZ1NzMGVFN3dZSTRxQWpFQTJXQjlvdDk4c0lrb0YzdlpZZGQzL1Z0V0I1YjlUTk1lYTdJeC9zdEo1VGZjTExlQUJMRTRCTkpPc1E0dm5CSEoiCiAgICAgICAgICB9CiAgICAgICAgXQogICAgICB9LAogICAgICAidmFsaWRGb3IiOiB7CiAgICAgICAgInN0YXJ0IjogIjIwMjItMDQtMTNUMjA6MDY6MTUuMDAwWiIKICAgICAgfQogICAgfQogIF0sCiAgImN0bG9ncyI6IFsKICAgIHsKICAgICAgImJhc2VVcmwiOiAiaHR0cHM6Ly9jdGZlLnNpZ3N0b3JlLmRldi90ZXN0IiwKICAgICAgImhhc2hBbGdvcml0aG0iOiAiU0hBMl8yNTYiLAogICAgICAicHVibGljS2V5IjogewogICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUViZndSK1JKdWRYc2NnUkJScEtYMVhGRHkzUHl1ZER4ei9TZm5SaTFmVDhla3BmQmQyTzF1b3o3anIzWjhuS3p4QTY5RVVRK2VGQ0ZJM3pldWJQV1U3dz09IiwKICAgICAgICAia2V5RGV0YWlscyI6ICJQS0lYX0VDRFNBX1AyNTZfU0hBXzI1NiIsCiAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgInN0YXJ0IjogIjIwMjEtMDMtMTRUMDA6MDA6MDAuMDAwWiIsCiAgICAgICAgICAiZW5kIjogIjIwMjItMTAtMzFUMjM6NTk6NTkuOTk5WiIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJsb2dJZCI6IHsKICAgICAgICAia2V5SWQiOiAiQ0dDUzhDaFMvMmhGMGRGcko0U2NSV2NZckJZOXd6alNiZWE4SWdZMmIzST0iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJiYXNlVXJsIjogImh0dHBzOi8vY3RmZS5zaWdzdG9yZS5kZXYvMjAyMiIsCiAgICAgICJoYXNoQWxnb3JpdGhtIjogIlNIQTJfMjU2IiwKICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAicmF3Qnl0ZXMiOiAiTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFaVBTbEZpMENtRlRmRWpDVXFGOUh1Q0VjWVhOS0FhWWFsSUptQlo4eXllelBqVHFoeHJLQnBNbmFvY1Z0TEpCSTFlTTN1WG5RelFHQUpkSjRnczlGeXc9PSIsCiAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICJzdGFydCI6ICIyMDIyLTEwLTIwVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgfQogICAgICB9LAogICAgICAibG9nSWQiOiB7CiAgICAgICAgImtleUlkIjogIjNUMHdhc2JIRVRKakdSNGNtV2MzQXFKS1hyamVQSzMvaDRweWdDOHA3bzQ9IgogICAgICB9CiAgICB9CiAgXSwKICAidGltZXN0YW1wQXV0aG9yaXRpZXMiOiBbCiAgICB7CiAgICAgICJzdWJqZWN0IjogewogICAgICAgICJvcmdhbml6YXRpb24iOiAiR2l0SHViLCBJbmMuIiwKICAgICAgICAiY29tbW9uTmFtZSI6ICJJbnRlcm5hbCBTZXJ2aWNlcyBSb290IgogICAgICB9LAogICAgICAiY2VydENoYWluIjogewogICAgICAgICJjZXJ0aWZpY2F0ZXMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNSUlCM0RDQ0FXS2dBd0lCQWdJVWNoa05zSDM2WGEwNGIxTHFJYytxcjlEVmVjTXdDZ1lJS29aSXpqMEVBd013TWpFVk1CTUdBMVVFQ2hNTVIybDBTSFZpTENCSmJtTXVNUmt3RndZRFZRUURFeEJVVTBFZ2FXNTBaWEp0WldScFlYUmxNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVEkwTURReE16QXdNREF3TUZvd01qRVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVJrd0Z3WURWUVFERXhCVVUwRWdWR2x0WlhOMFlXMXdhVzVuTUZrd0V3WUhLb1pJemowQ0FRWUlLb1pJemowREFRY0RRZ0FFVUQ1Wk5iU3FZTWQ2cjhxcE9PRVg5aWJHblpUOUdzdVhPaHIvZjhVOUZKdWdCR0V4S1lwNDBPVUxTMGVyalpXN3hWOXhWNTJObkpmNU9lRHE0ZTVaS3FOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CTUdBMVVkSlFRTU1Bb0dDQ3NHQVFVRkJ3TUlNQXdHQTFVZEV3RUIvd1FDTUFBd0h3WURWUjBqQkJnd0ZvQVVhVzFSdWRPZ1Z0MGxlcVkwV0tZYnVQcjQ3d0F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3YlVIOUh2RDRlakNaSk9XUW5xQWxrcVVSbGx2dTlNOCtWcUxiaVJLK3pTZlpDWndzaWxqUm44TVFRUlNrWEVFNUFqRUFnK1Z4cXRvamZWZnU4RGh6emhDeDlHS0VUYkpIYjE5aVY3Mm1NS1ViREFGbXpaNmJROGI1NFpiOHRpZHk1YVdlIgogICAgICAgICAgfSwKICAgICAgICAgIHsKICAgICAgICAgICAgInJhd0J5dGVzIjogIk1JSUNFRENDQVpXZ0F3SUJBZ0lVWDhaTzVRWFA3dk40ZE1RNWU5c1UzbnViOE9nd0NnWUlLb1pJemowRUF3TXdPREVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1SOHdIUVlEVlFRREV4WkpiblJsY201aGJDQlRaWEoyYVdObGN5QlNiMjkwTUI0WERUSXpNRFF4TkRBd01EQXdNRm9YRFRJNE1EUXhNakF3TURBd01Gb3dNakVWTUJNR0ExVUVDaE1NUjJsMFNIVmlMQ0JKYm1NdU1Sa3dGd1lEVlFRREV4QlVVMEVnYVc1MFpYSnRaV1JwWVhSbE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFdk1MWS9kVFZidklKWUFOQXVzekV3Sm5RRTFsbGZ0eW55TUtJTWhoNDhIbXFiVnI1eWd5YnpzTFJMVktiQldPZFoyMWFlSnorZ1ppeXRaZXRxY3lGOVdsRVI1TkVNZjZKVjdaTm9qUXB4SHE0UkhHb0dTY2VRdi9xdlRpWnhFREtvMll3WkRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RWdZRFZSMFRBUUgvQkFnd0JnRUIvd0lCQURBZEJnTlZIUTRFRmdRVWFXMVJ1ZE9nVnQwbGVxWTBXS1lidVByNDd3QXdId1lEVlIwakJCZ3dGb0FVOU5ZWWxvYm5BRzRjMC9xanh5SC9scS93eitRd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFLMUIxODV5Z0NySVlGbElzM0dqc3dqbndTTUc2TFk4d29MVmRha0tEWnhWYThmOGNxTXMxRGhjeEowKzA5dzk1UUl4QU8rdEJ6Wms3dmpVSjlpSmdENFI2WldUeFFXS3FObTc0ak85OW8rbzlzdjRGSS9TWlRaVEZ5TW4wSUpFSGRObXlBPT0iCiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICAicmF3Qnl0ZXMiOiAiTUlJQjlEQ0NBWHFnQXdJQkFnSVVhL0pBa2RVaks0SlV3c3F0YWlSSkdXaHFMU293Q2dZSUtvWkl6ajBFQXdNd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNQjRYRFRJek1EUXhOREF3TURBd01Gb1hEVE16TURReE1UQXdNREF3TUZvd09ERVZNQk1HQTFVRUNoTU1SMmwwU0hWaUxDQkpibU11TVI4d0hRWURWUVFERXhaSmJuUmxjbTVoYkNCVFpYSjJhV05sY3lCU2IyOTBNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRWY5akZBWHh6NGt4NjhBSFJNT2tGQmhmbERjTVR2emFYejR4L0ZDY1hqSi8xcUVLb24vcVBJR25hVVJza0R0eU5iTkRPcGVKVERERnF0NDhpTVBybnpweDZJWndxZW1mVUpONHhCRVpmemErcFl0L2l5b2QrOXRacjIwUlJXU3YvbzBVd1F6QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFqQWRCZ05WSFE0RUZnUVU5TllZbG9ibkFHNGMwL3FqeHlIL2xxL3d6K1F3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUxaTFo4QmdSWHpLeExNTU45VklsTytlNGhyQm5OQmdGN3R6N0hucm93djJOZXRaRXJJQUNLRnltQmx2V0R2dE1BSXdaTytraTZzc1ExYnNabzk4TzhtRUFmMk5aN2lpQ2dERFUwVndqZWNvNnp5ZWgwekJUczkvN2dWNkFITlE1M3hEIgogICAgICAgICAgfQogICAgICAgIF0KICAgICAgfSwKICAgICAgInZhbGlkRm9yIjogewogICAgICAgICJzdGFydCI6ICIyMDIzLTA0LTE0VDAwOjAwOjAwLjAwMFoiCiAgICAgIH0KICAgIH0KICBdCn0K","registry.npmjs.org%2Fkeys.json":"ewogICAgImtleXMiOiBbCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRTFPbGIzek1BRkZ4WEtIaUlrUU81Y0ozWWhsNWk2VVBwK0lodXRlQkpidUhjQTVVb2dLbzBFV3RsV3dXNktTYUtvVE5FWUw3SmxDUWlWbmtoQmt0VWdnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIxOTk5LTAxLTAxVDAwOjAwOjAwLjAwMFoiLAogICAgICAgICAgICAgICAgICAgICJlbmQiOiAiMjAyNS0wMS0yOVQwMDowMDowMC4wMDBaIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJrZXlJZCI6ICJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsCiAgICAgICAgICAgICJrZXlVc2FnZSI6ICJucG06YXR0ZXN0YXRpb25zIiwKICAgICAgICAgICAgInB1YmxpY0tleSI6IHsKICAgICAgICAgICAgICAgICJyYXdCeXRlcyI6ICJNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUUxT2xiM3pNQUZGeFhLSGlJa1FPNWNKM1lobDVpNlVQcCtJaHV0ZUJKYnVIY0E1VW9nS28wRVd0bFd3VzZLU2FLb1RORVlMN0psQ1FpVm5raEJrdFVnZz09IiwKICAgICAgICAgICAgICAgICJrZXlEZXRhaWxzIjogIlBLSVhfRUNEU0FfUDI1Nl9TSEFfMjU2IiwKICAgICAgICAgICAgICAgICJ2YWxpZEZvciI6IHsKICAgICAgICAgICAgICAgICAgICAic3RhcnQiOiAiMjAyMi0xMi0wMVQwMDowMDowMC4wMDBaIiwKICAgICAgICAgICAgICAgICAgICAiZW5kIjogIjIwMjUtMDEtMjlUMDA6MDA6MDAuMDAwWiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAia2V5SWQiOiAiU0hBMjU2OkRoUTh3UjVBUEJ2RkhMRi8rVGMrQVl2UE9kVHBjSURxT2h4c0JIUndDN1UiLAogICAgICAgICAgICAia2V5VXNhZ2UiOiAibnBtOnNpZ25hdHVyZXMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgImtleUlkIjogIlNIQTI1NjpEaFE4d1I1QVBCdkZITEYvK1RjK0FZdlBPZFRwY0lEcU9oeHNCSFJ3QzdVIiwKICAgICAgICAgICAgImtleVVzYWdlIjogIm5wbTphdHRlc3RhdGlvbnMiLAogICAgICAgICAgICAicHVibGljS2V5IjogewogICAgICAgICAgICAgICAgInJhd0J5dGVzIjogIk1Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRVk2WWE3VysrN2FVUHp2TVRyZXpINlljeDNjK0hPS1lDY05HeWJKWlNDSnEvZmQ3UWE4dXVBS3RkSWtVUXRRaUVLRVJoQW1FNWxNTUpoUDhPa0RPYTJnPT0iLAogICAgICAgICAgICAgICAgImtleURldGFpbHMiOiAiUEtJWF9FQ0RTQV9QMjU2X1NIQV8yNTYiLAogICAgICAgICAgICAgICAgInZhbGlkRm9yIjogewogICAgICAgICAgICAgICAgICAgICJzdGFydCI6ICIyMDI1LTAxLTEzVDAwOjAwOjAwLjAwMFoiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBdCn0K"}}}});var Xbe=_(y1=>{"use strict";var Zbe=y1&&y1.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(y1,"__esModule",{value:!0});y1.TUFClient=void 0;var Rg=Zbe(Ie("fs")),GP=Zbe(Ie("path")),qvt=Jbe(),Wvt=pL(),Yvt=Kbe(),YJ="targets",WJ=class{constructor(e){let r=new URL(e.mirrorURL),s=encodeURIComponent(r.host+r.pathname.replace(/\/$/,"")),a=GP.default.join(e.cachePath,s);Vvt(a),Jvt({cachePath:a,mirrorURL:e.mirrorURL,tufRootPath:e.rootPath,forceInit:e.forceInit}),this.updater=Kvt({mirrorURL:e.mirrorURL,cachePath:a,forceCache:e.forceCache,retry:e.retry,timeout:e.timeout})}async refresh(){return this.updater.refresh()}getTarget(e){return(0,Yvt.readTarget)(this.updater,e)}};y1.TUFClient=WJ;function Vvt(t){let e=GP.default.join(t,YJ);Rg.default.existsSync(t)||Rg.default.mkdirSync(t,{recursive:!0}),Rg.default.existsSync(e)||Rg.default.mkdirSync(e)}function Jvt({cachePath:t,mirrorURL:e,tufRootPath:r,forceInit:s}){let a=GP.default.join(t,"root.json");if(!Rg.default.existsSync(a)||s)if(r)Rg.default.copyFileSync(r,a);else{let c=zbe()[e];if(!c)throw new Wvt.TUFError({code:"TUF_INIT_CACHE_ERROR",message:`No root.json found for mirror: ${e}`});Rg.default.writeFileSync(a,Buffer.from(c["root.json"],"base64")),Object.entries(c.targets).forEach(([f,p])=>{Rg.default.writeFileSync(GP.default.join(t,YJ,f),Buffer.from(p,"base64"))})}}function Kvt(t){let e={fetchTimeout:t.timeout,fetchRetry:t.retry};return new qvt.Updater({metadataBaseUrl:t.mirrorURL,targetBaseUrl:`${t.mirrorURL}/targets`,metadataDir:t.cachePath,targetDir:GP.default.join(t.cachePath,YJ),forceCache:t.forceCache,config:e})}});var pL=_(gh=>{"use strict";Object.defineProperty(gh,"__esModule",{value:!0});gh.TUFError=gh.DEFAULT_MIRROR_URL=void 0;gh.getTrustedRoot=nSt;gh.initTUF=iSt;var zvt=mP(),Zvt=QPe(),Xvt=Xbe();gh.DEFAULT_MIRROR_URL="https://tuf-repo-cdn.sigstore.dev";var $vt="sigstore-js",eSt={retries:2},tSt=5e3,rSt="trusted_root.json";async function nSt(t={}){let r=await $be(t).getTarget(rSt);return zvt.TrustedRoot.fromJSON(JSON.parse(r))}async function iSt(t={}){let e=$be(t);return e.refresh().then(()=>e)}function $be(t){return new Xvt.TUFClient({cachePath:t.cachePath||(0,Zvt.appDataPath)($vt),rootPath:t.rootPath,mirrorURL:t.mirrorURL||gh.DEFAULT_MIRROR_URL,retry:t.retry??eSt,timeout:t.timeout??tSt,forceCache:t.forceCache??!1,forceInit:t.forceInit??t.force??!1})}var sSt=qJ();Object.defineProperty(gh,"TUFError",{enumerable:!0,get:function(){return sSt.TUFError}})});var exe=_(hL=>{"use strict";Object.defineProperty(hL,"__esModule",{value:!0});hL.DSSESignatureContent=void 0;var qP=Cl(),VJ=class{constructor(e){this.env=e}compareDigest(e){return qP.crypto.bufferEqual(e,qP.crypto.digest("sha256",this.env.payload))}compareSignature(e){return qP.crypto.bufferEqual(e,this.signature)}verifySignature(e){return qP.crypto.verify(this.preAuthEncoding,e,this.signature)}get signature(){return this.env.signatures.length>0?this.env.signatures[0].sig:Buffer.from("")}get preAuthEncoding(){return qP.dsse.preAuthEncoding(this.env.payloadType,this.env.payload)}};hL.DSSESignatureContent=VJ});var txe=_(gL=>{"use strict";Object.defineProperty(gL,"__esModule",{value:!0});gL.MessageSignatureContent=void 0;var JJ=Cl(),KJ=class{constructor(e,r){this.signature=e.signature,this.messageDigest=e.messageDigest.digest,this.artifact=r}compareSignature(e){return JJ.crypto.bufferEqual(e,this.signature)}compareDigest(e){return JJ.crypto.bufferEqual(e,this.messageDigest)}verifySignature(e){return JJ.crypto.verify(this.artifact,e,this.signature)}};gL.MessageSignatureContent=KJ});var nxe=_(dL=>{"use strict";Object.defineProperty(dL,"__esModule",{value:!0});dL.toSignedEntity=lSt;dL.signatureContent=rxe;var zJ=Cl(),oSt=exe(),aSt=txe();function lSt(t,e){let{tlogEntries:r,timestampVerificationData:s}=t.verificationMaterial,a=[];for(let n of r)a.push({$case:"transparency-log",tlogEntry:n});for(let n of s?.rfc3161Timestamps??[])a.push({$case:"timestamp-authority",timestamp:zJ.RFC3161Timestamp.parse(n.signedTimestamp)});return{signature:rxe(t,e),key:cSt(t),tlogEntries:r,timestamps:a}}function rxe(t,e){switch(t.content.$case){case"dsseEnvelope":return new oSt.DSSESignatureContent(t.content.dsseEnvelope);case"messageSignature":return new aSt.MessageSignatureContent(t.content.messageSignature,e)}}function cSt(t){switch(t.verificationMaterial.content.$case){case"publicKey":return{$case:"public-key",hint:t.verificationMaterial.content.publicKey.hint};case"x509CertificateChain":return{$case:"certificate",certificate:zJ.X509Certificate.parse(t.verificationMaterial.content.x509CertificateChain.certificates[0].rawBytes)};case"certificate":return{$case:"certificate",certificate:zJ.X509Certificate.parse(t.verificationMaterial.content.certificate.rawBytes)}}}});var Eo=_(E1=>{"use strict";Object.defineProperty(E1,"__esModule",{value:!0});E1.PolicyError=E1.VerificationError=void 0;var mL=class extends Error{constructor({code:e,message:r,cause:s}){super(r),this.code=e,this.cause=s,this.name=this.constructor.name}},ZJ=class extends mL{};E1.VerificationError=ZJ;var XJ=class extends mL{};E1.PolicyError=XJ});var ixe=_(yL=>{"use strict";Object.defineProperty(yL,"__esModule",{value:!0});yL.filterCertAuthorities=uSt;yL.filterTLogAuthorities=fSt;function uSt(t,e){return t.filter(r=>r.validFor.start<=e.start&&r.validFor.end>=e.end)}function fSt(t,e){return t.filter(r=>e.logID&&!r.logID.equals(e.logID)?!1:r.validFor.start<=e.targetDate&&e.targetDate<=r.validFor.end)}});var py=_(Ay=>{"use strict";Object.defineProperty(Ay,"__esModule",{value:!0});Ay.filterTLogAuthorities=Ay.filterCertAuthorities=void 0;Ay.toTrustMaterial=pSt;var $J=Cl(),WP=mP(),ASt=Eo(),eK=new Date(0),tK=new Date(864e13),axe=ixe();Object.defineProperty(Ay,"filterCertAuthorities",{enumerable:!0,get:function(){return axe.filterCertAuthorities}});Object.defineProperty(Ay,"filterTLogAuthorities",{enumerable:!0,get:function(){return axe.filterTLogAuthorities}});function pSt(t,e){let r=typeof e=="function"?e:hSt(e);return{certificateAuthorities:t.certificateAuthorities.map(oxe),timestampAuthorities:t.timestampAuthorities.map(oxe),tlogs:t.tlogs.map(sxe),ctlogs:t.ctlogs.map(sxe),publicKey:r}}function sxe(t){let e=t.publicKey.keyDetails,r=e===WP.PublicKeyDetails.PKCS1_RSA_PKCS1V5||e===WP.PublicKeyDetails.PKIX_RSA_PKCS1V5||e===WP.PublicKeyDetails.PKIX_RSA_PKCS1V15_2048_SHA256||e===WP.PublicKeyDetails.PKIX_RSA_PKCS1V15_3072_SHA256||e===WP.PublicKeyDetails.PKIX_RSA_PKCS1V15_4096_SHA256?"pkcs1":"spki";return{logID:t.logId.keyId,publicKey:$J.crypto.createPublicKey(t.publicKey.rawBytes,r),validFor:{start:t.publicKey.validFor?.start||eK,end:t.publicKey.validFor?.end||tK}}}function oxe(t){return{certChain:t.certChain.certificates.map(e=>$J.X509Certificate.parse(e.rawBytes)),validFor:{start:t.validFor?.start||eK,end:t.validFor?.end||tK}}}function hSt(t){return e=>{let r=(t||{})[e];if(!r)throw new ASt.VerificationError({code:"PUBLIC_KEY_ERROR",message:`key not found: ${e}`});return{publicKey:$J.crypto.createPublicKey(r.rawBytes),validFor:s=>(r.validFor?.start||eK)<=s&&(r.validFor?.end||tK)>=s}}}});var rK=_(YP=>{"use strict";Object.defineProperty(YP,"__esModule",{value:!0});YP.CertificateChainVerifier=void 0;YP.verifyCertificateChain=dSt;var hy=Eo(),gSt=py();function dSt(t,e){let r=(0,gSt.filterCertAuthorities)(e,{start:t.notBefore,end:t.notAfter}),s;for(let a of r)try{return new EL({trustedCerts:a.certChain,untrustedCert:t}).verify()}catch(n){s=n}throw new hy.VerificationError({code:"CERTIFICATE_ERROR",message:"Failed to verify certificate chain",cause:s})}var EL=class{constructor(e){this.untrustedCert=e.untrustedCert,this.trustedCerts=e.trustedCerts,this.localCerts=mSt([...e.trustedCerts,e.untrustedCert])}verify(){let e=this.sort();return this.checkPath(e),e}sort(){let e=this.untrustedCert,r=this.buildPaths(e);if(r=r.filter(a=>a.some(n=>this.trustedCerts.includes(n))),r.length===0)throw new hy.VerificationError({code:"CERTIFICATE_ERROR",message:"no trusted certificate path found"});let s=r.reduce((a,n)=>a.length{if(s&&a.extSubjectKeyID){a.extSubjectKeyID.keyIdentifier.equals(s)&&r.push(a);return}a.subject.equals(e.issuer)&&r.push(a)}),r=r.filter(a=>{try{return e.verify(a)}catch{return!1}}),r)}checkPath(e){if(e.length<1)throw new hy.VerificationError({code:"CERTIFICATE_ERROR",message:"certificate chain must contain at least one certificate"});if(!e.slice(1).every(s=>s.isCA))throw new hy.VerificationError({code:"CERTIFICATE_ERROR",message:"intermediate certificate is not a CA"});for(let s=e.length-2;s>=0;s--)if(!e[s].issuer.equals(e[s+1].subject))throw new hy.VerificationError({code:"CERTIFICATE_ERROR",message:"incorrect certificate name chaining"});for(let s=0;s{"use strict";Object.defineProperty(nK,"__esModule",{value:!0});nK.verifySCTs=ISt;var IL=Cl(),ySt=Eo(),ESt=py();function ISt(t,e,r){let s,a=t.clone();for(let p=0;p{if(!(0,ESt.filterTLogAuthorities)(r,{logID:p.logID,targetDate:p.datetime}).some(C=>p.verify(n.buffer,C.publicKey)))throw new ySt.VerificationError({code:"CERTIFICATE_ERROR",message:"SCT verification failed"});return p.logID})}});var uxe=_(CL=>{"use strict";Object.defineProperty(CL,"__esModule",{value:!0});CL.verifyPublicKey=DSt;CL.verifyCertificate=PSt;var CSt=Cl(),cxe=Eo(),wSt=rK(),BSt=lxe(),vSt="1.3.6.1.4.1.57264.1.1",SSt="1.3.6.1.4.1.57264.1.8";function DSt(t,e,r){let s=r.publicKey(t);return e.forEach(a=>{if(!s.validFor(a))throw new cxe.VerificationError({code:"PUBLIC_KEY_ERROR",message:`Public key is not valid for timestamp: ${a.toISOString()}`})}),{key:s.publicKey}}function PSt(t,e,r){let s=(0,wSt.verifyCertificateChain)(t,r.certificateAuthorities);if(!e.every(n=>s.every(c=>c.validForDate(n))))throw new cxe.VerificationError({code:"CERTIFICATE_ERROR",message:"certificate is not valid or expired at the specified date"});return{scts:(0,BSt.verifySCTs)(s[0],s[1],r.ctlogs),signer:bSt(s[0])}}function bSt(t){let e,r=t.extension(SSt);r?e=r.valueObj.subs?.[0]?.value.toString("ascii"):e=t.extension(vSt)?.value.toString("ascii");let s={extensions:{issuer:e},subjectAlternativeName:t.subjectAltName};return{key:CSt.crypto.createPublicKey(t.publicKey),identity:s}}});var Axe=_(wL=>{"use strict";Object.defineProperty(wL,"__esModule",{value:!0});wL.verifySubjectAlternativeName=xSt;wL.verifyExtensions=kSt;var fxe=Eo();function xSt(t,e){if(e===void 0||!e.match(t))throw new fxe.PolicyError({code:"UNTRUSTED_SIGNER_ERROR",message:`certificate identity error - expected ${t}, got ${e}`})}function kSt(t,e={}){let r;for(r in t)if(e[r]!==t[r])throw new fxe.PolicyError({code:"UNTRUSTED_SIGNER_ERROR",message:`invalid certificate extension - expected ${r}=${t[r]}, got ${r}=${e[r]}`})}});var pxe=_(lK=>{"use strict";Object.defineProperty(lK,"__esModule",{value:!0});lK.verifyCheckpoint=TSt;var sK=Cl(),I1=Eo(),QSt=py(),iK=` `,RSt=/\u2014 (\S+) (\S+)\n/g;function TSt(t,e){let r=(0,QSt.filterTLogAuthorities)(e,{targetDate:new Date(Number(t.integratedTime)*1e3)}),s=t.inclusionProof,a=oK.fromString(s.checkpoint.envelope),n=aK.fromString(a.note);if(!FSt(a,r))throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"invalid checkpoint signature"});if(!sK.crypto.bufferEqual(n.logHash,s.rootHash))throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"root hash mismatch"})}function FSt(t,e){let r=Buffer.from(t.note,"utf-8");return t.signatures.every(s=>{let a=e.find(n=>sK.crypto.bufferEqual(n.logID.subarray(0,4),s.keyHint));return a?sK.crypto.verify(r,a.publicKey,s.signature):!1})}var oK=class t{constructor(e,r){this.note=e,this.signatures=r}static fromString(e){if(!e.includes(iK))throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"missing checkpoint separator"});let r=e.indexOf(iK),s=e.slice(0,r+1),n=e.slice(r+iK.length).matchAll(RSt),c=Array.from(n,f=>{let[,p,h]=f,E=Buffer.from(h,"base64");if(E.length<5)throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"malformed checkpoint signature"});return{name:p,keyHint:E.subarray(0,4),signature:E.subarray(4)}});if(c.length===0)throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"no signatures found in checkpoint"});return new t(s,c)}},aK=class t{constructor(e,r,s,a){this.origin=e,this.logSize=r,this.logHash=s,this.rest=a}static fromString(e){let r=e.trimEnd().split(` `);if(r.length<3)throw new I1.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"too few lines in checkpoint header"});let s=r[0],a=BigInt(r[1]),n=Buffer.from(r[2],"base64"),c=r.slice(3);return new t(s,a,n,c)}}});var hxe=_(AK=>{"use strict";Object.defineProperty(AK,"__esModule",{value:!0});AK.verifyMerkleInclusion=LSt;var fK=Cl(),cK=Eo(),NSt=Buffer.from([0]),OSt=Buffer.from([1]);function LSt(t){let e=t.inclusionProof,r=BigInt(e.logIndex),s=BigInt(e.treeSize);if(r<0n||r>=s)throw new cK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:`invalid index: ${r}`});let{inner:a,border:n}=MSt(r,s);if(e.hashes.length!==a+n)throw new cK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"invalid hash count"});let c=e.hashes.slice(0,a),f=e.hashes.slice(a),p=qSt(t.canonicalizedBody),h=_St(USt(p,c,r),f);if(!fK.crypto.bufferEqual(h,e.rootHash))throw new cK.VerificationError({code:"TLOG_INCLUSION_PROOF_ERROR",message:"calculated root hash does not match inclusion proof"})}function MSt(t,e){let r=HSt(t,e),s=jSt(t>>BigInt(r));return{inner:r,border:s}}function USt(t,e,r){return e.reduce((s,a,n)=>r>>BigInt(n)&BigInt(1)?uK(a,s):uK(s,a),t)}function _St(t,e){return e.reduce((r,s)=>uK(s,r),t)}function HSt(t,e){return GSt(t^e-BigInt(1))}function jSt(t){return t.toString(2).split("1").length-1}function GSt(t){return t===0n?0:t.toString(2).length}function uK(t,e){return fK.crypto.digest("sha256",OSt,t,e)}function qSt(t){return fK.crypto.digest("sha256",NSt,t)}});var dxe=_(pK=>{"use strict";Object.defineProperty(pK,"__esModule",{value:!0});pK.verifyTLogSET=VSt;var gxe=Cl(),WSt=Eo(),YSt=py();function VSt(t,e){if(!(0,YSt.filterTLogAuthorities)(e,{logID:t.logId.keyId,targetDate:new Date(Number(t.integratedTime)*1e3)}).some(a=>{let n=JSt(t),c=Buffer.from(gxe.json.canonicalize(n),"utf8"),f=t.inclusionPromise.signedEntryTimestamp;return gxe.crypto.verify(c,a.publicKey,f)}))throw new WSt.VerificationError({code:"TLOG_INCLUSION_PROMISE_ERROR",message:"inclusion promise could not be verified"})}function JSt(t){let{integratedTime:e,logIndex:r,logId:s,canonicalizedBody:a}=t;return{body:a.toString("base64"),integratedTime:Number(e),logIndex:Number(r),logID:s.keyId.toString("hex")}}});var mxe=_(dK=>{"use strict";Object.defineProperty(dK,"__esModule",{value:!0});dK.verifyRFC3161Timestamp=ZSt;var hK=Cl(),gK=Eo(),KSt=rK(),zSt=py();function ZSt(t,e,r){let s=t.signingTime;if(r=(0,zSt.filterCertAuthorities)(r,{start:s,end:s}),r=$St(r,{serialNumber:t.signerSerialNumber,issuer:t.signerIssuer}),!r.some(n=>{try{return XSt(t,e,n),!0}catch{return!1}}))throw new gK.VerificationError({code:"TIMESTAMP_ERROR",message:"timestamp could not be verified"})}function XSt(t,e,r){let[s,...a]=r.certChain,n=hK.crypto.createPublicKey(s.publicKey),c=t.signingTime;try{new KSt.CertificateChainVerifier({untrustedCert:s,trustedCerts:a}).verify()}catch{throw new gK.VerificationError({code:"TIMESTAMP_ERROR",message:"invalid certificate chain"})}if(!r.certChain.every(p=>p.validForDate(c)))throw new gK.VerificationError({code:"TIMESTAMP_ERROR",message:"timestamp was signed with an expired certificate"});t.verify(e,n)}function $St(t,e){return t.filter(r=>r.certChain.length>0&&hK.crypto.bufferEqual(r.certChain[0].serialNumber,e.serialNumber)&&hK.crypto.bufferEqual(r.certChain[0].issuer,e.issuer))}});var yxe=_(BL=>{"use strict";Object.defineProperty(BL,"__esModule",{value:!0});BL.verifyTSATimestamp=sDt;BL.verifyTLogTimestamp=oDt;var eDt=Eo(),tDt=pxe(),rDt=hxe(),nDt=dxe(),iDt=mxe();function sDt(t,e,r){return(0,iDt.verifyRFC3161Timestamp)(t,e,r),{type:"timestamp-authority",logID:t.signerSerialNumber,timestamp:t.signingTime}}function oDt(t,e){let r=!1;if(aDt(t)&&((0,nDt.verifyTLogSET)(t,e),r=!0),lDt(t)&&((0,rDt.verifyMerkleInclusion)(t),(0,tDt.verifyCheckpoint)(t,e),r=!0),!r)throw new eDt.VerificationError({code:"TLOG_MISSING_INCLUSION_ERROR",message:"inclusion could not be verified"});return{type:"transparency-log",logID:t.logId.keyId,timestamp:new Date(Number(t.integratedTime)*1e3)}}function aDt(t){return t.inclusionPromise!==void 0}function lDt(t){return t.inclusionProof!==void 0}});var Exe=_(mK=>{"use strict";Object.defineProperty(mK,"__esModule",{value:!0});mK.verifyDSSETLogBody=cDt;var vL=Eo();function cDt(t,e){switch(t.apiVersion){case"0.0.1":return uDt(t,e);default:throw new vL.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported dsse version: ${t.apiVersion}`})}}function uDt(t,e){if(t.spec.signatures?.length!==1)throw new vL.VerificationError({code:"TLOG_BODY_ERROR",message:"signature count mismatch"});let r=t.spec.signatures[0].signature;if(!e.compareSignature(Buffer.from(r,"base64")))throw new vL.VerificationError({code:"TLOG_BODY_ERROR",message:"tlog entry signature mismatch"});let s=t.spec.payloadHash?.value||"";if(!e.compareDigest(Buffer.from(s,"hex")))throw new vL.VerificationError({code:"TLOG_BODY_ERROR",message:"DSSE payload hash mismatch"})}});var Ixe=_(EK=>{"use strict";Object.defineProperty(EK,"__esModule",{value:!0});EK.verifyHashedRekordTLogBody=fDt;var yK=Eo();function fDt(t,e){switch(t.apiVersion){case"0.0.1":return ADt(t,e);default:throw new yK.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported hashedrekord version: ${t.apiVersion}`})}}function ADt(t,e){let r=t.spec.signature.content||"";if(!e.compareSignature(Buffer.from(r,"base64")))throw new yK.VerificationError({code:"TLOG_BODY_ERROR",message:"signature mismatch"});let s=t.spec.data.hash?.value||"";if(!e.compareDigest(Buffer.from(s,"hex")))throw new yK.VerificationError({code:"TLOG_BODY_ERROR",message:"digest mismatch"})}});var Cxe=_(IK=>{"use strict";Object.defineProperty(IK,"__esModule",{value:!0});IK.verifyIntotoTLogBody=pDt;var SL=Eo();function pDt(t,e){switch(t.apiVersion){case"0.0.2":return hDt(t,e);default:throw new SL.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported intoto version: ${t.apiVersion}`})}}function hDt(t,e){if(t.spec.content.envelope.signatures?.length!==1)throw new SL.VerificationError({code:"TLOG_BODY_ERROR",message:"signature count mismatch"});let r=gDt(t.spec.content.envelope.signatures[0].sig);if(!e.compareSignature(Buffer.from(r,"base64")))throw new SL.VerificationError({code:"TLOG_BODY_ERROR",message:"tlog entry signature mismatch"});let s=t.spec.content.payloadHash?.value||"";if(!e.compareDigest(Buffer.from(s,"hex")))throw new SL.VerificationError({code:"TLOG_BODY_ERROR",message:"DSSE payload hash mismatch"})}function gDt(t){return Buffer.from(t,"base64").toString("utf-8")}});var Bxe=_(CK=>{"use strict";Object.defineProperty(CK,"__esModule",{value:!0});CK.verifyTLogBody=EDt;var wxe=Eo(),dDt=Exe(),mDt=Ixe(),yDt=Cxe();function EDt(t,e){let{kind:r,version:s}=t.kindVersion,a=JSON.parse(t.canonicalizedBody.toString("utf8"));if(r!==a.kind||s!==a.apiVersion)throw new wxe.VerificationError({code:"TLOG_BODY_ERROR",message:`kind/version mismatch - expected: ${r}/${s}, received: ${a.kind}/${a.apiVersion}`});switch(a.kind){case"dsse":return(0,dDt.verifyDSSETLogBody)(a,e);case"intoto":return(0,yDt.verifyIntotoTLogBody)(a,e);case"hashedrekord":return(0,mDt.verifyHashedRekordTLogBody)(a,e);default:throw new wxe.VerificationError({code:"TLOG_BODY_ERROR",message:`unsupported kind: ${r}`})}}});var bxe=_(DL=>{"use strict";Object.defineProperty(DL,"__esModule",{value:!0});DL.Verifier=void 0;var IDt=Ie("util"),C1=Eo(),vxe=uxe(),Sxe=Axe(),Dxe=yxe(),CDt=Bxe(),wK=class{constructor(e,r={}){this.trustMaterial=e,this.options={ctlogThreshold:r.ctlogThreshold??1,tlogThreshold:r.tlogThreshold??1,tsaThreshold:r.tsaThreshold??0}}verify(e,r){let s=this.verifyTimestamps(e),a=this.verifySigningKey(e,s);return this.verifyTLogs(e),this.verifySignature(e,a),r&&this.verifyPolicy(r,a.identity||{}),a}verifyTimestamps(e){let r=0,s=0,a=e.timestamps.map(n=>{switch(n.$case){case"timestamp-authority":return s++,(0,Dxe.verifyTSATimestamp)(n.timestamp,e.signature.signature,this.trustMaterial.timestampAuthorities);case"transparency-log":return r++,(0,Dxe.verifyTLogTimestamp)(n.tlogEntry,this.trustMaterial.tlogs)}});if(Pxe(a))throw new C1.VerificationError({code:"TIMESTAMP_ERROR",message:"duplicate timestamp"});if(rn.timestamp)}verifySigningKey({key:e},r){switch(e.$case){case"public-key":return(0,vxe.verifyPublicKey)(e.hint,r,this.trustMaterial);case"certificate":{let s=(0,vxe.verifyCertificate)(e.certificate,r,this.trustMaterial);if(Pxe(s.scts))throw new C1.VerificationError({code:"CERTIFICATE_ERROR",message:"duplicate SCT"});if(s.scts.length(0,CDt.verifyTLogBody)(s,e))}verifySignature(e,r){if(!e.signature.verifySignature(r.key))throw new C1.VerificationError({code:"SIGNATURE_ERROR",message:"signature verification failed"})}verifyPolicy(e,r){e.subjectAlternativeName&&(0,Sxe.verifySubjectAlternativeName)(e.subjectAlternativeName,r.subjectAlternativeName),e.extensions&&(0,Sxe.verifyExtensions)(e.extensions,r.extensions)}};DL.Verifier=wK;function Pxe(t){for(let e=0;e{"use strict";Object.defineProperty(iu,"__esModule",{value:!0});iu.Verifier=iu.toTrustMaterial=iu.VerificationError=iu.PolicyError=iu.toSignedEntity=void 0;var wDt=nxe();Object.defineProperty(iu,"toSignedEntity",{enumerable:!0,get:function(){return wDt.toSignedEntity}});var xxe=Eo();Object.defineProperty(iu,"PolicyError",{enumerable:!0,get:function(){return xxe.PolicyError}});Object.defineProperty(iu,"VerificationError",{enumerable:!0,get:function(){return xxe.VerificationError}});var BDt=py();Object.defineProperty(iu,"toTrustMaterial",{enumerable:!0,get:function(){return BDt.toTrustMaterial}});var vDt=bxe();Object.defineProperty(iu,"Verifier",{enumerable:!0,get:function(){return vDt.Verifier}})});var kxe=_(Fa=>{"use strict";Object.defineProperty(Fa,"__esModule",{value:!0});Fa.DEFAULT_TIMEOUT=Fa.DEFAULT_RETRY=void 0;Fa.createBundleBuilder=PDt;Fa.createKeyFinder=bDt;Fa.createVerificationPolicy=xDt;var SDt=Cl(),w1=F7(),DDt=PL();Fa.DEFAULT_RETRY={retries:2};Fa.DEFAULT_TIMEOUT=5e3;function PDt(t,e){let r={signer:kDt(e),witnesses:RDt(e)};switch(t){case"messageSignature":return new w1.MessageSignatureBundleBuilder(r);case"dsseEnvelope":return new w1.DSSEBundleBuilder({...r,certificateChain:e.legacyCompatibility})}}function bDt(t){return e=>{let r=t(e);if(!r)throw new DDt.VerificationError({code:"PUBLIC_KEY_ERROR",message:`key not found: ${e}`});return{publicKey:SDt.crypto.createPublicKey(r),validFor:()=>!0}}}function xDt(t){let e={},r=t.certificateIdentityEmail||t.certificateIdentityURI;return r&&(e.subjectAlternativeName=r),t.certificateIssuer&&(e.extensions={issuer:t.certificateIssuer}),e}function kDt(t){return new w1.FulcioSigner({fulcioBaseURL:t.fulcioURL,identityProvider:t.identityProvider||QDt(t),retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})}function QDt(t){let e=t.identityToken;return e?{getToken:()=>Promise.resolve(e)}:new w1.CIContextProvider("sigstore")}function RDt(t){let e=[];return TDt(t)&&e.push(new w1.RekorWitness({rekorBaseURL:t.rekorURL,entryType:t.legacyCompatibility?"intoto":"dsse",fetchOnConflict:!1,retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})),FDt(t)&&e.push(new w1.TSAWitness({tsaBaseURL:t.tsaServerURL,retry:t.retry??Fa.DEFAULT_RETRY,timeout:t.timeout??Fa.DEFAULT_TIMEOUT})),e}function TDt(t){return t.tlogUpload!==!1}function FDt(t){return t.tsaServerURL!==void 0}});var Txe=_(su=>{"use strict";var NDt=su&&su.__createBinding||(Object.create?function(t,e,r,s){s===void 0&&(s=r);var a=Object.getOwnPropertyDescriptor(e,r);(!a||("get"in a?!e.__esModule:a.writable||a.configurable))&&(a={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,s,a)}:function(t,e,r,s){s===void 0&&(s=r),t[s]=e[r]}),ODt=su&&su.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Qxe=su&&su.__importStar||function(){var t=function(e){return t=Object.getOwnPropertyNames||function(r){var s=[];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(s[s.length]=a);return s},t(e)};return function(e){if(e&&e.__esModule)return e;var r={};if(e!=null)for(var s=t(e),a=0;aa.verify(t,s))}async function Rxe(t={}){let e=await LDt.getTrustedRoot({mirrorURL:t.tufMirrorURL,rootPath:t.tufRootPath,cachePath:t.tufCachePath,forceCache:t.tufForceCache,retry:t.retry??B1.DEFAULT_RETRY,timeout:t.timeout??B1.DEFAULT_TIMEOUT}),r=t.keySelector?B1.createKeyFinder(t.keySelector):void 0,s=(0,BK.toTrustMaterial)(e,r),a={ctlogThreshold:t.ctLogThreshold,tlogThreshold:t.tlogThreshold},n=new BK.Verifier(s,a),c=B1.createVerificationPolicy(t);return{verify:(f,p)=>{let h=(0,vK.bundleFromJSON)(f),E=(0,BK.toSignedEntity)(h,p);n.verify(E,c)}}}});var Nxe=_(Ni=>{"use strict";Object.defineProperty(Ni,"__esModule",{value:!0});Ni.verify=Ni.sign=Ni.createVerifier=Ni.attest=Ni.VerificationError=Ni.PolicyError=Ni.TUFError=Ni.InternalError=Ni.DEFAULT_REKOR_URL=Ni.DEFAULT_FULCIO_URL=Ni.ValidationError=void 0;var HDt=EP();Object.defineProperty(Ni,"ValidationError",{enumerable:!0,get:function(){return HDt.ValidationError}});var SK=F7();Object.defineProperty(Ni,"DEFAULT_FULCIO_URL",{enumerable:!0,get:function(){return SK.DEFAULT_FULCIO_URL}});Object.defineProperty(Ni,"DEFAULT_REKOR_URL",{enumerable:!0,get:function(){return SK.DEFAULT_REKOR_URL}});Object.defineProperty(Ni,"InternalError",{enumerable:!0,get:function(){return SK.InternalError}});var jDt=pL();Object.defineProperty(Ni,"TUFError",{enumerable:!0,get:function(){return jDt.TUFError}});var Fxe=PL();Object.defineProperty(Ni,"PolicyError",{enumerable:!0,get:function(){return Fxe.PolicyError}});Object.defineProperty(Ni,"VerificationError",{enumerable:!0,get:function(){return Fxe.VerificationError}});var bL=Txe();Object.defineProperty(Ni,"attest",{enumerable:!0,get:function(){return bL.attest}});Object.defineProperty(Ni,"createVerifier",{enumerable:!0,get:function(){return bL.createVerifier}});Object.defineProperty(Ni,"sign",{enumerable:!0,get:function(){return bL.sign}});Object.defineProperty(Ni,"verify",{enumerable:!0,get:function(){return bL.verify}})});Dt();Ge();Dt();var pke=Ie("child_process"),hke=ut(Fd());Yt();var $I=new Map([]);var Gv={};Vt(Gv,{BaseCommand:()=>ft,WorkspaceRequiredError:()=>ar,getCli:()=>Bde,getDynamicLibs:()=>wde,getPluginConfiguration:()=>tC,openWorkspace:()=>eC,pluginCommands:()=>$I,runExit:()=>YT});Yt();var ft=class extends ot{constructor(){super(...arguments);this.cwd=ge.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new nt("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ge();Dt();Yt();var ar=class extends nt{constructor(e,r){let s=J.relative(e,r),a=J.join(e,Ut.fileName);super(`This command can only be run from within a workspace of your project (${s} isn't a workspace of ${a}).`)}};Ge();Dt();eA();wc();pv();Yt();var hat=ut(Ai());Ul();var wde=()=>new Map([["@yarnpkg/cli",Gv],["@yarnpkg/core",jv],["@yarnpkg/fslib",_2],["@yarnpkg/libzip",fv],["@yarnpkg/parsers",J2],["@yarnpkg/shell",mv],["clipanion",oB],["semver",hat],["typanion",Ea]]);Ge();async function eC(t,e){let{project:r,workspace:s}=await Rt.find(t,e);if(!s)throw new ar(r.cwd,e);return s}Ge();Dt();eA();wc();pv();Yt();var fbt=ut(Ai());Ul();var f5={};Vt(f5,{AddCommand:()=>sC,BinCommand:()=>oC,CacheCleanCommand:()=>aC,ClipanionCommand:()=>pC,ConfigCommand:()=>fC,ConfigGetCommand:()=>lC,ConfigSetCommand:()=>cC,ConfigUnsetCommand:()=>uC,DedupeCommand:()=>AC,EntryCommand:()=>gC,ExecCommand:()=>mC,ExplainCommand:()=>IC,ExplainPeerRequirementsCommand:()=>yC,HelpCommand:()=>hC,InfoCommand:()=>CC,LinkCommand:()=>BC,NodeCommand:()=>vC,PluginCheckCommand:()=>SC,PluginImportCommand:()=>bC,PluginImportSourcesCommand:()=>xC,PluginListCommand:()=>DC,PluginRemoveCommand:()=>kC,PluginRuntimeCommand:()=>QC,RebuildCommand:()=>RC,RemoveCommand:()=>TC,RunCommand:()=>NC,RunIndexCommand:()=>FC,SetResolutionCommand:()=>OC,SetVersionCommand:()=>EC,SetVersionSourcesCommand:()=>PC,UnlinkCommand:()=>LC,UpCommand:()=>MC,VersionCommand:()=>dC,WhyCommand:()=>UC,WorkspaceCommand:()=>qC,WorkspacesListCommand:()=>GC,YarnCommand:()=>wC,dedupeUtils:()=>tF,default:()=>bct,suggestUtils:()=>Zu});var Yye=ut(Fd());Ge();Ge();Ge();Yt();var uye=ut(Vv());Ul();var Zu={};Vt(Zu,{Modifier:()=>jq,Strategy:()=>$T,Target:()=>Jv,WorkspaceModifier:()=>sye,applyModifier:()=>Flt,extractDescriptorFromPath:()=>Gq,extractRangeModifier:()=>oye,fetchDescriptorFrom:()=>qq,findProjectDescriptors:()=>cye,getModifier:()=>Kv,getSuggestedDescriptors:()=>zv,makeWorkspaceDescriptor:()=>lye,toWorkspaceModifier:()=>aye});Ge();Ge();Dt();var Hq=ut(Ai()),Rlt="workspace:",Jv=(s=>(s.REGULAR="dependencies",s.DEVELOPMENT="devDependencies",s.PEER="peerDependencies",s))(Jv||{}),jq=(s=>(s.CARET="^",s.TILDE="~",s.EXACT="",s))(jq||{}),sye=(s=>(s.CARET="^",s.TILDE="~",s.EXACT="*",s))(sye||{}),$T=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))($T||{});function Kv(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var Tlt=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function oye(t,{project:e}){let r=t.match(Tlt);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Flt(t,e){let{protocol:r,source:s,params:a,selector:n}=G.parseRange(t.range);return Hq.default.valid(n)&&(n=`${e}${t.range}`),G.makeDescriptor(t,G.makeRange({protocol:r,source:s,params:a,selector:n}))}function aye(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function lye(t,e){return G.makeDescriptor(t.anchoredDescriptor,`${Rlt}${aye(e)}`)}async function cye(t,{project:e,target:r}){let s=new Map,a=n=>{let c=s.get(n.descriptorHash);return c||s.set(n.descriptorHash,c={descriptor:n,locators:[]}),c};for(let n of e.workspaces)if(r==="peerDependencies"){let c=n.manifest.peerDependencies.get(t.identHash);c!==void 0&&a(c).locators.push(n.anchoredLocator)}else{let c=n.manifest.dependencies.get(t.identHash),f=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?f!==void 0?a(f).locators.push(n.anchoredLocator):c!==void 0&&a(c).locators.push(n.anchoredLocator):c!==void 0?a(c).locators.push(n.anchoredLocator):f!==void 0&&a(f).locators.push(n.anchoredLocator)}return s}async function Gq(t,{cwd:e,workspace:r}){return await Olt(async s=>{J.isAbsolute(t)||(t=J.relative(r.cwd,J.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await qq(G.makeIdent(null,"archive"),t,{project:r.project,cache:s,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let c=new ki,f=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:s,fetcher:p,report:c,resolver:f},E=f.bindDescriptor(n,r.anchoredLocator,h),C=G.convertDescriptorToLocator(E),S=await p.fetch(C,h),b=await Ut.find(S.prefixPath,{baseFs:S.packageFs});if(!b.name)throw new Error("Target path doesn't have a name");return G.makeDescriptor(b.name,t)})}function Nlt(t){if(t.range==="unknown")return{type:"resolve",range:"latest"};if(Fr.validRange(t.range))return{type:"fixed",range:t.range};if(Mp.test(t.range))return{type:"resolve",range:t.range};let e=t.range.match(/^(?:jsr:|npm:)(.*)/);if(!e)return{type:"fixed",range:t.range};let[,r]=e,s=`${G.stringifyIdent(t)}@`;return r.startsWith(s)&&(r=r.slice(s.length)),Fr.validRange(r)?{type:"fixed",range:t.range}:Mp.test(r)?{type:"resolve",range:t.range}:{type:"fixed",range:t.range}}async function zv(t,{project:e,workspace:r,cache:s,target:a,fixed:n,modifier:c,strategies:f,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let h=!n||t.range==="unknown"?Nlt(t):{type:"fixed",range:t.range};if(h.type==="fixed")return{suggestions:[{descriptor:t,name:`Use ${G.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let E=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,C=[],S=[],b=async I=>{try{await I()}catch(T){S.push(T)}};for(let I of f){if(C.length>=p)break;switch(I){case"keep":await b(async()=>{E&&C.push({descriptor:E,name:`Keep ${G.prettyDescriptor(e.configuration,E)}`,reason:"(no changes)"})});break;case"reuse":await b(async()=>{for(let{descriptor:T,locators:N}of(await cye(t,{project:e,target:a})).values()){if(N.length===1&&N[0].locatorHash===r.anchoredLocator.locatorHash&&f.includes("keep"))continue;let U=`(originally used by ${G.prettyLocator(e.configuration,N[0])}`;U+=N.length>1?` and ${N.length-1} other${N.length>2?"s":""})`:")",C.push({descriptor:T,name:`Reuse ${G.prettyDescriptor(e.configuration,T)}`,reason:U})}});break;case"cache":await b(async()=>{for(let T of e.storedDescriptors.values())T.identHash===t.identHash&&C.push({descriptor:T,name:`Reuse ${G.prettyDescriptor(e.configuration,T)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await b(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let T=e.tryWorkspaceByIdent(t);if(T===null)return;let N=lye(T,c);C.push({descriptor:N,name:`Attach ${G.prettyDescriptor(e.configuration,N)}`,reason:`(local workspace at ${he.pretty(e.configuration,T.relativeCwd,he.Type.PATH)})`})});break;case"latest":{let T=e.configuration.get("enableNetwork"),N=e.configuration.get("enableOfflineMode");await b(async()=>{if(a==="peerDependencies")C.push({descriptor:G.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!T&&!N)C.push({descriptor:null,name:"Resolve from latest",reason:he.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let U=await qq(t,h.range,{project:e,cache:s,workspace:r,modifier:c});U&&C.push({descriptor:U,name:`Use ${G.prettyDescriptor(e.configuration,U)}`,reason:`(resolved from ${N?"the cache":"latest"})`})}})}break}}return{suggestions:C.slice(0,p),rejections:S.slice(0,p)}}async function qq(t,e,{project:r,cache:s,workspace:a,preserveModifier:n=!0,modifier:c}){let f=r.configuration.normalizeDependency(G.makeDescriptor(t,e)),p=new ki,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),C={project:r,fetcher:h,cache:s,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},S={...C,resolver:E,fetchOptions:C},b=E.bindDescriptor(f,a.anchoredLocator,S),I=await E.getCandidates(b,{},S);if(I.length===0)return null;let T=I[0],{protocol:N,source:U,params:W,selector:ee}=G.parseRange(G.convertToManifestRange(T.reference));if(N===r.configuration.get("defaultProtocol")&&(N=null),Hq.default.valid(ee)){let ie=ee;if(typeof c<"u")ee=c+ee;else if(n!==!1){let me=typeof n=="string"?n:f.range;ee=oye(me,{project:r})+ee}let ue=G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:W,selector:ee}));(await E.getCandidates(r.configuration.normalizeDependency(ue),{},S)).length!==1&&(ee=ie)}return G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:W,selector:ee}))}async function Olt(t){return await ce.mktempPromise(async e=>{let r=ze.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Kr(e,{configuration:r,check:!1,immutable:!1}))})}var sC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=ge.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=ge.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=ge.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=ge.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=ge.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=ge.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:fo($l)});this.silent=ge.Boolean("--silent",{hidden:!0});this.packages=ge.Rest()}static{this.paths=[["add"]]}static{this.usage=ot.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"],["Add a local package (gzipped tarball format) to the current workspace","$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=f||r.get("preferReuse"),h=Kv(this,s),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(W=>typeof W<"u"),C=f?1/0:1,S=W=>{let ee=G.tryParseDescriptor(W.slice(4));return ee?ee.range==="unknown"?G.makeDescriptor(ee,`jsr:${G.stringifyIdent(ee)}@latest`):G.makeDescriptor(ee,`jsr:${ee.range}`):null},b=await Promise.all(this.packages.map(async W=>{let ee=W.match(/^\.{0,2}\//)?await Gq(W,{cwd:this.context.cwd,workspace:a}):W.startsWith("jsr:")?S(W):G.tryParseDescriptor(W),ie=W.match(/^(https?:|git@github)/);if(ie)throw new nt(`It seems you are trying to add a package using a ${he.pretty(r,`${ie[0]}...`,he.Type.RANGE)} url; we now require package names to be explicitly specified. Try running the command again with the package name prefixed: ${he.pretty(r,"yarn add",he.Type.CODE)} ${he.pretty(r,G.makeDescriptor(G.makeIdent(null,"my-package"),`${ie[0]}...`),he.Type.DESCRIPTOR)}`);if(!ee)throw new nt(`The ${he.pretty(r,W,he.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let ue=Llt(a,ee,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(ue.map(async me=>{let pe=await zv(ee,{project:s,workspace:a,cache:n,fixed:c,target:me,modifier:h,strategies:E,maxResults:C});return{request:ee,suggestedDescriptors:pe,target:me}}))})).then(W=>W.flat()),I=await lA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async W=>{for(let{request:ee,suggestedDescriptors:{suggestions:ie,rejections:ue}}of b)if(ie.filter(me=>me.descriptor!==null).length===0){let[me]=ue;if(typeof me>"u")throw new Error("Assertion failed: Expected an error to have been set");s.configuration.get("enableNetwork")?W.reportError(27,`${G.prettyDescriptor(r,ee)} can't be resolved to a satisfying range`):W.reportError(27,`${G.prettyDescriptor(r,ee)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),W.reportSeparator(),W.reportExceptionOnce(me)}});if(I.hasErrors())return I.exitCode();let T=!1,N=[],U=[];for(let{suggestedDescriptors:{suggestions:W},target:ee}of b){let ie,ue=W.filter(Be=>Be.descriptor!==null),le=ue[0].descriptor,me=ue.every(Be=>G.areDescriptorsEqual(Be.descriptor,le));ue.length===1||me?ie=le:(T=!0,{answer:ie}=await(0,uye.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:W.map(({descriptor:Be,name:Ce,reason:g})=>Be?{name:Ce,hint:g,descriptor:Be}:{name:Ce,hint:g,disabled:!0}),onCancel:()=>process.exit(130),result(Be){return this.find(Be,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let pe=a.manifest[ee].get(ie.identHash);(typeof pe>"u"||pe.descriptorHash!==ie.descriptorHash)&&(a.manifest[ee].set(ie.identHash,ie),this.optional&&(ee==="dependencies"?a.manifest.ensureDependencyMeta({...ie,range:"unknown"}).optional=!0:ee==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...ie,range:"unknown"}).optional=!0)),typeof pe>"u"?N.push([a,ee,ie,E]):U.push([a,ee,pe,ie]))}return await r.triggerMultipleHooks(W=>W.afterWorkspaceDependencyAddition,N),await r.triggerMultipleHooks(W=>W.afterWorkspaceDependencyReplacement,U),T&&this.context.stdout.write(` `),await s.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function Llt(t,e,{dev:r,peer:s,preferDev:a,optional:n}){let c=t.manifest.dependencies.has(e.identHash),f=t.manifest.devDependencies.has(e.identHash),p=t.manifest.peerDependencies.has(e.identHash);if((r||s)&&c)throw new nt(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!s&&p)throw new nt(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&f)throw new nt(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!s&&p)throw new nt(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new nt(`Package "${G.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return s&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:f?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ge();Ge();Yt();var oC=class extends ft{constructor(){super(...arguments);this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=ge.String({required:!1})}static{this.paths=[["bin"]]}static{this.usage=ot.Usage({description:"get the path to a binary script",details:` When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Rt.find(r,this.context.cwd);if(await s.restoreInstallState(),this.name){let f=(await In.getPackageAccessibleBinaries(a,{project:s})).get(this.name);if(!f)throw new nt(`Couldn't find a binary named "${this.name}" for package "${G.prettyLocator(r,a)}"`);let[,p]=f;return this.context.stdout.write(`${p} `),0}return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async c=>{let f=await In.getPackageAccessibleBinaries(a,{project:s}),h=Array.from(f.keys()).reduce((E,C)=>Math.max(E,C.length),0);for(let[E,[C,S]]of f)c.reportJson({name:E,source:G.stringifyIdent(C),path:S});if(this.verbose)for(let[E,[C]]of f)c.reportInfo(null,`${E.padEnd(h," ")} ${G.prettyLocator(r,C)}`);else for(let E of f.keys())c.reportInfo(null,E)})).exitCode()}};Ge();Dt();Yt();var aC=class extends ft{constructor(){super(...arguments);this.mirror=ge.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=ge.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}static{this.paths=[["cache","clean"],["cache","clear"]]}static{this.usage=ot.Usage({description:"remove the shared cache files",details:` This command will remove all the files from the cache. `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(!r.get("enableCacheClean"))throw new nt("Cache cleaning is currently disabled. To enable it, set `enableCacheClean: true` in your configuration file. Note: Cache cleaning is typically not required and should be avoided when using Zero-Installs.");let s=await Kr.find(r);return(await Ot.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&s.mirrorCwd!==null,c=!this.mirror;n&&(await ce.removePromise(s.mirrorCwd),await r.triggerHook(f=>f.cleanGlobalArtifacts,r)),c&&await ce.removePromise(s.cwd)})).exitCode()}};Ge();Yt();ql();var Wq=Ie("util"),lC=class extends ft{constructor(){super(...arguments);this.why=ge.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=ge.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=ge.String()}static{this.paths=[["config","get"]]}static{this.usage=ot.Usage({description:"read a configuration settings",details:` This command will print a configuration setting. Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(s)>"u")throw new nt(`Couldn't find a configuration settings named "${s}"`);let c=r.getSpecial(s,{hideSecrets:!this.unsafe,getNativePaths:!0}),f=je.convertMapsToIndexableObjects(c),p=a?va(f,a):f,h=await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} `),h.exitCode();Wq.inspect.styles.name="cyan",this.context.stdout.write(`${(0,Wq.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} `)}return h.exitCode()}};Ge();Yt();ql();var Yq=Ie("util"),cC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String();this.value=ge.String()}static{this.paths=[["config","set"]]}static{this.usage=ot.Usage({description:"change a configuration settings",details:` This command will set a configuration setting. When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new nt("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new nt(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new nt("This setting only affects the file it's in, and thus cannot be set from the CLI");let f=this.json?JSON.parse(this.value):this.value;await(this.home?I=>ze.updateHomeConfiguration(I):I=>ze.updateConfiguration(s(),I))(I=>{if(n){let T=f0(I);return Jd(T,this.name,f),T}else return{...I,[a]:f}});let E=(await ze.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),C=je.convertMapsToIndexableObjects(E),S=n?va(C,n):C;return(await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async I=>{Yq.inspect.styles.name="cyan",I.reportInfo(0,`Successfully set ${this.name} to ${(0,Yq.inspect)(S,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Ge();Yt();ql();var uC=class extends ft{constructor(){super(...arguments);this.home=ge.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=ge.String()}static{this.paths=[["config","unset"]]}static{this.usage=ot.Usage({description:"unset a configuration setting",details:` This command will unset a configuration setting. `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=()=>{if(!r.projectCwd)throw new nt("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new nt(`Couldn't find a configuration settings named "${a}"`);let f=this.home?h=>ze.updateHomeConfiguration(h):h=>ze.updateConfiguration(s(),h);return(await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await f(C=>{if(!vB(C,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,C;let S=n?f0(C):{...C};return A0(S,this.name),S}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ge();Dt();Yt();var eF=Ie("util"),fC=class extends ft{constructor(){super(...arguments);this.noDefaults=ge.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=ge.Boolean("-v,--verbose",{hidden:!0});this.why=ge.Boolean("--why",{hidden:!0});this.names=ge.Rest()}static{this.paths=[["config"]]}static{this.usage=ot.Usage({description:"display the current configuration",details:` This command prints the current active configuration settings. `,examples:[["Print the active configuration settings","$0 config"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins,{strict:!1}),s=await SI({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(s!==null)return s;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,c=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async f=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)f.reportError(34,`Invalid configuration key "${p}" in ${h}`);f.reportSeparator()}if(this.json)for(let p of a){if(this.noDefaults&&!r.sources.has(p))continue;let h=r.settings.get(p);typeof h>"u"&&f.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),C=r.sources.get(p)??"",S=C&&C[0]!=="<"?fe.fromPortablePath(C):C;f.reportJson({key:p,effective:E,source:S,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let C of a){if(this.noDefaults&&!r.sources.has(C))continue;let S=r.settings.get(C),b=r.sources.get(C)??"",I=r.getSpecial(C,{hideSecrets:!0,getNativePaths:!0}),T={Description:{label:"Description",value:he.tuple(he.Type.MARKDOWN,{text:S.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:he.tuple(b[0]==="<"?he.Type.CODE:he.Type.PATH,b)}};h[C]={value:he.tuple(he.Type.CODE,C),children:T};let N=(U,W)=>{for(let[ee,ie]of W)if(ie instanceof Map){let ue={};U[ee]={children:ue},N(ue,ie)}else U[ee]={label:ee,value:he.tuple(he.Type.NO_HINT,(0,eF.inspect)(ie,p))}};I instanceof Map?N(T,I):T.Value={label:"Value",value:he.tuple(he.Type.NO_HINT,(0,eF.inspect)(I,p))}}a.length!==1&&(n=void 0),xs.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let f=a[0],p=(0,eF.inspect)(r.getSpecial(f,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` `),this.context.stdout.write(`${p} `)}return c.exitCode()}};Ge();Yt();Ul();var tF={};Vt(tF,{Strategy:()=>Zv,acceptedStrategies:()=>Mlt,dedupe:()=>Vq});Ge();Ge();var fye=ut(Go()),Zv=(e=>(e.HIGHEST="highest",e))(Zv||{}),Mlt=new Set(Object.values(Zv)),Ult={highest:async(t,e,{resolver:r,fetcher:s,resolveOptions:a,fetchOptions:n})=>{let c=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);je.getSetWithDefault(c,E.identHash).add(h)}let f=new Map(je.mapAndFilter(t.storedDescriptors.values(),p=>G.isVirtualDescriptor(p)?je.mapAndFilter.skip:[p.descriptorHash,je.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=f.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let C=t.originalPackages.get(E);if(typeof C>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let S=r.getResolutionDependencies(p,a),b=Object.fromEntries(await je.allSettledSafe(Object.entries(S).map(async([ee,ie])=>{let ue=f.get(ie.descriptorHash);if(typeof ue>"u")throw new Error(`Assertion failed: The descriptor (${ie.descriptorHash}) should have been registered`);let le=await ue.promise;if(!le)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[ee,le.updatedPackage]})));if(e.length&&!fye.default.isMatch(G.stringifyIdent(p),e)||!r.shouldPersistResolution(C,a))return C;let I=c.get(p.identHash);if(typeof I>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(I.size===1)return C;let T=[...I].map(ee=>{let ie=t.originalPackages.get(ee);if(typeof ie>"u")throw new Error(`Assertion failed: The package (${ee}) should have been registered`);return ie}),N=await r.getSatisfying(p,b,T,a),U=N.locators?.[0];if(typeof U>"u"||!N.sorted)return C;let W=t.originalPackages.get(U.locatorHash);if(typeof W>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return W}).then(async S=>{let b=await t.preparePackage(S,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:C,updatedPackage:S,resolvedPackage:b})}).catch(S=>{h.reject(S)})}return[...f.values()].map(p=>p.promise)}};async function Vq(t,{strategy:e,patterns:r,cache:s,report:a}){let{configuration:n}=t,c=new ki,f=n.makeResolver(),p=n.makeFetcher(),h={cache:s,checksums:t.storedChecksums,fetcher:p,project:t,report:c,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:f,report:c,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let C=Ult[e],S=await C(t,r,{resolver:f,resolveOptions:E,fetcher:p,fetchOptions:h}),b=Ao.progressViaCounter(S.length);await a.reportProgress(b);let I=0;await Promise.all(S.map(U=>U.then(W=>{if(W===null||W.currentPackage.locatorHash===W.updatedPackage.locatorHash)return;I++;let{descriptor:ee,currentPackage:ie,updatedPackage:ue}=W;a.reportInfo(0,`${G.prettyDescriptor(n,ee)} can be deduped from ${G.prettyLocator(n,ie)} to ${G.prettyLocator(n,ue)}`),a.reportJson({descriptor:G.stringifyDescriptor(ee),currentResolution:G.stringifyLocator(ie),updatedResolution:G.stringifyLocator(ue)}),t.storedResolutions.set(ee.descriptorHash,ue.locatorHash)}).finally(()=>b.tick())));let T;switch(I){case 0:T="No packages";break;case 1:T="One package";break;default:T=`${I} packages`}let N=he.pretty(n,e,he.Type.CODE);return a.reportInfo(0,`${T} can be deduped using the ${N} strategy`),I})}var AC=class extends ft{constructor(){super(...arguments);this.strategy=ge.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:fo(Zv)});this.check=ge.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[["dedupe"]]}static{this.usage=ot.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd),a=await Kr.find(r);await s.restoreInstallState({restoreResolutions:!1});let n=0,c=await Ot.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async f=>{n=await Vq(s,{strategy:this.strategy,patterns:this.patterns,cache:a,report:f})});return c.hasErrors()?c.exitCode():this.check?n?1:0:await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ge();Yt();var pC=class extends ft{static{this.paths=[["--clipanion=definitions"]]}async execute(){let{plugins:e}=await ze.find(this.context.cwd,this.context.plugins),r=[];for(let c of e){let{commands:f}=c[1];if(f){let h=Ca.from(f).definitions();r.push([c[0],h])}}let s=this.cli.definitions(),a=(c,f)=>c.split(" ").slice(1).join()===f.split(" ").slice(1).join(),n=Aye()["@yarnpkg/builder"].bundles.standard;for(let c of r){let f=c[1];for(let p of f)s.find(h=>a(h.path,p.path)).plugin={name:c[0],isDefault:n.includes(c[0])}}this.context.stdout.write(`${JSON.stringify(s,null,2)} `)}};var hC=class extends ft{static{this.paths=[["help"],["--help"],["-h"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ge();Dt();Yt();var gC=class extends ft{constructor(){super(...arguments);this.leadingArgument=ge.String();this.args=ge.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!G.tryParseIdent(this.leadingArgument)){let r=J.resolve(this.context.cwd,fe.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ge();var dC=class extends ft{static{this.paths=[["-v"],["--version"]]}async execute(){this.context.stdout.write(`${fn||""} `)}};Ge();Ge();Yt();var mC=class extends ft{constructor(){super(...arguments);this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[["exec"]]}static{this.usage=ot.Usage({description:"execute a shell script",details:` This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,locator:a}=await Rt.find(r,this.context.cwd);return await s.restoreInstallState(),await In.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:s})}};Ge();Yt();Ul();var yC=class extends ft{constructor(){super(...arguments);this.hash=ge.String({required:!1,validator:Nx(wE(),[X2(/^p[0-9a-f]{6}$/)])})}static{this.paths=[["explain","peer-requirements"]]}static{this.usage=ot.Usage({description:"explain a set of peer requirements",details:` A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters. When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not. When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement. **Note:** A hash is a seven-letter code consisting of the letter 'p' followed by six characters that can be obtained from peer dependency warnings or from the list of all peer requirements(\`yarn explain peer-requirements\`). `,examples:[["Explain the corresponding peer requirement for a hash","$0 explain peer-requirements p1a4ed"],["List all peer requirements","$0 explain peer-requirements"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),await s.applyLightResolution(),typeof this.hash<"u"?await Hlt(this.hash,s,{stdout:this.context.stdout}):await jlt(s,{stdout:this.context.stdout})}};async function Hlt(t,e,r){let s=e.peerRequirementNodes.get(t);if(typeof s>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:he.tuple(he.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:he.tuple(he.Type.NO_HINT,"...")}]:[]}:(a.add(p.requester.locatorHash),{value:he.tuple(he.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[G.stringifyLocator(h.requester),n(h)]))}),c=e.peerWarnings.find(p=>p.hash===t);return(await Ot.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=he.mark(e.configuration),E=c?h.Cross:h.Check;if(p.reportInfo(0,`Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} is requested to provide ${he.pretty(e.configuration,s.ident,he.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,he.pretty(e.configuration,s.subject,he.Type.LOCATOR)),xs.emitTree({children:Object.fromEntries(Array.from(s.requests.values(),C=>[G.stringifyLocator(C.requester),n(C)]))},{configuration:e.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),s.provided.range==="missing:"){let C=c?"":" , but all peer requests are optional";p.reportInfo(0,`${E} Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} does not provide ${he.pretty(e.configuration,s.ident,he.Type.IDENT)}${C}.`)}else{let C=e.storedResolutions.get(s.provided.descriptorHash);if(!C)throw new Error("Assertion failed: Expected the descriptor to be registered");let S=e.storedPackages.get(C);if(!S)throw new Error("Assertion failed: Expected the package to be registered");p.reportInfo(0,`${E} Package ${he.pretty(e.configuration,s.subject,he.Type.LOCATOR)} provides ${he.pretty(e.configuration,s.ident,he.Type.IDENT)} with version ${G.prettyReference(e.configuration,S.version??"0.0.0")}, ${c?"which does not satisfy all requests.":"which satisfies all requests"}`),c?.type===3&&(c.range?p.reportInfo(0,` The combined requested range is ${he.pretty(e.configuration,c.range,he.Type.RANGE)}`):p.reportInfo(0," Unfortunately, the requested ranges have no overlap"))}})).exitCode()}async function jlt(t,e){return(await Ot.start({configuration:t.configuration,stdout:e.stdout,includeFooter:!1,includePrefix:!1},async s=>{let a=he.mark(t.configuration),n=je.sortMap(t.peerRequirementNodes,[([,c])=>G.stringifyLocator(c.subject),([,c])=>G.stringifyIdent(c.ident)]);for(let[,c]of n.values()){if(!c.root)continue;let f=t.peerWarnings.find(E=>E.hash===c.hash),p=[...G.allPeerRequests(c)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=" and 1 other dependency":h="",c.provided.range!=="missing:"){let E=t.storedResolutions.get(c.provided.descriptorHash);if(!E)throw new Error("Assertion failed: Expected the resolution to have been registered");let C=t.storedPackages.get(E);if(!C)throw new Error("Assertion failed: Expected the provided package to have been registered");let S=`${he.pretty(t.configuration,c.hash,he.Type.CODE)} \u2192 ${f?a.Cross:a.Check} ${G.prettyLocator(t.configuration,c.subject)} provides ${G.prettyLocator(t.configuration,C)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,S):s.reportInfo(0,S)}else{let E=`${he.pretty(t.configuration,c.hash,he.Type.CODE)} \u2192 ${f?a.Cross:a.Check} ${G.prettyLocator(t.configuration,c.subject)} doesn't provide ${G.prettyIdent(t.configuration,c.ident)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;f?s.reportWarning(0,E):s.reportInfo(0,E)}}})).exitCode()}Ge();Yt();Ul();Ge();Ge();Dt();Yt();var pye=ut(Ai()),EC=class extends ft{constructor(){super(...arguments);this.useYarnPath=ge.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=ge.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=ge.String()}static{this.paths=[["set","version"]]}static{this.usage=ot.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let f=r.sources.get("yarnPath");if(!f)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(J.contains(p,f))return 0}let s=()=>{if(typeof fn>"u")throw new nt("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(f,p)=>({version:p,url:f.replace(/\{\}/g,p)});if(this.version==="self")a={url:s(),version:fn??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await Xv(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await Xv(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||fe.isAbsolute(this.version))a={url:`file://${J.resolve(fe.toPortablePath(this.version))}`,version:"file"};else if(Fr.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(Fr.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(Fr.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await Glt(r,this.version));else throw new nt(`Invalid version descriptor "${this.version}"`);return(await Ot.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async f=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(f.reportInfo(0,`Retrieving ${he.pretty(r,a.url,he.Type.PATH)}`),await ce.readFilePromise(a.url.slice(h.length))):(f.reportInfo(0,`Downloading ${he.pretty(r,a.url,he.Type.URL)}`),await ln.get(a.url,{configuration:r}))};await Jq(r,a.version,p,{report:f,useYarnPath:this.useYarnPath})})).exitCode()}};async function Glt(t,e){let s=(await ln.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>Fr.satisfiesWithPrereleases(a,e));if(s.length===0)throw new nt(`No matching release found for range ${he.pretty(t,e,he.Type.RANGE)}.`);return s[0]}async function Xv(t,e){let r=await ln.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new nt(`Tag ${he.pretty(t,e,he.Type.RANGE)} not found`);return r.latest[e]}async function Jq(t,e,r,{report:s,useYarnPath:a}){let n,c=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let ee=await c();await ce.mktempPromise(async ie=>{let ue=J.join(ie,"yarn.cjs");await ce.writeFilePromise(ue,ee);let{stdout:le}=await qr.execvp(process.execPath,[fe.fromPortablePath(ue),"--version"],{cwd:ie,env:{...t.env,YARN_IGNORE_PATH:"1"}});if(e=le.trim(),!pye.default.valid(e))throw new Error(`Invalid semver version. ${he.pretty(t,"yarn --version",he.Type.CODE)} returned: ${e}`)})}let f=t.projectCwd??t.startingCwd,p=J.resolve(f,".yarn/releases"),h=J.resolve(p,`yarn-${e}.cjs`),E=J.relative(t.startingCwd,h),C=je.isTaggedYarnVersion(e),S=t.get("yarnPath"),b=!C,I=b||!!S||!!a;if(a===!1){if(b)throw new jt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");I=!1}else!I&&!process.env.COREPACK_ROOT&&(s.reportWarning(0,`You don't seem to have ${he.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${he.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),I=!0);if(I){let ee=await c();s.reportInfo(0,`Saving the new release in ${he.pretty(t,E,"magenta")}`),await ce.removePromise(J.dirname(h)),await ce.mkdirPromise(J.dirname(h),{recursive:!0}),await ce.writeFilePromise(h,ee,{mode:493}),await ze.updateConfiguration(f,{yarnPath:J.relative(f,h)})}else await ce.removePromise(J.dirname(h)),await ze.updateConfiguration(f,{yarnPath:ze.deleteProperty});let T=await Ut.tryFind(f)||new Ut;T.packageManager=`yarn@${C?e:await Xv(t,"stable")}`;let N={};T.exportTo(N);let U=J.join(f,Ut.fileName),W=`${JSON.stringify(N,null,T.indent)} `;return await ce.changeFilePromise(U,W,{automaticNewlines:!0}),{bundleVersion:e}}function hye(t){return Br[jx(t)]}var qlt=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function Wlt(t){let r=`https://repo.yarnpkg.com/${je.isTaggedYarnVersion(fn)?fn:await Xv(t,"canary")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,s=await ln.get(r,{configuration:t});return new Map(Array.from(s.toString().matchAll(qlt),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=hye(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var IC=class extends ft{constructor(){super(...arguments);this.code=ge.String({required:!1,validator:$2(wE(),[X2(/^YN[0-9]{4}$/)])});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["explain"]]}static{this.usage=ot.Usage({description:"explain an error code",details:` When the code argument is specified, this command prints its name and its details. When used without arguments, this command lists all error codes and their names. `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let s=hye(this.code),a=he.pretty(r,s,he.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),f=(await Wlt(r)).get(this.code),p=typeof f<"u"?he.jsonOrPretty(this.json,r,he.tuple(he.Type.MARKDOWN,{text:f,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. You can help us by editing this page on GitHub \u{1F642}: ${he.jsonOrPretty(this.json,r,he.tuple(he.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx"))} `;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:s,details:p})} `):this.context.stdout.write(`${n} ${p} `)}else{let s={children:je.mapAndFilter(Object.entries(Br),([a,n])=>Number.isNaN(Number(a))?je.mapAndFilter.skip:{label:Yf(Number(a)),value:he.tuple(he.Type.CODE,n)})};xs.emitTree(s,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ge();Dt();Yt();var gye=ut(Go()),CC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=ge.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=ge.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=ge.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=ge.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=ge.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=ge.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}static{this.paths=[["info"]]}static{this.usage=ot.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a&&!this.all)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=new Set(this.extra);this.cache&&c.add("cache"),this.dependents&&c.add("dependents"),this.manifest&&c.add("manifest");let f=(ie,{recursive:ue})=>{let le=ie.anchoredLocator.locatorHash,me=new Map,pe=[le];for(;pe.length>0;){let Be=pe.shift();if(me.has(Be))continue;let Ce=s.storedPackages.get(Be);if(typeof Ce>"u")throw new Error("Assertion failed: Expected the package to be registered");if(me.set(Be,Ce),G.isVirtualLocator(Ce)&&pe.push(G.devirtualizeLocator(Ce).locatorHash),!(!ue&&Be!==le))for(let g of Ce.dependencies.values()){let we=s.storedResolutions.get(g.descriptorHash);if(typeof we>"u")throw new Error("Assertion failed: Expected the resolution to be registered");pe.push(we)}}return me.values()},p=({recursive:ie})=>{let ue=new Map;for(let le of s.workspaces)for(let me of f(le,{recursive:ie}))ue.set(me.locatorHash,me);return ue.values()},h=({all:ie,recursive:ue})=>ie&&ue?s.storedPackages.values():ie?p({recursive:ue}):f(a,{recursive:ue}),E=({all:ie,recursive:ue})=>{let le=h({all:ie,recursive:ue}),me=this.patterns.map(Ce=>{let g=G.parseLocator(Ce),we=gye.default.makeRe(G.stringifyIdent(g)),ye=G.isVirtualLocator(g),Ae=ye?G.devirtualizeLocator(g):g;return se=>{let X=G.stringifyIdent(se);if(!we.test(X))return!1;if(g.reference==="unknown")return!0;let De=G.isVirtualLocator(se),Te=De?G.devirtualizeLocator(se):se;return!(ye&&De&&g.reference!==se.reference||Ae.reference!==Te.reference)}}),pe=je.sortMap([...le],Ce=>G.stringifyLocator(Ce));return{selection:pe.filter(Ce=>me.length===0||me.some(g=>g(Ce))),sortedLookup:pe}},{selection:C,sortedLookup:S}=E({all:this.all,recursive:this.recursive});if(C.length===0)throw new nt("No package matched your request");let b=new Map;if(this.dependents)for(let ie of S)for(let ue of ie.dependencies.values()){let le=s.storedResolutions.get(ue.descriptorHash);if(typeof le>"u")throw new Error("Assertion failed: Expected the resolution to be registered");je.getArrayWithDefault(b,le).push(ie)}let I=new Map;for(let ie of S){if(!G.isVirtualLocator(ie))continue;let ue=G.devirtualizeLocator(ie);je.getArrayWithDefault(I,ue.locatorHash).push(ie)}let T={},N={children:T},U=r.makeFetcher(),W={project:s,fetcher:U,cache:n,checksums:s.storedChecksums,report:new ki,cacheOptions:{skipIntegrityCheck:!0}},ee=[async(ie,ue,le)=>{if(!ue.has("manifest"))return;let me=await U.fetch(ie,W),pe;try{pe=await Ut.find(me.prefixPath,{baseFs:me.packageFs})}finally{me.releaseFs?.()}le("Manifest",{License:he.tuple(he.Type.NO_HINT,pe.license),Homepage:he.tuple(he.Type.URL,pe.raw.homepage??null)})},async(ie,ue,le)=>{if(!ue.has("cache"))return;let me=s.storedChecksums.get(ie.locatorHash)??null,pe=n.getLocatorPath(ie,me),Be;if(pe!==null)try{Be=await ce.statPromise(pe)}catch{}let Ce=typeof Be<"u"?[Be.size,he.Type.SIZE]:void 0;le("Cache",{Checksum:he.tuple(he.Type.NO_HINT,me),Path:he.tuple(he.Type.PATH,pe),Size:Ce})}];for(let ie of C){let ue=G.isVirtualLocator(ie);if(!this.virtuals&&ue)continue;let le={},me={value:[ie,he.Type.LOCATOR],children:le};if(T[G.stringifyLocator(ie)]=me,this.nameOnly){delete me.children;continue}let pe=I.get(ie.locatorHash);typeof pe<"u"&&(le.Instances={label:"Instances",value:he.tuple(he.Type.NUMBER,pe.length)}),le.Version={label:"Version",value:he.tuple(he.Type.NO_HINT,ie.version)};let Be=(g,we)=>{let ye={};if(le[g]=ye,Array.isArray(we))ye.children=we.map(Ae=>({value:Ae}));else{let Ae={};ye.children=Ae;for(let[se,X]of Object.entries(we))typeof X>"u"||(Ae[se]={label:se,value:X})}};if(!ue){for(let g of ee)await g(ie,c,Be);await r.triggerHook(g=>g.fetchPackageInfo,ie,c,Be)}ie.bin.size>0&&!ue&&Be("Exported Binaries",[...ie.bin.keys()].map(g=>he.tuple(he.Type.PATH,g)));let Ce=b.get(ie.locatorHash);typeof Ce<"u"&&Ce.length>0&&Be("Dependents",Ce.map(g=>he.tuple(he.Type.LOCATOR,g))),ie.dependencies.size>0&&!ue&&Be("Dependencies",[...ie.dependencies.values()].map(g=>{let we=s.storedResolutions.get(g.descriptorHash),ye=typeof we<"u"?s.storedPackages.get(we)??null:null;return he.tuple(he.Type.RESOLUTION,{descriptor:g,locator:ye})})),ie.peerDependencies.size>0&&ue&&Be("Peer dependencies",[...ie.peerDependencies.values()].map(g=>{let we=ie.dependencies.get(g.identHash),ye=typeof we<"u"?s.storedResolutions.get(we.descriptorHash)??null:null,Ae=ye!==null?s.storedPackages.get(ye)??null:null;return he.tuple(he.Type.RESOLUTION,{descriptor:g,locator:Ae})}))}xs.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ge();Dt();wc();var rF=ut(Fd());Yt();var Kq=ut(Ai());Ul();var Ylt=[{selector:t=>t===-1,name:"nodeLinker",value:"node-modules"},{selector:t=>t!==-1&&t<8,name:"enableGlobalCache",value:!1},{selector:t=>t!==-1&&t<8,name:"compressionLevel",value:"mixed"}],wC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=ge.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=ge.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=ge.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=ge.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=ge.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=ge.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:fo($l)});this.cacheFolder=ge.String("--cache-folder",{hidden:!0});this.frozenLockfile=ge.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=ge.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=ge.Boolean("--non-interactive",{hidden:!0});this.preferOffline=ge.Boolean("--prefer-offline",{hidden:!0});this.production=ge.Boolean("--production",{hidden:!0});this.registry=ge.String("--registry",{hidden:!0});this.silent=ge.Boolean("--silent",{hidden:!0});this.networkTimeout=ge.String("--network-timeout",{hidden:!0})}static{this.paths=[["install"],ot.Default]}static{this.usage=ot.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your `.pnp.cjs` file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let s=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await SI({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!rF.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!rF.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!s},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!rF.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new nt(`${he.pretty(r,"--immutable",he.Type.CODE)} and ${he.pretty(r,"--immutable-cache",he.Type.CODE)} cannot be used with ${he.pretty(r,"--mode=update-lockfile",he.Type.CODE)}`);let c=(this.immutable??r.get("enableImmutableInstalls"))&&!n,f=this.immutableCache&&!n;if(r.projectCwd!==null){let T=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await Klt(r,c)&&(N.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await Jlt(r,c)&&(N.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&N.reportSeparator()});if(T.hasErrors())return T.exitCode()}if(r.projectCwd!==null){let T=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(ze.telemetry?.isNew)ze.telemetry.commitTips(),N.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),N.reportInfo(65,`Run ${he.pretty(r,"yarn config set --home enableTelemetry 0",he.Type.CODE)} to disable`),N.reportSeparator();else if(ze.telemetry?.shouldShowTips){let U=await ln.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let W=null;if(fn!==null){let ie=Kq.default.prerelease(fn)?"canary":"stable",ue=U.latest[ie];Kq.default.gt(ue,fn)&&(W=[ie,ue])}if(W)ze.telemetry.commitTips(),N.reportInfo(88,`${he.applyStyle(r,`A new ${W[0]} version of Yarn is available:`,he.Style.BOLD)} ${G.prettyReference(r,W[1])}!`),N.reportInfo(88,`Upgrade now by running ${he.pretty(r,`yarn set version ${W[1]}`,he.Type.CODE)}`),N.reportSeparator();else{let ee=ze.telemetry.selectTip(U.tips);ee&&(N.reportInfo(89,he.pretty(r,ee.message,he.Type.MARKDOWN_INLINE)),ee.url&&N.reportInfo(89,`Learn more at ${ee.url}`),N.reportSeparator())}}}});if(T.hasErrors())return T.exitCode()}let{project:p,workspace:h}=await Rt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let T=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let W of Ylt)W.selector(E)&&typeof r.sources.get(W.name)>"u"&&(r.use("",{[W.name]:W.value},p.cwd,{overwrite:!0}),U[W.name]=W.value);Object.keys(U).length>0&&(await ze.updateConfiguration(p.cwd,U),N.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),N.reportSeparator())});if(T.hasErrors())return T.exitCode()}let C=await Kr.find(r,{immutable:f,check:this.checkCache});if(!h)throw new ar(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let S=r.get("enableHardenedMode");S&&typeof r.sources.get("enableHardenedMode")>"u"&&await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async T=>{T.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),T.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${he.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),T.reportSeparator()}),(this.refreshLockfile??S)&&(p.lockfileNeedsRefresh=!0);let b=this.checkResolutions??S;return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async T=>{await p.install({cache:C,report:T,immutable:c,checkResolutions:b,mode:this.mode})})).exitCode()}},Vlt="<<<<<<<";async function Jlt(t,e){if(!t.projectCwd)return!1;let r=J.join(t.projectCwd,Er.lockfile);if(!await ce.existsPromise(r)||!(await ce.readFilePromise(r,"utf8")).includes(Vlt))return!1;if(e)throw new jt(47,"Cannot autofix a lockfile when running an immutable install");let a=await qr.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await qr.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await qr.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new jt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async f=>{let p=await qr.execvp("git",["show",`${f}:./${Er.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new jt(83,`Git returned an error when trying to access the lockfile content in ${f}`);try{return as(p.stdout)}catch{throw new jt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(f=>!!f.__metadata);for(let f of n){if(f.__metadata.version<7)for(let p of Object.keys(f)){if(p==="__metadata")continue;let h=G.parseDescriptor(p,!0),E=t.normalizeDependency(h),C=G.stringifyDescriptor(E);C!==p&&(f[C]=f[p],delete f[p])}for(let p of Object.keys(f)){if(p==="__metadata")continue;let h=f[p].checksum;typeof h>"u"||h.includes("/")||(f[p].checksum=`${f.__metadata.cacheKey}/${h}`)}}let c=Object.assign({},...n);c.__metadata.version=`${Math.min(...n.map(f=>parseInt(f.__metadata.version??0)))}`,c.__metadata.cacheKey="merged";for(let[f,p]of Object.entries(c))typeof p=="string"&&delete c[f];return await ce.changeFilePromise(r,nl(c),{automaticNewlines:!0}),!0}async function Klt(t,e){if(!t.projectCwd)return!1;let r=[],s=J.join(t.projectCwd,".yarn/plugins/@yarnpkg");return await ze.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let c=n.filter(f=>{if(!f.path)return!0;let p=J.resolve(t.projectCwd,f.path),h=ov.has(f.spec)&&J.contains(s,p);return h&&r.push(p),!h});return c.length===0?ze.deleteProperty:c.length===n.length?n:c}},{immutable:e})?(await Promise.all(r.map(async n=>{await ce.removePromise(n)})),!0):!1}Ge();Dt();Yt();var BC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=ge.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=ge.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=ge.Rest()}static{this.paths=[["link"]]}static{this.usage=ot.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=s.topLevelWorkspace,f=[];for(let p of this.destinations){let h=J.resolve(this.context.cwd,fe.toPortablePath(p)),E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Rt.find(E,h);if(s.cwd===C.cwd)throw new nt(`Invalid destination '${p}'; Can't link the project to itself`);if(!S)throw new ar(C.cwd,h);if(this.all){let b=!1;for(let I of C.workspaces)I.manifest.name&&(!I.manifest.private||this.private)&&(f.push(I),b=!0);if(!b)throw new nt(`No workspace found to be linked in the target project: ${p}`)}else{if(!S.manifest.name)throw new nt(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(S.manifest.private&&!this.private)throw new nt(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);f.push(S)}}for(let p of f){let h=G.stringifyIdent(p.anchoredLocator),E=this.relative?J.relative(s.cwd,p.cwd):p.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Yt();var vC=class extends ft{constructor(){super(...arguments);this.args=ge.Proxy()}static{this.paths=[["node"]]}static{this.usage=ot.Usage({description:"run node with the hook already setup",details:` This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. `,examples:[["Run a Node script","$0 node ./my-script.js"]]})}async execute(){return this.cli.run(["exec","node",...this.args])}};Ge();Yt();var SC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","check"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` Check only the plugins from https. If this command detects any plugin differences in the CI environment, it will throw an error. `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=await ze.findRcFiles(this.context.cwd);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let c of s)if(c.data?.plugins)for(let f of c.data.plugins){if(!f.checksum||!f.spec.match(/^https?:/))continue;let p=await ln.get(f.spec,{configuration:r}),h=Nn.makeHash(p);if(f.checksum===h)continue;let E=he.pretty(r,f.path,he.Type.PATH),C=he.pretty(r,f.spec,he.Type.URL),S=`${E} is different from the file provided by ${C}`;n.reportJson({...f,newChecksum:h}),n.reportError(0,S)}})).exitCode()}};Ge();Ge();Dt();Yt();var Iye=Ie("os");Ge();Dt();Yt();var dye=Ie("os");Ge();wc();Yt();var zlt="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Sm(t,e){let r=await ln.get(zlt,{configuration:t}),s=as(r.toString());return Object.fromEntries(Object.entries(s).filter(([a,n])=>!e||Fr.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var DC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","list"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Sm(r,fn);for(let[c,{experimental:f,...p}]of Object.entries(n)){let h=c;f&&(h+=" [experimental]"),a.reportJson({name:c,experimental:f,...p}),a.reportInfo(null,h)}})).exitCode()}};var Zlt=/^[0-9]+$/,Xlt=process.platform==="win32";function mye(t){return Zlt.test(t)?`pull/${t}/head`:t}var $lt=({repository:t,branch:e},r)=>[["git","init",fe.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",mye(e)],["git","reset","--hard","FETCH_HEAD"]],ect=({branch:t})=>[["git","fetch","origin","--depth=1",mye(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],tct=({plugins:t,noMinify:e},r,s)=>[["yarn","build:cli",...new Array().concat(...t.map(a=>["--plugin",J.resolve(s,a)])),...e?["--no-minify"]:[],"|"],[Xlt?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",fe.fromPortablePath(r),"|"]],PC=class extends ft{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=ge.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=ge.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}static{this.paths=[["set","version","from","sources"]]}static{this.usage=ot.Usage({description:"build Yarn from master",details:` This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. `,examples:[["Build Yarn from master","$0 set version from sources"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd),a=typeof this.installPath<"u"?J.resolve(this.context.cwd,fe.toPortablePath(this.installPath)):J.resolve(fe.toPortablePath((0,dye.tmpdir)()),"yarnpkg-sources",Nn.makeHash(this.repository).slice(0,6));return(await Ot.start({configuration:r,stdout:this.context.stdout},async c=>{await zq(this,{configuration:r,report:c,target:a}),c.reportSeparator(),c.reportInfo(0,"Building a fresh bundle"),c.reportSeparator();let f=await qr.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=J.join(a,`packages/yarnpkg-cli/bundles/yarn-${f.stdout.trim()}.js`);ce.existsSync(p)||(await $v(tct(this,p,a),{configuration:r,context:this.context,target:a}),c.reportSeparator());let h=await ce.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await Jq(r,null,async()=>h,{report:c});this.skipPlugins||await rct(this,E,{project:s,report:c,target:a})}})).exitCode()}};async function $v(t,{configuration:e,context:r,target:s}){for(let[a,...n]of t){let c=n[n.length-1]==="|";if(c&&n.pop(),c)await qr.pipevp(a,n,{cwd:s,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${he.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} `);try{await qr.execvp(a,n,{cwd:s,strict:!0})}catch(f){throw r.stdout.write(f.stdout||f.stack),f}}}}async function zq(t,{configuration:e,report:r,target:s}){let a=!1;if(!t.force&&ce.existsSync(J.join(s,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await $v(ect(t),{configuration:e,context:t.context,target:s}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await ce.removePromise(s),await ce.mkdirPromise(s,{recursive:!0}),await $v($lt(t,s),{configuration:e,context:t.context,target:s}))}async function rct(t,e,{project:r,report:s,target:a}){let n=await Sm(r.configuration,e),c=new Set(Object.keys(n));for(let f of r.configuration.plugins.keys())c.has(f)&&await Zq(f,t,{project:r,report:s,target:a})}Ge();Ge();Dt();Yt();var yye=ut(Ai()),Eye=Ie("vm");var bC=class extends ft{constructor(){super(...arguments);this.name=ge.String();this.checksum=ge.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}static{this.paths=[["plugin","import"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"download a plugin",details:` This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. Three types of plugin references are accepted: - If the plugin is stored within the Yarn repository, it can be referenced by name. - Third-party plugins can be referenced directly through their public urls. - Local plugins can be referenced by their path on the disk. If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await Rt.find(r,this.context.cwd),c,f;if(this.name.match(/^\.{0,2}[\\/]/)||fe.isAbsolute(this.name)){let p=J.resolve(this.context.cwd,fe.toPortablePath(this.name));a.reportInfo(0,`Reading ${he.pretty(r,p,he.Type.PATH)}`),c=J.relative(n.cwd,p),f=await ce.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new jt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}c=this.name,p=this.name}else{let h=G.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!yye.default.valid(h.reference))throw new jt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=G.stringifyIdent(h),C=await Sm(r,fn);if(!Object.hasOwn(C,E)){let S=`Couldn't find a plugin named ${G.prettyIdent(r,h)} on the remote registry. `;throw r.plugins.has(E)?S+=`A plugin named ${G.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:S+=`Note that only the plugins referenced on our website (${he.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",he.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${he.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",he.Type.URL)}).`,new jt(51,S)}c=E,p=C[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):fn!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${fn}/`))}a.reportInfo(0,`Downloading ${he.pretty(r,p,"green")}`),f=await ln.get(p,{configuration:r})}await Xq(c,f,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function Xq(t,e,{checksum:r=!0,project:s,report:a}){let{configuration:n}=s,c={},f={exports:c};(0,Eye.runInNewContext)(e.toString(),{module:f,exports:c});let h=`.yarn/plugins/${f.exports.name}.cjs`,E=J.resolve(s.cwd,h);a.reportInfo(0,`Saving the new plugin in ${he.pretty(n,h,"magenta")}`),await ce.mkdirPromise(J.dirname(E),{recursive:!0}),await ce.writeFilePromise(E,e);let C={path:h,spec:t};r&&(C.checksum=Nn.makeHash(e)),await ze.addPlugin(s.cwd,[C])}var nct=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],xC=class extends ft{constructor(){super(...arguments);this.installPath=ge.String("--path",{description:"The path where the repository should be cloned to"});this.repository=ge.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=ge.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=ge.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=ge.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=ge.String()}static{this.paths=[["plugin","import","from","sources"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. The plugins can be referenced by their short name if sourced from the official Yarn repository. `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=typeof this.installPath<"u"?J.resolve(this.context.cwd,fe.toPortablePath(this.installPath)):J.resolve(fe.toPortablePath((0,Iye.tmpdir)()),"yarnpkg-sources",Nn.makeHash(this.repository).slice(0,6));return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:c}=await Rt.find(r,this.context.cwd),f=G.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=G.stringifyIdent(f),h=await Sm(r,fn);if(!Object.hasOwn(h,p))throw new jt(51,`Couldn't find a plugin named "${p}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await zq(this,{configuration:r,report:n,target:s}),await Zq(E,this,{project:c,report:n,target:s})})).exitCode()}};async function Zq(t,{context:e,noMinify:r},{project:s,report:a,target:n}){let c=t.replace(/@yarnpkg\//,""),{configuration:f}=s;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${c}`),a.reportSeparator(),await $v(nct({pluginName:c,noMinify:r},n),{configuration:f,context:e,target:n}),a.reportSeparator();let p=J.resolve(n,`packages/${c}/bundles/${t}.js`),h=await ce.readFilePromise(p);await Xq(t,h,{project:s,report:a})}Ge();Dt();Yt();var kC=class extends ft{constructor(){super(...arguments);this.name=ge.String()}static{this.paths=[["plugin","remove"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd);return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let c=this.name,f=G.parseIdent(c);if(!r.plugins.has(c))throw new nt(`${G.prettyIdent(r,f)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${c}.cjs`,h=J.resolve(s.cwd,p);ce.existsSync(h)&&(n.reportInfo(0,`Removing ${he.pretty(r,p,he.Type.PATH)}...`),await ce.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await ze.updateConfiguration(s.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let C=E.filter(S=>S.path!==p);return C.length===0?ze.deleteProperty:C.length===E.length?E:C}})})).exitCode()}};Ge();Yt();var QC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","runtime"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. `,examples:[["List the currently active plugins","$0 plugin runtime"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let c=this.context.plugins.plugins.has(n),f=n;c&&(f+=" [builtin]"),a.reportJson({name:n,builtin:c}),a.reportInfo(null,`${f}`)}})).exitCode()}};Ge();Ge();Yt();var RC=class extends ft{constructor(){super(...arguments);this.idents=ge.Rest()}static{this.paths=[["rebuild"]]}static{this.usage=ot.Usage({description:"rebuild the project's native packages",details:` This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=new Set;for(let f of this.idents)c.add(G.parseIdent(f).identHash);if(await s.restoreInstallState({restoreResolutions:!1}),await s.resolveEverything({cache:n,report:new ki}),c.size>0)for(let f of s.storedPackages.values())c.has(f.identHash)&&(s.storedBuildState.delete(f.locatorHash),s.skippedBuilds.delete(f.locatorHash));else s.storedBuildState.clear(),s.skippedBuilds.clear();return await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();Yt();var $q=ut(Go());Ul();var TC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[["remove"]]}static{this.usage=ot.Usage({description:"remove dependencies from the project",details:` This command will remove the packages matching the specified patterns from the current workspace. If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.all?s.workspaces:[a],f=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let I of this.patterns){let T=!1,N=G.parseIdent(I);for(let U of c){let W=[...U.manifest.peerDependenciesMeta.keys()];for(let ee of(0,$q.default)(W,I))U.manifest.peerDependenciesMeta.delete(ee),h=!0,T=!0;for(let ee of f){let ie=U.manifest.getForScope(ee),ue=[...ie.values()].map(le=>G.stringifyIdent(le));for(let le of(0,$q.default)(ue,G.stringifyIdent(N))){let{identHash:me}=G.parseIdent(le),pe=ie.get(me);if(typeof pe>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[ee].delete(me),E.push([U,ee,pe]),h=!0,T=!0}}}T||p.push(I)}let C=p.length>1?"Patterns":"Pattern",S=p.length>1?"don't":"doesn't",b=this.all?"any":"this";if(p.length>0)throw new nt(`${C} ${he.prettyList(r,p,he.Type.CODE)} ${S} match any packages referenced by ${b} workspace`);return h?(await r.triggerMultipleHooks(I=>I.afterWorkspaceDependencyRemoval,E),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ge();Ge();Yt();var Cye=Ie("util"),FC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["run"]]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return(await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async c=>{let f=a.manifest.scripts,p=je.sortMap(f.keys(),C=>C),h={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},E=p.reduce((C,S)=>Math.max(C,S.length),0);for(let[C,S]of f.entries())c.reportInfo(null,`${C.padEnd(E," ")} ${(0,Cye.inspect)(S,h)}`),c.reportJson({name:C,script:S})})).exitCode()}};Ge();Ge();Yt();var NC=class extends ft{constructor(){super(...arguments);this.inspect=ge.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=ge.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=ge.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=ge.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=ge.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=ge.Boolean("--silent",{hidden:!0});this.scriptName=ge.String();this.args=ge.Proxy()}static{this.paths=[["run"]]}static{this.usage=ot.Usage({description:"run a script defined in the package.json",details:` This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a,locator:n}=await Rt.find(r,this.context.cwd);await s.restoreInstallState();let c=this.topLevel?s.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await In.hasPackageScript(c,this.scriptName,{project:s}))return await In.executePackageScript(c,this.scriptName,this.args,{project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let f=await In.getPackageAccessibleBinaries(c,{project:s});if(f.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await In.executePackageAccessibleBinary(c,this.scriptName,this.args,{cwd:this.context.cwd,project:s,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:f})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(s.workspaces.map(async C=>C.manifest.scripts.has(this.scriptName)?C:null))).filter(C=>C!==null);if(E.length===1)return await In.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new nt(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new nt(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new nt("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,C]of $I)for(let S of C)if(h.length>=S.length&&JSON.stringify(h.slice(0,S.length))===JSON.stringify(S))throw new nt(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new nt(`Couldn't find a script named "${this.scriptName}".`)}}};Ge();Ge();Yt();var OC=class extends ft{constructor(){super(...arguments);this.descriptor=ge.String();this.resolution=ge.String()}static{this.paths=[["set","resolution"]]}static{this.usage=ot.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 npm:1.5.0"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(await s.restoreInstallState({restoreResolutions:!1}),!a)throw new ar(s.cwd,this.context.cwd);let c=G.parseDescriptor(this.descriptor,!0),f=G.makeDescriptor(c,this.resolution);return s.storedDescriptors.set(c.descriptorHash,c),s.storedDescriptors.set(f.descriptorHash,f),s.resolutionAliases.set(c.descriptorHash,f.descriptorHash),await s.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ge();Dt();Yt();var wye=ut(Go()),LC=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=ge.Rest()}static{this.paths=[["unlink"]]}static{this.usage=ot.Usage({description:"disconnect the local project from another one",details:` This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);let c=s.topLevelWorkspace,f=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of c.manifest.resolutions)h.startsWith("portal:")&&f.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=J.resolve(this.context.cwd,fe.toPortablePath(p));if(je.isPathLike(p)){let E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:C,workspace:S}=await Rt.find(E,h);if(!S)throw new ar(C.cwd,h);if(this.all){for(let b of C.workspaces)b.manifest.name&&f.add(G.stringifyIdent(b.anchoredLocator));if(f.size===0)throw new nt("No workspace found to be unlinked in the target project")}else{if(!S.manifest.name)throw new nt("The target workspace doesn't have a name and thus cannot be unlinked");f.add(G.stringifyIdent(S.anchoredLocator))}}else{let E=[...c.manifest.resolutions.map(({pattern:C})=>C.descriptor.fullName)];for(let C of(0,wye.default)(E,p))f.add(C)}}return c.manifest.resolutions=c.manifest.resolutions.filter(({pattern:p})=>!f.has(p.descriptor.fullName)),await s.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();Yt();var Bye=ut(Vv()),e5=ut(Go());Ul();var MC=class extends ft{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=ge.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=ge.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=ge.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=ge.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=ge.String("--mode",{description:"Change what artifacts installs generate",validator:fo($l)});this.patterns=ge.Rest()}static{this.paths=[["up"]]}static{this.usage=ot.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]})}static{this.schema=[tB("recursive",qf.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=[...s.storedDescriptors.values()],f=c.map(E=>G.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(G.parseDescriptor(E).range!=="unknown")throw new nt("Ranges aren't allowed when using --recursive");for(let C of(0,e5.default)(f,E)){let S=G.parseIdent(C);p.add(S.identHash)}}let h=c.filter(E=>p.has(E.identHash));for(let E of h)s.storedDescriptors.delete(E.descriptorHash),s.storedResolutions.delete(E.descriptorHash);return await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=this.fixed,f=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=Kv(this,s),h=f?["keep","reuse","project","latest"]:["project","latest"],E=[],C=[];for(let N of this.patterns){let U=!1,W=G.parseDescriptor(N),ee=G.stringifyIdent(W);for(let ie of s.workspaces)for(let ue of["dependencies","devDependencies"]){let me=[...ie.manifest.getForScope(ue).values()].map(Be=>G.stringifyIdent(Be)),pe=ee==="*"?me:(0,e5.default)(me,ee);for(let Be of pe){let Ce=G.parseIdent(Be),g=ie.manifest[ue].get(Ce.identHash);if(typeof g>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let we=G.makeDescriptor(Ce,W.range);E.push(Promise.resolve().then(async()=>[ie,ue,g,await zv(we,{project:s,workspace:ie,cache:n,target:ue,fixed:c,modifier:p,strategies:h})])),U=!0}}U||C.push(N)}if(C.length>1)throw new nt(`Patterns ${he.prettyList(r,C,he.Type.CODE)} don't match any packages referenced by any workspace`);if(C.length>0)throw new nt(`Pattern ${he.prettyList(r,C,he.Type.CODE)} doesn't match any packages referenced by any workspace`);let S=await Promise.all(E),b=await lA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:W,rejections:ee}]of S){let ie=W.filter(ue=>ue.descriptor!==null);if(ie.length===0){let[ue]=ee;if(typeof ue>"u")throw new Error("Assertion failed: Expected an error to have been set");let le=this.cli.error(ue);s.configuration.get("enableNetwork")?N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range ${le}`):N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) ${le}`)}else ie.length>1&&!f&&N.reportError(27,`${G.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(b.hasErrors())return b.exitCode();let I=!1,T=[];for(let[N,U,,{suggestions:W}]of S){let ee,ie=W.filter(pe=>pe.descriptor!==null),ue=ie[0].descriptor,le=ie.every(pe=>G.areDescriptorsEqual(pe.descriptor,ue));ie.length===1||le?ee=ue:(I=!0,{answer:ee}=await(0,Bye.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${G.prettyWorkspace(r,N)} \u276F ${U}?`,choices:W.map(({descriptor:pe,name:Be,reason:Ce})=>pe?{name:Be,hint:Ce,descriptor:pe}:{name:Be,hint:Ce,disabled:!0}),onCancel:()=>process.exit(130),result(pe){return this.find(pe,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let me=N.manifest[U].get(ee.identHash);if(typeof me>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(me.descriptorHash!==ee.descriptorHash)N.manifest[U].set(ee.identHash,ee),T.push([N,U,me,ee]);else{let pe=r.makeResolver(),Be={project:s,resolver:pe},Ce=r.normalizeDependency(me),g=pe.bindDescriptor(Ce,N.anchoredLocator,Be);s.forgetResolution(g)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,T),I&&this.context.stdout.write(` `),await s.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ge();Ge();Ge();Yt();var UC=class extends ft{constructor(){super(...arguments);this.recursive=ge.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=ge.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=ge.String()}static{this.paths=[["why"]]}static{this.usage=ot.Usage({description:"display the reason why a package is needed",details:` This command prints the exact reasons why a package appears in the dependency tree. If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=G.parseIdent(this.package).identHash,c=this.recursive?sct(s,n,{configuration:r,peers:this.peers}):ict(s,n,{configuration:r,peers:this.peers});xs.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function ict(t,e,{configuration:r,peers:s}){let a=je.sortMap(t.storedPackages.values(),f=>G.stringifyLocator(f)),n={},c={children:n};for(let f of a){let p={};for(let E of f.dependencies.values()){if(!s&&f.peerDependencies.has(E.identHash))continue;let C=t.storedResolutions.get(E.descriptorHash);if(!C)throw new Error("Assertion failed: The resolution should have been registered");let S=t.storedPackages.get(C);if(!S)throw new Error("Assertion failed: The package should have been registered");if(S.identHash!==e)continue;{let I=G.stringifyLocator(f);n[I]={value:[f,he.Type.LOCATOR],children:p}}let b=G.stringifyLocator(S);p[b]={value:[{descriptor:E,locator:S},he.Type.DEPENDENT]}}}return c}function sct(t,e,{configuration:r,peers:s}){let a=je.sortMap(t.workspaces,S=>G.stringifyLocator(S.anchoredLocator)),n=new Set,c=new Set,f=S=>{if(n.has(S.locatorHash))return c.has(S.locatorHash);if(n.add(S.locatorHash),S.identHash===e)return c.add(S.locatorHash),!0;let b=!1;S.identHash===e&&(b=!0);for(let I of S.dependencies.values()){if(!s&&S.peerDependencies.has(I.identHash))continue;let T=t.storedResolutions.get(I.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let N=t.storedPackages.get(T);if(!N)throw new Error("Assertion failed: The package should have been registered");f(N)&&(b=!0)}return b&&c.add(S.locatorHash),b};for(let S of a)f(S.anchoredPackage);let p=new Set,h={},E={children:h},C=(S,b,I)=>{if(!c.has(S.locatorHash))return;let T=I!==null?he.tuple(he.Type.DEPENDENT,{locator:S,descriptor:I}):he.tuple(he.Type.LOCATOR,S),N={},U={value:T,children:N},W=G.stringifyLocator(S);if(b[W]=U,!(I!==null&&t.tryWorkspaceByLocator(S))&&!p.has(S.locatorHash)){p.add(S.locatorHash);for(let ee of S.dependencies.values()){if(!s&&S.peerDependencies.has(ee.identHash))continue;let ie=t.storedResolutions.get(ee.descriptorHash);if(!ie)throw new Error("Assertion failed: The resolution should have been registered");let ue=t.storedPackages.get(ie);if(!ue)throw new Error("Assertion failed: The package should have been registered");C(ue,N,ee)}}};for(let S of a)C(S.anchoredPackage,h,null);return E}Ge();var u5={};Vt(u5,{GitFetcher:()=>tS,GitResolver:()=>rS,default:()=>Dct,gitUtils:()=>ka});Ge();Dt();var ka={};Vt(ka,{TreeishProtocols:()=>eS,clone:()=>c5,fetchBase:()=>qye,fetchChangedFiles:()=>Wye,fetchChangedWorkspaces:()=>vct,fetchRoot:()=>Gye,isGitUrl:()=>jC,lsRemote:()=>jye,normalizeLocator:()=>Bct,normalizeRepoUrl:()=>_C,resolveUrl:()=>l5,splitRepoUrl:()=>W0,validateRepoUrl:()=>a5});Ge();Dt();Yt();ql();var _ye=ut(Lye()),HC=ut(Ie("querystring")),s5=ut(Ai());function i5(t,e,r){let s=t.indexOf(r);return t.lastIndexOf(e,s>-1?s:1/0)}function Mye(t){try{return new URL(t)}catch{return}}function Cct(t){let e=i5(t,"@","#"),r=i5(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),i5(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Uye(t){return Mye(t)||Mye(Cct(t))}function _C(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Uye(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function Hye(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var wct=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],eS=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(eS||{});function jC(t){return t?wct.some(e=>!!t.match(e)):!1}function W0(t){t=_C(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),s=t.slice(e+1);if(s.match(/^[a-z]+=/)){let a=HC.default.parse(s);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(eS).find(p=>Object.hasOwn(a,p)),[c,f]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(eS))delete a[p];return{repo:r,treeish:{protocol:c,request:f},extra:a}}else{let a=s.indexOf(":"),[n,c]=a===-1?[null,s]:[s.slice(0,a),s.slice(a+1)];return{repo:r,treeish:{protocol:n,request:c},extra:{}}}}function Bct(t){return G.makeLocator(t,_C(t.reference))}function a5(t,{configuration:e}){let r=_C(t,{git:!0});if(!ln.getNetworkSettings(`https://${(0,_ye.default)(r).resource}`,{configuration:e}).enableNetwork)throw new jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function jye(t,e){let r=a5(t,{configuration:e}),s=await o5("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:Hye()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,c;for(;(c=n.exec(s.stdout))!==null;)a.set(c[2],c[1]);return a}async function l5(t,e){let{repo:r,treeish:{protocol:s,request:a},extra:n}=W0(t),c=await jye(r,e),f=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return HC.default.stringify({...n,commit:E})}case"head":{let C=c.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof C>"u")throw new Error(`Unknown head ("${E}")`);return HC.default.stringify({...n,commit:C})}case"tag":{let C=c.get(`refs/tags/${E}`);if(typeof C>"u")throw new Error(`Unknown tag ("${E}")`);return HC.default.stringify({...n,commit:C})}case"semver":{let C=Fr.validRange(E);if(!C)throw new Error(`Invalid range ("${E}")`);let S=new Map([...c.entries()].filter(([I])=>I.startsWith("refs/tags/")).map(([I,T])=>[s5.default.parse(I.slice(10)),T]).filter(I=>I[0]!==null)),b=s5.default.maxSatisfying([...S.keys()],C);if(b===null)throw new Error(`No matching range ("${E}")`);return HC.default.stringify({...n,commit:S.get(b)})}case null:{let C;if((C=p("commit",E))!==null||(C=p("tag",E))!==null||(C=p("head",E))!==null)return C;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return f(h,E)}catch{return null}};return _C(`${r}#${f(s,a)}`)}async function c5(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:s,request:a}}=W0(t);if(s!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=a5(r,{configuration:e}),c=await ce.mktempPromise(),f={cwd:c,env:Hye()};return await o5("cloning the repository",["clone","-c core.autocrlf=false",n,fe.fromPortablePath(c)],f,{configuration:e,normalizedRepoUrl:n}),await o5("switching branch",["checkout",`${a}`],f,{configuration:e,normalizedRepoUrl:n}),c})}async function Gye(t){let e,r=t;do{if(e=r,await ce.existsPromise(J.join(e,".git")))return e;r=J.dirname(e)}while(r!==e);return null}async function qye(t,{baseRefs:e}){if(e.length===0)throw new nt("Can't run this command with zero base refs specified.");let r=[];for(let f of e){let{code:p}=await qr.execvp("git",["merge-base",f,"HEAD"],{cwd:t});p===0&&r.push(f)}if(r.length===0)throw new nt(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:s}=await qr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=s.trim(),{stdout:n}=await qr.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),c=n.trim();return{hash:a,title:c}}async function Wye(t,{base:e,project:r}){let s=je.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await qr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>J.resolve(t,fe.toPortablePath(h))),{stdout:c}=await qr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),f=c.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>J.resolve(t,fe.toPortablePath(h))),p=[...new Set([...n,...f].sort())];return s?p.filter(h=>!J.relative(r.cwd,h).match(s)):p}async function vct({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new nt("This command can only be run from within a Yarn project");let r=[J.resolve(e.cwd,Er.lockfile),J.resolve(e.cwd,e.configuration.get("cacheFolder")),J.resolve(e.cwd,e.configuration.get("installStatePath")),J.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(c=>c.populateYarnPaths,e,c=>{c!=null&&r.push(c)});let s=await Gye(e.configuration.projectCwd);if(s==null)throw new nt("This command can only be run on Git repositories");let a=await qye(s,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await Wye(s,{base:a.hash,project:e});return new Set(je.mapAndFilter(n,c=>{let f=e.tryWorkspaceByFilePath(c);return f===null?je.mapAndFilter.skip:r.some(p=>c.startsWith(p))?je.mapAndFilter.skip:f}))}async function o5(t,e,r,{configuration:s,normalizedRepoUrl:a}){try{return await qr.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof qr.ExecError))throw n;let c=n.reportExtra,f=n.stderr.toString();throw new jt(1,`Failed ${t}`,p=>{p.reportError(1,` ${he.prettyField(s,{label:"Repository URL",value:he.tuple(he.Type.URL,a)})}`);for(let h of f.matchAll(/^(.+?): (.*)$/gm)){let[,E,C]=h;E=E.toLowerCase();let S=E==="error"?"Error":`${PB(E)} Error`;p.reportError(1,` ${he.prettyField(s,{label:S,value:he.tuple(he.Type.NO_HINT,C)})}`)}c?.(p)})}}var tS=class{supports(e,r){return jC(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,s);let n={...r,checksums:a},c=await this.downloadHosted(e,n);if(c!==null)return c;let[f,p,h]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:f,releaseFs:p,prefixPath:G.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(s=>s.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let s=W0(e.reference),a=await c5(e.reference,r.project.configuration),n=J.resolve(a,s.extra.cwd??vt.dot),c=J.join(n,"package.tgz");await In.prepareExternalProject(n,c,{configuration:r.project.configuration,report:r.report,workspace:s.extra.workspace,locator:e});let f=await ce.readFilePromise(c);return await je.releaseAfterUseAsync(async()=>await ps.convertToZip(f,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1}))}};Ge();Ge();var rS=class{supportsDescriptor(e,r){return jC(e.range)}supportsLocator(e,r){return jC(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=await l5(e.range,s.project.configuration);return[G.makeLocator(e,a)]}async getSatisfying(e,r,s,a){let n=W0(e.range);return{locators:s.filter(f=>{if(f.identHash!==e.identHash)return!1;let p=W0(f.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Sct={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[tS],resolvers:[rS]};var Dct=Sct;Yt();var GC=class extends ft{constructor(){super(...arguments);this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=ge.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=ge.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["workspaces","list"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd);return(await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let c=this.since?await ka.fetchChangedWorkspaces({ref:this.since,project:s}):s.workspaces,f=new Set(c);if(this.recursive)for(let p of[...c].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)f.add(h);for(let p of f){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let C=new Set,S=new Set;for(let b of Ut.hardDependencies)for(let[I,T]of h.getForScope(b)){let N=s.tryWorkspaceByDescriptor(T);N===null?s.workspacesByIdent.has(I)&&S.add(T):C.add(N)}E={workspaceDependencies:Array.from(C).map(b=>b.relativeCwd),mismatchedWorkspaceDependencies:Array.from(S).map(b=>G.stringifyDescriptor(b))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?G.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ge();Ge();Yt();var qC=class extends ft{constructor(){super(...arguments);this.workspaceName=ge.String();this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[["workspace"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` This command will run a given sub-command on a single workspace. `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=s.workspaces,c=new Map(n.map(p=>[G.stringifyIdent(p.anchoredLocator),p])),f=c.get(this.workspaceName);if(f===void 0){let p=Array.from(c.keys()).sort();throw new nt(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - ${p.join(` - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:f.cwd})}};var Pct={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:Yye.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[aC,lC,cC,uC,OC,PC,EC,GC,pC,hC,gC,dC,sC,oC,fC,AC,mC,yC,IC,CC,wC,BC,LC,vC,SC,xC,bC,kC,DC,QC,RC,TC,FC,NC,MC,UC,qC]},bct=Pct;var d5={};Vt(d5,{default:()=>kct});Ge();var Qt={optional:!0},A5=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Qt,zenObservable:Qt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":Qt}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":Qt,"postcss-jsx":Qt,"postcss-less":Qt,"postcss-markdown":Qt,"postcss-scss":Qt}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Qt}}],["snowpack@>=3.3.0",{dependencies:{"node-gyp":"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Qt}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Qt,"vue-template-compiler":Qt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Qt,"utf-8-validate":Qt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{"babel-polyfill":"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{"cross-spawn":"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{"prop-types":"^15.7.2"}}],["@rebass/forms@*",{dependencies:{"@styled-system/should-forward-prop":"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Qt,"vuetify-loader":Qt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Qt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Qt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Qt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:Qt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Qt,tinyliquid:Qt,"liquid-node":Qt,jade:Qt,"then-jade":Qt,dust:Qt,"dustjs-helpers":Qt,"dustjs-linkedin":Qt,swig:Qt,"swig-templates":Qt,"razor-tmpl":Qt,atpl:Qt,liquor:Qt,twig:Qt,ejs:Qt,eco:Qt,jazz:Qt,jqtpl:Qt,hamljs:Qt,hamlet:Qt,whiskers:Qt,"haml-coffee":Qt,"hogan.js":Qt,templayed:Qt,handlebars:Qt,underscore:Qt,lodash:Qt,pug:Qt,"then-pug":Qt,qejs:Qt,walrus:Qt,mustache:Qt,just:Qt,ect:Qt,mote:Qt,toffee:Qt,dot:Qt,"bracket-template":Qt,ractive:Qt,nunjucks:Qt,htmling:Qt,"babel-core":Qt,plates:Qt,"react-dom":Qt,react:Qt,"arc-templates":Qt,vash:Qt,slm:Qt,marko:Qt,teacup:Qt,"coffee-script":Qt,squirrelly:Qt,twing:Qt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":Qt,vue:Qt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Qt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Qt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Qt,"webpack-command":Qt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Qt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Qt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:Qt,jimp:Qt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":Qt,"eslint-import-resolver-typescript":Qt,"eslint-import-resolver-webpack":Qt,"@typescript-eslint/parser":Qt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":Qt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":Qt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x <10.0.2",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.7"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:Qt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:Qt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{"vue-template-compiler":"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["parcel@*",{peerDependenciesMeta:{"@parcel/core":Qt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@<5.0.0",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:Qt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:Qt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:Qt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":Qt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}],["vite-plugin-vuetify@<=1.0.2",{peerDependencies:{vue:"^3.0.0"}}],["webpack-plugin-vuetify@<=2.0.1",{peerDependencies:{vue:"^3.2.6"}}],["eslint-import-resolver-vite@<2.0.1",{dependencies:{debug:"^4.3.4",resolve:"^1.22.8"}}],["notistack@^3.0.0",{dependencies:{csstype:"^3.0.10"}}],["@fastify/type-provider-typebox@^5.0.0",{peerDependencies:{fastify:"^5.0.0"}}],["@fastify/type-provider-typebox@^4.0.0",{peerDependencies:{fastify:"^4.0.0"}}]];var p5;function Vye(){return typeof p5>"u"&&(p5=Ie("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),p5}var h5;function Jye(){return typeof h5>"u"&&(h5=Ie("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),h5}var g5;function Kye(){return typeof g5>"u"&&(g5=Ie("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),g5}var zye=new Map([[G.makeIdent(null,"fsevents").identHash,Vye],[G.makeIdent(null,"resolve").identHash,Jye],[G.makeIdent(null,"typescript").identHash,Kye]]),xct={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,s]of A5)e(G.parseDescriptor(r,!0),s)},getBuiltinPatch:async(t,e)=>{let r="compat/";if(!e.startsWith(r))return;let s=G.parseIdent(e.slice(r.length)),a=zye.get(s.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,s)=>typeof zye.get(t.identHash)>"u"?t:G.makeDescriptor(t,G.makeRange({protocol:"patch:",source:G.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},kct=xct;var T5={};Vt(T5,{ConstraintsCheckCommand:()=>XC,ConstraintsQueryCommand:()=>zC,ConstraintsSourceCommand:()=>ZC,default:()=>Kct});Ge();Ge();iS();var YC=class{constructor(e){this.project=e}createEnvironment(){let e=new WC(["cwd","ident"]),r=new WC(["workspace","type","ident"]),s=new WC(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,c=new Map;for(let f of this.project.storedPackages.values()){let p=Array.from(f.peerDependencies.values(),h=>[G.stringifyIdent(h),h.range]);n.set(f.locatorHash,{workspace:null,ident:G.stringifyIdent(f),version:f.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>f.peerDependenciesMeta.get(h)?.optional===!0))})}for(let f of this.project.storedPackages.values()){let p=n.get(f.locatorHash);p.dependencies=new Map(Array.from(f.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let C=n.get(E);if(typeof C>"u")throw new Error("Assertion failed: The package should have been registered");return[G.stringifyIdent(h),C]})),p.dependencies.delete(p.ident)}for(let f of this.project.workspaces){let p=G.stringifyIdent(f.anchoredLocator),h=f.manifest.exportTo({}),E=n.get(f.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let C=(T,N,{caller:U=fs.getCaller()}={})=>{let W=nS(T),ee=je.getMapWithDefault(a.manifestUpdates,f.cwd),ie=je.getMapWithDefault(ee,W),ue=je.getSetWithDefault(ie,N);U!==null&&ue.add(U)},S=T=>C(T,void 0,{caller:fs.getCaller()}),b=T=>{je.getArrayWithDefault(a.reportedErrors,f.cwd).push(T)},I=e.insert({cwd:f.relativeCwd,ident:p,manifest:h,pkg:E,set:C,unset:S,error:b});c.set(f,I);for(let T of Ut.allDependencies)for(let N of f.manifest[T].values()){let U=G.stringifyIdent(N),W=()=>{C([T,U],void 0,{caller:fs.getCaller()})},ee=ue=>{C([T,U],ue,{caller:fs.getCaller()})},ie=null;if(T!=="peerDependencies"&&(T!=="dependencies"||!f.manifest.devDependencies.has(N.identHash))){let ue=f.anchoredPackage.dependencies.get(N.identHash);if(ue){if(typeof ue>"u")throw new Error("Assertion failed: The dependency should have been registered");let le=this.project.storedResolutions.get(ue.descriptorHash);if(typeof le>"u")throw new Error("Assertion failed: The resolution should have been registered");let me=n.get(le);if(typeof me>"u")throw new Error("Assertion failed: The package should have been registered");ie=me}}r.insert({workspace:I,ident:U,range:N.range,type:T,resolution:ie,update:ee,delete:W,error:b})}}for(let f of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(f);if(!p)continue;let h=c.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(f.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:e,dependencies:r,packages:s,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},s=await this.project.loadUserConfig();return s?.constraints?(await s.constraints(r),e.result):null}};Ge();Ge();Yt();var zC=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=ge.String()}static{this.paths=[["constraints","query"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"query the constraints fact database",details:` This command will output all matches to the given prolog query. `,examples:[["List all dependencies throughout the workspace","yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(lS(),aS)),s=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Rt.find(s,this.context.cwd),n=await r.find(a),c=this.query;return c.endsWith(".")||(c=`${c}.`),(await Ot.start({configuration:s,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(c)){let E=Array.from(Object.entries(h)),C=E.length,S=E.reduce((b,[I])=>Math.max(b,I.length),0);for(let b=0;b(lS(),aS)),s=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Rt.find(s,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ge();Ge();Yt();iS();var XC=class extends ft{constructor(){super(...arguments);this.fix=ge.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["constraints"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd);await s.restoreInstallState();let a=await s.loadUserConfig(),n;if(a?.constraints)n=new YC(s);else{let{Constraints:h}=await Promise.resolve().then(()=>(lS(),aS));n=await h.find(s)}let c,f=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:C,remainingErrors:S}=nF(s,E,{fix:this.fix}),b=[];for(let[I,T]of C){let N=I.manifest.indent;I.manifest=new Ut,I.manifest.indent=N,I.manifest.load(T),b.push(I.persistManifest())}if(await Promise.all(b),!(C.size>0&&h>1)){c=Zye(S,{configuration:r}),f=!1,p=!0;for(let[,I]of S)for(let T of I)T.fixable?f=!0:p=!1}}if(c.children.length===0)return 0;if(f){let h=p?`Those errors can all be fixed by running ${he.pretty(r,"yarn constraints --fix",he.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${he.pretty(r,"yarn constraints --fix",he.Type.CODE)}`;await Ot.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return c.children=je.sortMap(c.children,h=>h.value[1]),xs.emitTree(c,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};iS();var Jct={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[zC,ZC,XC],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),s;if(r?.constraints)s=new YC(t);else{let{Constraints:c}=await Promise.resolve().then(()=>(lS(),aS));s=await c.find(t)}let a=await s.process();if(!a)return;let{remainingErrors:n}=nF(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[c,f]of n)for(let p of f)e(84,`${he.pretty(t.configuration,c.anchoredLocator,he.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${he.pretty(t.configuration,"yarn constraints",he.Type.CODE)} for more details`)}}},Kct=Jct;var F5={};Vt(F5,{CreateCommand:()=>$C,DlxCommand:()=>ew,default:()=>Zct});Ge();Yt();var $C=class extends ft{constructor(){super(...arguments);this.pkg=ge.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[["create"]]}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let s=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=G.parseDescriptor(s),n=a.name.match(/^create(-|$)/)?a:a.scope?G.makeIdent(a.scope,`create-${a.name}`):G.makeIdent(null,`create-${a.name}`),c=G.stringifyIdent(n);return a.range!=="unknown"&&(c+=`@${a.range}`),this.cli.run(["dlx",...r,c,...this.args])}};Ge();Ge();Dt();Yt();var ew=class extends ft{constructor(){super(...arguments);this.packages=ge.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=ge.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[["dlx"]]}static{this.usage=ot.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-vite to scaffold a new Vite project","yarn dlx create-vite"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]})}async execute(){return ze.telemetry=null,await ce.mktempPromise(async r=>{let s=J.join(r,`dlx-${process.pid}`);await ce.mkdirPromise(s),await ce.writeFilePromise(J.join(s,"package.json"),`{} `),await ce.writeFilePromise(J.join(s,"yarn.lock"),"");let a=J.join(s,".yarnrc.yml"),n=await ze.findProjectCwd(this.context.cwd),f={enableGlobalCache:!(await ze.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Yf(68),level:he.LogLevel.Discard}]},p=n!==null?J.join(n,".yarnrc.yml"):null;p!==null&&ce.existsSync(p)?(await ce.copyFilePromise(p,a),await ze.updateConfiguration(s,N=>{let U=je.toMerged(N,f);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(W=>{let ee=typeof W=="string"?W:W.path,ie=fe.isAbsolute(ee)?ee:fe.resolve(fe.fromPortablePath(n),ee);return typeof W=="string"?ie:{path:ie,spec:W.spec}})),U})):await ce.writeJsonPromise(a,f);let h=this.packages??[this.command],E=G.parseDescriptor(this.command).name,C=await this.cli.run(["add","--fixed","--",...h],{cwd:s,quiet:this.quiet});if(C!==0)return C;this.quiet||this.context.stdout.write(` `);let S=await ze.find(s,this.context.plugins),{project:b,workspace:I}=await Rt.find(S,s);if(I===null)throw new ar(b.cwd,s);await b.restoreInstallState();let T=await In.getWorkspaceAccessibleBinaries(I);return T.has(E)===!1&&T.size===1&&typeof this.packages>"u"&&(E=Array.from(T)[0][0]),await In.executeWorkspaceAccessibleBinary(I,E,this.args,{packageAccessibleBinaries:T,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var zct={commands:[$C,ew]},Zct=zct;var L5={};Vt(L5,{ExecFetcher:()=>uS,ExecResolver:()=>fS,default:()=>eut,execUtils:()=>aF});Ge();Ge();Dt();var cA="exec:";var aF={};Vt(aF,{loadGeneratorFile:()=>cS,makeLocator:()=>O5,makeSpec:()=>BEe,parseSpec:()=>N5});Ge();Dt();function N5(t){let{params:e,selector:r}=G.parseRange(t),s=fe.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:s}}function BEe({parentLocator:t,path:e,generatorHash:r,protocol:s}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:s,source:e,selector:e,params:{...n,...a}})}function O5(t,{parentLocator:e,path:r,generatorHash:s,protocol:a}){return G.makeLocator(t,BEe({parentLocator:e,path:r,generatorHash:s,protocol:a}))}async function cS(t,e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(t,{protocol:e}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath)}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.join(c.prefixPath,a);return await f.readFilePromise(p,"utf8")}var uS=class{supports(e,r){return!!e.reference.startsWith(cA)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:cA});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async fetchFromDisk(e,r){let s=await cS(e.reference,cA,r);return ce.mktempPromise(async a=>{let n=J.join(a,"generator.js");return await ce.writeFilePromise(n,s),ce.mktempPromise(async c=>{if(await this.generatePackage(c,e,n,r),!ce.existsSync(J.join(c,"build")))throw new Error("The script should have generated a build directory");return await ps.makeArchiveFromDirectory(J.join(c,"build"),{prefixPath:G.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,s,a){return await ce.mktempPromise(async n=>{let c=await In.makeScriptEnv({project:a.project,binFolder:n}),f=J.join(e,"runtime.js");return await ce.mktempPromise(async p=>{let h=J.join(p,"buildfile.log"),E=J.join(e,"generator"),C=J.join(e,"build");await ce.mkdirPromise(E),await ce.mkdirPromise(C);let S={tempDir:fe.fromPortablePath(E),buildDir:fe.fromPortablePath(C),locator:G.stringifyLocator(r)};await ce.writeFilePromise(f,` // Expose 'Module' as a global variable Object.defineProperty(global, 'Module', { get: () => require('module'), configurable: true, enumerable: false, }); // Expose non-hidden built-in modules as global variables for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { Object.defineProperty(global, name, { get: () => require(name), configurable: true, enumerable: false, }); } // Expose the 'execEnv' global variable Object.defineProperty(global, 'execEnv', { value: { ...${JSON.stringify(S)}, }, enumerable: true, }); `);let b=c.NODE_OPTIONS||"",I=/\s*--require\s+\S*\.pnp\.c?js\s*/g;b=b.replace(I," ").trim(),c.NODE_OPTIONS=b;let{stdout:T,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${G.stringifyLocator(r)}) `,prefix:G.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await qr.pipevp(process.execPath,["--require",fe.fromPortablePath(f),fe.fromPortablePath(s),G.stringifyIdent(r)],{cwd:e,env:c,stdin:null,stdout:T,stderr:N});if(U!==0)throw ce.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${he.pretty(a.project.configuration,h,he.Type.PATH)})`)})})}};Ge();Ge();var Xct=2,fS=class{supportsDescriptor(e,r){return!!e.range.startsWith(cA)}supportsLocator(e,r){return!!e.reference.startsWith(cA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=N5(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=await cS(G.makeRange({protocol:cA,source:a,selector:a,params:{locator:G.stringifyLocator(n)}}),cA,s.fetchOptions),f=Nn.makeHash(`${Xct}`,c).slice(0,6);return[O5(e,{parentLocator:n,path:a,generatorHash:f,protocol:cA})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var $ct={fetchers:[uS],resolvers:[fS]},eut=$ct;var U5={};Vt(U5,{FileFetcher:()=>gS,FileResolver:()=>dS,TarballFileFetcher:()=>mS,TarballFileResolver:()=>yS,default:()=>nut,fileUtils:()=>xm});Ge();Dt();var tw=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,AS=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,$i="file:";var xm={};Vt(xm,{fetchArchiveFromLocator:()=>hS,makeArchiveFromLocator:()=>lF,makeBufferFromLocator:()=>M5,makeLocator:()=>rw,makeSpec:()=>vEe,parseSpec:()=>pS});Ge();Dt();function pS(t){let{params:e,selector:r}=G.parseRange(t),s=fe.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:s}}function vEe({parentLocator:t,path:e,hash:r,protocol:s}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:s,source:e,selector:e,params:{...n,...a}})}function rw(t,{parentLocator:e,path:r,hash:s,protocol:a}){return G.makeLocator(t,vEe({parentLocator:e,path:r,hash:s,protocol:a}))}async function hS(t,e){let{parentLocator:r,path:s}=G.parseFileStyleRange(t.reference,{protocol:$i}),a=J.isAbsolute(s)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let c=n.packageFs,f=J.join(n.prefixPath,s);return await je.releaseAfterUseAsync(async()=>await c.readFilePromise(f),n.releaseFs)}async function lF(t,{protocol:e,fetchOptions:r,inMemory:s=!1}){let{parentLocator:a,path:n}=G.parseFileStyleRange(t.reference,{protocol:e}),c=J.isAbsolute(n)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(a,r),f=c.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,c.localPath)}:c;c!==f&&c.releaseFs&&c.releaseFs();let p=f.packageFs,h=J.join(f.prefixPath,n);return await je.releaseAfterUseAsync(async()=>await ps.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:G.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:s}),f.releaseFs)}async function M5(t,{protocol:e,fetchOptions:r}){return(await lF(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var gS=class{supports(e,r){return!!e.reference.startsWith($i)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:$i});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async fetchFromDisk(e,r){return lF(e,{protocol:$i,fetchOptions:r})}};Ge();Ge();var tut=2,dS=class{supportsDescriptor(e,r){return e.range.match(tw)?!0:!!e.range.startsWith($i)}supportsLocator(e,r){return!!e.reference.startsWith($i)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return tw.test(e.range)&&(e=G.makeDescriptor(e,`${$i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=pS(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=await M5(G.makeLocator(e,G.makeRange({protocol:$i,source:a,selector:a,params:{locator:G.stringifyLocator(n)}})),{protocol:$i,fetchOptions:s.fetchOptions}),f=Nn.makeHash(`${tut}`,c).slice(0,6);return[rw(e,{parentLocator:n,path:a,hash:f,protocol:$i})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ge();var mS=class{supports(e,r){return AS.test(e.reference)?!!e.reference.startsWith($i):!1}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromDisk(e,r){let s=await hS(e,r);return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();Ge();var yS=class{supportsDescriptor(e,r){return AS.test(e.range)?!!(e.range.startsWith($i)||tw.test(e.range)):!1}supportsLocator(e,r){return AS.test(e.reference)?!!e.reference.startsWith($i):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return tw.test(e.range)&&(e=G.makeDescriptor(e,`${$i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=pS(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let c=rw(e,{parentLocator:n,path:a,hash:"",protocol:$i}),f=await hS(c,s.fetchOptions),p=Nn.makeHash(f).slice(0,6);return[rw(e,{parentLocator:n,path:a,hash:p,protocol:$i})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var rut={fetchers:[mS,gS],resolvers:[yS,dS]},nut=rut;var j5={};Vt(j5,{GithubFetcher:()=>ES,default:()=>sut,githubUtils:()=>cF});Ge();Dt();var cF={};Vt(cF,{invalidGithubUrlMessage:()=>PEe,isGithubUrl:()=>_5,parseGithubUrl:()=>H5});var SEe=ut(Ie("querystring")),DEe=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function _5(t){return t?DEe.some(e=>!!t.match(e)):!1}function H5(t){let e;for(let f of DEe)if(e=t.match(f),e)break;if(!e)throw new Error(PEe(t));let[,r,s,a,n="master"]=e,{commit:c}=SEe.default.parse(n);return n=c||n.replace(/[^:]*:/,""),{auth:r,username:s,reponame:a,treeish:n}}function PEe(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var ES=class{supports(e,r){return!!_5(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s=await ln.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await ce.mktempPromise(async a=>{let n=new Sn(a);await ps.extractArchiveTo(s,n,{stripComponents:1});let c=ka.splitRepoUrl(e.reference),f=J.join(a,"package.tgz");await In.prepareExternalProject(a,f,{configuration:r.project.configuration,report:r.report,workspace:c.extra.workspace,locator:e});let p=await ce.readFilePromise(f);return await ps.convertToZip(p,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:s,username:a,reponame:n,treeish:c}=H5(e.reference);return`https://${s?`${s}@`:""}github.com/${a}/${n}/archive/${c}.tar.gz`}};var iut={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let s=new ES;if(!s.supports(e,r))return null;try{return await s.fetch(e,r)}catch{return null}}}},sut=iut;var G5={};Vt(G5,{TarballHttpFetcher:()=>CS,TarballHttpResolver:()=>wS,default:()=>aut});Ge();function IS(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!=="http:"&&e.protocol!=="https:"||!e.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var CS=class{supports(e,r){return IS(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s=await ln.get(e.reference,{configuration:r.project.configuration});return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();var wS=class{supportsDescriptor(e,r){return IS(e.range)}supportsLocator(e,r){return IS(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){return[G.convertDescriptorToLocator(e)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var out={fetchers:[CS],resolvers:[wS]},aut=out;var q5={};Vt(q5,{InitCommand:()=>z0,InitInitializerCommand:()=>nw,default:()=>cut});Yt();Ge();Ge();Dt();Yt();var z0=class extends ft{constructor(){super(...arguments);this.private=ge.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=ge.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=ge.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=ge.String("-n,--name",{description:"Initialize a package with the given name"});this.usev2=ge.Boolean("-2",!1,{hidden:!0});this.yes=ge.Boolean("-y,--yes",{hidden:!0})}static{this.paths=[["init"]]}static{this.usage=ot.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return s!==null?await this.executeProxy(r,s):await this.executeRegular(r)}async executeProxy(r,s){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new nt("Cannot use the --install flag from within a project subdirectory");ce.existsSync(this.context.cwd)||await ce.mkdirPromise(this.context.cwd,{recursive:!0});let a=J.join(this.context.cwd,Er.lockfile);ce.existsSync(a)||await ce.writeFilePromise(a,"");let n=await this.cli.run(["set","version",s],{quiet:!0});if(n!==0)return n;let c=[];return this.private&&c.push("-p"),this.workspace&&c.push("-w"),this.name&&c.push(`-n=${this.name}`),this.yes&&c.push("-y"),await ce.mktempPromise(async f=>{let{code:p}=await qr.pipevp("yarn",["init",...c],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await In.makeScriptEnv({binFolder:f})});return p})}async initialize(){}async executeRegular(r){let s=null;try{s=(await Rt.find(r,this.context.cwd)).project}catch{s=null}ce.existsSync(this.context.cwd)||await ce.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Ut.tryFind(this.context.cwd),n=a??new Ut,c=Object.fromEntries(r.get("initFields").entries());n.load(c),n.name=n.name??G.makeIdent(r.get("initScope"),this.name??J.basename(this.context.cwd)),n.packageManager=fn&&je.isTaggedYarnVersion(fn)?`yarn@${fn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ce.mkdirPromise(J.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let f={};n.exportTo(f);let p=J.join(this.context.cwd,Ut.fileName);await ce.changeFilePromise(p,`${JSON.stringify(f,null,2)} `,{automaticNewlines:!0});let h=[p],E=J.join(this.context.cwd,"README.md");if(ce.existsSync(E)||(await ce.writeFilePromise(E,`# ${G.stringifyIdent(n.name)} `),h.push(E)),!s||s.cwd===this.context.cwd){let C=J.join(this.context.cwd,Er.lockfile);ce.existsSync(C)||(await ce.writeFilePromise(C,""),h.push(C));let b=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Whether you use PnP or not, the node_modules folder is often used to store","# build artifacts that should be gitignored","node_modules","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(ue=>`${ue} `).join(""),I=J.join(this.context.cwd,".gitignore");ce.existsSync(I)||(await ce.writeFilePromise(I,b),h.push(I));let N=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(ue=>`${ue} `).join(""),U=J.join(this.context.cwd,".gitattributes");ce.existsSync(U)||(await ce.writeFilePromise(U,N),h.push(U));let W={"*":{charset:"utf-8",endOfLine:"lf",indentSize:2,indentStyle:"space",insertFinalNewline:!0}};je.mergeIntoTarget(W,r.get("initEditorConfig"));let ee=`root = true `;for(let[ue,le]of Object.entries(W)){ee+=` [${ue}] `;for(let[me,pe]of Object.entries(le)){let Be=me.replace(/[A-Z]/g,Ce=>`_${Ce.toLowerCase()}`);ee+=`${Be} = ${pe} `}}let ie=J.join(this.context.cwd,".editorconfig");ce.existsSync(ie)||(await ce.writeFilePromise(ie,ee),h.push(ie)),await this.cli.run(["install"],{quiet:!0}),await this.initialize(),ce.existsSync(J.join(this.context.cwd,".git"))||(await qr.execvp("git",["init"],{cwd:this.context.cwd}),await qr.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await qr.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};var nw=class extends z0{constructor(){super(...arguments);this.initializer=ge.String();this.argv=ge.Proxy()}static{this.paths=[["init"]]}async initialize(){this.context.stdout.write(` `),await this.cli.run(["dlx",this.initializer,...this.argv],{quiet:!0})}};var lut={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[z0,nw]},cut=lut;var HW={};Vt(HW,{SearchCommand:()=>Iw,UpgradeInteractiveCommand:()=>Cw,default:()=>ygt});Ge();var xEe=ut(Ie("os"));function iw({stdout:t}){if(xEe.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}Yt();var HIe=ut(l9()),c9={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},oAt=(0,HIe.default)(c9.appId,c9.apiKey).initIndex(c9.indexName),u9=async(t,e=0)=>await oAt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var CD=["regular","dev","peer"],Iw=class extends ft{static{this.paths=[["search"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the search interface",details:` This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. `,examples:[["Open the search window","yarn search"]]})}async execute(){iw(this.context);let{Gem:e}=await Promise.resolve().then(()=>(qF(),kW)),{ScrollableItems:r}=await Promise.resolve().then(()=>(JF(),VF)),{useKeypress:s}=await Promise.resolve().then(()=>(yD(),m2e)),{useMinistore:a}=await Promise.resolve().then(()=>(OW(),NW)),{renderForm:n}=await Promise.resolve().then(()=>(XF(),ZF)),{default:c}=await Promise.resolve().then(()=>ut(P2e())),{Box:f,Text:p}=await Promise.resolve().then(()=>ut(Wc())),{default:h,useEffect:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),b=()=>h.createElement(f,{flexDirection:"row"},h.createElement(f,{flexDirection:"column",width:48},h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(f,{flexDirection:"column"},h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),I=()=>h.createElement(h.Fragment,null,h.createElement(f,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(f,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(f,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),T=()=>h.createElement(f,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),N=({hit:pe,active:Be})=>{let[Ce,g]=a(pe.name,null);s({active:Be},(Ae,se)=>{if(se.name!=="space")return;if(!Ce){g(CD[0]);return}let X=CD.indexOf(Ce)+1;X===CD.length?g(null):g(CD[X])},[Ce,g]);let we=G.parseIdent(pe.name),ye=G.prettyIdent(S,we);return h.createElement(f,null,h.createElement(f,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},ye)),h.createElement(f,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},pe.owner.name)),h.createElement(f,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},pe.version)),h.createElement(f,{width:16,marginLeft:1},h.createElement(p,null,pe.humanDownloadsLast30Days)))},U=({name:pe,active:Be})=>{let[Ce]=a(pe,null),g=G.parseIdent(pe);return h.createElement(f,null,h.createElement(f,{width:47},h.createElement(p,{bold:!0}," - ",G.prettyIdent(S,g))),CD.map(we=>h.createElement(f,{key:we,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:Ce===we})," ",h.createElement(p,{bold:!0},we)))))},W=()=>h.createElement(f,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),ie=await n(({useSubmit:pe})=>{let Be=a();pe(Be);let Ce=Array.from(Be.keys()).filter(j=>Be.get(j)!==null),[g,we]=C(""),[ye,Ae]=C(0),[se,X]=C([]),De=j=>{j.match(/\t| /)||we(j)},Te=async()=>{Ae(0);let j=await u9(g);j.query===g&&X(j.hits)},mt=async()=>{let j=await u9(g,ye+1);j.query===g&&j.page-1===ye&&(Ae(j.page),X([...se,...j.hits]))};return E(()=>{g?Te():X([])},[g]),h.createElement(f,{flexDirection:"column"},h.createElement(b,null),h.createElement(f,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(f,{width:41},h.createElement(c,{value:g,onChange:De,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(I,null)),se.length?h.createElement(r,{radius:2,loop:!1,children:se.map(j=>h.createElement(N,{key:j.name,hit:j,active:!1})),willReachEnd:mt}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(f,{flexDirection:"row",marginTop:1},h.createElement(f,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(T,null)),Ce.length?Ce.map(j=>h.createElement(U,{key:j,name:j,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(W,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ie>"u")return 1;let ue=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="regular"),le=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="dev"),me=Array.from(ie.keys()).filter(pe=>ie.get(pe)==="peer");return ue.length&&await this.cli.run(["add",...ue]),le.length&&await this.cli.run(["add","--dev",...le]),me&&await this.cli.run(["add","--peer",...me]),0}};Ge();Yt();GG();var F2e=ut(Ai()),T2e=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/;function N2e(t,e){return t.length>0?[t.slice(0,e)].concat(N2e(t.slice(e),e)):[]}var Cw=class extends ft{static{this.paths=[["upgrade-interactive"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]})}async execute(){iw(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(R2e(),Q2e)),{Pad:r}=await Promise.resolve().then(()=>(_W(),k2e)),{ScrollableItems:s}=await Promise.resolve().then(()=>(JF(),VF)),{useMinistore:a}=await Promise.resolve().then(()=>(OW(),NW)),{renderForm:n}=await Promise.resolve().then(()=>(XF(),ZF)),{Box:c,Text:f}=await Promise.resolve().then(()=>ut(Wc())),{default:p,useEffect:h,useRef:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:I}=await Rt.find(S,this.context.cwd),T=await Kr.find(S);if(!I)throw new ar(b.cwd,this.context.cwd);await b.restoreInstallState({restoreResolutions:!1});let N=this.context.stdout.rows-7,U=(we,ye)=>{let Ae=pde(we,ye),se="";for(let X of Ae)X.added?se+=he.pretty(S,X.value,"green"):X.removed||(se+=X.value);return se},W=(we,ye)=>{if(we===ye)return ye;let Ae=G.parseRange(we),se=G.parseRange(ye),X=Ae.selector.match(T2e),De=se.selector.match(T2e);if(!X||!De)return U(we,ye);let Te=["gray","red","yellow","green","magenta"],mt=null,j="";for(let rt=1;rt{let se=await Zu.fetchDescriptorFrom(we,Ae,{project:b,cache:T,preserveModifier:ye,workspace:I});return se!==null?se.range:we.range},ie=async we=>{let ye=F2e.default.valid(we.range)?`^${we.range}`:we.range,[Ae,se]=await Promise.all([ee(we,we.range,ye).catch(()=>null),ee(we,we.range,"latest").catch(()=>null)]),X=[{value:null,label:we.range}];return Ae&&Ae!==we.range?X.push({value:Ae,label:W(we.range,Ae)}):X.push({value:null,label:""}),se&&se!==Ae&&se!==we.range?X.push({value:se,label:W(we.range,se)}):X.push({value:null,label:""}),X},ue=()=>p.createElement(c,{flexDirection:"row"},p.createElement(c,{flexDirection:"column",width:49},p.createElement(c,{marginLeft:1},p.createElement(f,null,"Press ",p.createElement(f,{bold:!0,color:"cyanBright"},""),"/",p.createElement(f,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(c,{marginLeft:1},p.createElement(f,null,"Press ",p.createElement(f,{bold:!0,color:"cyanBright"},""),"/",p.createElement(f,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(c,{flexDirection:"column"},p.createElement(c,{marginLeft:1},p.createElement(f,null,"Press ",p.createElement(f,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(c,{marginLeft:1},p.createElement(f,null,"Press ",p.createElement(f,{bold:!0,color:"cyanBright"},"")," to abort.")))),le=()=>p.createElement(c,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(c,{width:50},p.createElement(f,{bold:!0},p.createElement(f,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(c,{width:17},p.createElement(f,{bold:!0,underline:!0,color:"gray"},"Latest"))),me=({active:we,descriptor:ye,suggestions:Ae})=>{let[se,X]=a(ye.descriptorHash,null),De=G.stringifyIdent(ye),Te=Math.max(0,45-De.length);return p.createElement(p.Fragment,null,p.createElement(c,null,p.createElement(c,{width:45},p.createElement(f,{bold:!0},G.prettyIdent(S,ye)),p.createElement(r,{active:we,length:Te})),p.createElement(e,{active:we,options:Ae,value:se,skewer:!0,onChange:X,sizes:[17,17,17]})))},pe=({dependencies:we})=>{let[ye,Ae]=C(we.map(()=>null)),se=E(!0),X=async De=>{let Te=await ie(De);return Te.filter(mt=>mt.label!=="").length<=1?null:{descriptor:De,suggestions:Te}};return h(()=>()=>{se.current=!1},[]),h(()=>{let De=Math.trunc(N*1.75),Te=we.slice(0,De),mt=we.slice(De),j=N2e(mt,N),rt=Te.map(X).reduce(async(Fe,Ne)=>{await Fe;let be=await Ne;be!==null&&se.current&&Ae(Ve=>{let ke=Ve.findIndex(Ue=>Ue===null),it=[...Ve];return it[ke]=be,it})},Promise.resolve());j.reduce((Fe,Ne)=>Promise.all(Ne.map(be=>Promise.resolve().then(()=>X(be)))).then(async be=>{be=be.filter(Ve=>Ve!==null),await Fe,se.current&&Ae(Ve=>{let ke=Ve.findIndex(it=>it===null);return Ve.slice(0,ke).concat(be).concat(Ve.slice(ke+be.length))})}),rt).then(()=>{se.current&&Ae(Fe=>Fe.filter(Ne=>Ne!==null))})},[]),ye.length?p.createElement(s,{radius:N>>1,children:ye.map((De,Te)=>De!==null?p.createElement(me,{key:Te,active:!1,descriptor:De.descriptor,suggestions:De.suggestions}):p.createElement(f,{key:Te},"Loading..."))}):p.createElement(f,null,"No upgrades found")},Ce=await n(({useSubmit:we})=>{we(a());let ye=new Map;for(let se of b.workspaces)for(let X of["dependencies","devDependencies"])for(let De of se.manifest[X].values())b.tryWorkspaceByDescriptor(De)===null&&(De.range.startsWith("link:")||ye.set(De.descriptorHash,De));let Ae=je.sortMap(ye.values(),se=>G.stringifyDescriptor(se));return p.createElement(c,{flexDirection:"column"},p.createElement(ue,null),p.createElement(le,null),p.createElement(pe,{dependencies:Ae}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ce>"u")return 1;let g=!1;for(let we of b.workspaces)for(let ye of["dependencies","devDependencies"]){let Ae=we.manifest[ye];for(let se of Ae.values()){let X=Ce.get(se.descriptorHash);typeof X<"u"&&X!==null&&(Ae.set(se.identHash,G.makeDescriptor(se,X)),g=!0)}}return g?await b.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:T}):0}};var mgt={commands:[Iw,Cw]},ygt=mgt;var GW={};Vt(GW,{default:()=>wgt});Ge();var BD="jsr:";Ge();Ge();function ww(t){let e=t.range.slice(4);if(Fr.validRange(e))return G.makeDescriptor(t,`npm:${G.stringifyIdent(G.wrapIdentIntoScope(t,"jsr"))}@${e}`);let r=G.tryParseDescriptor(e,!0);if(r!==null)return G.makeDescriptor(t,`npm:${G.stringifyIdent(G.wrapIdentIntoScope(r,"jsr"))}@${r.range}`);throw new Error(`Invalid range: ${t.range}`)}function Bw(t){return G.makeLocator(G.wrapIdentIntoScope(t,"jsr"),`npm:${t.reference.slice(4)}`)}function jW(t){return G.makeLocator(G.unwrapIdentFromScope(t,"jsr"),`jsr:${t.reference.slice(4)}`)}var $F=class{supports(e,r){return e.reference.startsWith(BD)}getLocalPath(e,r){let s=Bw(e);return r.fetcher.getLocalPath(s,r)}fetch(e,r){let s=Bw(e);return r.fetcher.fetch(s,r)}};var eN=class{supportsDescriptor(e,r){return!!e.range.startsWith(BD)}supportsLocator(e,r){return!!e.reference.startsWith(BD)}shouldPersistResolution(e,r){let s=Bw(e);return r.resolver.shouldPersistResolution(s,r)}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{inner:ww(e)}}async getCandidates(e,r,s){let a=s.project.configuration.normalizeDependency(ww(e));return(await s.resolver.getCandidates(a,r,s)).map(c=>jW(c))}async getSatisfying(e,r,s,a){let n=a.project.configuration.normalizeDependency(ww(e));return a.resolver.getSatisfying(n,r,s,a)}async resolve(e,r){let s=Bw(e),a=await r.resolver.resolve(s,r);return{...a,...jW(a)}}};var Egt=["dependencies","devDependencies","peerDependencies"];function Igt(t,e){for(let r of Egt)for(let s of t.manifest.getForScope(r).values()){if(!s.range.startsWith("jsr:"))continue;let a=ww(s),n=r==="dependencies"?G.makeDescriptor(s,"unknown"):null,c=n!==null&&t.manifest.ensureDependencyMeta(n).optional?"optionalDependencies":r;e[c][G.stringifyIdent(s)]=a.range}}var Cgt={hooks:{beforeWorkspacePacking:Igt},resolvers:[eN],fetchers:[$F]},wgt=Cgt;var qW={};Vt(qW,{LinkFetcher:()=>vD,LinkResolver:()=>SD,PortalFetcher:()=>DD,PortalResolver:()=>PD,default:()=>vgt});Ge();Dt();var rh="portal:",nh="link:";var vD=class{supports(e,r){return!!e.reference.startsWith(nh)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:nh});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:nh}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath),localPath:vt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Sn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Hf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,discardFromLookup:!0}}};Ge();Dt();var SD=class{supportsDescriptor(e,r){return!!e.range.startsWith(nh)}supportsLocator(e,r){return!!e.reference.startsWith(nh)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(nh.length);return[G.makeLocator(e,`${nh}${fe.toPortablePath(a)}`)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ge();Dt();var DD=class{supports(e,r){return!!e.reference.startsWith(rh)}getLocalPath(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:rh});if(J.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(s,r);return n===null?null:J.resolve(n,a)}async fetch(e,r){let{parentLocator:s,path:a}=G.parseFileStyleRange(e.reference,{protocol:rh}),n=J.isAbsolute(a)?{packageFs:new Sn(vt.root),prefixPath:vt.dot,localPath:vt.root}:await r.fetcher.fetch(s,r),c=n.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,n.localPath),localPath:vt.root}:n;n!==c&&n.releaseFs&&n.releaseFs();let f=c.packageFs,p=J.resolve(c.localPath??c.packageFs.getRealPath(),c.prefixPath,a);return n.localPath?{packageFs:new Sn(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot,localPath:p}:{packageFs:new Hf(p,{baseFs:f}),releaseFs:c.releaseFs,prefixPath:vt.dot}}};Ge();Ge();Dt();var PD=class{supportsDescriptor(e,r){return!!e.range.startsWith(rh)}supportsLocator(e,r){return!!e.reference.startsWith(rh)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(rh.length);return[G.makeLocator(e,`${rh}${fe.toPortablePath(a)}`)]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let s=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await je.releaseAfterUseAsync(async()=>await Ut.find(s.prefixPath,{baseFs:s.packageFs}),s.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Bgt={fetchers:[vD,DD],resolvers:[SD,PD]},vgt=Bgt;var PY={};Vt(PY,{NodeModulesLinker:()=>jD,NodeModulesMode:()=>BY,PnpLooseLinker:()=>GD,default:()=>Hdt});Dt();Ge();Dt();Dt();var YW=(t,e)=>`${t}@${e}`,O2e=(t,e)=>{let r=e.indexOf("#"),s=r>=0?e.substring(r+1):e;return YW(t,s)};var M2e=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),s=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:s,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},c;n.debugLevel>=0&&(c=Date.now());let f=Qgt(t,n),p=!1,h=0;do{let E=VW(f,[f],new Set([f.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-c}ms, rounds: ${h}`),n.debugLevel>=1){let E=bD(f);if(VW(f,[f],new Set([f.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: ${E}, next tree: ${bD(f)}`);let S=U2e(f);if(S)throw new Error(`${S}, after hoisting finished: ${bD(f)}`)}return n.debugLevel>=2&&console.log(bD(f)),Rgt(f)},Sgt=t=>{let e=t[t.length-1],r=new Map,s=new Set,a=n=>{if(!s.has(n)){s.add(n);for(let c of n.hoistedDependencies.values())r.set(c.name,c);for(let c of n.dependencies.values())n.peerNames.has(c.name)||a(c)}};return a(e),r},Dgt=t=>{let e=t[t.length-1],r=new Map,s=new Set,a=new Set,n=(c,f)=>{if(s.has(c))return;s.add(c);for(let h of c.hoistedDependencies.values())if(!f.has(h.name)){let E;for(let C of t)E=C.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of c.dependencies.values())p.add(h.name);for(let h of c.dependencies.values())c.peerNames.has(h.name)||n(h,p)};return n(e,a),r},L2e=(t,e)=>{if(e.decoupled)return e;let{name:r,references:s,ident:a,locator:n,dependencies:c,originalDependencies:f,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:C,hoistPriority:S,dependencyKind:b,hoistedFrom:I,hoistedTo:T}=e,N={name:r,references:new Set(s),ident:a,locator:n,dependencies:new Map(c),originalDependencies:new Map(f),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:C,hoistPriority:S,dependencyKind:b,hoistedFrom:new Map(I),hoistedTo:new Map(T)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),t.dependencies.set(N.name,N),N},Pgt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let s=Array.from(e.keys());s.sort((a,n)=>{let c=e.get(a),f=e.get(n);if(f.hoistPriority!==c.hoistPriority)return f.hoistPriority-c.hoistPriority;{let p=c.dependents.size+c.peerDependents.size;return f.dependents.size+f.peerDependents.size-p}});for(let a of s){let n=a.substring(0,a.indexOf("@",1)),c=a.substring(n.length+1);if(!t.peerNames.has(n)){let f=r.get(n);f||(f=[],r.set(n,f)),f.indexOf(c)<0&&f.push(c)}}return r},WW=t=>{let e=new Set,r=(s,a=new Set)=>{if(!a.has(s)){a.add(s);for(let n of s.peerNames)if(!t.peerNames.has(n)){let c=t.dependencies.get(n);c&&!e.has(c)&&r(c,a)}e.add(s)}};for(let s of t.dependencies.values())t.peerNames.has(s.name)||r(s);return e},VW=(t,e,r,s,a,n=new Set)=>{let c=e[e.length-1];if(n.has(c))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(c);let f=Tgt(c),p=Pgt(c,f),h=t==c?new Map:a.fastLookupPossible?Sgt(e):Dgt(e),E,C=!1,S=!1,b=new Map(Array.from(p.entries()).map(([T,N])=>[T,N[0]])),I=new Map;do{let T=kgt(t,e,r,h,b,p,s,I,a);T.isGraphChanged&&(S=!0),T.anotherRoundNeeded&&(C=!0),E=!1;for(let[N,U]of p)U.length>1&&!c.dependencies.has(N)&&(b.delete(N),U.shift(),b.set(N,U[0]),E=!0)}while(E);for(let T of c.dependencies.values())if(!c.peerNames.has(T.name)&&!r.has(T.locator)){r.add(T.locator);let N=VW(t,[...e,T],r,I,a);N.isGraphChanged&&(S=!0),N.anotherRoundNeeded&&(C=!0),r.delete(T.locator)}return{anotherRoundNeeded:C,isGraphChanged:S}},bgt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},xgt=(t,e,r,s,a,n,c,f,{outputReason:p,fastLookupPossible:h})=>{let E,C=null,S=new Set;p&&(E=`${Array.from(e).map(N=>yo(N)).join("\u2192")}`);let b=r[r.length-1],T=!(s.ident===b.ident);if(p&&!T&&(C="- self-reference"),T&&(T=s.dependencyKind!==1,p&&!T&&(C="- workspace")),T&&s.dependencyKind===2&&(T=!bgt(s),p&&!T&&(C="- external soft link with unhoisted dependencies")),T&&(T=!t.peerNames.has(s.name),p&&!T&&(C=`- cannot shadow peer: ${yo(t.originalDependencies.get(s.name).locator)} at ${E}`)),T){let N=!1,U=a.get(s.name);if(N=!U||U.ident===s.ident,p&&!N&&(C=`- filled by: ${yo(U.locator)} at ${E}`),N)for(let W=r.length-1;W>=1;W--){let ie=r[W].dependencies.get(s.name);if(ie&&ie.ident!==s.ident){N=!1;let ue=f.get(b);ue||(ue=new Set,f.set(b,ue)),ue.add(s.name),p&&(C=`- filled by ${yo(ie.locator)} at ${r.slice(0,W).map(le=>yo(le.locator)).join("\u2192")}`);break}}T=N}if(T&&(T=n.get(s.name)===s.ident,p&&!T&&(C=`- filled by: ${yo(c.get(s.name)[0])} at ${E}`)),T){let N=!0,U=new Set(s.peerNames);for(let W=r.length-1;W>=1;W--){let ee=r[W];for(let ie of U){if(ee.peerNames.has(ie)&&ee.originalDependencies.has(ie))continue;let ue=ee.dependencies.get(ie);ue&&t.dependencies.get(ie)!==ue&&(W===r.length-1?S.add(ue):(S=null,N=!1,p&&(C=`- peer dependency ${yo(ue.locator)} from parent ${yo(ee.locator)} was not hoisted to ${E}`))),U.delete(ie)}if(!N)break}T=N}if(T&&!h)for(let N of s.hoistedDependencies.values()){let U=a.get(N.name)||t.dependencies.get(N.name);if(!U||N.ident!==U.ident){T=!1,p&&(C=`- previously hoisted dependency mismatch, needed: ${yo(N.locator)}, available: ${yo(U?.locator)}`);break}}return S!==null&&S.size>0?{isHoistable:2,dependsOn:S,reason:C}:{isHoistable:T?0:1,reason:C}},tN=t=>`${t.name}@${t.locator}`,kgt=(t,e,r,s,a,n,c,f,p)=>{let h=e[e.length-1],E=new Set,C=!1,S=!1,b=(U,W,ee,ie,ue)=>{if(E.has(ie))return;let le=[...W,tN(ie)],me=[...ee,tN(ie)],pe=new Map,Be=new Map;for(let Ae of WW(ie)){let se=xgt(h,r,[h,...U,ie],Ae,s,a,n,f,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(Be.set(Ae,se),se.isHoistable===2)for(let X of se.dependsOn){let De=pe.get(X.name)||new Set;De.add(Ae.name),pe.set(X.name,De)}}let Ce=new Set,g=(Ae,se,X)=>{if(!Ce.has(Ae)){Ce.add(Ae),Be.set(Ae,{isHoistable:1,reason:X});for(let De of pe.get(Ae.name)||[])g(ie.dependencies.get(De),se,p.debugLevel>=2?`- peer dependency ${yo(Ae.locator)} from parent ${yo(ie.locator)} was not hoisted`:"")}};for(let[Ae,se]of Be)se.isHoistable===1&&g(Ae,se,se.reason);let we=!1;for(let Ae of Be.keys())if(!Ce.has(Ae)){S=!0;let se=c.get(ie);se&&se.has(Ae.name)&&(C=!0),we=!0,ie.dependencies.delete(Ae.name),ie.hoistedDependencies.set(Ae.name,Ae),ie.reasons.delete(Ae.name);let X=h.dependencies.get(Ae.name);if(p.debugLevel>=2){let De=Array.from(W).concat([ie.locator]).map(mt=>yo(mt)).join("\u2192"),Te=h.hoistedFrom.get(Ae.name);Te||(Te=[],h.hoistedFrom.set(Ae.name,Te)),Te.push(De),ie.hoistedTo.set(Ae.name,Array.from(e).map(mt=>yo(mt.locator)).join("\u2192"))}if(!X)h.ident!==Ae.ident&&(h.dependencies.set(Ae.name,Ae),ue.add(Ae));else for(let De of Ae.references)X.references.add(De)}if(ie.dependencyKind===2&&we&&(C=!0),p.check){let Ae=U2e(t);if(Ae)throw new Error(`${Ae}, after hoisting dependencies of ${[h,...U,ie].map(se=>yo(se.locator)).join("\u2192")}: ${bD(t)}`)}let ye=WW(ie);for(let Ae of ye)if(Ce.has(Ae)){let se=Be.get(Ae);if((a.get(Ae.name)===Ae.ident||!ie.reasons.has(Ae.name))&&se.isHoistable!==0&&ie.reasons.set(Ae.name,se.reason),!Ae.isHoistBorder&&me.indexOf(tN(Ae))<0){E.add(ie);let De=L2e(ie,Ae);b([...U,ie],le,me,De,T),E.delete(ie)}}},I,T=new Set(WW(h)),N=Array.from(e).map(U=>tN(U));do{I=T,T=new Set;for(let U of I){if(U.locator===h.locator||U.isHoistBorder)continue;let W=L2e(h,U);b([],Array.from(r),N,W,T)}}while(T.size>0);return{anotherRoundNeeded:C,isGraphChanged:S}},U2e=t=>{let e=[],r=new Set,s=new Set,a=(n,c,f)=>{if(r.has(n)||(r.add(n),s.has(n)))return;let p=new Map(c);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),C=()=>`${Array.from(s).concat([n]).map(S=>yo(S.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let S=c.get(h.name);(S!==E||!S||S.ident!==h.ident)&&e.push(`${C()} - broken peer promise: expected ${h.ident} but found ${S&&S.ident}`)}else{let S=f.hoistedFrom.get(n.name),b=n.hoistedTo.get(h.name),I=`${S?` hoisted from ${S.join(", ")}`:""}`,T=`${b?` hoisted to ${b}`:""}`,N=`${C()}${I}`;E?E.ident!==h.ident&&e.push(`${N} - broken require promise for ${h.name}${T}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${N} - broken require promise: no required dependency ${h.name}${T} found`)}}s.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);s.delete(n)};return a(t,t.dependencies,t),e.join(` `)},Qgt=(t,e)=>{let{identName:r,name:s,reference:a,peerNames:n}=t,c={name:s,references:new Set([a]),locator:YW(r,a),ident:O2e(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},f=new Map([[t,c]]),p=(h,E)=>{let C=f.get(h),S=!!C;if(!C){let{name:b,identName:I,reference:T,peerNames:N,hoistPriority:U,dependencyKind:W}=h,ee=e.hoistingLimits.get(E.locator);C={name:b,references:new Set([T]),locator:YW(I,T),ident:O2e(I,T),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:ee?ee.has(b):!1,hoistPriority:U||0,dependencyKind:W||0,hoistedFrom:new Map,hoistedTo:new Map},f.set(h,C)}if(E.dependencies.set(h.name,C),E.originalDependencies.set(h.name,C),S){let b=new Set,I=T=>{if(!b.has(T)){b.add(T),T.decoupled=!1;for(let N of T.dependencies.values())T.peerNames.has(N.name)||I(N)}};I(C)}else for(let b of h.dependencies)p(b,C)};for(let h of t.dependencies)p(h,c);return c},JW=t=>t.substring(0,t.indexOf("@",1)),Rgt=t=>{let e={name:t.name,identName:JW(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),s=(a,n,c)=>{let f=r.has(a),p;if(n===a)p=c;else{let{name:h,references:E,locator:C}=a;p={name:h,identName:JW(C),references:E,dependencies:new Set}}if(c.dependencies.add(p),!f){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||s(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())s(a,t,e);return e},Tgt=t=>{let e=new Map,r=new Set([t]),s=c=>`${c.name}@${c.ident}`,a=c=>{let f=s(c),p=e.get(f);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(f,p)),p},n=(c,f)=>{let p=!!r.has(f);if(a(f).dependents.add(c.ident),!p){r.add(f);for(let E of f.dependencies.values()){let C=a(E);C.hoistPriority=Math.max(C.hoistPriority,E.hoistPriority),f.peerNames.has(E.name)?C.peerDependents.add(f.ident):n(f,E)}}};for(let c of t.dependencies.values())t.peerNames.has(c.name)||n(t,c);return e},yo=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let s=t.substring(e+1);if(s==="workspace:.")return".";if(s){let a=(s.indexOf("#")>0?s.split("#")[1]:s).replace("npm:","");return s.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`};var bD=t=>{let e=0,r=(a,n,c="")=>{if(e>5e4||n.has(a))return"";e++;let f=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(S!==E.name?`a:${E.name}:`:"")+yo(E.locator)+(C?` ${C}`:"")} `,p+=r(E,n,`${c}${h5e4?` Tree is too large, part of the tree has been dunped `:"")};var xD=(s=>(s.WORKSPACES="workspaces",s.DEPENDENCIES="dependencies",s.NONE="none",s))(xD||{}),_2e="node_modules",rg="$wsroot$";var kD=(t,e)=>{let{packageTree:r,hoistingLimits:s,errors:a,preserveSymlinksRequired:n}=Ngt(t,e),c=null;if(a.length===0){let f=M2e(r,{hoistingLimits:s});c=Lgt(t,f,e)}return{tree:c,errors:a,preserveSymlinksRequired:n}},pA=t=>`${t.name}@${t.reference}`,zW=t=>{let e=new Map;for(let[r,s]of t.entries())if(!s.dirList){let a=e.get(s.locator);a||(a={target:s.target,linkType:s.linkType,locations:[],aliases:s.aliases},e.set(s.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((s,a)=>{let n=s.split(J.delimiter).length,c=a.split(J.delimiter).length;return a===s?0:n!==c?c-n:a>s?1:-1});return e},H2e=(t,e)=>{let r=G.isVirtualLocator(t)?G.devirtualizeLocator(t):t,s=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e;return G.areLocatorsEqual(r,s)},KW=(t,e,r,s)=>{if(t.linkType!=="SOFT")return!1;let a=fe.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return J.contains(s,a)===null},Fgt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let s=fe.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},c=t.getDependencyTreeRoots(),f=new Map,p=new Set,h=(S,b)=>{let I=pA(S);if(p.has(I))return;p.add(I);let T=t.getPackageInformation(S);if(T){let N=b?pA(b):"";if(pA(S)!==N&&T.linkType==="SOFT"&&!S.reference.startsWith("link:")&&!KW(T,S,t,s)){let U=j2e(T,S,t);(!f.get(U)||S.reference.startsWith("workspace:"))&&f.set(U,S)}for(let[U,W]of T.packageDependencies)W!==null&&(T.packagePeers.has(U)||h(t.getLocator(U,W),S))}};for(let S of c)h(S,null);let E=s.split(J.sep);for(let S of f.values()){let b=t.getPackageInformation(S),T=fe.toPortablePath(b.packageLocation.slice(0,-1)).split(J.sep).slice(E.length),N=n;for(let U of T){let W=N.children.get(U);W||(W={children:new Map},N.children.set(U,W)),N=W}N.workspaceLocator=S}let C=(S,b)=>{if(S.workspaceLocator){let I=pA(b),T=a.get(I);T||(T=new Set,a.set(I,T)),T.add(S.workspaceLocator)}for(let I of S.children.values())C(I,S.workspaceLocator||b)};for(let S of n.children.values())C(S,n.workspaceLocator);return a},Ngt=(t,e)=>{let r=[],s=!1,a=new Map,n=Fgt(t),c=t.getPackageInformation(t.topLevel);if(c===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let f=t.findPackageLocator(c.packageLocation);if(f===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=fe.toPortablePath(c.packageLocation.slice(0,-1)),h={name:f.name,identName:f.name,reference:f.reference,peerNames:c.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,C=(b,I)=>`${pA(I)}:${b}`,S=(b,I,T,N,U,W,ee,ie)=>{let ue=C(b,T),le=E.get(ue),me=!!le;!me&&T.name===f.name&&T.reference===f.reference&&(le=h,E.set(ue,h));let pe=KW(I,T,t,p);if(!le){let Ae=0;pe?Ae=2:I.linkType==="SOFT"&&T.name.endsWith(rg)&&(Ae=1),le={name:b,identName:T.name,reference:T.reference,dependencies:new Set,peerNames:Ae===1?new Set:I.packagePeers,dependencyKind:Ae},E.set(ue,le)}let Be;if(pe?Be=2:U.linkType==="SOFT"?Be=1:Be=0,le.hoistPriority=Math.max(le.hoistPriority||0,Be),ie&&!pe){let Ae=pA({name:N.identName,reference:N.reference}),se=a.get(Ae)||new Set;a.set(Ae,se),se.add(le.name)}let Ce=new Map(I.packageDependencies);if(e.project){let Ae=e.project.workspacesByCwd.get(fe.toPortablePath(I.packageLocation.slice(0,-1)));if(Ae){let se=new Set([...Array.from(Ae.manifest.peerDependencies.values(),X=>G.stringifyIdent(X)),...Array.from(Ae.manifest.peerDependenciesMeta.keys())]);for(let X of se)Ce.has(X)||(Ce.set(X,W.get(X)||null),le.peerNames.add(X))}}let g=pA({name:T.name.replace(rg,""),reference:T.reference}),we=n.get(g);if(we)for(let Ae of we)Ce.set(`${Ae.name}${rg}`,Ae.reference);(I!==U||I.linkType!=="SOFT"||!pe&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(ee)))&&N.dependencies.add(le);let ye=T!==f&&I.linkType==="SOFT"&&!T.name.endsWith(rg)&&!pe;if(!me&&!ye){let Ae=new Map;for(let[se,X]of Ce)if(X!==null){let De=t.getLocator(se,X),Te=t.getLocator(se.replace(rg,""),X),mt=t.getPackageInformation(Te);if(mt===null)throw new Error("Assertion failed: Expected the package to have been registered");let j=KW(mt,De,t,p);if(e.validateExternalSoftLinks&&e.project&&j){mt.packageDependencies.size>0&&(s=!0);for(let[Ve,ke]of mt.packageDependencies)if(ke!==null){let it=G.parseLocator(Array.isArray(ke)?`${ke[0]}@${ke[1]}`:`${Ve}@${ke}`);if(pA(it)!==pA(De)){let Ue=Ce.get(Ve);if(Ue){let x=G.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${Ve}@${Ue}`);H2e(x,it)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(De.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,it)} conflicts with parent dependency ${G.prettyLocator(e.project.configuration,x)}`})}else{let x=Ae.get(Ve);if(x){let w=x.target,P=G.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${Ve}@${w}`);H2e(P,it)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(De.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,it)} conflicts with dependency ${G.prettyLocator(e.project.configuration,P)} from sibling portal ${G.prettyIdent(e.project.configuration,G.parseIdent(x.portal.name))}`})}else Ae.set(Ve,{target:it.reference,portal:De})}}}}let rt=e.hoistingLimitsByCwd?.get(ee),Fe=j?ee:J.relative(p,fe.toPortablePath(mt.packageLocation))||vt.dot,Ne=e.hoistingLimitsByCwd?.get(Fe);S(se,mt,De,le,I,Ce,Fe,rt==="dependencies"||Ne==="dependencies"||Ne==="workspaces")}}};return S(f.name,c,f,h,c,c.packageDependencies,vt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:s}};function j2e(t,e,r){let s=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return fe.toPortablePath(s||t.packageLocation)}function Ogt(t,e,r){let s=e.getLocator(t.name.replace(rg,""),t.reference),a=e.getPackageInformation(s);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:fe.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:j2e(a,t,e)}}var Lgt=(t,e,r)=>{let s=new Map,a=(E,C,S)=>{let{linkType:b,target:I}=Ogt(E,t,r);return{locator:pA(E),nodePath:C,target:I,linkType:b,aliases:S}},n=E=>{let[C,S]=E.split("/");return S?{scope:C,name:S}:{scope:null,name:C}},c=new Set,f=(E,C,S)=>{if(c.has(E))return;c.add(E);let b=Array.from(E.references).sort().join("#");for(let I of E.dependencies){let T=Array.from(I.references).sort().join("#");if(I.identName===E.identName.replace(rg,"")&&T===b)continue;let N=Array.from(I.references).sort(),U={name:I.identName,reference:N[0]},{name:W,scope:ee}=n(I.name),ie=ee?[ee,W]:[W],ue=J.join(C,_2e),le=J.join(ue,...ie),me=`${S}/${U.name}`,pe=a(U,S,N.slice(1)),Be=!1;if(pe.linkType==="SOFT"&&r.project){let Ce=r.project.workspacesByCwd.get(pe.target.slice(0,-1));Be=!!(Ce&&!Ce.manifest.name)}if(!I.name.endsWith(rg)&&!Be){let Ce=s.get(le);if(Ce){if(Ce.dirList)throw new Error(`Assertion failed: ${le} cannot merge dir node with leaf node`);{let ye=G.parseLocator(Ce.locator),Ae=G.parseLocator(pe.locator);if(Ce.linkType!==pe.linkType)throw new Error(`Assertion failed: ${le} cannot merge nodes with different link types ${Ce.nodePath}/${G.stringifyLocator(ye)} and ${S}/${G.stringifyLocator(Ae)}`);if(ye.identHash!==Ae.identHash)throw new Error(`Assertion failed: ${le} cannot merge nodes with different idents ${Ce.nodePath}/${G.stringifyLocator(ye)} and ${S}/s${G.stringifyLocator(Ae)}`);pe.aliases=[...pe.aliases,...Ce.aliases,G.parseLocator(Ce.locator).reference]}}s.set(le,pe);let g=le.split("/"),we=g.indexOf(_2e);for(let ye=g.length-1;we>=0&&ye>we;ye--){let Ae=fe.toPortablePath(g.slice(0,ye).join(J.sep)),se=g[ye],X=s.get(Ae);if(!X)s.set(Ae,{dirList:new Set([se])});else if(X.dirList){if(X.dirList.has(se))break;X.dirList.add(se)}}}f(I,pe.linkType==="SOFT"?pe.target:le,me)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return s.set(h,p),f(e,h,""),s};Ge();Ge();Dt();Dt();eA();wc();var gY={};Vt(gY,{PnpInstaller:()=>Gm,PnpLinker:()=>sg,UnplugCommand:()=>Sw,default:()=>pdt,getPnpPath:()=>og,jsInstallUtils:()=>gA,pnpUtils:()=>HD,quotePathIfNeeded:()=>DBe});Dt();var SBe=Ie("url");Ge();Ge();Dt();Dt();var G2e={DEFAULT:{collapsed:!1,next:{"*":"DEFAULT"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA","*":"DEFAULT"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{"*":"FALLBACK_EXCLUSION_ENTRIES"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{"*":"FALLBACK_EXCLUSION_DATA"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{"*":"DEFAULT"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{"*":"PACKAGE_REGISTRY_ENTRIES"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_STORE_DATA"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{"*":"PACKAGE_STORE_ENTRIES"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_INFORMATION_DATA"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES","*":"DEFAULT"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{"*":"PACKAGE_DEPENDENCY"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{"*":"DEFAULT"}}};function Mgt(t,e,r){let s="";s+="[";for(let a=0,n=t.length;a"u"||(f!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=rN(p,h,e,r).replace(/^ +/g,""),f+=1)}return a+="}",a}function Hgt(t,e,r){let s=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ `;let c=0;for(let f=0,p=s.length;f"u"||(c!==0&&(n+=",",n+=` `),n+=a,n+=JSON.stringify(h),n+=": ",n+=rN(h,E,e,a).replace(/^ +/g,""),c+=1)}return c!==0&&(n+=` `),n+=r,n+="}",n}function rN(t,e,r,s){let{next:a}=G2e[r],n=a[t]||a["*"];return q2e(e,n,s)}function q2e(t,e,r){let{collapsed:s}=G2e[e];return Array.isArray(t)?s?Mgt(t,e,r):Ugt(t,e,r):typeof t=="object"&&t!==null?s?_gt(t,e,r):Hgt(t,e,r):JSON.stringify(t)}function W2e(t){return q2e(t,"TOP_LEVEL","")}function QD(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let s=[];for(let n of e)s.push(r.map(c=>n(c)));let a=r.map((n,c)=>c);return a.sort((n,c)=>{for(let f of s){let p=f[n]f[c]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function jgt(t){let e=new Map,r=QD(t.fallbackExclusionList||[],[({name:s,reference:a})=>s,({name:s,reference:a})=>a]);for(let{name:s,reference:a}of r){let n=e.get(s);typeof n>"u"&&e.set(s,n=new Set),n.add(a)}return Array.from(e).map(([s,a])=>[s,Array.from(a)])}function Ggt(t){return QD(t.fallbackPool||[],([e])=>e)}function qgt(t){let e=[],r=t.dependencyTreeRoots.find(s=>t.packageRegistry.get(s.name)?.get(s.reference)?.packageLocation==="./");for(let[s,a]of QD(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){if(s===null)continue;let n=[];e.push([s,n]);for(let[c,{packageLocation:f,packageDependencies:p,packagePeers:h,linkType:E,discardFromLookup:C}]of QD(a,([S])=>S===null?"0":`1${S}`)){if(c===null)continue;let S=[];s!==null&&c!==null&&!p.has(s)&&S.push([s,c]);for(let[U,W]of p)S.push([U,W]);let b=QD(S,([U])=>U),I=h&&h.size>0?Array.from(h):void 0,N={packageLocation:f,packageDependencies:b,packagePeers:I,linkType:E,discardFromLookup:C||void 0};n.push([c,N]),r&&s===r.name&&c===r.reference&&e.unshift([null,[[null,N]]])}}return e}function RD(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,pnpZipBackend:t.pnpZipBackend,fallbackExclusionList:jgt(t),fallbackPool:Ggt(t),packageRegistryData:qgt(t)}}var J2e=ut(V2e());function K2e(t,e){return[t?`${t} `:"",`/* eslint-disable */ `,`// @ts-nocheck `,`"use strict"; `,` `,e,` `,(0,J2e.default)()].join("")}function Wgt(t){return JSON.stringify(t,null,2)}function Ygt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ `)}'`}function Vgt(t){return[`const RAW_RUNTIME_STATE = `,`${Ygt(W2e(t))}; `,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { `,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); `,`} `].join("")}function Jgt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { `,` const fs = require('fs'); `,` const path = require('path'); `,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(Er.pnpData)}); `,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); `,`} `].join("")}function z2e(t){let e=RD(t),r=Vgt(e);return K2e(t.shebang,r)}function Z2e(t){let e=RD(t),r=Jgt(),s=K2e(t.shebang,r);return{dataFile:Wgt(e),loaderFile:s}}Dt();function XW(t,{basePath:e}){let r=fe.toPortablePath(e),s=J.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,c=new Map(t.packageRegistryData.map(([C,S])=>[C,new Map(S.map(([b,I])=>{if(C===null!=(b===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let T=I.discardFromLookup??!1,N={name:C,reference:b},U=n.get(I.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&T,T||(U.locator=N)):n.set(I.packageLocation,{locator:N,discardFromLookup:T});let W=null;return[b,{packageDependencies:new Map(I.packageDependencies),packagePeers:new Set(I.packagePeers),linkType:I.linkType,discardFromLookup:T,get packageLocation(){return W||(W=J.join(s,I.packageLocation))}}]}))])),f=new Map(t.fallbackExclusionList.map(([C,S])=>[C,new Set(S)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:f,pnpZipBackend:t.pnpZipBackend,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:c}}Dt();Dt();var sh=Ie("module"),jm=Ie("url"),lY=Ie("util");var ta=Ie("url");var tBe=ut(Ie("assert"));var $W=Array.isArray,TD=JSON.stringify,FD=Object.getOwnPropertyNames,Hm=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),eY=(t,e)=>RegExp.prototype.exec.call(t,e),tY=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),ng=(t,...e)=>String.prototype.endsWith.apply(t,e),rY=(t,...e)=>String.prototype.includes.apply(t,e),nY=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),ND=(t,...e)=>String.prototype.indexOf.apply(t,e),X2e=(t,...e)=>String.prototype.replace.apply(t,e),ig=(t,...e)=>String.prototype.slice.apply(t,e),hA=(t,...e)=>String.prototype.startsWith.apply(t,e),$2e=Map,eBe=JSON.parse;function OD(t,e,r){return class extends r{constructor(...s){super(e(...s)),this.code=t,this.name=`${r.name} [${t}]`}}}var rBe=OD("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),iY=OD("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),nBe=OD("ERR_INVALID_PACKAGE_TARGET",(t,e,r,s=!1,a=void 0)=>{let n=typeof r=="string"&&!s&&r.length&&!hA(r,"./");return e==="."?((0,tBe.default)(s===!1),`Invalid "exports" main target ${TD(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${s?"imports":"exports"}" target ${TD(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),LD=OD("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),iBe=OD("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var iN=Ie("url");function sBe(t,e){let r=Object.create(null);for(let s=0;se):t+e}MD(r,t,s,c,a)}eY(aBe,ig(t,2))!==null&&MD(r,t,s,c,a);let p=new URL(t,s),h=p.pathname,E=new URL(".",s).pathname;if(hA(h,E)||MD(r,t,s,c,a),e==="")return p;if(eY(aBe,e)!==null){let C=n?X2e(r,"*",()=>e):r+e;Zgt(C,s,c,a)}return n?new URL(tY(lBe,p.href,()=>e)):new URL(e,p)}function $gt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function vw(t,e,r,s,a,n,c,f){if(typeof e=="string")return Xgt(e,r,s,t,a,n,c,f);if($W(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:s===-1||t.length>e.length?-1:e.length>t.length?1:0}function edt(t,e,r){if(typeof t=="string"||$W(t))return!0;if(typeof t!="object"||t===null)return!1;let s=FD(t),a=!1,n=0;for(let c=0;c=h.length&&ng(e,C)&&uBe(n,h)===1&&nY(h,"*")===E&&(n=h,c=ig(e,E,e.length-C.length))}}if(n){let p=r[n],h=vw(t,p,c,n,s,!0,!1,a);return h==null&&sY(e,t,s),h}sY(e,t,s)}function ABe({name:t,base:e,conditions:r,readFileSyncFn:s}){if(t==="#"||hA(t,"#/")||ng(t,"/")){let c="is not a valid internal imports specifier name";throw new iY(t,c,(0,ta.fileURLToPath)(e))}let a,n=oBe(e,s);if(n.exists){a=(0,ta.pathToFileURL)(n.pjsonPath);let c=n.imports;if(c)if(Hm(c,t)&&!rY(t,"*")){let f=vw(a,c[t],"",t,e,!1,!0,r);if(f!=null)return f}else{let f="",p,h=FD(c);for(let E=0;E=C.length&&ng(t,b)&&uBe(f,C)===1&&nY(C,"*")===S&&(f=C,p=ig(t,S,t.length-b.length))}}if(f){let E=c[f],C=vw(a,E,p,f,e,!0,!0,r);if(C!=null)return C}}}zgt(t,a,e)}Dt();var rdt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function gs(t,e,r={},s){s??=rdt.has(t)?"MODULE_NOT_FOUND":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:s},pnpCode:{...a,value:t},data:{...a,value:r}})}function lf(t){return fe.normalize(fe.fromPortablePath(t))}var dBe=ut(hBe());function mBe(t){return ndt(),aY[t]}var aY;function ndt(){aY||(aY={"--conditions":[],...gBe(idt()),...gBe(process.execArgv)})}function gBe(t){return(0,dBe.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function idt(){let t=[],e=sdt(process.env.NODE_OPTIONS||"",t);return t.length,e}function sdt(t,e){let r=[],s=!1,a=!0;for(let n=0;nparseInt(t,10)),yBe=ml>19||ml===19&&ih>=2||ml===18&&ih>=13,IXt=ml===20&&ih<6||ml===19&&ih>=3,CXt=ml>19||ml===19&&ih>=6,wXt=ml>=21||ml===20&&ih>=10||ml===18&&ih>=19,BXt=ml>=21||ml===20&&ih>=10||ml===18&&ih>=20,vXt=ml>=22;function EBe(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>fe.fromPortablePath(uo.resolveVirtual(fe.toPortablePath(e)))),yBe)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function cY(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,s=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,c=/\/$/,f=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Fe of["react-scripts","gatsby"]){let Ne=t.packageRegistry.get(Fe);if(Ne)for(let be of Ne.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Fe,reference:be})}}let{ignorePattern:C,packageRegistry:S,packageLocatorsByLocations:b}=t;function I(Fe,Ne){return{fn:Fe,args:Ne,error:null,result:null}}function T(Fe){let Ne=process.stderr?.hasColors?.()??process.stdout.isTTY,be=(it,Ue)=>`\x1B[${it}m${Ue}\x1B[0m`,Ve=Fe.error;console.error(Ve?be("31;1",`\u2716 ${Fe.error?.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),Fe.args.length>0&&console.error();for(let it of Fe.args)console.error(` ${be("37;1","In \u2190")} ${(0,lY.inspect)(it,{colors:Ne,compact:!0})}`);Fe.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,lY.inspect)(Fe.result,{colors:Ne,compact:!0})}`));let ke=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(ke.length>0){console.error();for(let it of ke)console.error(` ${be("38;5;244",it)}`)}console.error()}function N(Fe,Ne){if(e.allowDebug===!1)return Ne;if(Number.isFinite(s)){if(s>=2)return(...be)=>{let Ve=I(Fe,be);try{return Ve.result=Ne(...be)}catch(ke){throw Ve.error=ke}finally{T(Ve)}};if(s>=1)return(...be)=>{try{return Ne(...be)}catch(Ve){let ke=I(Fe,be);throw ke.error=Ve,T(ke),Ve}}}return Ne}function U(Fe){let Ne=g(Fe);if(!Ne)throw gs("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Ne}function W(Fe){if(Fe.name===null)return!0;for(let Ne of t.dependencyTreeRoots)if(Ne.name===Fe.name&&Ne.reference===Fe.reference)return!0;return!1}let ee=new Set(["node","require",...mBe("--conditions")]);function ie(Fe,Ne=ee,be){let Ve=Ae(J.join(Fe,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(Ve===null)throw gs("INTERNAL",`The locator that owns the "${Fe}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ke}=U(Ve),it=J.join(ke,Er.manifest);if(!e.fakeFs.existsSync(it))return null;let Ue=JSON.parse(e.fakeFs.readFileSync(it,"utf8"));if(Ue.exports==null)return null;let x=J.contains(ke,Fe);if(x===null)throw gs("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");x!=="."&&!f.test(x)&&(x=`./${x}`);try{let w=fBe({packageJSONUrl:(0,jm.pathToFileURL)(fe.fromPortablePath(it)),packageSubpath:x,exports:Ue.exports,base:be?(0,jm.pathToFileURL)(fe.fromPortablePath(be)):null,conditions:Ne});return fe.toPortablePath((0,jm.fileURLToPath)(w))}catch(w){throw gs("EXPORTS_RESOLUTION_FAILED",w.message,{unqualifiedPath:lf(Fe),locator:Ve,pkgJson:Ue,subpath:lf(x),conditions:Ne},w.code)}}function ue(Fe,Ne,{extensions:be}){let Ve;try{Ne.push(Fe),Ve=e.fakeFs.statSync(Fe)}catch{}if(Ve&&!Ve.isDirectory())return e.fakeFs.realpathSync(Fe);if(Ve&&Ve.isDirectory()){let ke;try{ke=JSON.parse(e.fakeFs.readFileSync(J.join(Fe,Er.manifest),"utf8"))}catch{}let it;if(ke&&ke.main&&(it=J.resolve(Fe,ke.main)),it&&it!==Fe){let Ue=ue(it,Ne,{extensions:be});if(Ue!==null)return Ue}}for(let ke=0,it=be.length;ke{let x=JSON.stringify(Ue.name);if(Ve.has(x))return;Ve.add(x);let w=we(Ue);for(let P of w)if(U(P).packagePeers.has(Fe))ke(P);else{let F=be.get(P.name);typeof F>"u"&&be.set(P.name,F=new Set),F.add(P.reference)}};ke(Ne);let it=[];for(let Ue of[...be.keys()].sort())for(let x of[...be.get(Ue)].sort())it.push({name:Ue,reference:x});return it}function Ae(Fe,{resolveIgnored:Ne=!1,includeDiscardFromLookup:be=!1}={}){if(pe(Fe)&&!Ne)return null;let Ve=J.relative(t.basePath,Fe);Ve.match(n)||(Ve=`./${Ve}`),Ve.endsWith("/")||(Ve=`${Ve}/`);do{let ke=b.get(Ve);if(typeof ke>"u"||ke.discardFromLookup&&!be){Ve=Ve.substring(0,Ve.lastIndexOf("/",Ve.length-2)+1);continue}return ke.locator}while(Ve!=="");return null}function se(Fe){try{return e.fakeFs.readFileSync(fe.toPortablePath(Fe),"utf8")}catch(Ne){if(Ne.code==="ENOENT")return;throw Ne}}function X(Fe,Ne,{considerBuiltins:be=!0}={}){if(Fe.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Fe==="pnpapi")return fe.toPortablePath(e.pnpapiResolution);if(be&&(0,sh.isBuiltin)(Fe))return null;let Ve=lf(Fe),ke=Ne&&lf(Ne);if(Ne&&pe(Ne)&&(!J.isAbsolute(Fe)||Ae(Fe)===null)){let x=me(Fe,Ne);if(x===!1)throw gs("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) Require request: "${Ve}" Required by: ${ke} `,{request:Ve,issuer:ke});return fe.toPortablePath(x)}let it,Ue=Fe.match(a);if(Ue){if(!Ne)throw gs("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ve,issuer:ke});let[,x,w]=Ue,P=Ae(Ne);if(!P){let Re=me(Fe,Ne);if(Re===!1)throw gs("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). Require path: "${Ve}" Required by: ${ke} `,{request:Ve,issuer:ke});return fe.toPortablePath(Re)}let F=U(P).packageDependencies.get(x),z=null;if(F==null&&P.name!==null){let Re=t.fallbackExclusionList.get(P.name);if(!Re||!Re.has(P.reference)){for(let Ct=0,qt=h.length;CtW(lt))?Z=gs("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${P.name}@${P.reference} (via ${ke}) ${Re.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} `).join("")} `,{request:Ve,issuer:ke,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Re}):Z=gs("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${P.name}@${P.reference} (via ${ke}) ${Re.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} `).join("")} `,{request:Ve,issuer:ke,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Re})}else F===void 0&&(!be&&(0,sh.isBuiltin)(Fe)?W(P)?Z=gs("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${ke} `,{request:Ve,issuer:ke,dependencyName:x}):Z=gs("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${P.name}'s dependencies, this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${ke} `,{request:Ve,issuer:ke,issuerLocator:Object.assign({},P),dependencyName:x}):W(P)?Z=gs("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${ke} `,{request:Ve,issuer:ke,dependencyName:x}):Z=gs("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. Required package: ${x}${x!==Ve?` (via "${Ve}")`:""} Required by: ${P.name}@${P.reference} (via ${ke}) `,{request:Ve,issuer:ke,issuerLocator:Object.assign({},P),dependencyName:x}));if(F==null){if(z===null||Z===null)throw Z||new Error("Assertion failed: Expected an error to have been set");F=z;let Re=Z.message.replace(/\n.*/g,"");Z.message=Re,!E.has(Re)&&s!==0&&(E.add(Re),process.emitWarning(Z))}let $=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:x,reference:F},oe=U($);if(!oe.packageLocation)throw gs("MISSING_DEPENDENCY",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. Required package: ${$.name}@${$.reference}${$.name!==Ve?` (via "${Ve}")`:""} Required by: ${P.name}@${P.reference} (via ${ke}) `,{request:Ve,issuer:ke,dependencyLocator:Object.assign({},$)});let xe=oe.packageLocation;w?it=J.join(xe,w):it=xe}else if(J.isAbsolute(Fe))it=J.normalize(Fe);else{if(!Ne)throw gs("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ve,issuer:ke});let x=J.resolve(Ne);Ne.match(c)?it=J.normalize(J.join(x,Fe)):it=J.normalize(J.join(J.dirname(x),Fe))}return J.normalize(it)}function De(Fe,Ne,be=ee,Ve){if(n.test(Fe))return Ne;let ke=ie(Ne,be,Ve);return ke?J.normalize(ke):Ne}function Te(Fe,{extensions:Ne=Object.keys(sh.Module._extensions)}={}){let be=[],Ve=ue(Fe,be,{extensions:Ne});if(Ve)return J.normalize(Ve);{EBe(be.map(Ue=>fe.fromPortablePath(Ue)));let ke=lf(Fe),it=Ae(Fe);if(it){let{packageLocation:Ue}=U(it),x=!0;try{e.fakeFs.accessSync(Ue)}catch(w){if(w?.code==="ENOENT")x=!1;else{let P=(w?.message??w??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw gs("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${P}). Missing package: ${it.name}@${it.reference} Expected package location: ${lf(Ue)} `,{unqualifiedPath:ke,extensions:Ne})}}if(!x){let w=Ue.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw gs("QUALIFIED_PATH_RESOLUTION_FAILED",`${w} Missing package: ${it.name}@${it.reference} Expected package location: ${lf(Ue)} `,{unqualifiedPath:ke,extensions:Ne})}}throw gs("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. Source path: ${ke} ${be.map(Ue=>`Not found: ${lf(Ue)} `).join("")}`,{unqualifiedPath:ke,extensions:Ne})}}function mt(Fe,Ne,be){if(!Ne)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let Ve=ABe({name:Fe,base:(0,jm.pathToFileURL)(fe.fromPortablePath(Ne)),conditions:be.conditions??ee,readFileSyncFn:se});if(Ve instanceof URL)return Te(fe.toPortablePath((0,jm.fileURLToPath)(Ve)),{extensions:be.extensions});if(Ve.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return j(Ve,Ne,be)}function j(Fe,Ne,be={}){try{if(Fe.startsWith("#"))return mt(Fe,Ne,be);let{considerBuiltins:Ve,extensions:ke,conditions:it}=be,Ue=X(Fe,Ne,{considerBuiltins:Ve});if(Fe==="pnpapi")return Ue;if(Ue===null)return null;let x=()=>Ne!==null?pe(Ne):!1,w=(!Ve||!(0,sh.isBuiltin)(Fe))&&!x()?De(Fe,Ue,it,Ne):Ue;return Te(w,{extensions:ke})}catch(Ve){throw Object.hasOwn(Ve,"pnpCode")&&Object.assign(Ve.data,{request:lf(Fe),issuer:Ne&&lf(Ne)}),Ve}}function rt(Fe){let Ne=J.normalize(Fe),be=uo.resolveVirtual(Ne);return be!==Ne?be:null}return{VERSIONS:Be,topLevel:Ce,getLocator:(Fe,Ne)=>Array.isArray(Ne)?{name:Ne[0],reference:Ne[1]}:{name:Fe,reference:Ne},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Fe=[];for(let[Ne,be]of S)for(let Ve of be.keys())Ne!==null&&Ve!==null&&Fe.push({name:Ne,reference:Ve});return Fe},getPackageInformation:Fe=>{let Ne=g(Fe);if(Ne===null)return null;let be=fe.fromPortablePath(Ne.packageLocation);return{...Ne,packageLocation:be}},findPackageLocator:Fe=>Ae(fe.toPortablePath(Fe)),resolveToUnqualified:N("resolveToUnqualified",(Fe,Ne,be)=>{let Ve=Ne!==null?fe.toPortablePath(Ne):null,ke=X(fe.toPortablePath(Fe),Ve,be);return ke===null?null:fe.fromPortablePath(ke)}),resolveUnqualified:N("resolveUnqualified",(Fe,Ne)=>fe.fromPortablePath(Te(fe.toPortablePath(Fe),Ne))),resolveRequest:N("resolveRequest",(Fe,Ne,be)=>{let Ve=Ne!==null?fe.toPortablePath(Ne):null,ke=j(fe.toPortablePath(Fe),Ve,be);return ke===null?null:fe.fromPortablePath(ke)}),resolveVirtual:N("resolveVirtual",Fe=>{let Ne=rt(fe.toPortablePath(Fe));return Ne!==null?fe.fromPortablePath(Ne):null})}}Dt();var IBe=(t,e,r)=>{let s=RD(t),a=XW(s,{basePath:e}),n=fe.join(e,Er.pnpCjs);return cY(a,{fakeFs:r,pnpapiResolution:n})};var fY=ut(wBe());Yt();var gA={};Vt(gA,{checkManifestCompatibility:()=>BBe,extractBuildRequest:()=>sN,getExtractHint:()=>AY,hasBindingGyp:()=>pY});Ge();Dt();function BBe(t){return G.isPackageCompatible(t,fs.getArchitectureSet())}function sN(t,e,r,{configuration:s}){let a=[];for(let n of["preinstall","install","postinstall"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:t.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${G.prettyLocator(s,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${G.prettyLocator(s,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!s.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${G.prettyLocator(s,t)} lists build scripts, but all build scripts have been disabled.`)}:BBe(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${G.prettyLocator(s,t)} The ${fs.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var adt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function AY(t){return t.packageFs.getExtractHint({relevantExtensions:adt})}function pY(t){let e=J.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var HD={};Vt(HD,{getUnpluggedPath:()=>_D});Ge();Dt();function _D(t,{configuration:e}){return J.resolve(e.get("pnpUnpluggedFolder"),G.slugifyLocator(t))}var ldt=new Set([G.makeIdent(null,"open").identHash,G.makeIdent(null,"opn").identHash]),sg=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let s=og(r.project).cjs;if(!ce.existsSync(s))throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=je.getFactoryWithDefault(this.pnpCache,s,()=>je.dynamicRequire(s,{cachingStrategy:je.CachingStrategy.FsTime})),n={name:G.stringifyIdent(e),reference:e.reference},c=a.getPackageInformation(n);if(!c)throw new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return fe.toPortablePath(c.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=og(r.project).cjs;if(!ce.existsSync(s))return null;let n=je.getFactoryWithDefault(this.pnpCache,s,()=>je.dynamicRequire(s,{cachingStrategy:je.CachingStrategy.FsTime})).findPackageLocator(fe.fromPortablePath(e));return n?G.makeLocator(G.parseIdent(n.name),n.reference):null}makeInstaller(e){return new Gm(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},Gm=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new je.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,s){let a=G.stringifyIdent(e),n=e.reference,c=!!this.opts.project.tryWorkspaceByLocator(e),f=G.isVirtualLocator(e),p=e.peerDependencies.size>0&&!f,h=!p&&!c,E=!p&&e.linkType!=="SOFT",C,S;if(h||E){let ee=f?G.devirtualizeLocator(e):e;C=this.customData.store.get(ee.locatorHash),typeof C>"u"&&(C=await cdt(r),e.linkType==="HARD"&&this.customData.store.set(ee.locatorHash,C)),C.manifest.type==="module"&&(this.isESMLoaderRequired=!0),S=this.opts.project.getDependencyMeta(ee,e.version)}let b=h?sN(e,C,S,{configuration:this.opts.project.configuration}):null,I=E?await this.unplugPackageIfNeeded(e,C,r,S,s):r.packageFs;if(J.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let T=J.resolve(I.getRealPath(),r.prefixPath),N=hY(this.opts.project.cwd,T),U=new Map,W=new Set;if(f){for(let ee of e.peerDependencies.values())U.set(G.stringifyIdent(ee),null),W.add(G.stringifyIdent(ee));if(!c){let ee=G.devirtualizeLocator(e);this.virtualTemplates.set(ee.locatorHash,{location:hY(this.opts.project.cwd,uo.resolveVirtual(T)),locator:ee})}}return je.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:W,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:T,buildRequest:b}}async attachInternalDependencies(e,r){let s=this.getPackageInformation(e);for(let[a,n]of r){let c=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];s.packageDependencies.set(G.stringifyIdent(a),c)}}async attachExternalDependents(e,r){for(let s of r)this.getDiskInformation(s).packageDependencies.set(G.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=og(this.opts.project);if(this.isEsmEnabled()||await ce.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await ce.removePromise(e.cjs),await ce.removePromise(e.data),await ce.removePromise(e.esmLoader),await ce.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:C,location:S}of this.virtualTemplates.values())je.getMapWithDefault(this.packageRegistry,G.stringifyIdent(C)).set(C.reference,{packageLocation:S,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});let r=this.opts.project.configuration.get("pnpFallbackMode"),s=this.opts.project.workspaces.map(({anchoredLocator:C})=>({name:G.stringifyIdent(C),reference:C.reference})),a=r!=="none",n=[],c=new Map,f=je.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang"),E=this.opts.project.configuration.get("pnpZipBackend");if(r==="dependencies-only")for(let C of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(C)&&n.push({name:G.stringifyIdent(C),reference:C.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:s,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:c,ignorePattern:f,pnpZipBackend:E,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=og(this.opts.project),s=await this.locateNodeModules(e.ignorePattern);if(s.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of s)await ce.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=z2e(e);await ce.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ce.removePromise(r.data)}else{let{dataFile:n,loaderFile:c}=Z2e(e);await ce.changeFilePromise(r.cjs,c,{automaticNewlines:!0,mode:493}),await ce.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await ce.changeFilePromise(r.esmLoader,(0,fY.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await ce.removePromise(a);else for(let n of await ce.readdirPromise(a)){let c=J.resolve(a,n);this.unpluggedPaths.has(c)||await ce.removePromise(c)}}async locateNodeModules(e){let r=[],s=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=J.join(a.cwd,"node_modules");if(s&&s.test(J.relative(this.opts.project.cwd,a.cwd))||!ce.existsSync(n))continue;let c=await ce.readdirPromise(n,{withFileTypes:!0}),f=c.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(f.length===c.length)r.push(n);else for(let p of f)r.push(J.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,s,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,s,n):s.packageFs}shouldBeUnplugged(e,r,s){return typeof s.unplugged<"u"?s.unplugged:ldt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(sN(e,r,s,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,s){let a=_D(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new _f(a,{baseFs:r.packageFs,pathUtils:J}):(this.unpluggedPaths.add(a),s.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=J.join(a,r.prefixPath,".ready");await ce.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await ce.mkdirPromise(a,{recursive:!0}),await ce.copyPromise(a,vt.dot,{baseFs:r.packageFs,overwrite:!1}),await ce.writeFilePromise(n,""))})),new Sn(a))}getPackageInformation(e){let r=G.stringifyIdent(e),s=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${G.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(s);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${G.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=je.getMapWithDefault(this.packageRegistry,"@@disk"),s=hY(this.opts.project.cwd,e);return je.getFactoryWithDefault(r,s,()=>({packageLocation:s,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function hY(t,e){let r=J.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function cdt(t){let e=await Ut.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Ut,r=new Set(["preinstall","install","postinstall"]);for(let s of e.scripts.keys())r.has(s)||e.scripts.delete(s);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:AY(t),hasBindingGyp:pY(t)}}}Ge();Ge();Yt();var vBe=ut(Go());var Sw=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=ge.Rest()}static{this.paths=[["unplug"]]}static{this.usage=ot.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new nt("This command can only be used if the `nodeLinker` option is set to `pnp`");await s.restoreInstallState();let c=new Set(this.patterns),f=this.patterns.map(b=>{let I=G.parseDescriptor(b),T=I.range!=="unknown"?I:G.makeDescriptor(I,"*");if(!Fr.validRange(T.range))throw new nt(`The range of the descriptor patterns must be a valid semver range (${G.prettyDescriptor(r,T)})`);return N=>{let U=G.stringifyIdent(N);return!vBe.default.isMatch(U,G.stringifyIdent(T))||N.version&&!Fr.satisfiesWithPrereleases(N.version,T.range)?!1:(c.delete(b),!0)}}),p=()=>{let b=[];for(let I of s.storedPackages.values())!s.tryWorkspaceByLocator(I)&&!G.isVirtualLocator(I)&&f.some(T=>T(I))&&b.push(I);return b},h=b=>{let I=new Set,T=[],N=(U,W)=>{if(I.has(U.locatorHash))return;let ee=!!s.tryWorkspaceByLocator(U);if(!(W>0&&!this.recursive&&ee)&&(I.add(U.locatorHash),!s.tryWorkspaceByLocator(U)&&f.some(ie=>ie(U))&&T.push(U),!(W>0&&!this.recursive)))for(let ie of U.dependencies.values()){let ue=s.storedResolutions.get(ie.descriptorHash);if(!ue)throw new Error("Assertion failed: The resolution should have been registered");let le=s.storedPackages.get(ue);if(!le)throw new Error("Assertion failed: The package should have been registered");N(le,W+1)}};for(let U of b)N(U.anchoredPackage,0);return T},E,C;if(this.all&&this.recursive?(E=p(),C="the project"):this.all?(E=h(s.workspaces),C="any workspace"):(E=h([a]),C="this workspace"),c.size>1)throw new nt(`Patterns ${he.prettyList(r,c,he.Type.CODE)} don't match any packages referenced by ${C}`);if(c.size>0)throw new nt(`Pattern ${he.prettyList(r,c,he.Type.CODE)} doesn't match any packages referenced by ${C}`);E=je.sortMap(E,b=>G.stringifyLocator(b));let S=await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async b=>{for(let I of E){let T=I.version??"unknown",N=s.topLevelWorkspace.manifest.ensureDependencyMeta(G.makeDescriptor(I,T));N.unplugged=!0,b.reportInfo(0,`Will unpack ${G.prettyLocator(r,I)} to ${he.pretty(r,_D(I,{configuration:r}),he.Type.PATH)}`),b.reportJson({locator:G.stringifyLocator(I),version:T})}await s.topLevelWorkspace.persistManifest(),this.json||b.reportSeparator()});return S.hasErrors()?S.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var og=t=>({cjs:J.join(t.cwd,Er.pnpCjs),data:J.join(t.cwd,Er.pnpData),esmLoader:J.join(t.cwd,Er.pnpEsmLoader)}),DBe=t=>/\s/.test(t)?JSON.stringify(t):t;async function udt(t,e,r){let s=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=(e.NODE_OPTIONS??"").replace(s," ").replace(a," ").trim();if(t.configuration.get("nodeLinker")!=="pnp"){e.NODE_OPTIONS=n||void 0;return}let c=og(t),f=`--require ${DBe(fe.fromPortablePath(c.cjs))}`;ce.existsSync(c.esmLoader)&&(f=`${f} --experimental-loader ${(0,SBe.pathToFileURL)(fe.fromPortablePath(c.esmLoader)).href}`),ce.existsSync(c.cjs)&&(e.NODE_OPTIONS=n?`${f} ${n}`:f)}async function fdt(t,e){let r=og(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var Adt={hooks:{populateYarnPaths:fdt,setupScriptEnvironment:udt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},minizip:{description:"Whether Yarn should use minizip to extract archives",type:"BOOLEAN",default:!1},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpZipBackend:{description:"Whether to use the experimental js implementation for the ZipFS",type:"STRING",values:["libzip","js"],default:"libzip"},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[sg],commands:[Sw]},pdt=Adt;var FBe=ut(QBe());Yt();var wY=ut(Ie("crypto")),NBe=ut(Ie("fs")),OBe=1,Ri="node_modules",oN=".bin",LBe=".yarn-state.yml",kdt=1e3,BY=(s=>(s.CLASSIC="classic",s.HARDLINKS_LOCAL="hardlinks-local",s.HARDLINKS_GLOBAL="hardlinks-global",s))(BY||{}),jD=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let s=r.project.tryWorkspaceByLocator(e);if(s)return s.cwd;let a=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await CY(r.project,{unrollAliases:!0}));if(a===null)throw new nt("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(G.stringifyLocator(e));if(!n){let p=new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let c=n.locations.sort((p,h)=>p.split(J.sep).length-h.split(J.sep).length),f=J.join(r.project.configuration.startingCwd,Ri);return c.find(p=>J.contains(f,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=await je.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await CY(r.project,{unrollAliases:!0}));if(s===null)return null;let{locationRoot:a,segments:n}=aN(J.resolve(e),{skipPrefix:r.project.cwd}),c=s.locationTree.get(a);if(!c)return null;let f=c.locator;for(let p of n){if(c=c.children.get(p),!c)break;f=c.locator||f}return G.parseLocator(f)}makeInstaller(e){return new IY(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},IY=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let s=J.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await Qdt(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!G.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,c=new Set;n.has(G.stringifyIdent(e))||n.set(G.stringifyIdent(e),e.reference);let f=e;if(G.isVirtualLocator(e)){f=G.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(G.stringifyIdent(E),null),c.add(G.stringifyIdent(E))}let p={packageLocation:`${fe.fromPortablePath(s)}/`,packageDependencies:n,packagePeers:c,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(f.locatorHash,h),{packageLocation:s,buildRequest:null}}async attachInternalDependencies(e,r){let s=this.localStore.get(e.locatorHash);if(typeof s>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let c=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];s.pnpNode.packageDependencies.set(G.stringifyIdent(a),c)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new uo({baseFs:new $f({maxOpenFiles:80,readOnlyArchives:!0})}),r=await CY(this.opts.project),s=this.opts.project.configuration.get("nmMode");(r===null||s!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:s,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(S=>{let b=this.opts.project.configuration.get("nmHoistingLimits");try{b=je.validateEnum(xD,S.manifest.installConfig?.hoistingLimits??b)}catch{let I=G.prettyWorkspace(this.opts.project.configuration,S);this.opts.report.reportWarning(57,`${I}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(xD).join(", ")}, using default: "${b}"`)}return[S.relativeCwd,b]})),n=new Map(this.opts.project.workspaces.map(S=>{let b=this.opts.project.configuration.get("nmSelfReferences");return b=S.manifest.installConfig?.selfReferences??b,[S.relativeCwd,b]})),c={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(S,b)=>Array.isArray(b)?{name:b[0],reference:b[1]}:{name:S,reference:b},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(S=>{let b=S.anchoredLocator;return{name:G.stringifyIdent(b),reference:b.reference}}),getPackageInformation:S=>{let b=S.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:G.makeLocator(G.parseIdent(S.name),S.reference),I=this.localStore.get(b.locatorHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return I.pnpNode},findPackageLocator:S=>{let b=this.opts.project.tryWorkspaceByCwd(fe.toPortablePath(S));if(b!==null){let I=b.anchoredLocator;return{name:G.stringifyIdent(I),reference:I.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:S=>fe.fromPortablePath(uo.resolveVirtual(fe.toPortablePath(S)))},{tree:f,errors:p,preserveSymlinksRequired:h}=kD(c,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!f){for(let{messageName:S,text:b}of p)this.opts.report.reportError(S,b);return}let E=zW(f);await Mdt(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async S=>{let b=G.parseLocator(S),I=this.localStore.get(b.locatorHash);if(typeof I>"u")throw new Error("Assertion failed: Expected the slot to exist");return I.customPackageData.manifest}});let C=[];for(let[S,b]of E.entries()){if(_Be(S))continue;let I=G.parseLocator(S),T=this.localStore.get(I.locatorHash);if(typeof T>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(T.pkg))continue;let N=gA.extractBuildRequest(T.pkg,T.customPackageData,T.dependencyMeta,{configuration:this.opts.project.configuration});N&&C.push({buildLocations:b.locations,locator:I,buildRequest:N})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${he.pretty(this.opts.project.configuration,"--preserve-symlinks",he.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:C}}};async function Qdt(t,e){let r=await Ut.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Ut,s=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())s.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:gA.hasBindingGyp(e)}}}async function Rdt(t,e,r,s,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will `,n+=`# cause your node_modules installation to become invalidated. `,n+=` `,n+=`__metadata: `,n+=` version: ${OBe} `,n+=` nmMode: ${s.value} `;let c=Array.from(e.keys()).sort(),f=G.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of c){let C=e.get(E);n+=` `,n+=`${JSON.stringify(E)}: `,n+=` locations: `;for(let S of C.locations){let b=J.contains(t.cwd,S);if(b===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=` - ${JSON.stringify(b)} `}if(C.aliases.length>0){n+=` aliases: `;for(let S of C.aliases)n+=` - ${JSON.stringify(S)} `}if(E===f&&r.size>0){n+=` bin: `;for(let[S,b]of r){let I=J.contains(t.cwd,S);if(I===null)throw new Error(`Assertion failed: Expected the path to be within the project (${S})`);n+=` ${JSON.stringify(I)}: `;for(let[T,N]of b){let U=J.relative(J.join(S,Ri),N);n+=` ${JSON.stringify(T)}: ${JSON.stringify(U)} `}}}}let p=t.cwd,h=J.join(p,Ri,LBe);a&&await ce.removePromise(h),await ce.changeFilePromise(h,n,{automaticNewlines:!0})}async function CY(t,{unrollAliases:e=!1}={}){let r=t.cwd,s=J.join(r,Ri,LBe),a;try{a=await ce.statPromise(s)}catch{}if(!a)return null;let n=as(await ce.readFilePromise(s,"utf8"));if(n.__metadata.version>OBe)return null;let c=n.__metadata.nmMode||"classic",f=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let C=E.locations.map(b=>J.join(r,b)),S=E.bin;if(S)for(let[b,I]of Object.entries(S)){let T=J.join(r,fe.toPortablePath(b)),N=je.getMapWithDefault(p,T);for(let[U,W]of Object.entries(I))N.set(U,fe.toPortablePath([T,Ri,W].join(J.sep)))}if(f.set(h,{target:vt.dot,linkType:"HARD",locations:C,aliases:E.aliases||[]}),e&&E.aliases)for(let b of E.aliases){let{scope:I,name:T}=G.parseLocator(h),N=G.makeLocator(G.makeIdent(I,T),b),U=G.stringifyLocator(N);f.set(U,{target:vt.dot,linkType:"HARD",locations:C,aliases:[]})}}return{locatorMap:f,binSymlinks:p,locationTree:MBe(f,{skipPrefix:t.cwd}),nmMode:c,mtimeMs:a.mtimeMs}}var Pw=async(t,e)=>{if(t.split(J.sep).indexOf(Ri)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{let r;if(!e.innerLoop&&(r=await ce.lstatPromise(t),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!e.isWorkspaceDir)){await ce.unlinkPromise(t);return}let s=await ce.readdirPromise(t,{withFileTypes:!0});for(let n of s){let c=J.join(t,n.name);n.isDirectory()?(n.name!==Ri||e&&e.innerLoop)&&await Pw(c,{innerLoop:!0,contentsOnly:!1}):await ce.unlinkPromise(c)}let a=!e.innerLoop&&e.isWorkspaceDir&&r?.isSymbolicLink();!e.contentsOnly&&!a&&await ce.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},RBe=4,aN=(t,{skipPrefix:e})=>{let r=J.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let s=r.split(J.sep).filter(p=>p!==""),a=s.indexOf(Ri),n=s.slice(0,a).join(J.sep),c=J.join(e,n),f=s.slice(a);return{locationRoot:c,segments:f}},MBe=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let s=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&J.contains(e,n.target)!==null){let f=je.getFactoryWithDefault(r,n.target,s);f.locator=a,f.linkType=n.linkType}for(let c of n.locations){let{locationRoot:f,segments:p}=aN(c,{skipPrefix:e}),h=je.getFactoryWithDefault(r,f,s);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let s;try{s=await ce.lstatPromise(t)}catch{}if(!s||s.isDirectory()){await ce.symlinkPromise(t,e,"junction");return}}await ce.symlinkPromise(J.relative(J.dirname(e),t),e)};async function UBe(t,e,r){let s=J.join(t,`${wY.default.randomBytes(16).toString("hex")}.tmp`);try{await ce.writeFilePromise(s,r);try{await ce.linkPromise(s,e)}catch{}}finally{await ce.unlinkPromise(s)}}async function Tdt({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:s,baseFs:a,nmMode:n}){if(r.kind==="file"){if(n.value==="hardlinks-global"&&s&&r.digest){let f=J.join(s,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ce.statPromise(f);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs{await ce.mkdirPromise(t,{recursive:!0});let f=async(E=vt.dot)=>{let C=J.join(e,E),S=await r.readdirPromise(C,{withFileTypes:!0}),b=new Map;for(let I of S){let T=J.join(E,I.name),N,U=J.join(C,I.name);if(I.isFile()){if(N={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let W=await Nn.checksumFile(U,{baseFs:r,algorithm:"sha1"});N.digest=W}}else if(I.isDirectory())N={kind:"directory"};else if(I.isSymbolicLink())N={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(b.set(T,N),I.isDirectory()&&T!==Ri){let W=await f(T);for(let[ee,ie]of W)b.set(ee,ie)}}return b},p;if(a.value==="hardlinks-global"&&s&&c){let E=J.join(s,c.substring(0,2),`${c.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ce.readFilePromise(E,"utf8"))))}catch{p=await f()}}else p=await f();let h=!1;for(let[E,C]of p){let S=J.join(e,E),b=J.join(t,E);if(C.kind==="directory")await ce.mkdirPromise(b,{recursive:!0});else if(C.kind==="file"){let I=C.mtimeMs;await Tdt({srcPath:S,dstPath:b,entry:C,nmMode:a,baseFs:r,globalHardlinksStore:s}),C.mtimeMs!==I&&(h=!0)}else C.kind==="symlink"&&await vY(J.resolve(J.dirname(b),C.symlinkTo),b,n)}if(a.value==="hardlinks-global"&&s&&h&&c){let E=J.join(s,c.substring(0,2),`${c.substring(2)}.json`);await ce.removePromise(E),await UBe(s,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Ndt(t,e,r,s){let a=new Map,n=new Map,c=new Map,f=!1,p=(h,E,C,S,b)=>{let I=!0,T=J.join(h,E),N=new Set;if(E===Ri||E.startsWith("@")){let W;try{W=ce.statSync(T)}catch{}I=!!W,W?W.mtimeMs>r?(f=!0,N=new Set(ce.readdirSync(T))):N=new Set(C.children.get(E).children.keys()):f=!0;let ee=e.get(h);if(ee){let ie=J.join(h,Ri,oN),ue;try{ue=ce.statSync(ie)}catch{}if(!ue)f=!0;else if(ue.mtimeMs>r){f=!0;let le=new Set(ce.readdirSync(ie)),me=new Map;n.set(h,me);for(let[pe,Be]of ee)le.has(pe)&&me.set(pe,Be)}else n.set(h,ee)}}else I=b.has(E);let U=C.children.get(E);if(I){let{linkType:W,locator:ee}=U,ie={children:new Map,linkType:W,locator:ee};if(S.children.set(E,ie),ee){let ue=je.getSetWithDefault(c,ee);ue.add(T),c.set(ee,ue)}for(let ue of U.children.keys())p(T,ue,U,ie,N)}else U.locator&&s.storedBuildState.delete(G.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:C,locator:S}=E,b={children:new Map,linkType:C,locator:S};if(a.set(h,b),S){let I=je.getSetWithDefault(c,E.locator);I.add(h),c.set(E.locator,I)}E.children.has(Ri)&&p(h,Ri,E,b,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:c,installChangedByUser:f}}function _Be(t){let e=G.parseDescriptor(t);return G.isVirtualDescriptor(e)&&(e=G.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function Odt(t,e,r,{loadManifest:s}){let a=new Map;for(let[f,{locations:p}]of t){let h=_Be(f)?null:await s(f,p[0]),E=new Map;if(h)for(let[C,S]of h.bin){let b=J.join(p[0],S);S!==""&&ce.existsSync(b)&&E.set(C,S)}a.set(f,E)}let n=new Map,c=(f,p,h)=>{let E=new Map,C=J.contains(r,f);if(h.locator&&C!==null){let S=a.get(h.locator);for(let[b,I]of S){let T=J.join(f,fe.toPortablePath(I));E.set(b,T)}for(let[b,I]of h.children){let T=J.join(f,b),N=c(T,T,I);N.size>0&&n.set(f,new Map([...n.get(f)||new Map,...N]))}}else for(let[S,b]of h.children){let I=c(J.join(f,S),p,b);for(let[T,N]of I)E.set(T,N)}return E};for(let[f,p]of e){let h=c(f,f,p);h.size>0&&n.set(f,new Map([...n.get(f)||new Map,...h]))}return n}var TBe=(t,e)=>{if(!t||!e)return t===e;let r=G.parseLocator(t);G.isVirtualLocator(r)&&(r=G.devirtualizeLocator(r));let s=G.parseLocator(e);return G.isVirtualLocator(s)&&(s=G.devirtualizeLocator(s)),G.areLocatorsEqual(r,s)};function SY(t){return J.join(t.get("globalFolder"),"store")}function Ldt(t,e){let r=s=>{let a=s.split(J.sep),n=a.lastIndexOf(Ri);if(n<0||n==a.length-1)throw new Error(`Assertion failed. Path is outside of any node_modules package ${s}`);return a.slice(0,n+(a[n+1].startsWith("@")?3:2)).join(J.sep)};for(let s of t.values())for(let[a,n]of s)e.has(r(n))&&s.delete(a)}async function Mdt(t,e,{baseFs:r,project:s,report:a,loadManifest:n,realLocatorChecksums:c}){let f=J.join(s.cwd,Ri),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:C}=Ndt(t.locationTree,t.binSymlinks,t.mtimeMs,s),S=MBe(e,{skipPrefix:s.cwd}),b=[],I=async({srcDir:Be,dstDir:Ce,linkType:g,globalHardlinksStore:we,nmMode:ye,windowsLinkType:Ae,packageChecksum:se})=>{let X=(async()=>{try{g==="SOFT"?(await ce.mkdirPromise(J.dirname(Ce),{recursive:!0}),await vY(J.resolve(Be),Ce,Ae)):await Fdt(Ce,Be,{baseFs:r,globalHardlinksStore:we,nmMode:ye,windowsLinkType:Ae,packageChecksum:se})}catch(De){throw De.message=`While persisting ${Be} -> ${Ce} ${De.message}`,De}finally{ie.tick()}})().then(()=>b.splice(b.indexOf(X),1));b.push(X),b.length>RBe&&await Promise.race(b)},T=async(Be,Ce,g)=>{let we=(async()=>{let ye=async(Ae,se,X)=>{try{X.innerLoop||await ce.mkdirPromise(se,{recursive:!0});let De=await ce.readdirPromise(Ae,{withFileTypes:!0});for(let Te of De){if(!X.innerLoop&&Te.name===oN)continue;let mt=J.join(Ae,Te.name),j=J.join(se,Te.name);Te.isDirectory()?(Te.name!==Ri||X&&X.innerLoop)&&(await ce.mkdirPromise(j,{recursive:!0}),await ye(mt,j,{...X,innerLoop:!0})):me.value==="hardlinks-local"||me.value==="hardlinks-global"?await ce.linkPromise(mt,j):await ce.copyFilePromise(mt,j,NBe.default.constants.COPYFILE_FICLONE)}}catch(De){throw X.innerLoop||(De.message=`While cloning ${Ae} -> ${se} ${De.message}`),De}finally{X.innerLoop||ie.tick()}};await ye(Be,Ce,g)})().then(()=>b.splice(b.indexOf(we),1));b.push(we),b.length>RBe&&await Promise.race(b)},N=async(Be,Ce,g)=>{if(g)for(let[we,ye]of Ce.children){let Ae=g.children.get(we);await N(J.join(Be,we),ye,Ae)}else{Ce.children.has(Ri)&&await Pw(J.join(Be,Ri),{contentsOnly:!1});let we=J.basename(Be)===Ri&&p.has(J.join(J.dirname(Be)));await Pw(Be,{contentsOnly:Be===f,isWorkspaceDir:we})}};for(let[Be,Ce]of p){let g=S.get(Be);for(let[we,ye]of Ce.children){if(we===".")continue;let Ae=g&&g.children.get(we),se=J.join(Be,we);await N(se,ye,Ae)}}let U=async(Be,Ce,g)=>{if(g){TBe(Ce.locator,g.locator)||await Pw(Be,{contentsOnly:Ce.linkType==="HARD"});for(let[we,ye]of Ce.children){let Ae=g.children.get(we);await U(J.join(Be,we),ye,Ae)}}else{Ce.children.has(Ri)&&await Pw(J.join(Be,Ri),{contentsOnly:!0});let we=J.basename(Be)===Ri&&S.has(J.join(J.dirname(Be)));await Pw(Be,{contentsOnly:Ce.linkType==="HARD",isWorkspaceDir:we})}};for(let[Be,Ce]of S){let g=p.get(Be);for(let[we,ye]of Ce.children){if(we===".")continue;let Ae=g&&g.children.get(we);await U(J.join(Be,we),ye,Ae)}}let W=new Map,ee=[];for(let[Be,Ce]of E)for(let g of Ce){let{locationRoot:we,segments:ye}=aN(g,{skipPrefix:s.cwd}),Ae=S.get(we),se=we;if(Ae){for(let X of ye)if(se=J.join(se,X),Ae=Ae.children.get(X),!Ae)break;if(Ae){let X=TBe(Ae.locator,Be),De=e.get(Ae.locator),Te=De.target,mt=se,j=De.linkType;if(X)W.has(Te)||W.set(Te,mt);else if(Te!==mt){let rt=G.parseLocator(Ae.locator);G.isVirtualLocator(rt)&&(rt=G.devirtualizeLocator(rt)),ee.push({srcDir:Te,dstDir:mt,linkType:j,realLocatorHash:rt.locatorHash})}}}}for(let[Be,{locations:Ce}]of e.entries())for(let g of Ce){let{locationRoot:we,segments:ye}=aN(g,{skipPrefix:s.cwd}),Ae=p.get(we),se=S.get(we),X=we,De=e.get(Be),Te=G.parseLocator(Be);G.isVirtualLocator(Te)&&(Te=G.devirtualizeLocator(Te));let mt=Te.locatorHash,j=De.target,rt=g;if(j===rt)continue;let Fe=De.linkType;for(let Ne of ye)se=se.children.get(Ne);if(!Ae)ee.push({srcDir:j,dstDir:rt,linkType:Fe,realLocatorHash:mt});else for(let Ne of ye)if(X=J.join(X,Ne),Ae=Ae.children.get(Ne),!Ae){ee.push({srcDir:j,dstDir:rt,linkType:Fe,realLocatorHash:mt});break}}let ie=Ao.progressViaCounter(ee.length),ue=a.reportProgress(ie),le=s.configuration.get("nmMode"),me={value:le},pe=s.configuration.get("winLinkType");try{let Be=me.value==="hardlinks-global"?`${SY(s.configuration)}/v1`:null;if(Be&&!await ce.existsPromise(Be)){await ce.mkdirpPromise(Be);for(let g=0;g<256;g++)await ce.mkdirPromise(J.join(Be,g.toString(16).padStart(2,"0")))}for(let g of ee)(g.linkType==="SOFT"||!W.has(g.srcDir))&&(W.set(g.srcDir,g.dstDir),await I({...g,globalHardlinksStore:Be,nmMode:me,windowsLinkType:pe,packageChecksum:c.get(g.realLocatorHash)||null}));await Promise.all(b),b.length=0;for(let g of ee){let we=W.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==we&&await T(we,g.dstDir,{nmMode:me})}await Promise.all(b),await ce.mkdirPromise(f,{recursive:!0}),Ldt(h,new Set(ee.map(g=>g.dstDir)));let Ce=await Odt(e,S,s.cwd,{loadManifest:n});await Udt(h,Ce,s.cwd,pe),await Rdt(s,e,Ce,me,{installChangedByUser:C}),le=="hardlinks-global"&&me.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{ue.stop()}}async function Udt(t,e,r,s){for(let a of t.keys()){if(J.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=J.join(a,Ri,oN);await ce.removePromise(n)}}for(let[a,n]of e){if(J.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let c=J.join(a,Ri,oN),f=t.get(a)||new Map;await ce.mkdirPromise(c,{recursive:!0});for(let p of f.keys())n.has(p)||(await ce.removePromise(J.join(c,p)),process.platform==="win32"&&await ce.removePromise(J.join(c,`${p}.cmd`)));for(let[p,h]of n){let E=f.get(p),C=J.join(c,p);E!==h&&(process.platform==="win32"?await(0,FBe.default)(fe.fromPortablePath(h),fe.fromPortablePath(C),{createPwshFile:!1}):(await ce.removePromise(C),await vY(h,C,s),J.contains(r,await ce.realpathPromise(h))!==null&&await ce.chmodPromise(h,493)))}}}Ge();Dt();eA();var GD=class extends sg{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new DY(r)}},DY=class extends Gm{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let s=new uo({baseFs:new $f({maxOpenFiles:80,readOnlyArchives:!0})}),a=IBe(r,this.opts.project.cwd,s),{tree:n,errors:c}=kD(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:C,text:S}of c)this.opts.report.reportError(C,S);return}let f=new Map;r.fallbackPool=f;let p=(C,S)=>{let b=G.parseLocator(S.locator),I=G.stringifyIdent(b);I===C?f.set(C,b.reference):f.set(C,[I,b.reference])},h=J.join(this.opts.project.cwd,Er.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let C of E.dirList){let S=J.join(h,C),b=n.get(S);if(typeof b>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in b)p(C,b);else for(let I of b.dirList){let T=J.join(S,I),N=n.get(T);if(typeof N>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in N)p(`${C}/${I}`,N);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var _dt={hooks:{cleanGlobalArtifacts:async t=>{let e=SY(t);await ce.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[jD,GD]},Hdt=_dt;var PK={};Vt(PK,{NpmHttpFetcher:()=>VD,NpmRemapResolver:()=>JD,NpmSemverFetcher:()=>oh,NpmSemverResolver:()=>KD,NpmTagResolver:()=>zD,default:()=>rPt,npmConfigUtils:()=>hi,npmHttpUtils:()=>an,npmPublishUtils:()=>v1});Ge();var JBe=ut(Ai());var oi="npm:";var an={};Vt(an,{AuthType:()=>WBe,customPackageError:()=>qm,del:()=>imt,get:()=>Wm,getIdentUrl:()=>WD,getPackageMetadata:()=>Qw,handleInvalidAuthenticationError:()=>ag,post:()=>rmt,put:()=>nmt});Ge();Ge();Dt();var kY=ut(Vv());ql();var qBe=ut(Ai());var hi={};Vt(hi,{RegistryType:()=>jBe,getAuditRegistry:()=>jdt,getAuthConfiguration:()=>xY,getDefaultRegistry:()=>qD,getPublishRegistry:()=>Gdt,getRegistryConfiguration:()=>GBe,getScopeConfiguration:()=>bY,getScopeRegistry:()=>bw,isPackageApproved:()=>xw,normalizeRegistry:()=>Jc});Ge();var HBe=ut(Go()),jBe=(s=>(s.AUDIT_REGISTRY="npmAuditRegistry",s.FETCH_REGISTRY="npmRegistryServer",s.PUBLISH_REGISTRY="npmPublishRegistry",s))(jBe||{});function Jc(t){return t.replace(/\/$/,"")}function jdt({configuration:t}){return qD({configuration:t,type:"npmAuditRegistry"})}function Gdt(t,{configuration:e}){return t.publishConfig?.registry?Jc(t.publishConfig.registry):t.name?bw(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):qD({configuration:e,type:"npmPublishRegistry"})}function bw(t,{configuration:e,type:r="npmRegistryServer"}){let s=bY(t,{configuration:e});if(s===null)return qD({configuration:e,type:r});let a=s.get(r);return a===null?qD({configuration:e,type:r}):Jc(a)}function qD({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return Jc(r!==null?r:t.get("npmRegistryServer"))}function GBe(t,{configuration:e}){let r=e.get("npmRegistries"),s=Jc(t),a=r.get(s);if(typeof a<"u")return a;let n=r.get(s.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}var qdt=new Map([["npmRegistryServer","https://npm.jsr.io/"]]);function bY(t,{configuration:e}){if(t===null)return null;let s=e.get("npmScopes").get(t);return s||(t==="jsr"?qdt:null)}function xY(t,{configuration:e,ident:r}){let s=r&&bY(r.scope,{configuration:e});return s?.get("npmAuthIdent")||s?.get("npmAuthToken")?s:GBe(t,{configuration:e})||e}function Wdt({configuration:t,version:e,publishTimes:r}){let s=t.get("npmMinimalAgeGate");if(s){let a=r?.[e];if(typeof a>"u"||(new Date().getTime()-new Date(a).getTime())/60/1e3Ydt(e,r,s))}function xw(t){return!Wdt(t)||Vdt(t)}var WBe=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(WBe||{});async function ag(t,{attemptedAs:e,registry:r,headers:s,configuration:a}){if(cN(t))throw new jt(41,"Invalid OTP token");if(t.originalError?.name==="HTTPError"&&t.originalError?.response.statusCode===401)throw new jt(41,`Invalid authentication (${typeof e!="string"?`as ${await omt(r,s,{configuration:a})}`:`attempted as ${e}`})`)}function qm(t,e){let r=t.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${he.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function WD(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var YBe=new Map,Jdt=new Map;async function Kdt(t){return await je.getFactoryWithDefault(YBe,t,async()=>{let e=null;try{e=await ce.readJsonPromise(t)}catch{}return e})}async function zdt(t,e,{configuration:r,cached:s,registry:a,headers:n,version:c,...f}){return await je.getFactoryWithDefault(Jdt,t,async()=>await Wm(WD(e),{...f,customErrorMessage:qm,configuration:r,registry:a,ident:e,headers:{...n,"If-None-Match":s?.etag,"If-Modified-Since":s?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(s===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...h,body:s.metadata}}let E=Xdt(JSON.parse(h.body.toString())),C={metadata:E,etag:h.headers.etag,lastModified:h.headers["last-modified"]};return YBe.set(t,Promise.resolve(C)),Promise.resolve().then(async()=>{let S=`${t}-${process.pid}.tmp`;await ce.mkdirPromise(J.dirname(S),{recursive:!0}),await ce.writeJsonPromise(S,C,{compact:!0}),await ce.renamePromise(S,t)}).catch(()=>{}),{...h,body:E}}}))}function Zdt(t){return t.scope!==null?`@${t.scope}-${t.name}-${t.scope.length}`:t.name}async function Qw(t,{cache:e,project:r,registry:s,headers:a,version:n,...c}){let{configuration:f}=r;s=YD(f,{ident:t,registry:s});let p=emt(f,s),h=J.join(p,`${Zdt(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await Kdt(h),E)){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(f.get("enableOfflineMode")){let C=structuredClone(E.metadata),S=new Set;if(e){for(let I of Object.keys(C.versions)){let T=G.makeLocator(t,`npm:${I}`),N=e.getLocatorMirrorPath(T);(!N||!ce.existsSync(N))&&(delete C.versions[I],S.add(I))}let b=C["dist-tags"].latest;if(S.has(b)){let I=Object.keys(E.metadata.versions).sort(qBe.default.compare),T=I.indexOf(b);for(;S.has(I[T])&&T>=0;)T-=1;T>=0?C["dist-tags"].latest=I[T]:delete C["dist-tags"].latest}}return C}}return await zdt(h,t,{...c,configuration:f,cached:E,registry:s,headers:a,version:n})}var VBe=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function Xdt(t){return{"dist-tags":t["dist-tags"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,Kd(r,VBe)])),time:t.time}}var $dt=Nn.makeHash("time",...VBe).slice(0,6);function emt(t,e){let r=tmt(t),s=new URL(e);return J.join(r,$dt,s.hostname)}function tmt(t){return J.join(t.get("globalFolder"),"metadata/npm")}async function Wm(t,{configuration:e,headers:r,ident:s,authType:a,allowOidc:n,registry:c,...f}){c=YD(e,{ident:s,registry:c}),s&&s.scope&&typeof a>"u"&&(a=1);let p=await lN(c,{authType:a,allowOidc:n,configuration:e,ident:s});p&&(r={...r,authorization:p});try{return await ln.get(t.charAt(0)==="/"?`${c}${t}`:t,{configuration:e,headers:r,...f})}catch(h){throw await ag(h,{registry:c,configuration:e,headers:r}),h}}async function rmt(t,e,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=YD(s,{ident:n,registry:p});let C=await lN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...kw(h)});try{return await ln.post(p+t,e,{configuration:s,headers:a,...E})}catch(S){if(!cN(S)||h)throw await ag(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await QY(S,{configuration:s});let b={...a,...kw(h)};try{return await ln.post(`${p}${t}`,e,{configuration:s,headers:b,...E})}catch(I){throw await ag(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function nmt(t,e,{attemptedAs:r,configuration:s,headers:a,ident:n,authType:c=3,allowOidc:f,registry:p,otp:h,...E}){p=YD(s,{ident:n,registry:p});let C=await lN(p,{authType:c,allowOidc:f,configuration:s,ident:n});C&&(a={...a,authorization:C}),h&&(a={...a,...kw(h)});try{return await ln.put(p+t,e,{configuration:s,headers:a,...E})}catch(S){if(!cN(S))throw await ag(S,{attemptedAs:r,registry:p,configuration:s,headers:a}),S;h=await QY(S,{configuration:s});let b={...a,...kw(h)};try{return await ln.put(`${p}${t}`,e,{configuration:s,headers:b,...E})}catch(I){throw await ag(I,{attemptedAs:r,registry:p,configuration:s,headers:a}),I}}}async function imt(t,{attemptedAs:e,configuration:r,headers:s,ident:a,authType:n=3,allowOidc:c,registry:f,otp:p,...h}){f=YD(r,{ident:a,registry:f});let E=await lN(f,{authType:n,allowOidc:c,configuration:r,ident:a});E&&(s={...s,authorization:E}),p&&(s={...s,...kw(p)});try{return await ln.del(f+t,{configuration:r,headers:s,...h})}catch(C){if(!cN(C)||p)throw await ag(C,{attemptedAs:e,registry:f,configuration:r,headers:s}),C;p=await QY(C,{configuration:r});let S={...s,...kw(p)};try{return await ln.del(`${f}${t}`,{configuration:r,headers:S,...h})}catch(b){throw await ag(b,{attemptedAs:e,registry:f,configuration:r,headers:s}),b}}}function YD(t,{ident:e,registry:r}){if(typeof r>"u"&&e)return bw(e.scope,{configuration:t});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return Jc(r)}async function lN(t,{authType:e=2,allowOidc:r=!1,configuration:s,ident:a}){let n=xY(t,{configuration:s,ident:a}),c=smt(n,e);if(!c)return null;let f=await s.reduceHook(p=>p.getNpmAuthenticationHeader,void 0,t,{configuration:s,ident:a});if(f)return f;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let p=n.get("npmAuthIdent");return p.includes(":")?`Basic ${Buffer.from(p).toString("base64")}`:`Basic ${p}`}if(r&&a){let p=await amt(t,{configuration:s,ident:a});if(p)return`Bearer ${p}`}if(c&&e!==1)throw new jt(33,"No authentication configured for request");return null}function smt(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function omt(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await ln.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function QY(t,{configuration:e}){let r=t.originalError?.response.headers["npm-notice"];if(r&&(await Ot.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,he.pretty(e,"$1",he.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&fs.openUrl){let{openNow:c}=await(0,kY.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});c&&(await fs.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` `)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:s}=await(0,kY.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` `),s}function cN(t){if(t.originalError?.name!=="HTTPError")return!1;try{return(t.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function kw(t){return{"npm-otp":t}}async function amt(t,{configuration:e,ident:r}){let s=null;if(process.env.GITLAB)s=process.env.NPM_ID_TOKEN||null;else if(process.env.GITHUB_ACTIONS){if(!(process.env.ACTIONS_ID_TOKEN_REQUEST_URL&&process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN))return null;let a=`npm:${new URL(t).host.replace("registry.yarnpkg.com","registry.npmjs.org").replace("yarn.npmjs.org","registry.npmjs.org")}`,n=new URL(process.env.ACTIONS_ID_TOKEN_REQUEST_URL);n.searchParams.append("audience",a),s=(await ln.get(n.href,{configuration:e,jsonResponse:!0,headers:{Authorization:`Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`}})).value}if(!s)return null;try{return(await ln.post(`${t}/-/npm/v1/oidc/token/exchange/package${WD(r)}`,null,{configuration:e,jsonResponse:!0,headers:{Authorization:`Bearer ${s}`}})).token||null}catch{}return null}var VD=class{supports(e,r){if(!e.reference.startsWith(oi))return!1;let{selector:s,params:a}=G.parseRange(e.reference);return!(!JBe.default.valid(s)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let{params:s}=G.parseRange(e.reference);if(s===null||typeof s.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await Wm(s.__archiveUrl,{customErrorMessage:qm,configuration:r.project.configuration,ident:e});return await ps.convertToZip(a,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();var JD=class{supportsDescriptor(e,r){return!(!e.range.startsWith(oi)||!G.tryParseDescriptor(e.range.slice(oi.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){let s=r.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return r.resolver.getResolutionDependencies(s,r)}async getCandidates(e,r,s){let a=s.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return await s.resolver.getCandidates(a,r,s)}async getSatisfying(e,r,s,a){let n=a.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(oi.length),!0));return a.resolver.getSatisfying(n,r,s,a)}resolve(e,r){throw new Error("Unreachable")}};Ge();Ge();var KBe=ut(Ai());var oh=class t{supports(e,r){if(!e.reference.startsWith(oi))return!1;let s=new URL(e.reference);return!(!KBe.default.valid(s.pathname)||s.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:c}}async fetchFromNetwork(e,r){let s;try{s=await Wm(t.getLocatorUrl(e),{customErrorMessage:qm,configuration:r.project.configuration,ident:e})}catch{s=await Wm(t.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:qm,configuration:r.project.configuration,ident:e})}return await ps.convertToZip(s,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:s}){let a=bw(e.scope,{configuration:s}),n=t.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=Fr.clean(e.reference.slice(oi.length));if(r===null)throw new jt(10,"The npm semver resolver got selected, but the version isn't semver");return`${WD(e)}/-/${e.name}-${r}.tgz`}};Ge();Ge();Ge();var RY=ut(Ai());var uN=G.makeIdent(null,"node-gyp"),lmt=/\b(node-gyp|prebuild-install)\b/,KD=class{supportsDescriptor(e,r){return e.range.startsWith(oi)?!!Fr.validRange(e.range.slice(oi.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(oi))return!1;let{selector:s}=G.parseRange(e.reference);return!!RY.default.valid(s)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=Fr.validRange(e.range.slice(oi.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(oi.length)}`);let n=await Qw(e,{cache:s.fetchOptions?.cache,project:s.project,version:RY.default.valid(a.raw)?a.raw:void 0}),c=je.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Fr.SemVer(h);if(a.test(E))return xw({configuration:s.project.configuration,ident:e,version:h,publishTimes:n.time})?E:je.mapAndFilter.skip}catch{}return je.mapAndFilter.skip}),f=c.filter(h=>!n.versions[h.raw].deprecated),p=f.length>0?f:c;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=G.makeLocator(e,`${oi}${h.raw}`),C=n.versions[h.raw].dist.tarball;return oh.isConventionalTarballUrl(E,C,{configuration:s.project.configuration})?E:G.bindLocator(E,{__archiveUrl:C})})}async getSatisfying(e,r,s,a){let n=Fr.validRange(e.range.slice(oi.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(oi.length)}`);return{locators:je.mapAndFilter(s,p=>{if(p.identHash!==e.identHash)return je.mapAndFilter.skip;let h=G.tryParseRange(p.reference,{requireProtocol:oi});if(!h)return je.mapAndFilter.skip;let E=new Fr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:je.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:s}=G.parseRange(e.reference),a=Fr.clean(s);if(a===null)throw new jt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await Qw(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new jt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new jt(16,`Registry failed to return reference "${a}"`);let c=new Ut;if(c.load(n.versions[a]),!c.dependencies.has(uN.identHash)&&!c.peerDependencies.has(uN.identHash)){for(let f of c.scripts.values())if(f.match(lmt)){c.dependencies.set(uN.identHash,G.makeDescriptor(uN,"latest"));break}}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:c.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(c.dependencies),peerDependencies:c.peerDependencies,dependenciesMeta:c.dependenciesMeta,peerDependenciesMeta:c.peerDependenciesMeta,bin:c.bin}}};Ge();Ge();var fN=ut(Ai());var zD=class{supportsDescriptor(e,r){return!(!e.range.startsWith(oi)||!Mp.test(e.range.slice(oi.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,s){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,s){let a=e.range.slice(oi.length),n=await Qw(e,{cache:s.fetchOptions?.cache,project:s.project});if(!Object.hasOwn(n,"dist-tags"))throw new jt(15,'Registry returned invalid data - missing "dist-tags" field');let c=n["dist-tags"];if(!Object.hasOwn(c,a))throw new jt(16,`Registry failed to return tag "${a}"`);let f=Object.keys(n.versions),p=n.time,h=c[a];if(a==="latest"&&!xw({configuration:s.project.configuration,ident:e,version:h,publishTimes:p})){let S=h.includes("-"),b=fN.default.rsort(f).find(I=>fN.default.lt(I,h)&&(S||!I.includes("-"))&&xw({configuration:s.project.configuration,ident:e,version:I,publishTimes:p}));if(!b)throw new jt(16,`The version for tag "${a}" is quarantined, and no lower version is available`);h=b}let E=G.makeLocator(e,`${oi}${h}`),C=n.versions[h].dist.tarball;return oh.isConventionalTarballUrl(E,C,{configuration:s.project.configuration})?[E]:[G.bindLocator(E,{__archiveUrl:C})]}async getSatisfying(e,r,s,a){let n=[];for(let c of s){if(c.identHash!==e.identHash)continue;let f=G.tryParseRange(c.reference,{requireProtocol:oi});if(!(!f||!fN.default.valid(f.selector))){if(f.params?.__archiveUrl){let p=G.makeRange({protocol:oi,selector:f.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(G.makeDescriptor(e,p),r,a);if(c.reference!==h.reference)continue}n.push(c)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var v1={};Vt(v1,{getGitHead:()=>$Dt,getPublishAccess:()=>Uxe,getReadmeContent:()=>_xe,makePublishBody:()=>XDt});Ge();Ge();Dt();var IV={};Vt(IV,{PackCommand:()=>jw,default:()=>HEt,packUtils:()=>yA});Ge();Ge();Ge();Dt();Yt();var yA={};Vt(yA,{genPackList:()=>FN,genPackStream:()=>EV,genPackageManifest:()=>DSe,hasPackScripts:()=>mV,prepareForPack:()=>yV});Ge();Dt();var dV=ut(Go()),vSe=ut(ISe()),SSe=Ie("zlib"),kEt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],QEt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function mV(t){return!!(In.hasWorkspaceScript(t,"prepack")||In.hasWorkspaceScript(t,"postpack"))}async function yV(t,{report:e},r){await In.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let s=J.join(t.cwd,Ut.fileName);await ce.existsPromise(s)&&await t.manifest.loadFile(s,{baseFs:ce}),await r()}finally{await In.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function EV(t,e){typeof e>"u"&&(e=await FN(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(J.normalize(n));for(let n of t.manifest.bin.values())r.add(J.normalize(n));let s=vSe.default.pack();process.nextTick(async()=>{for(let n of e){let c=J.normalize(n),f=J.resolve(t.cwd,c),p=J.join("package",c),h=await ce.lstatPromise(f),E={name:p,mtime:new Date(fi.SAFE_TIME*1e3)},C=r.has(c)?493:420,S,b,I=new Promise((N,U)=>{S=N,b=U}),T=N=>{N?b(N):S()};if(h.isFile()){let N;c==="package.json"?N=Buffer.from(JSON.stringify(await DSe(t),null,2)):N=await ce.readFilePromise(f),s.entry({...E,mode:C,type:"file"},N,T)}else h.isSymbolicLink()?s.entry({...E,mode:C,type:"symlink",linkname:await ce.readlinkPromise(f)},T):T(new Error(`Unsupported file type ${h.mode} for ${fe.fromPortablePath(c)}`));await I}s.finalize()});let a=(0,SSe.createGzip)();return s.pipe(a),a}async function DSe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function FN(t){let e=t.project,r=e.configuration,s={accept:[],reject:[]};for(let C of QEt)s.reject.push(C);for(let C of kEt)s.accept.push(C);s.reject.push(r.get("rcFilename"));let a=C=>{if(C===null||!C.startsWith(`${t.cwd}/`))return;let S=J.relative(t.cwd,C),b=J.resolve(vt.root,S);s.reject.push(b)};a(J.resolve(e.cwd,Er.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(C=>C.populateYarnPaths,e,C=>{a(C)});for(let C of e.workspaces){let S=J.relative(t.cwd,C.cwd);S!==""&&!S.match(/^(\.\.)?\//)&&s.reject.push(`/${S}`)}let n={accept:[],reject:[]},c=t.manifest.publishConfig?.main??t.manifest.main,f=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;c!=null&&n.accept.push(J.resolve(vt.root,c)),f!=null&&n.accept.push(J.resolve(vt.root,f)),typeof p=="string"&&n.accept.push(J.resolve(vt.root,p));for(let C of h.values())n.accept.push(J.resolve(vt.root,C));if(p instanceof Map)for(let[C,S]of p.entries())n.accept.push(J.resolve(vt.root,C)),typeof S=="string"&&n.accept.push(J.resolve(vt.root,S));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let C of t.manifest.files)PSe(n.accept,C,{cwd:vt.root})}return await REt(t.cwd,{hasExplicitFileList:E,globalList:s,ignoreList:n})}async function REt(t,{hasExplicitFileList:e,globalList:r,ignoreList:s}){let a=[],n=new Hf(t),c=[[vt.root,[s]]];for(;c.length>0;){let[f,p]=c.pop(),h=await n.lstatPromise(f);if(!wSe(f,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(f),C=!1,S=!1;if(!e||f!==vt.root)for(let T of E)C=C||T===".gitignore",S=S||T===".npmignore";let b=S?await CSe(n,f,".npmignore"):C?await CSe(n,f,".gitignore"):null,I=b!==null?[b].concat(p):p;wSe(f,{globalList:r,ignoreLists:p})&&(I=[...p,{accept:[],reject:["**/*"]}]);for(let T of E)c.push([J.resolve(f,T),I])}else(h.isFile()||h.isSymbolicLink())&&a.push(J.relative(vt.root,f))}return a.sort()}async function CSe(t,e,r){let s={accept:[],reject:[]},a=await t.readFilePromise(J.join(e,r),"utf8");for(let n of a.split(/\n/g))PSe(s.reject,n,{cwd:e});return s}function TEt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=J.resolve(e,t)),r&&(t=`!${t}`),t}function PSe(t,e,{cwd:r}){let s=e.trim();s===""||s[0]==="#"||t.push(TEt(s,{cwd:r}))}function wSe(t,{globalList:e,ignoreLists:r}){let s=TN(t,e.accept);if(s!==0)return s===2;let a=TN(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let c=TN(t,n.accept);if(c!==0)return c===2;let f=TN(t,n.reject);if(f!==0)return f===1}return!1}function TN(t,e){let r=e,s=[];for(let a=0;a{await yV(a,{report:p},async()=>{p.reportJson({base:fe.fromPortablePath(a.cwd)});let h=await FN(a);for(let E of h)p.reportInfo(null,fe.fromPortablePath(E)),p.reportJson({location:fe.fromPortablePath(E)});if(!this.dryRun){let E=await EV(a,h);await ce.mkdirPromise(J.dirname(c),{recursive:!0});let C=ce.createWriteStream(c);E.pipe(C),await new Promise(S=>{C.on("finish",S)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${he.pretty(r,c,he.Type.PATH)}`),p.reportJson({output:fe.fromPortablePath(c)}))})).exitCode()}};function FEt(t,{workspace:e}){let r=t.replace("%s",NEt(e)).replace("%v",OEt(e));return fe.toPortablePath(r)}function NEt(t){return t.manifest.name!==null?G.slugifyIdent(t.manifest.name):"package"}function OEt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var LEt=["dependencies","devDependencies","peerDependencies"],MEt="workspace:",UEt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of LEt)for(let a of t.manifest.getForScope(s).values()){let n=r.tryWorkspaceByDescriptor(a),c=G.parseRange(a.range);if(c.protocol===MEt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new jt(21,`${G.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let f;G.areDescriptorsEqual(a,n.anchoredDescriptor)||c.selector==="*"?f=n.manifest.version??"0.0.0":c.selector==="~"||c.selector==="^"?f=`${c.selector}${n.manifest.version??"0.0.0"}`:f=c.selector;let p=s==="dependencies"?G.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":s;e[h][G.stringifyIdent(a)]=f}}},_Et={hooks:{beforeWorkspacePacking:UEt},commands:[jw]},HEt=_Et;var Mxe=ut(OSe());Ge();var Oxe=ut(Nxe()),{env:Bt}=process,GDt="application/vnd.in-toto+json",qDt="https://in-toto.io/Statement/v0.1",WDt="https://in-toto.io/Statement/v1",YDt="https://slsa.dev/provenance/v0.2",VDt="https://slsa.dev/provenance/v1",JDt="https://github.com/actions/runner",KDt="https://slsa-framework.github.io/github-actions-buildtypes/workflow/v1",zDt="https://github.com/npm/cli/gitlab",ZDt="v0alpha1",Lxe=async(t,e)=>{let r;if(Bt.GITHUB_ACTIONS){if(!Bt.ACTIONS_ID_TOKEN_REQUEST_URL)throw new jt(91,'Provenance generation in GitHub Actions requires "write" access to the "id-token" permission');let s=(Bt.GITHUB_WORKFLOW_REF||"").replace(`${Bt.GITHUB_REPOSITORY}/`,""),a=s.indexOf("@"),n=s.slice(0,a),c=s.slice(a+1);r={_type:WDt,subject:t,predicateType:VDt,predicate:{buildDefinition:{buildType:KDt,externalParameters:{workflow:{ref:c,repository:`${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}`,path:n}},internalParameters:{github:{event_name:Bt.GITHUB_EVENT_NAME,repository_id:Bt.GITHUB_REPOSITORY_ID,repository_owner_id:Bt.GITHUB_REPOSITORY_OWNER_ID}},resolvedDependencies:[{uri:`git+${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}@${Bt.GITHUB_REF}`,digest:{gitCommit:Bt.GITHUB_SHA}}]},runDetails:{builder:{id:`${JDt}/${Bt.RUNNER_ENVIRONMENT}`},metadata:{invocationId:`${Bt.GITHUB_SERVER_URL}/${Bt.GITHUB_REPOSITORY}/actions/runs/${Bt.GITHUB_RUN_ID}/attempts/${Bt.GITHUB_RUN_ATTEMPT}`}}}}}else if(Bt.GITLAB_CI){if(!Bt.SIGSTORE_ID_TOKEN)throw new jt(91,`Provenance generation in GitLab CI requires "SIGSTORE_ID_TOKEN" with "sigstore" audience to be present in "id_tokens". For more info see: https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html`);r={_type:qDt,subject:t,predicateType:YDt,predicate:{buildType:`${zDt}/${ZDt}`,builder:{id:`${Bt.CI_PROJECT_URL}/-/runners/${Bt.CI_RUNNER_ID}`},invocation:{configSource:{uri:`git+${Bt.CI_PROJECT_URL}`,digest:{sha1:Bt.CI_COMMIT_SHA},entryPoint:Bt.CI_JOB_NAME},parameters:{CI:Bt.CI,CI_API_GRAPHQL_URL:Bt.CI_API_GRAPHQL_URL,CI_API_V4_URL:Bt.CI_API_V4_URL,CI_BUILD_BEFORE_SHA:Bt.CI_BUILD_BEFORE_SHA,CI_BUILD_ID:Bt.CI_BUILD_ID,CI_BUILD_NAME:Bt.CI_BUILD_NAME,CI_BUILD_REF:Bt.CI_BUILD_REF,CI_BUILD_REF_NAME:Bt.CI_BUILD_REF_NAME,CI_BUILD_REF_SLUG:Bt.CI_BUILD_REF_SLUG,CI_BUILD_STAGE:Bt.CI_BUILD_STAGE,CI_COMMIT_BEFORE_SHA:Bt.CI_COMMIT_BEFORE_SHA,CI_COMMIT_BRANCH:Bt.CI_COMMIT_BRANCH,CI_COMMIT_REF_NAME:Bt.CI_COMMIT_REF_NAME,CI_COMMIT_REF_PROTECTED:Bt.CI_COMMIT_REF_PROTECTED,CI_COMMIT_REF_SLUG:Bt.CI_COMMIT_REF_SLUG,CI_COMMIT_SHA:Bt.CI_COMMIT_SHA,CI_COMMIT_SHORT_SHA:Bt.CI_COMMIT_SHORT_SHA,CI_COMMIT_TIMESTAMP:Bt.CI_COMMIT_TIMESTAMP,CI_COMMIT_TITLE:Bt.CI_COMMIT_TITLE,CI_CONFIG_PATH:Bt.CI_CONFIG_PATH,CI_DEFAULT_BRANCH:Bt.CI_DEFAULT_BRANCH,CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX:Bt.CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX:Bt.CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX,CI_DEPENDENCY_PROXY_SERVER:Bt.CI_DEPENDENCY_PROXY_SERVER,CI_DEPENDENCY_PROXY_USER:Bt.CI_DEPENDENCY_PROXY_USER,CI_JOB_ID:Bt.CI_JOB_ID,CI_JOB_NAME:Bt.CI_JOB_NAME,CI_JOB_NAME_SLUG:Bt.CI_JOB_NAME_SLUG,CI_JOB_STAGE:Bt.CI_JOB_STAGE,CI_JOB_STARTED_AT:Bt.CI_JOB_STARTED_AT,CI_JOB_URL:Bt.CI_JOB_URL,CI_NODE_TOTAL:Bt.CI_NODE_TOTAL,CI_PAGES_DOMAIN:Bt.CI_PAGES_DOMAIN,CI_PAGES_URL:Bt.CI_PAGES_URL,CI_PIPELINE_CREATED_AT:Bt.CI_PIPELINE_CREATED_AT,CI_PIPELINE_ID:Bt.CI_PIPELINE_ID,CI_PIPELINE_IID:Bt.CI_PIPELINE_IID,CI_PIPELINE_SOURCE:Bt.CI_PIPELINE_SOURCE,CI_PIPELINE_URL:Bt.CI_PIPELINE_URL,CI_PROJECT_CLASSIFICATION_LABEL:Bt.CI_PROJECT_CLASSIFICATION_LABEL,CI_PROJECT_DESCRIPTION:Bt.CI_PROJECT_DESCRIPTION,CI_PROJECT_ID:Bt.CI_PROJECT_ID,CI_PROJECT_NAME:Bt.CI_PROJECT_NAME,CI_PROJECT_NAMESPACE:Bt.CI_PROJECT_NAMESPACE,CI_PROJECT_NAMESPACE_ID:Bt.CI_PROJECT_NAMESPACE_ID,CI_PROJECT_PATH:Bt.CI_PROJECT_PATH,CI_PROJECT_PATH_SLUG:Bt.CI_PROJECT_PATH_SLUG,CI_PROJECT_REPOSITORY_LANGUAGES:Bt.CI_PROJECT_REPOSITORY_LANGUAGES,CI_PROJECT_ROOT_NAMESPACE:Bt.CI_PROJECT_ROOT_NAMESPACE,CI_PROJECT_TITLE:Bt.CI_PROJECT_TITLE,CI_PROJECT_URL:Bt.CI_PROJECT_URL,CI_PROJECT_VISIBILITY:Bt.CI_PROJECT_VISIBILITY,CI_REGISTRY:Bt.CI_REGISTRY,CI_REGISTRY_IMAGE:Bt.CI_REGISTRY_IMAGE,CI_REGISTRY_USER:Bt.CI_REGISTRY_USER,CI_RUNNER_DESCRIPTION:Bt.CI_RUNNER_DESCRIPTION,CI_RUNNER_ID:Bt.CI_RUNNER_ID,CI_RUNNER_TAGS:Bt.CI_RUNNER_TAGS,CI_SERVER_HOST:Bt.CI_SERVER_HOST,CI_SERVER_NAME:Bt.CI_SERVER_NAME,CI_SERVER_PORT:Bt.CI_SERVER_PORT,CI_SERVER_PROTOCOL:Bt.CI_SERVER_PROTOCOL,CI_SERVER_REVISION:Bt.CI_SERVER_REVISION,CI_SERVER_SHELL_SSH_HOST:Bt.CI_SERVER_SHELL_SSH_HOST,CI_SERVER_SHELL_SSH_PORT:Bt.CI_SERVER_SHELL_SSH_PORT,CI_SERVER_URL:Bt.CI_SERVER_URL,CI_SERVER_VERSION:Bt.CI_SERVER_VERSION,CI_SERVER_VERSION_MAJOR:Bt.CI_SERVER_VERSION_MAJOR,CI_SERVER_VERSION_MINOR:Bt.CI_SERVER_VERSION_MINOR,CI_SERVER_VERSION_PATCH:Bt.CI_SERVER_VERSION_PATCH,CI_TEMPLATE_REGISTRY_HOST:Bt.CI_TEMPLATE_REGISTRY_HOST,GITLAB_CI:Bt.GITLAB_CI,GITLAB_FEATURES:Bt.GITLAB_FEATURES,GITLAB_USER_ID:Bt.GITLAB_USER_ID,GITLAB_USER_LOGIN:Bt.GITLAB_USER_LOGIN,RUNNER_GENERATE_ARTIFACTS_METADATA:Bt.RUNNER_GENERATE_ARTIFACTS_METADATA},environment:{name:Bt.CI_RUNNER_DESCRIPTION,architecture:Bt.CI_RUNNER_EXECUTABLE_ARCH,server:Bt.CI_SERVER_URL,project:Bt.CI_PROJECT_PATH,job:{id:Bt.CI_JOB_ID},pipeline:{id:Bt.CI_PIPELINE_ID,ref:Bt.CI_CONFIG_PATH}}},metadata:{buildInvocationId:`${Bt.CI_JOB_URL}`,completeness:{parameters:!0,environment:!0,materials:!1},reproducible:!1},materials:[{uri:`git+${Bt.CI_PROJECT_URL}`,digest:{sha1:Bt.CI_COMMIT_SHA}}]}}}else throw new jt(91,"Provenance generation is only supported in GitHub Actions and GitLab CI");return Oxe.attest(Buffer.from(JSON.stringify(r)),GDt,e)};async function XDt(t,e,{access:r,tag:s,registry:a,gitHead:n,provenance:c}){let f=t.manifest.name,p=t.manifest.version,h=G.stringifyIdent(f),E=Mxe.default.fromData(e,{algorithms:["sha1","sha512"]}),C=r??Uxe(t,f),S=await _xe(t),b=await yA.genPackageManifest(t),I=`${h}-${p}.tgz`,T=new URL(`${Jc(a)}/${h}/-/${I}`),N={[I]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}};if(c){let U={name:`pkg:npm/${h.replace(/^@/,"%40")}@${p}`,digest:{sha512:E.sha512[0].hexDigest()}},W=await Lxe([U]),ee=JSON.stringify(W);N[`${h}-${p}.sigstore`]={content_type:W.mediaType,data:ee,length:ee.length}}return{_id:h,_attachments:N,name:h,access:C,"dist-tags":{[s]:p},versions:{[p]:{...b,_id:`${h}@${p}`,name:h,version:p,gitHead:n,dist:{shasum:E.sha1[0].hexDigest(),integrity:E.sha512[0].toString(),tarball:T.toString()}}},readme:S}}async function $Dt(t){try{let{stdout:e}=await qr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}function Uxe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?t.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):e.scope?"restricted":"public"}async function _xe(t){let e=fe.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${G.stringifyIdent(r)} `;try{a=await ce.readFilePromise(e,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var DK={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},Hxe={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},ePt={npmMinimalAgeGate:{description:"Minimum age of a package version according to the publish date on the npm registry in minutes to be considered for installation",type:"NUMBER",default:0},npmPreapprovedPackages:{description:"Array of package descriptors or package name glob patterns to exclude from the minimum release age check",type:"STRING",isArray:!0,default:[]}},tPt={configuration:{...DK,...Hxe,...ePt,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...DK,...Hxe}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:Jc,valueDefinition:{description:"",type:"SHAPE",properties:{...DK}}}},fetchers:[VD,oh],resolvers:[JD,KD,zD]},rPt=tPt;var OK={};Vt(OK,{NpmAuditCommand:()=>D1,NpmInfoCommand:()=>P1,NpmLoginCommand:()=>b1,NpmLogoutCommand:()=>k1,NpmPublishCommand:()=>Q1,NpmTagAddCommand:()=>T1,NpmTagListCommand:()=>R1,NpmTagRemoveCommand:()=>F1,NpmWhoamiCommand:()=>N1,default:()=>cPt,npmAuditTypes:()=>KP,npmAuditUtils:()=>xL});Ge();Ge();Yt();var RK=ut(Go());Ul();var KP={};Vt(KP,{Environment:()=>VP,Severity:()=>JP});var VP=(s=>(s.All="all",s.Production="production",s.Development="development",s))(VP||{}),JP=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(JP||{});var xL={};Vt(xL,{allSeverities:()=>S1,getPackages:()=>QK,getReportTree:()=>xK,getSeverityInclusions:()=>bK,getTopLevelDependencies:()=>kK});Ge();var jxe=ut(Ai());var S1=["info","low","moderate","high","critical"];function bK(t){if(typeof t>"u")return new Set(S1);let e=S1.indexOf(t),r=S1.slice(e);return new Set(r)}function xK(t){let e={},r={children:e};for(let[s,a]of je.sortMap(Object.entries(t),n=>n[0]))for(let n of je.sortMap(a,c=>`${c.id}`))e[`${s}/${n.id}`]={value:he.tuple(he.Type.IDENT,G.parseIdent(s)),children:{ID:typeof n.id<"u"&&{label:"ID",value:he.tuple(he.Type.ID,n.id)},Issue:{label:"Issue",value:he.tuple(he.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:he.tuple(he.Type.URL,n.url)},Severity:{label:"Severity",value:he.tuple(he.Type.NO_HINT,n.severity)},"Vulnerable Versions":{label:"Vulnerable Versions",value:he.tuple(he.Type.RANGE,n.vulnerable_versions)},"Tree Versions":{label:"Tree Versions",children:[...n.versions].sort(jxe.default.compare).map(c=>({value:he.tuple(he.Type.REFERENCE,c)}))},Dependents:{label:"Dependents",children:je.sortMap(n.dependents,c=>G.stringifyLocator(c)).map(c=>({value:he.tuple(he.Type.LOCATOR,c)}))}}};return r}function kK(t,e,{all:r,environment:s}){let a=[],n=r?t.workspaces:[e],c=["all","production"].includes(s),f=["all","development"].includes(s);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!f:!c)||a.push({workspace:p,dependency:h});return a}function QK(t,e,{recursive:r}){let s=new Map,a=new Set,n=[],c=(f,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");if(G.ensureDevirtualizedLocator(E).reference.startsWith("npm:")&&E.version!==null){let S=G.stringifyIdent(E),b=je.getMapWithDefault(s,S);je.getArrayWithDefault(b,E.version).push(f)}if(r)for(let S of E.dependencies.values())n.push([E,S])};for(let{workspace:f,dependency:p}of e)n.push([f.anchoredLocator,p]);for(;n.length>0;){let[f,p]=n.shift();c(f,p)}return s}var D1=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=ge.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=ge.String("--environment","all",{description:"Which environments to cover",validator:fo(VP)});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=ge.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=ge.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:fo(JP)});this.excludes=ge.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=ge.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}static{this.paths=[["npm","audit"]]}static{this.usage=ot.Usage({description:"perform a vulnerability audit against the installed packages",details:` This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${S1.map(r=>`\`${r}\``).join(", ")}. If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` to get more information as to who depends on them. `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=kK(s,a,{all:this.all,environment:this.environment}),c=QK(s,n,{recursive:this.recursive}),f=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[N,U]of c)f.some(W=>RK.default.isMatch(N,W))||(p[N]=[...U.keys()]);let h=hi.getAuditRegistry({configuration:r}),E,C=await lA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=an.post("/-/npm/v1/security/advisories/bulk",p,{authType:an.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([ee,ie])=>{let ue=await an.getPackageMetadata(G.parseIdent(ee),{project:s});return je.mapAndFilter(ie,le=>{let{deprecated:me}=ue.versions[le];return me?[ee,le,me]:je.mapAndFilter.skip})})),W=await N;for(let[ee,ie,ue]of U.flat(1))Object.hasOwn(W,ee)&&W[ee].some(le=>Fr.satisfiesWithPrereleases(ie,le.vulnerable_versions))||(W[ee]??=[],W[ee].push({id:`${ee} (deprecation)`,title:(typeof ue=="string"?ue:"").trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:ie}));E=W});if(C.hasErrors())return C.exitCode();let S=bK(this.severity),b=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),I=Object.create(null);for(let[N,U]of Object.entries(E)){let W=U.filter(ee=>!RK.default.isMatch(`${ee.id}`,b)&&S.has(ee.severity));W.length>0&&(I[N]=W.map(ee=>{let ie=c.get(N);if(typeof ie>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let ue=[...ie.keys()].filter(me=>Fr.satisfiesWithPrereleases(me,ee.vulnerable_versions)),le=new Map;for(let me of ue)for(let pe of ie.get(me))le.set(pe.locatorHash,pe);return{...ee,versions:ue,dependents:[...le.values()]}}))}let T=Object.keys(I).length>0;return T?(xs.emitTree(xK(I),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,"No audit suggestions")}),T?1:0)}};Ge();Ge();Dt();Yt();var TK=ut(Ai()),FK=Ie("util"),P1=class extends ft{constructor(){super(...arguments);this.fields=ge.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=ge.Rest()}static{this.paths=[["npm","info"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],c=!1,f=await Ot.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let ie=s.topLevelWorkspace;if(!ie.manifest.name)throw new nt(`Missing ${he.pretty(r,"name",he.Type.CODE)} field in ${fe.fromPortablePath(J.join(ie.cwd,Er.manifest))}`);E=G.makeDescriptor(ie.manifest.name,"unknown")}else E=G.parseDescriptor(h);let C=an.getIdentUrl(E),S=NK(await an.get(C,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:an.customPackageError})),b=Object.keys(S.versions).sort(TK.default.compareLoose),T=S["dist-tags"].latest||b[b.length-1],N=Fr.validRange(E.range);if(N){let ie=TK.default.maxSatisfying(b,N);ie!==null?T=ie:(p.reportWarning(0,`Unmet range ${G.prettyRange(r,E.range)}; falling back to the latest version`),c=!0)}else Object.hasOwn(S["dist-tags"],E.range)?T=S["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${G.prettyRange(r,E.range)}; falling back to the latest version`),c=!0);let U=S.versions[T],W={...S,...U,version:T,versions:b},ee;if(a!==null){ee={};for(let ie of a){let ue=W[ie];if(typeof ue<"u")ee[ie]=ue;else{p.reportWarning(1,`The ${he.pretty(r,ie,he.Type.CODE)} field doesn't exist inside ${G.prettyIdent(r,E)}'s information`),c=!0;continue}}}else this.json||(delete W.dist,delete W.readme,delete W.users),ee=W;p.reportJson(ee),this.json||n.push(ee)}});FK.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||c)&&this.context.stdout.write(` `),this.context.stdout.write(`${(0,FK.inspect)(p,{depth:1/0,colors:!0,compact:!1})} `);return f.exitCode()}};function NK(t){if(Array.isArray(t)){let e=[];for(let r of t)r=NK(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let s=NK(t[r]);s&&(e[r]=s)}return e}else return t||null}Ge();Ge();Yt();var Gxe=ut(Vv()),b1=class extends ft{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=ge.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"})}static{this.paths=[["npm","login"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=await kL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Ot.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let c=await sPt({configuration:r,registry:s,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),f=await nPt(s,c,r);return await iPt(s,f,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};async function kL({scope:t,publish:e,configuration:r,cwd:s}){return t&&e?hi.getScopeRegistry(t,{configuration:r,type:hi.RegistryType.PUBLISH_REGISTRY}):t?hi.getScopeRegistry(t,{configuration:r}):e?hi.getPublishRegistry((await eC(r,s)).manifest,{configuration:r}):hi.getDefaultRegistry({configuration:r})}async function nPt(t,e,r){let s=`/-/user/org.couchdb.user:${encodeURIComponent(e.name)}`,a={_id:`org.couchdb.user:${e.name}`,name:e.name,password:e.password,type:"user",roles:[],date:new Date().toISOString()},n={attemptedAs:e.name,configuration:r,registry:t,jsonResponse:!0,authType:an.AuthType.NO_AUTH};try{return(await an.put(s,a,n)).token}catch(E){if(!(E.originalError?.name==="HTTPError"&&E.originalError?.response.statusCode===409))throw E}let c={...n,authType:an.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${e.name}:${e.password}`).toString("base64")}`}},f=await an.get(s,c);for(let[E,C]of Object.entries(f))(!a[E]||E==="roles")&&(a[E]=C);let p=`${s}/-rev/${a._rev}`;return(await an.put(p,a,c)).token}async function iPt(t,e,{alwaysAuth:r,scope:s}){let a=c=>f=>{let p=je.isIndexableObject(f)?f:{},h=p[c],E=je.isIndexableObject(h)?h:{};return{...p,[c]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=s?{npmScopes:a(s)}:{npmRegistries:a(t)};return await ze.updateHomeConfiguration(n)}async function sPt({configuration:t,registry:e,report:r,stdin:s,stdout:a}){r.reportInfo(0,`Logging in to ${he.pretty(t,e,he.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||"",password:t.env.YARN_INJECT_NPM_PASSWORD||""};let c=await(0,Gxe.prompt)([{type:"input",name:"name",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:s,stdout:a}]);return r.reportSeparator(),c}Ge();Ge();Yt();var x1=new Set(["npmAuthIdent","npmAuthToken"]),k1=class extends ft{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=ge.Boolean("-A,--all",!1,{description:"Logout of all registries"})}static{this.paths=[["npm","logout"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s=async()=>{let n=await kL({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),c=await ze.find(this.context.cwd,this.context.plugins),f=G.makeIdent(this.scope??null,"pkg");return!hi.getAuthConfiguration(n,{configuration:c,ident:f}).get("npmAuthToken")};return(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await aPt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await qxe("npmScopes",this.scope),await s()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let c=await kL({configuration:r,cwd:this.context.cwd,publish:this.publish});await qxe("npmRegistries",c),await s()?n.reportInfo(0,`Successfully logged out from ${c}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};function oPt(t,e){let r=t[e];if(!je.isIndexableObject(r))return!1;let s=new Set(Object.keys(r));if([...x1].every(n=>!s.has(n)))return!1;for(let n of x1)s.delete(n);if(s.size===0)return t[e]=void 0,!0;let a={...r};for(let n of x1)delete a[n];return t[e]=a,!0}async function aPt(){let t=e=>{let r=!1,s=je.isIndexableObject(e)?{...e}:{};s.npmAuthToken&&(delete s.npmAuthToken,r=!0);for(let a of Object.keys(s))oPt(s,a)&&(r=!0);if(Object.keys(s).length!==0)return r?s:e};return await ze.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function qxe(t,e){return await ze.updateHomeConfiguration({[t]:r=>{let s=je.isIndexableObject(r)?r:{};if(!Object.hasOwn(s,e))return r;let a=s[e],n=je.isIndexableObject(a)?a:{},c=new Set(Object.keys(n));if([...x1].every(p=>!c.has(p)))return r;for(let p of x1)c.delete(p);if(c.size===0)return Object.keys(s).length===1?void 0:{...s,[e]:void 0};let f={};for(let p of x1)f[p]=void 0;return{...s,[e]:{...n,...f}}}})}Ge();Dt();Yt();var Q1=class extends ft{constructor(){super(...arguments);this.access=ge.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=ge.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=ge.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=ge.String("--otp",{description:"The OTP token to use with the command"});this.provenance=ge.Boolean("--provenance",!1,{description:"Generate provenance for the package. Only available in GitHub Actions and GitLab CI. Can be set globally through the `npmPublishProvenance` setting or the `YARN_NPM_CONFIG_PROVENANCE` environment variable, or per-package through the `publishConfig.provenance` field in package.json."});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"Show what would be published without actually publishing"});this.json=ge.Boolean("--json",!1,{description:"Output the result in JSON format"})}static{this.paths=[["npm","publish"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overridden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);if(a.manifest.private)throw new nt("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new nt("Workspaces must have valid names and versions to be published on an external registry");await s.restoreInstallState();let n=a.manifest.name,c=a.manifest.version,f=hi.getPublishRegistry(a.manifest,{configuration:r});return(await Ot.start({configuration:r,stdout:this.context.stdout,json:this.json},async h=>{if(this.tolerateRepublish)try{let E=await an.get(an.getIdentUrl(n),{configuration:r,registry:f,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,"versions"))throw new jt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(E.versions,c)){let C=`Registry already knows about version ${c}; skipping.`;h.reportWarning(0,C),h.reportJson({name:n.name,version:c,registry:f,warning:C,skipped:!0});return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await In.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await yA.prepareForPack(a,{report:h},async()=>{let E=await yA.genPackList(a);for(let W of E)h.reportInfo(null,fe.fromPortablePath(W)),h.reportJson({file:fe.fromPortablePath(W)});let C=await yA.genPackStream(a,E),S=await je.bufferStream(C),b=await v1.getGitHead(a.cwd),I=!1,T="";a.manifest.publishConfig&&"provenance"in a.manifest.publishConfig?(I=!!a.manifest.publishConfig.provenance,T=I?"Generating provenance statement because `publishConfig.provenance` field is set.":"Skipping provenance statement because `publishConfig.provenance` field is set to false."):this.provenance?(I=!0,T="Generating provenance statement because `--provenance` flag is set."):r.get("npmPublishProvenance")&&(I=!0,T="Generating provenance statement because `npmPublishProvenance` setting is set."),T&&(h.reportInfo(null,T),h.reportJson({type:"provenance",enabled:I,provenanceMessage:T}));let N=await v1.makePublishBody(a,S,{access:this.access,tag:this.tag,registry:f,gitHead:b,provenance:I});this.dryRun||await an.put(an.getIdentUrl(n),N,{configuration:r,registry:f,ident:n,otp:this.otp,jsonResponse:!0,allowOidc:!!(process.env.CI&&(process.env.GITHUB_ACTIONS||process.env.GITLAB))});let U=this.dryRun?`[DRY RUN] Package would be published to ${f} with tag ${this.tag}`:"Package archive published";h.reportInfo(0,U),h.reportJson({name:n.name,version:c,registry:f,tag:this.tag||"latest",files:E.map(W=>fe.fromPortablePath(W)),access:this.access||null,dryRun:this.dryRun,published:!this.dryRun,message:U,provenance:!!I})})})).exitCode()}};Ge();Yt();var Wxe=ut(Ai());Ge();Dt();Yt();var R1=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String({required:!1})}static{this.paths=[["npm","tag","list"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` This command will list all tags of a package from the npm registry. If the package is not specified, Yarn will default to the current workspace. `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n;if(typeof this.package<"u")n=G.parseIdent(this.package);else{if(!a)throw new ar(s.cwd,this.context.cwd);if(!a.manifest.name)throw new nt(`Missing 'name' field in ${fe.fromPortablePath(J.join(a.cwd,Er.manifest))}`);n=a.manifest.name}let c=await zP(n,r),p={children:je.sortMap(Object.entries(c),([h])=>h).map(([h,E])=>({value:he.tuple(he.Type.RESOLUTION,{descriptor:G.makeDescriptor(n,h),locator:G.makeLocator(n,E)})}))};return xs.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function zP(t,e){let r=`/-/package${an.getIdentUrl(t)}/dist-tags`;return an.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:an.customPackageError})}var T1=class extends ft{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[["npm","tag","add"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=G.parseDescriptor(this.package,!0),c=n.range;if(!Wxe.default.valid(c))throw new nt(`The range ${he.pretty(r,n.range,he.Type.RANGE)} must be a valid semver version`);let f=hi.getPublishRegistry(a.manifest,{configuration:r}),p=he.pretty(r,n,he.Type.IDENT),h=he.pretty(r,c,he.Type.RANGE),E=he.pretty(r,this.tag,he.Type.CODE);return(await Ot.start({configuration:r,stdout:this.context.stdout},async S=>{let b=await zP(n,r);Object.hasOwn(b,this.tag)&&b[this.tag]===c&&S.reportWarning(0,`Tag ${E} is already set to version ${h}`);let I=`/-/package${an.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await an.put(I,c,{configuration:r,registry:f,ident:n,jsonRequest:!0,jsonResponse:!0}),S.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ge();Yt();var F1=class extends ft{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[["npm","tag","remove"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` This command will remove a tag from a package from the npm registry. `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]})}async execute(){if(this.tag==="latest")throw new nt("The 'latest' tag cannot be removed.");let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=G.parseIdent(this.package),c=hi.getPublishRegistry(a.manifest,{configuration:r}),f=he.pretty(r,this.tag,he.Type.CODE),p=he.pretty(r,n,he.Type.IDENT),h=await zP(n,r);if(!Object.hasOwn(h,this.tag))throw new nt(`${f} is not a tag of package ${p}`);return(await Ot.start({configuration:r,stdout:this.context.stdout},async C=>{let S=`/-/package${an.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await an.del(S,{configuration:r,registry:c,ident:n,jsonResponse:!0}),C.reportInfo(0,`Tag ${f} removed from package ${p}`)})).exitCode()}};Ge();Ge();Yt();var N1=class extends ft{constructor(){super(...arguments);this.scope=ge.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=ge.Boolean("--publish",!1,{description:"Print username for the publish registry"})}static{this.paths=[["npm","whoami"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),s;return this.scope&&this.publish?s=hi.getScopeRegistry(this.scope,{configuration:r,type:hi.RegistryType.PUBLISH_REGISTRY}):this.scope?s=hi.getScopeRegistry(this.scope,{configuration:r}):this.publish?s=hi.getPublishRegistry((await eC(r,this.context.cwd)).manifest,{configuration:r}):s=hi.getDefaultRegistry({configuration:r}),(await Ot.start({configuration:r,stdout:this.context.stdout},async n=>{let c;try{c=await an.get("/-/whoami",{configuration:r,registry:s,authType:an.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?G.makeIdent(this.scope,""):void 0})}catch(f){if(f.response?.statusCode===401||f.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw f}n.reportInfo(0,c.username)})).exitCode()}};var lPt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmPublishProvenance:{description:"Whether to generate provenance for the published packages",type:"BOOLEAN",default:!1},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[D1,P1,b1,k1,Q1,T1,R1,F1,N1]},cPt=lPt;var GK={};Vt(GK,{PatchCommand:()=>H1,PatchCommitCommand:()=>_1,PatchFetcher:()=>tb,PatchResolver:()=>rb,default:()=>PPt,patchUtils:()=>gy});Ge();Ge();Dt();eA();var gy={};Vt(gy,{applyPatchFile:()=>RL,diffFolders:()=>HK,ensureUnpatchedDescriptor:()=>LK,ensureUnpatchedLocator:()=>FL,extractPackageToDisk:()=>_K,extractPatchFlags:()=>Xxe,isParentRequired:()=>UK,isPatchDescriptor:()=>TL,isPatchLocator:()=>Tg,loadPatchFiles:()=>eb,makeDescriptor:()=>NL,makeLocator:()=>MK,makePatchHash:()=>jK,parseDescriptor:()=>XP,parseLocator:()=>$P,parsePatchFile:()=>ZP,unpatchDescriptor:()=>vPt,unpatchLocator:()=>SPt});Ge();Dt();Ge();Dt();var uPt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function O1(t){return J.relative(vt.root,J.resolve(vt.root,fe.toPortablePath(t)))}function fPt(t){let e=t.trim().match(uPt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var APt=420,pPt=493;var Yxe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),hPt=t=>({header:fPt(t),parts:[]}),gPt={"@":"header","-":"deletion","+":"insertion"," ":"context","\\":"pragma",undefined:"context"};function dPt(t){let e=[],r=Yxe(),s="parsing header",a=null,n=null;function c(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function f(){c(),e.push(r),r=Yxe()}for(let p=0;p0?"patch":"mode change",W=null;switch(U){case"rename":{if(!E||!C)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:s,fromPath:O1(E),toPath:O1(C)}),W=C}break;case"file deletion":{let ee=a||I;if(!ee)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:s,hunk:N&&N[0]||null,path:O1(ee),mode:QL(p),hash:S})}break;case"file creation":{let ee=n||T;if(!ee)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:s,hunk:N&&N[0]||null,path:O1(ee),mode:QL(h),hash:b})}break;case"patch":case"mode change":W=T||n;break;default:je.assertNever(U);break}W&&c&&f&&c!==f&&e.push({type:"mode change",semverExclusivity:s,path:O1(W),oldMode:QL(c),newMode:QL(f)}),W&&N&&N.length&&e.push({type:"patch",semverExclusivity:s,path:O1(W),hunks:N,beforeHash:S,afterHash:b})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function QL(t){let e=parseInt(t,8)&511;if(e!==APt&&e!==pPt)throw new Error(`Unexpected file mode string: ${t}`);return e}function ZP(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),mPt(dPt(e))}function yPt(t){let e=0,r=0;for(let{type:s,lines:a}of t.parts)switch(s){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:je.assertNever(s);break}if(e!==t.header.original.length||r!==t.header.patched.length){let s=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${s(t.header.original.length)} ${s(t.header.patched.length)} @@, got @@ ${s(e)} ${s(r)} @@)`)}}Ge();Dt();var L1=class extends Error{constructor(r,s){super(`Cannot apply hunk #${r+1}`);this.hunk=s}};async function M1(t,e,r){let s=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,s.atime,s.mtime)}async function RL(t,{baseFs:e=new Yn,dryRun:r=!1,version:s=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&s!==null&&!Fr.satisfiesWithPrereleases(s,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await M1(e,J.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await M1(e,J.dirname(a.fromPath),async()=>{await M1(e,J.dirname(a.toPath),async()=>{await M1(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` `)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` `):"";await e.mkdirpPromise(J.dirname(a.path),{chmod:493,utimes:[fi.SAFE_TIME,fi.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,fi.SAFE_TIME,fi.SAFE_TIME)}break;case"patch":await M1(e,a.path,async()=>{await CPt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let c=(await e.statPromise(a.path)).mode;if(Vxe(a.newMode)!==Vxe(c))continue;await M1(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:je.assertNever(a);break}}function Vxe(t){return(t&64)>0}function Jxe(t){return t.replace(/\s+$/,"")}function IPt(t,e){return Jxe(t)===Jxe(e)}async function CPt({hunks:t,path:e},{baseFs:r,dryRun:s=!1}){let a=await r.statSync(e).mode,c=(await r.readFileSync(e,"utf8")).split(/\n/),f=[],p=0,h=0;for(let C of t){let S=Math.max(h,C.header.patched.start+p),b=Math.max(0,S-h),I=Math.max(0,c.length-S-C.header.original.length),T=Math.max(b,I),N=0,U=0,W=null;for(;N<=T;){if(N<=b&&(U=S-N,W=Kxe(C,c,U),W!==null)){N=-N;break}if(N<=I&&(U=S+N,W=Kxe(C,c,U),W!==null))break;N+=1}if(W===null)throw new L1(t.indexOf(C),C);f.push(W),p+=N,h=U+C.header.original.length}if(s)return;let E=0;for(let C of f)for(let S of C)switch(S.type){case"splice":{let b=S.index+E;c.splice(b,S.numToDelete,...S.linesToInsert),E+=S.linesToInsert.length-S.numToDelete}break;case"pop":c.pop();break;case"push":c.push(S.line);break;default:je.assertNever(S);break}await r.writeFilePromise(e,c.join(` `),{mode:a})}function Kxe(t,e,r){let s=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let c=e[r];if(c==null||!IPt(c,n))return null;r+=1}a.type==="deletion"&&(s.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&s.push({type:"push",line:""}))}break;case"insertion":s.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&s.push({type:"pop"});break;default:je.assertNever(a.type);break}return s}var BPt=/^builtin<([^>]+)>$/;function U1(t,e){let{protocol:r,source:s,selector:a,params:n}=G.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(s===null)throw new Error("Patch locators must explicitly define their source");let c=a?a.split(/&/).map(E=>fe.toPortablePath(E)):[],f=n&&typeof n.locator=="string"?G.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(s);return{parentLocator:f,sourceItem:h,patchPaths:c,sourceVersion:p}}function TL(t){return t.range.startsWith("patch:")}function Tg(t){return t.reference.startsWith("patch:")}function XP(t){let{sourceItem:e,...r}=U1(t.range,G.parseDescriptor);return{...r,sourceDescriptor:e}}function $P(t){let{sourceItem:e,...r}=U1(t.reference,G.parseLocator);return{...r,sourceLocator:e}}function vPt(t){let{sourceItem:e}=U1(t.range,G.parseDescriptor);return e}function SPt(t){let{sourceItem:e}=U1(t.reference,G.parseLocator);return e}function LK(t){if(!TL(t))return t;let{sourceItem:e}=U1(t.range,G.parseDescriptor);return e}function FL(t){if(!Tg(t))return t;let{sourceItem:e}=U1(t.reference,G.parseLocator);return e}function zxe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:s,patchHash:a},n){let c=t!==null?{locator:G.stringifyLocator(t)}:{},f=typeof s<"u"?{version:s}:{},p=typeof a<"u"?{hash:a}:{};return G.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...f,...p,...c}})}function NL(t,{parentLocator:e,sourceDescriptor:r,patchPaths:s}){return G.makeDescriptor(t,zxe({parentLocator:e,sourceItem:r,patchPaths:s},G.stringifyDescriptor))}function MK(t,{parentLocator:e,sourcePackage:r,patchPaths:s,patchHash:a}){return G.makeLocator(t,zxe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:s,patchHash:a},G.stringifyLocator))}function Zxe({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:s},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let c=a.match(BPt);return c!==null?s(c[1]):a.startsWith("~/")?r(a.slice(2)):J.isAbsolute(a)?t(a):e(a)}function Xxe(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function UK(t){return Zxe({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function eb(t,e,r){let s=t!==null?await r.fetcher.fetch(t,r):null,a=s&&s.localPath?{packageFs:new Sn(vt.root),prefixPath:J.relative(vt.root,s.localPath)}:s;s&&s!==a&&s.releaseFs&&s.releaseFs();let n=await je.releaseAfterUseAsync(async()=>await Promise.all(e.map(async c=>{let f=Xxe(c),p=await Zxe({onAbsolute:async h=>await ce.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(J.join(a.prefixPath,h),"utf8")},onProject:async h=>await ce.readFilePromise(J.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},c);return{...f,source:p}})));for(let c of n)typeof c.source=="string"&&(c.source=c.source.replace(/\r\n?/g,` `));return n}async function _K(t,{cache:e,project:r}){let s=r.storedPackages.get(t.locatorHash);if(typeof s>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=FL(t),n=r.storedChecksums,c=new ki,f=await ce.mktempPromise(),p=J.join(f,"source"),h=J.join(f,"user"),E=J.join(f,".yarn-patch.json"),C=r.configuration.makeFetcher(),S=[];try{let b,I;if(t.locatorHash===a.locatorHash){let T=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c});S.push(()=>T.releaseFs?.()),b=T,I=T}else b=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>b.releaseFs?.()),I=await C.fetch(t,{cache:e,project:r,fetcher:C,checksums:n,report:c}),S.push(()=>I.releaseFs?.());await Promise.all([ce.copyPromise(p,b.prefixPath,{baseFs:b.packageFs}),ce.copyPromise(h,I.prefixPath,{baseFs:I.packageFs}),ce.writeJsonPromise(E,{locator:G.stringifyLocator(t),version:s.version})])}finally{for(let b of S)b()}return ce.detachTemp(f),h}async function HK(t,e){let r=fe.fromPortablePath(t).replace(/\\/g,"/"),s=fe.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await qr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,s],{cwd:fe.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. The following error was reported by 'git': ${n}`);let c=r.startsWith("/")?f=>f.slice(1):f=>f;return a.replace(new RegExp(`(a|b)(${je.escapeRegExp(`/${c(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${je.escapeRegExp(`/${c(s)}/`)}`,"g"),"$1/").replace(new RegExp(je.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(je.escapeRegExp(`${s}/`),"g"),"")}function jK(t,e){let r=[];for(let{source:s}of t){if(s===null)continue;let a=ZP(s);for(let n of a){let{semverExclusivity:c,...f}=n;c!==null&&e!==null&&!Fr.satisfiesWithPrereleases(e,c)||r.push(JSON.stringify(f))}}return Nn.makeHash(`${3}`,...r).slice(0,6)}Ge();function $xe(t,{configuration:e,report:r}){for(let s of t.parts)for(let a of s.lines)switch(s.type){case"context":r.reportInfo(null,` ${he.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${he.pretty(e,a,he.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${he.pretty(e,a,he.Type.ADDED)}`);break;default:je.assertNever(s.type)}}var tb=class{supports(e,r){return!!Tg(e)}getLocalPath(e,r){return null}async fetch(e,r){let s=r.checksums.get(e.locatorHash)||null,[a,n,c]=await r.cache.fetchPackageFromCache(e,s,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:c}}async patchPackage(e,r){let{parentLocator:s,sourceLocator:a,sourceVersion:n,patchPaths:c}=$P(e),f=await eb(s,c,r),p=await ce.mktempPromise(),h=J.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),C=G.getIdentVendorPath(e),S=new As(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await je.releaseAfterUseAsync(async()=>{await S.copyPromise(C,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),S.saveAndClose();for(let{source:b,optional:I}of f){if(b===null)continue;let T=new As(h,{level:r.project.configuration.get("compressionLevel")}),N=new Sn(J.resolve(vt.root,C),{baseFs:T});try{await RL(ZP(b),{baseFs:N,version:n})}catch(U){if(!(U instanceof L1))throw U;let W=r.project.configuration.get("enableInlineHunks"),ee=!W&&!I?" (set enableInlineHunks for details)":"",ie=`${G.prettyLocator(r.project.configuration,e)}: ${U.message}${ee}`,ue=le=>{W&&$xe(U.hunk,{configuration:r.project.configuration,report:le})};if(T.discardAndClose(),I){r.report.reportWarningOnce(66,ie,{reportExtra:ue});continue}else throw new jt(66,ie,ue)}T.saveAndClose()}return new As(h,{level:r.project.configuration.get("compressionLevel")})}};Ge();var rb=class{supportsDescriptor(e,r){return!!TL(e)}supportsLocator(e,r){return!!Tg(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,s){let{patchPaths:a}=XP(e);return a.every(n=>!UK(n))?e:G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:s}=XP(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(s)}}async getCandidates(e,r,s){if(!s.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=XP(e),c=await eb(a,n,s.fetchOptions),f=r.sourceDescriptor;if(typeof f>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=jK(c,f.version);return[MK(e,{parentLocator:a,sourcePackage:f,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,s,a){let[n]=await this.getCandidates(e,r,a);return{locators:s.filter(c=>c.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:s}=$P(e);return{...await r.resolver.resolve(s,r),...e}}};Ge();Dt();Yt();var _1=class extends ft{constructor(){super(...arguments);this.save=ge.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=ge.String()}static{this.paths=[["patch-commit"]]}static{this.usage=ot.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=J.resolve(this.context.cwd,fe.toPortablePath(this.patchFolder)),c=J.join(n,"../source"),f=J.join(n,"../.yarn-patch.json");if(!ce.existsSync(c))throw new nt("The argument folder didn't get created by 'yarn patch'");let p=await HK(c,n),h=await ce.readJsonPromise(f),E=G.parseLocator(h.locator,!0);if(!s.storedPackages.has(E.locatorHash))throw new nt("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let C=r.get("patchFolder"),S=J.join(C,`${G.slugifyLocator(E)}.patch`);await ce.mkdirPromise(C,{recursive:!0}),await ce.writeFilePromise(S,p);let b=[],I=new Map;for(let T of s.storedPackages.values()){if(G.isVirtualLocator(T))continue;let N=T.dependencies.get(E.identHash);if(!N)continue;let U=G.ensureDevirtualizedDescriptor(N),W=LK(U),ee=s.storedResolutions.get(W.descriptorHash);if(!ee)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!s.storedPackages.get(ee))throw new Error("Assertion failed: Expected the package to have been registered");let ue=s.tryWorkspaceByLocator(T);if(ue)b.push(ue);else{let le=s.originalPackages.get(T.locatorHash);if(!le)throw new Error("Assertion failed: Expected the original package to have been registered");let me=le.dependencies.get(N.identHash);if(!me)throw new Error("Assertion failed: Expected the original dependency to have been registered");I.set(me.descriptorHash,me)}}for(let T of b)for(let N of Ut.hardDependencies){let U=T.manifest[N].get(E.identHash);if(!U)continue;let W=NL(U,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[J.join(Er.home,J.relative(s.cwd,S))]});T.manifest[N].set(U.identHash,W)}for(let T of I.values()){let N=NL(T,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[J.join(Er.home,J.relative(s.cwd,S))]});s.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:G.stringifyIdent(N),description:T.range}},reference:N.range})}await s.persist()}};Ge();Dt();Yt();var H1=class extends ft{constructor(){super(...arguments);this.update=ge.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=ge.String()}static{this.paths=[["patch"]]}static{this.usage=ot.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let c=G.parseLocator(this.package);if(c.reference==="unknown"){let f=je.mapAndFilter([...s.storedPackages.values()],p=>p.identHash!==c.identHash?je.mapAndFilter.skip:G.isVirtualLocator(p)?je.mapAndFilter.skip:Tg(p)!==this.update?je.mapAndFilter.skip:p);if(f.length===0)throw new nt("No package found in the project for the given locator");if(f.length>1)throw new nt(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): ${f.map(p=>` - ${G.prettyLocator(r,p)}`).join("")}`);c=f[0]}if(!s.storedPackages.has(c.locatorHash))throw new nt("No package found in the project for the given locator");await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=FL(c),h=await _K(c,{cache:n,project:s});f.reportJson({locator:G.stringifyLocator(p),path:fe.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";f.reportInfo(0,`Package ${G.prettyLocator(r,p)} got extracted with success${E}!`),f.reportInfo(0,`You can now edit the following folder: ${he.pretty(r,fe.fromPortablePath(h),"magenta")}`),f.reportInfo(0,`Once you are done run ${he.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${fe.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};var DPt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[_1,H1],fetchers:[tb],resolvers:[rb]},PPt=DPt;var YK={};Vt(YK,{PnpmLinker:()=>nb,default:()=>TPt});Ge();Dt();Yt();var nb=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new nt(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let s=this.getCustomDataKey(),a=r.project.linkersCustomData.get(s);if(!a)throw new nt(`The project in ${he.pretty(r.project.configuration,`${r.project.cwd}/package.json`,he.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let c=e,f=e;do{f=c,c=J.dirname(f);let p=a.locatorByPath.get(f);if(p)return p}while(c!==f);return null}makeInstaller(e){return new qK(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},qK=class{constructor(e){this.opts=e;this.asyncActions=new je.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=$b(ce,{indexPath:J.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,s){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,s);case"HARD":return this.installPackageHard(e,r,s)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,s){let a=J.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?J.join(a,Er.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,s){let a=xPt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,G.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),s.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await ce.mkdirPromise(n,{recursive:!0}),await ce.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let f=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e,p={manifest:await Ut.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Ut,misc:{hasBindingGyp:gA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(f,e.version),E=gA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!eke(e,{project:this.opts.project}))return;let s=this.customData.pathsByLocator.get(e.locatorHash);if(typeof s>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(e)})`);let{dependenciesLocation:a}=s;a&&this.asyncActions.reduce(e.locatorHash,async n=>{await ce.mkdirPromise(a,{recursive:!0});let c=await kPt(a),f=new Map(c),p=[n],h=(C,S)=>{let b=S;eke(S,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),b=G.devirtualizeLocator(S));let I=this.customData.pathsByLocator.get(b.locatorHash);if(typeof I>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(S)})`);let T=G.stringifyIdent(C),N=J.join(a,T),U=J.relative(J.dirname(N),I.packageLocation),W=f.get(T);f.delete(T),p.push(Promise.resolve().then(async()=>{if(W){if(W.isSymbolicLink()&&await ce.readlinkPromise(N)===U)return;await ce.removePromise(N)}await ce.mkdirpPromise(J.dirname(N)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await ce.symlinkPromise(I.packageLocation,N,"junction"):await ce.symlinkPromise(U,N)}))},E=!1;for(let[C,S]of r)C.identHash===e.identHash&&(E=!0),h(C,S);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(G.convertLocatorToDescriptor(e),e),p.push(QPt(a,f)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=tke(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await ce.removePromise(e);else{let r;try{r=new Set(await ce.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:s}of this.customData.pathsByLocator.values()){if(!s)continue;let a=J.contains(e,s);if(a===null)continue;let[n]=a.split(J.sep);r.delete(n)}await Promise.all([...r].map(async s=>{await ce.removePromise(J.join(e,s))}))}return await this.asyncActions.wait(),await WK(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await WK(bPt(this.opts.project)),{customData:this.customData}}};function bPt(t){return J.join(t.cwd,Er.nodeModules)}function tke(t){return t.configuration.get("pnpmStoreFolder")}function xPt(t,{project:e}){let r=G.slugifyLocator(t),s=tke(e),a=J.join(s,r,"package"),n=J.join(s,r,Er.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function eke(t,{project:e}){return!G.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function kPt(t){let e=new Map,r=[];try{r=await ce.readdirPromise(t,{withFileTypes:!0})}catch(s){if(s.code!=="ENOENT")throw s}try{for(let s of r)if(!s.name.startsWith("."))if(s.name.startsWith("@")){let a=await ce.readdirPromise(J.join(t,s.name),{withFileTypes:!0});if(a.length===0)e.set(s.name,s);else for(let n of a)e.set(`${s.name}/${n.name}`,n)}else e.set(s.name,s)}catch(s){if(s.code!=="ENOENT")throw s}return e}async function QPt(t,e){let r=[],s=new Set;for(let a of e.keys()){r.push(ce.removePromise(J.join(t,a)));let n=G.tryParseIdent(a)?.scope;n&&s.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...s].map(a=>WK(J.join(t,a)))))}async function WK(t){try{await ce.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY"&&e.code!=="EBUSY")throw e}}var RPt={configuration:{pnpmStoreFolder:{description:"By default, the store is stored in the 'node_modules/.store' of the project. Sometimes in CI scenario's it is convenient to store this in a different location so it can be cached and reused.",type:"ABSOLUTE_PATH",default:"./node_modules/.store"}},linkers:[nb]},TPt=RPt;var $K={};Vt($K,{StageCommand:()=>j1,default:()=>qPt,stageUtils:()=>LL});Ge();Dt();Yt();Ge();Dt();var LL={};Vt(LL,{ActionType:()=>VK,checkConsensus:()=>OL,expandDirectory:()=>zK,findConsensus:()=>ZK,findVcsRoot:()=>JK,genCommitMessage:()=>XK,getCommitPrefix:()=>rke,isYarnFile:()=>KK});Dt();var VK=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(VK||{});async function JK(t,{marker:e}){do if(!ce.existsSync(J.join(t,e)))t=J.dirname(t);else return t;while(t!=="/");return null}function KK(t,{roots:e,names:r}){if(r.has(J.basename(t)))return!0;do if(!e.has(t))t=J.dirname(t);else return!0;while(t!=="/");return!1}function zK(t){let e=[],r=[t];for(;r.length>0;){let s=r.pop(),a=ce.readdirSync(s);for(let n of a){let c=J.resolve(s,n);ce.lstatSync(c).isDirectory()?r.push(c):e.push(c)}}return e}function OL(t,e){let r=0,s=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:s+=1);return r>=s}function ZK(t){let e=OL(t,/^(\w\(\w+\):\s*)?\w+s/),r=OL(t,/^(\w\(\w+\):\s*)?[A-Z]/),s=OL(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:s}}function rke(t){return t.useComponent?"chore(yarn): ":""}var FPt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function XK(t,e){let r=rke(t),s=[],a=e.slice().sort((n,c)=>n[0]-c[0]);for(;a.length>0;){let[n,c]=a.shift(),f=FPt.get(n);t.useUpperCase&&s.length===0&&(f=`${f[0].toUpperCase()}${f.slice(1)}`),t.useThirdPerson&&(f+="s");let p=[c];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),s.push(`${f} ${h}`)}return`${r}${s.join(", ")}`}var NPt="Commit generated via `yarn stage`",OPt=11;async function nke(t){let{code:e,stdout:r}=await qr.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function LPt(t,e){let r=[],s=e.filter(h=>J.basename(h.path)==="package.json");for(let{action:h,path:E}of s){let C=J.relative(t,E);if(h===4){let S=await nke(t),{stdout:b}=await qr.execvp("git",["show",`${S}:${C}`],{cwd:t,strict:!0}),I=await Ut.fromText(b),T=await Ut.fromFile(E),N=new Map([...T.dependencies,...T.devDependencies]),U=new Map([...I.dependencies,...I.devDependencies]);for(let[W,ee]of U){let ie=G.stringifyIdent(ee),ue=N.get(W);ue?ue.range!==ee.range&&r.push([4,`${ie} to ${ue.range}`]):r.push([3,ie])}for(let[W,ee]of N)U.has(W)||r.push([2,G.stringifyIdent(ee)])}else if(h===0){let S=await Ut.fromFile(E);S.name?r.push([0,G.stringifyIdent(S.name)]):r.push([0,"a package"])}else if(h===1){let S=await nke(t),{stdout:b}=await qr.execvp("git",["show",`${S}:${C}`],{cwd:t,strict:!0}),I=await Ut.fromText(b);I.name?r.push([1,G.stringifyIdent(I.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await qr.execvp("git",["log",`-${OPt}`,"--pretty=format:%s"],{cwd:t}),c=a===0?n.split(/\n/g).filter(h=>h!==""):[],f=ZK(c);return XK(f,r)}var MPt={0:[" A ","?? "],4:[" M "],1:[" D "]},UPt={0:["A "],4:["M "],1:["D "]},ike={async findRoot(t){return await JK(t,{marker:".git"})},async filterChanges(t,e,r,s){let{stdout:a}=await qr.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),c=s?.staged?UPt:MPt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=J.resolve(t,p.slice(3));if(!s?.staged&&h==="?? "&&p.endsWith("/"))return zK(E).map(C=>({action:0,path:C}));{let S=[0,4,1].find(b=>c[b].includes(h));return S!==void 0?[{action:S,path:E}]:[]}})).filter(p=>KK(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await LPt(t,e)},async makeStage(t,e){let r=e.map(s=>fe.fromPortablePath(s.path));await qr.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let s=e.map(a=>fe.fromPortablePath(a.path));await qr.execvp("git",["add","-N","--",...s],{cwd:t,strict:!0}),await qr.execvp("git",["commit","-m",`${r} ${NPt} `,"--",...s],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(s=>fe.fromPortablePath(s.path));await qr.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var _Pt=[ike],j1=class extends ft{constructor(){super(...arguments);this.commit=ge.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=ge.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=ge.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=ge.Boolean("-u,--update",!1,{hidden:!0})}static{this.paths=[["stage"]]}static{this.usage=ot.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s}=await Rt.find(r,this.context.cwd),{driver:a,root:n}=await HPt(s.cwd),c=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(C=>C.populateYarnPaths,s,C=>{c.push(C)});let f=new Set;for(let C of c)for(let S of jPt(n,C))f.add(S);let p=new Set([r.get("rcFilename"),Er.lockfile,Er.manifest]),h=await a.filterChanges(n,f,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} `);else for(let C of h)this.context.stdout.write(`${fe.fromPortablePath(C.path)} `);else if(this.reset){let C=await a.filterChanges(n,f,p,{staged:!0});C.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,C)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function HPt(t){let e=null,r=null;for(let s of _Pt)if((r=await s.findRoot(t))!==null){e=s;break}if(e===null||r===null)throw new nt("No stage driver has been found for your current project");return{driver:e,root:r}}function jPt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let s;try{s=ce.statSync(e)}catch{break}if(s.isSymbolicLink())e=J.resolve(J.dirname(e),ce.readlinkSync(e));else break}return r}var GPt={commands:[j1]},qPt=GPt;var ez={};Vt(ez,{default:()=>XPt});Ge();Ge();Dt();var ake=ut(Ai());Ge();var ske=ut(l9()),WPt="e8e1bd300d860104bb8c58453ffa1eb4",YPt="OFCNCOG2CU",oke=async(t,e)=>{let r=G.stringifyIdent(t),a=VPt(e).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},VPt=t=>(0,ske.default)(YPt,WPt,{requester:{async send(r){try{let s=await ln.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:s.body,isTimedOut:!1,status:s.statusCode}}catch(s){return{content:s.response.body,isTimedOut:!1,status:s.response.statusCode}}}}});var lke=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,JPt=async(t,e,r,s)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??(ce.existsSync(J.join(t.cwd,"tsconfig.json"))||ce.existsSync(J.join(a.cwd,"tsconfig.json")))))return;let f=n.makeResolver(),p={project:a,resolver:f,report:new ki};if(!await oke(r,n))return;let E=lke(r),C=G.parseRange(r.range).selector;if(!Fr.validRange(C)){let N=n.normalizeDependency(r),U=await f.getCandidates(N,{},p);C=G.parseRange(U[0].reference).selector}let S=ake.default.coerce(C);if(S===null)return;let b=`${Zu.Modifier.CARET}${S.major}`,I=G.makeDescriptor(G.makeIdent("types",E),b),T=je.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,W=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&W!==r.descriptorHash)return je.mapAndFind.skip;let ee=[];for(let ie of Ut.allDependencies){let ue=N.manifest[ie].get(I.identHash);typeof ue>"u"||ee.push([ie,ue])}return ee.length===0?je.mapAndFind.skip:ee});if(typeof T<"u")for(let[N,U]of T)t.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(I);if((await f.getCandidates(N,{},p)).length===0)return}catch{return}t.manifest[Zu.Target.DEVELOPMENT].set(I.identHash,I)}},KPt=async(t,e,r)=>{if(r.scope==="types")return;let{project:s}=t,{configuration:a}=s;if(!(a.get("tsEnableAutoTypes")??(ce.existsSync(J.join(t.cwd,"tsconfig.json"))||ce.existsSync(J.join(s.cwd,"tsconfig.json")))))return;let c=lke(r),f=G.makeIdent("types",c);for(let p of Ut.allDependencies)typeof t.manifest[p].get(f.identHash)>"u"||t.manifest[p].delete(f.identHash)},zPt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},ZPt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:JPt,afterWorkspaceDependencyRemoval:KPt,beforeWorkspacePacking:zPt}},XPt=ZPt;var sz={};Vt(sz,{VersionApplyCommand:()=>Y1,VersionCheckCommand:()=>V1,VersionCommand:()=>J1,default:()=>nbt,versionUtils:()=>W1});Ge();Ge();Yt();var W1={};Vt(W1,{Decision:()=>G1,applyPrerelease:()=>cke,applyReleases:()=>iz,applyStrategy:()=>ib,clearVersionFiles:()=>tz,getUndecidedDependentWorkspaces:()=>ob,getUndecidedWorkspaces:()=>ML,openVersionFile:()=>q1,requireMoreDecisions:()=>ebt,resolveVersionFiles:()=>sb,suggestStrategy:()=>nz,updateVersionFiles:()=>rz,validateReleaseDecision:()=>dy});Ge();Dt();wc();Yt();ql();var kA=ut(Ai()),$Pt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,G1=(h=>(h.UNDECIDED="undecided",h.DECLINE="decline",h.MAJOR="major",h.MINOR="minor",h.PATCH="patch",h.PREMAJOR="premajor",h.PREMINOR="preminor",h.PREPATCH="prepatch",h.PRERELEASE="prerelease",h))(G1||{});function dy(t){let e=kA.default.valid(t);return e||je.validateEnum(N4(G1,"UNDECIDED"),t)}async function sb(t,{prerelease:e=null}={}){let r=new Map,s=t.configuration.get("deferredVersionFolder");if(!ce.existsSync(s))return r;let a=await ce.readdirPromise(s);for(let n of a){if(!n.endsWith(".yml"))continue;let c=J.join(s,n),f=await ce.readFilePromise(c,"utf8"),p=as(f);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let C=G.parseIdent(h),S=t.tryWorkspaceByIdent(C);if(S===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${J.basename(c)} references ${h})`);if(S.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${G.prettyLocator(t.configuration,S.anchoredLocator)})`);let b=S.manifest.raw.stableVersion??S.manifest.version,I=r.get(S),T=ib(E==="prerelease"?S.manifest.version:b,dy(E));if(T===null)throw new Error(`Assertion failed: Expected ${b} to support being bumped via strategy ${E}`);let N=typeof I<"u"?kA.default.gt(T,I)?T:I:T;r.set(S,N)}}return e&&(r=new Map([...r].map(([n,c])=>[n,cke(c,{current:n.manifest.version,prerelease:e})]))),r}async function tz(t){let e=t.configuration.get("deferredVersionFolder");ce.existsSync(e)&&await ce.removePromise(e)}async function rz(t,e){let r=new Set(e),s=t.configuration.get("deferredVersionFolder");if(!ce.existsSync(s))return;let a=await ce.readdirPromise(s);for(let n of a){if(!n.endsWith(".yml"))continue;let c=J.join(s,n),f=await ce.readFilePromise(c,"utf8"),p=as(f),h=p?.releases;if(h){for(let E of Object.keys(h)){let C=G.parseIdent(E),S=t.tryWorkspaceByIdent(C);(S===null||r.has(S))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ce.changeFilePromise(c,nl(new nl.PreserveOrdering(p))):await ce.unlinkPromise(c)}}}async function q1(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new nt("This command can only be run from within a Yarn project");let s=await ka.fetchRoot(r.projectCwd),a=s!==null?await ka.fetchBase(s,{baseRefs:r.get("changesetBaseRefs")}):null,n=s!==null?await ka.fetchChangedFiles(s,{base:a.hash,project:t}):[],c=r.get("deferredVersionFolder"),f=n.filter(b=>J.contains(c,b)!==null);if(f.length>1)throw new nt(`Your current branch contains multiple versioning files; this isn't supported: - ${f.map(b=>fe.fromPortablePath(b)).join(` - `)}`);let p=new Set(je.mapAndFilter(n,b=>{let I=t.tryWorkspaceByFilePath(b);return I===null?je.mapAndFilter.skip:I}));if(f.length===0&&p.size===0&&!e)return null;let h=f.length===1?f[0]:J.join(c,`${Nn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ce.existsSync(h)?await ce.readFilePromise(h,"utf8"):"{}",C=as(E),S=new Map;for(let b of C.declined||[]){let I=G.parseIdent(b),T=t.getWorkspaceByIdent(I);S.set(T,"decline")}for(let[b,I]of Object.entries(C.releases||{})){let T=G.parseIdent(b),N=t.getWorkspaceByIdent(T);S.set(N,dy(I))}return{project:t,root:s,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(b=>b.manifest.version!==null)),releases:S,async saveAll(){let b={},I=[],T=[];for(let N of t.workspaces){if(N.manifest.version===null)continue;let U=G.stringifyIdent(N.anchoredLocator),W=S.get(N);W==="decline"?I.push(U):typeof W<"u"?b[U]=dy(W):p.has(N)&&T.push(U)}await ce.mkdirPromise(J.dirname(h),{recursive:!0}),await ce.changeFilePromise(h,nl(new nl.PreserveOrdering({releases:Object.keys(b).length>0?b:void 0,declined:I.length>0?I:void 0,undecided:T.length>0?T:void 0})))}}}function ebt(t){return ML(t).size>0||ob(t).length>0}function ML(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function ob(t,{include:e=new Set}={}){let r=[],s=new Map(je.mapAndFilter([...t.releases],([n,c])=>c==="decline"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(je.mapAndFilter([...t.releases],([n,c])=>c!=="decline"?je.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||s.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let c of Ut.hardDependencies)for(let f of n.manifest.getForScope(c).values()){let p=t.project.tryWorkspaceByDescriptor(f);p!==null&&s.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function nz(t,e){let r=kA.default.clean(e);for(let s of Object.values(G1))if(s!=="undecided"&&s!=="decline"&&kA.default.inc(t,s)===r)return s;return null}function ib(t,e){if(kA.default.valid(e))return e;if(t===null)throw new nt(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!kA.default.valid(t))throw new nt(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=kA.default.inc(t,e);if(r===null)throw new nt(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function iz(t,e,{report:r,exact:s}){let a=new Map;for(let n of t.workspaces)for(let c of Ut.allDependencies)for(let f of n.manifest[c].values()){let p=t.tryWorkspaceByDescriptor(f);if(p===null||!e.has(p))continue;je.getArrayWithDefault(a,p).push([n,c,f.identHash])}for(let[n,c]of e){let f=n.manifest.version;n.manifest.version=c,kA.default.prerelease(c)===null?delete n.manifest.raw.stableVersion:n.manifest.raw.stableVersion||(n.manifest.raw.stableVersion=f);let p=n.manifest.name!==null?G.stringifyIdent(n.manifest.name):null;r.reportInfo(0,`${G.prettyLocator(t.configuration,n.anchoredLocator)}: Bumped to ${c}`),r.reportJson({cwd:fe.fromPortablePath(n.cwd),ident:p,oldVersion:f,newVersion:c});let h=a.get(n);if(!(typeof h>"u"))for(let[E,C,S]of h){let b=E.manifest[C].get(S);if(typeof b>"u")throw new Error("Assertion failed: The dependency should have existed");let I=b.range,T=!1;if(I.startsWith(Ei.protocol)&&(I=I.slice(Ei.protocol.length),T=!0,I===n.relativeCwd))continue;let N=I.match($Pt);if(!N){r.reportWarning(0,`Couldn't auto-upgrade range ${I} (in ${G.prettyLocator(t.configuration,E.anchoredLocator)})`);continue}let U=s?`${c}`:`${N[1]}${c}`;T&&(U=`${Ei.protocol}${U}`);let W=G.makeDescriptor(b,U);E.manifest[C].set(S,W)}}}var tbt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function cke(t,{current:e,prerelease:r}){let s=new kA.default.SemVer(e),a=s.prerelease.slice(),n=[];s.prerelease=[],s.format()!==t&&(a.length=0);let c=!0,f=r.split(/\./g);for(let p of f){let h=tbt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():c=!1;else{let E=c?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),c=!1)}}return s.prerelease&&(s.prerelease=[]),`${t}-${n.join(".")}`}var Y1=class extends ft{constructor(){super(...arguments);this.all=ge.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=ge.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=ge.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.exact=ge.Boolean("--exact",!1,{description:"Use the exact version of each package, removes any range. Useful for nightly releases where the range might match another version."});this.recursive=ge.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["version","apply"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` This command will apply the deferred version changes and remove their definitions from the repository. Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%n\`) will be used on all new versions and the version definitions will be kept as-is. By default only the current workspace will be bumped, but you can configure this behavior by using one of: - \`--recursive\` to also apply the version bump on its dependencies - \`--all\` to apply the version bump on all packages in the repository Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);if(!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState({restoreResolutions:!1});let c=await Ot.start({configuration:r,json:this.json,stdout:this.context.stdout},async f=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await sb(s,{prerelease:p}),E=new Map;if(this.all)E=h;else{let C=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let S of C){let b=h.get(S);typeof b<"u"&&E.set(S,b)}}if(E.size===0){let C=h.size>0?" Did you want to add --all?":"";f.reportWarning(0,`The current workspace doesn't seem to require a version bump.${C}`);return}iz(s,E,{report:f,exact:this.exact}),this.dryRun||(p||(this.all?await tz(s):await rz(s,[...E.keys()])),f.reportSeparator())});return this.dryRun||c.hasErrors()?c.exitCode():await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ge();Dt();Yt();var UL=ut(Ai());var V1=class extends ft{constructor(){super(...arguments);this.interactive=ge.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}static{this.paths=[["version","check"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){iw(this.context);let{Gem:r}=await Promise.resolve().then(()=>(qF(),kW)),{ScrollableItems:s}=await Promise.resolve().then(()=>(JF(),VF)),{FocusRequest:a}=await Promise.resolve().then(()=>(RW(),E2e)),{useListInput:n}=await Promise.resolve().then(()=>(YF(),I2e)),{renderForm:c}=await Promise.resolve().then(()=>(XF(),ZF)),{Box:f,Text:p}=await Promise.resolve().then(()=>ut(Wc())),{default:h,useCallback:E,useState:C}=await Promise.resolve().then(()=>ut(hn())),S=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:I}=await Rt.find(S,this.context.cwd);if(!I)throw new ar(b.cwd,this.context.cwd);await b.restoreInstallState();let T=await q1(b);if(T===null||T.releaseRoots.size===0)return 0;if(T.root===null)throw new nt("This command can only be run on Git repositories");let N=()=>h.createElement(f,{flexDirection:"row",paddingBottom:1},h.createElement(f,{flexDirection:"column",width:60},h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(f,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(f,{flexDirection:"column"},h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(f,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:me,active:pe,decision:Be,setDecision:Ce})=>{let g=me.manifest.raw.stableVersion??me.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${G.prettyLocator(S,me.anchoredLocator)})`);if(UL.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let we=["undecided","decline","patch","minor","major"];n(Be,we,{active:pe,minus:"left",plus:"right",set:Ce});let ye=Be==="undecided"?h.createElement(p,{color:"yellow"},g):Be==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},UL.default.valid(Be)?Be:UL.default.inc(g,Be)));return h.createElement(f,{flexDirection:"column"},h.createElement(f,null,h.createElement(p,null,G.prettyLocator(S,me.anchoredLocator)," - ",ye)),h.createElement(f,null,we.map(Ae=>h.createElement(f,{key:Ae,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:Ae===Be})," ",Ae)))))},W=me=>{let pe=new Set(T.releaseRoots),Be=new Map([...me].filter(([Ce])=>pe.has(Ce)));for(;;){let Ce=ob({project:T.project,releases:Be}),g=!1;if(Ce.length>0){for(let[we]of Ce)if(!pe.has(we)){pe.add(we),g=!0;let ye=me.get(we);typeof ye<"u"&&Be.set(we,ye)}}if(!g)break}return{relevantWorkspaces:pe,relevantReleases:Be}},ee=()=>{let[me,pe]=C(()=>new Map(T.releases)),Be=E((Ce,g)=>{let we=new Map(me);g!=="undecided"?we.set(Ce,g):we.delete(Ce);let{relevantReleases:ye}=W(we);pe(ye)},[me,pe]);return[me,Be]},ie=({workspaces:me,releases:pe})=>{let Be=[];Be.push(`${me.size} total`);let Ce=0,g=0;for(let we of me){let ye=pe.get(we);typeof ye>"u"?g+=1:ye!=="decline"&&(Ce+=1)}return Be.push(`${Ce} release${Ce===1?"":"s"}`),Be.push(`${g} remaining`),h.createElement(p,{color:"yellow"},Be.join(", "))},le=await c(({useSubmit:me})=>{let[pe,Be]=ee();me(pe);let{relevantWorkspaces:Ce}=W(pe),g=new Set([...Ce].filter(se=>!T.releaseRoots.has(se))),[we,ye]=C(0),Ae=E(se=>{switch(se){case a.BEFORE:ye(we-1);break;case a.AFTER:ye(we+1);break}},[we,ye]);return h.createElement(f,{flexDirection:"column"},h.createElement(N,null),h.createElement(f,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(f,{flexDirection:"column",marginTop:1,paddingLeft:2},[...T.changedFiles].map(se=>h.createElement(f,{key:se},h.createElement(p,null,h.createElement(p,{color:"grey"},fe.fromPortablePath(T.root)),fe.sep,fe.relative(fe.fromPortablePath(T.root),fe.fromPortablePath(se)))))),T.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:T.releaseRoots,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:"column"},h.createElement(s,{active:we%2===0,radius:1,size:2,onFocusRequest:Ae},[...T.releaseRoots].map(se=>h.createElement(U,{key:se.cwd,workspace:se,decision:pe.get(se)||"undecided",setDecision:X=>Be(se,X)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(f,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(f,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(f,{marginTop:1},h.createElement(ie,{workspaces:g,releases:pe})):null,h.createElement(f,{marginTop:1,flexDirection:"column"},h.createElement(s,{active:we%2===1,radius:2,size:2,onFocusRequest:Ae},[...g].map(se=>h.createElement(U,{key:se.cwd,workspace:se,decision:pe.get(se)||"undecided",setDecision:X=>Be(se,X)}))))):null)},{versionFile:T},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>"u")return 1;T.releases.clear();for(let[me,pe]of le)T.releases.set(me,pe);await T.saveAll()}async executeStandard(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);return await s.restoreInstallState(),(await Ot.start({configuration:r,stdout:this.context.stdout},async c=>{let f=await q1(s);if(f===null||f.releaseRoots.size===0)return;if(f.root===null)throw new nt("This command can only be run on Git repositories");if(c.reportInfo(0,`Your PR was started right after ${he.pretty(r,f.baseHash.slice(0,7),"yellow")} ${he.pretty(r,f.baseTitle,"magenta")}`),f.changedFiles.size>0){c.reportInfo(0,"You have changed the following files since then:"),c.reportSeparator();for(let S of f.changedFiles)c.reportInfo(null,`${he.pretty(r,fe.fromPortablePath(f.root),"gray")}${fe.sep}${fe.relative(fe.fromPortablePath(f.root),fe.fromPortablePath(S))}`)}let p=!1,h=!1,E=ML(f);if(E.size>0){p||c.reportSeparator();for(let S of E)c.reportError(0,`${G.prettyLocator(r,S.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let C=ob(f);for(let[S,b]of C)h||c.reportSeparator(),c.reportError(0,`${G.prettyLocator(r,S.anchoredLocator)} doesn't have a release strategy attached, but depends on ${G.prettyWorkspace(r,b)} which is planned for release.`),h=!0;(p||h)&&(c.reportSeparator(),c.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),c.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};Ge();Yt();var _L=ut(Ai());var J1=class extends ft{constructor(){super(...arguments);this.deferred=ge.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=ge.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=ge.String()}static{this.paths=[["version"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!a)throw new ar(s.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let c=_L.default.valid(this.strategy),f=this.strategy==="decline",p;if(c)if(a.manifest.version!==null){let E=nz(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!f){if(E===null)throw new nt("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!_L.default.valid(E))throw new nt(`Can't bump the version (${E}) if it's not valid semver`)}p=dy(this.strategy)}if(!n){let C=(await sb(s)).get(a);if(typeof C<"u"&&p!=="decline"){let S=ib(a.manifest.version,p);if(_L.default.lt(S,C))throw new nt(`Can't bump the version to one that would be lower than the current deferred one (${C})`)}}let h=await q1(s,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};var rbt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[Y1,V1,J1]},nbt=rbt;var oz={};Vt(oz,{WorkspacesFocusCommand:()=>K1,WorkspacesForeachCommand:()=>Z1,default:()=>obt});Ge();Ge();Yt();var K1=class extends ft{constructor(){super(...arguments);this.json=ge.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=ge.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=ge.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=ge.Rest()}static{this.paths=[["workspaces","focus"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd),n=await Kr.find(r);await s.restoreInstallState({restoreResolutions:!1});let c;if(this.all)c=new Set(s.workspaces);else if(this.workspaces.length===0){if(!a)throw new ar(s.cwd,this.context.cwd);c=new Set([a])}else c=new Set(this.workspaces.map(f=>s.getWorkspaceByIdent(G.parseIdent(f))));for(let f of c)for(let p of this.production?["dependencies"]:Ut.hardDependencies)for(let h of f.manifest.getForScope(p).values()){let E=s.tryWorkspaceByDescriptor(h);E!==null&&c.add(E)}for(let f of s.workspaces)c.has(f)?this.production&&f.manifest.devDependencies.clear():(f.manifest.installConfig=f.manifest.installConfig||{},f.manifest.installConfig.selfReferences=!1,f.manifest.dependencies.clear(),f.manifest.devDependencies.clear(),f.manifest.peerDependencies.clear(),f.manifest.scripts.clear());return await s.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ge();Ge();Ge();Yt();var z1=ut(Go()),fke=ut(Ld());Ul();var Z1=class extends ft{constructor(){super(...arguments);this.from=ge.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=ge.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=ge.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=ge.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=ge.Counter("-v,--verbose",{description:"Increase level of logging verbosity up to 2 times"});this.parallel=ge.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=ge.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=ge.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:h_([fo(["unlimited"]),$2(p_(),[d_(),g_(1)])])});this.topological=ge.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=ge.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=ge.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=ge.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=ge.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=ge.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=ge.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[["workspaces","foreach"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. You can also use the `--no-private` flag to avoid running the command in private workspaces.\n\n The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A --no-private npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]})}static{this.schema=[tB("all",qf.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),m_(["all","recursive","since","worktree"],{missingIf:"undefined"})]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:s,workspace:a}=await Rt.find(r,this.context.cwd);if(!this.all&&!a)throw new ar(s.cwd,this.context.cwd);await s.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),c=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new nt("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let f=Ce=>{this.dryRun&&this.context.stdout.write(`${Ce} `)},p=()=>{let Ce=this.from.map(g=>z1.default.matcher(g));return s.workspaces.filter(g=>{let we=G.stringifyIdent(g.anchoredLocator),ye=g.relativeCwd;return Ce.some(Ae=>Ae(we)||Ae(ye))})},h=[];if(this.since?(f("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await ka.fetchChangedWorkspaces({ref:this.since,project:s}))):this.from?(f("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(f("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(f("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(f("Option --all is set; selecting all workspaces"),h=[...s.workspaces]),this.dryRun&&!this.all){for(let Ce of h)f(` - ${Ce.relativeCwd} ${G.prettyLocator(r,Ce.anchoredLocator)}`);h.length>0&&f("")}let E;if(this.recursive?this.since?(f("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceDependents()]).flat())):(f("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(f("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(Ce=>[...Ce.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let Ce of E)f(` - ${Ce.relativeCwd} ${G.prettyLocator(r,Ce.anchoredLocator)}`);let C=[],S=!1;if(c?.includes(":")){for(let Ce of s.workspaces)if(Ce.manifest.scripts.has(c)&&(S=!S,S===!1))break}for(let Ce of h){if(c&&!Ce.manifest.scripts.has(c)&&!S&&!(await In.getWorkspaceAccessibleBinaries(Ce)).has(c)){f(`Excluding ${Ce.relativeCwd} because it doesn't have a "${c}" script`);continue}if(!(c===r.env.npm_lifecycle_event&&Ce.cwd===a.cwd)){if(this.include.length>0&&!z1.default.isMatch(G.stringifyIdent(Ce.anchoredLocator),this.include)&&!z1.default.isMatch(Ce.relativeCwd,this.include)){f(`Excluding ${Ce.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(z1.default.isMatch(G.stringifyIdent(Ce.anchoredLocator),this.exclude)||z1.default.isMatch(Ce.relativeCwd,this.exclude))){f(`Excluding ${Ce.relativeCwd} because it matches the --exclude filter`);continue}if(this.publicOnly&&Ce.manifest.private===!0){f(`Excluding ${Ce.relativeCwd} because it's a private workspace and --no-private was set`);continue}C.push(Ce)}}if(this.dryRun)return 0;let b=this.verbose??(this.context.stdout.isTTY?1/0:0),I=b>0,T=b>1,N=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(fs.availableParallelism()/2):1,U=N===1?!1:this.parallel,W=U?this.interlaced:!0,ee=(0,fke.default)(N),ie=new Map,ue=new Set,le=0,me=null,pe=!1,Be=await Ot.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async Ce=>{let g=async(we,{commandIndex:ye})=>{if(pe)return-1;!U&&T&&ye>1&&Ce.reportSeparator();let Ae=ibt(we,{configuration:r,label:I,commandIndex:ye}),[se,X]=uke(Ce,{prefix:Ae,interlaced:W}),[De,Te]=uke(Ce,{prefix:Ae,interlaced:W});try{T&&Ce.reportInfo(null,`${Ae?`${Ae} `:""}Process started`);let mt=Date.now(),j=await this.cli.run([this.commandName,...this.args],{cwd:we.cwd,stdout:se,stderr:De})||0;se.end(),De.end(),await X,await Te;let rt=Date.now();if(T){let Fe=r.get("enableTimers")?`, completed in ${he.pretty(r,rt-mt,he.Type.DURATION)}`:"";Ce.reportInfo(null,`${Ae?`${Ae} `:""}Process exited (exit code ${j})${Fe}`)}return j===130&&(pe=!0,me=j),j}catch(mt){throw se.end(),De.end(),await X,await Te,mt}};for(let we of C)ie.set(we.anchoredLocator.locatorHash,we);for(;ie.size>0&&!Ce.hasErrors();){let we=[];for(let[X,De]of ie){if(ue.has(De.anchoredDescriptor.descriptorHash))continue;let Te=!0;if(this.topological||this.topologicalDev){let mt=this.topologicalDev?new Map([...De.manifest.dependencies,...De.manifest.devDependencies]):De.manifest.dependencies;for(let j of mt.values()){let rt=s.tryWorkspaceByDescriptor(j);if(Te=rt===null||!ie.has(rt.anchoredLocator.locatorHash),!Te)break}}if(Te&&(ue.add(De.anchoredDescriptor.descriptorHash),we.push(ee(async()=>{let mt=await g(De,{commandIndex:++le});return ie.delete(X),ue.delete(De.anchoredDescriptor.descriptorHash),{workspace:De,exitCode:mt}})),!U))break}if(we.length===0){let X=Array.from(ie.values()).map(De=>G.prettyLocator(r,De.anchoredLocator)).join(", ");Ce.reportError(3,`Dependency cycle detected (${X})`);return}let ye=await Promise.all(we);ye.forEach(({workspace:X,exitCode:De})=>{De!==0&&Ce.reportError(0,`The command failed in workspace ${G.prettyLocator(r,X.anchoredLocator)} with exit code ${De}`)});let se=ye.map(X=>X.exitCode).find(X=>X!==0);(this.topological||this.topologicalDev)&&typeof se<"u"&&Ce.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return me!==null?me:Be.exitCode()}};function uke(t,{prefix:e,interlaced:r}){let s=t.createStreamReporter(e),a=new je.DefaultStream;a.pipe(s,{end:!1}),a.on("finish",()=>{s.end()});let n=new Promise(f=>{s.on("finish",()=>{f(a.active)})});if(r)return[a,n];let c=new je.BufferStream;return c.pipe(a,{end:!1}),c.on("finish",()=>{a.end()}),[c,n]}function ibt(t,{configuration:e,commandIndex:r,label:s}){if(!s)return null;let n=`[${G.stringifyIdent(t.anchoredLocator)}]:`,c=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],f=c[r%c.length];return he.pretty(e,n,f)}var sbt={commands:[K1,Z1]},obt=sbt;var uz={};Vt(uz,{default:()=>ubt});Ge();Ge();var az="catalog:";var lz=t=>t.startsWith(az),abt=t=>t.range.slice(az.length)||null,Ake=t=>t===null?"default catalog":`catalog "${t}"`,lbt=t=>t.scope?`@${t.scope}/${t.name}`:t.name,cz=(t,e,r,s)=>{let a=abt(e),n;if(a===null)n=t.configuration.get("catalog");else try{let E=t.configuration.get("catalogs");E&&(n=E.get(a))}catch{n=void 0}if(!n||n.size===0)throw new jt(82,`${G.prettyDescriptor(t.configuration,e)}: ${Ake(a)} not found or empty`);let c=lbt(e),f=n.get(c);if(!f)throw new jt(82,`${G.prettyDescriptor(t.configuration,e)}: entry not found in ${Ake(a)}`);let p=t.configuration.normalizeDependency(G.makeDescriptor(e,f));return r.bindDescriptor(p,t.topLevelWorkspace.anchoredLocator,s)};var cbt={configuration:{catalog:{description:"The default catalog of packages",type:"MAP",valueDefinition:{description:"The catalog of packages",type:"STRING"}},catalogs:{description:"Named catalogs of packages",type:"MAP",valueDefinition:{description:"A named catalog",type:"MAP",valueDefinition:{description:"Package version in the catalog",type:"STRING"}}}},hooks:{beforeWorkspacePacking:(t,e)=>{let r=t.project,s=r.configuration.makeResolver(),a={project:r,resolver:s,report:new ki};for(let n of Ut.allDependencies){let c=e[n];if(c)for(let[f,p]of Object.entries(c)){if(typeof p!="string"||!lz(p))continue;let h=G.parseIdent(f),E=G.makeDescriptor(h,p),C=cz(r,E,s,a),{protocol:S,source:b,params:I,selector:T}=G.parseRange(G.convertToManifestRange(C.range));S===t.project.configuration.get("defaultProtocol")&&(S=null),c[f]=G.makeRange({protocol:S,source:b,params:I,selector:T})}}},reduceDependency:async(t,e,r,s,{resolver:a,resolveOptions:n})=>lz(t.range)?cz(e,t,a,n):t}},ubt=cbt;var tC=()=>({modules:new Map([["@yarnpkg/cli",Gv],["@yarnpkg/core",jv],["@yarnpkg/fslib",_2],["@yarnpkg/libzip",fv],["@yarnpkg/parsers",J2],["@yarnpkg/shell",mv],["clipanion",oB],["semver",fbt],["typanion",Ea],["@yarnpkg/plugin-essentials",f5],["@yarnpkg/plugin-compat",d5],["@yarnpkg/plugin-constraints",T5],["@yarnpkg/plugin-dlx",F5],["@yarnpkg/plugin-exec",L5],["@yarnpkg/plugin-file",U5],["@yarnpkg/plugin-git",u5],["@yarnpkg/plugin-github",j5],["@yarnpkg/plugin-http",G5],["@yarnpkg/plugin-init",q5],["@yarnpkg/plugin-interactive-tools",HW],["@yarnpkg/plugin-jsr",GW],["@yarnpkg/plugin-link",qW],["@yarnpkg/plugin-nm",PY],["@yarnpkg/plugin-npm",PK],["@yarnpkg/plugin-npm-cli",OK],["@yarnpkg/plugin-pack",IV],["@yarnpkg/plugin-patch",GK],["@yarnpkg/plugin-pnp",gY],["@yarnpkg/plugin-pnpm",YK],["@yarnpkg/plugin-stage",$K],["@yarnpkg/plugin-typescript",ez],["@yarnpkg/plugin-version",sz],["@yarnpkg/plugin-workspace-tools",oz],["@yarnpkg/plugin-catalog",uz]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-jsr","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools","@yarnpkg/plugin-catalog"])});function gke({cwd:t,pluginConfiguration:e}){let r=new Ca({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:fn??""});return Object.assign(r,{defaultContext:{...Ca.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function Abt(t){if(je.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,s=">=18.12.0";if(Fr.satisfiesWithPrereleases(r,s))return!0;let a=new nt(`This tool requires a Node version compatible with ${s} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return Ca.defaultContext.stdout.write(t.error(a)),!1}async function dke({selfPath:t,pluginConfiguration:e}){return await ze.find(fe.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function pbt(t,e,{yarnPath:r}){if(!ce.existsSync(r))return t.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let s={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,pke.execFileSync)(process.execPath,[fe.fromPortablePath(r),...e],s)}catch(a){return a.status??1}return 0}function hbt(t,e){let r=null,s=e;return e.length>=2&&e[0]==="--cwd"?(r=fe.toPortablePath(e[1]),s=e.slice(2)):e.length>=1&&e[0].startsWith("--cwd=")?(r=fe.toPortablePath(e[0].slice(6)),s=e.slice(1)):e[0]==="add"&&e[e.length-2]==="--cwd"&&(r=fe.toPortablePath(e[e.length-1]),s=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?J.resolve(r):J.cwd(),s}function gbt(t,{configuration:e}){if(!e.get("enableTelemetry")||hke.isCI||!process.stdout.isTTY)return;ze.telemetry=new XI(e,"puba9cdc10ec5790a2cf4969dd413a47270");let s=/^@yarnpkg\/plugin-(.*)$/;for(let a of e.plugins.keys())$I.has(a.match(s)?.[1]??"")&&ze.telemetry?.reportPluginName(a);t.binaryVersion&&ze.telemetry.reportVersion(t.binaryVersion)}function mke(t,{configuration:e}){for(let r of e.plugins.values())for(let s of r.commands||[])t.register(s)}async function dbt(t,e,{selfPath:r,pluginConfiguration:s}){if(!Abt(t))return 1;let a=await dke({selfPath:r,pluginConfiguration:s}),n=a.get("yarnPath"),c=a.get("ignorePath");if(n&&!c)return pbt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let f=hbt(t,e);gbt(t,{configuration:a}),mke(t,{configuration:a});let p=t.process(f,t.defaultContext);return p.help||ze.telemetry?.reportCommandName(p.path.join(" ")),await t.run(p,t.defaultContext)}async function Bde({cwd:t=J.cwd(),pluginConfiguration:e=tC()}={}){let r=gke({cwd:t,pluginConfiguration:e}),s=await dke({pluginConfiguration:e,selfPath:null});return mke(r,{configuration:s}),r}async function YT(t,{cwd:e=J.cwd(),selfPath:r,pluginConfiguration:s}){let a=gke({cwd:e,pluginConfiguration:s});function n(){Ca.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop. Please report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once("beforeExit",n);try{process.exitCode=42,process.exitCode=await dbt(a,t,{selfPath:r,pluginConfiguration:s})}catch(c){Ca.defaultContext.stdout.write(a.error(c)),process.exitCode=1}finally{process.off("beforeExit",n),await ce.rmtempPromise()}}YT(process.argv.slice(2),{cwd:J.cwd(),selfPath:fe.toPortablePath(fe.resolve(process.argv[1])),pluginConfiguration:tC()});})(); /** @license Copyright (c) 2015, Rebecca Turner Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /** @license Copyright Node.js contributors. 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. */ /** @license The MIT License (MIT) Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) 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. */ /** @license Copyright Joyent, Inc. and other Node contributors. 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. */ /*! Bundled license information: is-number/index.js: (*! * is-number * * Copyright (c) 2014-present, Jon Schlinkert. * Released under the MIT License. *) to-regex-range/index.js: (*! * to-regex-range * * Copyright (c) 2015-present, Jon Schlinkert. * Released under the MIT License. *) fill-range/index.js: (*! * fill-range * * Copyright (c) 2014-present, Jon Schlinkert. * Licensed under the MIT License. *) is-extglob/index.js: (*! * is-extglob * * Copyright (c) 2014-2016, Jon Schlinkert. * Licensed under the MIT License. *) is-glob/index.js: (*! * is-glob * * Copyright (c) 2014-2017, Jon Schlinkert. * Released under the MIT License. *) queue-microtask/index.js: (*! queue-microtask. MIT License. Feross Aboukhadijeh *) run-parallel/index.js: (*! run-parallel. MIT License. Feross Aboukhadijeh *) git-url-parse/lib/index.js: (*! * buildToken * Builds OAuth token prefix (helper function) * * @name buildToken * @function * @param {GitUrl} obj The parsed Git url object. * @return {String} token prefix *) object-assign/index.js: (* object-assign (c) Sindre Sorhus @license MIT *) react/cjs/react.production.min.js: (** @license React v17.0.2 * react.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) scheduler/cjs/scheduler.production.min.js: (** @license React v0.20.2 * scheduler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) react-reconciler/cjs/react-reconciler.production.min.js: (** @license React v0.26.2 * react-reconciler.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. *) is-windows/index.js: (*! * is-windows * * Copyright © 2015-2018, Jon Schlinkert. * Released under the MIT License. *) */ ================================================ FILE: .yarnrc.yml ================================================ nodeLinker: node-modules yarnPath: .yarn/releases/yarn-4.10.3.cjs ================================================ FILE: CHANGELOG.md ================================================ # Smithy Typescript Codegen Changelog [Commit logs](https://github.com/smithy-lang/smithy-typescript/commits/main/smithy-typescript-codegen) ## 0.49.1 (2026-04-30) ### Bug Fixes - Fixed compression edge case in Endpoint BDD generation ([#1989](https://github.com/smithy-lang/smithy-typescript/pull/1989)) ## 0.49.0 (2026-04-28) ### Features - Endpoint logic is now generated as a compact binary decision diagram ([#1948](https://github.com/smithy-lang/smithy-typescript/pull/1948)) - Waiters are generated with typed final result values ([#1852](https://github.com/smithy-lang/smithy-typescript/pull/1852)) ## 0.48.0 (2026-04-08) ### Features - Generated nullable types for sparse collections ([#1943](https://github.com/smithy-lang/smithy-typescript/pull/1943)) - Enabled type-only symbols in Schema mode ([#1938](https://github.com/smithy-lang/smithy-typescript/pull/1938)) ## 0.47.0 (2026-03-17) ### Features - Added `versionScheme` option for automatic versioning of generated packages ([#1914](https://github.com/smithy-lang/smithy-typescript/pull/1914)) - (experimental) Added option to generate request/response/error snapshots from service models ([#7788](https://github.com/aws/aws-sdk-js-v3/issues/7788)) ## 0.46.0 (2026-03-05) ### Features - Upgraded smithy version to 1.68.0 ([#1902](https://github.com/smithy-lang/smithy-typescript/pull/1902)) - Generated shape member tsdoc now includes deprecated-since when the `@deprecated` trait provides this information ([#1903](https://github.com/smithy-lang/smithy-typescript/pull/1903)) ### Bug Fixes - Downleveled types now cover TypeScript versions <4.5 ([#1906](https://github.com/smithy-lang/smithy-typescript/pull/1906)) ## 0.45.0 (2026-02-19) ### Features - Upgraded smithy version to 1.67.0 ([#1868](https://github.com/smithy-lang/smithy-typescript/pull/1868)) ### Bug Fixes - Created composite type registry on protocol instances ([#1867](https://github.com/smithy-lang/smithy-typescript/pull/1867)) ## 0.44.0 (2026-02-06) ### Chores - Synchronized version bump for 0.44.0 in smithy-typescript-aws-codegen. - Deprecated use of `@aws-sdk/types` in this codegen library (continues to be available in the AWS library) ([#1863](https://github.com/smithy-lang/smithy-typescript/pull/1863)) ## 0.43.1 (2026-01-30) ### Bug Fixes - Fixed paginator capitalization issue when generating from a model with non-TitleCase operation shapes ([#1860](https://github.com/smithy-lang/smithy-typescript/pull/1860)) ## 0.43.0 (2026-01-28) ### Features - Generated workspace clean commands replaced `rimraf` with `premove` ([#1834](https://github.com/smithy-lang/smithy-typescript/pull/1834)) - Generated aggregate clients now contain paginators and waiters ([#1853](https://github.com/smithy-lang/smithy-typescript/pull/1853)) ### Chores - Updated to smithy v1.66.0 ([#1850](https://github.com/smithy-lang/smithy-typescript/pull/1850)) ## 0.42.0 (2026-01-15) ### Features - Updated schema codegen to include required member information for optional use by `@smithy/typecheck` ([#1835](https://github.com/smithy-lang/smithy-typescript/pull/1835)) ### Chores - Set the minimum required Node.js version to v20 for generated clients ([#1837](https://github.com/smithy-lang/smithy-typescript/pull/1837)) ## 0.41.1 (2026-01-08) ### Bug Fixes - Fixed deserialization bug in CBOR BigDecimal values ([#1830](https://github.com/smithy-lang/smithy-typescript/pull/1830)) ### Chores - Upgraded generated clients to use rimraf v5 ([#1829](https://github.com/smithy-lang/smithy-typescript/pull/1829)) ## 0.41.0 (2026-01-02) ### Features - Changed default serialization/deserialization for clients to schema-based ([#1600](https://github.com/smithy-lang/smithy-typescript/issues/1600)) ### Bug Fixes - Fixed const/let generation in waiters ([#1826](https://github.com/smithy-lang/smithy-typescript/pull/1826)) ## 0.40.0 (2025-12-22) ### Features - Upgraded smithy version to 1.65.0 ([#1819](https://github.com/smithy-lang/smithy-typescript/pull/1819)) ### Bug Fixes - Fixed TypeScript client codegen conflict between known config keys and clientContextParams ([#1788](https://github.com/smithy-lang/smithy-typescript/pull/1788)) - Exported star from models_N ([#1817](https://github.com/smithy-lang/smithy-typescript/pull/1817)) ## 0.39.1 (2025-12-10) ### Bug Fixes - Fixed an NPE related to auth schemes ([#1804](https://github.com/smithy-lang/smithy-typescript/pull/1804)) ## 0.39.0 (2025-12-05) ### Features - Added type import API for TypeScriptWriter ([#1786](https://github.com/smithy-lang/smithy-typescript/pull/1786)) - Added `generateIndexTests` setting for generation of optional API surface tests ([#1789](https://github.com/smithy-lang/smithy-typescript/pull/1789)) - Generated well-formatted TypeScript source code ([#1780](https://github.com/smithy-lang/smithy-typescript/pull/1780)) ### Chores - Reduced `info` level logging output. To restore previous logging output, use the `fine` logging level. ([#1796](https://github.com/smithy-lang/smithy-typescript/pull/1796)) ## 0.38.0 (2025-11-20) ### Features - Upgraded to smithy version 1.64.0 ([#1784](https://github.com/smithy-lang/smithy-typescript/pull/1784)) - Divided codegen models folder into enums, errors, and other interfaces ([#1770](https://github.com/smithy-lang/smithy-typescript/pull/1770)) ## 0.37.0 (2025-11-04) ### Features - Upgraded smithy version to 1.63.0 ([#1761](https://github.com/smithy-lang/smithy-typescript/pull/1761)) ### Bug Fixes - Added default description for deprecatedTrait ([#1541](https://github.com/smithy-lang/smithy-typescript/pull/1541)) ## 0.36.1 (2025-10-06) ### Features - Added 'pnpm' to 'PackageManager' ([#1658](https://github.com/smithy-lang/smithy-typescript/pull/1658)) ### Bug Fixes - Fixed CBOR eventstream codegen ([#1731](https://github.com/smithy-lang/smithy-typescript/pull/1731)) ## 0.36.0 (2025-09-30) ### Features - Upgraded smithy version to 1.62.0 ([#1714](https://github.com/smithy-lang/smithy-typescript/pull/1714)) - Replaced 'uuid' with '@smithy/uuid' ([#1706](https://github.com/smithy-lang/smithy-typescript/pull/1706)) ## 0.35.0 (2025-09-18) ### Features - `Command` class examples now generate with a reference to the `Client` constructor input type ([#1690](https://github.com/smithy-lang/smithy-typescript/pull/1690)) ### Bug Fixes - Fixed header type codegen for event streams ([#1694](https://github.com/smithy-lang/smithy-typescript/pull/1694)) ## 0.34.1 (2025-09-10) ### Bug Fixes - Fixed event stream serialization when the `@eventStreamPayload` member is a string ([#1674](https://github.com/smithy-lang/smithy-typescript/pull/1674)) ## 0.34.0 (2025-07-30) ### Features - Upgraded smithy version to 1.61.0 ([#1640](https://github.com/smithy-lang/smithy-typescript/pull/1640)) ## 0.33.0 (2025-07-10) ### Features - Upgraded smithy version to 1.60.3 ([#1640](https://github.com/smithy-lang/smithy-typescript/pull/1640)) - Upgraded fast-xml-parser to 5.2.5 ([#1641](https://github.com/smithy-lang/smithy-typescript/pull/1641)) ### Bug Fixes - Avoided using model.getServiceShapes() for endpoint generation ([#1642](https://github.com/smithy-lang/smithy-typescript/pull/1642)) ## 0.32.0 (2025-06-26) ### Features - BigIntger and BigDecimal numeric support for Smithy RPCv2 CBOR protocol ([#1603](https://github.com/smithy-lang/smithy-typescript/pull/1603)) ## 0.31.1 (2025-06-23) ### Bug Fixes - use undefined placeholder for unhandled trait ([#1629](https://github.com/smithy-lang/smithy-typescript/pull/1629)) - Added EndpointRequired config resolver to replace CustomEndpoint ([#1628](https://github.com/smithy-lang/smithy-typescript/pull/1628)) - Corrected criteria for event stream member detection ([#1624](https://github.com/smithy-lang/smithy-typescript/pull/1624)) - Located event stream member more carefully ([#1623](https://github.com/smithy-lang/smithy-typescript/pull/1623)) ### Chores - Omitting the endpoint polymorphs from resolved config types ([#1626](https://github.com/smithy-lang/smithy-typescript/pull/1626)) - Allowed protocol generators to declare error aliases ([#1622](https://github.com/smithy-lang/smithy-typescript/pull/1622)) - Allowed endpoint params to be explicitly undefined if not required ([#1618](https://github.com/smithy-lang/smithy-typescript/pull/1618)) ## 0.31.0 (2025-06-09) ## Features - Upgraded smithy version to 1.58.0 ([#1616](https://github.com/smithy-lang/smithy-typescript/pull/1616)) - Added schema code generation and related allow-list ([#1599](https://github.com/smithy-lang/smithy-typescript/pull/1599)) ### Chores - Updated synthetic error namespace ([#1611](https://github.com/smithy-lang/smithy-typescript/pull/1611)) - Generated default endpoint ruleset to make code generation consistent for ruleset trait ([#1589](https://github.com/smithy-lang/smithy-typescript/pull/1589)) ## 0.30.0 (2025-05-08) ### Features - Upgraded smithy version to 1.57.1 ([#1576](https://github.com/smithy-lang/smithy-typescript/pull/1576)) - Added authSchemePreference client config ([#1567](https://github.com/smithy-lang/smithy-typescript/pull/1567)) - Improved generated protocol test assertion messages ([#1572](https://github.com/smithy-lang/smithy-typescript/pull/1572)) ### Bug Fixes - Allowed overwriting a protocol's priority during protocol selection ([#1585](https://github.com/smithy-lang/smithy-typescript/pull/1585)) ## 0.29.1 (2025-04-24) ### Chores - Bumped version to match release of smithy-aws-typescript-codegen ## 0.29.0 (2025-04-11) ### Features - Upgraded smithy version to 1.55.0 ([#1560](https://github.com/smithy-lang/smithy-typescript/pull/1560)) ### Bug Fixes - Fixed bug with JMESPath flatten level codegen ([#1559](https://github.com/smithy-lang/smithy-typescript/pull/1559)) ## 0.28.0 (2025-04-01) ### Bug Fixes - Used backticks for example strings containing doublequotes ([#1556](https://github.com/smithy-lang/smithy-typescript/pull/1556)) - Generated client.initConfig reference for tracking config object custody ([#1550](https://github.com/smithy-lang/smithy-typescript/pull/1550)) - Used generic type for client config ([#1549](https://github.com/smithy-lang/smithy-typescript/pull/1549)) - Allowed authscheme resolver to access client ref ([#1548](https://github.com/smithy-lang/smithy-typescript/pull/1548)) ### Documentation - Added doc examples to operations ([#1078](https://github.com/smithy-lang/smithy-typescript/pull/1078)) - Replaced GitHub org from 'awslabs' to 'smithy-lang' ([#1545](https://github.com/smithy-lang/smithy-typescript/pull/1545)) ## 0.27.0 (2025-03-04) ### Features - Support MultiSelect List in OperationContextParams ([#1536](https://github.com/smithy-lang/smithy-typescript/pull/1536)) - Support MultiSelect Flatten in OperationContextParams ([#1537](https://github.com/smithy-lang/smithy-typescript/pull/1537)) - Upgrade smithy version to 1.53.0 ([#1538](https://github.com/smithy-lang/smithy-typescript/pull/1538)) - Upgrade smithy version to 1.54.0 ([#1540](https://github.com/smithy-lang/smithy-typescript/pull/1540)) ### Bug Fixes - Fixed union member serialization in CBOR ([#1526](https://github.com/smithy-lang/smithy-typescript/pull/1526)) - Fixed allocation of strings starting with underscore and other cases ([#1527](https://github.com/smithy-lang/smithy-typescript/pull/1527)) ### Documentation - Moved description block before deprecated tag ([#1516](https://github.com/smithy-lang/smithy-typescript/pull/1516)) ## 0.26.0 (2025-01-22) ### Features - Dropped support for Node.js 16 ([#1487](https://github.com/smithy-lang/smithy-typescript/pull/1487)) - Upgraded smithyGradleVersion to 1.2.0 ([#1499](https://github.com/smithy-lang/smithy-typescript/pull/1499)) - Passed client configuration to loadNodeConfig calls ([#1471](https://github.com/smithy-lang/smithy-typescript/pull/1471)) - Removed String extension in LazyJsonString ([#1468](https://github.com/smithy-lang/smithy-typescript/pull/1468)) - Upgraded vitest to 2.1.8 ([#1496](https://github.com/smithy-lang/smithy-typescript/pull/1496)) ### Bug Fixes - Fixed code generation issue for operationContextParam ([#1475](https://github.com/smithy-lang/smithy-typescript/pull/1475)) - Resolved obj and array JS literals from JMESPath types for waiters ([#1462](https://github.com/smithy-lang/smithy-typescript/pull/1462)) ## 0.25.0 (2024-11-18) ### Features - Upgraded smithyVersion to 1.52.0 ([#1434](https://github.com/smithy-lang/smithy-typescript/pull/1434)) - Added default accepts=application/cbor header for Smithy RPC v2 CBOR protocol ([#1427](https://github.com/smithy-lang/smithy-typescript/pull/1427)) - Added `| undefined` for optional type properties to support `exactOptionalPropertyTypes` ([#1448](https://github.com/smithy-lang/smithy-typescript/pull/1448)) ### Bug Fixes - Added uuid types import when adding uuid import ([#1428](https://github.com/smithy-lang/smithy-typescript/pull/1428)) ## 0.24.0 (2024-09-30) ### Features - Use spread operator for Command endpoint params only when necessary ([#1396](https://github.com/smithy-lang/smithy-typescript/pull/1396)) - Improve IDE type navigation assistance for command classes ([#1373](https://github.com/smithy-lang/smithy-typescript/pull/1373)) ### Bug Fixes - Allow empty string field values for headers ([#1412](https://github.com/smithy-lang/smithy-typescript/pull/1412)) ## 0.23.0 (2024-09-09) ### Features - codegen: Added Smithy RPCv2 CBOR protocol generator ([#1280](https://github.com/smithy-lang/smithy-typescript/pull/1280)) - codegen: Added support for string array parameters in endpoints ([#1376](https://github.com/smithy-lang/smithy-typescript/pull/1376)) - codegen: Added support for operation context params in endpoints ([#1379](https://github.com/smithy-lang/smithy-typescript/pull/1379)) ### Bug Fixes - Added logic to resolve the service specific endpoint once per client instance instead of for each request ([#1382](https://github.com/smithy-lang/smithy-typescript/pull/1382)) - Fixed a bug that prevented a concrete client type (e.g., `S3Client`) to be converted to a `NodeJsClient` ([#1389](https://github.com/smithy-lang/smithy-typescript/pull/1389)) ### Documentation ## 0.22.0 (2024-08-06) ### Features - codegen: Enabled the new identity and auth behavior by default and add a legacy auth mode ([#1352](https://github.com/smithy-lang/smithy-typescript/pull/1352)) - codegen: Added logic to skip the application of the `CustomEndpoints` plugin for models using Endpoints-2.0 ([#1337](https://github.com/smithy-lang/smithy-typescript/pull/1337)) - codegen: Added automatic default idempotency tokens in headers for requests when a token is not explicitly provided ([#1327](https://github.com/smithy-lang/smithy-typescript/pull/1327)) - codegen: Added a set of built-in integration plugins to code-generator ([#1321](https://github.com/smithy-lang/smithy-typescript/pull/1321)) ### Bug Fixes - codegen: Fixed inconsistent ordering issue when writing client params during code-generation ([#1355](https://github.com/smithy-lang/smithy-typescript/pull/1355)) - codegen: Fixed incorrect usage of string templates when generating commands ([#1354](https://github.com/smithy-lang/smithy-typescript/pull/1354)) - codegen: Fixed serialization of `:event-type` in event-streams where the member target-id was being used instead of the member name ([#1349](https://github.com/smithy-lang/smithy-typescript/pull/1349)) - codegen: Fixed issue where content-type was being set when input body was empty ([#1304](https://github.com/smithy-lang/smithy-typescript/pull/1304)) ## 0.21.1 (2024-06-05) ### Features - Added logging for `CredentialsProviderError` ([#1290](https://github.com/smithy-lang/smithy-typescript/pull/1290)) ### Bug Fixes - Fixed issues with serializing millisecond precision timestamps for certain formats ([#1289](https://github.com/smithy-lang/smithy-typescript/pull/1289), [#1295](https://github.com/smithy-lang/smithy-typescript/pull/1295)) - Fixed issue where `export` was used instead of the clearer `export type` ([#1284](https://github.com/smithy-lang/smithy-typescript/pull/1284)) ## 0.21.0 (2024-05-22) ### Breaking Changes - Update Engines to Node.js 16, Node.js 14 is not officialy supported anymore ([#1258](https://github.com/smithy-lang/smithy-typescript/pull/1258)) ### Features - Bumped TypeScript to ~5.2.x in smithy JS packages ([#1275](https://github.com/smithy-lang/smithy-typescript/pull/1275)) - `@smithy/fetch-http-handler`, `@smithy/node-http-handler`: Improveed stream collection performance ([#1272](https://github.com/smithy-lang/smithy-typescript/pull/1272)) - Improved support for fetch and web-streams in Node.js ([#1256](https://github.com/smithy-lang/smithy-typescript/pull/1256)) - `@smithy/node-http-handler`, `"@smithy/util-stream`: Handle web streams in streamCollector and sdkStreamMixin - Added service client doc generator only when typedoc is selected ([#1253](https://github.com/smithy-lang/smithy-typescript/pull/1253)) ### Bug Fixes - `@smithy/types`: Fixed type transforms account for no-args operation methods ([#1262](https://github.com/smithy-lang/smithy-typescript/pull/1262)) - Check dependencies when adding imports ([#1239](https://github.com/smithy-lang/smithy-typescript/pull/1239)) - Fixed typo in `HttpResponse` docs ([#958](https://github.com/smithy-lang/smithy-typescript/pull/958)) - Fixed URI escape path ([#1224](https://github.com/smithy-lang/smithy-typescript/pull/1224)) ([#1226](https://github.com/smithy-lang/smithy-typescript/pull/1226)) ## 0.20.1 (2024-04-05) ### Features - Updated SigV4 with its own header formatter to avoid import of entire eventstream-codec package ([#1233](https://github.com/smithy-lang/smithy-typescript/pull/1233)) - Updated Smithy Version to 1.47.0 ([#1225](https://github.com/smithy-lang/smithy-typescript/pull/1225)) ### Bug Fixes - Fix middleware-endpoint to check for s3 arn parts ([#1227](https://github.com/smithy-lang/smithy-typescript/pull/1227)) ## 0.20.0 (2024-03-21) ### Features - codegen: Identity and Auth, support for the `@auth` Smithy trait. See https://smithy.io/2.0/spec/authentication-traits.html#auth-trait. - codegen: Support request compression ([#1129](https://github.com/smithy-lang/smithy-typescript/pull/1129)) - codegen: Allow commands to be constructed without arg if all arg fields optional ([#1206](https://github.com/smithy-lang/smithy-typescript/pull/1206)) - codegen: Generate unified error dispatcher ([#1150](https://github.com/smithy-lang/smithy-typescript/pull/1150)) - codegen: Generate Commands using Command classBuilder ([#1118](https://github.com/smithy-lang/smithy-typescript/pull/1118)) - codegen: Paginator factory ([#1115](https://github.com/smithy-lang/smithy-typescript/pull/1115)) - codegen: Generate paginators using a factory ([#1114](https://github.com/smithy-lang/smithy-typescript/pull/1114)) - codegen: XML serde reduction ([#1108](https://github.com/smithy-lang/smithy-typescript/pull/1108)) - codegen: Add requestBuilder, generate requests using a builder pattern ([#1107](https://github.com/smithy-lang/smithy-typescript/pull/1107)) - codegen-docs: Add deprecation message in shape docs ([#1209](https://github.com/smithy-lang/smithy-typescript/pull/1209)) - codegen-docs: Move documentation before release tag and deprecation ([#1211](https://github.com/smithy-lang/smithy-typescript/pull/1211)) - codegen-docs: Move deprecation after description in docs ([#1212](https://github.com/smithy-lang/smithy-typescript/pull/1212)) - codegen-docs: Add more information about BLOB values in structures ([#1182](https://github.com/smithy-lang/smithy-typescript/pull/1182)) - `@smithy/types`: Assertive client type helper ([#1076](https://github.com/smithy-lang/smithy-typescript/pull/1076)) - `@smithy/*`: `dist-cjs` artifacts are now generated as a bundle ([#1146](https://github.com/smithy-lang/smithy-typescript/pull/1146)) - `@smithy/util-base64`: Encoders now accept strings ([#1176](https://github.com/smithy-lang/smithy-typescript/pull/1176)) - `@smithy/node-http-handler`: Enable ctor arg passthrough for requestHandler ([#1167](https://github.com/smithy-lang/smithy-typescript/pull/1167)) - `@smithy/node-http-handler`: Add checked socket exhaustion warning when throughput is slow ([#1164](https://github.com/smithy-lang/smithy-typescript/pull/1164)) - `@smithy/node-http-handler`: Allow http(s).Agent ctor arg in lieu of instance ([#1165](https://github.com/smithy-lang/smithy-typescript/pull/1165)) - `@smithy/node-http-handler`: Reduce buffer copies ([#867](https://github.com/smithy-lang/smithy-typescript/pull/867)) ### Bug Fixes - codegen: Empty the contents of the dependencyVersions.properties file when creating it ([#1213](https://github.com/smithy-lang/smithy-typescript/pull/1213)) - codegen: Import \_json function at call sites ([#1174](https://github.com/smithy-lang/smithy-typescript/pull/1174)) - codegen: Model bucketing edge case with resource shape ([#1123](https://github.com/smithy-lang/smithy-typescript/pull/1123)) - codegen: Use `TopDownIndex::getContainedOperations()` for operation iterations ([#1109](https://github.com/smithy-lang/smithy-typescript/pull/1109)) - codegen: Accommodate services with the world Client in their names ([#1102](https://github.com/smithy-lang/smithy-typescript/pull/1102)) - `@smithy/middleware-retry`: Retry after clock skew correction ([#1170](https://github.com/smithy-lang/smithy-typescript/pull/1170)) - `@smithy/middleware-retry`: Warn streaming requests are not retryable ([#1092](https://github.com/smithy-lang/smithy-typescript/pull/1092)) - `@smithy/core`: Handle multi-part token paths in paginator ([#1160](https://github.com/smithy-lang/smithy-typescript/pull/1160)) - `@smithy/util-utf8`: Use Node.js implementations in react-native ([#1070](https://github.com/smithy-lang/smithy-typescript/pull/1070)) - `@smithy/smithy-client`: Apply filtering when walking json arrays ([#1086](https://github.com/smithy-lang/smithy-typescript/pull/1086)) - `@smithy/util-body-length-browser`: Increase performance of body length calculation for larger payloads on browser ([#1088](https://github.com/smithy-lang/smithy-typescript/pull/1088)) - `@smithy/middleware-serde`: Allow error deserializers to populate error response body ([#1180](https://github.com/smithy-lang/smithy-typescript/pull/1180)) - `@smithy/shared-ini-file-loader`: Process sso-session names with config prefix separator ([#1173](https://github.com/smithy-lang/smithy-typescript/pull/1173)) - `@smithy/shared-ini-file-loader`: Process config files for profile names containing prefix separator ([#1100](https://github.com/smithy-lang/smithy-typescript/pull/1100)) - `@smithy/shared-ini-file-loader`: Allow dot, solidus, percent and colon characters in profile names ([#1067](https://github.com/smithy-lang/smithy-typescript/pull/1067)) ### Documentation - Add readme content for signature-v4 ([#1087](https://github.com/smithy-lang/smithy-typescript/pull/1087)) - Sigv4 README.md brackets ([#1103](https://github.com/smithy-lang/smithy-typescript/pull/1103)) - Fix README `smithy-build.json` examples ([#1082](https://github.com/smithy-lang/smithy-typescript/pull/1082)) ## 0.19.0 (2023-11-02) ### Features - Updated codegen plugins to match idiomatic plugin names([#1057](https://github.com/awslabs/smithy-typescript/pull/1057)) - Added flag for blocking imds v1 fallback behavior ([#1059](https://github.com/awslabs/smithy-typescript/pull/1059)) - Upgraded@babel/traverse from 7.21.2 to 7.23.2 ([#1041](https://github.com/awslabs/smithy-typescript/pull/1041)) - Upgraded browserify-sign from 4.2.1 to 4.2.2 ([#1058](https://github.com/awslabs/smithy-typescript/pull/1058)) - Updated to use migrated `util-endpoints` ([#1044](https://github.com/awslabs/smithy-typescript/pull/1044)) - Re-exported existing endpoint types ([#1055](https://github.com/awslabs/smithy-typescript/pull/1055)) - Added util-endpoints package ([#1043](https://github.com/awslabs/smithy-typescript/pull/1043)) - Allow TypeScriptIntegration to write prior to the config object literal ([#1054](https://github.com/awslabs/smithy-typescript/pull/1054)) - Updated to transform inputs for platform specific type helpers ([#1046](https://github.com/awslabs/smithy-typescript/pull/1046)) - Made `unionShape` deserializer overridable ([#1040](https://github.com/awslabs/smithy-typescript/pull/1040), [#1045](https://github.com/awslabs/smithy-typescript/pull/1045)) - Update to generate enum Record keys when target is enum ([#1037](https://github.com/awslabs/smithy-typescript/pull/1037)) - Removed "| string" and "| number" from enum targeted members ([#1028](https://github.com/awslabs/smithy-typescript/pull/1003)) - Added `-p` for `mkdir` in `build-generated-test-packages` ([#1010](https://github.com/awslabs/smithy-typescript/pull/1003)) - Added logging for `buildAndCopyToNodeModules()` ([#1003](https://github.com/awslabs/smithy-typescript/pull/1003)) - Reorganized models in `smithy-typescript-codegen-test` ([#995](https://github.com/awslabs/smithy-typescript/pull/995)) - Updated to export empty model index if no `model_*` files exist ([#996](https://github.com/awslabs/smithy-typescript/pull/996)) - Read service specific endpoints for environment or config ([#1014](https://github.com/awslabs/smithy-typescript/pull/1014)) - Updated to populate `sso-session` and services sections when loading config files ([#993](https://github.com/awslabs/smithy-typescript/pull/993)) - Added export `CONFIG_PREFIX_SEPARATOR` from `loadSharedConfigFiles` ([#992](https://github.com/awslabs/smithy-typescript/pull/992)) - Updated to pass configuration file as second parameter to `configSelector` ([#990](https://github.com/awslabs/smithy-typescript/pull/990)) - Updated to populate subsection using dot separator in section key when parsing INI files ([#989](https://github.com/awslabs/smithy-typescript/pull/989)) - Added support for reading values from main section when parsing INI files ([#986](https://github.com/awslabs/smithy-typescript/pull/986)) ### Bug Fixes - Exported `RuntimeExtension` and Client `ExtensionConfiguration` interfaces ([#1057](https://github.com/awslabs/smithy-typescript/pull/1057)) - Removed `TARGET_NAMESPACE` from `TypeScriptSettings` ([#1057](https://github.com/awslabs/smithy-typescript/pull/1057)) - Updated Server Codegen to generate without a protocol ([#1057](https://github.com/awslabs/smithy-typescript/pull/1057)) - Updated to use partial record for enum keyed types ([#1049](https://github.com/awslabs/smithy-typescript/pull/1049)) - Allowed lowercase type names for endpoint parameters ([#1050](https://github.com/awslabs/smithy-typescript/pull/1050)) - Added parsing for profile name with invalid '+' character ([#1047](https://github.com/awslabs/smithy-typescript/pull/1047)) - Added missing map shape reference ([#1038](https://github.com/awslabs/smithy-typescript/pull/1038)) - Adds parsing for profile name with invalid '@' character ([#1036](https://github.com/awslabs/smithy-typescript/pull/1036)) - Treat absence of prefix whitespace as section keys when reading ini files ([#1029](https://github.com/awslabs/smithy-typescript/pull/1029)) - Added missing dependency of `@smithy/shared-ini-file-loader` ([#1027](https://github.com/awslabs/smithy-typescript/pull/1027)) - Fixed operation index file codegen ([#1025](https://github.com/awslabs/smithy-typescript/pull/1025)) - Removed extra `$` from `HttpApiKeyAuthSigner` ([#1006](https://github.com/awslabs/smithy-typescript/pull/1006)) - Added await to `signer.sign()` in `httpSigningMiddleware` ([#1005](https://github.com/awslabs/smithy-typescript/pull/1005)) - Fixed `@httpApiKeyAuth` scheme property ([#1001](https://github.com/awslabs/smithy-typescript/pull/1001)) - Fixed `HttpAuthSchemeParameters` codegen ([#998](https://github.com/awslabs/smithy-typescript/pull/998)) - Fixed `resolveHttpAuthSchemeConfig` imports ([#997](https://github.com/awslabs/smithy-typescript/pull/997)) - Updated default `keepalive=false` for fetch ([#1016](https://github.com/awslabs/smithy-typescript/pull/1016)) ## 0.18.0 (2023-10-04) ### Features - Add SSDK codegen test ([#825](https://github.com/awslabs/smithy-typescript/pull/825)) - Add test script when specs are generated ([#821](https://github.com/awslabs/smithy-typescript/pull/821)) - Move vitest config to js ([#833](https://github.com/awslabs/smithy-typescript/pull/833)) - Add PackageContainer interface ([#837](https://github.com/awslabs/smithy-typescript/pull/837)) - Add codegen for improved streaming payload types ([#840](https://github.com/awslabs/smithy-typescript/pull/840)) - Set public release tags on client config interface components ([#850](https://github.com/awslabs/smithy-typescript/pull/850)) - Check for Optional Configuration in client constructor ([#859](https://github.com/awslabs/smithy-typescript/pull/859)) - Add matchSettings() to RuntimeClientPlugins ([#856](https://github.com/awslabs/smithy-typescript/pull/856)) - Add experimentalIdentityAndAuth flag ([#857](https://github.com/awslabs/smithy-typescript/pull/857)) - Add extensions to client runtime config ([#852](https://github.com/awslabs/smithy-typescript/pull/852)) - Use ASCII replacement for character 0xE2 ([#866](https://github.com/awslabs/smithy-typescript/pull/866)) - Add more auth traits to generic client tests ([#882](https://github.com/awslabs/smithy-typescript/pull/882)) - Rename defaultClientConfiguration to defaultExtensionConfiguration ([#888](https://github.com/awslabs/smithy-typescript/pull/888)) - Update codegen to use defaultExtensionConfiguration ([#889](https://github.com/awslabs/smithy-typescript/pull/889)) - Add matchSettings() to TypeScriptIntegration and TypeScriptCodegenPlugin ([#901](https://github.com/awslabs/smithy-typescript/pull/901)) - Add codegen and TS integration points for config ([#881](https://github.com/awslabs/smithy-typescript/pull/881)) - Add generic @httpApiKeyAuth support ([#883](https://github.com/awslabs/smithy-typescript/pull/883)) - Add generic @httpBearerAuth support ([#884](https://github.com/awslabs/smithy-typescript/pull/884)) - Add generic @aws.auth#sigv4 support ([#885](https://github.com/awslabs/smithy-typescript/pull/885)) - Update HttpAuthOption and HttpAuthScheme codegen ([#907](https://github.com/awslabs/smithy-typescript/pull/907)) - Update ExtensionConfigurations to generate for clients only ([#911](https://github.com/awslabs/smithy-typescript/pull/911)) - Add codegen for http component in runtime extension ([#913](https://github.com/awslabs/smithy-typescript/pull/913)) - Add codegen for HttpAuthExtensionConfiguration ([#910](https://github.com/awslabs/smithy-typescript/pull/910)) - Add HttpAuthScheme interfaces for auth scheme resolution ([#928](https://github.com/awslabs/smithy-typescript/pull/928)) - Add service and operation names to HandlerExecutionContext ([#934](https://github.com/awslabs/smithy-typescript/pull/934)) - Add httpSigningMiddleware to authorize and sign requests ([#930](https://github.com/awslabs/smithy-typescript/pull/930)) - Make writeDocs() with Runnable public ([#939](https://github.com/awslabs/smithy-typescript/pull/939)) - Refactor HttpAuthScheme properties to builders ([#941](https://github.com/awslabs/smithy-typescript/pull/941)) - Reorganize http auth module constants ([#942](https://github.com/awslabs/smithy-typescript/pull/942)) - Rename to generateDefaultHttpAuthSchemeProviderFunction() ([#946](https://github.com/awslabs/smithy-typescript/pull/946)) - Add traitId to HttpAuthScheme ([#947](https://github.com/awslabs/smithy-typescript/pull/947)) - Add customizing default httpAuthSchemeProvider and httpAuthSchemeParametersProvider ([#943](https://github.com/awslabs/smithy-typescript/pull/943)) - Add partial support for aws.auth#sigv4a ([#950](https://github.com/awslabs/smithy-typescript/pull/950)) - Update @smithy.rules#endpointRuleSet codegen ([#945](https://github.com/awslabs/smithy-typescript/pull/945)) - Add collect\*() methods to dedupe ConfigFields and HttpAuthSchemeParameter ([#948](https://github.com/awslabs/smithy-typescript/pull/948)) - Add httpAuthSchemeMiddleware to select an auth scheme ([#929](https://github.com/awslabs/smithy-typescript/pull/929)) - Add SmithyContextCodeSection to CommandGenerator ([#957](https://github.com/awslabs/smithy-typescript/pull/957)) - Add link for retryModes input enum ([#962](https://github.com/awslabs/smithy-typescript/pull/962)) - Add aliases for httpSigningMiddleware ([#970](https://github.com/awslabs/smithy-typescript/pull/970)) - Update endpoint rules engine tests ([#976](https://github.com/awslabs/smithy-typescript/pull/976)) - Upgrade to Smithy 1.39.0 ([#976](https://github.com/awslabs/smithy-typescript/pull/976)) ### Bug fixes - Fix types import ([#831](https://github.com/awslabs/smithy-typescript/pull/831)) - Allow lowercase endpoint param ([#923](https://github.com/awslabs/smithy-typescript/pull/923)) - Generate jsdocs for operations with no documentation ([#971](https://github.com/awslabs/smithy-typescript/pull/971)) - Fix missing release tag on shape members ([#854](https://github.com/awslabs/smithy-typescript/pull/854)) ## 0.17.1 (2023-07-07) ### Bug fixes - Fixed @smithy/protocol-http import in HttpApiKeyAuth spec ([#817](https://github.com/awslabs/smithy-typescript/pull/817)) ## 0.17.0 (2023-07-06) ### Features - Upgraded to Smithy 1.33.0 ([#808](https://github.com/awslabs/smithy-typescript/pull/808)) - Updated enum validator to not remove "internal" tagged members ([#807](https://github.com/awslabs/smithy-typescript/pull/807)) ### Bug fixes - Fixed @aws-smithy/server-common version ([#806](https://github.com/awslabs/smithy-typescript/pull/806)) ## 0.16.0 (2023-06-30) ### Features - Updated code generator to use @smithy scoped npm packages ([#791](https://github.com/awslabs/smithy-typescript/pull/791), [#766](https://github.com/awslabs/smithy-typescript/pull/766)) - Improved blob payload input and output types ([#777](https://github.com/awslabs/smithy-typescript/pull/777)) - Added packageDocumentation and improved interface inheritance ([#770](https://github.com/awslabs/smithy-typescript/pull/770)) - Updated code generator to use runtime-agnostic util-stream package ([#775](https://github.com/awslabs/smithy-typescript/pull/775)) ### Bug fixes - Fixed endpoint parameter name conflict ([#772](https://github.com/awslabs/smithy-typescript/pull/772)) - Stopped trimming collection query param output values ([#764](https://github.com/awslabs/smithy-typescript/pull/764)) ## 0.15.0 (2023-05-10) ### Features - Add Gradle composite build ([#761](https://github.com/awslabs/smithy-typescript/pull/761)) - Improve generated command documentation ([#757](https://github.com/awslabs/smithy-typescript/pull/757)) - Bump SSDK libs version to 1.0.0-alpha.10 ([#738](https://github.com/awslabs/smithy-typescript/pull/738)) - Use aggregated client runtime generator ([#736](https://github.com/awslabs/smithy-typescript/pull/736)) - Add SerdeElision KnowledgeIndex and serde helper function ([#735](https://github.com/awslabs/smithy-typescript/pull/735), [#759](https://github.com/awslabs/smithy-typescript/pull/759)) - Shorten internal serde function names ([#730](https://github.com/awslabs/smithy-typescript/pull/730)) - Reduce generated HTTP request header code ([#729](https://github.com/awslabs/smithy-typescript/pull/729)) - Improve documentation truncation ([#728](https://github.com/awslabs/smithy-typescript/pull/728)) - Export `enum` as `const` to reduce generated code ([#726](https://github.com/awslabs/smithy-typescript/pull/726)) - Add structural hint to commmand examples ([#723](https://github.com/awslabs/smithy-typescript/pull/723)) - Skip generating unused sensitive filter functions ([#722](https://github.com/awslabs/smithy-typescript/pull/722)) - Add DefaultReadmeGenerator ([#721](https://github.com/awslabs/smithy-typescript/pull/721)) - Add TSDocs release tags ([#719](https://github.com/awslabs/smithy-typescript/pull/719)) - Add thrown exceptions to generated command documentation ([#715](https://github.com/awslabs/smithy-typescript/pull/715)) - Remove internal enum values from validation message ([#713](https://github.com/awslabs/smithy-typescript/pull/713)) - Omit aggregated client from paginators ([#712](https://github.com/awslabs/smithy-typescript/pull/712)) - Add NodeJS runtime support to SSDK ([#703](https://github.com/awslabs/smithy-typescript/pull/703)) - Remove reflected values from validation message ([#695](https://github.com/awslabs/smithy-typescript/pull/695)) - Add AddClientRuntimeConfig for generic clients ([#693](https://github.com/awslabs/smithy-typescript/pull/693)) ### Bug Fixes - Fix creating empty model files when chunking ([#714](https://github.com/awslabs/smithy-typescript/pull/714)) ## 0.14.0 (2023-02-09) ### Features - Upgrade TypeScript `lib` to use `es2018` for SSDK libs ([#678](https://github.com/awslabs/smithy-typescript/pull/678)) - Bump SSDK libs version to 1.0.0-alpha.8 ([#689](https://github.com/awslabs/smithy-typescript/pull/689)) - Add a code generator setting to generate `@required` members without `| undefined`. **WARNING**: Using this mode may lead to backwards incompatible impact for clients when a service removes `@required` from a member. ([#566](https://github.com/awslabs/smithy-typescript/pull/566), [#688](https://github.com/awslabs/smithy-typescript/pull/688)) ## 0.13.0 (2023-01-31) ### Features - Upgrade tsconfig.es.json target to ES2020 ([#603](https://github.com/awslabs/smithy-typescript/pull/603)) - Upgrade to Java 17 ([#621](https://github.com/awslabs/smithy-typescript/pull/621)) - Upgrade to node >= 14.0.0 ([#623](https://github.com/awslabs/smithy-typescript/pull/623), [#625](https://github.com/awslabs/smithy-typescript/pull/625), [#628](https://github.com/awslabs/smithy-typescript/pull/628)) - Upgrade to Smithy 1.27.2 ([#682](https://github.com/awslabs/smithy-typescript/pull/682)) - Add mavenCentral as plugin repository ([#629](https://github.com/awslabs/smithy-typescript/pull/629)) - Add intEnum generation with validation and tests ([#605](https://github.com/awslabs/smithy-typescript/pull/605), [#654](https://github.com/awslabs/smithy-typescript/pull/654)) - Use util-base64 instead of platform-based dependencies ([#627](https://github.com/awslabs/smithy-typescript/pull/627), [#631](https://github.com/awslabs/smithy-typescript/pull/631)) - Use util-base8 instead of platform-based dependencies ([#672](https://github.com/awslabs/smithy-typescript/pull/672), [#677](https://github.com/awslabs/smithy-typescript/pull/677)) - Add util-retry dependency ([#650](https://github.com/awslabs/smithy-typescript/pull/650)) - Replace Hash with Checksum ([#668](https://github.com/awslabs/smithy-typescript/pull/668)) - Allow deferred resolution for api key config ([#588](https://github.com/awslabs/smithy-typescript/pull/588)) - Stream improvement serde ([#593](https://github.com/awslabs/smithy-typescript/pull/593)) - Support delegation of determining errors for an operation ([#598](https://github.com/awslabs/smithy-typescript/pull/598)) - Reduce object copying in iterators ([#638](https://github.com/awslabs/smithy-typescript/pull/638)) - Refactor writeAdditionalFiles and writeAdditionalExports logic into integration.customize() ([#607](https://github.com/awslabs/smithy-typescript/pull/607)) - Expose static endpoint param instructions provider ([#590](https://github.com/awslabs/smithy-typescript/pull/590)) - Add unit tests for endpoints v2 generator ([#674](https://github.com/awslabs/smithy-typescript/pull/674)) - Use util-utf8 on server and tests () - Bump ssdk lib version to 1.0.0-alpha.7([#675](https://github.com/awslabs/smithy-typescript/pull/675)) - Clients parse datetime offsets ([#681](https://github.com/awslabs/smithy-typescript/pull/681)) ### Bug Fixes - Call parseErrorBody when parsing error structures ([#597](https://github.com/awslabs/smithy-typescript/pull/597)) - Fix broken reference to `fail()` after jest-upgrade ([#645](https://github.com/awslabs/smithy-typescript/pull/645)) - Validate required input query params ([#647](https://github.com/awslabs/smithy-typescript/pull/647), [#646](https://github.com/awslabs/smithy-typescript/pull/646)) - Include x-amz-request-id in request id deser ([#606](https://github.com/awslabs/smithy-typescript/pull/606)) - Add idempotencyToken generation if member is queryParam ([#655](https://github.com/awslabs/smithy-typescript/pull/655)) - Fix Error printout for protocol-response tests ([#657](https://github.com/awslabs/smithy-typescript/pull/657)) - Fix codegen for windows platforms ([#661](https://github.com/awslabs/smithy-typescript/pull/661)) - Fix consistency with type aliases ([#670](https://github.com/awslabs/smithy-typescript/pull/670), [#671](https://github.com/awslabs/smithy-typescript/pull/671)) - Fix misc endpoints 2.0 bugs ([#592](https://github.com/awslabs/smithy-typescript/pull/592), [#600](https://github.com/awslabs/smithy-typescript/pull/600), [#614](https://github.com/awslabs/smithy-typescript/pull/614), [#615](https://github.com/awslabs/smithy-typescript/pull/615), [#616](https://github.com/awslabs/smithy-typescript/pull/616), [#617](https://github.com/awslabs/smithy-typescript/pull/617), [#618](https://github.com/awslabs/smithy-typescript/pull/618), [#619](https://github.com/awslabs/smithy-typescript/pull/619), [#622](https://github.com/awslabs/smithy-typescript/pull/622), [#626](https://github.com/awslabs/smithy-typescript/pull/626), [#634](https://github.com/awslabs/smithy-typescript/pull/634), [#644](https://github.com/awslabs/smithy-typescript/pull/644), [#652](https://github.com/awslabs/smithy-typescript/pull/652), [#658](https://github.com/awslabs/smithy-typescript/pull/658)) ## 0.12.0 (2022-09-19) ### Features - Migrated the code generator to use Smithy's new and recommended DirectedCodegen. ([#585](https://github.com/awslabs/smithy-typescript/pull/585)) - Added support for endpoints v2. ([#586](https://github.com/awslabs/smithy-typescript/pull/586)) - Updated Smithy version to `1.25.x` which bring Smithy IDL v2 support. ([#589](https://github.com/awslabs/smithy-typescript/pull/589)) - Updated SSDK library version to `1.0.0-alpha6`. ([#583](https://github.com/awslabs/smithy-typescript/pull/583)) - Added different package description for client v/s server. ([#582](https://github.com/awslabs/smithy-typescript/pull/582)) - Overrode typescript version for typedoc. ([#561](https://github.com/awslabs/smithy-typescript/pull/561)) - Removed namespaces that only contain log filters. ([#574](https://github.com/awslabs/smithy-typescript/pull/574)) - Added support for event stream for RPC protocols. ([#573](https://github.com/awslabs/smithy-typescript/pull/573)) - Added fallback to status code for unmodeled errors. ([#565](https://github.com/awslabs/smithy-typescript/pull/565)) - Added support for generating protocol specific event payload. ([#554](https://github.com/awslabs/smithy-typescript/pull/554)) - Used Record type instead of Object. ([#556](https://github.com/awslabs/smithy-typescript/pull/556), [#557](https://github.com/awslabs/smithy-typescript/pull/557), [#558](https://github.com/awslabs/smithy-typescript/pull/558), [#562](https://github.com/awslabs/smithy-typescript/pull/562)) - Removed explicit reference to MetadataBearer from error shapes. ([#545](https://github.com/awslabs/smithy-typescript/pull/545)) - Added codegen indicator comment to generated files. ([#538](https://github.com/awslabs/smithy-typescript/pull/538)) - Added check to stop pagination on same token. ([#534](https://github.com/awslabs/smithy-typescript/pull/534)) ### Bug Fixes - Fixed code generation for server protocol tests. ([#577](https://github.com/awslabs/smithy-typescript/pull/577)) - Fixed missing Content-Type header in some events. ([#567](https://github.com/awslabs/smithy-typescript/pull/567)) ## 0.11.0 (2022-04-04) ### Features - Removed MetadataBearer from output type. ([#530](https://github.com/awslabs/smithy-typescript/pull/530)) - Updated Smithy version to `1.19.x`. ([#531](https://github.com/awslabs/smithy-typescript/pull/531)) - Updated `typescript` to `~4.6.2`. ([#527](https://github.com/awslabs/smithy-typescript/pull/527)) - Set bodyLengthChecker type to BodyLengthCalculator. ([#524](https://github.com/awslabs/smithy-typescript/pull/524)) ### Bug Fixes - Added missing export for `httpApiKeyAuth` middleware. ([#528](https://github.com/awslabs/smithy-typescript/pull/528)) ## 0.10.0 (2022-03-02) ### Features - Bumped SSDK library versions to 1.0.0-alpha5. ([#520](https://github.com/awslabs/smithy-typescript/pull/520)) - Added support for `List` in function parameters list. ([#516](https://github.com/awslabs/smithy-typescript/pull/516)) - Updated generation of exceptions for easier handling. ([#502](https://github.com/awslabs/smithy-typescript/pull/502)) - Updated clean script to delete \*.tsbuildinfo. ([#514](https://github.com/awslabs/smithy-typescript/pull/514)) ### Bug Fixes - Fixed scripts for npm by extracting run command out. ([#519](https://github.com/awslabs/smithy-typescript/pull/519)) - Fixed the generation of collections of documents in protocol tests. ([#513](https://github.com/awslabs/smithy-typescript/pull/513)) ## 0.9.0 (2022-02-14) ### Features - Updated Smithy version to `1.17.x`. ([#505](https://github.com/awslabs/smithy-typescript/pull/505)) - Added support for `@httpApiKeyAuth`. ([#473](https://github.com/awslabs/smithy-typescript/pull/473)) - Added a default `prepack` script to generated packages. ([#479](https://github.com/awslabs/smithy-typescript/pull/479)) - Added TypeScript contextual keywords to the reserved words list. ([#500](https://github.com/awslabs/smithy-typescript/pull/500)) - Changed generated builds to run concurrently. ([#498](https://github.com/awslabs/smithy-typescript/pull/498)) - Added support for `defaultsMode`. ([#495](https://github.com/awslabs/smithy-typescript/pull/495)) - Updated generated packages to use `@tsconfig/recommended`. ([#493](https://github.com/awslabs/smithy-typescript/pull/493)) - Removed `filterSensitiveLog` from exceptions. ([#488](https://github.com/awslabs/smithy-typescript/pull/488)) - Bumped SSDK library versions to 1.0.0-alpha4. ([#480](https://github.com/awslabs/smithy-typescript/pull/480)) - Removed test dependencies and configuration from generated packages. ([#483](https://github.com/awslabs/smithy-typescript/pull/483)) - Updated minimum supported Node version to 12. ([#481](https://github.com/awslabs/smithy-typescript/pull/481), [#482](https://github.com/awslabs/smithy-typescript/pull/482)) - Added option to configure package manager, supporting `yarn` and `npm`. ([#476](https://github.com/awslabs/smithy-typescript/pull/476)) - Switched pattern validation to re2-wasm to avoid native dependency. ([#467](https://github.com/awslabs/smithy-typescript/pull/467)) ### Bug Fixes - Updated protocol tests to check for `ErrorName`. ([#490](https://github.com/awslabs/smithy-typescript/pull/490)) - Added escaping for regex literals in path segments. ([#477](https://github.com/awslabs/smithy-typescript/pull/477)) - Fix greedy label matching. ([#474](https://github.com/awslabs/smithy-typescript/pull/474)) ### Documentation - Updated README example. ([#501](https://github.com/awslabs/smithy-typescript/pull/501)) ## 0.8.0 (2021-11-23) ### Features - Updated Smithy version dependency to be more specific. ([#465](https://github.com/awslabs/smithy-typescript/pull/465)) - Updated Smithy version to `1.14.x`. ([#468](https://github.com/awslabs/smithy-typescript/pull/468)) ### Bug Fixes - Fixed the generated comment for link to client config. ([#466](https://github.com/awslabs/smithy-typescript/pull/466)) ## 0.7.0 (2021-11-03) ### Features - Updated parsing of timestamps and unions to be stricter. ([#412](https://github.com/awslabs/smithy-typescript/pull/412), [#414](https://github.com/awslabs/smithy-typescript/pull/414)) - Reduced published package size. ([#427](https://github.com/awslabs/smithy-typescript/pull/427), [#443](https://github.com/awslabs/smithy-typescript/pull/443), [#446](https://github.com/awslabs/smithy-typescript/pull/446), [#444](https://github.com/awslabs/smithy-typescript/pull/444), [#452](https://github.com/awslabs/smithy-typescript/pull/452)) - Added handling for more complex Accept header values. ([#431](https://github.com/awslabs/smithy-typescript/pull/431)) - Moved source files to `src` folder. ([#434](https://github.com/awslabs/smithy-typescript/pull/434), [#437](https://github.com/awslabs/smithy-typescript/pull/437), [#438](https://github.com/awslabs/smithy-typescript/pull/438)) - Added ability to ts-ignore a default import. ([#445](https://github.com/awslabs/smithy-typescript/pull/445)) - Updated Smithy version to `1.12.0`. ([#448](https://github.com/awslabs/smithy-typescript/pull/448)) - Switched to re2 for pattern validation. ([#451](https://github.com/awslabs/smithy-typescript/pull/451)) ### Bug Fixes - Used base64 en/decoder from context in bindings. ([#419](https://github.com/awslabs/smithy-typescript/pull/419)) - Downgraded `typescript` to `~4.3.5`. ([#418](https://github.com/awslabs/smithy-typescript/pull/418)) - Fixed XML protocol test to compare payload with outmost node. ([#433](https://github.com/awslabs/smithy-typescript/pull/433)) - Fixed handling of multi-value query parameters to align with API Gateway behavior. ([#449](https://github.com/awslabs/smithy-typescript/pull/449)) ## 0.6.0 (2021-09-02) ### Features - Updated parsing of request and response payloads for Http binding protocols to be stricter. ([#405](https://github.com/awslabs/smithy-typescript/pull/405)) - Updated number parsing to be stricter based on size. ([#397](https://github.com/awslabs/smithy-typescript/pull/397), [#404](https://github.com/awslabs/smithy-typescript/pull/404)) - Added handling for Content-Type and Accept headers in SSDK. ([#394](https://github.com/awslabs/smithy-typescript/pull/394)) - Added a generator for `@httpMalformedRequestTests`. ([#393](https://github.com/awslabs/smithy-typescript/pull/393)) - Added warning for unsupported Node.js version. ([#392](https://github.com/awslabs/smithy-typescript/pull/392)) ### Bug Fixes - Allowed setting prefix path for rpc protocols. ([#406](https://github.com/awslabs/smithy-typescript/pull/406)) - Fixed SSDK codegen for different casing of operation name, by using operation symbol name consistently. ([#402](https://github.com/awslabs/smithy-typescript/pull/402)) - Fixed processing of runtime config for generic clients. ([#401](https://github.com/awslabs/smithy-typescript/pull/401)) ## 0.5.0 (2021-07-23) ### Features - Bumped `tslib` version to `2.3.0`. ([#387](https://github.com/awslabs/smithy-typescript/pull/387)) - Calculate content-length for SSDKs. ([#386](https://github.com/awslabs/smithy-typescript/pull/386)) ### Bug Fixes - Update dependency versioning to pull from `smithy-aws-typescript-codegen` or use `latest`. ([#388](https://github.com/awslabs/smithy-typescript/pull/388)) ================================================ FILE: CODE_OF_CONDUCT.md ================================================ ## Code of Conduct This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact opensource-codeofconduct@amazon.com with any additional questions or comments. ================================================ FILE: CODE_REVIEW.md ================================================ # Code Review General guide for code review. ## TypeScript source code This covers the `@smithy/*` scoped core runtime for JavaScript. ### Runtime Environments We support the Node.js runtime, modern commonly used browsers, and react-native. To ensure that these runtime environments are API-equivalent, we have validation scripts in the core package that require all Node.js/browser/native implementations to have equivalent API surfaces. Exported runtime symbols and type symbols are examined. - For any usage of the `node:` modules or functionality not present in browsers, an alternate implementation must be provided for browsers. The native implementation defaults to the browser one unless a separate `index.native.ts` is implemented. - In some cases, there is no alternate in browsers. This must be clearly indicated at the `index.ts` level by the symbol `Symbol.for("node-only")` when implementing export symbol matching. Examples may be found in `@smithy/core` submodule indexes. ### Language Target Level - The runtime code must be understood by the stated [minimum supported language level](https://aws.amazon.com/blogs/developer/aws-sdk-for-javascript-aligns-with-node-js-release-schedule/). - We do not use experimental language features that require polyfills or transform steps to run in Node.js. - caveat: our 3rd supported runtime environment, react-native, may require polyfills. The react-native runtime has historically been non-standard to the point that we should not let it influence the default Node.js implementation. ### Code priorities 1. Correctness & Security 2. Runtime performance 3. Brevity and initialization performance 4. Readability When making a trade-off between readability and performance, prioritize _performance_. Readability can be provided by comments, whereas performance cannot. Within performance, balance throughput performance and code-size, which affects initialization time. There will also be a point where performance gains are small enough that an optimization should not be made. This is not predefined and left to the reviewer. ### Building blocks for runtime performance - Stable memory allocation: for hot code, pre-allocate the workspace (e.g. a byte array), work within it, and only allow it to be garbage-collected after leaving the hot code path. - Minimize intermediate collections like `Object.keys()`. - Minimize copying like `{ ...data }`. - Minimize function scope depth. - Minimize function scope traversal including recursion. - Minimize object allocation, including the creation of closures. ### API surface We want to provide as small an API surface as possible. This is not because we don't want to provide features to our users. We want to avoid situations where users have built solutions on top of non-public APIs that we later change or remove. To ensure that we have visibility on the API surface of the runtime, we have an API snapshot check that runs during integration testing. - `export *` statements are banned for new code. `export *` creates an API surface that is not diff-visible between changes, and leads to leaking implementation details. - Things of interest to the reader must appear closer to the top. - One concrete implementation for this is that in classes, `public` methods must come before `protected`. `private` comes last. For non-classes, apply the same reasoning with your own judgment. ```ts /** * Description goes here. * * @example * const impl = new Impl(); * * @public */ export class Impl { public prop1; private prop2; public constructor() { } /** * Static factory. */ public static method1() { } /** * @returns something. */ public method2() { } private static method3() { } private method4() { } } const moduleInternal = () => { }; ``` ### Code comment block documentation (tsdoc) We write code comments to the https://tsdoc.org/ specification. - The free-form description (optional) of a symbol must come first. All annotations must come below this description. - For any symbol exported from a package, it must have an access level annotation, `@public` or `@internal`. - In limited circumstances `@alpha` and `@beta` may be used. - For non-exported symbols, you do not need to write comments for all symbols. Use your judgment here. - You may opt to write a free-form description of a method in lieu of writing the API annotations `@param` and `@returns` etc. - Comments explain "why?", not "how?". The code says "how". # Java source code - "codegen" - Optimize performance by creating cached `KnowledgeIndex` objects. Avoid repeated traversal of a service model for static information. - Avoid excessive logging to the WARN and INFO channels. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Guidelines Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional documentation, we greatly value feedback and contributions from our community. Please read through this document before submitting any issues or pull requests to ensure we have all the necessary information to effectively respond to your bug report or contribution. ## Gradle Composite Build The `smithy-typescript` repository uses Gradle as a build tool and has Gradle based dependencies such as `smithy`. To improve development experience when making changes to the dependencies locally, we can use the [Gradle composite build feature](https://docs.gradle.org/current/userguide/composite_builds.html), which allows picking up any local changes from dependencies automatically and rebuilding them when `smithy-typescript` is rebuilt. This also makes IDE integration more pleasant, as Intellij IDEA will open the included projects as modules when the Gradle build is imported. In order to utilise this feature, create a file `local.properties` in the project directory with the following content: ``` smithy=/Volumes/workplace/smithy ``` ## Experimental Features The `smithy-typescript` repository is under heavy development, and has experimental features that can affect consumers of code generation packages and TypeScript packages. These features are enabled via opt-in settings in `smithy-build.json`. Note that any contributions related to these features MUST be reviewed carefully for opt-in behavior via feature flags as to not break any existing customers. Here are the experimental features that are currently under development: | Experimental Feature | Flag | Description | | -------------------- | ---- | ----------- | | N/A | N/A | N/A | ## Reporting Bugs/Feature Requests We welcome you to use the GitHub issue tracker to report bugs or suggest features. When filing an issue, please check [existing open](https://github.com/smithy-lang/smithy-typescript/issues), or [recently closed](https://github.com/smithy-lang/smithy-typescript/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), issues to make sure somebody else hasn't already reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: - A reproducible test case or series of steps - The version of our code being used - Any modifications you've made relevant to the bug - Anything unusual about your environment or deployment ## Contributing via Pull Requests Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 1. You are working against the latest source on the _main_ branch. 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. To send us a pull request, please: 1. Fork the repository. 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 3. Ensure local tests pass. 4. Commit to your fork using clear commit messages. 5. Send us a pull request, answering any default questions in the pull request interface. 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. If you are modifying one or more of the NPM packages in the `/packages` directory please follow these additional steps before opening a pull request: 1. After modifying the source, run `yarn changeset add`. 2. Follow the prompts and select the appropriate change level (`major`, `minor` or `patch`) for each of the NPM packages you have modified. 3. Add the generated changeset file to your commit: `git add .changeset/.md`. 4. Commit to your fork using clear commit messages. 5. Send the pull request. GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). ## Keeping code generation in sync with aws-sdk-js-v3 Any changes made to the `smithy-typescript-codegen` package need to be compatible with aws-sdk-js-v3. Maintainers and reviewers MUST ensure that code generation is kept in sync between the two repositories by creating an equivalent PR in aws-sdk-js-v3. Procedure to keep code generation in sync while making changes to `smithy-typescript-codegen`: 1. Fork and clone [aws/aws-sdk-js-v3][aws-sdk-js-v3]. 2. Run `yarn` to install dependencies. 3. Run `generate-clients` with `HEAD` commit as follows: ```sh yarn generate-clients --commit HEAD ``` 4. If the clients are updated, post a pull request on aws-sdk-js-v3. If the clients are not updated, no further action is needed. 5. When PR on smithy-typescript is merged, rebase the PR on aws-sdk-js-v3 and add merged commit as default. ## Finding contributions to work on Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any ['help wanted'](https://github.com/smithy-lang/smithy-typescript/labels/help%20wanted) issues is a great place to start. ## Code of Conduct This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact opensource-codeofconduct@amazon.com with any additional questions or comments. ## Security issue notifications If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue. ## Licensing See the [LICENSE](https://github.com/smithy-lang/smithy-typescript/blob/main/LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. We may ask you to sign a [Contributor License Agreement (CLA)](http://en.wikipedia.org/wiki/Contributor_License_Agreement) for larger changes. [aws-sdk-js-v3]: https://github.com/aws/aws-sdk-js-v3 ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ================================================ FILE: Makefile ================================================ .PHONY: build sync api-snapshot ct cti cwt cwti build: ./gradlew clean build publishToMavenLocal sync: gh repo sync $$GITHUB_USERNAME/smithy-typescript -b main git fetch --all generate-protocol-tests: rm -rf ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen ./gradlew :smithy-typescript-protocol-test-codegen:build rm -rf ./private/smithy-rpcv2-cbor rm -rf ./private/smithy-rpcv2-cbor-schema rm -rf ./private/my-local-model rm -rf ./private/my-local-model-schema cp -r ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen/smithy-rpcv2-cbor/typescript-codegen ./private/smithy-rpcv2-cbor cp -r ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen/smithy-rpcv2-cbor-schema/typescript-codegen ./private/smithy-rpcv2-cbor-schema cp -r ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen/my-local-model/typescript-client-codegen/ ./private/my-local-model cp -r ./smithy-typescript-protocol-test-codegen/build/smithyprojections/smithy-typescript-protocol-test-codegen/my-local-model-schema/typescript-client-codegen/ ./private/my-local-model-schema node ./scripts/post-protocol-test-codegen yarn yarn turbo run build -F="./private/*" --only make test-protocols; test-protocols: (cd ./private/smithy-rpcv2-cbor && npx vitest run --globals && yarn test:index) (cd ./private/smithy-rpcv2-cbor-schema && npx vitest run --globals && yarn test:index) (cd ./private/my-local-model-schema && npx vitest run --globals && yarn test:index) (cd ./private/smithy-rpcv2-cbor-schema && yarn test:integration) (cd ./private/my-local-model-schema && yarn test:integration) benchmark: (cd ./private/my-local-model-schema && npx vitest run --globals) # "build generate test" bgt: make build generate-protocol-tests gt: make generate-protocol-tests test-unit: yarn g:vitest run -c vitest.config.mts test-browser: yarn g:vitest run -c vitest.config.browser.mts test-bundlers: (cd ./testbed/bundlers && make run) # typecheck for test code. test-types: npx tsc -p tsconfig.test.json test-integration: node ./scripts/validation/no-generic-byte-arrays.js; node ./scripts/check-dependencies.js; node ./scripts/runtime-dep-version-check.js; make test-browser; yarn g:vitest run -c vitest.config.integ.mts; make test-types; make test-bundlers; turbo-clean: @read -p "Are you sure you want to delete your local cache? [y/N]: " ans && [ $${ans:-N} = y ] @echo "\nDeleted cache folders: \n--------" @find . -name '.turbo' -type d -prune -print -exec rm -rf '{}' + && echo '\n' api-snapshot: yarn build node scripts/validation/api-snapshot-validation.js --write git diff --exit-code api-snapshot/ S ?= $(word 2,$(MAKECMDGOALS)) # make ct retry, for example, to run a subset of core unit tests. ct: cd packages/core && yarn g:vitest run src/submodules/$(S) cwt: cd packages/core && yarn g:vitest watch src/submodules/$(S) # same as ct, but for integration tests. cti: cd packages/core && yarn g:vitest run -c vitest.config.integ.mts src/submodules/$(S) cwti: cd packages/core && yarn g:vitest watch -c vitest.config.integ.mts src/submodules/$(S) # swallow extra positional args (e.g. make ct endpoints) %: @: ================================================ FILE: NOTICE ================================================ Smithy Typescript Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. ================================================ FILE: README.md ================================================ # Smithy Smithy TypeScript > **WARNING: Smithy TypeScript is currently in [Developer Preview](https://aws.amazon.com/blogs/devops/smithy-server-and-client-generator-for-typescript). All interfaces and supported JavaScript platforms are subject to change.** `smithy-typescript` includes the reference implementations of the [Smithy](https://smithy.io/) code generators for [TypeScript](https://www.typescriptlang.org/). For Client SDK code generation, the `typescript-client-codegen` plugin provides a framework for generating extensible TypeScript clients that can support multiple JavaScript platforms, including Node.js, Browser, and React-Native. See [the section on generating a client to see how to get started](#generating-a-client), or [the `typescript-client-codegen` documentation](#client-sdk-code-generation-typescript-client-codegen-plugin). > Note: Node.js support includes versions >= 20, and is subject to change. For Server SDK code generation, the `typescript-server-codegen` plugin provides a framework for generating server scaffolding at a higher level of abstraction and with type safety. More documentation can be found at in [the `typescript-server-codegen` documentation](#server-sdk-code-generation-typescript-server-codegen-plugin), or [smithy.io](https://smithy.io/2.0/languages/typescript/ts-ssdk/index.html). ## Generating a client The Smithy TypeScript `typescript-client-codegen` code generator in this repository generates TypeScript clients from Smithy models, and can be built with both the idiomatic [Smithy CLI](#using-smithy-typescript-with-the-smithy-cli) or through [Gradle](#using-smithy-typescript-with-gradle). > The Smithy CLI is a prerequisite for this section when using the `smithy init` commands. See [the installation guide](https://smithy.io/2.0/guides/smithy-cli/cli_installation.html) for how to install the Smithy CLI. If installing the Smithy CLI is not preferred, the templates used can be found in the [Smithy Examples repository](https://github.com/smithy-lang/smithy-examples). For additional configuration, see [the `typescript-client-codegen` documentation](#client-sdk-code-generation-typescript-client-codegen-plugin) and [the documentation for `smithy-build.json`](https://smithy.io/2.0/guides/building-models/build-config.html). ### Using Smithy TypeScript with the Smithy CLI Using the Smithy CLI, a new Smithy CLI project can be created using the default `smithy init` template. In this example, the project will be called `smithy-typescript-example-client`. ```shell smithy init -o smithy-typescript-example-client cd smithy-typescript-example-client/ ``` This will create a project with the following directory structure: ```text smithy-typescript-example-client/ ├── README.md ├── models │ └── weather.smithy └── smithy-build.json ``` To add a minimal `typescript-client-codegen` plugin, add the following to `smithy-build.json`: ```json // smithy-build.json { "version": "1.0", "sources": ["models"], // Add the Smithy TypeScript code generator dependency "maven": { "dependencies": ["software.amazon.smithy.typescript:smithy-typescript-codegen:0.49.1"] }, "plugins": { // Add the Smithy TypeScript client plugin "typescript-client-codegen": { // Minimal configuration: add package name and version "package": "@smithy/typescript-example-client", "packageVersion": "0.0.1" } } } ``` After `smithy-build.json` has been configured, run `smithy build`. This will code generate the TypeScript client under the `source` projection, found in the `build/smithy/source/typescript-client-codegen` directory. Verify the client is able to compile by running the following: ```shell cd build/smithy/source/typescript-client-codegen # Yarn is used in this example, but equivalent commands using other package managers can be used, e.g. npm and pnpm yarn yarn build ``` > Note that running the NPM scripts to verify the generated TypeScript client is NOT part of the code generation process, and needs to be explicitly executed after the client is generated. ### Using Smithy TypeScript with Gradle Using the Smithy CLI, a new Gradle project can be created using the `quickstart-gradle` template. In this example, the project will be called `smithy-typescript-example-client-gradle`. ```shell smithy init -t quickstart-gradle -o smithy-typescript-example-client-gradle cd smithy-typescript-example-client-gradle/ ``` This will create a project with the following directory structure: ```text smithy-typescript-example-client-gradle/ ├── README.md ├── build.gradle.kts ├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── models │ └── weather.smithy ├── settings.gradle.kts └── smithy-build.json ``` To add a minimal `typescript-client-codegen` plugin, add the following to `smithy-build.json`: ```json // smithy-build.json { "version": "1.0", "sources": ["models"], "plugins": { // Add the Smithy TypeScript client plugin "typescript-client-codegen": { // Minimal configuration: add package name and version "package": "@smithy/typescript-example-client", "packageVersion": "0.0.1" } } } ``` > Note: Maven dependencies cannot be configured in `smithy-build.json` for Gradle projects. Then, add the `smithy-typescript-codegen` dependency in `build.gradle.kts`: ```kotlin plugins { id("java-library") id("software.amazon.smithy.gradle.smithy-jar").version("0.10.1") } repositories { mavenLocal() mavenCentral() } dependencies { val smithyVersion: String by project smithyCli("software.amazon.smithy:smithy-cli:$smithyVersion") // Add the Smithy TypeScript code generator dependency implementation("software.amazon.smithy.typescript:smithy-typescript-codegen:0.49.1") // Uncomment below to add various smithy dependencies (see full list of smithy dependencies in https://github.com/awslabs/smithy) // implementation("software.amazon.smithy:smithy-model:$smithyVersion") // implementation("software.amazon.smithy:smithy-linters:$smithyVersion") } ``` After `smithy-build.json` and `build.gradle.kts` have been configured, run `./gradlew clean build`. This will code generate the TypeScript client under the `source` projection, found in the `build/smithyprojections/quickstart-gradle/source/typescript-client-codegen` directory. Verify the client is able to compile by running the following: ```shell cd build/smithyprojections/quickstart-gradle/source/typescript-client-codegen # Yarn is used in this example, but equivalent commands using other package managers can be used, e.g. npm and pnpm yarn yarn build ``` > Note that running the NPM scripts to verify the generated TypeScript client is NOT part of the code generation process, and needs to be explicitly executed after the client is generated. For another example of a Gradle project using Smithy Typescript, the `smithy-typescript-codegen-test` package can be referenced as it builds different TypeScript artifacts through projections. See [the Smithy documentation](https://smithy.io/2.0/guides/building-models/gradle-plugin.html) for more information on build Smithy projects with Gradle. > Note: the Smithy Gradle Plugin is under heavy development and is subject to breaking changes. ## TypeScript code generation By default, the Smithy TypeScript code generators provide the code generation framework to generate TypeScript artifacts (e.g. types, interfaces, implementations) of specified Smithy models. However there are implementations for code generation and TypeScript that either need to be implemented or consumed from third-party packages: - Protocols: Protocols define how operation shapes (for clients and servers, these are usually inputs and outputs) are serialized and deserialized on the wire. This behavior can be defined in Smithy through [protocol traits](https://smithy.io/2.0/spec/protocol-traits.html) with corresponding implementations of [the `ProtocolGenerator` interface](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/ProtocolGenerator.java). For example, [AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3), a customer of Smithy TypeScript, implements the [AWS protocols](https://smithy.io/2.0/aws/protocols/index.html) in the `software.amazon.smithy.typescript:smithy-aws-typescript-codegen` package. See [the section on protocol generator implementations for more details](#protocol-generator-implementations). - Publishing: There is no idiomatic utility to publish generated artifacts since package distribution can vary depending on different technical requirements. For example, [AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3), a customer of Smithy TypeScript, has custom tooling to manage versioning, change logs, and publishing in a monorepo. See [the section on publishing client packages for more details](#publishing-a-client-sdk-package). - Endpoint resolution (clients): Endpoint resolution is not implemented by default due to a variety of different implementations. In most cases, providing a default provider in the runtime config for the client config `endpoint` property should suffice. More complex use cases include [the `@smithy.rules#endpointRuleSet` trait](https://smithy.io/2.0/additional-specs/rules-engine/specification.html#smithy-rules-endpointruleset-trait) which provides [a complete DSL for endpoint resolution](https://smithy.io/2.0/additional-specs/rules-engine/index.html). See [the section on handling endpoint resolution for more details](#handling-endpoint-resolution). - Operation handler implementations (servers): The server code generator provides the scaffolding for operations. The operation handlers defining the business logic of the Smithy service need to be implemented manually. ### Client SDK code generation: `typescript-client-codegen` plugin #### `typescript-client-codegen` plugin configuration > Note: Although plugin configuration is maintained with backward compatibility in mind, breaking changes may still occur. [`TypeScriptSettings`](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptSettings.java) contains all of the settings enabled from `smithy-build.json` and helper methods and types. The up-to-date list of top-level properties enabled for `typescript-client-codegen` can be found in `TypeScriptSettings.ArtifactType.CLIENT`. | Setting | Required | Description | | ------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `package` | Yes | Name of the package in `package.json`. | | `packageVersion` | Yes | Version of the package in `package.json`. Will be overwritten if using `versioningScheme` and the scheme is recognized, but is required as a fallback value. | | `versioningScheme` | No | Default="". Overwrites `packageVersion`. Applies automatic versioning to the generated package. "@smithy/core" will use the version of `@smithy/core` contemporary to the code generator. If the `versioningScheme` value is not recognized, then `packageVersion` will be used. `@aws-sdk/client` is recognized only when this code generator is used in conjunction with `smithy-aws-typescript-codegen`, in which case the highest contemporary AWS SDK client version will be used. | | `packageDescription` | No | Description of the package in `package.json`. The default value is `${package} client` | | `packageJson` | No | Custom `package.json` properties that will be merged with the base `package.json`. The default value is an empty object. | | `packageManager` | No | Configured package manager for the package. The default value is `yarn`. | | `service` | No | The Shape ID of the service to generate a client for. If not provided, the code generator will attempt to infer the service Shape ID. If there is exactly 1 service found in the model, then the service is used as the inferred Shape ID. If no services are found, then code generation fails. If more than 1 service is found, then code generation fails. | | `protocol` | No | The Shape ID of the protocol used to generate serialization and deserialization. If not provided, the code generator will attempt to resolve the highest priority service protocol supported in code generation (registered through `TypeScriptIntegration`). If no protocols are found, code generation will use serialization and deserialization error stubs. | | `private` | No | Whether the package is `private` in `package.json`. The default value is `false`. | | `requiredMemberMode` | No | **NOT RECOMMENDED DUE TO BACKWARD COMPATIBILITY CONCERNS.** Sets whether members marked with the `@required` trait are allowed to be `undefined`. See more details on the risks in `TypeScriptSettings.RequiredMemberMode`. The default value is `nullable`. | | `bigNumberMode` | No | use `"native"` to serialize and deserialize Smithy BigInteger and BigDecimal to `bigint` and `@smithy/core/serde`'s `NumericValue`. Otherwise, use `"big.js"` to serialize and deserialize with that numeric library. | | `createDefaultReadme` | No | Whether to generate a default `README.md` for the package. The default value is `false`. | | `useLegacyAuth` | No | **NOT RECOMMENDED, AVAILABLE ONLY FOR BACKWARD COMPATIBILITY CONCERNS.** Flag that enables using legacy auth. When in doubt, use the default identity and auth behavior (not configuring `useLegacyAuth`) as the golden path. | | `serviceProtocolPriority` | No | Map of service `ShapeId` strings to lists of protocol `ShapeId` strings. Used to override protocol selection behavior. | | `defaultProtocolPriority` | No | List of protocol `ShapeId` strings. Lower precedence than `serviceProtocolPriority` but applies to all services. | | `generateIndexTests` | No | Default=`false`. Whether to generate a set of tests that does a basic validation of the export surface of the generated client package. The tests can be run with the script `test:index` in the generated package. | | `generateSnapshotTests` | No | Default=`false`. Whether to generate snapshot tests along with the client. | #### `typescript-client-codegen` plugin artifacts Smithy TypeScript clients are extensible (see [the AWS blog post on the middleware stack](https://aws.amazon.com/blogs/developer/middleware-stack-modular-aws-sdk-js/)), robust, and support multiple JavaScript platforms. The main components of a client are the following (`$SERVICE` is the name of a Smithy service, `$OPERATION` is the name of a Smithy operation, `$N` is a number starting from 0): - Client classes: A standalone tree-shakeable client defined in `src/$SERVICEClient.ts` and an aggregated client defined in `src/$SERVICE.ts`. The client classes are the entry point to calling a service, defining the input configuration of the service and adding any service-level middleware. ```typescript import { $SERVICEClient, $SERVICE } from "..."; // example client package const individualClient = new $SERVICEClient({ // Input configuration with type hints }); const aggregatedClient = new $SERVICE({ // Input configuration with type hints }); ``` - Command classes: Individual commands defined in `src/commands/$OPERATIONCommand.ts`. These classes include operation-level middleware and additional values to the client resolved configuration through the middleware context. ```typescript import { $SERVICEClient, $OPERATIONCommand, $OPERATIONCommandOutput } from "..."; // example client package const individualClient = new $SERVICEClient({ // Input configuration with type hints }); const response: Promise<$OPERATIONCommandOutput> = individualClient.send( new $OPERATIONCommand({ // Operation input with type hints // Operations can also be called callback style or with HandlerOptions }) ); ``` - Models: Types and interfaces exported from `models/index.ts`, found individually in `models/model_$N.ts`, and errors including a base `$SERVICEServicexception.ts`. ```typescript import { $SERVICEClient, $SERVICEServiceException, $OPERATIONCommand, $OPERATIONCommandOutput } from "..."; // example client package const individualClient = new $SERVICEClient({ // Input configuration with type hints }); try { // $OPERATIONCommandOutput generated from the Smithy model const response: $OPERATIONCommandOutput = await individualClient.send(new $OPERATIONCommand({})); } catch (error) { // If more errors are defined in the Smithy model, then more extensive checks can be made if (error instanceof $SERVICEServiceException) { console.error("Oh no, a service exception was thrown!"); } throw error; } ``` - Runtime Configurations: Populated default values for a client input configuration for different platforms, currently supporting Node.js, Browser, and React-Native. All of these have a shared runtime configuration that is overwritten with more specific platform values. Not every client input configuration needs a default value, but it is best practice to provide a reasonable default. For example, the `extensions` property defaults to an empty array when no runtime extensions are specified. ```text Least-specific ┌──────────────────────────────────────────────────────────┐ │ Shared Runtime Configuration (`runtimeConfig.shared.ts`) │ └──────────────────────────────────────────────────────────┘ │ │ ┌──────────────────────────────┐ ┌─────────────────────────────────────-┐ │ Node.js (`runtimeConfig.ts`) │ │ Browser (`runtimeConfig.browser.ts`) │ └──────────────────────────────┘ └──────────────────────────────────────┘ │ ┌─────────────────────────────────────────-┐ │ React-Native (`runtimeConfig.native.ts`) │ └──────────────────────────────────────────┘ Most-specific (overrides values from parent) ``` - Runtime Extensions: Interfaces to implement extensions enabling alternative default values to the runtime configuration. See [the section on customizing TypeScript Client Configuration for more details](#typescript-client-configuration). - Package Configuration files: `package.json` and TypeScript configuration files for different platforms. Other directories could include code generated [paginators](https://smithy.io/2.0/spec/behavior-traits.html#pagination), [waiters](https://smithy.io/2.0/additional-specs/waiters.html), endpoint resolvers, etc., but are usually generated only when traits are present. If code-generating custom files for the SDK client, it is recommended to use a separate directory for separation of concerns. Here is the directory structure of the generated artifacts from [the example client in the getting started section](#using-smithy-typescript-with-the-smithy-cli). ``` build/smithy/source/typescript-client-codegen/ ├── package.json ├── src │ ├── Weather.ts │ ├── WeatherClient.ts │ ├── commands │ ├── extensionConfiguration.ts │ ├── index.ts │ ├── models │ ├── pagination │ ├── runtimeConfig.browser.ts │ ├── runtimeConfig.native.ts │ ├── runtimeConfig.shared.ts │ ├── runtimeConfig.ts │ └── runtimeExtensions.ts ├── tsconfig.cjs.json ├── tsconfig.es.json ├── tsconfig.json ├── tsconfig.types.json └── typedoc.json ``` #### Code generation implementations not included Smithy TypeScript provides default code generation implementations for generating TypeScript clients, but also requires customers to either implement or consume certain implementations where there is no default. For Smithy TypeScript clients, the main implementations not provided are [protocol generators](#protocol-generator-implementations) and [handling endpoint resolution](#handling-endpoint-resolution) (see [the TypeScript code generation section](#typescript-code-generation)). > If there are items missing from this section, feel free to [create an issue](https://github.com/smithy-lang/smithy-typescript/issues/new). ##### Protocol generator implementations Protocols define how operation inputs and outputs are serialized and deserialized on the wire. This behavior can be defined in Smithy through [protocol traits](https://smithy.io/2.0/spec/protocol-traits.html) with corresponding implementations of [the `ProtocolGenerator` interface](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/ProtocolGenerator.java) in Smithy TypeScript. Besides the `ProtocolGenerator` interface, Smithy TypeScript has additional abstract classes that partially implement the `ProtocolGenerator` interface and can be extended: [`HttpBindingProtocolGenerator` for HTTP binding protocols](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java) and [`HttpRpcProtocolGenerator` for HTTP RPC protocols](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpRpcProtocolGenerator.java). Once a `ProtocolGenerator` is implemented, the implementation can be registered through a `TypeScriptIntegration`: - `TypeScriptIntegration` with `ProtocolGenerator` implementation: ```java // src/main/java/typescript/example/client/gradle/ExampleClientProtocolGeneratorIntegration.java package typescript.example.client.gradle; // ... public class ExampleClientProtocolGeneratorIntegration implements TypeScriptIntegration { // ProtocolGenerator implementation is inline for brevity, but should be in its // own file private static class ExampleClientProtocolGenerator implements ProtocolGenerator { // Protocol generator for a @example.client#protocol protocol trait @Override public ShapeId getProtocol() { return ShapeId.from("example.client#protocol"); } // Implement ProtocolGenerator methods ... } @Override public List getProtocolGenerators() { return List.of(new ExampleClientProtocolGenerator()); } } ``` - Registering the `TypeScriptIntegration`: ```java // src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration typescript.example.client.gradle.ExampleClientProtocolGeneratorIntegration ``` See [the section on customizations via `TypeScriptIntegration` for more details](#customizations-via-typescriptintegration). > Note: [AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3), a customer of Smithy TypeScript, implements the [AWS protocols](https://smithy.io/2.0/aws/protocols/index.html) and can be consumed by adding the `software.amazon.smithy.typescript:smithy-aws-typescript-codegen` package. ##### Handling endpoint resolution Endpoint resolution is not implemented by default due to the inherent complexity. By default, if no endpoint resolution is provided, customers will not be able to pass in an endpoint to the client (TypeScript will fail to compile). Smithy TypeScript has the `CustomEndpoints` configuration which can be used to add the `endpoint` property to the client configuration, and the `TypeScriptIntegration::getRuntimeConfigWriters()` method can be used to provide a default endpoint: - `TypeScriptIntegration` implementation: ```java // src/main/java/typescript/example/client/gradle/ExampleClientEndpointResolutionIntegration.java package typescript.example.client.gradle; // ... public class ExampleClientEndpointResolutionIntegration implements TypeScriptIntegration { @Override public List getClientPlugins() { return List.of( RuntimeClientPlugin.builder() .withConventions( TypeScriptDependency.CONFIG_RESOLVER.dependency, "CustomEndpoints", Convention.HAS_CONFIG) .build()); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { // Runtime config value also be specified per platform by using the `target` // argument, e.g. // if (target.equals(LanguageTarget.NODE)) { ... } if (target.equals(LanguageTarget.SHARED)) { // This example provides an arbitrary endpoint on the shared runtime config return Map.of("endpoint", w -> w.write("$S", "https://www.example.com")); } // No need to redefine endpoint for other targets since it's inherited from the // shared target return Collections.emptyMap(); } } ``` - Registering the `TypeScriptIntegration`: ```java // src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration typescript.example.client.gradle.ExampleClientEndpointResolutionIntegration ``` Customers can then pass in an endpoint to the client configuration: ```typescript import { $SERVICEClient } from "..."; // example client package // Without providing the endpoint, a "No valid endpoint provider available." error will be thrown const individualClient = new $SERVICEClient({ // string endpoint: "https://www.example.com", }); ``` See [the section on customizations via `TypeScriptIntegration` for more details](#customizations-via-typescriptintegration). #### Publishing a Client SDK package > Note: There is no prescribed way to publish NPM packages since there are many ways to maintain SDKs. Some publishing tools include using [`npm publish`](https://docs.npmjs.com/cli/v8/commands/npm-publish) or [`yarn publish`](https://classic.yarnpkg.com/lang/en/docs/cli/publish/) directly, or managing a monorepo with tools like [`turbo`](https://turbo.build/repo/docs/handbook/publishing-packages). This section provides tips for how a general publishing workflow could work. A generated client is a package that is ready to be published. After running `smithy build`, the generated client artifacts will be in the build directory under the projection and plugin name. For example, generated client artifacts for the source projection using the `typescript-client-codegen` plugin in a Smithy CLI project would be in the `build/smithy/source/typescript-client-codegen/` directory. A common practice is to copy the generated client artifacts into a source control repository. After the artifacts are staged, any modifications that are needed prior to publishing the generated client artifacts specific to the SDK should be run, e.g. adding a `README.md`, editing changelog entries. Finally, with a chosen publishing tool for the SDK, publish the artifacts after running the `prepack` script per client package. ### Server SDK code generation: `typescript-server-codegen` plugin For documentation of `typescript-server-codegen` artifacts and implementation, see [the Smithy TypeScript Server SDK walkthrough](https://smithy.io/2.0/languages/typescript/ts-ssdk/index.html) and [Developer Preview announcement blog post](https://aws.amazon.com/blogs/devops/smithy-server-and-client-generator-for-typescript). #### `typescript-server-codegen` plugin configuration > Note: Although plugin configuration is maintained with backward compatibility in mind, breaking changes may still occur. [`TypeScriptSettings`](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptSettings.java) contains all of the settings enabled from `smithy-build.json` and helper methods and types. The up-to-date list of top-level properties enabled for `typescript-server-codegen` can be found in `TypeScriptSettings.ArtifactType.SSDK`. | Setting | Required | Description | | -------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `package` | Yes | Name of the package in `package.json`. | | `packageVersion` | Yes | Version of the package in `package.json`. | | `packageDescription` | No | Description of the package in `package.json`. The default value is `${package} server`. | | `packageJson` | No | Custom `package.json`properties that will be merged with the base `package.json`. The default value is an empty object. | | `packageManager` | No | Configured package manager for the package. The default value is `yarn`. | | `service` | No | The Shape ID of the service to generate a client for. If not provided, the code generator will attempt to infer the service Shape ID. If there is exactly 1 service found in the model, then the service is used as the inferred Shape ID. If no services are found, then code generation fails. If more than 1 service is found, then code generation fails. | | `protocol` | No | The Shape ID of the protocol used to generate serialization and deserialization. If not provided, the code generator will attempt to resolve the highest priority service protocol supported in code generation (registered through `TypeScriptIntegration`). If no protocols are found, code generation will use serialization and deserialization error stubs. | | `private` | No | Whether the package is `private` in `package.json`. The default value is `false`. | | `requiredMemberMode` | No | **NOT RECOMMENDED DUE TO BACKWARD COMPATIBILITY CONCERNS.** Sets whether members marked with the `@required` trait are allowed to be `undefined`. See more details on the risks in `TypeScriptSettings.RequiredMemberMode`. The default value is `nullable`. | | `createDefaultReadme` | No | Whether to generate a default `README.md` for the package. The default value is `false`. | | `disableDefaultValidation` | No | Whether or not default validation is disabled. See [the documentation for Smithy TypeScript SSDK validation](https://smithy.io/2.0/languages/typescript/ts-ssdk/validation.html) to learn more. The default value is `false`. | ### Adding customizations to Smithy TypeScript #### Using third-party packages Third-party packages may provide implementations and integrations for code generation, and can be consumed like any other Java dependency. For example, [AWS SDK for JavaScript v3](https://github.com/aws/aws-sdk-js-v3) implements AWS customizations, protocols, and other utilities used for code generating the SDK, and can be consumed by importing the `software.amazon.smithy.typescript:smithy-aws-typescript-codegen` package. In an idiomatic Smithy CLI project, the dependency can be added similar to how the core `smithy-typescript-codegen` dependency is added in [the section using Smithy TypeScript with the Smithy CLI](#using-smithy-typescript-with-the-smithy-cli). In a Gradle project, the dependency can be added similar to how the core `smithy-typescript-codegen` dependency is added in [the section using Smithy TypeScript with Gradle](#using-smithy-typescript-with-gradle). If a third-party package does not publish artifacts to an external code repository (e.g. Maven), the code may need to be built from source and published to the build environment's Maven Local Repository, typically through a command similar to `./gradlew publishToMavenLocal`. > Note: Currently there is no utility to remove or disable integrations that are loaded. If a third-party package's integration has behavior that is not expected (e.g. customizing without reacting to the model, settings, or feature flags), it may be an sign that the underlying implementation does not follow best practices. #### Customizations via `TypeScriptIntegration` Smithy TypeScript code generation can be customized by implementing [the `TypeScriptIntegration` interface](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/TypeScriptIntegration.java), which also extends [the `SmithyIntegration` interface](https://github.com/smithy-lang/smithy/blob/main/smithy-codegen-core/src/main/java/software/amazon/smithy/codegen/core/SmithyIntegration.java). These integrations are typically implemented and packaged in Java Gradle projects that depend on `smithy-typescript-codegen` (for the `TypeScriptIntegration` interface) and built as consumable Java libraries. Each `TypeScriptIntegration` implementation consists of two paired changes: - An implementation of `TypeScriptIntegration`, and ```java // src/main/java/example/smithy/typescript/integration/ExampleSmithyTypeScriptIntegration.java package example.smithy.typescript.integration; // Import the TypeScriptIntegration interface import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; public final class ExampleSmithyTypeScriptIntegration implements TypeScriptIntegration { // Implement TypeScriptIntegration or SmithyIntegration methods, e.g. SmithyIntegration::customize } ``` - A corresponding entry in the service loader for `TypeScriptIntegration` ```java // src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration // Note that entry is the canonical name of the implemented TypeScriptIntegration // To add more integrations, add an entry per line example.smithy.typescript.integration.ExampleSmithyTypeScriptIntegration ``` Once the Java libary is built, the library can be [consumed as a third-party package](#using-third-party-packages), and the integrations will automatically be loaded via [Java SPI](https://docs.oracle.com/javase/tutorial/ext/basics/spi.html). The easiest way to see how the individual methods on `TypeScriptIntegration` (and by extension `SmithyIntegration`) are used in the code generation process is by searching by usage at a given Smithy TypeScript version, as method usages are subject to change. > Note: if an existing integration point does not exist on `TypeScriptIntegration` or `SmithyIntegration`, check if [the `RuntimeClientPlugin` abstraction](smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/RuntimeClientPlugin.java) has an integration point. If not, [create a feature request](https://github.com/smithy-lang/smithy-typescript/issues/new) with the incompatible use case. > Note: Although the `TypeScriptIntegration` interface is maintained with backward compatibility in mind, the interface may be subject to breaking changes as it is annotated with `@SmithyUnstableApi`. Methods may also have additional individual annotations that should be noted (e.g. `@SmithyInternalApi`). An example of a Java Gradle project that provides customizations can be found in [`smithy-typescript-codegen-test/example-weather-customizations`](smithy-typescript-codegen-test/example-weather-customizations). #### TypeScript client configuration During code generation, code generators should provide a default value for each client's input configuration property through a client's runtime configuration. If there are use cases in which configuration may need a specific set of values (e.g. specific features like using HTTP/2), writing a `RuntimeExtension` that has those specific configuration property values may make sense. For example, a team that publishes a client for the `Weather` service in a package named `@example/weather` may write and publish a `RuntimeExtension` that provides the configuration values needed to use HTTP/2 with the service: ```typescript // Http2HandlerRuntimeExtension.ts published in package @example/weather-http-2-runtime-extension import { RuntimeExtension, WeatherExtensionConfiguration } from "@example/weather"; import { NodeHttp2Handler } from "@smithy/node-http-handler"; export class Http2HandlerRuntimeExtension implements RuntimeExtension { configure(extensionConfiguration: WeatherExtensionConfiguration): void { console.log("Enabling HTTP/2"); extensionConfiguration.setHttpHandler(new NodeHttp2Handler()); } } ``` Then customers can opt-in to using the extension at runtime using the `extensions` configuration property: ```typescript import { WeatherClient } from "@example/weather"; import { Http2HandlerRuntimeExtension } from "@example/weather-http-2-runtime-extension"; const client = new WeatherClient({ extensions: [new Http2HandlerRuntimeExtension()], }); ``` For more documentation, see [the `typescript-client-codegen` section](#client-sdk-code-generation-typescript-client-codegen-plugin). ## Local Development This repository is in developer preview, so local changes may be needed to both build and test the code generators. See [the contributing guide](CONTRIBUTING.md) for more details. ### Using local code generation changes Smithy TypeScript code generators depend on Smithy and the Smithy Gradle Plugin, and will by default use the version specified in `gradle.properties`. Any changes to dependencies require recursively republishing dependent packages. ```text Dependents of Smithy TypeScript └──Smithy TypeScript ├── Smithy └── Smithy Gradle Plugin ``` For simplicity, only Smithy and Smithy TypeScript instructions are documented. > Note: the Smithy Gradle Plugin is under heavy development, so it may be difficult to test different versions. #### Smithy If using local [Smithy](https://github.com/smithy-lang/smithy) changes, build `software.amazon.smithy.*` packages and publish the packages to a Maven Local Repository: ```shell git clone https://github.com/smithy-lang/smithy.git cd smithy # Make intended changes, e.g. checking out a certain commit ./gradlew publishToMavenLocal ``` Then, update the `gradle.properties` property `smithyVersion` in the Smithy TypeScript repository locally to the artifacts' version if different than the current `smithyVersion`. #### Smithy TypeScript If using local Smithy TypeScript changes, build the `software.amazon.smithy.typescript.*` packages and publish them to a Maven Local Repository: ```shell git clone https://github.com/smithy-lang/smithy-typescript.git cd smithy-typescript # Make intended changes, e.g. bumping the codegen artifact version ./gradlew publishToMavenLocal ``` Then, update the dependent package code to depend on the published version if different than the current version. ### TypeScript packages changes All TypeScript packages are included in a [Yarn](https://yarnpkg.com/) workspace at the root of the repository: - Smithy Client SDK packages are in the `packages/` directory, and - Smithy Server SDK packages are in the `smithy-typescript-ssdk-libs/` directory. At the root of the repository, scripts defined in the root `package.json` are managed by [Turbo](https://turbo.build/). Commonly used commands during development include: - `yarn build`: build all of the packages in the repository - `yarn test`: run the unit tests of all of the packages in the repository - `yarn test:integration`: build test clients in `smithy-typescript-codegen-test` via the `build-generated-test-packages.js` script, and then run the integration tests of all of the packages in the repository Each individual package will have at least the `build` script, and may have the `test` and `test:integration` scripts. For Smithy Client SDK packages, changelogs and versioning are managed by [`changesets`](https://github.com/changesets/changesets). When making changes to these package, a changeset file will need to be added via `yarn changeset add` with an appropriate changelog message and version bump. See [the contribution guide](CONTRIBUTING.md#contributing-via-pull-requests) for more details. ### Testing For both code generation and TypeScript package changes, unit tests and integration tests needs to pass. - To run tests for TypeScript packages, run the following at the root level: `yarn test`. - To run tests for code generation, run the following at the root level: `./gradlew clean build check`. - To run integration tests that test both code generation and TypeScript packages using the test clients in `smithy-typescript-codegen-test`, run the following at the root level: `yarn test:integration`. All of these checks will also run in GitHub actions when submitting a pull request or merging to `main`. #### Updating `smithy-typescript-codegen-test` models The `smithy-typescript-codegen-test` contains test models that test whether TypeScript packages compile correctly and code generated. These models can be edited to test additional traits, integrations, and settings, but new projections and smithy models can also be added to test changes in isolation. To use a generated artifact in an integration test, update the `build-generated-test-packages.js` file to build and copy the generated artifacts to `node_modules/`. Then, import the package like any other dependency in `*.integ.spec.ts` test files. ### Troubleshooting Many Gradle issues can be fixed by stopping the Gradle daemon by running `./gradlew --stop`. ## License This library is licensed under the Apache 2.0 License. ================================================ FILE: api-extractor.json ================================================ { "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", "mainEntryPointFilePath": "/lib/index.d.ts", "compiler": {}, "apiReport": { "enabled": true, "reportFolder": "./api-extractor/", "reportTempFolder": "./api-extractor/", "includeForgottenExports": true }, "docModel": { "enabled": true, "apiJsonFilePath": "./api-extractor/.api.json" }, "dtsRollup": { "enabled": false, "untrimmedFilePath": "./dist/.d.ts" }, "tsdocMetadata": {}, "messages": { "compilerMessageReporting": { "default": { "logLevel": "warning" } }, "extractorMessageReporting": { "default": { "logLevel": "warning" } }, "tsdocMessageReporting": { "default": { "logLevel": "warning" } }, "extractorMessageReporting": { "ae-wrong-input-file-type": { "logLevel": "none" } } } } ================================================ FILE: api-extractor.packages.json ================================================ { "extends": "./api-extractor.json", "docModel": { "apiJsonFilePath": "./api-extractor-packages/.api.json" }, "apiReport": { "reportFolder": "./api-extractor-packages/", "reportTempFolder": "./api-extractor-packages/" } } ================================================ FILE: api-snapshot/api.json ================================================ { "@smithy/abort-controller": { "AbortController": "function", "AbortHandler": "type(interface)", "AbortSignal": "function", "IAbortController": "type(interface)", "IAbortSignal": "type(interface)" }, "@smithy/chunked-blob-reader": { "blobReader": "function" }, "@smithy/chunked-blob-reader-native": { "blobReader": "function" }, "@smithy/config-resolver": { "CONFIG_USE_DUALSTACK_ENDPOINT": "string", "CONFIG_USE_FIPS_ENDPOINT": "string", "CustomEndpointsInputConfig": "type(interface)", "CustomEndpointsResolvedConfig": "type(interface)", "DEFAULT_USE_DUALSTACK_ENDPOINT": "boolean", "DEFAULT_USE_FIPS_ENDPOINT": "boolean", "EndpointsInputConfig": "type(interface)", "EndpointsResolvedConfig": "type(interface)", "EndpointVariant": "type(object)", "EndpointVariantTag": "type(union)", "ENV_USE_DUALSTACK_ENDPOINT": "string", "ENV_USE_FIPS_ENDPOINT": "string", "getRegionInfo": "function", "GetRegionInfoOptions": "type(interface)", "NODE_REGION_CONFIG_FILE_OPTIONS": "object", "NODE_REGION_CONFIG_OPTIONS": "object", "NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS": "object", "NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS": "object", "nodeDualstackConfigSelectors": "object", "nodeFipsConfigSelectors": "object", "PartitionHash": "type(object)", "REGION_ENV_NAME": "string", "REGION_INI_NAME": "string", "RegionHash": "type(object)", "RegionInputConfig": "type(interface)", "RegionResolvedConfig": "type(interface)", "resolveCustomEndpointsConfig": "function", "resolveEndpointsConfig": "function", "resolveRegionConfig": "function" }, "@smithy/core": { "createIsIdentityExpiredFunction": "function", "createPaginator": "function", "DefaultIdentityProviderConfig": "function", "doesIdentityRequireRefresh": "function", "EXPIRATION_MS": "number", "getHttpAuthSchemeEndpointRuleSetPlugin": "function", "getHttpAuthSchemePlugin": "function", "getHttpSigningPlugin": "function", "getSmithyContext": "function", "HttpApiKeyAuthSigner": "function", "httpAuthSchemeEndpointRuleSetMiddlewareOptions": "object", "httpAuthSchemeMiddleware": "function", "httpAuthSchemeMiddlewareOptions": "object", "HttpBearerAuthSigner": "function", "httpSigningMiddleware": "function", "httpSigningMiddlewareOptions": "object", "isIdentityExpired": "function", "MemoizedIdentityProvider": "type(interface)", "memoizeIdentityProvider": "function", "NoAuthSigner": "function", "normalizeProvider": "function", "PreviouslyResolved": "type(interface)", "requestBuilder": "function", "setFeature": "function" }, "@smithy/core/cbor": { "buildHttpRpcRequest": "function", "cbor": "object", "CborCodec": "function", "CborShapeDeserializer": "function", "CborShapeSerializer": "function", "checkCborResponse": "function", "dateToTag": "function", "loadSmithyRpcV2CborErrorCode": "function", "parseCborBody": "function", "parseCborErrorBody": "function", "SmithyRpcV2CborProtocol": "function", "tag": "function", "tagSymbol": "symbol" }, "@smithy/core/checksum": { "blobHasher": "function", "blobReader": "function", "fileStreamHasher": "function(node-only)", "Md5": "function", "readableStreamHasher": "function(node-only)" }, "@smithy/core/client": { "_json": "function", "AlgorithmId": "object", "checkExceptions": "function", "ChecksumAlgorithm": "type(interface)", "ChecksumConfiguration": "type(interface)", "Client": "function", "Command": "function", "CommandImpl": "type(interface)", "ConditionalLazyValueInstruction": "type(object)", "ConditionalValueInstruction": "type(object)", "constructStack": "function", "convertMap": "function", "createAggregatedClient": "function", "createWaiter": "function", "decorateServiceException": "function", "DefaultExtensionRuntimeConfigType": "type(intersection)", "DefaultsMode": "type(union)", "DefaultsModeConfigs": "type(interface)", "emitWarningIfUnsupportedVersion": "function", "ExceptionOptionType": "type(object)", "FilterStatus": "type(alias)", "FilterStatusSupplier": "type(object)", "getArrayIfSingleItem": "function", "getChecksumConfiguration": "function", "getDefaultClientConfiguration": "function", "getDefaultExtensionConfiguration": "function", "getRetryConfiguration": "function", "getSmithyContext": "function", "getValueFromTextNode": "function", "invalidFunction": "function", "invalidProvider": "function", "isSerializableHeaderValue": "function", "LazyValueInstruction": "type(object)", "loadConfigsForDefaultMode": "function", "map": "function", "NoOpLogger": "function", "normalizeProvider": "function", "ObjectMappingInstruction": "type(alias)", "ObjectMappingInstructions": "type(object)", "PartialChecksumRuntimeConfigType": "type(object)", "PartialRetryRuntimeConfigType": "type(object)", "resolveChecksumRuntimeConfig": "function", "ResolvedDefaultsMode": "type(union)", "resolveDefaultRuntimeConfig": "function", "resolveRetryRuntimeConfig": "function", "schemaLogFilter": "function", "SENSITIVE_STRING": "string", "serializeDateTime": "function", "serializeFloat": "function", "ServiceException": "function", "ServiceExceptionOptions": "type(interface)", "SimpleValueInstruction": "type(object)", "SmithyConfiguration": "type(interface)", "SmithyResolvedConfiguration": "type(object)", "SourceMappingInstruction": "type(object)", "SourceMappingInstructions": "type(object)", "take": "function", "throwDefaultError": "function", "UnfilteredValue": "type(alias)", "Value": "type(alias)", "ValueFilteringFunction": "type(object)", "ValueMapper": "type(object)", "ValueSupplier": "type(object)", "WaiterConfiguration": "type(interface)", "WaiterOptions": "type(intersection)", "WaiterResult": "type(object)", "waiterServiceDefaults": "object", "WaiterState": "object", "withBaseException": "function" }, "@smithy/core/config": { "booleanSelector": "function", "chain": "function", "CONFIG_PREFIX_SEPARATOR": "string(node-only)", "CONFIG_USE_DUALSTACK_ENDPOINT": "string(node-only)", "CONFIG_USE_FIPS_ENDPOINT": "string(node-only)", "CredentialsProviderError": "function", "CustomEndpointsInputConfig": "type(interface)", "CustomEndpointsResolvedConfig": "type(interface)", "DEFAULT_PROFILE": "string", "DEFAULT_USE_DUALSTACK_ENDPOINT": "boolean", "DEFAULT_USE_FIPS_ENDPOINT": "boolean", "EndpointsInputConfig": "type(interface)", "EndpointsResolvedConfig": "type(interface)", "EndpointVariant": "type(object)", "EndpointVariantTag": "type(union)", "ENV_PROFILE": "string(node-only)", "ENV_USE_DUALSTACK_ENDPOINT": "string(node-only)", "ENV_USE_FIPS_ENDPOINT": "string(node-only)", "EnvOptions": "type(interface)", "externalDataInterceptor": "object(node-only)", "fromStatic": "function(node-only)", "fromValue": "function", "getHomeDir": "function(node-only)", "getProfileName": "function(node-only)", "getRegionInfo": "function", "GetRegionInfoOptions": "type(interface)", "getSSOTokenFilepath": "function(node-only)", "getSSOTokenFromFile": "function(node-only)", "GetterFromConfig": "type(object)", "GetterFromEnv": "type(object)", "loadConfig": "function(node-only)", "LoadedConfigSelectors": "type(interface)", "loadSharedConfigFiles": "function(node-only)", "loadSsoSessionData": "function(node-only)", "LocalConfigOptions": "type(intersection)", "memoize": "function", "NODE_REGION_CONFIG_FILE_OPTIONS": "object(node-only)", "NODE_REGION_CONFIG_OPTIONS": "object(node-only)", "NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS": "object(node-only)", "NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS": "object(node-only)", "nodeDualstackConfigSelectors": "object(node-only)", "nodeFipsConfigSelectors": "object(node-only)", "NodeSharedConfigInit": "type(interface)", "numberSelector": "function", "ParsedIniData": "type(object)", "parseKnownFiles": "function(node-only)", "PartitionHash": "type(object)", "Profile": "type(object)", "ProviderError": "function", "ProviderErrorOptionsType": "type(object)", "readFile": "function(node-only)", "ReadFileOptions": "type(interface)", "REGION_ENV_NAME": "string(node-only)", "REGION_INI_NAME": "string(node-only)", "RegionHash": "type(object)", "RegionInputConfig": "type(interface)", "RegionResolvedConfig": "type(interface)", "resolveCustomEndpointsConfig": "function", "resolveDefaultsModeConfig": "function", "ResolveDefaultsModeConfigOptions": "type(interface)", "resolveEndpointsConfig": "function", "resolveRegionConfig": "function", "SelectorType": "object", "SharedConfigFiles": "type(object)", "SharedConfigInit": "type(interface)", "SourceProfileInit": "type(interface)", "SsoSessionInit": "type(interface)", "SSOToken": "type(interface)", "TokenProviderError": "function" }, "@smithy/core/endpoints": { "BinaryDecisionDiagram": "function", "BuiltInParamInstruction": "type(interface)", "ClientContextParamInstruction": "type(interface)", "ConditionObject": "type(intersection)", "ContextParamInstruction": "type(interface)", "customEndpointFunctions": "object", "decideEndpoint": "function", "DeprecatedObject": "type(object)", "EndpointCache": "function", "EndpointError": "function", "EndpointFunctions": "type(object)", "EndpointInputConfig": "type(interface)", "endpointMiddleware": "function", "endpointMiddlewareOptions": "object", "EndpointObject": "type(object)", "EndpointObjectHeaders": "type(object)", "EndpointObjectProperties": "type(object)", "EndpointParameterInstructions": "type(interface)", "EndpointParameterInstructionsSupplier": "type(object)", "EndpointParams": "type(object)", "EndpointRequiredInputConfig": "type(interface)", "EndpointRequiredResolvedConfig": "type(interface)", "EndpointResolvedConfig": "type(interface)", "EndpointResolverOptions": "type(object)", "EndpointRuleObject": "type(object)", "ErrorRuleObject": "type(object)", "EvaluateOptions": "type(intersection)", "Expression": "type(union)", "FunctionArgv": "type(object)", "FunctionObject": "type(object)", "FunctionReturn": "type(union)", "getEndpointFromInstructions": "function", "getEndpointPlugin": "function", "isIpAddress": "function", "isValidHostLabel": "function", "middlewareEndpointToEndpointV1": "function", "OperationContextParamInstruction": "type(interface)", "ParameterObject": "type(object)", "ReferenceObject": "type(object)", "ReferenceRecord": "type(object)", "resolveEndpoint": "function", "resolveEndpointConfig": "function", "resolveEndpointRequiredConfig": "function", "resolveParams": "function", "RuleSetObject": "type(object)", "RuleSetRules": "type(object)", "StaticContextParamInstruction": "type(interface)", "toEndpointV1": "function", "TreeRuleObject": "type(object)" }, "@smithy/core/event-streams": { "BinaryHeaderValue": "type(object)", "BooleanHeaderValue": "type(object)", "ByteHeaderValue": "type(object)", "EventStreamCodec": "function", "EventStreamMarshaller": "function", "EventStreamMarshallerOptions": "type(interface)", "EventStreamSerde": "function", "EventStreamSerdeInputConfig": "type(interface)", "eventStreamSerdeProvider": "function", "EventStreamSerdeResolvedConfig": "type(interface)", "getChunkedStream": "function", "getMessageUnmarshaller": "function", "getUnmarshalledStream": "function", "HeaderMarshaller": "function", "Int64": "function", "IntegerHeaderValue": "type(object)", "iterableToReadableStream": "function", "LongHeaderValue": "type(object)", "Message": "type(interface)", "MessageDecoderStream": "function", "MessageDecoderStreamOptions": "type(interface)", "MessageEncoderStream": "function", "MessageEncoderStreamOptions": "type(interface)", "MessageHeaders": "type(object)", "MessageHeaderValue": "type(union)", "readableStreamToIterable": "function", "resolveEventStreamSerdeConfig": "function", "ShortHeaderValue": "type(object)", "SmithyMessageDecoderStream": "function", "SmithyMessageDecoderStreamOptions": "type(interface)", "SmithyMessageEncoderStream": "function", "SmithyMessageEncoderStreamOptions": "type(interface)", "StringHeaderValue": "type(object)", "TimestampHeaderValue": "type(object)", "UniversalEventStreamMarshaller": "function", "UniversalEventStreamMarshallerOptions": "type(interface)", "universalEventStreamSerdeProvider": "function", "UnmarshalledStreamOptions": "type(object)", "UuidHeaderValue": "type(object)" }, "@smithy/core/protocols": { "buildQueryString": "function", "collectBody": "function", "contentLengthMiddleware": "function", "contentLengthMiddlewareOptions": "object", "determineTimestampFormat": "function", "escapeUri": "function", "escapeUriPath": "function", "extendedEncodeURIComponent": "function", "Field": "function", "FieldOptions": "type(object)", "FieldPosition": "type(union)", "Fields": "function", "FieldsOptions": "type(object)", "FromStringShapeDeserializer": "function", "getContentLengthPlugin": "function", "getHttpHandlerExtensionConfiguration": "function", "HeaderBag": "type(object)", "HttpBindingProtocol": "function", "HttpHandler": "type(intersection)", "HttpHandlerExtensionConfigType": "type(object)", "HttpHandlerExtensionConfiguration": "type(interface)", "HttpHandlerOptions": "type(object)", "HttpHandlerUserInput": "type(union)", "HttpInterceptingShapeDeserializer": "function", "HttpInterceptingShapeSerializer": "function", "HttpMessage": "type(object)", "HttpProtocol": "function", "HttpRequest": "function", "HttpResponse": "function", "IHttpRequest": "type(interface)", "isValidHostname": "function", "parseQueryString": "function", "parseUrl": "function", "requestBuilder": "function", "RequestBuilder": "function", "resolvedPath": "function", "resolveHttpHandlerRuntimeConfig": "function", "RpcProtocol": "function", "SerdeContext": "function", "ToStringShapeSerializer": "function" }, "@smithy/core/retry": { "AdaptiveRetryStrategy": "function", "AdaptiveRetryStrategyOptions": "type(interface)", "CONFIG_MAX_ATTEMPTS": "string(node-only)", "CONFIG_RETRY_MODE": "string(node-only)", "ConfiguredRetryStrategy": "function", "DEFAULT_MAX_ATTEMPTS": "number", "DEFAULT_RETRY_DELAY_BASE": "number", "DEFAULT_RETRY_MODE": "string", "defaultDelayDecider": "function", "DefaultRateLimiter": "function", "DefaultRateLimiterOptions": "type(interface)", "defaultRetryDecider": "function", "DeprecatedAdaptiveRetryStrategy": "function", "DeprecatedAdaptiveRetryStrategyOptions": "type(interface)", "DeprecatedStandardRetryStrategy": "function", "DeprecatedStandardRetryStrategyOptions": "type(interface)", "ENV_MAX_ATTEMPTS": "string(node-only)", "ENV_RETRY_MODE": "string(node-only)", "getOmitRetryHeadersPlugin": "function", "getRetryAfterHint": "function", "getRetryPlugin": "function", "INITIAL_RETRY_TOKENS": "number", "INVOCATION_ID_HEADER": "string", "isBrowserNetworkError": "function", "isClockSkewCorrectedError": "function", "isClockSkewError": "function", "isNodeJsHttp2TransientError": "function", "isRetryableByTrait": "function", "isServerError": "function", "isThrottlingError": "function", "isTransientError": "function", "MAXIMUM_RETRY_DELAY": "number", "NO_RETRY_INCREMENT": "number", "NODE_MAX_ATTEMPT_CONFIG_OPTIONS": "object(node-only)", "NODE_RETRY_MODE_CONFIG_OPTIONS": "object(node-only)", "omitRetryHeadersMiddleware": "function", "omitRetryHeadersMiddlewareOptions": "object", "PreviouslyResolved": "type(interface)", "RateLimiter": "type(interface)", "REQUEST_HEADER": "string", "resolveRetryConfig": "function", "Retry": "function", "RETRY_COST": "number", "RETRY_MODES": "object", "RetryInputConfig": "type(interface)", "retryMiddleware": "function", "retryMiddlewareOptions": "object", "RetryResolvedConfig": "type(interface)", "StandardRetryStrategy": "function", "StandardRetryStrategyOptions": "type(object)", "THROTTLING_RETRY_DELAY_BASE": "number", "TIMEOUT_RETRY_COST": "number" }, "@smithy/core/schema": { "deref": "function", "deserializerMiddlewareOption": "object", "error": "function", "ErrorSchema": "function", "getSchemaSerdePlugin": "function", "isStaticSchema": "function", "list": "function", "ListSchema": "function", "map": "function", "MapSchema": "function", "NormalizedSchema": "function", "op": "function", "operation": "function", "OperationSchema": "function", "Schema": "function", "SCHEMA": "object", "serializerMiddlewareOption": "object", "sim": "function", "simAdapter": "function", "SimpleSchema": "function", "simpleSchemaCacheN": "object", "simpleSchemaCacheS": "object", "struct": "function", "StructureSchema": "function", "traitsCache": "object", "translateTraits": "function", "TypeRegistry": "function" }, "@smithy/core/serde": { "_parseEpochTimestamp": "function", "_parseRfc3339DateTimeWithOffset": "function", "_parseRfc7231DateTime": "function", "AutomaticJsonStringConversion": "type(alias)", "calculateBodyLength": "function", "ChecksumStream": "function", "ChecksumStreamInit": "type(interface)", "copyDocumentWithTransform": "function", "createBufferedReadable": "function", "createChecksumStream": "function", "dateToUtcString": "function", "deserializerMiddleware": "function", "deserializerMiddlewareOption": "object", "expectBoolean": "function", "expectByte": "function", "expectFloat32": "function", "expectInt": "function", "expectInt32": "function", "expectLong": "function", "expectNonNull": "function", "expectNumber": "function", "expectObject": "function", "expectShort": "function", "expectString": "function", "expectUnion": "function", "fromArrayBuffer": "function(node-only)", "fromBase64": "function", "fromHex": "function", "fromString": "function(node-only)", "fromUtf8": "function", "generateIdempotencyToken": "function", "getAwsChunkedEncodingStream": "function", "getSerdePlugin": "function", "handleFloat": "function", "Hash": "function(node-only)", "headStream": "function", "isArrayBuffer": "function", "isBlob": "function", "isReadableStream": "function", "LazyJsonString": "function", "limitedParseDouble": "function", "limitedParseFloat": "function", "limitedParseFloat32": "function", "logger": "object", "NumericType": "type(alias)", "NumericValue": "function", "nv": "function", "parseBoolean": "function", "parseEpochTimestamp": "function", "parseRfc3339DateTime": "function", "parseRfc3339DateTimeWithOffset": "function", "parseRfc7231DateTime": "function", "quoteHeader": "function", "sdkStreamMixin": "function", "serializerMiddleware": "function", "serializerMiddlewareOption": "object", "splitEvery": "function", "splitHeader": "function", "splitStream": "function", "strictParseByte": "function", "strictParseDouble": "function", "strictParseFloat": "function", "strictParseFloat32": "function", "strictParseInt": "function", "strictParseInt32": "function", "strictParseLong": "function", "strictParseShort": "function", "StringEncoding": "type(union)", "toBase64": "function", "toHex": "function", "toUint8Array": "function", "toUtf8": "function", "Uint8ArrayBlobAdapter": "function", "V1OrV2Endpoint": "type(object)", "v4": "function" }, "@smithy/credential-provider-imds": { "DEFAULT_MAX_RETRIES": "number", "DEFAULT_TIMEOUT": "number", "Endpoint": "object", "ENV_CMDS_AUTH_TOKEN": "string", "ENV_CMDS_FULL_URI": "string", "ENV_CMDS_RELATIVE_URI": "string", "fromContainerMetadata": "function", "fromInstanceMetadata": "function", "getInstanceMetadataEndpoint": "function", "httpRequest": "function", "InstanceMetadataCredentials": "type(interface)", "providerConfigFromInit": "function", "RemoteProviderConfig": "type(interface)", "RemoteProviderInit": "type(interface)" }, "@smithy/eventstream-codec": { "BinaryHeaderValue": "type(object)", "BooleanHeaderValue": "type(object)", "ByteHeaderValue": "type(object)", "EventStreamCodec": "function", "HeaderMarshaller": "function", "Int64": "function", "IntegerHeaderValue": "type(object)", "LongHeaderValue": "type(object)", "Message": "type(interface)", "MessageDecoderStream": "function", "MessageDecoderStreamOptions": "type(interface)", "MessageEncoderStream": "function", "MessageEncoderStreamOptions": "type(interface)", "MessageHeaders": "type(object)", "MessageHeaderValue": "type(union)", "ShortHeaderValue": "type(object)", "SmithyMessageDecoderStream": "function", "SmithyMessageDecoderStreamOptions": "type(interface)", "SmithyMessageEncoderStream": "function", "SmithyMessageEncoderStreamOptions": "type(interface)", "StringHeaderValue": "type(object)", "TimestampHeaderValue": "type(object)", "UuidHeaderValue": "type(object)" }, "@smithy/eventstream-serde-browser": { "EventStreamMarshaller": "function", "EventStreamMarshallerOptions": "type(interface)", "eventStreamSerdeProvider": "function", "iterableToReadableStream": "function", "readableStreamtoIterable": "function" }, "@smithy/eventstream-serde-config-resolver": { "EventStreamSerdeInputConfig": "type(interface)", "EventStreamSerdeResolvedConfig": "type(interface)", "resolveEventStreamSerdeConfig": "function" }, "@smithy/eventstream-serde-node": { "EventStreamMarshaller": "function", "EventStreamMarshallerOptions": "type(interface)", "eventStreamSerdeProvider": "function" }, "@smithy/eventstream-serde-universal": { "EventStreamMarshaller": "function", "EventStreamMarshallerOptions": "type(interface)", "eventStreamSerdeProvider": "function" }, "@smithy/experimental-identity-and-auth": { "ApiKeyIdentity": "type(interface)", "ApiKeyIdentityProvider": "type(object)", "createEndpointRuleSetHttpAuthSchemeParametersProvider": "function", "createEndpointRuleSetHttpAuthSchemeProvider": "function", "createIsIdentityExpiredFunction": "function", "DefaultEndpointResolver": "type(interface)", "DefaultIdentityProviderConfig": "function", "doesIdentityRequireRefresh": "function", "EndpointRuleSetHttpAuthSchemeParametersProvider": "type(interface)", "EndpointRuleSetHttpAuthSchemeProvider": "type(interface)", "EndpointRuleSetSmithyContext": "type(interface)", "EXPIRATION_MS": "number", "getHttpAuthSchemeEndpointRuleSetPlugin": "function", "getHttpAuthSchemePlugin": "function", "getHttpSigningPlugin": "function", "HttpApiKeyAuthLocation": "object", "HttpApiKeyAuthSigner": "function", "HttpAuthOption": "type(interface)", "HttpAuthScheme": "type(interface)", "httpAuthSchemeEndpointRuleSetMiddlewareOptions": "object", "HttpAuthSchemeId": "type(string)", "httpAuthSchemeMiddleware": "function", "httpAuthSchemeMiddlewareOptions": "object", "HttpAuthSchemeParameters": "type(interface)", "HttpAuthSchemeParametersProvider": "type(interface)", "HttpAuthSchemeProvider": "type(interface)", "HttpBearerAuthSigner": "function", "HttpSigner": "type(interface)", "httpSigningMiddleware": "function", "httpSigningMiddlewareOptions": "object", "IdentityProviderConfig": "type(interface)", "isIdentityExpired": "function", "MemoizedIdentityProvider": "type(interface)", "memoizeIdentityProvider": "function", "NoAuthSigner": "function", "PreviouslyResolved": "type(interface)", "SelectedHttpAuthScheme": "type(interface)", "SigV4Signer": "function", "TokenIdentity": "type(interface)", "TokenIdentityProvider": "type(object)" }, "@smithy/fetch-http-handler": { "AdditionalRequestParameters": "type(object)", "FetchHttpHandler": "function", "FetchHttpHandlerOptions": "type(interface)", "keepAliveSupport": "object", "streamCollector": "function" }, "@smithy/hash-blob-browser": { "blobHasher": "function" }, "@smithy/hash-node": { "Hash": "function" }, "@smithy/hash-stream-node": { "fileStreamHasher": "function", "readableStreamHasher": "function" }, "@smithy/invalid-dependency": { "invalidFunction": "function", "invalidProvider": "function" }, "@smithy/is-array-buffer": { "isArrayBuffer": "function" }, "@smithy/md5-js": { "Md5": "function" }, "@smithy/middleware-apply-body-checksum": { "applyMd5BodyChecksumMiddleware": "function", "applyMd5BodyChecksumMiddlewareOptions": "object", "getApplyMd5BodyChecksumPlugin": "function", "Md5BodyChecksumInputConfig": "type(interface)", "Md5BodyChecksumResolvedConfig": "type(interface)", "resolveMd5BodyChecksumConfig": "function" }, "@smithy/middleware-compression": { "CompressionInputConfig": "type(interface)", "compressionMiddleware": "function", "CompressionMiddlewareConfig": "type(interface)", "compressionMiddlewareOptions": "object", "CompressionPreviouslyResolved": "type(interface)", "CompressionResolvedConfig": "type(interface)", "DEFAULT_DISABLE_REQUEST_COMPRESSION": "boolean", "DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES": "number", "getCompressionPlugin": "function", "NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS": "object", "NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME": "string", "NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME": "string", "NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS": "object", "NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME": "string", "NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME": "string", "resolveCompressionConfig": "function" }, "@smithy/middleware-content-length": { "contentLengthMiddleware": "function", "contentLengthMiddlewareOptions": "object", "getContentLengthPlugin": "function" }, "@smithy/middleware-endpoint": { "BuiltInParamInstruction": "type(interface)", "ClientContextParamInstruction": "type(interface)", "ContextParamInstruction": "type(interface)", "EndpointInputConfig": "type(interface)", "endpointMiddleware": "function", "endpointMiddlewareOptions": "object", "EndpointParameterInstructions": "type(interface)", "EndpointParameterInstructionsSupplier": "type(object)", "EndpointRequiredInputConfig": "type(interface)", "EndpointRequiredResolvedConfig": "type(interface)", "EndpointResolvedConfig": "type(interface)", "getEndpointFromInstructions": "function", "getEndpointPlugin": "function", "OperationContextParamInstruction": "type(interface)", "resolveEndpointConfig": "function", "resolveEndpointRequiredConfig": "function", "resolveParams": "function", "StaticContextParamInstruction": "type(interface)", "toEndpointV1": "function" }, "@smithy/middleware-retry": { "AdaptiveRetryStrategy": "function", "AdaptiveRetryStrategyOptions": "type(interface)", "CONFIG_MAX_ATTEMPTS": "string", "CONFIG_RETRY_MODE": "string", "defaultDelayDecider": "function", "defaultRetryDecider": "function", "ENV_MAX_ATTEMPTS": "string", "ENV_RETRY_MODE": "string", "getOmitRetryHeadersPlugin": "function", "getRetryAfterHint": "function", "getRetryPlugin": "function", "NODE_MAX_ATTEMPT_CONFIG_OPTIONS": "object", "NODE_RETRY_MODE_CONFIG_OPTIONS": "object", "omitRetryHeadersMiddleware": "function", "omitRetryHeadersMiddlewareOptions": "object", "PreviouslyResolved": "type(interface)", "resolveRetryConfig": "function", "RetryInputConfig": "type(interface)", "retryMiddleware": "function", "retryMiddlewareOptions": "object", "RetryResolvedConfig": "type(interface)", "StandardRetryStrategy": "function", "StandardRetryStrategyOptions": "type(interface)" }, "@smithy/middleware-serde": { "deserializerMiddleware": "function", "deserializerMiddlewareOption": "object", "getSerdePlugin": "function", "serializerMiddleware": "function", "serializerMiddlewareOption": "object", "V1OrV2Endpoint": "type(object)" }, "@smithy/middleware-stack": { "constructStack": "function" }, "@smithy/node-config-provider": { "EnvOptions": "type(interface)", "GetterFromEnv": "type(object)", "loadConfig": "function", "LoadedConfigSelectors": "type(interface)", "LocalConfigOptions": "type(intersection)", "SharedConfigInit": "type(interface)" }, "@smithy/node-http-handler": { "DEFAULT_REQUEST_TIMEOUT": "number", "NodeHttp2Handler": "function", "NodeHttp2HandlerOptions": "type(interface)", "NodeHttpHandler": "function", "NodeHttpHandlerOptions": "type(interface)", "streamCollector": "function" }, "@smithy/property-provider": { "chain": "function", "CredentialsProviderError": "function", "fromStatic": "function", "memoize": "function", "ProviderError": "function", "ProviderErrorOptionsType": "type(object)", "TokenProviderError": "function" }, "@smithy/protocol-http": { "Field": "function", "FieldOptions": "type(object)", "FieldPosition": "type(union)", "Fields": "function", "FieldsOptions": "type(object)", "getHttpHandlerExtensionConfiguration": "function", "HeaderBag": "type(object)", "HttpHandler": "type(intersection)", "HttpHandlerExtensionConfigType": "type(object)", "HttpHandlerExtensionConfiguration": "type(interface)", "HttpHandlerOptions": "type(object)", "HttpHandlerUserInput": "type(union)", "HttpMessage": "type(object)", "HttpRequest": "function", "HttpResponse": "function", "IHttpRequest": "type(interface)", "isValidHostname": "function", "resolveHttpHandlerRuntimeConfig": "function" }, "@smithy/querystring-builder": { "buildQueryString": "function" }, "@smithy/querystring-parser": { "parseQueryString": "function" }, "@smithy/service-client-documentation-generator": { "load": "function" }, "@smithy/service-error-classification": { "isBrowserNetworkError": "function", "isClockSkewCorrectedError": "function", "isClockSkewError": "function", "isNodeJsHttp2TransientError": "function", "isRetryableByTrait": "function", "isServerError": "function", "isThrottlingError": "function", "isTransientError": "function" }, "@smithy/shared-ini-file-loader": { "CONFIG_PREFIX_SEPARATOR": "string", "DEFAULT_PROFILE": "string", "ENV_PROFILE": "string", "externalDataInterceptor": "object", "getHomeDir": "function", "getProfileName": "function", "getSSOTokenFilepath": "function", "getSSOTokenFromFile": "function", "loadSharedConfigFiles": "function", "loadSsoSessionData": "function", "ParsedIniData": "type(object)", "parseKnownFiles": "function", "Profile": "type(object)", "readFile": "function", "ReadFileOptions": "type(interface)", "SharedConfigFiles": "type(object)", "SharedConfigInit": "type(interface)", "SourceProfileInit": "type(interface)", "SsoSessionInit": "type(interface)", "SSOToken": "type(interface)" }, "@smithy/signature-v4": { "ALGORITHM_IDENTIFIER": "string", "ALGORITHM_IDENTIFIER_V4A": "string", "ALGORITHM_QUERY_PARAM": "string", "ALWAYS_UNSIGNABLE_HEADERS": "object", "AMZ_DATE_HEADER": "string", "AMZ_DATE_QUERY_PARAM": "string", "AUTH_HEADER": "string", "clearCredentialCache": "function", "createScope": "function", "CREDENTIAL_QUERY_PARAM": "string", "DATE_HEADER": "string", "EVENT_ALGORITHM_IDENTIFIER": "string", "EXPIRES_QUERY_PARAM": "string", "GENERATED_HEADERS": "object", "getCanonicalHeaders": "function", "getCanonicalQuery": "function", "getPayloadHash": "function", "getSigningKey": "function", "hasHeader": "function", "HOST_HEADER": "string", "KEY_TYPE_IDENTIFIER": "string", "MAX_CACHE_SIZE": "number", "MAX_PRESIGNED_TTL": "number", "moveHeadersToQuery": "function", "OptionalSigV4aSigner": "type(object)", "prepareRequest": "function", "PROXY_HEADER_PATTERN": "object", "REGION_SET_PARAM": "string", "SEC_HEADER_PATTERN": "object", "SHA256_HEADER": "string", "SIGNATURE_HEADER": "string", "SIGNATURE_QUERY_PARAM": "string", "SignatureV4": "function", "signatureV4aContainer": "object", "SignatureV4Base": "function", "SignatureV4CryptoInit": "type(interface)", "SignatureV4Init": "type(interface)", "SIGNED_HEADERS_QUERY_PARAM": "string", "TOKEN_HEADER": "string", "TOKEN_QUERY_PARAM": "string", "UNSIGNABLE_PATTERNS": "object", "UNSIGNED_PAYLOAD": "string" }, "@smithy/signature-v4a": { "SignatureV4a": "function" }, "@smithy/smithy-client": { "_json": "function", "_parseEpochTimestamp": "function", "_parseRfc3339DateTimeWithOffset": "function", "_parseRfc7231DateTime": "function", "AutomaticJsonStringConversion": "type(alias)", "Client": "function", "collectBody": "function", "Command": "function", "CommandImpl": "type(interface)", "ConditionalLazyValueInstruction": "type(object)", "ConditionalValueInstruction": "type(object)", "convertMap": "function", "copyDocumentWithTransform": "function", "createAggregatedClient": "function", "dateToUtcString": "function", "decorateServiceException": "function", "DefaultExtensionRuntimeConfigType": "type(intersection)", "DefaultsMode": "type(union)", "DefaultsModeConfigs": "type(interface)", "DocumentType": "type(union)", "emitWarningIfUnsupportedVersion": "function", "ExceptionOptionType": "type(object)", "expectBoolean": "function", "expectByte": "function", "expectFloat32": "function", "expectInt": "function", "expectInt32": "function", "expectLong": "function", "expectNonNull": "function", "expectNumber": "function", "expectObject": "function", "expectShort": "function", "expectString": "function", "expectUnion": "function", "extendedEncodeURIComponent": "function", "FilterStatus": "type(alias)", "FilterStatusSupplier": "type(object)", "generateIdempotencyToken": "function", "getArrayIfSingleItem": "function", "getDefaultClientConfiguration": "function", "getDefaultExtensionConfiguration": "function", "getValueFromTextNode": "function", "handleFloat": "function", "isSerializableHeaderValue": "function", "LazyJsonString": "function", "LazyValueInstruction": "type(object)", "limitedParseDouble": "function", "limitedParseFloat": "function", "limitedParseFloat32": "function", "loadConfigsForDefaultMode": "function", "logger": "object", "map": "function", "NoOpLogger": "function", "NumericType": "type(alias)", "NumericValue": "function", "nv": "function", "ObjectMappingInstruction": "type(alias)", "ObjectMappingInstructions": "type(object)", "parseBoolean": "function", "parseEpochTimestamp": "function", "parseRfc3339DateTime": "function", "parseRfc3339DateTimeWithOffset": "function", "parseRfc7231DateTime": "function", "quoteHeader": "function", "ResolvedDefaultsMode": "type(union)", "resolveDefaultRuntimeConfig": "function", "resolvedPath": "function", "SdkError": "type(intersection)", "SENSITIVE_STRING": "string", "serializeDateTime": "function", "serializeFloat": "function", "ServiceException": "function", "ServiceExceptionOptions": "type(interface)", "SimpleValueInstruction": "type(object)", "SmithyConfiguration": "type(interface)", "SmithyException": "type(interface)", "SmithyResolvedConfiguration": "type(object)", "SourceMappingInstruction": "type(object)", "SourceMappingInstructions": "type(object)", "splitEvery": "function", "splitHeader": "function", "strictParseByte": "function", "strictParseDouble": "function", "strictParseFloat": "function", "strictParseFloat32": "function", "strictParseInt": "function", "strictParseInt32": "function", "strictParseLong": "function", "strictParseShort": "function", "take": "function", "throwDefaultError": "function", "UnfilteredValue": "type(alias)", "Value": "type(alias)", "ValueFilteringFunction": "type(object)", "ValueMapper": "type(object)", "ValueSupplier": "type(object)", "withBaseException": "function" }, "@smithy/snapshot-testing": { "customFields": "object", "SnapshotProtocol": "function", "SnapshotRunner": "function", "snapshotTestingProtocolResponseSerializers": "object" }, "@smithy/typecheck": { "getRuntimeTypecheckPlugin": "function", "RuntimeTypecheckBehavior": "type(union)", "RuntimeTypecheckOptions": "type(object)", "validateSchema": "function" }, "@smithy/types": { "$ClientProtocol": "type(interface)", "$ClientProtocolCtor": "type(interface)", "$Codec": "type(interface)", "$MemberSchema": "type(object)", "$OperationSchema": "type(interface)", "$Schema": "type(union)", "$SchemaRef": "type(union)", "$ShapeDeserializer": "type(interface)", "$ShapeSerializer": "type(interface)", "AbortController": "type(interface)", "AbortHandler": "type(interface)", "AbortSignal": "type(interface)", "AbsoluteLocation": "type(interface)", "AlgorithmId": "object", "ApiKeyIdentity": "type(interface)", "ApiKeyIdentityProvider": "type(object)", "AssertiveClient": "type(intersection)", "AuthScheme": "type(interface)", "AvailableMessage": "type(interface)", "AvailableMessages": "type(interface)", "AwsCredentialIdentity": "type(interface)", "AwsCredentialIdentityProvider": "type(object)", "BigDecimalSchema": "type(alias)", "BigIntegerSchema": "type(alias)", "BinaryHeaderValue": "type(object)", "BlobPayloadInputTypes": "type(union)", "BlobSchema": "type(alias)", "BlobSchemas": "type(union)", "BlobTypes": "type(union)", "BodyLengthCalculator": "type(interface)", "BooleanHeaderValue": "type(object)", "BooleanSchema": "type(alias)", "BrowserClient": "type(intersection)", "BrowserRuntimeBlobTypes": "type(union)", "BrowserRuntimeStreamingBlobPayloadInputTypes": "type(union)", "BrowserRuntimeStreamingBlobPayloadOutputTypes": "type(union)", "BrowserRuntimeStreamingBlobTypes": "type(union)", "BrowserXhrClient": "type(intersection)", "BuildHandler": "type(interface)", "BuildHandlerArguments": "type(interface)", "BuildHandlerOptions": "type(interface)", "BuildHandlerOutput": "type(interface)", "BuildMiddleware": "type(interface)", "ByteHeaderValue": "type(object)", "CacheKey": "type(interface)", "CheckOptionalClientConfig": "type(alias)", "Checksum": "type(interface)", "ChecksumAlgorithm": "type(interface)", "ChecksumConfiguration": "type(interface)", "ChecksumConstructor": "type(interface)", "Client": "type(interface)", "ClientProtocol": "type(interface)", "ClientProtocolCtor": "type(interface)", "Codec": "type(interface)", "CodecSettings": "type(object)", "Command": "type(interface)", "CommandIO": "type(interface)", "ConditionObject": "type(intersection)", "ConfigurableSerdeContext": "type(interface)", "ConnectConfiguration": "type(interface)", "ConnectionManager": "type(interface)", "ConnectionManagerConfiguration": "type(interface)", "ConnectionPool": "type(interface)", "DateInput": "type(union)", "Decoder": "type(interface)", "DefaultClientConfiguration": "type(interface)", "DefaultExtensionConfiguration": "type(interface)", "DeprecatedObject": "type(object)", "DeserializeHandler": "type(interface)", "DeserializeHandlerArguments": "type(interface)", "DeserializeHandlerOptions": "type(interface)", "DeserializeHandlerOutput": "type(interface)", "DeserializeMiddleware": "type(interface)", "DocumentSchema": "type(alias)", "DocumentType": "type(union)", "Encoder": "type(interface)", "Endpoint": "type(interface)", "EndpointARN": "type(interface)", "EndpointBearer": "type(interface)", "EndpointObject": "type(object)", "EndpointObjectHeaders": "type(object)", "EndpointObjectProperties": "type(object)", "EndpointObjectProperty": "type(union)", "EndpointParameters": "type(object)", "EndpointParams": "type(object)", "EndpointPartition": "type(interface)", "EndpointResolverOptions": "type(object)", "EndpointRuleObject": "type(object)", "EndpointURL": "type(interface)", "EndpointURLScheme": "object", "EndpointV2": "type(interface)", "ErrorHandler": "type(interface)", "ErrorRuleObject": "type(object)", "EvaluateOptions": "type(intersection)", "EventSigner": "type(interface)", "EventSigningArguments": "type(interface)", "EventStreamMarshaller": "type(interface)", "EventStreamMarshallerDeserFn": "type(interface)", "EventStreamMarshallerSerFn": "type(interface)", "EventStreamPayloadHandler": "type(interface)", "EventStreamPayloadHandlerProvider": "type(interface)", "EventStreamRequestScopedCredentials": "type(interface)", "EventStreamRequestSigner": "type(interface)", "EventStreamSerdeContext": "type(interface)", "EventStreamSerdeProvider": "type(interface)", "EventStreamSignerProvider": "type(interface)", "Exact": "type(alias)", "ExponentialBackoffJitterType": "type(union)", "ExponentialBackoffStrategyOptions": "type(interface)", "Expression": "type(union)", "FetchHttpHandlerOptions": "type(interface)", "FieldOptions": "type(object)", "FieldPosition": "object", "FinalizeHandler": "type(interface)", "FinalizeHandlerArguments": "type(interface)", "FinalizeHandlerOutput": "type(interface)", "FinalizeRequestHandlerOptions": "type(interface)", "FinalizeRequestMiddleware": "type(interface)", "FormattedEvent": "type(interface)", "FunctionArgv": "type(object)", "FunctionObject": "type(object)", "FunctionReturn": "type(union)", "GetAwsChunkedEncodingStream": "type(interface)", "GetAwsChunkedEncodingStreamOptions": "type(interface)", "getDefaultClientConfiguration": "function", "GetOutputType": "type(alias)", "Handler": "type(object)", "HandlerExecutionContext": "type(interface)", "HandlerOptions": "type(interface)", "Hash": "type(interface)", "HashConstructor": "type(interface)", "HeaderBag": "type(object)", "HeaderValue": "type(object)", "HttpApiKeyAuthLocation": "object", "HttpAuthDefinition": "type(interface)", "HttpAuthLocation": "object", "HttpAuthOption": "type(interface)", "HttpAuthScheme": "type(interface)", "HttpAuthSchemeId": "type(string)", "HttpAuthSchemeParameters": "type(interface)", "HttpAuthSchemeParametersProvider": "type(interface)", "HttpAuthSchemeProvider": "type(interface)", "HttpHandlerOptions": "type(interface)", "HttpLabelBitMask": "type(alias)", "HttpMessage": "type(interface)", "HttpPayloadBitMask": "type(alias)", "HttpQueryParamsBitMask": "type(alias)", "HttpRequest": "type(interface)", "HttpResponse": "type(interface)", "HttpResponseCodeBitMask": "type(alias)", "HttpSigner": "type(interface)", "IdempotencyTokenBitMask": "type(alias)", "IdempotentBitMask": "type(alias)", "Identity": "type(interface)", "IdentityProvider": "type(interface)", "IdentityProviderConfig": "type(interface)", "IniSection": "type(object)", "IniSectionType": "object", "InitializeHandler": "type(interface)", "InitializeHandlerArguments": "type(interface)", "InitializeHandlerOptions": "type(interface)", "InitializeHandlerOutput": "type(interface)", "InitializeMiddleware": "type(interface)", "Int64": "type(interface)", "IntegerHeaderValue": "type(object)", "InvokeFunction": "type(interface)", "InvokeMethod": "type(interface)", "InvokeMethodOptionalArgs": "type(interface)", "ListSchema": "type(interface)", "ListSchemaModifier": "type(alias)", "Logger": "type(interface)", "LongHeaderValue": "type(object)", "MapSchema": "type(interface)", "MapSchemaModifier": "type(alias)", "MemberSchema": "type(object)", "MemoizedProvider": "type(interface)", "Message": "type(interface)", "MessageDecoder": "type(interface)", "MessageEncoder": "type(interface)", "MessageHeaders": "type(object)", "MessageHeaderValue": "type(union)", "MessageSigner": "type(interface)", "MessageSigningArguments": "type(interface)", "MetadataBearer": "type(interface)", "MiddlewareStack": "type(interface)", "MiddlewareType": "type(union)", "Mutable": "type(object)", "NarrowPayloadBlobOutputType": "type(intersection)", "NarrowPayloadBlobTypes": "type(intersection)", "NodeHttpHandlerOptions": "type(interface)", "NodeJsClient": "type(intersection)", "NodeJsHttp2Client": "type(intersection)", "NodeJsRuntimeBlobTypes": "type(union)", "NodeJsRuntimeStreamingBlobPayloadInputTypes": "type(union)", "NodeJsRuntimeStreamingBlobPayloadOutputTypes": "type(union)", "NodeJsRuntimeStreamingBlobTypes": "type(object)", "NormalizedSchema": "type(interface)", "NoUndefined": "type(alias)", "NumericSchema": "type(alias)", "OperationSchema": "type(interface)", "OptionalParameter": "type(alias)", "PaginationConfiguration": "type(interface)", "Paginator": "type(object)", "ParameterObject": "type(object)", "ParsedIniData": "type(object)", "Pluggable": "type(interface)", "Priority": "type(union)", "Profile": "type(interface)", "Provider": "type(interface)", "QueryParameterBag": "type(object)", "randomValues": "type(interface)", "RecursiveRequired": "type(alias)", "ReferenceObject": "type(object)", "ReferenceRecord": "type(object)", "RegionInfo": "type(interface)", "RegionInfoProvider": "type(interface)", "RegionInfoProviderOptions": "type(interface)", "Relation": "type(union)", "RelativeLocation": "type(interface)", "RelativeMiddlewareOptions": "type(intersection)", "RequestContext": "type(interface)", "RequestHandler": "type(interface)", "RequestHandlerMetadata": "type(interface)", "RequestHandlerOutput": "type(object)", "RequestHandlerParams": "type(union)", "RequestHandlerProtocol": "object", "RequestPresigner": "type(interface)", "RequestPresigningArguments": "type(interface)", "RequestSerializer": "type(interface)", "RequestSigner": "type(interface)", "RequestSigningArguments": "type(interface)", "resolveDefaultRuntimeConfig": "function", "ResponseDeserializer": "type(interface)", "ResponseMetadata": "type(interface)", "RetryableTrait": "type(interface)", "RetryBackoffStrategy": "type(interface)", "RetryErrorInfo": "type(interface)", "RetryErrorType": "type(union)", "RetryStrategy": "type(interface)", "RetryStrategyConfiguration": "type(interface)", "RetryStrategyOptions": "type(interface)", "RetryStrategyV2": "type(interface)", "RetryToken": "type(interface)", "RuleSetObject": "type(object)", "RuleSetRules": "type(object)", "Schema": "type(union)", "SchemaRef": "type(union)", "SchemaTraits": "type(union)", "SchemaTraitsObject": "type(object)", "SdkError": "type(intersection)", "SdkStream": "type(intersection)", "SdkStreamMixin": "type(interface)", "SdkStreamMixinInjector": "type(interface)", "SdkStreamSerdeContext": "type(interface)", "SelectedHttpAuthScheme": "type(interface)", "SensitiveBitMask": "type(alias)", "SerdeContext": "type(interface)", "SerdeFunctions": "type(interface)", "SerializeHandler": "type(interface)", "SerializeHandlerArguments": "type(interface)", "SerializeHandlerOptions": "type(interface)", "SerializeHandlerOutput": "type(interface)", "SerializeMiddleware": "type(interface)", "ShapeDeserializer": "type(interface)", "ShapeName": "type(string)", "ShapeNamespace": "type(string)", "ShapeSerializer": "type(interface)", "SharedConfigFiles": "type(interface)", "ShortHeaderValue": "type(object)", "SignableMessage": "type(interface)", "SignedMessage": "type(interface)", "SigningArguments": "type(interface)", "SimpleSchema": "type(number)", "SMITHY_CONTEXT_KEY": "string", "SmithyException": "type(interface)", "SmithyFeatures": "type(object)", "SourceData": "type(union)", "StandardRetryBackoffStrategy": "type(interface)", "StandardRetryToken": "type(interface)", "StaticErrorSchema": "type(object)", "StaticListSchema": "type(object)", "StaticMapSchema": "type(object)", "StaticOperationSchema": "type(object)", "StaticSchema": "type(union)", "StaticSchemaIdError": "type(alias)", "StaticSchemaIdList": "type(alias)", "StaticSchemaIdMap": "type(alias)", "StaticSchemaIdOperation": "type(alias)", "StaticSchemaIdSimple": "type(alias)", "StaticSchemaIdStruct": "type(alias)", "StaticSchemaIdUnion": "type(alias)", "StaticSimpleSchema": "type(object)", "StaticStructureSchema": "type(object)", "StaticUnionSchema": "type(object)", "Step": "type(union)", "StreamCollector": "type(interface)", "StreamHasher": "type(interface)", "StreamingBlobPayloadInputTypes": "type(union)", "StreamingBlobPayloadOutputTypes": "type(union)", "StreamingBlobSchema": "type(alias)", "StreamingBlobTypes": "type(union)", "StringHeaderValue": "type(object)", "StringSchema": "type(alias)", "StringSigner": "type(interface)", "StructureSchema": "type(interface)", "SuccessHandler": "type(interface)", "Terminalware": "type(interface)", "TimestampDateTimeSchema": "type(alias)", "TimestampDefaultSchema": "type(alias)", "TimestampEpochSecondsSchema": "type(alias)", "TimestampHeaderValue": "type(object)", "TimestampHttpDateSchema": "type(alias)", "TimestampSchemas": "type(union)", "TokenIdentity": "type(interface)", "TokenIdentityProvider": "type(object)", "TraitBitVector": "type(number)", "TraitsSchema": "type(interface)", "Transform": "type(alias)", "TreeRuleObject": "type(object)", "UncheckedClient": "type(intersection)", "UnitSchema": "type(alias)", "URI": "type(object)", "UrlParser": "type(interface)", "UserAgent": "type(object)", "UserAgentPair": "type(object)", "UuidHeaderValue": "type(object)", "WaiterConfiguration": "type(interface)", "WithSdkStreamMixin": "type(object)" }, "@smithy/url-parser": { "parseUrl": "function" }, "@smithy/util-base64": { "fromBase64": "function", "toBase64": "function" }, "@smithy/util-body-length-browser": { "calculateBodyLength": "function" }, "@smithy/util-body-length-node": { "calculateBodyLength": "function" }, "@smithy/util-buffer-from": { "fromArrayBuffer": "function", "fromString": "function", "StringEncoding": "type(union)" }, "@smithy/util-config-provider": { "booleanSelector": "function", "numberSelector": "function", "SelectorType": "object" }, "@smithy/util-defaults-mode-browser": { "resolveDefaultsModeConfig": "function", "ResolveDefaultsModeConfigOptions": "type(interface)" }, "@smithy/util-defaults-mode-node": { "resolveDefaultsModeConfig": "function", "ResolveDefaultsModeConfigOptions": "type(interface)" }, "@smithy/util-endpoints": { "BinaryDecisionDiagram": "function", "ConditionObject": "type(intersection)", "customEndpointFunctions": "object", "decideEndpoint": "function", "DeprecatedObject": "type(object)", "EndpointCache": "function", "EndpointError": "function", "EndpointFunctions": "type(object)", "EndpointObject": "type(object)", "EndpointObjectHeaders": "type(object)", "EndpointObjectProperties": "type(object)", "EndpointParams": "type(object)", "EndpointResolverOptions": "type(object)", "EndpointRuleObject": "type(object)", "ErrorRuleObject": "type(object)", "EvaluateOptions": "type(intersection)", "Expression": "type(union)", "FunctionArgv": "type(object)", "FunctionObject": "type(object)", "FunctionReturn": "type(union)", "isIpAddress": "function", "isValidHostLabel": "function", "ParameterObject": "type(object)", "ReferenceObject": "type(object)", "ReferenceRecord": "type(object)", "resolveEndpoint": "function", "RuleSetObject": "type(object)", "RuleSetRules": "type(object)", "TreeRuleObject": "type(object)" }, "@smithy/util-hex-encoding": { "fromHex": "function", "toHex": "function" }, "@smithy/util-middleware": { "getSmithyContext": "function", "normalizeProvider": "function" }, "@smithy/util-retry": { "AdaptiveRetryStrategy": "function", "AdaptiveRetryStrategyOptions": "type(interface)", "ConfiguredRetryStrategy": "function", "DEFAULT_MAX_ATTEMPTS": "number", "DEFAULT_RETRY_DELAY_BASE": "number", "DEFAULT_RETRY_MODE": "string", "DefaultRateLimiter": "function", "DefaultRateLimiterOptions": "type(interface)", "INITIAL_RETRY_TOKENS": "number", "INVOCATION_ID_HEADER": "string", "MAXIMUM_RETRY_DELAY": "number", "NO_RETRY_INCREMENT": "number", "RateLimiter": "type(interface)", "REQUEST_HEADER": "string", "Retry": "function", "RETRY_COST": "number", "RETRY_MODES": "object", "StandardRetryStrategy": "function", "StandardRetryStrategyOptions": "type(object)", "THROTTLING_RETRY_DELAY_BASE": "number", "TIMEOUT_RETRY_COST": "number" }, "@smithy/util-stream": { "ChecksumStream": "function", "ChecksumStreamInit": "type(interface)", "createBufferedReadable": "function", "createChecksumStream": "function", "getAwsChunkedEncodingStream": "function", "headStream": "function", "isBlob": "function", "isReadableStream": "function", "sdkStreamMixin": "function", "splitStream": "function", "Uint8ArrayBlobAdapter": "function" }, "@smithy/util-uri-escape": { "escapeUri": "function", "escapeUriPath": "function" }, "@smithy/util-utf8": { "fromUtf8": "function", "StringEncoding": "type(union)", "toUint8Array": "function", "toUtf8": "function" }, "@smithy/util-waiter": { "checkExceptions": "function", "createWaiter": "function", "WaiterConfiguration": "type(interface)", "WaiterOptions": "type(intersection)", "WaiterResult": "type(object)", "waiterServiceDefaults": "object", "WaiterState": "object" }, "@smithy/uuid": { "v4": "function" }, "$schema": "https://json-schema.org/draft/2020-12/schema" } ================================================ FILE: build.gradle.kts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import com.diffplug.spotless.FormatterFunc import com.github.spotbugs.snom.Effort import org.jreleaser.model.Active import java.io.Serializable import java.util.regex.Pattern plugins { `java-library` `maven-publish` signing checkstyle jacoco id("com.github.spotbugs") version "6.3.0" id("org.jreleaser") version "1.21.0" // spotless 8.x is incompatible with jreleaser 1.x (see https://github.com/jreleaser/jreleaser/issues/1989) id("com.diffplug.spotless") version "7.2.1" } allprojects { group = "software.amazon.smithy.typescript" version = "0.49.1" } // The root project doesn't produce a JAR. tasks["jar"].enabled = false repositories { mavenLocal() mavenCentral() } subprojects { val subproject = this /* * Java * ==================================================== */ if (subproject.name == "smithy-typescript-codegen") { apply(plugin = "java-library") java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } tasks.withType { options.encoding = "UTF-8" } // Use Junit5's test runner. tasks.withType { useJUnitPlatform() } // Apply junit 5 and hamcrest test dependencies to all java projects. dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.13.4") testImplementation("org.junit.jupiter:junit-jupiter-engine:5.13.4") testImplementation("org.junit.jupiter:junit-jupiter-params:5.13.4") testImplementation("org.hamcrest:hamcrest:3.0") testImplementation("org.mockito:mockito-junit-jupiter:5.19.0") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } // Reusable license copySpec val licenseSpec = copySpec { from("${project.rootDir}/LICENSE") from("${project.rootDir}/NOTICE") } // Set up tasks that build source and javadoc jars. tasks.register("sourcesJar") { metaInf.with(licenseSpec) from(sourceSets.main.get().allSource) archiveClassifier.set("sources") } tasks.register("javadocJar") { metaInf.with(licenseSpec) from(tasks.javadoc) archiveClassifier.set("javadoc") } // Configure jars to include license related info tasks.jar { metaInf.with(licenseSpec) inputs.property("moduleName", subproject.extra["moduleName"]) manifest { attributes["Automatic-Module-Name"] = subproject.extra["moduleName"] } } tasks { javadoc { // not enabled due to excessive output. // if taking up the task of resolving javadoc issues, at // that time this can be enabled again. enabled = false } } /* * Maven * ==================================================== */ apply(plugin = "maven-publish") apply(plugin = "signing") repositories { mavenLocal() mavenCentral() } publishing { repositories { maven { name = "stagingRepository" url = rootProject.layout.buildDirectory .dir("staging") .get() .asFile .toURI() } } publications { create("mavenJava") { from(components["java"]) // Ship the source and javadoc jars. artifact(tasks["sourcesJar"]) artifact(tasks["javadocJar"]) // Include extra information in the POMs. afterEvaluate { pom { name.set(subproject.extra["displayName"].toString()) description.set(subproject.description) url.set("https://github.com/smithy-lang/smithy-typescript") licenses { license { name.set("Apache License 2.0") url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") distribution.set("repo") } } developers { developer { id.set("smithy") name.set("Smithy") organization.set("Amazon Web Services") organizationUrl.set("https://aws.amazon.com") roles.add("developer") } } scm { url.set("https://github.com/smithy-lang/smithy-typescript.git") } } } } } } // Don't sign the artifacts if we didn't get a key and password to use. val signingKey: String? by project val signingPassword: String? by project if (signingKey != null && signingPassword != null) { signing { useInMemoryPgpKeys(signingKey, signingPassword) sign(publishing.publications["mavenJava"]) } } /* * CheckStyle * ==================================================== */ apply(plugin = "checkstyle") tasks["checkstyleTest"].enabled = false /* * Tests * ==================================================== * * Configure the running of tests. */ // Log on passed, skipped, and failed test events if the `-Plog-tests` property is set. if (project.hasProperty("log-tests")) { tasks.test { testLogging { events("passed", "skipped", "failed") exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL } } } else { tasks.test { testLogging { events("failed") exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL } } } /* * Code coverage * ==================================================== */ apply(plugin = "jacoco") // Always run the jacoco test report after testing. tasks["test"].finalizedBy(tasks["jacocoTestReport"]) // Configure jacoco to generate an HTML report. tasks.jacocoTestReport { reports { xml.required.set(false) csv.required.set(false) html.outputLocation.set( layout.buildDirectory .dir("reports/jacoco") .get() .asFile, ) } } /* * Spotbugs * ==================================================== */ apply(plugin = "com.github.spotbugs") // We don't need to lint tests. tasks["spotbugsTest"].enabled = false // Configure the bug filter for spotbugs. spotbugs { effort.set(Effort.MAX) val excludeFile = File("${project.rootDir}/config/spotbugs/filter.xml") if (excludeFile.exists()) { excludeFilter.set(excludeFile) } } apply(plugin = "com.diffplug.spotless") spotless { java { // Enforce a common license header on all files licenseHeaderFile("${project.rootDir}/config/spotless/license-header.txt") .onlyIfContentMatches("^((?!SKIPLICENSECHECK)[\\s\\S])*\$") leadingTabsToSpaces() endWithNewline() eclipse().configFile("${project.rootDir}/config/spotless/formatting.xml") // Fixes for some strange formatting applied by eclipse: // see: https://github.com/kamkie/demo-spring-jsf/blob/bcacb9dc90273a5f8d2569470c5bf67b171c7d62/build.gradle.kts#L159 // These have to be implemented with anonymous classes this way instead of lambdas because of: // https://github.com/diffplug/spotless/issues/2387 custom( "Lambda fix", object : Serializable, FormatterFunc { override fun apply(input: String): String = input.replace("} )", "})").replace("} ,", "},") }, ) custom( "Long literal fix", object : Serializable, FormatterFunc { override fun apply(input: String): String = Pattern.compile("([0-9_]+) [Ll]").matcher(input).replaceAll("\$1L") }, ) // Static first, then everything else alphabetically removeUnusedImports() importOrder("\\#", "") // Ignore generated code for formatter check targetExclude("*/build/**/*.*") } // Formatting for build.gradle.kts files kotlinGradle { ktlint() leadingTabsToSpaces() trimTrailingWhitespace() endWithNewline() licenseHeaderFile( "${project.rootDir}/config/spotless/license-header.txt", "import|tasks|apply|plugins|rootProject", ) } tasks { // If the property "noFormat" is set, don't auto-format source file (like in CI) if (!project.hasProperty("noFormat")) { build { dependsOn(spotlessApply) } } } } } } /* * Jreleaser (https://jreleaser.org) config. */ jreleaser { dryrun = false // Used for creating a tagged release, uploading files and generating changelog. // In the future we can set this up to push release tags to GitHub, but for now it's // set up to do nothing. // https://jreleaser.org/guide/latest/reference/release/index.html release { generic { enabled = true skipRelease = true } } // Used to announce a release to configured announcers. // https://jreleaser.org/guide/latest/reference/announce/index.html announce { active = Active.NEVER } // Signing configuration. // https://jreleaser.org/guide/latest/reference/signing.html signing { active = Active.ALWAYS armored = true } // Configuration for deploying to Maven Central. // https://jreleaser.org/guide/latest/examples/maven/maven-central.html#_gradle deploy { maven { mavenCentral { create("maven-central") { active = Active.ALWAYS url = "https://central.sonatype.com/api/v1/publisher" stagingRepositories.add( rootProject.layout.buildDirectory .dir("staging") .get() .asFile.absolutePath, ) } } } } } ================================================ FILE: config/checkstyle/checkstyle.xml ================================================ ================================================ FILE: config/checkstyle/suppressions.xml ================================================ ================================================ FILE: config/spotbugs/filter.xml ================================================ ================================================ FILE: config/spotless/formatting.xml ================================================ ================================================ FILE: config/spotless/license-header.txt ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ ================================================ FILE: gradle.properties ================================================ smithyVersion=1.69.0 smithyGradleVersion=1.3.0 org.gradle.configuration-cache=true org.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=build/jreleaser/marker.txt ================================================ FILE: gradlew ================================================ #!/bin/sh # # Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 # ############################################################################## # # Gradle start up script for POSIX generated by Gradle. # # Important for running: # # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is # noncompliant, but you have some other compliant shell such as ksh or # bash, then to run this script, type that shell name before the whole # command line, like: # # ksh Gradle # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», # «${var#prefix}», «${var%suffix}», and «$( cmd )»; # * compound commands having a testable exit status, especially «case»; # * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # # (2) This script targets any POSIX shell, so it avoids extensions provided # by Bash, Ksh, etc; in particular arrays are avoided. # # The "traditional" practice of packing multiple parameters into a # space-separated string is a well documented source of bugs and security # problems, so this is (mostly) avoided, by progressively accumulating # options in "$@", and eventually passing that to Java. # # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; # see the in-line comments for details. # # There are tweaks for specific operating systems such as AIX, CygWin, # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. # ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link app_path=$0 # Need this for daisy-chained symlinks. while APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path [ -h "$app_path" ] do ls=$( ls -ld "$app_path" ) link=${ls#*' -> '} case $link in #( /*) app_path=$link ;; #( *) app_path=$APP_HOME$link ;; esac done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum warn () { echo "$*" } >&2 die () { echo echo "$*" echo exit 1 } >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "$( uname )" in #( CYGWIN* ) cygwin=true ;; #( Darwin* ) darwin=true ;; #( MSYS* | MINGW* ) msys=true ;; #( NONSTOP* ) nonstop=true ;; esac # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD=$JAVA_HOME/jre/sh/java else JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD=java if ! command -v java >/dev/null 2>&1 then die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi # Collect all arguments for the java command, stacking in reverse order: # * args from the command line # * the main class name # * -classpath # * -D...appname settings # * --module-path (only if needed) # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) # Now convert the arguments - kludge to limit ourselves to /bin/sh for arg do if case $arg in #( -*) false ;; # don't mess with options #( /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath [ -e "$t" ] ;; #( *) false ;; esac then arg=$( cygpath --path --ignore --mixed "$arg" ) fi # Roll the args list around exactly as many times as the number of # args, so each arg winds up back in the position where it started, but # possibly modified. # # NB: a `for` loop captures its iteration list before it begins, so # changing the positional parameters here affects neither the number of # iterations, nor the values presented in `arg`. shift # remove old arg set -- "$@" "$arg" # push replacement arg done fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. if ! command -v xargs >/dev/null 2>&1 then die "xargs is not available" fi # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. # # In Bash we could simply go: # # readarray ARGS < <( xargs -n1 <<<"$var" ) && # set -- "${ARGS[@]}" "$@" # # but POSIX shell has neither arrays nor command substitution, so instead we # post-process each arg (as a line of input to sed) to backslash-escape any # character that might be a shell metacharacter, then use eval to reverse # that process (while maintaining the separation between arguments), and wrap # the whole thing up as a single "set" statement. # # This will of course break if any of these variables contains a newline or # an unmatched quote. # eval "set -- $( printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | xargs -n1 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | tr '\n' ' ' )" '"$@"' exec "$JAVACMD" "$@" ================================================ FILE: gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @rem SPDX-License-Identifier: Apache-2.0 @rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute echo. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! set EXIT_CODE=%ERRORLEVEL% if %EXIT_CODE% equ 0 set EXIT_CODE=1 if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: jest.config.base.js ================================================ const { compilerOptions } = require("@tsconfig/recommended/tsconfig.json"); module.exports = { preset: "ts-jest", testMatch: ["**/*.spec.ts", "!**/*.browser.spec.ts", "!**/*.integ.spec.ts"], transform: { "^.+\\.tsx?$": [ "ts-jest", { ...compilerOptions, noImplicitAny: false, strictNullChecks: false, }, ], }, }; ================================================ FILE: package.json ================================================ { "name": "smithy-typescript", "private": true, "version": "1.0.0", "description": "Smithy TypeScript packages", "main": "index.js", "scripts": { "clean": "turbo run clean --force --parallel", "build": "turbo run build", "test": "make test-unit", "test:integration": "yarn build-test-packages && make test-integration", "test:protocols": "make generate-protocol-tests test-protocols benchmark", "lint": "turbo run lint", "lint-fix": "turbo run lint -- --fix", "lint:pkgJson": "yarn lint:dependencies", "lint:dependencies": "node scripts/check-dependencies.js", "lint:versions": "node scripts/runtime-dep-version-check.js", "lint:api": "node scripts/validation/api-snapshot-validation.js", "format": "turbo run format --parallel", "stage-release": "turbo run stage-release", "extract:docs": "mkdir -p api-extractor-packages && turbo run extract:docs", "release": "yarn changeset publish", "build-test-packages": "./gradlew clean build && node ./scripts/build-generated-test-packages", "g:tsc": "cd $INIT_CWD && tsc", "g:vitest": "cd $INIT_CWD && vitest" }, "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript/tree/main" }, "author": "AWS Smithy Team", "license": "UNLICENSED", "dependencies": { "@changesets/cli": "^2.27.5", "glob": "^7.1.6", "premove": "4.0.0" }, "devDependencies": { "@ianvs/prettier-plugin-sort-imports": "^4.7.1", "@microsoft/api-extractor": "7.52.7", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.1", "@rollup/plugin-typescript": "^12.1.4", "@tsconfig/recommended": "1.0.2", "@types/jest": "28.1.3", "@types/jsdom": "20.0.1", "@typescript-eslint/eslint-plugin": "8.32.0", "@typescript-eslint/parser": "8.32.0", "esbuild": "^0.25.9", "eslint": "8.57.0", "eslint-plugin-n": "^17.24.0", "eslint-plugin-tsdoc": "0.2.17", "get-port": "^7.1.0", "happy-dom": "20.8.9", "husky": "^4.2.3", "jest": "29.7.0", "prettier": "3.2.5", "puppeteer": "^19.2.0", "rollup": "^4.59.0", "ts-jest": "29.1.2", "tsx": "^4.21.0", "turbo": "2.5.8", "typescript": "~5.8.3", "vite": "^7.1.11", "vitest": "^3.2.4", "webpack": "^5.104.1", "webpack-cli": "^6.0.1" }, "overrides": {}, "workspaces": [ "packages/*", "smithy-typescript-ssdk-libs/*", "private/*" ], "packageManager": "yarn@4.10.3", "husky": { "hooks": { "pre-commit": "yarn lint:dependencies && yarn lint:versions & yarn lint:api" } } } ================================================ FILE: packages/abort-controller/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/abort-controller/CHANGELOG.md ================================================ # Change Log ## 4.2.15 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.1.9 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.8 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.7 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.6 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.1.5 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.4 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.3 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.2 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.1 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.0 ### Minor Changes - c2a5595: use platform AbortController|AbortSignal implementations ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/abort-controller](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/abort-controller/CHANGELOG.md) for additional history. ================================================ FILE: packages/abort-controller/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/abort-controller/README.md ================================================ # @smithy/abort-controller [![NPM version](https://img.shields.io/npm/v/@smithy/abort-controller/latest.svg)](https://www.npmjs.com/package/@smithy/abort-controller) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/abort-controller.svg)](https://www.npmjs.com/package/@smithy/abort-controller) ### :warning: Deprecated API :warning: This is the legacy polyfill for AbortController. You should use the native AbortController class instead. ================================================ FILE: packages/abort-controller/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/abort-controller/package.json ================================================ { "name": "@smithy/abort-controller", "version": "4.2.15", "description": "A simple abort controller library", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline abort-controller", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:watch": "yarn g:vitest watch" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/abort-controller", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/abort-controller" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/abort-controller/src/AbortController.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { AbortController } from "./AbortController"; import { AbortSignal } from "./AbortSignal"; describe("AbortController", () => { it("should communicate cancellation via its signal", () => { const source = new AbortController(); const { signal } = source; expect(signal).toBeInstanceOf(AbortSignal); expect(signal.aborted).toBe(false); source.abort(); expect(signal.aborted).toBe(true); }); }); ================================================ FILE: packages/abort-controller/src/AbortController.ts ================================================ import { AbortController as DeprecatedAbortController } from "@smithy/types"; import { AbortSignal } from "./AbortSignal"; /** * @public */ export { DeprecatedAbortController as IAbortController }; /** * @deprecated This implementation was added as Node.js didn't support AbortController prior to 15.x * Use native implementation in browsers or Node.js \>=15.4.0. * * @public */ export class AbortController implements DeprecatedAbortController { public readonly signal: AbortSignal = new AbortSignal(); abort(): void { this.signal.abort(); } } ================================================ FILE: packages/abort-controller/src/AbortSignal.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { AbortController } from "./AbortController"; describe("AbortSignal", () => { it("should report aborted to be false until the signal is aborted", () => { const controller = new AbortController(); const { signal } = controller; expect(signal.aborted).toBe(false); controller.abort(); expect(signal.aborted).toBe(true); }); it("should invoke the onabort handler when the signal is aborted", () => { const controller = new AbortController(); const { signal } = controller; const abortHandler = vi.fn(); signal.onabort = abortHandler; expect(abortHandler.mock.calls.length).toBe(0); controller.abort(); expect(abortHandler.mock.calls.length).toBe(1); }); it("should not invoke the onabort handler multiple time", () => { const controller = new AbortController(); const { signal } = controller; const abortHandler = vi.fn(); signal.onabort = abortHandler; expect(abortHandler.mock.calls.length).toBe(0); controller.abort(); expect(abortHandler.mock.calls.length).toBe(1); controller.abort(); expect(abortHandler.mock.calls.length).toBe(1); }); }); ================================================ FILE: packages/abort-controller/src/AbortSignal.ts ================================================ import { AbortHandler, AbortSignal as DeprecatedAbortSignal } from "@smithy/types"; /** * @public */ export { AbortHandler, DeprecatedAbortSignal as IAbortSignal }; /** * @public */ export class AbortSignal implements DeprecatedAbortSignal { public onabort: AbortHandler | null = null; private _aborted = false; constructor() { Object.defineProperty(this, "_aborted", { value: false, writable: true, }); } /** * Whether the associated operation has already been cancelled. */ get aborted(): boolean { return this._aborted; } /** * @internal */ abort(): void { this._aborted = true; if (this.onabort) { this.onabort(this); this.onabort = null; } } } ================================================ FILE: packages/abort-controller/src/index.ts ================================================ /** * This implementation was added as Node.js didn't support AbortController prior to 15.x * Use native implementation in browsers or Node.js \>=15.4.0. * * @deprecated Use standard implementations in [Browsers](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) and [Node.js](https://nodejs.org/docs/latest/api/globals.html#class-abortcontroller) * @packageDocumentation */ export * from "./AbortController"; export * from "./AbortSignal"; ================================================ FILE: packages/abort-controller/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/abort-controller/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/abort-controller/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/abort-controller/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/chunked-blob-reader/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/chunked-blob-reader/CHANGELOG.md ================================================ # @smithy/chunked-blob-reader ## 5.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 5.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 5.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 5.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/chunked-blob-reader/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/chunked-blob-reader/package.json ================================================ { "name": "@smithy/chunked-blob-reader", "version": "5.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/chunked-blob-reader", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/chunked-blob-reader" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/chunked-blob-reader/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { blobReader } from "@smithy/core/checksum"; ================================================ FILE: packages/chunked-blob-reader/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/chunked-blob-reader/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/chunked-blob-reader/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/chunked-blob-reader-native/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/chunked-blob-reader-native/CHANGELOG.md ================================================ # @smithy/chunked-blob-reader-native ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/chunked-blob-reader-native/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/chunked-blob-reader-native/package.json ================================================ { "name": "@smithy/chunked-blob-reader-native", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/chunked-blob-reader-native", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/chunked-blob-reader-native" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/chunked-blob-reader-native/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { blobReader } from "@smithy/core/checksum"; ================================================ FILE: packages/chunked-blob-reader-native/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/chunked-blob-reader-native/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/chunked-blob-reader-native/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/config-resolver/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/config-resolver/CHANGELOG.md ================================================ # @smithy/config-resolver ## 4.5.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.5.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.5.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.5.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/config-resolver/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/config-resolver/package.json ================================================ { "name": "@smithy/config-resolver", "version": "4.5.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/config-resolver", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/config-resolver" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/config-resolver/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { ENV_USE_DUALSTACK_ENDPOINT, CONFIG_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_DUALSTACK_ENDPOINT, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, nodeDualstackConfigSelectors, ENV_USE_FIPS_ENDPOINT, CONFIG_USE_FIPS_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, nodeFipsConfigSelectors, resolveCustomEndpointsConfig, resolveEndpointsConfig, REGION_ENV_NAME, REGION_INI_NAME, NODE_REGION_CONFIG_OPTIONS, NODE_REGION_CONFIG_FILE_OPTIONS, resolveRegionConfig, getRegionInfo, } from "@smithy/core/config"; export type { CustomEndpointsInputConfig, CustomEndpointsResolvedConfig, EndpointsInputConfig, EndpointsResolvedConfig, RegionInputConfig, RegionResolvedConfig, PartitionHash, RegionHash, EndpointVariant, EndpointVariantTag, GetRegionInfoOptions, } from "@smithy/core/config"; ================================================ FILE: packages/config-resolver/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/config-resolver/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/config-resolver/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/core/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json !*.d.ts ================================================ FILE: packages/core/CHANGELOG.md ================================================ # Change Log ## 3.24.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 ## 3.24.2 ### Patch Changes - 6d4eb8a: fix for browser utf8 variant not to include Buffer (Node.js) ## 3.24.1 ### Patch Changes - 2dc5cf6: fix for uuid generation in Node.js 18.x - 1d0ff86: retrieve schemas with matching shape name if unambiguous ## 3.24.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - 9194e9f: consolidate into core/endpoints - 7ec62a0: fix browser bundler metadata for @smithy/core - 62fed78: package consolidation for core/config - cad44fc: consolidate core/event-streams - f21bf6b: consolidate packages into core/client ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - 0be0b36: clean up exported API surface - fb323fb: avoid sideEffects in core submodule indices - 545589a: Avoid throwing from waiter 403 warning checks when no responses have been observed. - 7fd6ac0: export surface equality for core, Node.js/browser/react-native ## 3.23.17 ### Patch Changes - @smithy/util-stream@4.5.25 ## 3.23.16 ### Patch Changes - a029f0e: Reduce intermediate allocations in hot paths - @smithy/util-stream@4.5.24 ## 3.23.15 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/util-stream@4.5.23 - @smithy/protocol-http@5.3.14 - @smithy/url-parser@4.2.14 - @smithy/util-middleware@4.2.14 ## 3.23.14 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 - @smithy/url-parser@4.2.13 - @smithy/util-middleware@4.2.13 - @smithy/util-stream@4.5.22 ## 3.23.13 ### Patch Changes - 7198e09: Remove unnecessary shallow copy of input object and delete operations in `HttpBindingProtocol.serializeRequest` and `RpcProtocol.serializeRequest`. The body serializer is schema-driven and only reads members listed in the payload schema, making the spread and deletes redundant. This eliminates an O(n) copy and 5 delete operations per request. - @smithy/util-stream@4.5.21 ## 3.23.12 ### Patch Changes - @smithy/util-stream@4.5.20 ## 3.23.11 ### Patch Changes - 2edd638: feat(schema): add caching to NormalizedSchema.of() and translateTraits() - @smithy/util-stream@4.5.19 ## 3.23.10 ### Patch Changes - 5340b11: apply resolved endpoint headers to final request - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 - @smithy/url-parser@4.2.12 - @smithy/util-middleware@4.2.12 - @smithy/util-stream@4.5.18 ## 3.23.9 ### Patch Changes - 6ef5430: fix typo in thrown error message - 6ef5430: default event stream body to empty byte array ## 3.23.8 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-body-length-browser@4.2.2 - @smithy/middleware-serde@4.2.12 - @smithy/util-middleware@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/util-base64@4.3.2 - @smithy/util-stream@4.5.17 - @smithy/util-utf8@4.2.2 - @smithy/uuid@1.1.2 ## 3.23.7 ### Patch Changes - 11569eb: preserve null values for non-sparse collections in cbor deserializing - @smithy/util-stream@4.5.16 ## 3.23.6 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/middleware-serde@4.2.11 - @smithy/protocol-http@5.3.10 - @smithy/util-middleware@4.2.10 - @smithy/util-stream@4.5.15 ## 3.23.5 ### Patch Changes - 026b177: fix(protocols): remove unsafe type cast in resolvedPath to handle null/undefined from labelValueProvider - cde9f09: fix extraneous serialization of idempotencyToken into http body ## 3.23.4 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/middleware-serde@4.2.10 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 - @smithy/util-base64@4.3.1 - @smithy/util-body-length-browser@4.2.1 - @smithy/util-middleware@4.2.9 - @smithy/util-stream@4.5.14 - @smithy/util-utf8@4.2.1 - @smithy/uuid@1.1.1 ## 3.23.3 ### Patch Changes - Updated dependencies [ffe1843] - @smithy/util-stream@4.5.13 ## 3.23.2 ### Patch Changes - c5db01c: fix for Unit event stream union targets ## 3.23.1 ### Patch Changes - 6f96c01: omit absent resposne fields instead of assigning undefined ## 3.23.0 ### Minor Changes - 4f05c6a: compose error TypeRegistry on protocol ### Patch Changes - @smithy/util-stream@4.5.12 ## 3.22.1 ### Patch Changes - @smithy/util-stream@4.5.11 ## 3.22.0 ### Minor Changes - 472bf01: avoid autoboxing in NormalizedSchema::getSchema() ## 3.21.1 ### Patch Changes - fa0e0c4: accept 0-byte event stream payloads as structure shapes ## 3.21.0 ### Minor Changes - c2a6f46: improve schema struct iterator performance ## 3.20.8 ### Patch Changes - 96cc077: limit scope of http label validation ## 3.20.7 ### Patch Changes - ae6ef2e: client side httpLabel validation ## 3.20.6 ### Patch Changes - 862c942: custom handling for \_\_type in structures ## 3.20.5 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/middleware-serde@4.2.9 - @smithy/protocol-http@5.3.8 - @smithy/util-middleware@4.2.8 - @smithy/util-stream@4.5.10 ## 3.20.4 ### Patch Changes - Updated dependencies [87a5f20] - @smithy/util-stream@4.5.9 ## 3.20.3 ### Patch Changes - 681d6c4: fix cbor bigDecimal serialization ## 3.20.2 ### Patch Changes - dd55f1f: fix to conditionally set host prefix ## 3.20.1 ### Patch Changes - aa954bc: fix for CBOR shape deserialization of BigDecimals ## 3.20.0 ### Minor Changes - 9ccb841: add static union schema as a new type ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/middleware-serde@4.2.8 - @smithy/protocol-http@5.3.7 - @smithy/util-middleware@4.2.7 - @smithy/util-stream@4.5.8 ## 3.19.0 ### Minor Changes - 5a56762: make protocol selection easier ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/middleware-serde@4.2.7 - @smithy/protocol-http@5.3.6 - @smithy/util-middleware@4.2.6 - @smithy/util-stream@4.5.7 ## 3.18.7 ### Patch Changes - 541a18f: fix for CBOR date deserialization ## 3.18.6 ### Patch Changes - 1d6db03: continue looking for event headers after event payload is found ## 3.18.5 ### Patch Changes - 77c149f: drain stream in httpBindingProtocol with unit output ## 3.18.4 ### Patch Changes - e659a06: set explicit enumerability on error.$response - Updated dependencies [e659a06] - @smithy/middleware-serde@4.2.6 ## 3.18.3 ### Patch Changes - 5bcd041: fix for event stream binding deserialization ## 3.18.2 ### Patch Changes - c8b148c: idempotency token generation for HttpBindingProtocol ## 3.18.1 ### Patch Changes - 0976f42: generate idempotency token in ToStringShapeSerializer ## 3.18.0 ### Minor Changes - 3926fd7: set release level for schemas ### Patch Changes - e77f705: omit undefined values in cbor deserialization - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/middleware-serde@4.2.5 - @smithy/protocol-http@5.3.5 - @smithy/util-middleware@4.2.5 - @smithy/util-stream@4.5.6 ## 3.17.2 ### Patch Changes - 6da0ab3: export used types - df00095: fix schema date utils date parsing - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/middleware-serde@4.2.4 - @smithy/protocol-http@5.3.4 - @smithy/util-middleware@4.2.4 - @smithy/util-stream@4.5.5 ## 3.17.1 ### Patch Changes - @smithy/util-stream@4.5.4 ## 3.17.0 ### Minor Changes - 8a2a912: remove usage of non-static schema classes ### Patch Changes - Updated dependencies [8a2a912] - Updated dependencies [7e359e2] - @smithy/types@4.8.0 - @smithy/util-stream@4.5.3 - @smithy/middleware-serde@4.2.3 - @smithy/protocol-http@5.3.3 - @smithy/util-middleware@4.2.3 ## 3.16.1 ### Patch Changes - 052d261: fix ordering of static simple schema type - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/middleware-serde@4.2.2 - @smithy/protocol-http@5.3.2 - @smithy/util-middleware@4.2.2 - @smithy/util-stream@4.5.2 ## 3.16.0 ### Minor Changes - 7f8af58: generation of static schema - 8a2873c: implement SerdeContext base class ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/util-stream@4.5.1 - @smithy/middleware-serde@4.2.1 - @smithy/protocol-http@5.3.1 - @smithy/util-middleware@4.2.1 ## 3.15.0 ### Minor Changes - 813c9a5: refactoring to reduce code size ### Patch Changes - Updated dependencies [813c9a5] - @smithy/util-base64@4.3.0 - @smithy/util-stream@4.5.0 ## 3.14.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/middleware-serde@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 - @smithy/util-base64@4.2.0 - @smithy/util-body-length-browser@4.2.0 - @smithy/util-middleware@4.2.0 - @smithy/util-stream@4.4.0 - @smithy/util-utf8@4.2.0 - @smithy/uuid@1.1.0 ## 3.13.0 ### Minor Changes - 59e9952: separate error schema objects from error ctor ## 3.12.0 ### Minor Changes - 97fe0d8: Replace 'uuid' with '@smithy/uuid' ### Patch Changes - 3eb73f3: fix detection of member idempotencyToken trait ## 3.11.1 ### Patch Changes - f8793be: prevent compilation from inserting Uint8Array type parameter - Updated dependencies [f8793be] - @smithy/util-stream@4.3.2 ## 3.11.0 ### Minor Changes - bb7c1c1: schema code size optimizations ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/middleware-serde@4.1.1 - @smithy/protocol-http@5.2.1 - @smithy/util-middleware@4.1.1 - @smithy/util-stream@4.3.1 ## 3.10.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-body-length-browser@4.1.0 - @smithy/middleware-serde@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/util-base64@4.1.0 - @smithy/util-stream@4.3.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 3.9.2 ### Patch Changes - 06ac1f6: set explicit return type for cbor alloc ## 3.9.1 ### Patch Changes - 29fad01: fix NumericValue typecheck ## 3.9.0 ### Minor Changes - ab4f33f: CBOR protocol error handling fallbacks - d79dc91: schema serde eventstreams implementation ## 3.8.0 ### Minor Changes - fd00602: handle idempotency token generation for CBOR protocol ### Patch Changes - 64e033f: schema serde: http binding and cbor serializer refactoring - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/middleware-serde@4.0.9 - @smithy/protocol-http@5.1.3 - @smithy/util-middleware@4.0.5 - @smithy/util-stream@4.2.4 ## 3.7.2 ### Patch Changes - f4dcba0: fix offset calculation when decoding bigInteger in CBOR ## 3.7.1 ### Patch Changes - 312801c: increase priority of types conditional exports - bb7975e: set sideEffects bundler metadata ## 3.7.0 ### Minor Changes - d105c97: add instanceof overrides for schema classes ### Patch Changes - @smithy/util-stream@4.2.3 ## 3.6.0 ### Minor Changes - 10a0534: support BigInt in cbor ## 3.5.3 ### Patch Changes - 4a31774: allow old signature in protected method ## 3.5.2 ### Patch Changes - 4642e7e: allow http prefix header and header to read from same binding - 147ceed: use smithy synthetic namespace for base errors - ae8f1f4: allow struct iterator acquisition on unit schema ## 3.5.1 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/middleware-serde@4.0.8 - @smithy/protocol-http@5.1.2 - @smithy/util-middleware@4.0.4 - @smithy/util-stream@4.2.2 ## 3.5.0 ### Minor Changes - ae11e3a: add schema classes - 23812a9: add cbor protocol (alpha) ### Patch Changes - Updated dependencies [ae11e3a] - @smithy/middleware-serde@4.0.7 ## 3.4.0 ### Minor Changes - 06b0ce8: move serde functions from smithy-client to core/serde ### Patch Changes - efb27ee: read code property of errors case-insensitively - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/middleware-serde@4.0.6 - @smithy/protocol-http@5.1.1 - @smithy/util-middleware@4.0.3 - @smithy/util-stream@4.2.1 ## 3.3.3 ### Patch Changes - Updated dependencies [786dd3a] - @smithy/middleware-serde@4.0.5 ## 3.3.2 ### Patch Changes - Updated dependencies [103535a] - @smithy/middleware-serde@4.0.4 ## 3.3.1 ### Patch Changes - 40ffcd5: copy input headers when building RPCv2 CBOR request ## 3.3.0 ### Minor Changes - 5896264: Resolve auth schemes based on the preference list ## 3.2.0 ### Minor Changes - 02ef79c: add numeric value container for serde ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/util-stream@4.2.0 - @smithy/types@4.2.0 - @smithy/middleware-serde@4.0.3 - @smithy/util-middleware@4.0.2 ## 3.1.5 ### Patch Changes - @smithy/util-stream@4.1.2 ## 3.1.4 ### Patch Changes - Updated dependencies [efedb20] - @smithy/util-stream@4.1.1 ## 3.1.3 ### Patch Changes - Updated dependencies [d1d1f72] - @smithy/util-stream@4.1.0 ## 3.1.2 ### Patch Changes - Updated dependencies [f5d0bac] - @smithy/middleware-serde@4.0.2 ## 3.1.1 ### Patch Changes - @smithy/util-stream@4.0.2 ## 3.1.0 ### Minor Changes - 2aff9df: Added middleware support to pagination - 000b2ae: allow paginator token fallback to be specified by operation input ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/middleware-serde@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/util-middleware@4.0.1 - @smithy/util-stream@4.0.1 ## 3.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-middleware@4.0.0 - @smithy/util-stream@4.0.0 - @smithy/util-utf8@4.0.0 - @smithy/middleware-serde@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 - @smithy/util-body-length-browser@4.0.0 ## 2.5.7 ### Patch Changes - @smithy/util-stream@3.3.4 ## 2.5.6 ### Patch Changes - @smithy/util-stream@3.3.3 ## 2.5.5 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/middleware-serde@3.0.11 - @smithy/protocol-http@4.1.8 - @smithy/util-middleware@3.0.11 - @smithy/util-stream@3.3.2 ## 2.5.4 ### Patch Changes - 9c40f7b: make CBOR tags more distinct in JS ## 2.5.3 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/middleware-serde@3.0.10 - @smithy/protocol-http@4.1.7 - @smithy/util-middleware@3.0.10 - @smithy/util-stream@3.3.1 ## 2.5.2 ### Patch Changes - c6ef519: avoid self referencing submodule import - Updated dependencies [c8d257b] - Updated dependencies [cd1929b] - @smithy/util-stream@3.3.0 - @smithy/types@3.7.0 - @smithy/middleware-serde@3.0.9 - @smithy/protocol-http@4.1.6 - @smithy/util-middleware@3.0.9 ## 2.5.1 ### Patch Changes - Updated dependencies [ccdd49f] - @smithy/util-stream@3.2.1 ## 2.5.0 ### Minor Changes - 84bec05: add feature identification map to smithy context - d07b0ab: feature detection for custom endpoint and gzip ### Patch Changes - d07b0ab: reorganize smithy/core to be upstream of smithy/smithy-client - Updated dependencies [f4e0bd9] - Updated dependencies [84bec05] - @smithy/util-stream@3.2.0 - @smithy/types@3.6.0 - @smithy/middleware-serde@3.0.8 - @smithy/protocol-http@4.1.5 - @smithy/util-middleware@3.0.8 ## 2.4.8 ### Patch Changes - Updated dependencies [75e0125] - @smithy/smithy-client@3.4.0 - @smithy/middleware-retry@3.0.23 ## 2.4.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/middleware-endpoint@3.1.4 - @smithy/middleware-retry@3.0.22 - @smithy/middleware-serde@3.0.7 - @smithy/protocol-http@4.1.4 - @smithy/smithy-client@3.3.6 - @smithy/util-middleware@3.0.7 ## 2.4.6 ### Patch Changes - 18dd957: add compatibility types redirect - Updated dependencies [64600d8] - @smithy/smithy-client@3.3.5 - @smithy/middleware-retry@3.0.21 ## 2.4.5 ### Patch Changes - @smithy/smithy-client@3.3.4 - @smithy/middleware-retry@3.0.20 ## 2.4.4 ### Patch Changes - @smithy/smithy-client@3.3.3 - @smithy/middleware-retry@3.0.19 ## 2.4.3 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/middleware-endpoint@3.1.3 - @smithy/middleware-retry@3.0.18 - @smithy/middleware-serde@3.0.6 - @smithy/protocol-http@4.1.3 - @smithy/smithy-client@3.3.2 - @smithy/util-middleware@3.0.6 ## 2.4.2 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/middleware-endpoint@3.1.2 - @smithy/middleware-retry@3.0.17 - @smithy/middleware-serde@3.0.5 - @smithy/protocol-http@4.1.2 - @smithy/smithy-client@3.3.1 - @smithy/util-middleware@3.0.5 ## 2.4.1 ### Patch Changes - Updated dependencies [c8c53ae] - Updated dependencies [2dad138] - Updated dependencies [d8df7bf] - Updated dependencies [9f3f2f5] - @smithy/middleware-endpoint@3.1.1 - @smithy/types@3.4.0 - @smithy/smithy-client@3.3.0 - @smithy/middleware-retry@3.0.16 - @smithy/middleware-serde@3.0.4 - @smithy/protocol-http@4.1.1 - @smithy/util-middleware@3.0.4 ## 2.4.0 ### Minor Changes - 5865b65: cbor (de)serializer for JS ### Patch Changes - Updated dependencies [5865b65] - @smithy/smithy-client@3.2.0 - @smithy/middleware-retry@3.0.15 ## 2.3.2 ### Patch Changes - Updated dependencies [670553a] - @smithy/smithy-client@3.1.12 - @smithy/middleware-retry@3.0.14 ## 2.3.1 ### Patch Changes - @smithy/smithy-client@3.1.11 - @smithy/middleware-retry@3.0.13 ## 2.3.0 ### Minor Changes - 86862ea: switch to static HttpRequest clone method ### Patch Changes - Updated dependencies [4a40961] - Updated dependencies [86862ea] - @smithy/middleware-endpoint@3.1.0 - @smithy/protocol-http@4.1.0 - @smithy/smithy-client@3.1.10 - @smithy/middleware-retry@3.0.12 - @smithy/middleware-serde@3.0.3 ## 2.2.8 ### Patch Changes - @smithy/smithy-client@3.1.9 - @smithy/middleware-retry@3.0.11 ## 2.2.7 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 - @smithy/middleware-retry@3.0.10 - @smithy/smithy-client@3.1.8 - @smithy/middleware-serde@3.0.3 ## 2.2.6 ### Patch Changes - @smithy/middleware-endpoint@3.0.5 - @smithy/smithy-client@3.1.7 - @smithy/middleware-retry@3.0.9 ## 2.2.5 ### Patch Changes - @smithy/smithy-client@3.1.6 - @smithy/middleware-retry@3.0.8 ## 2.2.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/middleware-endpoint@3.0.4 - @smithy/middleware-retry@3.0.7 - @smithy/middleware-serde@3.0.3 - @smithy/protocol-http@4.0.3 - @smithy/smithy-client@3.1.5 - @smithy/util-middleware@3.0.3 ## 2.2.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/middleware-endpoint@3.0.3 - @smithy/middleware-retry@3.0.6 - @smithy/middleware-serde@3.0.2 - @smithy/protocol-http@4.0.2 - @smithy/smithy-client@3.1.4 - @smithy/util-middleware@3.0.2 ## 2.2.2 ### Patch Changes - @smithy/smithy-client@3.1.3 - @smithy/middleware-retry@3.0.5 ## 2.2.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/middleware-endpoint@3.0.2 - @smithy/middleware-retry@3.0.4 - @smithy/middleware-serde@3.0.1 - @smithy/protocol-http@4.0.1 - @smithy/smithy-client@3.1.2 - @smithy/util-middleware@3.0.1 ## 2.2.0 ### Minor Changes - f9c50081: adds a module exports field in core ## 2.1.1 ### Patch Changes - Updated dependencies [3689c949] - @smithy/smithy-client@3.1.1 - @smithy/middleware-retry@3.0.3 ## 2.1.0 ### Minor Changes - ab3a90fa: enable package.json exports in core ### Patch Changes - Updated dependencies [764047eb] - @smithy/smithy-client@3.1.0 - @smithy/middleware-endpoint@3.0.1 - @smithy/middleware-retry@3.0.2 ## 2.0.1 ### Patch Changes - @smithy/smithy-client@3.0.1 - @smithy/middleware-retry@3.0.1 ## 2.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/middleware-endpoint@3.0.0 - @smithy/middleware-retry@3.0.0 - @smithy/middleware-serde@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/protocol-http@4.0.0 - @smithy/smithy-client@3.0.0 ## 1.4.2 ### Patch Changes - Updated dependencies [cc54b8d1] - @smithy/middleware-endpoint@2.5.1 - @smithy/smithy-client@2.5.1 - @smithy/middleware-retry@2.3.1 ## 1.4.1 ### Patch Changes - Updated dependencies [e03a10ac] - @smithy/middleware-retry@2.3.0 ## 1.4.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/middleware-endpoint@2.5.0 - @smithy/middleware-retry@2.2.0 - @smithy/middleware-serde@2.3.0 - @smithy/util-middleware@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/smithy-client@2.5.0 - @smithy/types@2.12.0 ## 1.3.8 ### Patch Changes - @smithy/smithy-client@2.4.5 - @smithy/middleware-retry@2.1.7 ## 1.3.7 ### Patch Changes - Updated dependencies [32e3f6ff] - @smithy/middleware-serde@2.2.1 - @smithy/middleware-endpoint@2.4.6 - @smithy/smithy-client@2.4.4 - @smithy/middleware-retry@2.1.6 ## 1.3.6 ### Patch Changes - Updated dependencies [43f3e1e2] - Updated dependencies [49640d6c] - @smithy/middleware-serde@2.2.0 - @smithy/types@2.11.0 - @smithy/middleware-endpoint@2.4.5 - @smithy/middleware-retry@2.1.5 - @smithy/protocol-http@3.2.2 - @smithy/smithy-client@2.4.3 - @smithy/util-middleware@2.1.4 ## 1.3.5 ### Patch Changes - @smithy/middleware-endpoint@2.4.4 - @smithy/smithy-client@2.4.2 - @smithy/middleware-retry@2.1.4 ## 1.3.4 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/middleware-retry@2.1.3 - @smithy/types@2.10.1 - @smithy/middleware-endpoint@2.4.3 - @smithy/middleware-serde@2.1.3 - @smithy/protocol-http@3.2.1 - @smithy/smithy-client@2.4.1 - @smithy/util-middleware@2.1.3 ## 1.3.3 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/smithy-client@2.4.0 - @smithy/middleware-endpoint@2.4.2 - @smithy/middleware-retry@2.1.2 - @smithy/middleware-serde@2.1.2 - @smithy/util-middleware@2.1.2 ## 1.3.2 ### Patch Changes - 88980bc5: handle multi-part input token in paginator ## 1.3.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/middleware-endpoint@2.4.1 - @smithy/middleware-retry@2.1.1 - @smithy/middleware-serde@2.1.1 - @smithy/protocol-http@3.1.1 - @smithy/smithy-client@2.3.1 - @smithy/types@2.9.1 - @smithy/util-middleware@2.1.1 ## 1.3.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/middleware-endpoint@2.4.0 - @smithy/middleware-retry@2.1.0 - @smithy/middleware-serde@2.1.0 - @smithy/util-middleware@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/smithy-client@2.3.0 - @smithy/types@2.9.0 ## 1.2.2 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/middleware-endpoint@2.3.0 - @smithy/types@2.8.0 - @smithy/smithy-client@2.2.1 - @smithy/middleware-retry@2.0.26 - @smithy/middleware-serde@2.0.16 - @smithy/protocol-http@3.0.12 - @smithy/util-middleware@2.0.9 ## 1.2.1 ### Patch Changes - Updated dependencies [164f3bbd] - Updated dependencies [164f3bbd] - @smithy/smithy-client@2.2.0 - @smithy/middleware-retry@2.0.25 ## 1.2.0 ### Minor Changes - 12adf848: add paginator factory ### Patch Changes - 3eb09aae: fix(core): strict core deps ## 1.1.0 ### Minor Changes - 75cbb3e8: add requestBuilder ## 1.0.5 ### Patch Changes - @smithy/middleware-endpoint@2.2.3 - @smithy/middleware-retry@2.0.24 ## 1.0.4 ### Patch Changes - @smithy/middleware-retry@2.0.23 ## 1.0.3 ### Patch Changes - Updated dependencies [44f78bd9] - Updated dependencies [340634a5] - @smithy/middleware-retry@2.0.22 - @smithy/types@2.7.0 - @smithy/middleware-endpoint@2.2.2 - @smithy/middleware-serde@2.0.15 - @smithy/protocol-http@3.0.11 ## 1.0.2 ### Patch Changes - 8c674e70: Copy `getSmithyContext()` and `normalizeProvider()` to `@smithy/core`. - 9579a9a0: Add internal error and success handlers to `HttpSigner`. - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/middleware-endpoint@2.2.1 - @smithy/middleware-retry@2.0.21 - @smithy/middleware-serde@2.0.14 - @smithy/protocol-http@3.0.10 ## 1.0.1 ### Patch Changes - 4fca874e: Fix test script. ## 1.0.0 ### Major Changes - 8044a814: feat(experimentalIdentityAndAuth): move `experimentalIdentityAndAuth` types and interfaces to `@smithy/types` and `@smithy/core` ### Patch Changes - Updated dependencies [8044a814] - Updated dependencies [9e0a5a74] - @smithy/middleware-endpoint@2.2.0 - @smithy/types@2.5.0 - @smithy/middleware-retry@2.0.20 - @smithy/middleware-serde@2.0.13 - @smithy/protocol-http@3.0.9 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ================================================ FILE: packages/core/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/core/README.md ================================================ # @smithy/core [![NPM version](https://img.shields.io/npm/v/@smithy/core/latest.svg)](https://www.npmjs.com/package/@smithy/core) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/core.svg)](https://www.npmjs.com/package/@smithy/core) ### :warning: Internal API :warning: > This is an internal package. > That means this is used as a dependency for other, public packages, but > should not be taken directly as a dependency in your application's `package.json`. > If you are updating the version of this package, for example to bring in a > bug-fix, you should do so by updating your application lockfile with > e.g. `npm up @scope/package` or equivalent command in another > package manager, rather than taking a direct dependency. --- This package provides common or core functionality for generic Smithy clients. You do not need to explicitly install this package, since it will be installed during code generation if used. ## Development of `@smithy/core` submodules Core submodules are organized for distribution via the `package.json` `exports` field. `exports` is supported by default by the latest Node.js, webpack, and esbuild. For react-native, it can be enabled via instructions found at [reactnative.dev/blog](https://reactnative.dev/blog/2023/06/21/package-exports-support), but we also provide a compatibility redirect. Think of `@smithy/core` as a mono-package within the monorepo. It preserves the benefits of modularization, for example to optimize Node.js initialization speed, while making it easier to have a consistent version of core dependencies, reducing package sprawl when installing a Smithy runtime client. ### Guide for submodules - Each `index.ts` file corresponding to the pattern `./src/submodules//index.ts` will be published as a separate `dist-cjs` bundled submodule index using the `Inliner.js` build script. - create a folder as `./src/submodules/` including an `index.ts` file and a `README.md` file. - The linter will throw an error on missing submodule metadata in `package.json` and the various `tsconfig.json` files, but it will automatically fix them if possible. - a submodule is equivalent to a standalone `@smithy/` package in that importing it in Node.js will resolve a separate bundle. - submodules may not relatively import files from other submodules. Instead, directly use the `@scope/pkg/submodule` name as the import. - The linter will check for this and throw an error. - To the extent possible, correctly declaring submodule metadata is validated by the linter in `@smithy/core`. The linter runs during `yarn build` and also as `yarn lint`. ### When should I create an `@smithy/core/submodule` vs. `@smithy/new-package`? Keep in mind that the core package is installed by all downstream clients. If the component functionality is upstream of multiple clients, it is a good candidate for a core submodule. For example, if `middleware-retry` had been written after the support for submodules was added, it would have been a submodule. If the component's functionality is downstream of a client (rare), or only expected to be used by a very small subset of clients, it could be written as a standalone package. ================================================ FILE: packages/core/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/core/cbor.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/cbor" { export * from "@smithy/core/dist-types/submodules/cbor/index.d"; } ================================================ FILE: packages/core/cbor.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/cbor/index.js"); ================================================ FILE: packages/core/checksum.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ export * from "./dist-types/submodules/checksum/index.d"; ================================================ FILE: packages/core/checksum.js ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ module.exports = require("./dist-cjs/submodules/checksum/index.js"); ================================================ FILE: packages/core/client.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/client" { export * from "@smithy/core/dist-types/submodules/client/index.d"; } ================================================ FILE: packages/core/client.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/client/index.js"); ================================================ FILE: packages/core/config.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ export * from "./dist-types/submodules/config/index.d"; ================================================ FILE: packages/core/config.js ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ module.exports = require("./dist-cjs/submodules/config/index.js"); ================================================ FILE: packages/core/endpoints.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/endpoints" { export * from "@smithy/core/dist-types/submodules/endpoints/index.d"; } ================================================ FILE: packages/core/endpoints.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/endpoints/index.js"); ================================================ FILE: packages/core/event-streams.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/event-streams" { export * from "@smithy/core/dist-types/submodules/event-streams/index.d"; } ================================================ FILE: packages/core/event-streams.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/event-streams/index.js"); ================================================ FILE: packages/core/package.json ================================================ { "name": "@smithy/core", "version": "3.24.3", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline core", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "npx eslint -c ../../.eslintrc.js \"src/**/*.ts\" --fix && node ./scripts/lint", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:cbor:perf": "node ./scripts/cbor-perf.mjs", "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts", "test:watch": "yarn g:vitest watch" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "exports": { ".": { "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "node": "./dist-cjs/index.js", "import": "./dist-es/index.js", "require": "./dist-cjs/index.js" }, "./package.json": { "module": "./package.json", "node": "./package.json", "import": "./package.json", "require": "./package.json" }, "./cbor": { "types": "./dist-types/submodules/cbor/index.d.ts", "module": "./dist-es/submodules/cbor/index.js", "node": "./dist-cjs/submodules/cbor/index.js", "import": "./dist-es/submodules/cbor/index.js", "require": "./dist-cjs/submodules/cbor/index.js" }, "./protocols": { "types": "./dist-types/submodules/protocols/index.d.ts", "module": "./dist-es/submodules/protocols/index.js", "node": "./dist-cjs/submodules/protocols/index.js", "import": "./dist-es/submodules/protocols/index.js", "require": "./dist-cjs/submodules/protocols/index.js" }, "./serde": { "types": "./dist-types/submodules/serde/index.d.ts", "react-native": { "import": "./dist-es/submodules/serde/index.native.js", "require": "./dist-cjs/submodules/serde/index.native.js" }, "browser": { "import": "./dist-es/submodules/serde/index.browser.js", "require": "./dist-cjs/submodules/serde/index.browser.js" }, "module": "./dist-es/submodules/serde/index.js", "node": "./dist-cjs/submodules/serde/index.js", "import": "./dist-es/submodules/serde/index.js", "require": "./dist-cjs/submodules/serde/index.js" }, "./schema": { "types": "./dist-types/submodules/schema/index.d.ts", "module": "./dist-es/submodules/schema/index.js", "node": "./dist-cjs/submodules/schema/index.js", "import": "./dist-es/submodules/schema/index.js", "require": "./dist-cjs/submodules/schema/index.js" }, "./event-streams": { "types": "./dist-types/submodules/event-streams/index.d.ts", "react-native": { "import": "./dist-es/submodules/event-streams/index.browser.js", "require": "./dist-cjs/submodules/event-streams/index.browser.js" }, "browser": { "import": "./dist-es/submodules/event-streams/index.browser.js", "require": "./dist-cjs/submodules/event-streams/index.browser.js" }, "module": "./dist-es/submodules/event-streams/index.js", "node": "./dist-cjs/submodules/event-streams/index.js", "import": "./dist-es/submodules/event-streams/index.js", "require": "./dist-cjs/submodules/event-streams/index.js" }, "./endpoints": { "types": "./dist-types/submodules/endpoints/index.d.ts", "react-native": { "import": "./dist-es/submodules/endpoints/index.browser.js", "require": "./dist-cjs/submodules/endpoints/index.browser.js" }, "browser": { "import": "./dist-es/submodules/endpoints/index.browser.js", "require": "./dist-cjs/submodules/endpoints/index.browser.js" }, "module": "./dist-es/submodules/endpoints/index.js", "node": "./dist-cjs/submodules/endpoints/index.js", "import": "./dist-es/submodules/endpoints/index.js", "require": "./dist-cjs/submodules/endpoints/index.js" }, "./client": { "types": "./dist-types/submodules/client/index.d.ts", "module": "./dist-es/submodules/client/index.js", "node": "./dist-cjs/submodules/client/index.js", "import": "./dist-es/submodules/client/index.js", "require": "./dist-cjs/submodules/client/index.js" }, "./config": { "types": "./dist-types/submodules/config/index.d.ts", "react-native": { "import": "./dist-es/submodules/config/index.native.js", "require": "./dist-cjs/submodules/config/index.native.js" }, "browser": { "import": "./dist-es/submodules/config/index.browser.js", "require": "./dist-cjs/submodules/config/index.browser.js" }, "module": "./dist-es/submodules/config/index.js", "node": "./dist-cjs/submodules/config/index.js", "import": "./dist-es/submodules/config/index.js", "require": "./dist-cjs/submodules/config/index.js" }, "./checksum": { "types": "./dist-types/submodules/checksum/index.d.ts", "react-native": { "import": "./dist-es/submodules/checksum/index.native.js", "require": "./dist-cjs/submodules/checksum/index.native.js" }, "browser": { "import": "./dist-es/submodules/checksum/index.browser.js", "require": "./dist-cjs/submodules/checksum/index.browser.js" }, "module": "./dist-es/submodules/checksum/index.js", "node": "./dist-cjs/submodules/checksum/index.js", "import": "./dist-es/submodules/checksum/index.js", "require": "./dist-cjs/submodules/checksum/index.js" }, "./retry": { "types": "./dist-types/submodules/retry/index.d.ts", "react-native": { "import": "./dist-es/submodules/retry/index.browser.js", "require": "./dist-cjs/submodules/retry/index.browser.js" }, "browser": { "import": "./dist-es/submodules/retry/index.browser.js", "require": "./dist-cjs/submodules/retry/index.browser.js" }, "module": "./dist-es/submodules/retry/index.js", "node": "./dist-cjs/submodules/retry/index.js", "import": "./dist-es/submodules/retry/index.js", "require": "./dist-cjs/submodules/retry/index.js" } }, "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "./cbor.d.ts", "./cbor.js", "./endpoints.d.ts", "./endpoints.js", "./event-streams.d.ts", "./event-streams.js", "./protocols.d.ts", "./protocols.js", "./schema.d.ts", "./schema.js", "./serde.d.ts", "./serde.js", "dist-*/**", "./client.d.ts", "./client.js", "./config.d.ts", "./config.js", "./checksum.d.ts", "./checksum.js", "./retry.d.ts", "./retry.js" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/core", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/core" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "hash-test-vectors": "^1.3.2", "json-bigint": "^1.0.0", "premove": "4.0.0", "typedoc": "0.23.23" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "browser": { "./dist-es/submodules/checksum/index.js": "./dist-es/submodules/checksum/index.browser.js", "./dist-es/submodules/config/index.js": "./dist-es/submodules/config/index.browser.js", "./dist-es/submodules/endpoints/index.js": "./dist-es/submodules/endpoints/index.browser.js", "./dist-es/submodules/event-streams/index.js": "./dist-es/submodules/event-streams/index.browser.js", "./dist-es/submodules/retry/index.js": "./dist-es/submodules/retry/index.browser.js", "./dist-es/submodules/serde/index.js": "./dist-es/submodules/serde/index.browser.js" }, "react-native": { "./dist-es/submodules/checksum/index.js": "./dist-es/submodules/checksum/index.native.js", "./dist-cjs/submodules/checksum/index.js": "./dist-cjs/submodules/checksum/index.native.js", "./dist-es/submodules/config/index.js": "./dist-es/submodules/config/index.native.js", "./dist-cjs/submodules/config/index.js": "./dist-cjs/submodules/config/index.native.js", "./dist-es/submodules/serde/index.js": "./dist-es/submodules/serde/index.native.js", "./dist-cjs/submodules/serde/index.js": "./dist-cjs/submodules/serde/index.native.js", "./dist-es/submodules/endpoints/index.js": "./dist-es/submodules/endpoints/index.browser.js", "./dist-cjs/submodules/endpoints/index.js": "./dist-cjs/submodules/endpoints/index.browser.js", "./dist-es/submodules/event-streams/index.js": "./dist-es/submodules/event-streams/index.browser.js", "./dist-cjs/submodules/event-streams/index.js": "./dist-cjs/submodules/event-streams/index.browser.js", "./dist-es/submodules/retry/index.js": "./dist-es/submodules/retry/index.browser.js", "./dist-cjs/submodules/retry/index.js": "./dist-cjs/submodules/retry/index.browser.js" } } ================================================ FILE: packages/core/planning/consolidation.md ================================================ # Core Consolidation Plan This is a consolidation plan for moving the monorepo's packages into the `@smithy/core` package, specifically one of its submodules managed by package.json `exports` metadata. The "clients" column shows two counts: direct dependents, then transitive dependents (i.e. clients that have the package anywhere in their dependency closure), comma-separated. ### core/client | Package | LoC | Description/Rationale | Clients | Status | | -------------------- | ---- | --------------------------------- | -------- | ------ | | `smithy-client` | 1504 | Client/command base classes | 425, 425 | ✅ | | `middleware-stack` | 394 | Core middleware infrastructure | 425, 425 | ✅ | | `util-middleware` | 28 | Middleware utilities | 425, 425 | ✅ | | `invalid-dependency` | 19 | Placeholder used by smithy-client | 425, 425 | ✅ | | `util-waiter` | 373 | Waiter utilities | 68, 69 | ✅ | ### core/config | Package | LoC | Description/Rationale | Clients | Status | | ---------------------------- | --- | ------------------------------------------------- | -------- | ------ | | `config-resolver` | 628 | Always code-generated | 425, 425 | ✅ | | `util-config-provider` | 42 | Only used by config-resolver | 0, 425 | ✅ | | `node-config-provider` | 200 | Platform-specific, always present in Node clients | 425, 425 | ✅ | | `shared-ini-file-loader` | 509 | Only consumer is node-config-provider | 0, 425 | ✅ | | `property-provider` | 309 | Provider chain utilities | 0, 425 | ✅ | | `util-defaults-mode-browser` | 152 | Platform-specific, always code-generated | 425, 425 | ✅ | | `util-defaults-mode-node` | 137 | Platform-specific, always code-generated | 425, 425 | ✅ | ### core/protocols | Package | LoC | Description/Rationale | Clients | Status | | --------------------------- | --- | ----------------------------- | -------- | ------ | | `protocol-http` | 440 | HttpRequest/HttpResponse | 425, 425 | ✅ | | `middleware-content-length` | 58 | Always code-generated | 425, 425 | ✅ | | `util-uri-escape` | 22 | Encoding primitive | 0, 425 | ✅ | | `querystring-builder` | 26 | Depends on uri-escape | 0, 425 | ✅ | | `querystring-parser` | 28 | No deps | 0, 425 | ✅ | | `url-parser` | 25 | Depends on querystring-parser | 425, 425 | ✅ | ### core/serde | Package | LoC | Description/Rationale | Clients | Status | | -------------------------- | ---- | --------------------------------- | -------- | --------- | | `util-base64` | 164 | Encoding primitive | 425, 425 | ✅ | | `util-body-length-browser` | 34 | Platform-specific, protocol-level | 425, 425 | ✅ | | `util-body-length-node` | 39 | Platform-specific, protocol-level | 425, 425 | ✅ | | `util-utf8` | 55 | Encoding primitive | 425, 425 | ✅ | | `util-hex-encoding` | 49 | Encoding primitive | 0, 425 | ✅ | | `util-buffer-from` | 29 | Supports utf8/base64 | 0, 425 | ✅ | | `is-array-buffer` | 6 | Supports buffer-from | 0, 425 | ✅ | | `middleware-serde` | 228 | Always code-generated | 425, 425 | ✅ | | `hash-node` | 52 | Hashing | 425, 425 | ✅ | | `util-stream` | 1009 | Stream utilities | 36, 425 | ✅ | | `util-stream-browser` | 127 | Stream utilities | 0, 0 | ✅ unused | | `util-stream-node` | 101 | Stream utilities | 0, 0 | ✅ unused | | `uuid` | 65 | Encoding/generation primitive | 0, 425 | ✅ | ### core/endpoints | Package | LoC | Description/Rationale | Clients | Status | | --------------------- | --- | --------------------- | -------- | ------ | | `util-endpoints` | 995 | Endpoint rules engine | 425, 425 | ✅ | | `middleware-endpoint` | 755 | Always code-generated | 425, 425 | ✅ | ### core/retry | Package | LoC | Description/Rationale | Clients | Status | | ------------------------------ | --- | ------------------------------ | -------- | ------ | | `util-retry` | 778 | Retry strategies, rate limiter | 425, 425 | ✅ | | `middleware-retry` | 833 | Always code-generated | 425, 425 | ✅ | | `service-error-classification` | 142 | Only consumer is retry | 0, 425 | ✅ | This is a separate module because the integration tests are very time-consuming, and we'll likely want to run them separately. ### core/event-streams | Package | LoC | Description/Rationale | Clients | Status | | ----------------------------------- | --- | ------------------------ | ------- | ------ | | `eventstream-codec` | 763 | Binary codec | 0, 37 | ✅ | | `eventstream-serde-universal` | 246 | Platform-agnostic serde | 0, 17 | ✅ | | `eventstream-serde-browser` | 138 | Platform-specific | 17, 17 | ✅ | | `eventstream-serde-node` | 106 | Platform-specific | 17, 17 | ✅ | | `eventstream-serde-config-resolver` | 38 | Config for event streams | 17, 17 | ✅ | Clients currently depend on the platform specific `eventstream-serde-browser/node`, which in turn depends on `-universal`, and then `-codec`. ### core/checksum | Package | LoC | Description/Rationale | Clients | Status | | ---------------------------- | --- | -------------------------- | ------- | ------ | | `hash-blob-browser` | 18 | S3, S3 Control | 2, 2 | ✅ | | `hash-stream-node` | 102 | S3, S3 Control | 2, 2 | ✅ | | `md5-js` | 222 | S3, S3 Control, SQS | 3, 3 | ✅ | | `chunked-blob-reader` | 18 | Supports hash-blob-browser | 0, 3 | ✅ | | `chunked-blob-reader-native` | 47 | Supports hash-blob-browser | 0, 2 | ✅ | ## Stay external | Package | LoC | Description/Rationale | Clients | Status | | ---------------------------------------- | ---- | ----------------------------- | -------- | ------------------------------ | | `types` | 4666 | Root of dependency graph | 425, 425 | ✅ | | `core` | 6761 | -- | 425, 425 | ✅ | | `signature-v4` | 1425 | Not all clients need signing | 0, 425 | ✅ | | `signature-v4a` | 9906 | Very large, optional | 0, 0 | ✅ | | `node-http-handler` | 1600 | Platform-specific, large | 425, 425 | ✅ | | `fetch-http-handler` | 329 | Platform-specific | 425, 425 | ✅ | | `middleware-compression` | 360 | Cloudwatch PutMetricData only | 1, 1 | ✅ | | `middleware-apply-body-checksum` | 104 | S3 Control only | 1, 1 | ✅ | | `credential-provider-imds` | 682 | AWS-specific, optional | 0, 425 | ✅ | | `experimental-identity-and-auth` | 876 | Experimental | 0, 0 | ✅ unused | | `abort-controller` | 70 | Standalone | 0, 0 | ✅ optional, deprecated add-on | | `typecheck` | 234 | Small utility | 0, 0 | ✅ optional add-on | | `snapshot-testing` | 1468 | Dev/test tooling | 31, 31 | ✅ devtool | | `service-client-documentation-generator` | 214 | Codegen tooling | 0, 0 | ✅ devtool | ================================================ FILE: packages/core/planning/consolidation_checklist.md ================================================ # Consolidation checklist For each group of packages being consolidated into a `@smithy/core` submodule: ## Source migration - [ ] Copy source files (excluding barrel `index.ts`) into `core/src/submodules///`. - [ ] Use explicit named exports in the submodule's canonical `index.ts` — no `export *`. - [ ] Do not create intermediate barrel `index.ts` files in sub-folders; export directly from source files. - [ ] Fix internal imports within copied files (e.g. `@smithy/protocol-http` → relative path within the submodule). - [ ] Cross-submodule imports must use `@smithy/core/`, not relative paths (lint enforces this). - [ ] If a dependency would create a cycle, inline the needed functions locally. - [ ] Save `CHANGELOG.md` as contextual artifacts alongside the new source folder. - [ ] Add consolidation notice to the top of each new changelog file. - [ ] For Node-only modules (e.g. `hash-node`), mark them as `false` in `browser` and `react-native` fields. - [ ] When merging platform-specific packages (e.g. `util-defaults-mode-browser` + `util-defaults-mode-node`), use `.browser.ts` and `.native.ts` variants in a single directory. ## Old package cleanup - [ ] Delete README.md, CHANGELOG.md, all source files, and all test files in the old `packages/` folder. - [ ] Delete all dependencies and browser/react-native replacement metadata in package.json. - [ ] Remove `typesVersions` metadata from package.json. - [ ] Preserve only the build, clean, and stage-release NPM scripts. - [ ] Take a dependency on `@smithy/core`. - [ ] Re-export from `@smithy/core` every symbol that was previously exported for backwards compatibility. - [ ] Delete leftover sub-directory barrel files (e.g. `src/endpointsConfig/index.ts`) — only `src/index.ts` should remain. ## Dependency updates (TypeScript) - [ ] Remove the old package from `dependencies` in all `packages/*/package.json` and `private/*/package.json`. - [ ] Add `@smithy/core` as a dependency where not already present. - [ ] Do not add `@smithy/core` as a dependency to packages that core itself depends on (creates a cycle). - [ ] If a package in core's dependency chain has a type-only import from a consolidated package, inline the type to break the cycle. - [ ] Remove the old package from `core/package.json` dependencies. - [ ] Add any new transitive dependencies to `core/package.json` (e.g. `@smithy/util-buffer-from`). - [ ] Update all source imports (`from "@smithy/old-package"` → `from "@smithy/core/"`). - [ ] Update `vi.mock()` paths in test files to match the new import paths. This includes mocks of the old package name (e.g. `vi.mock("@smithy/old-package")` → `vi.mock("@smithy/core/")`) and mocks of relative paths that changed due to file relocation. - [ ] Don't forget `smithy-typescript-ssdk-libs/` packages. - [ ] Add the old package names to the banned imports list in `.eslintrc.js`, one group per submodule. ## Browser/React-Native field updates - [ ] Mark all Node-only files as `false` in the `browser` field of `core/package.json`. - [ ] Mark all Node-only files as `false` in the `react-native` field (both `dist-es` and `dist-cjs` entries). - [ ] For `.browser.ts` variants, add replacement entries in the `browser` field. - [ ] For `.native.ts` variants, add replacement entries in the `react-native` field (both `dist-es` and `dist-cjs`). - [ ] Ensure exports from `browser: false` files are not re-exported from other non-false files. Move such exports to a browser-safe file (e.g. `constants.ts`). - [ ] Browser spec tests (`*.browser.spec.ts`) must import explicitly from the `.browser.ts` variant file, not the default — vitest does not resolve the `browser` field. ## Dependency updates (Java codegen) - [ ] Move (don't delete) `TypeScriptDependency` enum values in the deprecated group at the end of the enum. - [ ] Update all `addImport` call sites to `addImportSubmodule` with `SMITHY_CORE` + `SmithyCoreSubmodules.`. - [ ] Update all `addTypeImport` call sites to `addTypeImportSubmodule`. - [ ] Update all `addDependency(OLD)` to `addDependency(SMITHY_CORE)`. - [ ] Update `withConventions` calls to use `"@smithy/core/"` as the package name string. - [ ] For `ExtensionConfigurationInterface` implementations, override `submodule()` to return the submodule path. - [ ] Add new submodule constants to `SmithyCoreSubmodules.java`. - [ ] Update downstream codegen (e.g. `smithy-aws-typescript-codegen`) call sites. - [ ] Ensure serde symbols (e.g. `expectNonNull`, `parseEpochTimestamp`) route to `SERDE`, not `CLIENT`, even if they were previously imported from `smithy-client`. ## Verification - [ ] `make build` — Java codegen compiles and all tests pass. - [ ] `make generate-protocol-tests test-protocols` — regenerated private packages have correct deps and imports. - [ ] `yarn` — workspace resolution succeeds with no cyclic dependency errors from Turbo. - [ ] `yarn build` — all packages compile and build. Run this in the repo root, not just the changed packages. - [ ] `yarn test` — all unit tests pass. - [ ] `yarn test:integration` — includes bundler and browser tests. - [ ] `make bgt` — write the actual snapshot files. - [ ] `yarn lint` in `packages/core` — no cross-submodule relative import violations. - [ ] `api-snapshot` script snapshots submodule exports via `package.json` `exports` entries. ================================================ FILE: packages/core/protocols.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/protocols" { export * from "@smithy/core/dist-types/submodules/protocols/index.d"; } ================================================ FILE: packages/core/protocols.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/protocols/index.js"); ================================================ FILE: packages/core/retry.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ export * from "./dist-types/submodules/retry/index.d"; ================================================ FILE: packages/core/retry.js ================================================ /** * Do not edit: * This is a compatibility redirect for bundlers that do not support package.json exports field. */ module.exports = require("./dist-cjs/submodules/retry/index.js"); ================================================ FILE: packages/core/schema.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/schema" { export * from "@smithy/core/dist-types/submodules/schema/index.d"; } ================================================ FILE: packages/core/schema.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/schema/index.js"); ================================================ FILE: packages/core/scripts/cbor-perf.mjs ================================================ import { fromBase64, toBase64 } from "@smithy/util-base64"; import * as SmithyCbor from "../dist-cjs/submodules/cbor/index.js"; /** * Control the test data size with this scalar. */ const DATA_SCALAR = 5; const tests = [ { name: "string", data: (() => { const buffer = []; for (let i = 0; i < 3400 * DATA_SCALAR; ++i) { buffer[i] = Math.random() + ""; } return buffer.join("代码"); })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 9000 * DATA_SCALAR; ++i) { list[i] = "abcdefghijklmnopqrstuvwxyz"[(Math.random() * 26) | 0]; } return list; })(), run: false, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 900 * DATA_SCALAR; ++i) { list[i] = "string".repeat((Math.random() * 35) | 0); } return list; })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 6000 * DATA_SCALAR; ++i) { list[i] = Math.random() * 2 - 1; } return list; })(), run: false, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 6000 * DATA_SCALAR; ++i) { list[i] = Math.random() * 3.4e38; } return list; })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 6000 * DATA_SCALAR; ++i) { list[i] = Math.random() * Number.MAX_VALUE; } return list; })(), run: true, }, { name: "byte[]", data: (() => { const list = new Uint8Array(100000 * DATA_SCALAR); for (let i = 0; i < list.length; ++i) { list[i] = ((Math.random() * 20000) | 0) % 255; } return list; })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 17000 * DATA_SCALAR; ++i) { list[i] = ((Math.random() * 20000) | 0) - 10000; } return list; })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 10000 * DATA_SCALAR; ++i) { list[i] = Math.floor(Math.random() * 0x7fffffff * 2 - 0x7fffffff); } return list; })(), run: true, }, { name: "list", data: (() => { const list = []; for (let i = 0; i < 10000 * DATA_SCALAR; ++i) { list[i] = Math.floor(-18446744073709551615 + ((Math.random() * 2 * 18446744073709551615) | 0)); } return list; })(), run: true, }, { name: "map", data: (() => { const map = {}; for (let i = 0; i < 2000 * DATA_SCALAR; ++i) { map[i] = "abcdefg"[(Math.random() * 5.999) | 0]; } return map; })(), run: false, }, { name: "map", data: (() => { const map = {}; for (let i = 0; i < 324 * DATA_SCALAR; ++i) { map["key".repeat((Math.random() * 10) | 0) + i] = "key".repeat((Math.random() * 155) | 0) + i + Math.random(); } return map; })(), run: true, }, { name: "map", data: (() => { const map = {}; for (let i = 0; i < 324 * DATA_SCALAR; ++i) { map["key".repeat((Math.random() * 10) | 0) + i] = Math.floor(Math.random() * 0x7fffffff * 2 - 0x7fffffff); } return map; })(), run: true, }, { name: "list PutMetricData-like", data: (() => { const collection = []; for (let i = 0; i < 600 * DATA_SCALAR; ++i) { collection[i] = { MetricData: [ { MetricName: "PAGES_VISITED", Dimensions: [ { Name: "UNIQUE_PAGES", Value: "URLS", }, ], Unit: "None", Value: 1.0, }, ], Namespace: "SITE/TRAFFIC", }; } return collection; })(), run: true, }, ]; const { cbor } = SmithyCbor; cbor.resizeEncodingBuffer(10_000_000); const SCALE = (3 * 100) / DATA_SCALAR; class Row { constructor(data) { Object.assign(this, data); } } const rows = {}; for (const { name, data, run, nonScaling } of tests) { if (!run) { continue; } const scale = nonScaling ? 1 : SCALE; const A = performance.now(); let cborSerialized; { for (let i = 0; i < scale; ++i) { cborSerialized = cbor.serialize(data); } } const B = performance.now(); let cborDeserialized; { for (let i = 0; i < scale; ++i) { cborDeserialized = cbor.deserialize(cborSerialized); } } const C = performance.now(); const D = performance.now(); const E = performance.now(); const F = performance.now(); const G = performance.now(); let jsonSerialized; { for (let i = 0; i < scale; ++i) { if (name === "byte[]") { jsonSerialized = JSON.stringify(toBase64(data)); } else { jsonSerialized = JSON.stringify(data); } } } const H = performance.now(); let jsonDeserialized; { for (let i = 0; i < scale; ++i) { if (name === "byte[]") { jsonDeserialized = fromBase64(JSON.parse(jsonSerialized)); } else { jsonDeserialized = JSON.parse(jsonSerialized); } } } const I = performance.now(); const bytes = cborSerialized.byteLength; const megabytes = (cborSerialized.byteLength * scale) / 1_000_000; const num_fmt = (ms) => ((megabytes / ms) * 1000).toFixed(0) + "mb/s"; const jsonBytes = Buffer.from(jsonSerialized).byteLength; process.stdout.write("."); rows[name] = new Row({ workload: `${(bytes < 1e6 ? bytes / 1e3 : bytes / 1e6).toFixed(0)}${bytes < 1e6 ? "kb" : "mb"} x ${scale}`, cbor: ((bytes * scale) / 1e6).toFixed(0) + "mb", json: ((jsonBytes * scale) / 1e6).toFixed(0) + "mb", cbor_serde: [B - A, C - B].map(num_fmt).join(", "), json_serde: [H - G, I - H].map(num_fmt).join(", "), "cbor relative performance": [ (((H - G) / (B - A)) * 100).toFixed(0) + "% ->", "<- " + (((I - H) / (C - B)) * 100).toFixed(0) + "%", ((bytes / jsonBytes) * 100).toFixed(0) + "% payload", ].join(", "), }); } console.log(""); console.table(rows); ================================================ FILE: packages/core/scripts/lint.js ================================================ const fs = require("fs"); const path = require("path"); const root = path.join(__dirname, ".."); const pkgJson = require(path.join(root, "package.json")); const tsconfigs = { cjs: require(path.join(root, "tsconfig.cjs.json")), es: require(path.join(root, "tsconfig.es.json")), types: require(path.join(root, "tsconfig.types.json")), }; const submodules = fs.readdirSync(path.join(root, "src", "submodules")); const errors = []; for (const submodule of submodules) { const submodulePath = path.join(root, "src", "submodules", submodule); if (fs.existsSync(submodulePath) && fs.lstatSync(submodulePath).isDirectory()) { // package.json metadata. if (!pkgJson.exports[`./${submodule}`]) { errors.push(`${submodule} submodule is missing exports statement in package.json`); pkgJson.exports[`./${submodule}`] = { types: `./dist-types/submodules/${submodule}/index.d.ts`, module: `./dist-es/submodules/${submodule}/index.js`, node: `./dist-cjs/submodules/${submodule}/index.js`, import: `./dist-es/submodules/${submodule}/index.js`, require: `./dist-cjs/submodules/${submodule}/index.js`, }; fs.writeFileSync(path.join(root, "package.json"), JSON.stringify(pkgJson, null, 2) + "\n"); } if (!pkgJson.files.includes(`./${submodule}.js`) || !pkgJson.files.includes(`./${submodule}.d.ts`)) { pkgJson.files.push(`./${submodule}.js`); pkgJson.files.push(`./${submodule}.d.ts`); errors.push(`package.json files array missing ${submodule}.js compatibility redirect file.`); pkgJson.files = [...new Set(pkgJson.files)].sort(); fs.writeFileSync(path.join(root, "package.json"), JSON.stringify(pkgJson, null, 2) + "\n"); } // tsconfig metadata. for (const [kind, tsconfig] of Object.entries(tsconfigs)) { if (!tsconfig.compilerOptions.paths?.[`@smithy/core/${submodule}`]) { errors.push(`${submodule} submodule is missing paths entry in tsconfig.${kind}.json`); tsconfig.compilerOptions.paths[`@smithy/core/${submodule}`] = [`./src/submodules/${submodule}/index.ts`]; fs.writeFileSync(path.join(root, `tsconfig.${kind}.json`), JSON.stringify(tsconfig, null, 2) + "\n"); } } // compatibility redirect file. const compatibilityRedirectFile = path.join(root, `${submodule}.js`); if (!fs.existsSync(compatibilityRedirectFile)) { errors.push(`${submodule} is missing compatibility redirect file in the package root folder.`); fs.writeFileSync( compatibilityRedirectFile, ` /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/${submodule}/index.js"); ` ); } // compatibility types file. const compatibilityTypesFile = path.join(root, `${submodule}.d.ts`); if (!fs.existsSync(compatibilityTypesFile)) { errors.push(`${submodule} is missing compatibility types file in the package root folder.`); fs.writeFileSync( compatibilityTypesFile, ` /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/${submodule}" { export * from "@smithy/core/dist-types/submodules/${submodule}/index.d"; } ` ); } } } /** * Check that submodules with .browser.ts or .native.ts files have corresponding index variant files. */ for (const submodule of submodules) { const submodulePath = path.join(root, "src", "submodules", submodule); if (!fs.lstatSync(submodulePath).isDirectory()) continue; let hasBrowserVariant = false; let hasNativeVariant = false; const scanDir = (dir) => { for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { if (entry.isDirectory()) { scanDir(path.join(dir, entry.name)); } else if (!entry.name.includes(".spec.") && !entry.name.includes(".integ.")) { if (entry.name.endsWith(".browser.ts")) hasBrowserVariant = true; if (entry.name.endsWith(".native.ts")) hasNativeVariant = true; } } }; scanDir(submodulePath); if (hasBrowserVariant && !fs.existsSync(path.join(submodulePath, "index.browser.ts"))) { errors.push(`${submodule} has .browser.ts variant files but is missing index.browser.ts`); } if (hasNativeVariant && !fs.existsSync(path.join(submodulePath, "index.native.ts"))) { errors.push(`${submodule} has .native.ts variant files but is missing index.native.ts`); } } /** * Check for cross-submodule relative imports. */ const walk = require("../../../scripts/utils/walk"); (async () => { for await (const item of walk(path.join(root, "src", "submodules"))) { // depth within the submodule where 1 is at the root of the submodule. const depth = item.split("core/src/submodules/")[1].split("/").length - 1; const sourceCode = fs.readFileSync(item, "utf-8"); const relativeImports = []; relativeImports.push( ...new Set( [...(sourceCode.toString().match(/(from |import\()"(.*?)";/g) || [])] .map((_) => _.replace(/from "/g, "").replace(/";$/, "")) .filter((_) => _.startsWith(".")) ) ); for (const i of relativeImports) { const relativeImportDepth = i.split("..").length - 1; if (relativeImportDepth >= depth) { errors.push( `relative import ${i} in ${item .split("packages/") .pop()} crosses submodule boundaries. Use @scope/package/submodule import instead.` ); } } const subModuleImports = [ ...new Set( (sourceCode.toString().match(/(from |import\()"\@smithy\/core\/(.*?)";/g) || []).map( (_) => _.match(/@smithy\/core\/(.*?)"/)[1] ) ), ]; const ownModule = item.match(/src\/submodules\/(.*?)\//)?.[1]; if (subModuleImports.includes(ownModule)) { errors.push(`self-referencing submodule import found in ${item}`); } } })().then(() => { if (errors.length) { throw new Error(errors.join("\n")); } }); ================================================ FILE: packages/core/serde.d.ts ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ declare module "@smithy/core/serde" { export * from "@smithy/core/dist-types/submodules/serde/index.d"; } ================================================ FILE: packages/core/serde.js ================================================ /** * Do not edit: * This is a compatibility redirect for contexts that do not understand package.json exports field. */ module.exports = require("./dist-cjs/submodules/serde/index.js"); ================================================ FILE: packages/core/src/core.integ.spec.ts ================================================ import { SmithyRpcV2CborProtocol, cbor } from "@smithy/core/cbor"; import type { HttpProtocol } from "@smithy/core/protocols"; import { HttpResponse } from "@smithy/protocol-http"; import { RpcV2ProtocolClient } from "@smithy/smithy-rpcv2-cbor-schema"; import { requireRequestsFrom } from "@smithy/util-test/src"; import { describe, expect, test as it } from "vitest"; import { GetNumbersCommand, XYZService, type GetNumbersCommandOutput } from "xyz-schema"; import { NumericValue } from "./submodules/serde"; describe("@smithy/core", () => { it("should normalize the config.protocol field", () => { const withInstance = new RpcV2ProtocolClient({ endpoint: "https://localhost", protocol: new SmithyRpcV2CborProtocol({ defaultNamespace: "smithy.protocoltests.rpcv2Cbor", }), }); expect(withInstance.config.protocol).toBeInstanceOf(SmithyRpcV2CborProtocol); expect((withInstance.config.protocol as HttpProtocol).options.defaultNamespace).toEqual( "smithy.protocoltests.rpcv2Cbor" ); const withCtor = new RpcV2ProtocolClient({ endpoint: "https://localhost", protocol: SmithyRpcV2CborProtocol, }); expect(withCtor.config.protocol).toBeInstanceOf(SmithyRpcV2CborProtocol); expect((withCtor.config.protocol as HttpProtocol).options.defaultNamespace).toEqual( "smithy.protocoltests.rpcv2Cbor" ); const withSettings = new RpcV2ProtocolClient({ endpoint: "https://localhost", protocolSettings: { defaultNamespace: "ns", }, }); expect(withCtor.config.protocol).toBeInstanceOf(SmithyRpcV2CborProtocol); expect((withSettings.config.protocol as HttpProtocol).options.defaultNamespace).toEqual("ns"); }); }); describe("endpoint headers", () => { it("should apply endpoint-resolved headers to the outgoing request", async () => { const xyz = new XYZService({ endpoint: { url: new URL("https://localhost"), headers: { "x-custom-header": ["value1", "value2"], }, }, apiKey: async () => ({ apiKey: "my-api-key" }), }); requireRequestsFrom(xyz).toMatch({ hostname: "localhost", headers: { "x-custom-header": "value1, value2", }, }); await xyz.send(new GetNumbersCommand({})); expect.assertions(2); }); }); describe("aggregated clients", () => { it("should contain paginator and waiter methods", async () => { const xyz = new XYZService({ endpoint: `https://localhost`, apiKey: async () => ({ apiKey: "test-key" }) }); expect(xyz.paginateGetNumbers).toBeInstanceOf(Function); expect(xyz.waitUntilNumbersAligned).toBeInstanceOf(Function); const testHandler = requireRequestsFrom(xyz).toMatch({ hostname: /^localhost$/, }); for (const i of [0, 1, 2, 3, 4, 5, 6]) { testHandler.respondWith( new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({ bigInteger: BigInt("123"), bigDecimal: new NumericValue("123.456", "bigDecimal"), numbers: [1, 2, 3], nextToken: "nextToken" + i, } as GetNumbersCommandOutput), }) ); } testHandler.respondWith( new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({} as GetNumbersCommandOutput), }), new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 400, body: cbor.serialize({ __type: "firstError", }), }), new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 400, body: cbor.serialize({ __type: "secondError", }), }), new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({ __type: "finalAwaited", }), }) ); // all args optional for await (const page of xyz.paginateGetNumbers()) { if (page.nextToken === "nextToken3") { break; } } for await (const page of xyz.paginateGetNumbers( { startToken: "token", maxResults: 10, bigDecimal: new NumericValue("0.0", "bigDecimal"), bigInteger: BigInt(100), }, { stopOnSameToken: true, withCommand(command: any) { return command; }, } )) { expect(page.$metadata).toBeDefined(); expect(page.bigInteger).toBeDefined(); expect(page.bigDecimal).toBeDefined(); expect(page.numbers?.[0]).toBeDefined(); expect(page.nextToken).toBeDefined(); if (page.nextToken === "nextToken6") { break; } } await xyz.waitUntilNumbersAligned( { bigInteger: BigInt(1), }, 120 ); const result = await xyz.waitUntilNumbersAligned({}, { maxWaitTime: 8, minDelay: 0.001, maxDelay: 0.01 }); expect(result.reason).toMatchObject({ __type: "finalAwaited", }); expect.assertions(29); }); }, 30_000); ================================================ FILE: packages/core/src/getSmithyContext.ts ================================================ import { SMITHY_CONTEXT_KEY, type HandlerExecutionContext } from "@smithy/types"; /** * @internal */ export const getSmithyContext = (context: HandlerExecutionContext): Record => context[SMITHY_CONTEXT_KEY] || (context[SMITHY_CONTEXT_KEY] = {}); ================================================ FILE: packages/core/src/index.ts ================================================ export * from "./getSmithyContext"; export * from "./middleware-http-auth-scheme"; export * from "./middleware-http-signing"; export * from "./normalizeProvider"; export { createPaginator } from "./pagination/createPaginator"; export * from "./request-builder/requestBuilder"; export * from "./setFeature"; export * from "./util-identity-and-auth"; ================================================ FILE: packages/core/src/middleware-http-auth-scheme/getHttpAuthSchemeEndpointRuleSetPlugin.ts ================================================ import type { HandlerExecutionContext, HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, IdentityProviderConfig, Pluggable, RelativeMiddlewareOptions, SerializeHandlerOptions, } from "@smithy/types"; import { httpAuthSchemeMiddleware, type PreviouslyResolved } from "./httpAuthSchemeMiddleware"; /** * @internal */ export const httpAuthSchemeEndpointRuleSetMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = { step: "serialize", tags: ["HTTP_AUTH_SCHEME"], name: "httpAuthSchemeMiddleware", override: true, relation: "before", toMiddleware: "endpointV2Middleware", }; /** * @internal */ interface HttpAuthSchemeEndpointRuleSetPluginOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ export const getHttpAuthSchemeEndpointRuleSetPlugin = < TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, >( config: TConfig & PreviouslyResolved, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }: HttpAuthSchemeEndpointRuleSetPluginOptions ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( httpAuthSchemeMiddleware(config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }), httpAuthSchemeEndpointRuleSetMiddlewareOptions ); }, }); ================================================ FILE: packages/core/src/middleware-http-auth-scheme/getHttpAuthSchemePlugin.ts ================================================ import type { HandlerExecutionContext, HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, IdentityProviderConfig, Pluggable, RelativeMiddlewareOptions, SerializeHandlerOptions, } from "@smithy/types"; import { httpAuthSchemeMiddleware, type PreviouslyResolved } from "./httpAuthSchemeMiddleware"; /** * @internal */ export const httpAuthSchemeMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = { step: "serialize", tags: ["HTTP_AUTH_SCHEME"], name: "httpAuthSchemeMiddleware", override: true, relation: "before", toMiddleware: "serializerMiddleware", }; /** * @internal */ interface HttpAuthSchemePluginOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ export const getHttpAuthSchemePlugin = < TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, >( config: TConfig & PreviouslyResolved, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }: HttpAuthSchemePluginOptions ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( httpAuthSchemeMiddleware(config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }), httpAuthSchemeMiddlewareOptions ); }, }); ================================================ FILE: packages/core/src/middleware-http-auth-scheme/httpAuthSchemeMiddleware.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import type { HandlerExecutionContext, HttpAuthScheme, HttpAuthSchemeId, HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, HttpAuthSchemeProvider, IdentityProviderConfig, Provider, SMITHY_CONTEXT_KEY, SelectedHttpAuthScheme, SerializeHandler, SerializeHandlerArguments, SerializeHandlerOutput, SerializeMiddleware, } from "@smithy/types"; import { resolveAuthOptions } from "./resolveAuthOptions"; /** * @internal */ export interface PreviouslyResolved { authSchemePreference?: Provider; httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: HttpAuthSchemeProvider; } /** * @internal */ interface HttpAuthSchemeMiddlewareOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ interface HttpAuthSchemeMiddlewareSmithyContext extends Record { selectedHttpAuthScheme?: SelectedHttpAuthScheme; } /** * @internal */ interface HttpAuthSchemeMiddlewareHandlerExecutionContext extends HandlerExecutionContext { [SMITHY_CONTEXT_KEY]?: HttpAuthSchemeMiddlewareSmithyContext; } /** * Later HttpAuthSchemes with the same HttpAuthSchemeId will overwrite previous ones. * * @internal */ function convertHttpAuthSchemesToMap(httpAuthSchemes: HttpAuthScheme[]): Map { const map = new Map(); for (const scheme of httpAuthSchemes) { map.set(scheme.schemeId, scheme); } return map; } /** * @internal */ export const httpAuthSchemeMiddleware = < TInput extends object, Output extends object, TConfig extends object, TContext extends HttpAuthSchemeMiddlewareHandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, >( config: TConfig & PreviouslyResolved, mwOptions: HttpAuthSchemeMiddlewareOptions ): SerializeMiddleware => ( next: SerializeHandler, context: HttpAuthSchemeMiddlewareHandlerExecutionContext ): SerializeHandler => async (args: SerializeHandlerArguments): Promise> => { const options = config.httpAuthSchemeProvider( await mwOptions.httpAuthSchemeParametersProvider(config, context as TContext, args.input) ); const authSchemePreference = config.authSchemePreference ? await config.authSchemePreference() : []; const resolvedOptions = resolveAuthOptions(options, authSchemePreference); const authSchemes = convertHttpAuthSchemesToMap(config.httpAuthSchemes); const smithyContext: HttpAuthSchemeMiddlewareSmithyContext = getSmithyContext(context); const failureReasons = []; for (const option of resolvedOptions) { const scheme = authSchemes.get(option.schemeId); if (!scheme) { failureReasons.push(`HttpAuthScheme \`${option.schemeId}\` was not enabled for this service.`); continue; } const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config)); if (!identityProvider) { failureReasons.push(`HttpAuthScheme \`${option.schemeId}\` did not have an IdentityProvider configured.`); continue; } const { identityProperties = {}, signingProperties = {} } = option.propertiesExtractor?.(config, context) || {}; option.identityProperties = Object.assign(option.identityProperties || {}, identityProperties); option.signingProperties = Object.assign(option.signingProperties || {}, signingProperties); smithyContext.selectedHttpAuthScheme = { httpAuthOption: option, identity: await identityProvider(option.identityProperties), signer: scheme.signer, }; break; } if (!smithyContext.selectedHttpAuthScheme) { throw new Error(failureReasons.join("\n")); } return next(args); }; ================================================ FILE: packages/core/src/middleware-http-auth-scheme/index.ts ================================================ export * from "./httpAuthSchemeMiddleware"; export * from "./getHttpAuthSchemeEndpointRuleSetPlugin"; export * from "./getHttpAuthSchemePlugin"; ================================================ FILE: packages/core/src/middleware-http-auth-scheme/resolveAuthOptions.spec.ts ================================================ import type { HttpAuthOption } from "@smithy/types"; import { describe, expect, it } from "vitest"; import { resolveAuthOptions } from "./resolveAuthOptions"; describe("resolveAuthSchemes", () => { const sigv4 = "sigv4"; const sigv4a = "sigv4a"; const mockSigV4AuthScheme = { schemeId: `aws.auth#${sigv4}` } as HttpAuthOption; const mockSigV4aAuthScheme = { schemeId: `aws.auth#${sigv4a}` } as HttpAuthOption; it("should return candidate auth schemes is preference list is not available", () => { const candidateAuthSchemes = [mockSigV4AuthScheme, mockSigV4aAuthScheme]; expect(resolveAuthOptions(candidateAuthSchemes, [])).toEqual(candidateAuthSchemes); // @ts-expect-error case where callee incorrectly passes undefined expect(resolveAuthOptions(candidateAuthSchemes)).toEqual(candidateAuthSchemes); }); it("should return auth scheme from preference if it's available", () => { expect(resolveAuthOptions([mockSigV4AuthScheme, mockSigV4aAuthScheme], [sigv4a])).toEqual([ mockSigV4aAuthScheme, mockSigV4AuthScheme, ]); expect(resolveAuthOptions([mockSigV4AuthScheme, mockSigV4aAuthScheme], [sigv4a, sigv4])).toEqual([ mockSigV4aAuthScheme, mockSigV4AuthScheme, ]); expect(resolveAuthOptions([mockSigV4AuthScheme, mockSigV4aAuthScheme], [sigv4, sigv4a])).toEqual([ mockSigV4AuthScheme, mockSigV4aAuthScheme, ]); }); it("should ignore auth scheme from preference if it's not available", () => { expect(resolveAuthOptions([mockSigV4AuthScheme], [sigv4a])).toEqual([mockSigV4AuthScheme]); expect(resolveAuthOptions([mockSigV4AuthScheme], ["sigv3"])).toEqual([mockSigV4AuthScheme]); }); }); ================================================ FILE: packages/core/src/middleware-http-auth-scheme/resolveAuthOptions.ts ================================================ import type { HttpAuthOption } from "@smithy/types"; /** * Resolves list of auth options based on the supported ones, vs the preference list. * * @param candidateAuthOptions list of supported auth options selected by the standard * resolution process (model-based, endpoints 2.0, etc.) * @param authSchemePreference list of auth schemes preferred by user. * @returns */ export const resolveAuthOptions = ( candidateAuthOptions: HttpAuthOption[], authSchemePreference: string[] ): HttpAuthOption[] => { if (!authSchemePreference || authSchemePreference.length === 0) { return candidateAuthOptions; } // reprioritize candidates based on user's preference const preferredAuthOptions = []; for (const preferredSchemeName of authSchemePreference) { for (const candidateAuthOption of candidateAuthOptions) { const candidateAuthSchemeName = candidateAuthOption.schemeId.split("#")[1]; if (candidateAuthSchemeName === preferredSchemeName) { preferredAuthOptions.push(candidateAuthOption); } } } // add any remaining candidates that weren't in the preference list for (const candidateAuthOption of candidateAuthOptions) { if (!preferredAuthOptions.find(({ schemeId }) => schemeId === candidateAuthOption.schemeId)) { preferredAuthOptions.push(candidateAuthOption); } } return preferredAuthOptions; }; ================================================ FILE: packages/core/src/middleware-http-signing/getHttpSigningMiddleware.ts ================================================ import type { FinalizeRequestHandlerOptions, Pluggable, RelativeMiddlewareOptions } from "@smithy/types"; import { httpSigningMiddleware } from "./httpSigningMiddleware"; /** * @internal */ export const httpSigningMiddlewareOptions: FinalizeRequestHandlerOptions & RelativeMiddlewareOptions = { step: "finalizeRequest", tags: ["HTTP_SIGNING"], name: "httpSigningMiddleware", aliases: ["apiKeyMiddleware", "tokenMiddleware", "awsAuthMiddleware"], override: true, relation: "after", toMiddleware: "retryMiddleware", }; /** * @internal */ export const getHttpSigningPlugin = ( config: object ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(httpSigningMiddleware(config), httpSigningMiddlewareOptions); }, }); ================================================ FILE: packages/core/src/middleware-http-signing/httpSigningMiddleware.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { getSmithyContext } from "@smithy/core/client"; import { HttpRequest } from "@smithy/core/protocols"; import type { ErrorHandler, FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, FinalizeRequestMiddleware, HandlerExecutionContext, SMITHY_CONTEXT_KEY, SelectedHttpAuthScheme, SuccessHandler, } from "@smithy/types"; /** * @internal */ interface HttpSigningMiddlewareSmithyContext extends Record { selectedHttpAuthScheme?: SelectedHttpAuthScheme; } /** * @internal */ interface HttpSigningMiddlewareHandlerExecutionContext extends HandlerExecutionContext { [SMITHY_CONTEXT_KEY]?: HttpSigningMiddlewareSmithyContext; } const defaultErrorHandler: ErrorHandler = (signingProperties) => (error) => { throw error; }; const defaultSuccessHandler: SuccessHandler = ( httpResponse: unknown, signingProperties: Record ): void => {}; /** * @internal */ export const httpSigningMiddleware = (config: object): FinalizeRequestMiddleware => ( next: FinalizeHandler, context: HttpSigningMiddlewareHandlerExecutionContext ): FinalizeHandler => async (args: FinalizeHandlerArguments): Promise> => { if (!HttpRequest.isInstance(args.request)) { return next(args); } const smithyContext: HttpSigningMiddlewareSmithyContext = getSmithyContext(context); const scheme = smithyContext.selectedHttpAuthScheme; if (!scheme) { throw new Error(`No HttpAuthScheme was selected: unable to sign request`); } const { httpAuthOption: { signingProperties = {} }, identity, signer, } = scheme; const output = await next({ ...args, request: await signer.sign(args.request, identity, signingProperties), }).catch((signer.errorHandler || defaultErrorHandler)(signingProperties)); (signer.successHandler || defaultSuccessHandler)(output.response, signingProperties); return output; }; ================================================ FILE: packages/core/src/middleware-http-signing/index.ts ================================================ export * from "./httpSigningMiddleware"; export * from "./getHttpSigningMiddleware"; ================================================ FILE: packages/core/src/normalizeProvider.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { normalizeProvider } from "./normalizeProvider"; describe(normalizeProvider.name, () => { const testCases = [ true, // boolean null, // null undefined, // undefined 1, // number "", // string {}, // object ]; it.each(testCases)("returns Provider if value is not a function: %s", async (value) => { const output = normalizeProvider(value); expect(await output()).toEqual(value); }); it.each(testCases)("returns Provider if value if a function which returns %s", (value) => { const mockValueProvider = () => Promise.resolve(value); expect(normalizeProvider(mockValueProvider)).toBe(mockValueProvider); }); }); ================================================ FILE: packages/core/src/normalizeProvider.ts ================================================ import type { Provider } from "@smithy/types"; /** * @internal * * @returns a provider function for the input value if it isn't already one. */ export const normalizeProvider = (input: T | Provider): Provider => { if (typeof input === "function") return input as Provider; const promisified = Promise.resolve(input); return () => promisified; }; ================================================ FILE: packages/core/src/pagination/createPaginator.spec.ts ================================================ import type { PaginationConfiguration } from "@smithy/types"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { createPaginator } from "./createPaginator"; describe(createPaginator.name, () => { class Client { private pages = 5; async send() { if (--this.pages > 0) { return { outToken: { outToken2: { outToken3: "TOKEN_VALUE", }, }, }; } return {}; } } class CommandObjectToken { public middlewareStack = { add: vi.fn(), addRelativeTo: vi.fn(), }; public constructor(public input: any) { expect(input).toEqual({ sizeToken: 100, inToken: { outToken2: { outToken3: "TOKEN_VALUE", }, }, }); } } class ClientStringToken { private pages = 5; async send(command: any) { if (--this.pages > 0) { return { outToken: command.input.inToken, }; } return {}; } } class CommandStringToken { public middlewareStack = { add: vi.fn(), addRelativeTo: vi.fn(), }; public constructor(public input: any) { expect(input).toEqual({ sizeToken: 100, inToken: "TOKEN_VALUE", }); } } afterEach(() => { vi.resetAllMocks(); }); it("should create a paginator", async () => { const paginate = createPaginator( Client, CommandObjectToken, "inToken", "outToken", "sizeToken" ); let pages = 0; for await (const page of paginate( { client: new Client() as any, pageSize: 100, startingToken: { outToken2: { outToken3: "TOKEN_VALUE", }, }, }, {} )) { pages += 1; if (pages === 5) { expect(page.outToken).toBeUndefined(); } else { expect(page.outToken).toEqual({ outToken2: { outToken3: "TOKEN_VALUE", }, }); } } expect(pages).toEqual(5); }); it("should prioritize token set in paginator config, fallback to token set in input parameters", async () => { class CommandExpectPaginatorConfigToken { public constructor(public input: any) { expect(input).toMatchObject({ inToken: "abc", }); } } class CommandExpectOperationInputToken { public constructor(public input: any) { expect(input).toMatchObject({ inToken: "xyz", }); } } { const paginate = createPaginator< PaginationConfiguration, { inToken?: string; sizeToken?: number }, { outToken: string } >(ClientStringToken, CommandExpectPaginatorConfigToken, "inToken", "outToken", "sizeToken"); let pages = 0; const client = new ClientStringToken() as any; for await (const page of paginate( { client, startingToken: "abc", }, { inToken: "xyz", } )) { pages += 1; expect(page).toBeDefined(); } expect(pages).toEqual(5); } { const paginate = createPaginator< PaginationConfiguration, { inToken?: string; sizeToken?: number }, { outToken: string } >(ClientStringToken, CommandExpectOperationInputToken, "inToken", "outToken", "sizeToken"); let pages = 0; const client = new ClientStringToken() as any; for await (const page of paginate( { client, }, { inToken: "xyz", } )) { pages += 1; expect(page).toBeDefined(); } expect(pages).toEqual(5); } }); it("should prioritize page size set in operation input, fallback to page size set in paginator config (inverted from token priority)", async () => { class CommandExpectPaginatorPageSize { public constructor(public input: any) { expect(input).toMatchObject({ sizeToken: 100, }); } } class CommandExpectOperationInputPageSize { public constructor(public input: any) { expect(input).toMatchObject({ sizeToken: 99, }); } } { const paginate = createPaginator< PaginationConfiguration, { inToken?: string; sizeToken?: number }, { outToken: string } >(ClientStringToken, CommandExpectPaginatorPageSize, "inToken", "outToken", "sizeToken"); let pages = 0; const client = new ClientStringToken() as any; for await (const page of paginate( { client, pageSize: 100, }, { inToken: "abc", } )) { pages += 1; expect(page).toBeDefined(); } expect(pages).toEqual(5); } { const paginate = createPaginator< PaginationConfiguration, { inToken?: string; sizeToken?: number }, { outToken: string } >(ClientStringToken, CommandExpectOperationInputPageSize, "inToken", "outToken", "sizeToken"); let pages = 0; const client = new ClientStringToken() as any; for await (const page of paginate( { client, pageSize: 100, }, { sizeToken: 99, inToken: "abc", } )) { pages += 1; expect(page).toBeDefined(); } expect(pages).toEqual(5); } }); it("should have the correct AsyncGenerator.TNext type", async () => { const paginate = createPaginator< PaginationConfiguration, { inToken?: string; sizeToken: number }, { outToken: string; } >(ClientStringToken, CommandStringToken, "inToken", "outToken.outToken2.outToken3", "sizeToken"); const asyncGenerator = paginate( { client: new ClientStringToken() as any }, { inToken: "TOKEN_VALUE", sizeToken: 100 } ); const { value, done } = await asyncGenerator.next(); expect(value?.outToken).toBeTypeOf("string"); expect(done).toBe(false); }); it("should handle deep paths", async () => { const paginate = createPaginator< PaginationConfiguration, { inToken?: string }, { outToken: { outToken2: { outToken3: string; }; }; } >(Client, CommandStringToken, "inToken", "outToken.outToken2.outToken3", "sizeToken"); let pages = 0; for await (const page of paginate( { client: new Client() as any, pageSize: 100, startingToken: "TOKEN_VALUE", }, {} )) { pages += 1; if (pages === 5) { expect(page.outToken).toBeUndefined(); } else { expect(page.outToken.outToken2.outToken3).toEqual("TOKEN_VALUE"); } } expect(pages).toEqual(5); }); it("should allow modification of the instantiated command", async () => { const paginate = createPaginator( Client, CommandObjectToken, "inToken", "outToken", "sizeToken" ); let pages = 0; const client: any = new Client(); vi.spyOn(client, "send"); const config = { client, pageSize: 100, startingToken: { outToken2: { outToken3: "TOKEN_VALUE", }, }, withCommand(command) { command.middlewareStack.add((next) => (args) => next(args)); command.middlewareStack.addRelativeTo((next: any) => (args: any) => next(args), { toMiddleware: "", relation: "before", }); expect(command.middlewareStack.add).toHaveBeenCalledTimes(1); expect(command.middlewareStack.addRelativeTo).toHaveBeenCalledTimes(1); return command; }, } as Parameters[0]; vi.spyOn(config, "withCommand"); for await (const page of paginate(config, {})) { pages += 1; if (pages === 5) { expect(page.outToken).toBeUndefined(); } else { expect(page.outToken).toEqual({ outToken2: { outToken3: "TOKEN_VALUE", }, }); } } expect(pages).toEqual(5); expect(client.send).toHaveBeenCalledTimes(5); expect(config.withCommand).toHaveBeenCalledTimes(5); expect(config.withCommand).toHaveBeenCalledWith(expect.any(CommandObjectToken)); }); }); ================================================ FILE: packages/core/src/pagination/createPaginator.ts ================================================ import type { Client, Command, PaginationConfiguration, Paginator } from "@smithy/types"; /** * @internal */ const makePagedClientRequest = async , InputType, OutputType>( CommandCtor: any, client: ClientType, input: InputType, withCommand: (command: Command) => typeof command | undefined = (_) => _, ...args: any[] ): Promise => { let command = new CommandCtor(input); command = withCommand(command) ?? command; return await client.send(command, ...args); }; /** * Creates a paginator. * * @internal */ export function createPaginator< PaginationConfigType extends PaginationConfiguration, InputType extends object, OutputType extends object, >( ClientCtor: any, CommandCtor: any, inputTokenName: string, outputTokenName: string, pageSizeTokenName?: string ): (config: PaginationConfigType, input: InputType, ...additionalArguments: any[]) => Paginator { return async function* paginateOperation( config: PaginationConfigType, input: InputType, ...additionalArguments: any[] ): Paginator { const _input = input as any; // for legacy reasons this coalescing order is inverted from that of pageSize. let token: any = config.startingToken ?? _input[inputTokenName]; let hasNext = true; let page: OutputType; while (hasNext) { _input[inputTokenName] = token; if (pageSizeTokenName) { _input[pageSizeTokenName] = _input[pageSizeTokenName] ?? config.pageSize; } if (config.client instanceof ClientCtor) { page = await makePagedClientRequest( CommandCtor, config.client, input, config.withCommand, ...additionalArguments ); } else { throw new Error(`Invalid client, expected instance of ${ClientCtor.name}`); } yield page; const prevToken = token; token = get(page, outputTokenName); hasNext = !!(token && (!config.stopOnSameToken || token !== prevToken)); } return undefined; }; } /** * @internal */ const get = (fromObject: any, path: string): any => { let cursor = fromObject; const pathComponents = path.split("."); for (const step of pathComponents) { if (!cursor || typeof cursor !== "object") { return undefined; } cursor = cursor[step]; } return cursor; }; ================================================ FILE: packages/core/src/request-builder/requestBuilder.ts ================================================ /** * Backwards compatibility re-export. * * @internal */ export { requestBuilder } from "@smithy/core/protocols"; ================================================ FILE: packages/core/src/setFeature.spec.ts ================================================ import type { HandlerExecutionContext } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { setFeature } from "./setFeature"; describe(setFeature.name, () => { it("creates the context object path if needed", () => { const context: HandlerExecutionContext = {}; setFeature(context, "RETRY_MODE_STANDARD", "E"); expect(context).toEqual({ __smithy_context: { features: { RETRY_MODE_STANDARD: "E", }, }, }); }); }); ================================================ FILE: packages/core/src/setFeature.ts ================================================ import type { HandlerExecutionContext, SmithyFeatures } from "@smithy/types"; /** * Indicates to the request context that a given feature is active. * specification asks the library not to include a runtime lookup of all * the feature identifiers. * * @internal * @param context - handler execution context. * @param feature - readable name of feature. * @param value - encoding value of feature. This is required because the */ export function setFeature( context: HandlerExecutionContext, feature: F, value: SmithyFeatures[F] ) { if (!context.__smithy_context) { context.__smithy_context = { features: {}, }; } else if (!context.__smithy_context.features) { context.__smithy_context.features = {}; } context.__smithy_context.features![feature] = value; } ================================================ FILE: packages/core/src/submodules/cbor/CborCodec.spec.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import { nv } from "@smithy/core/serde"; import type { BigDecimalSchema, StaticSimpleSchema, StaticStructureSchema, StaticUnionSchema, StringSchema, TimestampDefaultSchema, } from "@smithy/types"; import { describe, expect, it } from "vitest"; import { CborCodec, CborShapeSerializer } from "./CborCodec"; import { cbor } from "./cbor"; import { tagSymbol } from "./cbor-types"; describe(CborShapeSerializer.name, () => { const codec = new CborCodec(); const UUID_V4 = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; const idempotencyTokenSchemas = [ NormalizedSchema.of([0, "", "StringWithTraits", 0b0100, 0] satisfies StaticSimpleSchema), NormalizedSchema.of([0, "", "StringWithTraits", { idempotencyToken: 1 }, 0] satisfies StaticSimpleSchema), ]; const plainSchemas = [ NormalizedSchema.of(0 satisfies StringSchema), NormalizedSchema.of([0, "", "StringWithTraits", 0, 0] satisfies StaticSimpleSchema), NormalizedSchema.of([0, "", "StringWithTraits", {}, 0] satisfies StaticSimpleSchema), ]; const serializer = codec.createSerializer(); const deserializer = codec.createDeserializer(); const dateSchema = [ 3, "ns", "DateContainer", 0, ["timestamp"], [4 satisfies TimestampDefaultSchema], ] satisfies StaticStructureSchema; const AB$ = [3, "ns", "AB", 0, ["a", "b"], [0, 19 satisfies BigDecimalSchema]] satisfies StaticStructureSchema; describe("serialization", () => { it("should generate an idempotency token when the input for such a member is undefined", () => { for (const idempotencyTokenSchema of idempotencyTokenSchemas) { for (const plainSchema of plainSchemas) { const objectSchema = [ 3, "ns", "StructWithIdempotencyToken", 0, ["idempotencyToken", "plainString", "memberTraitToken"], [idempotencyTokenSchema, plainSchema, [() => plainSchema, 0b0100]], ] satisfies StaticStructureSchema; serializer.write(objectSchema, { idempotencyToken: undefined, plainString: undefined, memberTraitToken: undefined, }); expect(cbor.deserialize(serializer.flush())).toMatchObject({ idempotencyToken: UUID_V4, memberTraitToken: UUID_V4, }); serializer.write(objectSchema, { idempotencyToken: undefined, plainString: "abc", }); expect(cbor.deserialize(serializer.flush())).toMatchObject({ idempotencyToken: UUID_V4, plainString: /^abc$/, memberTraitToken: UUID_V4, }); serializer.write(objectSchema, { idempotencyToken: "jrt", plainString: "abc", memberTraitToken: "qrf", }); expect(cbor.deserialize(serializer.flush())).toMatchObject({ idempotencyToken: "jrt", plainString: /^abc$/, memberTraitToken: "qrf", }); } } }); it("should serialize Dates to tags if the schema is a timestamp", () => { serializer.write(dateSchema, { timestamp: new Date(1) }); const serialization = serializer.flush(); const parsedWithoutSchema = cbor.deserialize(serialization); expect(parsedWithoutSchema).toEqual({ timestamp: { tag: 1, value: 0.001, [tagSymbol]: true, }, }); }); it("can serialize the $unknown union convention", async () => { const schema = [ 3, "ns", "Struct", 0, ["union"], [[4, "ns", "Union", 0, ["a", "b", "c"], [0, 0, 0]] satisfies StaticUnionSchema], ] satisfies StaticStructureSchema; const ns = NormalizedSchema.of(schema); const input = { union: { $unknown: ["d", {}], }, }; serializer.write(ns, input); const serialization = serializer.flush(); const objectEquivalent = cbor.deserialize(serialization); expect(objectEquivalent).toEqual({ union: { d: {}, }, }); }); it("should pass through NumericValue types if the schema is BigDecimal", async () => { const schema = [ 3, "ns", "Currency", 0, ["price"], [19 satisfies BigDecimalSchema], ] satisfies StaticStructureSchema; const data = { price: nv("0.99"), }; serializer.write(NormalizedSchema.of(schema), data); const serialized = serializer.flush(); expect(cbor.deserialize(serialized)).toEqual({ price: nv("0.99"), }); }); it("serializes extra document members when encountering __type", async () => { const data = { __type: "ns#PlateOfFood", pasta: "Macaroni", cheese: "cheddar", a: "a", b: nv("-.99"), }; serializer.write(AB$, data); const serialization = serializer.flush(); expect(cbor.deserialize(serialization)).toEqual({ __type: "ns#PlateOfFood", pasta: "Macaroni", cheese: "cheddar", a: "a", b: nv("-0.99"), }); }); }); describe("deserialization", () => { it("should not create undefined values", async () => { const struct = [3, "ns", "Struct", 0, ["sessionId", "tokenId"], [0, 0]] satisfies StaticStructureSchema; const data = cbor.serialize({ sessionId: "abcd", }); const deserialized = deserializer.read(struct, data); expect(deserialized).toEqual({ sessionId: "abcd", }); expect("tokenId" in deserialized).toEqual(false); }); it("should deserialize tags to dates if the schema is a timestamp", async () => { const decoded = { timestamp: { tag: 1, value: 0.001, [tagSymbol]: true, }, }; const deserialized = await deserializer.read(dateSchema, cbor.serialize(decoded)); expect(deserialized).toEqual({ timestamp: new Date(1), }); }); it("should pass through NumericValue types if the schema is BigDecimal", async () => { const schema = [ 3, "ns", "Currency", 0, ["price"], [19 satisfies BigDecimalSchema], ] satisfies StaticStructureSchema; const data = cbor.serialize({ price: nv("0.99"), }); const deserialized = await deserializer.read(NormalizedSchema.of(schema), data); expect(deserialized).toEqual({ price: nv("0.99"), }); }); it("deserializes unknown union members to the $unknown conventional property", async () => { const schema = [ 3, "ns", "Struct", 0, ["union"], [[4, "ns", "Union", 0, ["a", "b", "c"], [0, 0, 0]] satisfies StaticUnionSchema], ] satisfies StaticStructureSchema; const ns = NormalizedSchema.of(schema); const receivedData = { union: { __type: "ns.Union", d: {}, }, }; const serialization = cbor.serialize(receivedData); const deserialized = await deserializer.read(ns, serialization); expect(deserialized).toEqual({ union: { $unknown: ["d", {}], }, } satisfies Record); }); it("deserializes extra document members when encountering __type", async () => { expect( await deserializer.read( AB$, cbor.serialize({ __type: "ns#Other", __field__: "xyz", blob: "AAAA", nested: {}, a: "a", b: nv("-0.99"), }) ) ).toEqual({ __type: "ns#Other", __field__: "xyz", blob: "AAAA", nested: {}, a: "a", b: nv("-0.99"), }); }); }); }); ================================================ FILE: packages/core/src/submodules/cbor/CborCodec.ts ================================================ import { SerdeContext } from "@smithy/core/protocols"; import { NormalizedSchema } from "@smithy/core/schema"; import { NumericValue, _parseEpochTimestamp, fromBase64, generateIdempotencyToken } from "@smithy/core/serde"; import type { Codec, DocumentSchema, Schema, ShapeDeserializer, ShapeSerializer } from "@smithy/types"; import { cbor } from "./cbor"; import { dateToTag } from "./parseCborBody"; /** * @public */ export class CborCodec extends SerdeContext implements Codec { public createSerializer(): CborShapeSerializer { const serializer = new CborShapeSerializer(); serializer.setSerdeContext(this.serdeContext!); return serializer; } public createDeserializer(): CborShapeDeserializer { const deserializer = new CborShapeDeserializer(); deserializer.setSerdeContext(this.serdeContext!); return deserializer; } } /** * @public */ export class CborShapeSerializer extends SerdeContext implements ShapeSerializer { private value: unknown; public write(schema: Schema, value: unknown): void { this.value = this.serialize(schema, value); } /** * Recursive serializer transform that copies and prepares the user input object * for CBOR serialization. */ public serialize(schema: Schema, source: unknown): any { const ns = NormalizedSchema.of(schema); if (source == null) { if (ns.isIdempotencyToken()) { return generateIdempotencyToken(); } return source as null | undefined; } if (ns.isBlobSchema()) { if (typeof source === "string") { return (this.serdeContext?.base64Decoder ?? fromBase64)(source); } return source as Uint8Array; } if (ns.isTimestampSchema()) { if (typeof source === "number" || typeof source === "bigint") { return dateToTag(new Date((Number(source) / 1000) | 0)); } return dateToTag(source as Date); } if (typeof source === "function" || typeof source === "object") { const sourceObject = source as Record; if (ns.isListSchema() && Array.isArray(sourceObject)) { const sparse = !!ns.getMergedTraits().sparse; const newArray = []; let i = 0; for (const item of sourceObject) { const value = this.serialize(ns.getValueSchema(), item); if (value != null || sparse) { newArray[i++] = value; } } return newArray; } if (sourceObject instanceof Date) { return dateToTag(sourceObject); } const newObject = {} as any; if (ns.isMapSchema()) { const sparse = !!ns.getMergedTraits().sparse; for (const key in sourceObject) { const value = this.serialize(ns.getValueSchema(), sourceObject[key]); if (value != null || sparse) { newObject[key] = value; } } } else if (ns.isStructSchema()) { for (const [key, memberSchema] of ns.structIterator()) { const value = this.serialize(memberSchema, sourceObject[key]); if (value != null) { newObject[key] = value; } } const isUnion = ns.isUnionSchema(); if (isUnion && Array.isArray(sourceObject.$unknown)) { const [k, v] = sourceObject.$unknown; newObject[k] = v; } else if (typeof sourceObject.__type === "string") { // This if-block is for backwards compatibility support and should not be copied // to other implementations. for (const k in sourceObject) { if (!(k in newObject)) { // we have no type information, so serialize with Document rules. newObject[k] = this.serialize(15 satisfies DocumentSchema, sourceObject[k]); } } } } else if (ns.isDocumentSchema()) { for (const key in sourceObject) { newObject[key] = this.serialize(ns.getValueSchema(), sourceObject[key]); } } else if (ns.isBigDecimalSchema()) { return sourceObject; } return newObject; } return source; } public flush(): Uint8Array { const buffer = cbor.serialize(this.value); this.value = undefined; return buffer as Uint8Array; } } /** * @public */ export class CborShapeDeserializer extends SerdeContext implements ShapeDeserializer { public read(schema: Schema, bytes: Uint8Array): any { const data: any = cbor.deserialize(bytes); return this.readValue(schema, data); } /** * Public because it's called by the protocol implementation to deserialize errors. * @internal */ public readValue(_schema: Schema, value: any): any { const ns = NormalizedSchema.of(_schema); if (ns.isTimestampSchema()) { // timestampFormat is ignored. if (typeof value === "number") { return _parseEpochTimestamp(value); } if (typeof value === "object") { if (value.tag === 1 && "value" in value) { return _parseEpochTimestamp(value.value); } } } if (ns.isBlobSchema()) { if (typeof value === "string") { return (this.serdeContext?.base64Decoder ?? fromBase64)(value); } return value as Uint8Array | undefined; } if ( typeof value === "undefined" || typeof value === "boolean" || typeof value === "number" || typeof value === "string" || typeof value === "bigint" || typeof value === "symbol" ) { return value; } else if (typeof value === "object") { if (value === null) { return null; } if ("byteLength" in (value as Uint8Array)) { return value; } if (value instanceof Date) { return value; } if (ns.isDocumentSchema()) { return value; } if (ns.isListSchema()) { const newArray = [] as any[]; const memberSchema = ns.getValueSchema(); for (const item of value) { const itemValue = this.readValue(memberSchema, item); newArray.push(itemValue); } return newArray; } const newObject = {} as any; if (ns.isMapSchema()) { const targetSchema = ns.getValueSchema(); for (const key in value) { const itemValue = this.readValue(targetSchema, value[key]); newObject[key] = itemValue; } } else if (ns.isStructSchema()) { const isUnion = ns.isUnionSchema(); let keys: Set | undefined; if (isUnion) { keys = new Set(); for (const k in value) { if (k !== "__type") { keys.add(k); } } } for (const [key, memberSchema] of ns.structIterator()) { if (isUnion) { keys!.delete(key); } if (value[key] != null) { newObject[key] = this.readValue(memberSchema, value[key]); } } if (isUnion && keys?.size === 1) { let newObjectEmpty = true; for (const _ in newObject) { newObjectEmpty = false; break; } if (newObjectEmpty) { const k = keys!.values().next().value as string; newObject.$unknown = [k, value[k]]; } } else if (typeof value.__type === "string") { // This if-block is for backwards compatibility support and should not be copied // to other implementations. for (const k in value) { if (!(k in newObject)) { // we have no type information, so copy as-is from CBOR-derived object. newObject[k] = value[k]; } } } } else if (value instanceof NumericValue) { return value; } return newObject; } else { return value; } } } ================================================ FILE: packages/core/src/submodules/cbor/SmithyRpcV2CborProtocol.spec.ts ================================================ import { op, type TypeRegistry } from "@smithy/core/schema"; import { HttpRequest, HttpResponse } from "@smithy/protocol-http"; import type { $SchemaRef, BlobSchema, BooleanSchema, MapSchemaModifier, NumericSchema, ResponseMetadata, RetryableTrait, StaticErrorSchema, StaticOperationSchema, StaticStructureSchema, StringSchema, TimestampDefaultSchema, } from "@smithy/types"; import { beforeEach, describe, expect, test as it } from "vitest"; import { SmithyRpcV2CborProtocol } from "./SmithyRpcV2CborProtocol"; import { cbor } from "./cbor"; import { dateToTag } from "./parseCborBody"; describe(SmithyRpcV2CborProtocol.name, () => { const bytes = (arr: number[]) => Buffer.from(arr); describe("serialization", () => { const testCases: Array<{ name: string; schema: $SchemaRef; input: any; expected: { request: any; body: any; }; }> = [ { name: "document with timestamp and blob", schema: [ 3, "", "MyExtendedDocument", {}, ["timestamp", "blob"], [ [4 satisfies TimestampDefaultSchema, 0], [21 satisfies BlobSchema, 0], ], ], input: { bool: true, int: 5, float: -3.001, timestamp: new Date(1_000_000), blob: bytes([97, 98, 99, 100]), }, expected: { request: {}, body: { timestamp: dateToTag(new Date(1_000_000)), blob: bytes([97, 98, 99, 100]), }, }, }, { name: "do not write to header or query", schema: [ 3, "", "MyExtendedDocument", {}, ["bool", "timestamp", "blob", "prefixHeaders", "searchParams"], [ [2 satisfies BooleanSchema, { httpQuery: "bool" }], [4 satisfies TimestampDefaultSchema, { httpHeader: "timestamp" }], [21 satisfies BlobSchema, { httpHeader: "blob" }], [(128 satisfies MapSchemaModifier) | (0 satisfies StringSchema), { httpPrefixHeaders: "anti-" }], [(128 satisfies MapSchemaModifier) | (0 satisfies StringSchema), { httpQueryParams: 1 }], ], ], input: { bool: true, timestamp: new Date(1_000_000), blob: bytes([97, 98, 99, 100]), prefixHeaders: { pasto: "cheese dodecahedron", clockwise: "left", }, searchParams: { a: 1, b: 2, }, }, expected: { request: { headers: {}, query: {}, }, body: { bool: true, timestamp: dateToTag(new Date(1_000_000)), blob: bytes([97, 98, 99, 100]), prefixHeaders: { pasto: "cheese dodecahedron", clockwise: "left", }, searchParams: { a: 1, b: 2, }, }, }, }, { name: "sparse list and map", schema: [ 3, "", "MyShape", 0, ["mySparseList", "myRegularList", "mySparseMap", "myRegularMap"], [ [() => [1, "", "MySparseList", { sparse: 1 }, 1 satisfies NumericSchema], {}], [() => [1, "", "MyList", {}, 1 satisfies NumericSchema], {}], [() => [2, "", "MySparseMap", { sparse: 1 }, 0 satisfies StringSchema, 1 satisfies NumericSchema], {}], [() => [2, "", "MyMap", {}, 0 satisfies StringSchema, 1 satisfies NumericSchema], {}], ], ], input: { mySparseList: [null, 1, null, 2, null], myRegularList: [null, 1, null, 2, null], mySparseMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, myRegularMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, }, expected: { request: {}, body: { mySparseList: [null, 1, null, 2, null], myRegularList: [1, 2], mySparseMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, myRegularMap: { 1: 1, 3: 3, }, }, }, }, ]; for (const testCase of testCases) { it(`should serialize HTTP Requests: ${testCase.name}`, async () => { const protocol = new SmithyRpcV2CborProtocol({ defaultNamespace: "" }); const httpRequest = await protocol.serializeRequest( { namespace: "ns", name: "dummy", input: testCase.schema, output: "unit", traits: {}, }, testCase.input, { async endpoint() { return { protocol: "https:", hostname: "example.com", path: "/", }; }, } as any ); const body = httpRequest.body; httpRequest.body = void 0; expect(httpRequest).toEqual( new HttpRequest({ protocol: "https:", hostname: "example.com", method: "POST", path: "/service/undefined/operation/undefined", ...testCase.expected.request, headers: { accept: "application/cbor", "content-type": "application/cbor", "smithy-protocol": "rpc-v2-cbor", "content-length": String(body.byteLength), ...testCase.expected.request.headers, }, }) ); expect(cbor.deserialize(body)).toEqual(testCase.expected.body); }); } }); describe("deserialization", () => { const testCases = [ { // Sparseness is not checked on deserialization, also see this smithy change: https://github.com/smithy-lang/smithy/pull/2972 name: "sparseness is not checked on deserialization", schema: [ 3, "", "MyShape", 0, ["mySparseList", "myRegularList", "mySparseMap", "myRegularMap"], [ [() => [1, "", "MyList", { sparse: 1 }, 1 satisfies NumericSchema], {}], [() => [1, "", "MyList", {}, 1 satisfies NumericSchema], {}], [() => [2, "", "MyMap", { sparse: 1 }, 0 satisfies StringSchema, 1 satisfies NumericSchema], {}], [() => [2, "", "MyMap", {}, 0 satisfies StringSchema, 1 satisfies NumericSchema], {}], ], ] satisfies StaticStructureSchema, mockOutput: { mySparseList: [null, 1, null, 2, null], myRegularList: [null, 1, null, 2, null], mySparseMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, myRegularMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, }, expected: { output: { mySparseList: [null, 1, null, 2, null], myRegularList: [null, 1, null, 2, null], mySparseMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, myRegularMap: { 0: null, 1: 1, 2: null, 3: 3, 4: null, }, }, }, }, ]; for (const testCase of testCases) { it(`should deserialize HTTP Responses: ${testCase.name}`, async () => { const protocol = new SmithyRpcV2CborProtocol({ defaultNamespace: "", }); const output = await protocol.deserializeResponse( { namespace: "ns", name: "dummy", input: "unit", output: testCase.schema, traits: {}, }, {} as any, new HttpResponse({ statusCode: 200, body: cbor.serialize(testCase.mockOutput), }) ); delete (output as Partial).$metadata; expect(output).toEqual(testCase.expected.output); }); } }); describe("error handling", () => { const protocol = new SmithyRpcV2CborProtocol({ defaultNamespace: "ns" }); const staticOperation = [ 9, "ns", "OperationWithModeledException", {}, [3, "ns", "Input", 0, [], []], [3, "ns", "Output", 0, [], []], ] satisfies StaticOperationSchema; const operation = op( staticOperation[1], staticOperation[2], staticOperation[3], staticOperation[4], staticOperation[5] ); const errorResponse = new HttpResponse({ statusCode: 400, headers: {}, body: cbor.serialize({ __type: "ns#ModeledException", modeledProperty: "oh no", }), }); const errorResponseNoDiscriminator = new HttpResponse({ statusCode: 404, headers: {}, body: cbor.serialize({ modeledProperty: "oh no", }), }); const serdeContext = {}; class ServiceBaseException extends Error { public readonly $fault: "client" | "server" = "client"; public $response?: HttpResponse; public $retryable?: RetryableTrait; public $metadata: ResponseMetadata = { httpStatusCode: 400, }; } class ModeledExceptionCtor extends ServiceBaseException { public modeledProperty: string = ""; } // protected access. const registry = (protocol as any as { compositeErrorRegistry: TypeRegistry }).compositeErrorRegistry; beforeEach(() => { registry.clear(); }); const modeledExceptionSchema = [ -3, "ns", "ModeledException", 0, ["modeledProperty"], [0], ] satisfies StaticErrorSchema; const baseServiceExceptionSchema = [ -3, "smithy.ts.sdk.synthetic.ns", "BaseServiceException", 0, [], [], ] satisfies StaticErrorSchema; it("should throw the schema error ctor if one exists", async () => { // this is for modeled exceptions. registry.registerError(modeledExceptionSchema, ModeledExceptionCtor); registry.registerError(baseServiceExceptionSchema, ServiceBaseException); try { await protocol.deserializeResponse(operation, serdeContext as any, errorResponse); } catch (e) { expect(e).toBeInstanceOf(ModeledExceptionCtor); expect((e as ModeledExceptionCtor).modeledProperty).toEqual("oh no"); expect(e).toBeInstanceOf(ServiceBaseException); } expect.assertions(3); }); it("should throw a base error if available in the namespace, when no error schema is modeled", async () => { // this is the expected fallback case for all generated clients. registry.registerError(baseServiceExceptionSchema, ServiceBaseException); try { await protocol.deserializeResponse(operation, serdeContext as any, errorResponseNoDiscriminator); } catch (e) { expect(e).toBeInstanceOf(ServiceBaseException); } expect.assertions(1); }); it("should fall back to a generic JS Error as a last resort", async () => { // this shouldn't happen, but in case the type registry is mutated incorrectly. try { await protocol.deserializeResponse(operation, serdeContext as any, errorResponse); } catch (e) { expect(e).toBeInstanceOf(Error); } expect.assertions(1); }); }); }); ================================================ FILE: packages/core/src/submodules/cbor/SmithyRpcV2CborProtocol.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import { RpcProtocol } from "@smithy/core/protocols"; import { NormalizedSchema, TypeRegistry, deref } from "@smithy/core/schema"; import type { EndpointBearer, HandlerExecutionContext, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, MetadataBearer, OperationSchema, ResponseMetadata, SerdeFunctions, StaticErrorSchema, } from "@smithy/types"; import { CborCodec } from "./CborCodec"; import { loadSmithyRpcV2CborErrorCode } from "./parseCborBody"; /** * Client protocol for Smithy RPCv2 CBOR. * * @public */ export class SmithyRpcV2CborProtocol extends RpcProtocol { /** * @override */ protected declare compositeErrorRegistry: TypeRegistry; private codec = new CborCodec(); protected serializer = this.codec.createSerializer(); protected deserializer = this.codec.createDeserializer(); public constructor({ defaultNamespace, errorTypeRegistries, }: { defaultNamespace: string; errorTypeRegistries?: TypeRegistry[]; }) { super({ defaultNamespace, errorTypeRegistries }); } public getShapeId(): string { return "smithy.protocols#rpcv2Cbor"; } public getPayloadCodec(): CborCodec { return this.codec; } public async serializeRequest( operationSchema: OperationSchema, input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise { const request = await super.serializeRequest(operationSchema, input, context); Object.assign(request.headers, { "content-type": this.getDefaultContentType(), "smithy-protocol": "rpc-v2-cbor", accept: this.getDefaultContentType(), }); if (deref(operationSchema.input) === "unit") { delete request.body; delete request.headers["content-type"]; } else { if (!request.body) { this.serializer.write(15, {}); request.body = this.serializer.flush(); } try { request.headers["content-length"] = String((request.body as Uint8Array).byteLength); } catch (e) {} } const { service, operation } = getSmithyContext(context) as { service: string; operation: string; }; const path = `/service/${service}/operation/${operation}`; if (request.path.endsWith("/")) { request.path += path.slice(1); } else { request.path += path; } return request; } public async deserializeResponse( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse ): Promise { return super.deserializeResponse(operationSchema, context, response); } protected async handleError( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any, metadata: ResponseMetadata ): Promise { const errorName = loadSmithyRpcV2CborErrorCode(response, dataObject) ?? "Unknown"; const errorMetadata = { $metadata: metadata, $fault: response.statusCode <= 500 ? ("client" as const) : ("server" as const), }; let namespace = this.options.defaultNamespace; if (errorName.includes("#")) { [namespace] = errorName.split("#"); } const registry = this.compositeErrorRegistry; const nsRegistry = TypeRegistry.for(namespace); // Composition required for backwards compatibility. // Previous generated clients did not export errorTypeRegistries. registry.copyFrom(nsRegistry); let errorSchema: StaticErrorSchema; try { errorSchema = registry.getSchema(errorName) as StaticErrorSchema; } catch (e) { if (dataObject.Message) { dataObject.message = dataObject.Message; } const syntheticRegistry = TypeRegistry.for("smithy.ts.sdk.synthetic." + namespace); // Composition required for backwards compatibility. // Previous generated clients did not export errorTypeRegistries. registry.copyFrom(syntheticRegistry); const baseExceptionSchema = registry.getBaseException(); if (baseExceptionSchema) { const ErrorCtor = registry.getErrorCtor(baseExceptionSchema); throw Object.assign(new ErrorCtor({ name: errorName }), errorMetadata, dataObject); } throw Object.assign(new Error(errorName), errorMetadata, dataObject); } const ns = NormalizedSchema.of(errorSchema); const ErrorCtor = registry.getErrorCtor(errorSchema); const message = dataObject.message ?? dataObject.Message ?? "Unknown"; const exception = new ErrorCtor({}); const output = {} as any; for (const [name, member] of ns.structIterator()) { output[name] = this.deserializer.readValue(member, dataObject[name]); } throw Object.assign( exception, errorMetadata, { $fault: ns.getMergedTraits().error, message, }, output ); } protected getDefaultContentType(): string { return "application/cbor"; } } ================================================ FILE: packages/core/src/submodules/cbor/byte-printer.ts ================================================ /** * Prints bytes as binary string with numbers. * @param bytes - to print. * @deprecated for testing only, do not use in runtime. */ export function printBytes(bytes: Uint8Array) { return [...bytes].map((n) => { const pad = (num: number) => ("0".repeat(8) + num.toString(2)).slice(-8); const b = pad(n); const [maj, min] = [b.slice(0, 3), b.slice(3)]; let dmaj: string = ""; switch (maj) { case "000": dmaj = "0 - Uint64"; break; case "001": dmaj = "1 - Neg Uint64"; break; case "010": dmaj = "2 - unstructured bytestring"; break; case "011": dmaj = "3 - utf8 string"; break; case "100": dmaj = "4 - list"; break; case "101": dmaj = "5 - map"; break; case "110": dmaj = "6 - tag"; break; case "111": dmaj = "7 - special"; break; default: dmaj = String(parseInt(maj, 2)); } return `${maj}_${min} (${dmaj}, ${parseInt(min, 2)})`; }); } ================================================ FILE: packages/core/src/submodules/cbor/cbor-decode.ts ================================================ import { nv, toUtf8 } from "@smithy/core/serde"; import { alloc, extendedFloat16, extendedFloat32, extendedFloat64, extendedOneByte, majorList, majorMap, majorNegativeInt64, majorTag, majorUint64, majorUnstructuredByteString, majorUtf8String, minorIndefinite, specialFalse, specialNull, specialTrue, specialUndefined, tag, type CborArgumentLength, type CborArgumentLengthOffset, type CborListType, type CborMapType, type CborOffset, type CborUnstructuredByteStringType, type CborValueType, type Float32, type Uint8, type Uint32, type Uint64, } from "./cbor-types"; const USE_TEXT_DECODER = typeof TextDecoder !== "undefined"; const USE_BUFFER = typeof Buffer !== "undefined"; let payload = alloc(0); let dataView = new DataView(payload.buffer, payload.byteOffset, payload.byteLength); const textDecoder = USE_TEXT_DECODER ? new TextDecoder() : null; /** * This number stores the last offset of any decoded segment. */ let _offset: CborOffset = 0; /** * Sets the decode bytearray source and its data view. * * @internal * @param bytes - to be set as the decode source. */ export function setPayload(bytes: Uint8Array) { payload = bytes; dataView = new DataView(payload.buffer, payload.byteOffset, payload.byteLength); } /** * Decodes the data between the two indices. * * @internal */ export function decode(at: Uint32, to: Uint32): CborValueType { if (at >= to) { throw new Error("unexpected end of (decode) payload."); } const major = (payload[at] & 0b1110_0000) >> 5; const minor = payload[at] & 0b0001_1111; switch (major) { case majorUint64: case majorNegativeInt64: case majorTag: let unsignedInt: number | Uint64; let offset: number; if (minor < 24) { unsignedInt = minor; offset = 1; } else { switch (minor) { case extendedOneByte: case extendedFloat16: case extendedFloat32: case extendedFloat64: const countLength: CborArgumentLength = minorValueToArgumentLength[minor]; const countOffset = (countLength + 1) as CborArgumentLengthOffset; offset = countOffset; if (to - at < countOffset) { throw new Error(`countLength ${countLength} greater than remaining buf len.`); } const countIndex = at + 1; if (countLength === 1) { unsignedInt = payload[countIndex]; } else if (countLength === 2) { unsignedInt = dataView.getUint16(countIndex); } else if (countLength === 4) { unsignedInt = dataView.getUint32(countIndex); } else { unsignedInt = dataView.getBigUint64(countIndex); } break; default: throw new Error(`unexpected minor value ${minor}.`); } } if (major === majorUint64) { _offset = offset; return castBigInt(unsignedInt); } else if (major === majorNegativeInt64) { let negativeInt: bigint | number; if (typeof unsignedInt === "bigint") { negativeInt = BigInt(-1) - unsignedInt; } else { negativeInt = -1 - unsignedInt; } _offset = offset; return castBigInt(negativeInt); } else { /* major === majorTag */ if (minor === 2 || minor === 3) { const length = decodeCount(at + offset, to); let b = BigInt(0); const start = at + offset + _offset; for (let i = start; i < start + length; ++i) { b = (b << BigInt(8)) | BigInt(payload[i]); } // the new offset is the sum of: // 1. the local major offset (1) // 2. the offset of the decoded count of the bigInteger // 3. the length of the data bytes of the bigInteger _offset = offset + _offset + length; return minor === 3 ? -b - BigInt(1) : b; } else if (minor === 4) { const decimalFraction = decode(at + offset, to); const [exponent, mantissa] = decimalFraction; const normalizer = mantissa < 0 ? -1 : 1; const mantissaStr = "0".repeat(Math.abs(exponent) + 1) + String(BigInt(normalizer) * BigInt(mantissa)); let numericString: string; const sign = mantissa < 0 ? "-" : ""; numericString = exponent === 0 ? mantissaStr : mantissaStr.slice(0, mantissaStr.length + exponent) + "." + mantissaStr.slice(exponent); numericString = numericString.replace(/^0+/g, ""); if (numericString === "") { numericString = "0"; } if (numericString[0] === ".") { numericString = "0" + numericString; } numericString = sign + numericString; // the new offset is the sum of: // 1. the local major offset (1) // 2. the offset of the decoded exponent mantissa pair _offset = offset + _offset; return nv(numericString); } else { const value = decode(at + offset, to); const valueOffset = _offset; _offset = offset + valueOffset; return tag({ tag: castBigInt(unsignedInt), value }); } } case majorUtf8String: case majorMap: case majorList: case majorUnstructuredByteString: if (minor === minorIndefinite) { switch (major) { case majorUtf8String: return decodeUtf8StringIndefinite(at, to); case majorMap: return decodeMapIndefinite(at, to); case majorList: return decodeListIndefinite(at, to); case majorUnstructuredByteString: return decodeUnstructuredByteStringIndefinite(at, to); } } else { switch (major) { case majorUtf8String: return decodeUtf8String(at, to); case majorMap: return decodeMap(at, to); case majorList: return decodeList(at, to); case majorUnstructuredByteString: return decodeUnstructuredByteString(at, to); } } default: return decodeSpecial(at, to); } } function bytesToUtf8(bytes: Uint8Array, at: number, to: number): string { if (USE_BUFFER && bytes.constructor?.name === "Buffer") { return (bytes as Buffer).toString("utf-8", at, to); } if (textDecoder) { return textDecoder!.decode(bytes.subarray(at, to)); } return toUtf8(bytes.subarray(at, to)); } function demote(bigInteger: bigint): number { // cast is safe for string and array lengths, which do not // exceed safe integer range. const num = Number(bigInteger); if (num < Number.MIN_SAFE_INTEGER || Number.MAX_SAFE_INTEGER < num) { console.warn(new Error(`@smithy/core/cbor - truncating BigInt(${bigInteger}) to ${num} with loss of precision.`)); } return num; } const minorValueToArgumentLength = { [extendedOneByte]: 1, [extendedFloat16]: 2, [extendedFloat32]: 4, [extendedFloat64]: 8, } as const; /** * @internal */ export function bytesToFloat16(a: Uint8, b: Uint8): Float32 { const sign = a >> 7; const exponent = (a & 0b0111_1100) >> 2; const fraction = ((a & 0b0000_0011) << 8) | b; const scalar = sign === 0 ? 1 : -1; let exponentComponent: number; let summation: number; if (exponent === 0b00000) { if (fraction === 0b00000_00000) { return 0; } else { exponentComponent = Math.pow(2, 1 - 15); summation = 0; } } else if (exponent === 0b11111) { if (fraction === 0b00000_00000) { return scalar * Infinity; } else { return NaN; } } else { exponentComponent = Math.pow(2, exponent - 15); summation = 1; } summation += fraction / 1024; return scalar * (exponentComponent * summation); } function decodeCount(at: Uint32, to: Uint32): number { const minor = payload[at] & 0b0001_1111; if (minor < 24) { _offset = 1; return minor; } if ( minor === extendedOneByte || minor === extendedFloat16 || minor === extendedFloat32 || minor === extendedFloat64 ) { const countLength: CborArgumentLength = minorValueToArgumentLength[minor]; _offset = (countLength + 1) as CborArgumentLengthOffset; if (to - at < _offset) { throw new Error(`countLength ${countLength} greater than remaining buf len.`); } const countIndex = at + 1; if (countLength === 1) { return payload[countIndex]; } else if (countLength === 2) { return dataView.getUint16(countIndex); } else if (countLength === 4) { return dataView.getUint32(countIndex); } return demote(dataView.getBigUint64(countIndex)); } throw new Error(`unexpected minor value ${minor}.`); } function decodeUtf8String(at: Uint32, to: Uint32): string { const length = decodeCount(at, to); const offset = _offset; at += offset; if (to - at < length) { throw new Error(`string len ${length} greater than remaining buf len.`); } const value = bytesToUtf8(payload, at, at + length); _offset = offset + length; return value; } function decodeUtf8StringIndefinite(at: Uint32, to: Uint32): string { at += 1; const vector = []; for (const base = at; at < to; ) { if (payload[at] === 0b1111_1111) { const data = alloc(vector.length); data.set(vector, 0); _offset = at - base + 2; return bytesToUtf8(data, 0, data.length); } const major = (payload[at] & 0b1110_0000) >> 5; const minor = payload[at] & 0b0001_1111; if (major !== majorUtf8String) { throw new Error(`unexpected major type ${major} in indefinite string.`); } if (minor === minorIndefinite) { throw new Error("nested indefinite string."); } const bytes = decodeUnstructuredByteString(at, to); const length = _offset; at += length; for (let i = 0; i < bytes.length; ++i) { vector.push(bytes[i]); } } throw new Error("expected break marker."); } function decodeUnstructuredByteString(at: Uint32, to: Uint32): CborUnstructuredByteStringType { const length = decodeCount(at, to); const offset = _offset; at += offset; if (to - at < length) { throw new Error(`unstructured byte string len ${length} greater than remaining buf len.`); } const value = payload.subarray(at, at + length); _offset = offset + length; return value; } function decodeUnstructuredByteStringIndefinite(at: Uint32, to: Uint32): CborUnstructuredByteStringType { at += 1; const vector = []; for (const base = at; at < to; ) { if (payload[at] === 0b1111_1111) { const data = alloc(vector.length); data.set(vector, 0); _offset = at - base + 2; return data; } const major = (payload[at] & 0b1110_0000) >> 5; const minor = payload[at] & 0b0001_1111; if (major !== majorUnstructuredByteString) { throw new Error(`unexpected major type ${major} in indefinite string.`); } if (minor === minorIndefinite) { throw new Error("nested indefinite string."); } const bytes = decodeUnstructuredByteString(at, to); const length = _offset; at += length; for (let i = 0; i < bytes.length; ++i) { vector.push(bytes[i]); } } throw new Error("expected break marker."); } function decodeList(at: Uint32, to: Uint32): CborListType { const listDataLength = decodeCount(at, to); const offset = _offset; at += offset; const base = at; // perf: pre-allocate array length. const list = Array(listDataLength); for (let i = 0; i < listDataLength; ++i) { const item = decode(at, to); const itemOffset = _offset; list[i] = item; at += itemOffset; } _offset = offset + (at - base); return list; } function decodeListIndefinite(at: Uint32, to: Uint32): CborListType { at += 1; const list = [] as CborListType; for (const base = at; at < to; ) { if (payload[at] === 0b1111_1111) { _offset = at - base + 2; return list; } const item = decode(at, to); const n = _offset; at += n; list.push(item); } throw new Error("expected break marker."); } function decodeMap(at: Uint32, to: Uint32): CborMapType { const mapDataLength = decodeCount(at, to); const offset = _offset; at += offset; const base = at; const map = {} as CborMapType; for (let i = 0; i < mapDataLength; ++i) { if (at >= to) { throw new Error("unexpected end of map payload."); } const major = (payload[at] & 0b1110_0000) >> 5; if (major !== majorUtf8String) { throw new Error(`unexpected major type ${major} for map key at index ${at}.`); } const key = decode(at, to); at += _offset; const value = decode(at, to); at += _offset; map[key] = value; } _offset = offset + (at - base); return map; } function decodeMapIndefinite(at: Uint32, to: Uint32): CborMapType { at += 1; const base = at; const map = {} as CborMapType; for (; at < to; ) { if (at >= to) { throw new Error("unexpected end of map payload."); } if (payload[at] === 0b1111_1111) { _offset = at - base + 2; return map; } const major = (payload[at] & 0b1110_0000) >> 5; if (major !== majorUtf8String) { throw new Error(`unexpected major type ${major} for map key.`); } const key = decode(at, to); at += _offset; const value = decode(at, to); at += _offset; map[key] = value; } throw new Error("expected break marker."); } function decodeSpecial(at: Uint32, to: Uint32): CborValueType { const minor = payload[at] & 0b0001_1111; switch (minor) { case specialTrue: case specialFalse: _offset = 1; return minor === specialTrue; case specialNull: _offset = 1; return null; case specialUndefined: // Note: the Smithy spec requires that undefined is // instead deserialized to null. _offset = 1; return null; case extendedFloat16: if (to - at < 3) { throw new Error("incomplete float16 at end of buf."); } _offset = 3; return bytesToFloat16(payload[at + 1], payload[at + 2]); case extendedFloat32: if (to - at < 5) { throw new Error("incomplete float32 at end of buf."); } _offset = 5; return dataView.getFloat32(at + 1); case extendedFloat64: if (to - at < 9) { throw new Error("incomplete float64 at end of buf."); } _offset = 9; return dataView.getFloat64(at + 1); default: throw new Error(`unexpected minor value ${minor}.`); } } function castBigInt(bigInt: bigint | number): number | bigint { if (typeof bigInt === "number") { return bigInt; } const num = Number(bigInt); if (Number.MIN_SAFE_INTEGER <= num && num <= Number.MAX_SAFE_INTEGER) { return num; } return bigInt; } ================================================ FILE: packages/core/src/submodules/cbor/cbor-encode.ts ================================================ import { NumericValue, fromUtf8 } from "@smithy/core/serde"; import { alloc, extendedFloat16, extendedFloat32, extendedFloat64, majorList, majorMap, majorNegativeInt64, majorSpecial, majorTag, majorUint64, majorUnstructuredByteString, majorUtf8String, specialFalse, specialNull, specialTrue, tagSymbol, type CborMajorType, type Uint64, } from "./cbor-types"; const USE_BUFFER = typeof Buffer !== "undefined"; const initialSize = 2048; let data: Uint8Array = alloc(initialSize); let dataView: DataView = new DataView(data.buffer, data.byteOffset, data.byteLength); let cursor: number = 0; function ensureSpace(bytes: number) { const remaining = data.byteLength - cursor; if (remaining < bytes) { if (cursor < 16_000_000) { resize(Math.max(data.byteLength * 4, data.byteLength + bytes)); } else { resize(data.byteLength + bytes + 16_000_000); } } } /** * @internal */ export function toUint8Array(): Uint8Array { const out = alloc(cursor); out.set(data.subarray(0, cursor), 0); cursor = 0; return out; } export function resize(size: number) { const old = data; data = alloc(size); if (old) { if ((old as Buffer).copy) { (old as Buffer).copy(data, 0, 0, old.byteLength); } else { data.set(old, 0); } } dataView = new DataView(data.buffer, data.byteOffset, data.byteLength); } function encodeHeader(major: CborMajorType, value: Uint64 | number): void { if (value < 24) { data[cursor++] = (major << 5) | (value as number); } else if (value < 1 << 8) { data[cursor++] = (major << 5) | 24; data[cursor++] = value as number; } else if (value < 1 << 16) { data[cursor++] = (major << 5) | extendedFloat16; dataView.setUint16(cursor, value as number); cursor += 2; } else if (value < 2 ** 32) { data[cursor++] = (major << 5) | extendedFloat32; dataView.setUint32(cursor, value as number); cursor += 4; } else { data[cursor++] = (major << 5) | extendedFloat64; dataView.setBigUint64(cursor, typeof value === "bigint" ? value : BigInt(value)); cursor += 8; } } /** * @param _input - JS data object. */ export function encode(_input: any): void { const encodeStack = [_input]; while (encodeStack.length) { const input = encodeStack.pop(); ensureSpace(typeof input === "string" ? input.length * 4 : 64); if (typeof input === "string") { if (USE_BUFFER) { encodeHeader(majorUtf8String, Buffer.byteLength(input)); cursor += (data as Buffer).write(input, cursor); } else { const bytes = fromUtf8(input); encodeHeader(majorUtf8String, bytes.byteLength); data.set(bytes, cursor); cursor += bytes.byteLength; } continue; } else if (typeof input === "number") { if (Number.isInteger(input)) { const nonNegative = input >= 0; const major = nonNegative ? majorUint64 : majorNegativeInt64; const value = nonNegative ? input : -input - 1; if (value < 24) { data[cursor++] = (major << 5) | value; } else if (value < 256 /* 2 ** 8 */) { data[cursor++] = (major << 5) | 24; data[cursor++] = value; } else if (value < 65536 /* 2 ** 16 */) { data[cursor++] = (major << 5) | extendedFloat16; data[cursor++] = (value as number) >> 8; data[cursor++] = value as number & 0b1111_1111; } else if (value < 4294967296 /* 2 ** 32 */) { data[cursor++] = (major << 5) | extendedFloat32; dataView.setUint32(cursor, value); cursor += 4; } else { data[cursor++] = (major << 5) | extendedFloat64; dataView.setBigUint64(cursor, BigInt(value)); cursor += 8; } continue; } data[cursor++] = (majorSpecial << 5) | extendedFloat64; dataView.setFloat64(cursor, input); cursor += 8; continue; } else if (typeof input === "bigint") { const nonNegative = input >= 0; const major = nonNegative ? majorUint64 : majorNegativeInt64; const value = nonNegative ? input : -input - BigInt(1); const n = Number(value); if (n < 24) { data[cursor++] = (major << 5) | n; } else if (n < 256 /* 2 ** 8 */) { data[cursor++] = (major << 5) | 24; data[cursor++] = n; } else if (n < 65536 /* 2 ** 16 */) { data[cursor++] = (major << 5) | extendedFloat16; data[cursor++] = n >> 8; data[cursor++] = n & 0b1111_1111; } else if (n < 4294967296 /* 2 ** 32 */) { data[cursor++] = (major << 5) | extendedFloat32; dataView.setUint32(cursor, n); cursor += 4; } else if (value < BigInt("18446744073709551616")) { data[cursor++] = (major << 5) | extendedFloat64; dataView.setBigUint64(cursor, value); cursor += 8; } else { // refer to https://www.rfc-editor.org/rfc/rfc8949.html#name-bignums const binaryBigInt = value.toString(2); const bigIntBytes = new Uint8Array(Math.ceil(binaryBigInt.length / 8)); let b = value; let i = 0; while (bigIntBytes.byteLength - ++i >= 0) { bigIntBytes[bigIntBytes.byteLength - i] = Number(b & BigInt(255)); b >>= BigInt(8); } ensureSpace(bigIntBytes.byteLength * 2); data[cursor++] = nonNegative ? 0b110_00010 : 0b110_00011; if (USE_BUFFER) { encodeHeader(majorUnstructuredByteString, Buffer.byteLength(bigIntBytes)); } else { encodeHeader(majorUnstructuredByteString, bigIntBytes.byteLength); } data.set(bigIntBytes, cursor); cursor += bigIntBytes.byteLength; } continue; } else if (input === null) { data[cursor++] = (majorSpecial << 5) | specialNull; continue; } else if (typeof input === "boolean") { data[cursor++] = (majorSpecial << 5) | (input ? specialTrue : specialFalse); continue; } else if (typeof input === "undefined") { // Note: Smithy spec requires that undefined not be serialized // though the CBOR spec includes it. throw new Error("@smithy/core/cbor: client may not serialize undefined value."); } else if (Array.isArray(input)) { for (let i = input.length - 1; i >= 0; --i) { encodeStack.push(input[i]); } encodeHeader(majorList, input.length); continue; } else if (typeof input.byteLength === "number") { ensureSpace(input.length * 2); encodeHeader(majorUnstructuredByteString, input.length); data.set(input, cursor); cursor += input.byteLength; continue; } else if (typeof input === "object") { if (input instanceof NumericValue) { const decimalIndex = input.string.indexOf("."); const exponent = decimalIndex === -1 ? 0 : decimalIndex - input.string.length + 1; const mantissa = BigInt(input.string.replace(".", "")); data[cursor++] = 0b110_00100; // major 6, tag 4. encodeStack.push(mantissa); encodeStack.push(exponent); encodeHeader(majorList, 2); continue; } if (input[tagSymbol]) { if ("tag" in input && "value" in input) { encodeStack.push(input.value); encodeHeader(majorTag, input.tag); continue; } else { throw new Error( "tag encountered with missing fields, need 'tag' and 'value', found: " + JSON.stringify(input) ); } } const keys = Object.keys(input); for (let i = keys.length - 1; i >= 0; --i) { const key = keys[i]; encodeStack.push(input[key]); encodeStack.push(key); } encodeHeader(majorMap, keys.length); continue; } throw new Error(`data type ${input?.constructor?.name ?? typeof input} not compatible for encoding.`); } } ================================================ FILE: packages/core/src/submodules/cbor/cbor-types.ts ================================================ export type CborItemType = | undefined | boolean | number | bigint | [CborUnstructuredByteStringType, Uint64] | string | CborTagType; export type CborTagType = { tag: Uint64 | number; value: CborValueType; [tagSymbol]: true; }; export type CborUnstructuredByteStringType = Uint8Array; export type CborListType = Array; export type CborMapType = Record; export type CborCollectionType = CborMapType | CborListType; export type CborValueType = CborItemType | CborCollectionType | any; export type CborArgumentLength = 1 | 2 | 4 | 8; export type CborArgumentLengthOffset = 1 | 2 | 3 | 5 | 9; export type CborOffset = number; export type Uint8 = number; export type Uint32 = number; export type Uint64 = bigint; export type Float32 = number; export type Int64 = bigint; export type Float16Binary = number; export type Float32Binary = number; export type CborMajorType = | typeof majorUint64 | typeof majorNegativeInt64 | typeof majorUnstructuredByteString | typeof majorUtf8String | typeof majorList | typeof majorMap | typeof majorTag | typeof majorSpecial; export const majorUint64 = 0; // 0b000 export const majorNegativeInt64 = 1; // 0b001 export const majorUnstructuredByteString = 2; // 0b010 export const majorUtf8String = 3; // 0b011 export const majorList = 4; // 0b100 export const majorMap = 5; // 0b101 export const majorTag = 6; // 0b110 export const majorSpecial = 7; // 0b111 export const specialFalse = 20; // 0b10100 export const specialTrue = 21; // 0b10101 export const specialNull = 22; // 0b10110 export const specialUndefined = 23; // 0b10111 export const extendedOneByte = 24; // 0b11000 export const extendedFloat16 = 25; // 0b11001 export const extendedFloat32 = 26; // 0b11010 export const extendedFloat64 = 27; // 0b11011 export const minorIndefinite = 31; // 0b11111 export function alloc(size: number): Uint8Array { return typeof Buffer !== "undefined" ? Buffer.alloc(size) : new Uint8Array(size); } /** * The presence of this symbol as an object key indicates it should be considered a tag * for CBOR serialization purposes. * The object must also have the properties "tag" and "value". * * @public */ export const tagSymbol = Symbol("@smithy/core/cbor::tagSymbol"); /** * Applies the tag symbol to the object. * * @public */ export function tag(data: { tag: number | bigint; value: any; [tagSymbol]?: true }): { tag: number | bigint; value: any; [tagSymbol]: true; } { data[tagSymbol] = true; return data as typeof data & { [tagSymbol]: true }; } ================================================ FILE: packages/core/src/submodules/cbor/cbor.spec.ts ================================================ import * as fs from "node:fs"; import * as path from "node:path"; import { NumericValue, nv } from "@smithy/core/serde"; // @ts-ignore import JSONbig from "json-bigint"; import { describe, expect, test as it } from "vitest"; import { printBytes } from "./byte-printer"; import { cbor } from "./cbor"; import { bytesToFloat16 } from "./cbor-decode"; import { tagSymbol } from "./cbor-types"; import { dateToTag } from "./parseCborBody"; // syntax is ESM but the test target is CJS. const here = __dirname; const errorTests = JSONbig({ useNativeBigInt: true, alwaysParseAsBig: false }).parse( fs.readFileSync(path.join(here, "test-data", "decode-error-tests.json")) ); const successTests = JSONbig({ useNativeBigInt: true, alwaysParseAsBig: false }).parse( fs.readFileSync(path.join(here, "test-data", "success-tests.json")) ); describe("cbor", () => { const allocByteArray = (dataOrSize: ArrayBuffer | ArrayLike | number, offset?: number, length?: number) => { if (typeof offset === "number" && typeof length === "number") { return typeof Buffer !== "undefined" ? Buffer.from(dataOrSize as ArrayBuffer, offset, length) : new Uint8Array(dataOrSize as ArrayBuffer, offset, length); } return typeof Buffer !== "undefined" ? Buffer.from(dataOrSize as any) : new Uint8Array(dataOrSize as any); }; const examples = [ { name: "false", data: false, // special major 7 = 0b111 plus false(20) = 0b10100 cbor: allocByteArray([0b111_10100]), }, { name: "true", data: true, // increment from false cbor: allocByteArray([0b111_10101]), }, { name: "null", data: null, // increment from true cbor: allocByteArray([0b111_10110]), }, { name: "an unsigned zero integer", data: 0, // unsigned int major (0) plus 00's. cbor: allocByteArray([0b000_00000]), }, { name: "negative 1", data: -1, // negative major (1) plus 00's, since -1 is the first negative number. cbor: allocByteArray([0b001_00000]), }, { name: "a tricky float", data: [7.624000072479248, 7.624], cbor: allocByteArray([130, 251, 64, 30, 126, 249, 224, 0, 0, 0, 251, 64, 30, 126, 249, 219, 34, 208, 229]), }, { name: "Number.MIN_SAFE_INTEGER", data: -9007199254740991, cbor: allocByteArray([0b001_11011, 0, 31, 255, 255, 255, 255, 255, 254]), }, { name: "Number.MAX_SAFE_INTEGER", data: 9007199254740991, cbor: allocByteArray([0b000_11011, 0, 31, 255, 255, 255, 255, 255, 255]), }, { name: "int64 min", data: BigInt("-18446744073709551616"), cbor: allocByteArray([0b001_11011, 255, 255, 255, 255, 255, 255, 255, 255]), }, { name: "int64 max", data: BigInt("18446744073709551615"), cbor: allocByteArray([0b000_11011, 255, 255, 255, 255, 255, 255, 255, 255]), }, { name: "negative float", data: -3015135.135135135, cbor: allocByteArray([0b111_11011, 193, 71, 0, 239, 145, 76, 27, 173]), }, { name: "positive float", data: 3015135.135135135, cbor: allocByteArray([0b111_11011, 65, 71, 0, 239, 145, 76, 27, 173]), }, { name: "various numbers", data: [ BigInt("18446744073709551615"), 4294967295, 65535, 257, 256, 255, 254, 129, 128, 127, 65, 64, 63, 33, 32, 31, 17, 16, 15, 9, 8, 7, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -7, -8, -9, -15, -16, -17, -31, -32, -33, -63, -64, -65, -127, -128, -129, -254, -255, -256, -257, -65535, -4294967295, -BigInt("18446744073709551616"), ], cbor: allocByteArray([ 152, 55, 27, 255, 255, 255, 255, 255, 255, 255, 255, 26, 255, 255, 255, 255, 25, 255, 255, 25, 1, 1, 25, 1, 0, 24, 255, 24, 254, 24, 129, 24, 128, 24, 127, 24, 65, 24, 64, 24, 63, 24, 33, 24, 32, 24, 31, 17, 16, 15, 9, 8, 7, 5, 4, 3, 2, 1, 0, 32, 33, 34, 35, 36, 38, 39, 40, 46, 47, 48, 56, 30, 56, 31, 56, 32, 56, 62, 56, 63, 56, 64, 56, 126, 56, 127, 56, 128, 56, 253, 56, 254, 56, 255, 57, 1, 0, 57, 255, 254, 58, 255, 255, 255, 254, 59, 255, 255, 255, 255, 255, 255, 255, 255, ]), }, { name: "an empty string", data: "", // string major plus 00's cbor: allocByteArray([0b011_00000]), }, { name: "a short string", data: "hello, world", cbor: allocByteArray([108, 104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100]), }, { name: "simple object", data: { message: "hello, world", }, cbor: allocByteArray([ 161, 103, 109, 101, 115, 115, 97, 103, 101, 108, 104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, ]), }, { name: "date=0", data: dateToTag(new Date(0)), // major tag (6 or 110), minor 1 (timestamp) cbor: allocByteArray([0b11000001, 0]), }, { name: "date=turn of the millenium", data: dateToTag(new Date(946684799999)), // major tag (6 or 110), minor 1 (timestamp) cbor: allocByteArray([0b11000001, 251, 65, 204, 54, 161, 191, 255, 223, 59]), }, { name: "complex object", data: { number: 135019305913059, message: "hello, world", list: [0, false, { a: "b" }], map: { a: "a", b: "b", items: [0, -1, true, false, null, "", "test", ["nested item A", "nested item B"]], }, }, cbor: allocByteArray([ 164, 102, 110, 117, 109, 98, 101, 114, 27, 0, 0, 122, 204, 161, 196, 74, 227, 103, 109, 101, 115, 115, 97, 103, 101, 108, 104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 100, 108, 105, 115, 116, 131, 0, 244, 161, 97, 97, 97, 98, 99, 109, 97, 112, 163, 97, 97, 97, 97, 97, 98, 97, 98, 101, 105, 116, 101, 109, 115, 136, 0, 32, 245, 244, 246, 96, 100, 116, 101, 115, 116, 130, 109, 110, 101, 115, 116, 101, 100, 32, 105, 116, 101, 109, 32, 65, 109, 110, 101, 115, 116, 101, 100, 32, 105, 116, 101, 109, 32, 66, ]), }, { name: "object containing big numbers", data: { map: { items: [BigInt(1e80), BigInt(1e80), nv("0.0000000001234000000001234"), nv("0.0000000001234000000001234")], bigint: BigInt(1e80), bigDecimal: nv("0.0000000001234000000001234"), }, }, cbor: allocByteArray([ 161, 99, 109, 97, 112, 163, 101, 105, 116, 101, 109, 115, 132, 194, 88, 34, 3, 95, 157, 234, 62, 31, 107, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 88, 34, 3, 95, 157, 234, 62, 31, 107, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 130, 56, 24, 27, 0, 4, 98, 81, 3, 167, 36, 210, 196, 130, 56, 24, 27, 0, 4, 98, 81, 3, 167, 36, 210, 102, 98, 105, 103, 105, 110, 116, 194, 88, 34, 3, 95, 157, 234, 62, 31, 107, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 98, 105, 103, 68, 101, 99, 105, 109, 97, 108, 196, 130, 56, 24, 27, 0, 4, 98, 81, 3, 167, 36, 210, ]), }, ]; const toBytes = (hex: string) => { const bytes = [] as number[]; hex.replace(/../g, (substr: string): string => { bytes.push(parseInt(substr, 16)); return substr; }); return allocByteArray(bytes); }; describe("locally curated scenarios", () => { it("should round-trip bigInteger to major 6 with tag 2", () => { const bigInt = BigInt("1267650600228229401496703205376"); const serialized = cbor.serialize(bigInt); const major = serialized[0] >> 5; expect(major).toEqual(0b110); // 6 const tag = serialized[0] & 0b11111; expect(tag).toEqual(0b010); // 2 const byteStringCount = serialized[1]; expect(byteStringCount).toEqual(0b010_01101); // major 2, 13 bytes const byteString = serialized.slice(2); expect(byteString).toEqual(allocByteArray([0b000_10000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); const deserialized = cbor.deserialize(serialized); expect(deserialized).toEqual(bigInt); }); it("should round-trip negative bigInteger to major 6 with tag 3", () => { const bigInt = BigInt("-1267650600228229401496703205377"); const serialized = cbor.serialize(bigInt); const major = serialized[0] >> 5; expect(major).toEqual(0b110); // 6 const tag = serialized[0] & 0b11111; expect(tag).toEqual(0b011); // 3 const byteStringCount = serialized[1]; expect(byteStringCount).toEqual(0b010_01101); // major 2, 13 bytes const byteString = serialized.slice(2); expect(byteString).toEqual(allocByteArray([0b000_10000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])); const deserialized = cbor.deserialize(serialized); expect(deserialized).toEqual(bigInt); }); it("should round-trip NumericValue to major 6 with tag 4", () => { for (const bigDecimal of [ "10000000000000000000000054.321", "1000000000000000000000000000000000054.134134321", "100000000000000000000000000000000000054.0000000000000001", "100000000000000000000000000000000000054.00510351095130000", "-10000000000000000000000054.321", "-1000000000000000000000000000000000054.134134321", "-100000000000000000000000000000000000054.0000000000000001", "-100000000000000000000000000000000000054.00510351095130000", ]) { const nv = new NumericValue(bigDecimal, "bigDecimal"); const serialized = cbor.serialize(nv); const major = serialized[0] >> 5; expect(major).toEqual(0b110); // 6 const tag = serialized[0] & 0b11111; expect(tag).toEqual(0b0100); // 4 const deserialized = cbor.deserialize(serialized); expect(deserialized).toEqual(nv); expect(deserialized.string).toEqual(nv.string); } const bigDecimal = nv("0"); expect(bigDecimal).toBeInstanceOf(NumericValue); expect(printBytes(cbor.serialize(bigDecimal))).toEqual([ "110_00100 (6 - tag, 4)", "100_00010 (4 - list, 2)", "000_00000 (0 - Uint64, 0)", "000_00000 (0 - Uint64, 0)", ]); }); it("should round-trip sequences of big numbers", () => { const sequence = { map: { items1: [ BigInt(1e20), BigInt(2e30), BigInt(3e40), BigInt(4e50), BigInt(5e60), BigInt(6e70), BigInt(7e80), BigInt(8e90), ], items2: [ nv("111.00000000000000000001"), nv("0.000000000000000000002"), nv("333.0000000000000000000003"), nv("0.00000000000000000000004"), nv("-555.000000000000000000000005"), nv("-0.0000000000000000000000006"), nv("-777.00000000000000000000000007"), nv("-0.000000000000000000000000008"), ], items3: [nv("0.0000000001234000000001234"), nv("0.00000000678678001234"), BigInt(1e20), BigInt(2e30)], items4: [ BigInt(1e20), BigInt(2e30), nv("0.0000000001234000000001234"), nv("0.0000067867867801234"), BigInt(1e20), BigInt(2e30), nv("0.0000000001234000000001234"), nv("1.000000000123678678678234"), ], items5: [ nv("0.0000000001234000000001234"), nv("0.00006786781234678678678"), BigInt(1e20), BigInt(2e30), nv("0.0000000001234000000001234"), nv("0.000000000123400000087678634"), BigInt(1e20), BigInt(2e30), ], items6: [ nv("10469069930579305970359073950793057903597035970395069240692049609"), nv("99130490139501395091035901395031950.4928053468045683958609485649280534680456839586094856"), nv("1.000135135000103501305000000000004928053468045683958609485649280534680456839586094856"), nv("1.00013513500010350130500000000000"), nv("0.0000000001234000000001234"), nv("0.0000001"), nv("0.00001"), nv("0.001"), nv("0.000000"), nv("0.0000"), nv("0.00"), nv("0.0"), nv("0"), nv("-0.1"), nv("-0.01"), nv("-0.000000000123400000087678634"), nv("-0.0000000001234000000876786340000000000000000000000000000"), nv("-1.000135135000103501305000000000004928053468045683958609485649280534680456839586094856"), nv("-1.00013513500010350130500000000000"), nv("-100305096350939057390735093.0000000001234000000001234"), nv("-104695047960794069730590793057.0"), nv("-104695047960794069730590793057"), ], }, }; const serialized = cbor.serialize(sequence); const deserialized = cbor.deserialize(serialized); expect(deserialized).toEqual(sequence); }); it("should throw an error if serializing a tag with missing properties", () => { expect(() => cbor.serialize({ myTag: { [tagSymbol]: true, tag: 1, // value: undefined }, }) ).toThrowError("tag encountered with missing fields, need 'tag' and 'value', found: {\"tag\":1}"); cbor.resizeEncodingBuffer(0); }); for (const { name, data, cbor: cbor_representation } of examples) { it(`should encode for ${name}`, async (context) => { if (name === "object containing big numbers") { // skip this test, as it fails in vitest 3.x context.skip(); } const serialized = cbor.serialize(data); expect(allocByteArray(serialized.buffer, serialized.byteOffset, serialized.byteLength)).toEqual( cbor_representation ); }); it(`should decode for ${name}`, async () => { const deserialized = cbor.deserialize(cbor_representation); expect(deserialized).toEqual(data); }); } }); describe("externally curated scenarios", () => { for (const { description, input, error } of errorTests) { it(description, () => { expect(error).toBe(true); const bytes = toBytes(input); expect(() => { cbor.deserialize(bytes); }).toThrow(); }); } function binaryToFloat32(b: number) { const dv = new DataView(new ArrayBuffer(4)); dv.setInt32(0, Number(b)); return dv.getFloat32(0); } function binaryToFloat64(b: number) { const binaryArray = b.toString(2).split("").map(Number); const pad = Array(64).fill(0); const binary64 = new Uint8Array(pad.concat(binaryArray).slice(-64)); const sign = binary64[0]; const exponent = Number("0b" + Array.from(binary64.subarray(1, 12)).join("")); const fraction = binary64.subarray(12); const scalar = (-1) ** sign; let sum = 1; for (let i = 1; i <= 52; ++i) { const position = i - 1; const bit = fraction[position]; sum += 2 ** -i * bit; } const exponentScalar = Math.pow(2, exponent - 1023); return scalar * sum * exponentScalar; } function translateTestData(data: any): any { const [type, value] = Object.entries(data)[0] as [string, any]; switch (type) { case "null": return null; case "uint": case "negint": case "bool": case "string": return value; case "float32": return binaryToFloat32(value); case "float64": return binaryToFloat64(value); case "bytestring": return allocByteArray(value.map(Number)); case "list": return value.map(translateTestData); case "map": const output = {} as Record; for (const [k, v] of Object.entries(value)) { output[k] = translateTestData(v); } return output; case "tag": const { id, value: tagValue } = value; return { tag: id, value: translateTestData(tagValue), [tagSymbol]: true, }; default: throw new Error(`Unrecognized test scenario type ${type}.`); } } for (const { description, input, expect: _expect } of successTests) { const bytes = toBytes(input); const jsObject = translateTestData(_expect); it(`serialization for ${description}`, () => { const serialized = allocByteArray(cbor.serialize(jsObject)); const redeserialized = cbor.deserialize(serialized); /** * We cannot assert that serialized == bytes, * because there are multiple serializations * that deserialize to the same object. */ expect(redeserialized).toEqual(jsObject); }); it(`deserialization for ${description}`, () => { const deserialized = cbor.deserialize(bytes); expect(deserialized).toEqual(jsObject); }); } }); }); describe("bytesToFloat16", () => { it("should convert two bytes to float16", () => { expect(bytesToFloat16(0b0_10100_00, 0b0101_0000)).toEqual(34.5); expect(bytesToFloat16(0b0_00000_00, 0b0000_0000)).toEqual(0.0); expect(bytesToFloat16(0b0_00000_00, 0b0000_0001)).toEqual(5.960464477539063e-8); expect(bytesToFloat16(0b0_00001_00, 0b0000_0000)).toEqual(0.00006103515625); expect(bytesToFloat16(0b0_01101_01, 0b0101_0101)).toEqual(0.333251953125); expect(bytesToFloat16(0b0_01110_11, 0b1111_1111)).toEqual(0.99951171875); expect(bytesToFloat16(0b0_01111_00, 0b0000_0000)).toEqual(1.0); expect(bytesToFloat16(0b0_01111_00, 0b0000_0001)).toEqual(1.0009765625); expect(bytesToFloat16(0b0_11110_11, 0b1111_1111)).toEqual(65504.0); expect(bytesToFloat16(0b0_11111_00, 0b0000_0000)).toEqual(Infinity); // expect(bytesToFloat16(0b1_00000_00, 0b0000_0000)).toEqual(-0); expect(bytesToFloat16(0b1_10000_00, 0b0000_0000)).toEqual(-2); expect(bytesToFloat16(0b1_11111_00, 0b0000_0000)).toEqual(-Infinity); }); }); ================================================ FILE: packages/core/src/submodules/cbor/cbor.ts ================================================ import { decode, setPayload } from "./cbor-decode"; import { encode, resize, toUint8Array } from "./cbor-encode"; /** * This implementation is synchronous and only implements the parts of CBOR * specification used by Smithy RPCv2 CBOR protocol. * * This cbor serde implementation is derived from AWS SDK for Go's implementation. * @see https://github.com/aws/smithy-go/tree/main/encoding/cbor * * The cbor-x implementation was also instructional: * @see https://github.com/kriszyp/cbor-x */ export const cbor = { deserialize(payload: Uint8Array): any { setPayload(payload); return decode(0, payload.length); }, serialize(input: any): Uint8Array { try { encode(input); return toUint8Array(); } catch (e) { toUint8Array(); // resets cursor. throw e; } }, /** * This may be used to garbage collect the CBOR * shared encoding buffer space, * e.g. resizeEncodingBuffer(0); * This may also be used to pre-allocate more space for * CBOR encoding, e.g. resizeEncodingBuffer(100_000_000); * * @public * @param size - byte length to allocate. */ resizeEncodingBuffer(size: number) { resize(size); }, }; ================================================ FILE: packages/core/src/submodules/cbor/index.ts ================================================ export { cbor } from "./cbor"; export { tag, tagSymbol } from "./cbor-types"; export * from "./parseCborBody"; export * from "./SmithyRpcV2CborProtocol"; export * from "./CborCodec"; ================================================ FILE: packages/core/src/submodules/cbor/parseCborBody.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { buildHttpRpcRequest, loadSmithyRpcV2CborErrorCode } from "./parseCborBody"; describe("buildHttpRpcRequest", () => { it("should copy the input headers", async () => { const headers = { "content-type": "application/cbor", "smithy-protocol": "rpc-v2-cbor", accept: "application/cbor", "content-length": "0", }; const request = await buildHttpRpcRequest( { async endpoint() { return { hostname: "https://localhost", path: "/", }; }, } as any, headers, "/", "", "" ); expect(request.headers).toEqual(headers); expect(request.headers).not.toBe(headers); }); }); describe(loadSmithyRpcV2CborErrorCode.name, () => { it("should read the code field case-insensitively", () => { const code = loadSmithyRpcV2CborErrorCode( { statusCode: 200, headers: {} }, { cOdE: "OhNoException:Sender", } ); expect(code).toEqual("OhNoException"); }); }); ================================================ FILE: packages/core/src/submodules/cbor/parseCborBody.ts ================================================ import { HttpRequest as __HttpRequest, collectBody } from "@smithy/core/protocols"; import { calculateBodyLength } from "@smithy/core/serde"; import type { HttpResponse, SerdeContext, HeaderBag as __HeaderBag, SerdeContext as __SerdeContext, } from "@smithy/types"; import { cbor } from "./cbor"; import { tag, type tagSymbol } from "./cbor-types"; /** * @internal */ export const parseCborBody = (streamBody: any, context: SerdeContext): any => { return collectBody(streamBody, context).then(async (bytes) => { if (bytes.length) { try { return cbor.deserialize(bytes); } catch (e: any) { Object.defineProperty(e, "$responseBodyText", { value: context.utf8Encoder(bytes), }); throw e; } } return {}; }); }; /** * @internal */ export const dateToTag = (date: Date): { tag: number | bigint; value: any; [tagSymbol]: true } => { return tag({ tag: 1, value: date.getTime() / 1000, }); }; /** * @internal */ export const parseCborErrorBody = async (errorBody: any, context: SerdeContext) => { const value = await parseCborBody(errorBody, context); value.message = value.message ?? value.Message; return value; }; /** * @internal */ export const loadSmithyRpcV2CborErrorCode = (output: HttpResponse, data: any): string | undefined => { const sanitizeErrorCode = (rawValue: string | number): string => { let cleanValue = rawValue; if (typeof cleanValue === "number") { cleanValue = cleanValue.toString(); } if (cleanValue.indexOf(",") >= 0) { cleanValue = cleanValue.split(",")[0]; } if (cleanValue.indexOf(":") >= 0) { cleanValue = cleanValue.split(":")[0]; } if (cleanValue.indexOf("#") >= 0) { cleanValue = cleanValue.split("#")[1]; } return cleanValue; }; if (data["__type"] !== undefined) { return sanitizeErrorCode(data["__type"]); } let codeKey: string | undefined; for (const key in data) { if (key.toLowerCase() === "code") { codeKey = key; break; } } if (codeKey && data[codeKey] !== undefined) { return sanitizeErrorCode(data[codeKey]); } }; /** * @internal */ export const checkCborResponse = (response: HttpResponse): void => { if (String(response.headers["smithy-protocol"]).toLowerCase() !== "rpc-v2-cbor") { throw new Error("Malformed RPCv2 CBOR response, status: " + response.statusCode); } }; /** * @internal */ export const buildHttpRpcRequest = async ( context: __SerdeContext, headers: __HeaderBag, path: string, resolvedHostname: string | undefined, body: any ): Promise<__HttpRequest> => { const endpoint = await context.endpoint(); const { hostname, protocol = "https", port, path: basePath } = endpoint; const contents: any = { protocol, hostname, port, method: "POST", path: basePath.endsWith("/") ? basePath.slice(0, -1) + path : basePath + path, headers: { // intentional copy. ...headers, }, }; if (resolvedHostname !== undefined) { contents.hostname = resolvedHostname; } if (endpoint.headers) { for (const name in endpoint.headers) { contents.headers[name] = endpoint.headers[name]; } } if (body !== undefined) { contents.body = body; try { contents.headers["content-length"] = String(calculateBodyLength(body)); } catch (e) {} } return new __HttpRequest(contents); }; ================================================ FILE: packages/core/src/submodules/cbor/test-data/decode-error-tests.json ================================================ [ { "description": "TestDecode_InvalidArgument - map/2 - arg len 2 greater than remaining buf len", "input": "b900", "error": true }, { "description": "TestDecode_InvalidArgument - tag/1 - arg len 1 greater than remaining buf len", "input": "d8", "error": true }, { "description": "TestDecode_InvalidArgument - major7/float64 - incomplete float64 at end of buf", "input": "fb00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - negint/4 - arg len 4 greater than remaining buf len", "input": "3a000000", "error": true }, { "description": "TestDecode_InvalidArgument - negint/8 - arg len 8 greater than remaining buf len", "input": "3b00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - string/4 - arg len 4 greater than remaining buf len", "input": "7a000000", "error": true }, { "description": "TestDecode_InvalidArgument - map/1 - arg len 1 greater than remaining buf len", "input": "b8", "error": true }, { "description": "TestDecode_InvalidArgument - map/4 - arg len 4 greater than remaining buf len", "input": "ba000000", "error": true }, { "description": "TestDecode_InvalidArgument - tag/2 - arg len 2 greater than remaining buf len", "input": "d900", "error": true }, { "description": "TestDecode_InvalidArgument - uint/1 - arg len 1 greater than remaining buf len", "input": "18", "error": true }, { "description": "TestDecode_InvalidArgument - string/1 - arg len 1 greater than remaining buf len", "input": "78", "error": true }, { "description": "TestDecode_InvalidArgument - string/8 - arg len 8 greater than remaining buf len", "input": "7b00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - string/2 - arg len 2 greater than remaining buf len", "input": "7900", "error": true }, { "description": "TestDecode_InvalidArgument - list/2 - arg len 2 greater than remaining buf len", "input": "9900", "error": true }, { "description": "TestDecode_InvalidArgument - slice/1 - arg len 1 greater than remaining buf len", "input": "58", "error": true }, { "description": "TestDecode_InvalidArgument - slice/4 - arg len 4 greater than remaining buf len", "input": "5a000000", "error": true }, { "description": "TestDecode_InvalidArgument - slice/8 - arg len 8 greater than remaining buf len", "input": "5b00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - negint/? - unexpected minor value 31", "input": "3f", "error": true }, { "description": "TestDecode_InvalidArgument - tag/8 - arg len 8 greater than remaining buf len", "input": "db00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - uint/2 - arg len 2 greater than remaining buf len", "input": "1900", "error": true }, { "description": "TestDecode_InvalidArgument - uint/8 - arg len 8 greater than remaining buf len", "input": "1b00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - negint/2 - arg len 2 greater than remaining buf len", "input": "3900", "error": true }, { "description": "TestDecode_InvalidArgument - negint/1 - arg len 1 greater than remaining buf len", "input": "38", "error": true }, { "description": "TestDecode_InvalidArgument - list/8 - arg len 8 greater than remaining buf len", "input": "9b00000000000000", "error": true }, { "description": "TestDecode_InvalidArgument - tag/4 - arg len 4 greater than remaining buf len", "input": "da000000", "error": true }, { "description": "TestDecode_InvalidArgument - major7/float32 - incomplete float32 at end of buf", "input": "fa000000", "error": true }, { "description": "TestDecode_InvalidArgument - uint/4 - arg len 4 greater than remaining buf len", "input": "1a000000", "error": true }, { "description": "TestDecode_InvalidArgument - slice/2 - arg len 2 greater than remaining buf len", "input": "5900", "error": true }, { "description": "TestDecode_InvalidArgument - list/4 - arg len 4 greater than remaining buf len", "input": "9a000000", "error": true }, { "description": "TestDecode_InvalidArgument - tag/? - unexpected minor value 31", "input": "df", "error": true }, { "description": "TestDecode_InvalidArgument - major7/? - unexpected minor value 31", "input": "ff", "error": true }, { "description": "TestDecode_InvalidArgument - uint/? - unexpected minor value 31", "input": "1f", "error": true }, { "description": "TestDecode_InvalidArgument - list/1 - arg len 1 greater than remaining buf len", "input": "98", "error": true }, { "description": "TestDecode_InvalidArgument - map/8 - arg len 8 greater than remaining buf len", "input": "bb00000000000000", "error": true }, { "description": "TestDecode_InvalidList - [] / eof after head - unexpected end of payload", "input": "81", "error": true }, { "description": "TestDecode_InvalidList - [] / invalid item - arg len 1 greater than remaining buf len", "input": "8118", "error": true }, { "description": "TestDecode_InvalidList - [_ ] / no break - expected break marker", "input": "9f", "error": true }, { "description": "TestDecode_InvalidList - [_ ] / invalid item - arg len 1 greater than remaining buf len", "input": "9f18", "error": true }, { "description": "TestDecode_InvalidMap - {} / invalid key - slice len 1 greater than remaining buf len", "input": "a17801", "error": true }, { "description": "TestDecode_InvalidMap - {} / invalid value - arg len 1 greater than remaining buf len", "input": "a163666f6f18", "error": true }, { "description": "TestDecode_InvalidMap - {_ } / no break - expected break marker", "input": "bf", "error": true }, { "description": "TestDecode_InvalidMap - {_ } / invalid key - slice len 1 greater than remaining buf len", "input": "bf7801", "error": true }, { "description": "TestDecode_InvalidMap - {_ } / invalid value - arg len 1 greater than remaining buf len", "input": "bf63666f6f18", "error": true }, { "description": "TestDecode_InvalidMap - {} / eof after head - unexpected end of payload", "input": "a1", "error": true }, { "description": "TestDecode_InvalidSlice - slice/1, not enough bytes - slice len 1 greater than remaining buf len", "input": "5801", "error": true }, { "description": "TestDecode_InvalidSlice - slice/?, nested indefinite - nested indefinite slice", "input": "5f5f", "error": true }, { "description": "TestDecode_InvalidSlice - string/?, no break - expected break marker", "input": "7f", "error": true }, { "description": "TestDecode_InvalidSlice - string/?, nested indefinite - nested indefinite slice", "input": "7f7f", "error": true }, { "description": "TestDecode_InvalidSlice - string/?, invalid nested definite - decode subslice: slice len 1 greater than remaining buf len", "input": "7f7801", "error": true }, { "description": "TestDecode_InvalidSlice - slice/?, no break - expected break marker", "input": "5f", "error": true }, { "description": "TestDecode_InvalidSlice - slice/?, invalid nested major - unexpected major type 3 in indefinite slice", "input": "5f60", "error": true }, { "description": "TestDecode_InvalidSlice - slice/?, invalid nested definite - decode subslice: slice len 1 greater than remaining buf len", "input": "5f5801", "error": true }, { "description": "TestDecode_InvalidSlice - string/1, not enough bytes - slice len 1 greater than remaining buf len", "input": "7801", "error": true }, { "description": "TestDecode_InvalidSlice - string/?, invalid nested major - unexpected major type 2 in indefinite slice", "input": "7f40", "error": true }, { "description": "TestDecode_InvalidTag - invalid value - arg len 1 greater than remaining buf len", "input": "c118", "error": true }, { "description": "TestDecode_InvalidTag - eof - unexpected end of payload", "input": "c1", "error": true } ] ================================================ FILE: packages/core/src/submodules/cbor/test-data/success-tests.json ================================================ [ { "description": "atomic - uint/0/max", "input": "17", "expect": { "uint": 23 } }, { "description": "atomic - uint/2/min", "input": "190000", "expect": { "uint": 0 } }, { "description": "atomic - uint/8/min", "input": "1b0000000000000000", "expect": { "uint": 0 } }, { "description": "atomic - negint/1/min", "input": "3800", "expect": { "negint": -1 } }, { "description": "atomic - negint/2/min", "input": "390000", "expect": { "negint": -1 } }, { "description": "atomic - false", "input": "f4", "expect": { "bool": false } }, { "description": "atomic - uint/1/min", "input": "1800", "expect": { "uint": 0 } }, { "description": "atomic - negint/8/min", "input": "3b0000000000000000", "expect": { "negint": -1 } }, { "description": "atomic - float64/+Inf", "input": "fb7ff0000000000000", "expect": { "float64": 9218868437227405312 } }, { "description": "atomic - uint/4/min", "input": "1a00000000", "expect": { "uint": 0 } }, { "description": "atomic - null", "input": "f6", "expect": { "null": {} } }, { "description": "atomic - negint/2/max", "input": "39ffff", "expect": { "negint": -65536 } }, { "description": "atomic - negint/8/max", "input": "3bfffffffffffffffe", "expect": { "negint": -18446744073709551615 } }, { "description": "atomic - float32/1.625", "input": "fa3fd00000", "expect": { "float32": 1070596096 } }, { "description": "atomic - uint/0/min", "input": "00", "expect": { "uint": 0 } }, { "description": "atomic - uint/1/max", "input": "18ff", "expect": { "uint": 255 } }, { "description": "atomic - uint/8/max", "input": "1bffffffffffffffff", "expect": { "uint": 18446744073709551615 } }, { "description": "atomic - negint/1/max", "input": "38ff", "expect": { "negint": -256 } }, { "description": "atomic - negint/4/min", "input": "3a00000000", "expect": { "negint": -1 } }, { "description": "atomic - float64/1.625", "input": "fb3ffa000000000000", "expect": { "float64": 4609997168567123968 } }, { "description": "atomic - uint/2/max", "input": "19ffff", "expect": { "uint": 65535 } }, { "description": "atomic - negint/0/max", "input": "37", "expect": { "negint": -24 } }, { "description": "atomic - negint/4/max", "input": "3affffffff", "expect": { "negint": -4294967296 } }, { "description": "atomic - uint/4/max", "input": "1affffffff", "expect": { "uint": 4294967295 } }, { "description": "atomic - negint/0/min", "input": "20", "expect": { "negint": -1 } }, { "description": "atomic - true", "input": "f5", "expect": { "bool": true } }, { "description": "atomic - float32/+Inf", "input": "fa7f800000", "expect": { "float32": 2139095040 } }, { "description": "definite slice - len = 0", "input": "40", "expect": { "bytestring": [] } }, { "description": "definite slice - len \u003e 0", "input": "43666f6f", "expect": { "bytestring": [102, 111, 111] } }, { "description": "definite string - len = 0", "input": "60", "expect": { "string": "" } }, { "description": "definite string - len \u003e 0", "input": "63666f6f", "expect": { "string": "foo" } }, { "description": "indefinite slice - len = 0", "input": "5fff", "expect": { "bytestring": [] } }, { "description": "indefinite slice - len = 0, explicit", "input": "5f40ff", "expect": { "bytestring": [] } }, { "description": "indefinite slice - len = 0, len \u003e 0", "input": "5f4043666f6fff", "expect": { "bytestring": [102, 111, 111] } }, { "description": "indefinite slice - len \u003e 0, len = 0", "input": "5f43666f6f40ff", "expect": { "bytestring": [102, 111, 111] } }, { "description": "indefinite slice - len \u003e 0, len \u003e 0", "input": "5f43666f6f43666f6fff", "expect": { "bytestring": [102, 111, 111, 102, 111, 111] } }, { "description": "indefinite string - len = 0", "input": "7fff", "expect": { "string": "" } }, { "description": "indefinite string - len = 0, explicit", "input": "7f60ff", "expect": { "string": "" } }, { "description": "indefinite string - len = 0, len \u003e 0", "input": "7f6063666f6fff", "expect": { "string": "foo" } }, { "description": "indefinite string - len \u003e 0, len = 0", "input": "7f63666f6f60ff", "expect": { "string": "foo" } }, { "description": "indefinite string - len \u003e 0, len \u003e 0", "input": "7f63666f6f63666f6fff", "expect": { "string": "foofoo" } }, { "description": "list - [float64]", "input": "81fb7ff0000000000000", "expect": { "list": [ { "float64": 9218868437227405312 } ] } }, { "description": "list - [_ negint/4/min]", "input": "9f3a00000000ff", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [uint/1/min]", "input": "811800", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [_ uint/4/min]", "input": "9f1a00000000ff", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [uint/0/max]", "input": "8117", "expect": { "list": [ { "uint": 23 } ] } }, { "description": "list - [uint/1/max]", "input": "8118ff", "expect": { "list": [ { "uint": 255 } ] } }, { "description": "list - [negint/2/min]", "input": "81390000", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [negint/8/min]", "input": "813b0000000000000000", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [_ uint/2/min]", "input": "9f190000ff", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [uint/0/min]", "input": "8100", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [negint/0/min]", "input": "8120", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [negint/0/max]", "input": "8137", "expect": { "list": [ { "negint": -24 } ] } }, { "description": "list - [negint/1/min]", "input": "813800", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [negint/1/max]", "input": "8138ff", "expect": { "list": [ { "negint": -256 } ] } }, { "description": "list - [negint/4/max]", "input": "813affffffff", "expect": { "list": [ { "negint": -4294967296 } ] } }, { "description": "list - [_ uint/4/max]", "input": "9f1affffffffff", "expect": { "list": [ { "uint": 4294967295 } ] } }, { "description": "list - [_ negint/0/max]", "input": "9f37ff", "expect": { "list": [ { "negint": -24 } ] } }, { "description": "list - [uint/2/min]", "input": "81190000", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [_ false]", "input": "9ff4ff", "expect": { "list": [ { "bool": false } ] } }, { "description": "list - [_ float32]", "input": "9ffa7f800000ff", "expect": { "list": [ { "float32": 2139095040 } ] } }, { "description": "list - [_ negint/1/max]", "input": "9f38ffff", "expect": { "list": [ { "negint": -256 } ] } }, { "description": "list - [uint/8/max]", "input": "811bffffffffffffffff", "expect": { "list": [ { "uint": 18446744073709551615 } ] } }, { "description": "list - [negint/4/min]", "input": "813a00000000", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [negint/8/max]", "input": "813bfffffffffffffffe", "expect": { "list": [ { "negint": -18446744073709551615 } ] } }, { "description": "list - [_ negint/2/min]", "input": "9f390000ff", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [_ negint/4/max]", "input": "9f3affffffffff", "expect": { "list": [ { "negint": -4294967296 } ] } }, { "description": "list - [_ true]", "input": "9ff5ff", "expect": { "list": [ { "bool": true } ] } }, { "description": "list - [_ null]", "input": "9ff6ff", "expect": { "list": [ { "null": {} } ] } }, { "description": "list - [uint/8/min]", "input": "811b0000000000000000", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [null]", "input": "81f6", "expect": { "list": [ { "null": {} } ] } }, { "description": "list - [_ uint/1/min]", "input": "9f1800ff", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [_ uint/1/max]", "input": "9f18ffff", "expect": { "list": [ { "uint": 255 } ] } }, { "description": "list - [_ uint/2/max]", "input": "9f19ffffff", "expect": { "list": [ { "uint": 65535 } ] } }, { "description": "list - [_ uint/8/min]", "input": "9f1b0000000000000000ff", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [_ negint/8/min]", "input": "9f3b0000000000000000ff", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [_ float64]", "input": "9ffb7ff0000000000000ff", "expect": { "list": [ { "float64": 9218868437227405312 } ] } }, { "description": "list - [uint/4/min]", "input": "811a00000000", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [true]", "input": "81f5", "expect": { "list": [ { "bool": true } ] } }, { "description": "list - [float32]", "input": "81fa7f800000", "expect": { "list": [ { "float32": 2139095040 } ] } }, { "description": "list - [_ uint/0/min]", "input": "9f00ff", "expect": { "list": [ { "uint": 0 } ] } }, { "description": "list - [_ uint/0/max]", "input": "9f17ff", "expect": { "list": [ { "uint": 23 } ] } }, { "description": "list - [_ uint/8/max]", "input": "9f1bffffffffffffffffff", "expect": { "list": [ { "uint": 18446744073709551615 } ] } }, { "description": "list - [_ negint/1/min]", "input": "9f3800ff", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [_ negint/2/max]", "input": "9f39ffffff", "expect": { "list": [ { "negint": -65536 } ] } }, { "description": "list - [uint/2/max]", "input": "8119ffff", "expect": { "list": [ { "uint": 65535 } ] } }, { "description": "list - [negint/2/max]", "input": "8139ffff", "expect": { "list": [ { "negint": -65536 } ] } }, { "description": "list - [false]", "input": "81f4", "expect": { "list": [ { "bool": false } ] } }, { "description": "list - [_ negint/0/min]", "input": "9f20ff", "expect": { "list": [ { "negint": -1 } ] } }, { "description": "list - [_ negint/8/max]", "input": "9f3bfffffffffffffffeff", "expect": { "list": [ { "negint": -18446744073709551615 } ] } }, { "description": "list - [uint/4/max]", "input": "811affffffff", "expect": { "list": [ { "uint": 4294967295 } ] } }, { "description": "map - {uint/0/min}", "input": "a163666f6f00", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {uint/4/max}", "input": "a163666f6f1affffffff", "expect": { "map": { "foo": { "uint": 4294967295 } } } }, { "description": "map - {negint/0/min}", "input": "a163666f6f20", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ float32}", "input": "bf63666f6ffa7f800000ff", "expect": { "map": { "foo": { "float32": 2139095040 } } } }, { "description": "map - {false}", "input": "a163666f6ff4", "expect": { "map": { "foo": { "bool": false } } } }, { "description": "map - {float32}", "input": "a163666f6ffa7f800000", "expect": { "map": { "foo": { "float32": 2139095040 } } } }, { "description": "map - {_ uint/0/max}", "input": "bf63666f6f17ff", "expect": { "map": { "foo": { "uint": 23 } } } }, { "description": "map - {_ negint/2/min}", "input": "bf63666f6f390000ff", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ false}", "input": "bf63666f6ff4ff", "expect": { "map": { "foo": { "bool": false } } } }, { "description": "map - {uint/8/min}", "input": "a163666f6f1b0000000000000000", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ negint/0/max}", "input": "bf63666f6f37ff", "expect": { "map": { "foo": { "negint": -24 } } } }, { "description": "map - {_ null}", "input": "bf63666f6ff6ff", "expect": { "map": { "foo": { "null": {} } } } }, { "description": "map - {uint/1/min}", "input": "a163666f6f1800", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ uint/1/min}", "input": "bf63666f6f1800ff", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ uint/8/max}", "input": "bf63666f6f1bffffffffffffffffff", "expect": { "map": { "foo": { "uint": 18446744073709551615 } } } }, { "description": "map - {_ negint/0/min}", "input": "bf63666f6f20ff", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ negint/1/min}", "input": "bf63666f6f3800ff", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ negint/1/max}", "input": "bf63666f6f38ffff", "expect": { "map": { "foo": { "negint": -256 } } } }, { "description": "map - {_ negint/2/max}", "input": "bf63666f6f39ffffff", "expect": { "map": { "foo": { "negint": -65536 } } } }, { "description": "map - {_ negint/4/min}", "input": "bf63666f6f3a00000000ff", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ true}", "input": "bf63666f6ff5ff", "expect": { "map": { "foo": { "bool": true } } } }, { "description": "map - {uint/2/max}", "input": "a163666f6f19ffff", "expect": { "map": { "foo": { "uint": 65535 } } } }, { "description": "map - {uint/8/max}", "input": "a163666f6f1bffffffffffffffff", "expect": { "map": { "foo": { "uint": 18446744073709551615 } } } }, { "description": "map - {negint/0/max}", "input": "a163666f6f37", "expect": { "map": { "foo": { "negint": -24 } } } }, { "description": "map - {negint/1/max}", "input": "a163666f6f38ff", "expect": { "map": { "foo": { "negint": -256 } } } }, { "description": "map - {negint/2/max}", "input": "a163666f6f39ffff", "expect": { "map": { "foo": { "negint": -65536 } } } }, { "description": "map - {negint/4/min}", "input": "a163666f6f3a00000000", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {negint/8/max}", "input": "a163666f6f3bfffffffffffffffe", "expect": { "map": { "foo": { "negint": -18446744073709551615 } } } }, { "description": "map - {float64}", "input": "a163666f6ffb7ff0000000000000", "expect": { "map": { "foo": { "float64": 9218868437227405312 } } } }, { "description": "map - {_ uint/0/min}", "input": "bf63666f6f00ff", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ uint/4/min}", "input": "bf63666f6f1a00000000ff", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ uint/8/min}", "input": "bf63666f6f1b0000000000000000ff", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {uint/1/max}", "input": "a163666f6f18ff", "expect": { "map": { "foo": { "uint": 255 } } } }, { "description": "map - {negint/2/min}", "input": "a163666f6f390000", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {negint/8/min}", "input": "a163666f6f3b0000000000000000", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {true}", "input": "a163666f6ff5", "expect": { "map": { "foo": { "bool": true } } } }, { "description": "map - {_ uint/2/min}", "input": "bf63666f6f190000ff", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {_ negint/8/min}", "input": "bf63666f6f3b0000000000000000ff", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ negint/8/max}", "input": "bf63666f6f3bfffffffffffffffeff", "expect": { "map": { "foo": { "negint": -18446744073709551615 } } } }, { "description": "map - {uint/0/max}", "input": "a163666f6f17", "expect": { "map": { "foo": { "uint": 23 } } } }, { "description": "map - {negint/4/max}", "input": "a163666f6f3affffffff", "expect": { "map": { "foo": { "negint": -4294967296 } } } }, { "description": "map - {null}", "input": "a163666f6ff6", "expect": { "map": { "foo": { "null": {} } } } }, { "description": "map - {_ uint/4/max}", "input": "bf63666f6f1affffffffff", "expect": { "map": { "foo": { "uint": 4294967295 } } } }, { "description": "map - {_ float64}", "input": "bf63666f6ffb7ff0000000000000ff", "expect": { "map": { "foo": { "float64": 9218868437227405312 } } } }, { "description": "map - {uint/2/min}", "input": "a163666f6f190000", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {uint/4/min}", "input": "a163666f6f1a00000000", "expect": { "map": { "foo": { "uint": 0 } } } }, { "description": "map - {negint/1/min}", "input": "a163666f6f3800", "expect": { "map": { "foo": { "negint": -1 } } } }, { "description": "map - {_ uint/1/max}", "input": "bf63666f6f18ffff", "expect": { "map": { "foo": { "uint": 255 } } } }, { "description": "map - {_ uint/2/max}", "input": "bf63666f6f19ffffff", "expect": { "map": { "foo": { "uint": 65535 } } } }, { "description": "map - {_ negint/4/max}", "input": "bf63666f6f3affffffffff", "expect": { "map": { "foo": { "negint": -4294967296 } } } }, { "description": "tag - 0/min", "input": "c001", "expect": { "tag": { "id": 0, "value": { "uint": 1 } } } }, { "description": "tag - 1/min", "input": "d80001", "expect": { "tag": { "id": 0, "value": { "uint": 1 } } } }, { "description": "tag - 1/max", "input": "d8ff01", "expect": { "tag": { "id": 255, "value": { "uint": 1 } } } }, { "description": "tag - 4/min", "input": "da0000000001", "expect": { "tag": { "id": 0, "value": { "uint": 1 } } } }, { "description": "tag - 8/min", "input": "db000000000000000001", "expect": { "tag": { "id": 0, "value": { "uint": 1 } } } }, { "description": "tag - 0/max", "input": "d701", "expect": { "tag": { "id": 23, "value": { "uint": 1 } } } }, { "description": "tag - 2/min", "input": "d9000001", "expect": { "tag": { "id": 0, "value": { "uint": 1 } } } }, { "description": "tag - 2/max", "input": "d9ffff01", "expect": { "tag": { "id": 65535, "value": { "uint": 1 } } } }, { "description": "tag - 4/max", "input": "daffffffff01", "expect": { "tag": { "id": 4294967295, "value": { "uint": 1 } } } }, { "description": "tag - 8/max", "input": "dbffffffffffffffff01", "expect": { "tag": { "id": 18446744073709551615, "value": { "uint": 1 } } } } ] ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/CHANGELOG.chunked-blob-reader-native.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.3 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-base64@4.3.2 ## 4.2.2 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/util-base64@4.3.1 ## 4.2.1 ### Patch Changes - Updated dependencies [813c9a5] - @smithy/util-base64@4.3.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/util-base64@4.2.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - @smithy/util-base64@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-base64@4.0.0 ## 3.0.1 ### Patch Changes - c257049: replace FileReader with Blob.arrayBuffer() where possible ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [671aa704] - @smithy/util-base64@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - @smithy/util-base64@2.3.0 ## 2.1.3 ### Patch Changes - Updated dependencies [8e8f3513] - @smithy/util-base64@2.2.1 ## 2.1.2 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-base64@2.2.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/util-base64@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-base64@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-base64@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-base64@2.0.0 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/util-base64@1.1.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-base64@1.0.2 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-base64@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/chunked-blob-reader-native](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/chunked-blob-reader-native/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/CHANGELOG.chunked-blob-reader.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 5.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 5.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 5.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 5.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 5.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 4.0.0 ### Major Changes - c257049: replace FileReader with Blob.arrayBuffer() where possible ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/chunked-blob-reader](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/chunked-blob-reader/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/chunked-blob-reader.native.spec.ts ================================================ // @vitest-environment happy-dom import { describe, expect, test as it } from "vitest"; import { blobReader } from "./chunked-blob-reader.native"; describe("blobReader", () => { it("reads an entire blob", async () => { const longMessage: number[] = []; for (let i = 0; i < 1024 * 1024 * 5; i += 4) { longMessage.push(102, 111, 111, 32); // 'foo ' } const blob = new Blob([Uint8Array.from(longMessage)]); let totalBytes = 0; await blobReader(blob, (chunk) => { totalBytes += chunk.byteLength; }); expect(totalBytes).toBe(1024 * 1024 * 5); }); it("respects the chunk size", async () => { const message = new Uint8Array(100); message.fill(0); const blob = new Blob([message]); const chunkSizes: number[] = []; await blobReader( blob, (chunk) => { chunkSizes.push(chunk.byteLength); }, 12 // chunk size in bytes ); expect(chunkSizes.length).toBe(9); for (let i = 0; i < chunkSizes.length; i++) { if (i < chunkSizes.length - 1) { expect(chunkSizes[i]).toBe(12); } else { expect(chunkSizes[i]).toBe(4); } } }); }); ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/chunked-blob-reader.native.ts ================================================ import { fromBase64 } from "@smithy/core/serde"; /** * @internal */ export function blobReader( blob: Blob, onChunk: (chunk: Uint8Array) => void, chunkSize: number = 1024 * 1024 ): Promise { return new Promise((resolve, reject) => { /** * TODO(react-native): https://github.com/facebook/react-native/issues/34402 * To drop FileReader in react-native, we need the Blob.arrayBuffer() method to work. */ const fileReader = new FileReader(); fileReader.onerror = reject; fileReader.onabort = reject; const size = blob.size; let totalBytesRead = 0; const read = () => { if (totalBytesRead >= size) { resolve(); return; } fileReader.readAsDataURL(blob.slice(totalBytesRead, Math.min(size, totalBytesRead + chunkSize))); }; fileReader.onload = (event) => { const result = (event.target as any).result; // reference: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL // response from readAsDataURL is always prepended with "data:*/*;base64," const dataOffset = result.indexOf(",") + 1; const data = result.substring(dataOffset); const decoded = fromBase64(data); onChunk(decoded); totalBytesRead += decoded.byteLength; // read the next block read(); }; // kick off the read read(); }); } ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/chunked-blob-reader.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { blobReader } from "./chunked-blob-reader"; describe("blobReader", () => { it("reads an entire blob", async () => { const longMessage: number[] = []; for (let i = 0; i < 1024 * 1024 * 5; i += 4) { longMessage.push(102, 111, 111, 32); // 'foo ' } const blob = new Blob([Uint8Array.from(longMessage)]); let totalBytes = 0; await blobReader(blob, (chunk) => { totalBytes += chunk.byteLength; }); expect(totalBytes).toBe(1024 * 1024 * 5); }); it("respects the chunk size", async () => { const message = new Uint8Array(100); message.fill(0); const blob = new Blob([message]); const chunkSizes: number[] = []; await blobReader( blob, (chunk) => { chunkSizes.push(chunk.byteLength); }, 12 // chunk size in bytes ); expect(chunkSizes.length).toBe(9); for (let i = 0; i < chunkSizes.length; i++) { if (i < chunkSizes.length - 1) { expect(chunkSizes[i]).toBe(12); } else { expect(chunkSizes[i]).toBe(4); } } }); }); ================================================ FILE: packages/core/src/submodules/checksum/chunked-blob-reader/chunked-blob-reader.ts ================================================ /** * Reads the blob data into the onChunk consumer. * * @internal */ export async function blobReader( blob: Blob, onChunk: (chunk: Uint8Array) => void, chunkSize: number = 1024 * 1024 ): Promise { const size = blob.size; let totalBytesRead = 0; while (totalBytesRead < size) { const slice: Blob = blob.slice(totalBytesRead, Math.min(size, totalBytesRead + chunkSize)); onChunk(new Uint8Array(await slice.arrayBuffer())); totalBytesRead += slice.size; } } ================================================ FILE: packages/core/src/submodules/checksum/hash-blob-browser/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.15 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.14 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.13 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.12 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/chunked-blob-reader-native@4.2.3 - @smithy/chunked-blob-reader@5.2.2 ## 4.2.11 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.10 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/chunked-blob-reader@5.2.1 - @smithy/chunked-blob-reader-native@4.2.2 - @smithy/types@4.12.1 ## 4.2.9 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.8 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.7 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.6 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.5 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.1 ### Patch Changes - @smithy/chunked-blob-reader-native@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/chunked-blob-reader@5.2.0 - @smithy/chunked-blob-reader-native@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/chunked-blob-reader-native@4.1.0 - @smithy/chunked-blob-reader@5.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/chunked-blob-reader-native@4.0.0 - @smithy/chunked-blob-reader@5.0.0 - @smithy/types@4.0.0 ## 3.1.10 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.9 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.8 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.7 ### Patch Changes - Updated dependencies [c257049] - Updated dependencies [84bec05] - @smithy/chunked-blob-reader@4.0.0 - @smithy/chunked-blob-reader-native@3.0.1 - @smithy/types@3.6.0 ## 3.1.6 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.5 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.4 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.3 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.2 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.1 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.1.0 ### Minor Changes - 3c23a83b: update versions of @aws-crypto/\* packages ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/chunked-blob-reader-native@3.0.0 - @smithy/chunked-blob-reader@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/chunked-blob-reader-native@2.2.0 - @smithy/chunked-blob-reader@2.2.0 - @smithy/types@2.12.0 ## 2.1.5 ### Patch Changes - @smithy/chunked-blob-reader-native@2.1.3 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/chunked-blob-reader-native@2.1.2 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/chunked-blob-reader@2.1.1 - @smithy/chunked-blob-reader-native@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/chunked-blob-reader-native@2.1.0 - @smithy/chunked-blob-reader@2.1.0 - @smithy/types@2.9.0 ## 2.0.17 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.16 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.15 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.14 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.13 ### Patch Changes - 5598a033: update bundler replacement directives in package.json - @smithy/chunked-blob-reader-native@2.0.1 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/chunked-blob-reader@2.0.0 - @smithy/chunked-blob-reader-native@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/chunked-blob-reader@1.1.0 - @smithy/chunked-blob-reader-native@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - 99d00e98: Bump webpack to 5.76.0 - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - 6eedc3ae: Added missing chunked-blob-reader-native dependency - Updated dependencies [6e312329] - @smithy/chunked-blob-reader-native@1.0.2 - @smithy/chunked-blob-reader@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/chunked-blob-reader@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/hash-blob-browser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/hash-blob-browser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/checksum/hash-blob-browser/blobHasher.spec.ts ================================================ import { toHex } from "@smithy/core/serde"; import { describe, expect, test as it } from "vitest"; import { blobHasher } from "./blobHasher"; describe("blobHasher", () => { const blob = new Blob(["test-string"]); class Hash { public value: string = ""; update(value: string) { this.value = value; } async digest() { return new TextEncoder().encode(this.value); } } it("calls update and digest of the given Hash class on the blob", async () => { const result = await blobHasher(Hash, blob); expect(result instanceof Uint8Array).toBe(true); expect(toHex(result)).toBe("3131362c3130312c3131352c3131362c34352c3131352c3131362c3131342c3130352c3131302c313033"); }); }); ================================================ FILE: packages/core/src/submodules/checksum/hash-blob-browser/blobHasher.ts ================================================ import type { ChecksumConstructor, HashConstructor, StreamHasher } from "@smithy/types"; import { blobReader } from "../chunked-blob-reader/chunked-blob-reader"; /** * @internal */ export const blobHasher: StreamHasher = async function blobHasher( hashCtor: ChecksumConstructor | HashConstructor, blob: Blob ): Promise { const hash = new hashCtor(); await blobReader(blob, (chunk) => { hash.update(chunk); }); return hash.digest(); }; ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-utf8@4.2.2 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 - @smithy/util-utf8@4.2.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 - @smithy/util-utf8@4.2.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-utf8@4.0.0 - @smithy/types@4.0.0 ## 3.1.10 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.9 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.8 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.7 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.1.6 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.5 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.4 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.3 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.2 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.1 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.1.0 ### Minor Changes - 3c23a83b: update versions of @aws-crypto/\* packages ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.18 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.17 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.14 ### Patch Changes - Updated dependencies [f2a04b7e] - @smithy/util-utf8@2.0.2 ## 2.0.13 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-utf8@2.0.1 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-utf8@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-utf8@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-utf8@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-utf8@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/hash-stream-node](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/hash-stream-node/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/HashCalculator.spec.ts ================================================ import { toUint8Array } from "@smithy/core/serde"; import { describe, expect, test as it } from "vitest"; import { HashCalculator } from "./HashCalculator"; function createMockHash(): { updates: Uint8Array[]; update: (data: Uint8Array) => void; digest: () => Promise; reset: () => void; } { const mockHash: any = { updates: [] as Uint8Array[], }; mockHash.update = (data: Uint8Array) => { mockHash.updates.push(data); }; mockHash.digest = async () => { return Uint8Array.from([102, 111, 111]); // foo }; mockHash.reset = () => {}; return mockHash; } describe("HashCalculator", () => { const writePromise = ( calculator: HashCalculator, chunk: Buffer, encoding: BufferEncoding = "utf-8" ): Promise => { return new Promise((resolve, reject) => { calculator.write(chunk, encoding, (err) => { if (err) { reject(err); } else { resolve(); } }); }); }; const listOfBuffers: Buffer[] = [Buffer.from("foo"), Buffer.from("bar"), Buffer.from("buzz")]; it("updates a hash from upstream stream", async () => { const mockHash = createMockHash(); const calculator = new HashCalculator(mockHash); await writePromise(calculator, listOfBuffers[0]); await writePromise(calculator, listOfBuffers[1]); await writePromise(calculator, listOfBuffers[2]); calculator.end(); // verify that update was called the correct number of times expect(mockHash.updates.length).toBe(3); expect(mockHash.updates[0]).toEqual(toUint8Array(listOfBuffers[0])); expect(mockHash.updates[1]).toEqual(toUint8Array(listOfBuffers[1])); expect(mockHash.updates[2]).toEqual(toUint8Array(listOfBuffers[2])); }); }); ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/HashCalculator.ts ================================================ import { Writable, type WritableOptions } from "node:stream"; import { toUint8Array } from "@smithy/core/serde"; import type { Checksum, Hash } from "@smithy/types"; /** * @internal */ export class HashCalculator extends Writable { constructor( public readonly hash: Checksum | Hash, options?: WritableOptions ) { super(options); } _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void) { try { this.hash.update(toUint8Array(chunk)); } catch (err) { return callback(err); } callback(); } } ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/fileStreamHasher.spec.ts ================================================ import { createReadStream, mkdtempSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { Readable } from "node:stream"; import { Sha256 } from "@aws-crypto/sha256-js"; import { toHex } from "@smithy/core/serde"; import { describe, expect, test as it, vi } from "vitest"; import { fileStreamHasher } from "./fileStreamHasher"; function createTemporaryFile(contents: string): string { const folder = mkdtempSync(join(tmpdir(), "sha256-stream-node-")); const fileLoc = join(folder, "test.txt"); writeFileSync(fileLoc, contents); return fileLoc; } describe("fileStreamHasher", () => { const temporaryFile = createTemporaryFile( "Shot through the bar, but you're too late bizzbuzz you give foo, a bad name." ); it("calculates the SHA256 hash of a stream", async () => { const result = await fileStreamHasher(Sha256, createReadStream(temporaryFile)); expect(result instanceof Uint8Array).toBe(true); expect(toHex(result)).toBe("24dabf4db3774a3224d571d4c089a9c570c3045dbe1e67ee9ee2e2677f57dbe0"); }); it("does not exhaust the input stream", async () => { const inputStream = createReadStream(temporaryFile); const onSpy = vi.spyOn(inputStream, "on"); const pipeSpy = vi.spyOn(inputStream, "pipe"); const result = await fileStreamHasher(Sha256, inputStream); expect(result instanceof Uint8Array).toBe(true); expect(toHex(result)).toBe("24dabf4db3774a3224d571d4c089a9c570c3045dbe1e67ee9ee2e2677f57dbe0"); expect(onSpy.mock.calls.length).toBe(0); expect(pipeSpy.mock.calls.length).toBe(0); }); it("throws an error when a non-file stream is encountered", async () => { const inputStream = new Readable(); await expect(fileStreamHasher(Sha256, inputStream as any)).rejects.toHaveProperty("message"); }); }); ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/fileStreamHasher.ts ================================================ import { createReadStream, type ReadStream } from "node:fs"; import type { Readable } from "node:stream"; import type { HashConstructor, StreamHasher } from "@smithy/types"; import { HashCalculator } from "./HashCalculator"; // ToDo: deprecate in favor of readableStreamHasher /** * @internal */ export const fileStreamHasher: StreamHasher = (hashCtor: HashConstructor, fileStream: Readable) => new Promise((resolve, reject) => { if (!isReadStream(fileStream)) { reject(new Error("Unable to calculate hash for non-file streams.")); return; } const fileStreamTee = createReadStream(fileStream.path, { start: (fileStream as any).start, end: (fileStream as any).end, }); const hash = new hashCtor(); const hashCalculator = new HashCalculator(hash); fileStreamTee.pipe(hashCalculator); fileStreamTee.on("error", (err: any) => { // if the source errors, the destination stream needs to manually end hashCalculator.end(); reject(err); }); hashCalculator.on("error", reject); hashCalculator.on("finish", function (this: HashCalculator) { hash.digest().then(resolve).catch(reject); }); }); const isReadStream = (stream: Readable): stream is ReadStream => typeof (stream as ReadStream).path === "string"; ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/readableStreamHasher.spec.ts ================================================ import { Readable, Writable } from "node:stream"; import type { Hash } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { HashCalculator } from "./HashCalculator"; import { readableStreamHasher } from "./readableStreamHasher"; vi.mock("./HashCalculator"); describe(readableStreamHasher.name, () => { const mockDigest = vi.fn(); const mockHashCtor = vi.fn().mockImplementation(() => ({ update: vi.fn(), digest: mockDigest, })); const mockHashCalculatorWrite = vi.fn(); const mockHashCalculatorEnd = vi.fn(); const mockHash = new Uint8Array(Buffer.from("mockHash")); class MockHashCalculator extends Writable { constructor( public readonly hash: Hash, public readonly mockWrite: any, public readonly mockEnd: any ) { super(); } _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void) { this.mockWrite(chunk); callback(); } end() { this.mockEnd(); return super.end(); } } beforeEach(() => { (HashCalculator as unknown as any).mockImplementation( (hash: Hash) => new MockHashCalculator(hash, mockHashCalculatorWrite, mockHashCalculatorEnd) ); mockDigest.mockResolvedValue(mockHash); }); afterEach(() => { vi.clearAllMocks(); }); it("computes hash for a readable stream", async () => { const readableStream = new Readable({ read: () => {} }); const hashPromise = readableStreamHasher(mockHashCtor, readableStream); // @ts-ignore Property '_readableState' does not exist on type 'Readable'. const { pipesCount } = readableStream._readableState; expect(pipesCount).toEqual(1); const mockDataChunks = ["Hello", "World"]; setTimeout(() => { mockDataChunks.forEach((chunk) => readableStream.emit("data", chunk)); readableStream.emit("end"); }, 100); expect(await hashPromise).toEqual(mockHash); expect(mockHashCalculatorWrite).toHaveBeenCalledTimes(mockDataChunks.length); mockDataChunks.forEach((chunk, index) => expect(mockHashCalculatorWrite).toHaveBeenNthCalledWith(index + 1, Buffer.from(chunk)) ); expect(mockDigest).toHaveBeenCalledTimes(1); expect(mockHashCalculatorEnd).toHaveBeenCalledTimes(1); }); it("throws if readable stream has started reading", async () => { const readableStream = new Readable({ read: () => {} }); // Simulate readableFlowing to true. readableStream.resume(); const expectedError = new Error("Unable to calculate hash for flowing readable stream"); try { readableStreamHasher(mockHashCtor, readableStream); fail(`expected ${expectedError}`); } catch (error) { expect(error).toStrictEqual(expectedError); } }); it("throws error if readable stream throws error", async () => { const readableStream = new Readable({ read: () => {}, }); const hashPromise = readableStreamHasher(mockHashCtor, readableStream); const mockError = new Error("error"); setTimeout(() => { readableStream.emit("error", mockError); }, 100); try { await hashPromise; fail(`should throw error ${mockError}`); } catch (error) { expect(error).toEqual(mockError); expect(mockHashCalculatorEnd).toHaveBeenCalledTimes(1); } }); it("throws error if HashCalculator throws error", async () => { const mockHashCalculator = new MockHashCalculator( mockHashCtor as any, mockHashCalculatorWrite, mockHashCalculatorEnd ); (HashCalculator as unknown as any).mockImplementation(() => mockHashCalculator); const readableStream = new Readable({ read: () => {}, }); const hashPromise = readableStreamHasher(mockHashCtor, readableStream); const mockError = new Error("error"); setTimeout(() => { mockHashCalculator.emit("error", mockError); }, 100); try { await hashPromise; fail(`should throw error ${mockError}`); } catch (error) { expect(error).toEqual(mockError); } }); it("throws error if hash.digest() throws error", async () => { const readableStream = new Readable({ read: () => {}, }); const hashPromise = readableStreamHasher(mockHashCtor, readableStream); setTimeout(() => { readableStream.emit("end"); }, 100); const mockError = new Error("error"); mockDigest.mockRejectedValue(mockError); try { await hashPromise; fail(`should throw error ${mockError}`); } catch (error) { expect(error).toEqual(mockError); expect(mockHashCalculatorEnd).toHaveBeenCalledTimes(1); } }); }); ================================================ FILE: packages/core/src/submodules/checksum/hash-stream-node/readableStreamHasher.ts ================================================ import type { Readable } from "node:stream"; import type { HashConstructor, StreamHasher } from "@smithy/types"; import { HashCalculator } from "./HashCalculator"; /** * @internal */ export const readableStreamHasher: StreamHasher = (hashCtor: HashConstructor, readableStream: Readable) => { // Throw if readableStream is already flowing. if (readableStream.readableFlowing !== null) { throw new Error("Unable to calculate hash for flowing readable stream"); } const hash = new hashCtor(); const hashCalculator = new HashCalculator(hash); readableStream.pipe(hashCalculator); return new Promise((resolve, reject) => { readableStream.on("error", (err: Error) => { // if the source errors, the destination stream needs to manually end hashCalculator.end(); reject(err); }); hashCalculator.on("error", reject); hashCalculator.on("finish", () => { hash.digest().then(resolve).catch(reject); }); }); }; ================================================ FILE: packages/core/src/submodules/checksum/index.browser.ts ================================================ const no = Symbol.for("node-only"); // @smithy/hash-blob-browser export { blobHasher } from "./hash-blob-browser/blobHasher"; // @smithy/hash-stream-node export const fileStreamHasher = no; export const readableStreamHasher = no; // @smithy/md5-js export { Md5 } from "./md5-js/md5"; // @smithy/chunked-blob-reader export { blobReader } from "./chunked-blob-reader/chunked-blob-reader"; ================================================ FILE: packages/core/src/submodules/checksum/index.native.ts ================================================ const no = Symbol.for("node-only"); // @smithy/hash-blob-browser export { blobHasher } from "./hash-blob-browser/blobHasher"; // @smithy/hash-stream-node export const fileStreamHasher = no; export const readableStreamHasher = no; // @smithy/md5-js export { Md5 } from "./md5-js/md5"; // @smithy/chunked-blob-reader-native export { blobReader } from "./chunked-blob-reader/chunked-blob-reader.native"; ================================================ FILE: packages/core/src/submodules/checksum/index.ts ================================================ // @smithy/hash-blob-browser export { blobHasher } from "./hash-blob-browser/blobHasher"; // @smithy/hash-stream-node export { fileStreamHasher } from "./hash-stream-node/fileStreamHasher"; export { readableStreamHasher } from "./hash-stream-node/readableStreamHasher"; // @smithy/md5-js export { Md5 } from "./md5-js/md5"; // @smithy/chunked-blob-reader export { blobReader } from "./chunked-blob-reader/chunked-blob-reader"; ================================================ FILE: packages/core/src/submodules/checksum/md5-js/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-utf8@4.2.2 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 - @smithy/util-utf8@4.2.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 - @smithy/util-utf8@4.2.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-utf8@4.0.0 - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.18 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.17 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.14 ### Patch Changes - Updated dependencies [f2a04b7e] - @smithy/util-utf8@2.0.2 ## 2.0.13 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-utf8@2.0.1 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-utf8@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-utf8@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-utf8@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-utf8@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/md5-js](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/md5-js/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/checksum/md5-js/constants.ts ================================================ /** * @internal */ export const BLOCK_SIZE = 64; /** * @internal */ export const DIGEST_LENGTH = 16; /** * @internal */ export const INIT = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]; ================================================ FILE: packages/core/src/submodules/checksum/md5-js/md5.spec.ts ================================================ import { fromBase64, toHex } from "@smithy/core/serde"; import { describe, expect, test as it } from "vitest"; import { Md5 } from "./md5"; const hashVectors = require("hash-test-vectors"); describe("Md5", () => { let idx = 0; for (const { input, ...results } of hashVectors) { const expected = results["md5"]; it(`should calculate a MD5 hash of ${expected} for test vector ${++idx}`, async () => { const hash = new Md5(); hash.update(fromBase64(input)); expect(toHex(await hash.digest())).toBe(expected); }); } }); ================================================ FILE: packages/core/src/submodules/checksum/md5-js/md5.ts ================================================ import { fromUtf8 } from "@smithy/core/serde"; import type { Checksum, SourceData } from "@smithy/types"; import { BLOCK_SIZE, DIGEST_LENGTH, INIT } from "./constants"; /** * @internal */ export class Md5 implements Checksum { private state!: Uint32Array; private buffer!: DataView; private bufferLength!: number; private bytesHashed!: number; private finished!: boolean; constructor() { this.reset(); } update(sourceData: SourceData): void { if (isEmptyData(sourceData)) { return; } else if (this.finished) { throw new Error("Attempted to update an already finished hash."); } const data = convertToBuffer(sourceData); let position = 0; let { byteLength } = data; this.bytesHashed += byteLength; while (byteLength > 0) { this.buffer.setUint8(this.bufferLength++, data[position++]); byteLength--; if (this.bufferLength === BLOCK_SIZE) { this.hashBuffer(); this.bufferLength = 0; } } } async digest(): Promise { if (!this.finished) { const { buffer, bufferLength: undecoratedLength, bytesHashed } = this; const bitsHashed = bytesHashed * 8; buffer.setUint8(this.bufferLength++, 0b10000000); // Ensure the final block has enough room for the hashed length if (undecoratedLength % BLOCK_SIZE >= BLOCK_SIZE - 8) { for (let i = this.bufferLength; i < BLOCK_SIZE; i++) { buffer.setUint8(i, 0); } this.hashBuffer(); this.bufferLength = 0; } for (let i = this.bufferLength; i < BLOCK_SIZE - 8; i++) { buffer.setUint8(i, 0); } buffer.setUint32(BLOCK_SIZE - 8, bitsHashed >>> 0, true); buffer.setUint32(BLOCK_SIZE - 4, Math.floor(bitsHashed / 0x100000000), true); this.hashBuffer(); this.finished = true; } const out = new DataView(new ArrayBuffer(DIGEST_LENGTH)); for (let i = 0; i < 4; i++) { out.setUint32(i * 4, this.state[i], true); } return new Uint8Array(out.buffer, out.byteOffset, out.byteLength); } private hashBuffer(): void { const { buffer, state } = this; let a = state[0], b = state[1], c = state[2], d = state[3]; a = ff(a, b, c, d, buffer.getUint32(0, true), 7, 0xd76aa478); d = ff(d, a, b, c, buffer.getUint32(4, true), 12, 0xe8c7b756); c = ff(c, d, a, b, buffer.getUint32(8, true), 17, 0x242070db); b = ff(b, c, d, a, buffer.getUint32(12, true), 22, 0xc1bdceee); a = ff(a, b, c, d, buffer.getUint32(16, true), 7, 0xf57c0faf); d = ff(d, a, b, c, buffer.getUint32(20, true), 12, 0x4787c62a); c = ff(c, d, a, b, buffer.getUint32(24, true), 17, 0xa8304613); b = ff(b, c, d, a, buffer.getUint32(28, true), 22, 0xfd469501); a = ff(a, b, c, d, buffer.getUint32(32, true), 7, 0x698098d8); d = ff(d, a, b, c, buffer.getUint32(36, true), 12, 0x8b44f7af); c = ff(c, d, a, b, buffer.getUint32(40, true), 17, 0xffff5bb1); b = ff(b, c, d, a, buffer.getUint32(44, true), 22, 0x895cd7be); a = ff(a, b, c, d, buffer.getUint32(48, true), 7, 0x6b901122); d = ff(d, a, b, c, buffer.getUint32(52, true), 12, 0xfd987193); c = ff(c, d, a, b, buffer.getUint32(56, true), 17, 0xa679438e); b = ff(b, c, d, a, buffer.getUint32(60, true), 22, 0x49b40821); a = gg(a, b, c, d, buffer.getUint32(4, true), 5, 0xf61e2562); d = gg(d, a, b, c, buffer.getUint32(24, true), 9, 0xc040b340); c = gg(c, d, a, b, buffer.getUint32(44, true), 14, 0x265e5a51); b = gg(b, c, d, a, buffer.getUint32(0, true), 20, 0xe9b6c7aa); a = gg(a, b, c, d, buffer.getUint32(20, true), 5, 0xd62f105d); d = gg(d, a, b, c, buffer.getUint32(40, true), 9, 0x02441453); c = gg(c, d, a, b, buffer.getUint32(60, true), 14, 0xd8a1e681); b = gg(b, c, d, a, buffer.getUint32(16, true), 20, 0xe7d3fbc8); a = gg(a, b, c, d, buffer.getUint32(36, true), 5, 0x21e1cde6); d = gg(d, a, b, c, buffer.getUint32(56, true), 9, 0xc33707d6); c = gg(c, d, a, b, buffer.getUint32(12, true), 14, 0xf4d50d87); b = gg(b, c, d, a, buffer.getUint32(32, true), 20, 0x455a14ed); a = gg(a, b, c, d, buffer.getUint32(52, true), 5, 0xa9e3e905); d = gg(d, a, b, c, buffer.getUint32(8, true), 9, 0xfcefa3f8); c = gg(c, d, a, b, buffer.getUint32(28, true), 14, 0x676f02d9); b = gg(b, c, d, a, buffer.getUint32(48, true), 20, 0x8d2a4c8a); a = hh(a, b, c, d, buffer.getUint32(20, true), 4, 0xfffa3942); d = hh(d, a, b, c, buffer.getUint32(32, true), 11, 0x8771f681); c = hh(c, d, a, b, buffer.getUint32(44, true), 16, 0x6d9d6122); b = hh(b, c, d, a, buffer.getUint32(56, true), 23, 0xfde5380c); a = hh(a, b, c, d, buffer.getUint32(4, true), 4, 0xa4beea44); d = hh(d, a, b, c, buffer.getUint32(16, true), 11, 0x4bdecfa9); c = hh(c, d, a, b, buffer.getUint32(28, true), 16, 0xf6bb4b60); b = hh(b, c, d, a, buffer.getUint32(40, true), 23, 0xbebfbc70); a = hh(a, b, c, d, buffer.getUint32(52, true), 4, 0x289b7ec6); d = hh(d, a, b, c, buffer.getUint32(0, true), 11, 0xeaa127fa); c = hh(c, d, a, b, buffer.getUint32(12, true), 16, 0xd4ef3085); b = hh(b, c, d, a, buffer.getUint32(24, true), 23, 0x04881d05); a = hh(a, b, c, d, buffer.getUint32(36, true), 4, 0xd9d4d039); d = hh(d, a, b, c, buffer.getUint32(48, true), 11, 0xe6db99e5); c = hh(c, d, a, b, buffer.getUint32(60, true), 16, 0x1fa27cf8); b = hh(b, c, d, a, buffer.getUint32(8, true), 23, 0xc4ac5665); a = ii(a, b, c, d, buffer.getUint32(0, true), 6, 0xf4292244); d = ii(d, a, b, c, buffer.getUint32(28, true), 10, 0x432aff97); c = ii(c, d, a, b, buffer.getUint32(56, true), 15, 0xab9423a7); b = ii(b, c, d, a, buffer.getUint32(20, true), 21, 0xfc93a039); a = ii(a, b, c, d, buffer.getUint32(48, true), 6, 0x655b59c3); d = ii(d, a, b, c, buffer.getUint32(12, true), 10, 0x8f0ccc92); c = ii(c, d, a, b, buffer.getUint32(40, true), 15, 0xffeff47d); b = ii(b, c, d, a, buffer.getUint32(4, true), 21, 0x85845dd1); a = ii(a, b, c, d, buffer.getUint32(32, true), 6, 0x6fa87e4f); d = ii(d, a, b, c, buffer.getUint32(60, true), 10, 0xfe2ce6e0); c = ii(c, d, a, b, buffer.getUint32(24, true), 15, 0xa3014314); b = ii(b, c, d, a, buffer.getUint32(52, true), 21, 0x4e0811a1); a = ii(a, b, c, d, buffer.getUint32(16, true), 6, 0xf7537e82); d = ii(d, a, b, c, buffer.getUint32(44, true), 10, 0xbd3af235); c = ii(c, d, a, b, buffer.getUint32(8, true), 15, 0x2ad7d2bb); b = ii(b, c, d, a, buffer.getUint32(36, true), 21, 0xeb86d391); state[0] = (a + state[0]) & 0xffffffff; state[1] = (b + state[1]) & 0xffffffff; state[2] = (c + state[2]) & 0xffffffff; state[3] = (d + state[3]) & 0xffffffff; } reset(): void { this.state = Uint32Array.from(INIT); this.buffer = new DataView(new ArrayBuffer(BLOCK_SIZE)); this.bufferLength = 0; this.bytesHashed = 0; this.finished = false; } } function cmn(q: number, a: number, b: number, x: number, s: number, t: number) { a = (((a + q) & 0xffffffff) + ((x + t) & 0xffffffff)) & 0xffffffff; return (((a << s) | (a >>> (32 - s))) + b) & 0xffffffff; } function ff(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cmn((b & c) | (~b & d), a, b, x, s, t); } function gg(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cmn((b & d) | (c & ~d), a, b, x, s, t); } function hh(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cmn(b ^ c ^ d, a, b, x, s, t); } function ii(a: number, b: number, c: number, d: number, x: number, s: number, t: number) { return cmn(c ^ (b | ~d), a, b, x, s, t); } function isEmptyData(data: SourceData): boolean { if (typeof data === "string") { return data.length === 0; } return data.byteLength === 0; } function convertToBuffer(data: SourceData): Uint8Array { if (typeof data === "string") { return fromUtf8(data); } if (ArrayBuffer.isView(data)) { return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT); } return new Uint8Array(data); } ================================================ FILE: packages/core/src/submodules/client/index.ts ================================================ // @smithy/middleware-stack export { constructStack } from "./middleware-stack/MiddlewareStack"; // @smithy/util-middleware export { getSmithyContext } from "./util-middleware/getSmithyContext"; export { normalizeProvider } from "./util-middleware/normalizeProvider"; // @smithy/invalid-dependency export { invalidFunction } from "./invalid-dependency/invalidFunction"; export { invalidProvider } from "./invalid-dependency/invalidProvider"; // @smithy/util-waiter export { createWaiter } from "./util-waiter/createWaiter"; export { waiterServiceDefaults, WaiterState, checkExceptions, type WaiterConfiguration, type WaiterOptions, type WaiterResult, } from "./util-waiter/waiter"; // @smithy/smithy-client export { Client, type SmithyConfiguration, type SmithyResolvedConfiguration } from "./smithy-client/client"; export { Command, type CommandImpl } from "./smithy-client/command"; export { SENSITIVE_STRING } from "./smithy-client/constants"; export { createAggregatedClient } from "./smithy-client/create-aggregated-client"; export { throwDefaultError, withBaseException } from "./smithy-client/default-error-handler"; export { loadConfigsForDefaultMode, type DefaultsMode, type ResolvedDefaultsMode, type DefaultsModeConfigs, } from "./smithy-client/defaults-mode"; export { emitWarningIfUnsupportedVersion } from "./smithy-client/emitWarningIfUnsupportedVersion"; export { ServiceException, decorateServiceException, type ExceptionOptionType, type ServiceExceptionOptions, } from "./smithy-client/exceptions"; export { getDefaultExtensionConfiguration, getDefaultClientConfiguration, resolveDefaultRuntimeConfig, type DefaultExtensionRuntimeConfigType, } from "./smithy-client/extensions/defaultExtensionConfiguration"; export { AlgorithmId, getChecksumConfiguration, resolveChecksumRuntimeConfig, type ChecksumAlgorithm, type ChecksumConfiguration, type PartialChecksumRuntimeConfigType, } from "./smithy-client/extensions/checksum"; export { getRetryConfiguration, resolveRetryRuntimeConfig, type PartialRetryRuntimeConfigType, } from "./smithy-client/extensions/retry"; export { getArrayIfSingleItem } from "./smithy-client/get-array-if-single-item"; export { getValueFromTextNode } from "./smithy-client/get-value-from-text-node"; export { isSerializableHeaderValue } from "./smithy-client/is-serializable-header-value"; export { NoOpLogger } from "./smithy-client/NoOpLogger"; export { map, convertMap, take, type ObjectMappingInstructions, type SourceMappingInstructions, type ObjectMappingInstruction, type UnfilteredValue, type LazyValueInstruction, type ConditionalLazyValueInstruction, type SimpleValueInstruction, type ConditionalValueInstruction, type SourceMappingInstruction, type FilterStatus, type FilterStatusSupplier, type ValueFilteringFunction, type ValueSupplier, type ValueMapper, type Value, } from "./smithy-client/object-mapping"; export { schemaLogFilter } from "./smithy-client/schemaLogFilter"; export { serializeFloat, serializeDateTime } from "./smithy-client/ser-utils"; export { _json } from "./smithy-client/serde-json"; ================================================ FILE: packages/core/src/submodules/client/invalid-dependency/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/client`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/invalid-dependency](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/invalid-dependency/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/client/invalid-dependency/invalidFunction.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { invalidFunction } from "./invalidFunction"; describe("invalidFunction", () => { it("throws error with message", () => { const message = "Error"; expect(invalidFunction(message)).toThrowError(new Error(message)); }); }); ================================================ FILE: packages/core/src/submodules/client/invalid-dependency/invalidFunction.ts ================================================ /** * @internal */ export const invalidFunction = (message: string) => () => { throw new Error(message); }; ================================================ FILE: packages/core/src/submodules/client/invalid-dependency/invalidProvider.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { invalidProvider } from "./invalidProvider"; describe("invalidProvider", () => { it("rejects with error containing message", async () => { const message = "Error"; const provider = invalidProvider(message); //@ts-ignore await expect(provider()).rejects.toEqual(message); }); }); ================================================ FILE: packages/core/src/submodules/client/invalid-dependency/invalidProvider.ts ================================================ import type { Provider } from "@smithy/types"; /** * @internal */ export const invalidProvider: (message: string) => Provider = (message: string) => () => Promise.reject(message); ================================================ FILE: packages/core/src/submodules/client/middleware-stack/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/client`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.10 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.9 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.8 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.7 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.6 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.5 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.4 ### Patch Changes - 2f70f105: Support `aliases` for `MiddlewareStack` - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.3 ### Patch Changes - 20fc148d: check calls to external instances of middlewareStack ## 2.0.2 ### Patch Changes - ea0635d6: add debug method to middlewareStack - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.1 ### Patch Changes - e6ea6bd5: move devDeps into deps - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-stack](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-stack/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/client/middleware-stack/MiddlewareStack.spec.ts ================================================ import type { DeserializeHandlerArguments, DeserializeMiddleware, FinalizeHandler, FinalizeHandlerArguments, InitializeHandler, Pluggable, } from "@smithy/types"; import { describe, expect, test as it, vi } from "vitest"; import { constructStack } from "./MiddlewareStack"; type input = Array; type output = object; //return tagged union to make compiler happy const getConcatMiddleware = (message: string) => (next: FinalizeHandler): InitializeHandler => (args: any) => next({ ...args, input: args.input.concat(message), request: undefined as any, }); describe("MiddlewareStack", () => { describe("add", () => { it("should sort middleware based on step, priority, and ording of adding", async () => { const stack = constructStack(); const bMW = getConcatMiddleware("B"); stack.add(bMW, { name: "B" }); stack.add(getConcatMiddleware("A"), { priority: "high", }); stack.add(getConcatMiddleware("D"), { step: "build", name: "D", }); stack.add(getConcatMiddleware("C"), { step: "build", priority: "high", }); stack.add(getConcatMiddleware("E"), { step: "finalizeRequest", }); stack.add(getConcatMiddleware("F"), { step: "finalizeRequest" }); stack.add(getConcatMiddleware("G") as DeserializeMiddleware, { priority: "low", step: "deserialize", }); stack.add(getConcatMiddleware("H") as DeserializeMiddleware, { aliases: ["h"], priority: "low", step: "deserialize", }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B", "C", "D", "E", "F", "G", "H"], }); }); it("should throw if duplicated name is found", () => { const stack = constructStack(); const aMW = getConcatMiddleware("A"); stack.add(aMW, { name: "A" }); expect(() => stack.add(aMW, { name: "A" })).toThrow("Duplicate middleware name 'A'"); }); it("should throw if duplicated name via aliases of existing entry is found", () => { const stack = constructStack(); const aMW = getConcatMiddleware("A"); stack.add(aMW, { aliases: ["ALIAS"] }); expect(() => stack.add(aMW, { name: "ALIAS" })).toThrow("Duplicate middleware name 'ALIAS'"); }); it("should throw if duplicated name via aliases of added entry is found", () => { const stack = constructStack(); const aMW = getConcatMiddleware("ALIAS"); stack.add(aMW, { name: "ALIAS" }); expect(() => stack.add(aMW, { aliases: ["ALIAS"] })).toThrow( "Duplicate middleware name 'anonymous (a.k.a. ALIAS)'" ); }); describe("config: override", () => { it("should override the middleware with same name if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.add(getConcatMiddleware("override"), { name: "A", override: true }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["override"], }); }); it("should override the middleware with matching alias of existing entry if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { aliases: ["ALIAS"] }); stack.add(getConcatMiddleware("override"), { name: "ALIAS", override: true }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["override"], }); }); it("should override the middleware with matching alias of added entry if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "ALIAS" }); stack.add(getConcatMiddleware("override"), { aliases: ["ALIAS"], override: true }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["override"], }); }); it("should throw if overriding middleware with same name different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); expect(() => stack.add(getConcatMiddleware("override"), { name: "A", step: "serialize", override: true }) ).toThrow( '"A" middleware with normal priority in initialize step cannot be overridden by "A" middleware with normal priority in serialize step.' ); }); it("should throw if overriding middleware with matching alias of existing entry different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { aliases: ["ALIAS"] }); expect(() => stack.add(getConcatMiddleware("override"), { name: "ALIAS", step: "serialize", override: true }) ).toThrow( '"anonymous (a.k.a. ALIAS)" middleware with normal priority in initialize step cannot be overridden by "ALIAS" middleware with normal priority in serialize step.' ); }); it("should throw if overriding middleware with matching alias of added entry different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "ALIAS" }); expect(() => stack.add(getConcatMiddleware("override"), { aliases: ["ALIAS"], step: "serialize", override: true }) ).toThrow( '"ALIAS" middleware with normal priority in initialize step cannot be overridden by "anonymous (a.k.a. ALIAS)" middleware with normal priority in serialize step.' ); }); }); }); describe("addRelativeTo", () => { it("should allow adding middleware relatively based relation and order of adding", async () => { const stack = constructStack(); stack.addRelativeTo(getConcatMiddleware("H"), { aliases: ["AliasH"], relation: "after", toMiddleware: "G", }); stack.add(getConcatMiddleware("A"), { name: "A", }); stack.addRelativeTo(getConcatMiddleware("C"), { name: "C", relation: "after", toMiddleware: "A", }); stack.addRelativeTo(getConcatMiddleware("B"), { name: "B", relation: "after", toMiddleware: "A", }); stack.addRelativeTo(getConcatMiddleware("D"), { name: "D", relation: "after", toMiddleware: "C", }); stack.add(getConcatMiddleware("G"), { name: "G", priority: "low", }); stack.addRelativeTo(getConcatMiddleware("E"), { name: "E", relation: "before", toMiddleware: "F", }); stack.addRelativeTo(getConcatMiddleware("F"), { name: "F", relation: "before", toMiddleware: "G", }); stack.addRelativeTo(getConcatMiddleware("I"), { aliases: ["AliasI"], relation: "after", toMiddleware: "AliasH", }); stack.addRelativeTo(getConcatMiddleware("J"), { name: "J", relation: "after", toMiddleware: "AliasI", }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"] }); }); it("should add relative middleware within the scope of adjacent absolute middleware", async () => { const stack = constructStack(); stack.addRelativeTo(getConcatMiddleware("B"), { name: "B", relation: "after", toMiddleware: "A", }); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("C"), { name: "C", relation: "before", toMiddleware: "AliasD", }); stack.add(getConcatMiddleware("D"), { aliases: ["AliasD"] }); stack.addRelativeTo(getConcatMiddleware("F"), { aliases: ["AliasF"], relation: "after", toMiddleware: "AliasD", }); stack.addRelativeTo(getConcatMiddleware("E"), { relation: "before", toMiddleware: "AliasF", }); stack.add(getConcatMiddleware("G"), { name: "G" }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B", "C", "D", "E", "F", "G"] }); }); it("should not add self-referenced relative middleware", async () => { const stack = constructStack(); stack.addRelativeTo(getConcatMiddleware("A"), { name: "A", relation: "before", toMiddleware: "B", }); stack.addRelativeTo(getConcatMiddleware("B"), { name: "B", relation: "before", toMiddleware: "C", }); stack.addRelativeTo(getConcatMiddleware("C"), { name: "C", relation: "before", toMiddleware: "AliasD", }); stack.addRelativeTo(getConcatMiddleware("D"), { aliases: ["AliasD"], relation: "after", toMiddleware: "A", }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: [] }); }); it("should throw if add middleware relative to non-exist middleware", async () => { expect.assertions(1); const stack = constructStack(); stack.addRelativeTo(getConcatMiddleware("foo"), { name: "foo", relation: "before", toMiddleware: "non_exist", }); const inner = vi.fn(); try { stack.resolve(inner, {} as any); } catch (e) { expect(e.message).toBe("non_exist is not found when adding foo middleware before non_exist"); } }); describe("config: override", () => { it("should override the middleware with same name if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("B"), { name: "B", relation: "after", toMiddleware: "A" }); stack.addRelativeTo(getConcatMiddleware("override"), { name: "B", relation: "after", toMiddleware: "A", override: true, }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "override"], }); }); it("should override the middleware with matching alias of existing entry if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("B"), { aliases: ["ALIAS"], relation: "after", toMiddleware: "A", }); stack.addRelativeTo(getConcatMiddleware("override"), { name: "ALIAS", relation: "after", toMiddleware: "A", override: true, }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "override"], }); }); it("should override the middleware with matching alias of added entry if override config is set", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("ALIAS"), { name: "ALIAS", relation: "after", toMiddleware: "A", }); stack.addRelativeTo(getConcatMiddleware("override"), { aliases: ["ALIAS"], relation: "after", toMiddleware: "A", override: true, }); const inner = vi.fn(); const composed = stack.resolve(inner, {} as any); await composed({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "override"], }); }); it("should throw if overriding middleware with same name different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("B"), { name: "B", relation: "after", toMiddleware: "A" }); expect(() => stack.addRelativeTo(getConcatMiddleware("override"), { name: "B", relation: "before", toMiddleware: "A", override: true, }) ).toThrow('"B" middleware after "A" middleware cannot be overridden by "B" middleware before "A" middleware.'); }); it("should throw if overriding middleware with matching alias of existing entry different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("B"), { aliases: ["ALIAS"], relation: "after", toMiddleware: "A", }); expect(() => stack.addRelativeTo(getConcatMiddleware("override"), { name: "ALIAS", relation: "before", toMiddleware: "A", override: true, }) ).toThrow( '"anonymous (a.k.a. ALIAS)" middleware after "A" middleware cannot be overridden by "ALIAS" middleware before "A" middleware.' ); }); it("should throw if overriding middleware with matching alias of added entry different position", () => { const stack = constructStack(); stack.add(getConcatMiddleware("A"), { name: "A" }); stack.addRelativeTo(getConcatMiddleware("ALIAS"), { name: "ALIAS", relation: "after", toMiddleware: "A", }); expect(() => stack.addRelativeTo(getConcatMiddleware("override"), { aliases: ["ALIAS"], relation: "before", toMiddleware: "A", override: true, }) ).toThrow( '"ALIAS" middleware after "A" middleware cannot be overridden by "anonymous (a.k.a. ALIAS)" middleware before "A" middleware.' ); }); }); }); describe("clone", () => { it("should allow cloning", async () => { const stack = constructStack(); const bMiddleware = getConcatMiddleware("B"); stack.add(bMiddleware); stack.add(getConcatMiddleware("A"), { name: "A", priority: "high", }); stack.add(getConcatMiddleware("C"), { aliases: ["AliasC"], }); const secondStack = stack.clone(); const inner = vi.fn(); await secondStack.resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B", "C"] }); // validate adding middleware to cloned stack won't affect the original stack. inner.mockClear(); secondStack.add(getConcatMiddleware("D")); secondStack.add(getConcatMiddleware("E"), { aliases: ["AliasE"], }); await secondStack.resolve(inner, {} as any)({ input: [] }); expect(inner).toBeCalledWith({ input: ["A", "B", "C", "D", "E"] }); inner.mockClear(); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner).toBeCalledWith({ input: ["A", "B", "C"] }); }); }); describe("concat", () => { it("should allow combining stacks", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A")); stack.add(getConcatMiddleware("B"), { aliases: ["AliasB"], priority: "low", }); const secondStack = constructStack(); secondStack.add(getConcatMiddleware("D"), { step: "build", priority: "low", }); secondStack.addRelativeTo(getConcatMiddleware("C"), { relation: "after", toMiddleware: "AliasB", }); const inner = vi.fn(); await stack.concat(secondStack).resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B", "C", "D"] }); }); it("should not touch the stack of the concat() caller or the parameter", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("A")); const secondStack = constructStack(); secondStack.add(getConcatMiddleware("B")); const inner = vi.fn(); await stack.concat(secondStack).resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["A", "B"] }); inner.mockClear(); await secondStack.resolve(inner, {} as any)({ input: [] }); expect(inner).toBeCalledWith({ input: ["B"] }); inner.mockClear(); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner).toBeCalledWith({ input: ["A"] }); }); }); describe("remove", () => { it("should remove middleware by name", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("don't remove me"), { name: "notRemove" }); stack.addRelativeTo(getConcatMiddleware("remove me!"), { relation: "after", toMiddleware: "notRemove", name: "toRemove", }); await stack.resolve(({ input }: FinalizeHandlerArguments>) => { expect(input.sort()).toEqual(["don't remove me", "remove me!"]); return Promise.resolve({ response: {} }); }, {} as any)({ input: [] }); stack.remove("toRemove"); const inner = vi.fn(); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["don't remove me"] }); }); it("should remove middleware by alias of existing entry", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("don't remove me"), { name: "notRemove" }); stack.addRelativeTo(getConcatMiddleware("remove me!"), { relation: "after", toMiddleware: "notRemove", aliases: ["toRemove"], }); await stack.resolve(({ input }: FinalizeHandlerArguments>) => { expect(input.sort()).toEqual(["don't remove me", "remove me!"]); return Promise.resolve({ response: {} }); }, {} as any)({ input: [] }); stack.remove("toRemove"); const inner = vi.fn(); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["don't remove me"] }); }); it("should remove middleware by reference", async () => { const stack = constructStack(); const mw = getConcatMiddleware("remove all references of me"); stack.add(mw, { name: "toRemove1" }); stack.add(getConcatMiddleware("don't remove me!")); stack.add(mw, { aliases: ["toRemove2"] }); stack.remove(mw); const inner = vi.fn(); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); expect(inner).toBeCalledWith({ input: ["don't remove me!"] }); }); }); describe("removeByTag", () => { it("should allow the removal of middleware by tag", async () => { const stack = constructStack(); stack.add(getConcatMiddleware("not removed"), { name: "not removed", tags: ["foo", "bar"], }); stack.addRelativeTo(getConcatMiddleware("remove me!"), { aliases: ["remove me!"], relation: "after", toMiddleware: "not removed", tags: ["foo", "bar", "baz"], }); await stack.resolve(({ input }: FinalizeHandlerArguments>) => { expect(input.sort()).toEqual(["not removed", "remove me!"]); return Promise.resolve({ response: {} }); }, {} as any)({ input: [] }); stack.removeByTag("baz"); await stack.resolve(({ input }: DeserializeHandlerArguments>) => { expect(input).toEqual(["not removed"]); return Promise.resolve({ response: {} }); }, {} as any)({ input: [] }); }); }); it("checks identifyOnResolve calls to external instances due to version mismatching", () => { const newStack = constructStack(); const oldStack = constructStack(); delete (oldStack as any).identifyOnResolve; oldStack.clone = () => oldStack; oldStack.concat = () => oldStack as S; oldStack.applyToStack = () => void 0; expect(oldStack.identifyOnResolve).toBeUndefined(); expect(() => { newStack.concat(oldStack); newStack.clone(); }).not.toThrow(); }); describe("use", () => { it("should apply customizations from pluggables", async () => { const stack = constructStack(); const plugin: Pluggable = { applyToStack: (stack) => { stack.addRelativeTo(getConcatMiddleware("second"), { relation: "after", toMiddleware: "first", }); stack.add(getConcatMiddleware("first"), { name: "first" }); }, }; stack.use(plugin); const inner = vi.fn(({ input }: DeserializeHandlerArguments) => { expect(input).toEqual(["first", "second"]); return Promise.resolve({ response: {} }); }); await stack.resolve(inner, {} as any)({ input: [] }); expect(inner.mock.calls.length).toBe(1); }); }); }); ================================================ FILE: packages/core/src/submodules/client/middleware-stack/MiddlewareStack.ts ================================================ import type { AbsoluteLocation, DeserializeHandler, Handler, HandlerExecutionContext, HandlerOptions, MiddlewareStack, MiddlewareType, Pluggable, Priority, RelativeLocation, RelativeMiddlewareOptions, Step, } from "@smithy/types"; import type { AbsoluteMiddlewareEntry, MiddlewareEntry, Normalized, RelativeMiddlewareEntry } from "./types"; const getAllAliases = (name: string | undefined, aliases: Array | undefined) => { const _aliases = []; if (name) { _aliases.push(name); } if (aliases) { for (const alias of aliases) { _aliases.push(alias); } } return _aliases; }; const getMiddlewareNameWithAliases = (name: string | undefined, aliases: Array | undefined): string => { return `${name || "anonymous"}${aliases && aliases.length > 0 ? ` (a.k.a. ${aliases.join(",")})` : ""}`; }; /** * @internal */ export const constructStack = (): MiddlewareStack => { let absoluteEntries: AbsoluteMiddlewareEntry[] = []; let relativeEntries: RelativeMiddlewareEntry[] = []; let identifyOnResolve = false; const entriesNameSet: Set = new Set(); const sort = >(entries: T[]): T[] => entries.sort( (a, b) => stepWeights[b.step] - stepWeights[a.step] || priorityWeights[b.priority || "normal"] - priorityWeights[a.priority || "normal"] ); const removeByName = (toRemove: string): boolean => { let isRemoved = false; const filterCb = (entry: MiddlewareEntry): boolean => { const aliases = getAllAliases(entry.name, entry.aliases); if (aliases.includes(toRemove)) { isRemoved = true; for (const alias of aliases) { entriesNameSet.delete(alias); } return false; } return true; }; absoluteEntries = absoluteEntries.filter(filterCb); relativeEntries = relativeEntries.filter(filterCb); return isRemoved; }; const removeByReference = (toRemove: MiddlewareType): boolean => { let isRemoved = false; const filterCb = (entry: MiddlewareEntry): boolean => { if (entry.middleware === toRemove) { isRemoved = true; for (const alias of getAllAliases(entry.name, entry.aliases)) { entriesNameSet.delete(alias); } return false; } return true; }; absoluteEntries = absoluteEntries.filter(filterCb); relativeEntries = relativeEntries.filter(filterCb); return isRemoved; }; const cloneTo = ( toStack: MiddlewareStack ): MiddlewareStack => { absoluteEntries.forEach((entry) => { //@ts-ignore toStack.add(entry.middleware, { ...entry }); }); relativeEntries.forEach((entry) => { //@ts-ignore toStack.addRelativeTo(entry.middleware, { ...entry }); }); toStack.identifyOnResolve?.(stack.identifyOnResolve()); return toStack; }; const expandRelativeMiddlewareList = ( from: Normalized, Input, Output> ): MiddlewareEntry[] => { const expandedMiddlewareList: MiddlewareEntry[] = []; from.before.forEach((entry) => { if (entry.before.length === 0 && entry.after.length === 0) { expandedMiddlewareList.push(entry); } else { expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); } }); expandedMiddlewareList.push(from); from.after.reverse().forEach((entry) => { if (entry.before.length === 0 && entry.after.length === 0) { expandedMiddlewareList.push(entry); } else { expandedMiddlewareList.push(...expandRelativeMiddlewareList(entry)); } }); return expandedMiddlewareList; }; /** * Get a final list of middleware in the order of being executed in the resolved handler. * @param debug - don't throw, getting info only. */ const getMiddlewareList = (debug = false): Array> => { const normalizedAbsoluteEntries: Normalized, Input, Output>[] = []; const normalizedRelativeEntries: Normalized, Input, Output>[] = []; const normalizedEntriesNameMap: Record, Input, Output>> = {}; absoluteEntries.forEach((entry) => { const normalizedEntry = { ...entry, before: [], after: [], }; for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { normalizedEntriesNameMap[alias] = normalizedEntry; } normalizedAbsoluteEntries.push(normalizedEntry); }); relativeEntries.forEach((entry) => { const normalizedEntry = { ...entry, before: [], after: [], }; for (const alias of getAllAliases(normalizedEntry.name, normalizedEntry.aliases)) { normalizedEntriesNameMap[alias] = normalizedEntry; } normalizedRelativeEntries.push(normalizedEntry); }); normalizedRelativeEntries.forEach((entry) => { if (entry.toMiddleware) { const toMiddleware = normalizedEntriesNameMap[entry.toMiddleware]; if (toMiddleware === undefined) { if (debug) { return; } throw new Error( `${entry.toMiddleware} is not found when adding ` + `${getMiddlewareNameWithAliases(entry.name, entry.aliases)} ` + `middleware ${entry.relation} ${entry.toMiddleware}` ); } if (entry.relation === "after") { toMiddleware.after.push(entry); } if (entry.relation === "before") { toMiddleware.before.push(entry); } } }); const mainChain = sort(normalizedAbsoluteEntries) .map(expandRelativeMiddlewareList) .reduce( (wholeList, expandedMiddlewareList) => { // TODO: Replace it with Array.flat(); wholeList.push(...expandedMiddlewareList); return wholeList; }, [] as MiddlewareEntry[] ); return mainChain; }; const stack: MiddlewareStack = { add: (middleware: MiddlewareType, options: HandlerOptions & AbsoluteLocation = {}) => { const { name, override, aliases: _aliases } = options; const entry: AbsoluteMiddlewareEntry = { step: "initialize", priority: "normal", middleware, ...options, }; const aliases = getAllAliases(name, _aliases); if (aliases.length > 0) { if (aliases.some((alias) => entriesNameSet.has(alias))) { if (!override) throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); for (const alias of aliases) { const toOverrideIndex = absoluteEntries.findIndex( (entry) => entry.name === alias || entry.aliases?.some((a) => a === alias) ); if (toOverrideIndex === -1) { continue; } const toOverride = absoluteEntries[toOverrideIndex]; if (toOverride.step !== entry.step || entry.priority !== toOverride.priority) { throw new Error( `"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware with ` + `${toOverride.priority} priority in ${toOverride.step} step cannot ` + `be overridden by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware with ` + `${entry.priority} priority in ${entry.step} step.` ); } absoluteEntries.splice(toOverrideIndex, 1); } } for (const alias of aliases) { entriesNameSet.add(alias); } } absoluteEntries.push(entry); }, addRelativeTo: (middleware: MiddlewareType, options: HandlerOptions & RelativeLocation) => { const { name, override, aliases: _aliases } = options; const entry: RelativeMiddlewareEntry = { middleware, ...options, }; const aliases = getAllAliases(name, _aliases); if (aliases.length > 0) { if (aliases.some((alias) => entriesNameSet.has(alias))) { if (!override) throw new Error(`Duplicate middleware name '${getMiddlewareNameWithAliases(name, _aliases)}'`); for (const alias of aliases) { const toOverrideIndex = relativeEntries.findIndex( (entry) => entry.name === alias || entry.aliases?.some((a) => a === alias) ); if (toOverrideIndex === -1) { continue; } const toOverride = relativeEntries[toOverrideIndex]; if (toOverride.toMiddleware !== entry.toMiddleware || toOverride.relation !== entry.relation) { throw new Error( `"${getMiddlewareNameWithAliases(toOverride.name, toOverride.aliases)}" middleware ` + `${toOverride.relation} "${toOverride.toMiddleware}" middleware cannot be overridden ` + `by "${getMiddlewareNameWithAliases(name, _aliases)}" middleware ${entry.relation} ` + `"${entry.toMiddleware}" middleware.` ); } relativeEntries.splice(toOverrideIndex, 1); } } for (const alias of aliases) { entriesNameSet.add(alias); } } relativeEntries.push(entry); }, clone: () => cloneTo(constructStack()), use: (plugin: Pluggable) => { plugin.applyToStack(stack); }, remove: (toRemove: MiddlewareType | string): boolean => { if (typeof toRemove === "string") return removeByName(toRemove); else return removeByReference(toRemove); }, removeByTag: (toRemove: string): boolean => { let isRemoved = false; const filterCb = (entry: MiddlewareEntry): boolean => { const { tags, name, aliases: _aliases } = entry; if (tags && tags.includes(toRemove)) { const aliases = getAllAliases(name, _aliases); for (const alias of aliases) { entriesNameSet.delete(alias); } isRemoved = true; return false; } return true; }; absoluteEntries = absoluteEntries.filter(filterCb); relativeEntries = relativeEntries.filter(filterCb); return isRemoved; }, concat: ( from: MiddlewareStack ): MiddlewareStack => { const cloned = cloneTo(constructStack()); cloned.use(from); cloned.identifyOnResolve( identifyOnResolve || cloned.identifyOnResolve() || (from.identifyOnResolve?.() ?? false) ); return cloned; }, applyToStack: cloneTo, identify: (): string[] => { return getMiddlewareList(true).map((mw: MiddlewareEntry) => { const step = mw.step ?? (mw as unknown as RelativeMiddlewareOptions).relation + " " + (mw as unknown as RelativeMiddlewareOptions).toMiddleware; return getMiddlewareNameWithAliases(mw.name, mw.aliases) + " - " + step; }); }, identifyOnResolve(toggle?: boolean) { if (typeof toggle === "boolean") identifyOnResolve = toggle; return identifyOnResolve; }, resolve: ( handler: DeserializeHandler, context: HandlerExecutionContext ): Handler => { for (const middleware of getMiddlewareList() .map((entry) => entry.middleware) .reverse()) { handler = middleware(handler as Handler, context) as any; } if (identifyOnResolve) { console.log(stack.identify()); } return handler as Handler; }, }; return stack; }; const stepWeights: { [key in Step]: number } = { initialize: 5, serialize: 4, build: 3, finalizeRequest: 2, deserialize: 1, }; const priorityWeights: { [key in Priority]: number } = { high: 3, normal: 2, low: 1, }; ================================================ FILE: packages/core/src/submodules/client/middleware-stack/types.ts ================================================ import type { AbsoluteLocation, HandlerOptions, MiddlewareType, Priority, RelativeLocation, Step } from "@smithy/types"; export interface MiddlewareEntry extends HandlerOptions { middleware: MiddlewareType; } export interface AbsoluteMiddlewareEntry extends MiddlewareEntry, AbsoluteLocation { step: Step; priority: Priority; } export interface RelativeMiddlewareEntry extends MiddlewareEntry, RelativeLocation {} export type Normalized< T extends MiddlewareEntry, Input extends object = {}, Output extends object = {}, > = T & { after: Normalized, Input, Output>[]; before: Normalized, Input, Output>[]; }; export interface NormalizedRelativeEntry extends HandlerOptions { step: Step; middleware: MiddlewareType; next?: NormalizedRelativeEntry; prev?: NormalizedRelativeEntry; priority: null; } export type NamedMiddlewareEntriesMap = Record< string, MiddlewareEntry >; ================================================ FILE: packages/core/src/submodules/client/smithy-client/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/client`. ## 4.12.13 ### Patch Changes - @smithy/util-stream@4.5.25 - @smithy/core@3.23.17 - @smithy/middleware-endpoint@4.4.32 ## 4.12.12 ### Patch Changes - Updated dependencies [a029f0e] - @smithy/core@3.23.16 - @smithy/middleware-endpoint@4.4.31 - @smithy/util-stream@4.5.24 ## 4.12.11 ### Patch Changes - b69e3c9: fix to set requestOptions correctly ## 4.12.10 ### Patch Changes - 131fce4: add eventStream indicator signal for NodeHttp2ConnectionManager so it does not reuse connections for event streams - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/util-stream@4.5.23 - @smithy/core@3.23.15 - @smithy/middleware-endpoint@4.4.30 - @smithy/middleware-stack@4.2.14 - @smithy/protocol-http@5.3.14 ## 4.12.9 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/middleware-endpoint@4.4.29 - @smithy/middleware-stack@4.2.13 - @smithy/protocol-http@5.3.13 - @smithy/util-stream@4.5.22 ## 4.12.8 ### Patch Changes - Updated dependencies [7198e09] - @smithy/core@3.23.13 - @smithy/util-stream@4.5.21 - @smithy/middleware-endpoint@4.4.28 ## 4.12.7 ### Patch Changes - Updated dependencies [b1f0dba] - @smithy/middleware-endpoint@4.4.27 ## 4.12.6 ### Patch Changes - @smithy/util-stream@4.5.20 - @smithy/core@3.23.12 - @smithy/middleware-endpoint@4.4.26 ## 4.12.5 ### Patch Changes - Updated dependencies [2edd638] - @smithy/core@3.23.11 - @smithy/util-stream@4.5.19 - @smithy/middleware-endpoint@4.4.25 ## 4.12.4 ### Patch Changes - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/middleware-endpoint@4.4.24 - @smithy/middleware-stack@4.2.12 - @smithy/protocol-http@5.3.12 - @smithy/util-stream@4.5.18 ## 4.12.3 ### Patch Changes - Updated dependencies [6ef5430] - Updated dependencies [6ef5430] - @smithy/core@3.23.9 - @smithy/middleware-endpoint@4.4.23 ## 4.12.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/middleware-endpoint@4.4.22 - @smithy/middleware-stack@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/util-stream@4.5.17 - @smithy/core@3.23.8 ## 4.12.1 ### Patch Changes - Updated dependencies [11569eb] - @smithy/core@3.23.7 - @smithy/util-stream@4.5.16 - @smithy/middleware-endpoint@4.4.21 ## 4.12.0 ### Minor Changes - d0954cc: allow adding new checksum algorithms via extension ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/core@3.23.6 - @smithy/middleware-endpoint@4.4.20 - @smithy/middleware-stack@4.2.10 - @smithy/protocol-http@5.3.10 - @smithy/util-stream@4.5.15 ## 4.11.8 ### Patch Changes - Updated dependencies [026b177] - Updated dependencies [cde9f09] - @smithy/core@3.23.5 - @smithy/middleware-endpoint@4.4.19 ## 4.11.7 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/core@3.23.4 - @smithy/middleware-endpoint@4.4.18 - @smithy/middleware-stack@4.2.9 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 - @smithy/util-stream@4.5.14 ## 4.11.6 ### Patch Changes - Updated dependencies [ffe1843] - @smithy/util-stream@4.5.13 - @smithy/core@3.23.3 - @smithy/middleware-endpoint@4.4.17 ## 4.11.5 ### Patch Changes - Updated dependencies [c5db01c] - @smithy/core@3.23.2 - @smithy/middleware-endpoint@4.4.16 ## 4.11.4 ### Patch Changes - Updated dependencies [6f96c01] - @smithy/core@3.23.1 - @smithy/middleware-endpoint@4.4.15 ## 4.11.3 ### Patch Changes - Updated dependencies [4f05c6a] - @smithy/core@3.23.0 - @smithy/util-stream@4.5.12 - @smithy/middleware-endpoint@4.4.14 ## 4.11.2 ### Patch Changes - @smithy/util-stream@4.5.11 - @smithy/core@3.22.1 - @smithy/middleware-endpoint@4.4.13 ## 4.11.1 ### Patch Changes - Updated dependencies [472bf01] - @smithy/core@3.22.0 - @smithy/middleware-endpoint@4.4.12 ## 4.11.0 ### Minor Changes - 75145e5: add paginators/waiters to aggregate clients ## 4.10.12 ### Patch Changes - Updated dependencies [fa0e0c4] - @smithy/core@3.21.1 - @smithy/middleware-endpoint@4.4.11 ## 4.10.11 ### Patch Changes - Updated dependencies [c2a6f46] - @smithy/core@3.21.0 - @smithy/middleware-endpoint@4.4.10 ## 4.10.10 ### Patch Changes - Updated dependencies [96cc077] - @smithy/core@3.20.8 - @smithy/middleware-endpoint@4.4.9 ## 4.10.9 ### Patch Changes - Updated dependencies [ae6ef2e] - @smithy/core@3.20.7 - @smithy/middleware-endpoint@4.4.8 ## 4.10.8 ### Patch Changes - Updated dependencies [862c942] - @smithy/core@3.20.6 - @smithy/middleware-endpoint@4.4.7 ## 4.10.7 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/core@3.20.5 - @smithy/middleware-endpoint@4.4.6 - @smithy/middleware-stack@4.2.8 - @smithy/protocol-http@5.3.8 - @smithy/util-stream@4.5.10 ## 4.10.6 ### Patch Changes - Updated dependencies [87a5f20] - @smithy/util-stream@4.5.9 - @smithy/core@3.20.4 - @smithy/middleware-endpoint@4.4.5 ## 4.10.5 ### Patch Changes - Updated dependencies [681d6c4] - @smithy/core@3.20.3 - @smithy/middleware-endpoint@4.4.4 ## 4.10.4 ### Patch Changes - Updated dependencies [dd55f1f] - @smithy/core@3.20.2 - @smithy/middleware-endpoint@4.4.3 ## 4.10.3 ### Patch Changes - Updated dependencies [aa954bc] - @smithy/core@3.20.1 - @smithy/middleware-endpoint@4.4.2 ## 4.10.2 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/core@3.20.0 - @smithy/middleware-endpoint@4.4.1 - @smithy/middleware-stack@4.2.7 - @smithy/protocol-http@5.3.7 - @smithy/util-stream@4.5.8 ## 4.10.1 ### Patch Changes - f3a51c2: set protocol to optional on resolved config type - Updated dependencies [76d7994] - @smithy/middleware-endpoint@4.4.0 ## 4.10.0 ### Minor Changes - 5a56762: make protocol selection easier ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/core@3.19.0 - @smithy/middleware-endpoint@4.3.15 - @smithy/middleware-stack@4.2.6 - @smithy/protocol-http@5.3.6 - @smithy/util-stream@4.5.7 ## 4.9.10 ### Patch Changes - Updated dependencies [541a18f] - @smithy/core@3.18.7 - @smithy/middleware-endpoint@4.3.14 ## 4.9.9 ### Patch Changes - Updated dependencies [1d6db03] - @smithy/core@3.18.6 - @smithy/middleware-endpoint@4.3.13 ## 4.9.8 ### Patch Changes - Updated dependencies [77c149f] - @smithy/core@3.18.5 - @smithy/middleware-endpoint@4.3.12 ## 4.9.7 ### Patch Changes - Updated dependencies [e659a06] - @smithy/core@3.18.4 - @smithy/middleware-endpoint@4.3.11 ## 4.9.6 ### Patch Changes - Updated dependencies [5bcd041] - @smithy/core@3.18.3 - @smithy/middleware-endpoint@4.3.10 ## 4.9.5 ### Patch Changes - Updated dependencies [c8b148c] - @smithy/core@3.18.2 - @smithy/middleware-endpoint@4.3.9 ## 4.9.4 ### Patch Changes - Updated dependencies [0976f42] - @smithy/core@3.18.1 - @smithy/middleware-endpoint@4.3.8 ## 4.9.3 ### Patch Changes - Updated dependencies [3926fd7] - Updated dependencies [e77f705] - @smithy/types@4.9.0 - @smithy/core@3.18.0 - @smithy/middleware-endpoint@4.3.7 - @smithy/middleware-stack@4.2.5 - @smithy/protocol-http@5.3.5 - @smithy/util-stream@4.5.6 ## 4.9.2 ### Patch Changes - Updated dependencies [6da0ab3] - Updated dependencies [df00095] - @smithy/types@4.8.1 - @smithy/core@3.17.2 - @smithy/middleware-endpoint@4.3.6 - @smithy/middleware-stack@4.2.4 - @smithy/protocol-http@5.3.4 - @smithy/util-stream@4.5.5 ## 4.9.1 ### Patch Changes - @smithy/util-stream@4.5.4 - @smithy/core@3.17.1 - @smithy/middleware-endpoint@4.3.5 ## 4.9.0 ### Minor Changes - 8a2a912: remove usage of non-static schema classes ### Patch Changes - Updated dependencies [8a2a912] - Updated dependencies [7e359e2] - @smithy/types@4.8.0 - @smithy/core@3.17.0 - @smithy/util-stream@4.5.3 - @smithy/middleware-endpoint@4.3.4 - @smithy/middleware-stack@4.2.3 - @smithy/protocol-http@5.3.3 ## 4.8.1 ### Patch Changes - Updated dependencies [052d261] - @smithy/core@3.16.1 - @smithy/types@4.7.1 - @smithy/middleware-endpoint@4.3.3 - @smithy/middleware-stack@4.2.2 - @smithy/protocol-http@5.3.2 - @smithy/util-stream@4.5.2 ## 4.8.0 ### Minor Changes - 7f8af58: generation of static schema ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - Updated dependencies [8a2873c] - @smithy/types@4.7.0 - @smithy/core@3.16.0 - @smithy/util-stream@4.5.1 - @smithy/middleware-endpoint@4.3.2 - @smithy/middleware-stack@4.2.1 - @smithy/protocol-http@5.3.1 ## 4.7.1 ### Patch Changes - Updated dependencies [813c9a5] - @smithy/util-stream@4.5.0 - @smithy/core@3.15.0 - @smithy/middleware-endpoint@4.3.1 ## 4.7.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/core@3.14.0 - @smithy/middleware-endpoint@4.3.0 - @smithy/middleware-stack@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 - @smithy/util-stream@4.4.0 ## 4.6.5 ### Patch Changes - Updated dependencies [59e9952] - @smithy/core@3.13.0 - @smithy/middleware-endpoint@4.2.5 ## 4.6.4 ### Patch Changes - Updated dependencies [97fe0d8] - Updated dependencies [3eb73f3] - @smithy/core@3.12.0 - @smithy/middleware-endpoint@4.2.4 ## 4.6.3 ### Patch Changes - Updated dependencies [f8793be] - @smithy/util-stream@4.3.2 - @smithy/core@3.11.1 - @smithy/middleware-endpoint@4.2.3 ## 4.6.2 ### Patch Changes - @smithy/middleware-endpoint@4.2.2 ## 4.6.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/core@3.11.0 - @smithy/middleware-endpoint@4.2.1 - @smithy/middleware-stack@4.1.1 - @smithy/protocol-http@5.2.1 - @smithy/util-stream@4.3.1 ## 4.6.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/middleware-endpoint@4.2.0 - @smithy/middleware-stack@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/util-stream@4.3.0 - @smithy/types@4.4.0 - @smithy/core@3.10.0 ## 4.5.2 ### Patch Changes - Updated dependencies [06ac1f6] - @smithy/core@3.9.2 - @smithy/middleware-endpoint@4.1.21 ## 4.5.1 ### Patch Changes - Updated dependencies [29fad01] - @smithy/core@3.9.1 - @smithy/middleware-endpoint@4.1.20 ## 4.5.0 ### Minor Changes - eb1ab40: default schema log filter ### Patch Changes - Updated dependencies [ab4f33f] - Updated dependencies [d79dc91] - @smithy/core@3.9.0 - @smithy/middleware-endpoint@4.1.19 ## 4.4.10 ### Patch Changes - Updated dependencies [fd00602] - Updated dependencies [64e033f] - @smithy/core@3.8.0 - @smithy/types@4.3.2 - @smithy/middleware-endpoint@4.1.18 - @smithy/middleware-stack@4.0.5 - @smithy/protocol-http@5.1.3 - @smithy/util-stream@4.2.4 ## 4.4.9 ### Patch Changes - Updated dependencies [f4dcba0] - @smithy/core@3.7.2 - @smithy/middleware-endpoint@4.1.17 ## 4.4.8 ### Patch Changes - Updated dependencies [312801c] - Updated dependencies [bb7975e] - @smithy/core@3.7.1 - @smithy/middleware-endpoint@4.1.16 ## 4.4.7 ### Patch Changes - Updated dependencies [bccb1b9] - @smithy/middleware-endpoint@4.1.15 ## 4.4.6 ### Patch Changes - Updated dependencies [d105c97] - Updated dependencies [3ecb1f4] - @smithy/core@3.7.0 - @smithy/middleware-endpoint@4.1.14 - @smithy/util-stream@4.2.3 ## 4.4.5 ### Patch Changes - Updated dependencies [10a0534] - @smithy/core@3.6.0 - @smithy/middleware-endpoint@4.1.13 ## 4.4.4 ### Patch Changes - Updated dependencies [22a286e] - @smithy/middleware-endpoint@4.1.12 ## 4.4.3 ### Patch Changes - Updated dependencies [4a31774] - @smithy/core@3.5.3 - @smithy/middleware-endpoint@4.1.11 ## 4.4.2 ### Patch Changes - Updated dependencies [4642e7e] - Updated dependencies [147ceed] - Updated dependencies [ae8f1f4] - @smithy/core@3.5.2 - @smithy/middleware-endpoint@4.1.10 ## 4.4.1 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/core@3.5.1 - @smithy/middleware-endpoint@4.1.9 - @smithy/middleware-stack@4.0.4 - @smithy/protocol-http@5.1.2 - @smithy/util-stream@4.2.2 ## 4.4.0 ### Minor Changes - 23812a9: add schema property to Command class ### Patch Changes - Updated dependencies [ae11e3a] - Updated dependencies [23812a9] - @smithy/core@3.5.0 - @smithy/middleware-endpoint@4.1.8 ## 4.3.0 ### Minor Changes - 06b0ce8: move serde functions from smithy-client to core/serde ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [efb27ee] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/core@3.4.0 - @smithy/middleware-endpoint@4.1.7 - @smithy/middleware-stack@4.0.3 - @smithy/protocol-http@5.1.1 - @smithy/util-stream@4.2.1 ## 4.2.6 ### Patch Changes - Updated dependencies [786dd3a] - @smithy/middleware-endpoint@4.1.6 - @smithy/core@3.3.3 ## 4.2.5 ### Patch Changes - @smithy/core@3.3.2 - @smithy/middleware-endpoint@4.1.5 ## 4.2.4 ### Patch Changes - @smithy/middleware-endpoint@4.1.4 ## 4.2.3 ### Patch Changes - @smithy/middleware-endpoint@4.1.3 ## 4.2.2 ### Patch Changes - Updated dependencies [40ffcd5] - @smithy/core@3.3.1 - @smithy/middleware-endpoint@4.1.2 ## 4.2.1 ### Patch Changes - Updated dependencies [5896264] - @smithy/core@3.3.0 - @smithy/middleware-endpoint@4.1.1 ## 4.2.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [02ef79c] - Updated dependencies [e917e61] - @smithy/core@3.2.0 - @smithy/middleware-endpoint@4.1.0 - @smithy/protocol-http@5.1.0 - @smithy/util-stream@4.2.0 - @smithy/types@4.2.0 - @smithy/middleware-stack@4.0.2 ## 4.1.6 ### Patch Changes - @smithy/util-stream@4.1.2 - @smithy/core@3.1.5 - @smithy/middleware-endpoint@4.0.6 ## 4.1.5 ### Patch Changes - Updated dependencies [efedb20] - @smithy/util-stream@4.1.1 - @smithy/core@3.1.4 - @smithy/middleware-endpoint@4.0.5 ## 4.1.4 ### Patch Changes - Updated dependencies [d1d1f72] - @smithy/util-stream@4.1.0 - @smithy/core@3.1.3 - @smithy/middleware-endpoint@4.0.4 ## 4.1.3 ### Patch Changes - @smithy/core@3.1.2 - @smithy/middleware-endpoint@4.0.3 ## 4.1.2 ### Patch Changes - @smithy/util-stream@4.0.2 - @smithy/core@3.1.1 - @smithy/middleware-endpoint@4.0.2 ## 4.1.1 ### Patch Changes - e87f2b3: prototype chain fallback for service exception ## 4.1.0 ### Minor Changes - 292c134: adds support for instanceof operator for ServiceException class ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/core@3.1.0 - @smithy/middleware-endpoint@4.0.1 - @smithy/middleware-stack@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/util-stream@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/middleware-endpoint@4.0.0 - @smithy/util-stream@4.0.0 - @smithy/core@3.0.0 - @smithy/middleware-stack@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 ## 3.7.0 ### Minor Changes - a0e71d5: fix(smithy-client): remove support for instanceof operator ### Patch Changes - @smithy/util-stream@3.3.4 - @smithy/core@2.5.7 - @smithy/middleware-endpoint@3.2.8 ## 3.6.0 ### Minor Changes - 23129d9: feat: type check helper method to to know if something is an instance of the ServiceException class ## 3.5.2 ### Patch Changes - @smithy/util-stream@3.3.3 - @smithy/core@2.5.6 - @smithy/middleware-endpoint@3.2.7 ## 3.5.1 ### Patch Changes - 7f17426: fix new operator typing for LazyJsonString - Updated dependencies [e27d42d] - @smithy/middleware-endpoint@3.2.6 ## 3.5.0 ### Minor Changes - 70275bd: remove String extension in LazyJsonString ## 3.4.6 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/core@2.5.5 - @smithy/middleware-endpoint@3.2.5 - @smithy/middleware-stack@3.0.11 - @smithy/protocol-http@4.1.8 - @smithy/util-stream@3.3.2 ## 3.4.5 ### Patch Changes - Updated dependencies [9c40f7b] - @smithy/core@2.5.4 - @smithy/middleware-endpoint@3.2.4 ## 3.4.4 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/core@2.5.3 - @smithy/middleware-endpoint@3.2.3 - @smithy/middleware-stack@3.0.10 - @smithy/protocol-http@4.1.7 - @smithy/util-stream@3.3.1 ## 3.4.3 ### Patch Changes - Updated dependencies [c8d257b] - Updated dependencies [c6ef519] - Updated dependencies [cd1929b] - @smithy/util-stream@3.3.0 - @smithy/core@2.5.2 - @smithy/types@3.7.0 - @smithy/middleware-endpoint@3.2.2 - @smithy/middleware-stack@3.0.9 - @smithy/protocol-http@4.1.6 ## 3.4.2 ### Patch Changes - Updated dependencies [ccdd49f] - @smithy/util-stream@3.2.1 - @smithy/core@2.5.1 - @smithy/middleware-endpoint@3.2.1 ## 3.4.1 ### Patch Changes - d07b0ab: reorganize smithy/core to be upstream of smithy/smithy-client - Updated dependencies [f4e0bd9] - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - Updated dependencies [d07b0ab] - @smithy/util-stream@3.2.0 - @smithy/types@3.6.0 - @smithy/core@2.5.0 - @smithy/middleware-endpoint@3.2.0 - @smithy/middleware-stack@3.0.8 - @smithy/protocol-http@4.1.5 ## 3.4.0 ### Minor Changes - 75e0125: add quoteHeader function ## 3.3.6 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/middleware-endpoint@3.1.4 - @smithy/middleware-stack@3.0.7 - @smithy/protocol-http@4.1.4 - @smithy/util-stream@3.1.9 ## 3.3.5 ### Patch Changes - 64600d8: serialize empty strings and collections in headers ## 3.3.4 ### Patch Changes - @smithy/util-stream@3.1.8 ## 3.3.3 ### Patch Changes - @smithy/util-stream@3.1.7 ## 3.3.2 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/middleware-endpoint@3.1.3 - @smithy/middleware-stack@3.0.6 - @smithy/protocol-http@4.1.3 - @smithy/util-stream@3.1.6 ## 3.3.1 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/util-stream@3.1.5 - @smithy/middleware-endpoint@3.1.2 - @smithy/middleware-stack@3.0.5 - @smithy/protocol-http@4.1.2 ## 3.3.0 ### Minor Changes - d8df7bf: add client handler caching ### Patch Changes - Updated dependencies [c8c53ae] - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/middleware-endpoint@3.1.1 - @smithy/types@3.4.0 - @smithy/util-stream@3.1.4 - @smithy/middleware-stack@3.0.4 - @smithy/protocol-http@4.1.1 ## 3.2.0 ### Minor Changes - 5865b65: handle timestamp cbor tag ## 3.1.12 ### Patch Changes - 670553a: add command instance ref to smithy context ## 3.1.11 ### Patch Changes - @smithy/util-stream@3.1.3 ## 3.1.10 ### Patch Changes - Updated dependencies [4a40961] - Updated dependencies [86862ea] - @smithy/middleware-endpoint@3.1.0 - @smithy/protocol-http@4.1.0 - @smithy/util-stream@3.1.2 ## 3.1.9 ### Patch Changes - Updated dependencies [1cfe243] - @smithy/util-stream@3.1.1 ## 3.1.8 ### Patch Changes - Updated dependencies [796567d] - Updated dependencies [7cd258f] - @smithy/protocol-http@4.0.4 - @smithy/util-stream@3.1.0 ## 3.1.7 ### Patch Changes - @smithy/middleware-endpoint@3.0.5 ## 3.1.6 ### Patch Changes - @smithy/util-stream@3.0.6 ## 3.1.5 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/util-stream@3.0.5 - @smithy/middleware-endpoint@3.0.4 - @smithy/middleware-stack@3.0.3 - @smithy/protocol-http@4.0.3 ## 3.1.4 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/util-stream@3.0.4 - @smithy/middleware-endpoint@3.0.3 - @smithy/middleware-stack@3.0.2 - @smithy/protocol-http@4.0.2 ## 3.1.3 ### Patch Changes - @smithy/util-stream@3.0.3 ## 3.1.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/middleware-endpoint@3.0.2 - @smithy/middleware-stack@3.0.1 - @smithy/protocol-http@4.0.1 - @smithy/util-stream@3.0.2 ## 3.1.1 ### Patch Changes - 3689c949: truncate timestamp ending in 000 milliseconds ## 3.1.0 ### Minor Changes - 764047eb: add dateTime serializer function ### Patch Changes - @smithy/middleware-endpoint@3.0.1 ## 3.0.1 ### Patch Changes - @smithy/util-stream@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [3500f341] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-stream@3.0.0 - @smithy/middleware-endpoint@3.0.0 - @smithy/middleware-stack@3.0.0 - @smithy/protocol-http@4.0.0 ## 2.5.1 ### Patch Changes - Updated dependencies [cc54b8d1] - @smithy/middleware-endpoint@2.5.1 ## 2.5.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - 661f1d60: allow command constructor argument to be omitted if no required members - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/middleware-endpoint@2.5.0 - @smithy/middleware-stack@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/util-stream@2.2.0 - @smithy/types@2.12.0 ## 2.4.5 ### Patch Changes - @smithy/util-stream@2.1.5 ## 2.4.4 ### Patch Changes - @smithy/middleware-endpoint@2.4.6 ## 2.4.3 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/middleware-endpoint@2.4.5 - @smithy/util-stream@2.1.4 - @smithy/middleware-stack@2.1.4 - @smithy/protocol-http@3.2.2 ## 2.4.2 ### Patch Changes - @smithy/middleware-endpoint@2.4.4 ## 2.4.1 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/middleware-endpoint@2.4.3 - @smithy/middleware-stack@2.1.3 - @smithy/protocol-http@3.2.1 - @smithy/util-stream@2.1.3 ## 2.4.0 ### Minor Changes - 929801bc: allow constructor parameters pass-through when initializing requestHandler ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/util-stream@2.1.2 - @smithy/middleware-endpoint@2.4.2 - @smithy/middleware-stack@2.1.2 ## 2.3.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/middleware-endpoint@2.4.1 - @smithy/middleware-stack@2.1.1 - @smithy/protocol-http@3.1.1 - @smithy/types@2.9.1 - @smithy/util-stream@2.1.1 ## 2.3.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/middleware-endpoint@2.4.0 - @smithy/middleware-stack@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/util-stream@2.1.0 - @smithy/types@2.9.0 ## 2.2.1 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/middleware-endpoint@2.3.0 - @smithy/types@2.8.0 - @smithy/middleware-stack@2.0.10 - @smithy/protocol-http@3.0.12 - @smithy/util-stream@2.0.24 ## 2.2.0 ### Minor Changes - 164f3bbd: add Command classBuilder ### Patch Changes - 164f3bbd: add missing dependency declarations ## 2.1.18 ### Patch Changes - @smithy/util-stream@2.0.23 ## 2.1.17 ### Patch Changes - 07ff207b: apply json default filtering when walking through arrays - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/util-stream@2.0.22 - @smithy/middleware-stack@2.0.9 ## 2.1.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/middleware-stack@2.0.8 - @smithy/util-stream@2.0.21 ## 2.1.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/middleware-stack@2.0.7 - @smithy/util-stream@2.0.20 ## 2.1.14 ### Patch Changes - @smithy/util-stream@2.0.19 ## 2.1.13 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-stream@2.0.18 ## 2.1.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/middleware-stack@2.0.6 - @smithy/util-stream@2.0.17 ## 2.1.11 ### Patch Changes - @smithy/util-stream@2.0.16 ## 2.1.10 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/middleware-stack@2.0.5 - @smithy/util-stream@2.0.15 ## 2.1.9 ### Patch Changes - @smithy/util-stream@2.0.14 ## 2.1.8 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/middleware-stack@2.0.4 - @smithy/types@2.3.4 - @smithy/util-stream@2.0.13 ## 2.1.7 ### Patch Changes - Updated dependencies [20fc148d] - @smithy/middleware-stack@2.0.3 ## 2.1.6 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/middleware-stack@2.0.2 - @smithy/types@2.3.3 - @smithy/util-stream@2.0.12 ## 2.1.5 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [99fc0b4c] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/util-stream@2.0.11 - @smithy/middleware-stack@2.0.1 ## 2.1.4 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.10 ## 2.1.3 ### Patch Changes - Updated dependencies [d491b770] - @smithy/util-stream@2.0.9 ## 2.1.2 ### Patch Changes - @smithy/util-stream@2.0.8 ## 2.1.1 ### Patch Changes - @smithy/util-stream@2.0.7 ## 2.1.0 ### Minor Changes - 88bcec3d: Add retry to runtime extension ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.6 ## 2.0.5 ### Patch Changes - b753dd4c: move extensions code to smithy-client - 6c8ffa27: Rename defaultClientConfiguration to defaultExtensionConfiguration - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - Updated dependencies [1be3c4c9] - @smithy/types@2.2.2 - @smithy/util-stream@2.0.5 - @smithy/middleware-stack@2.0.0 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.3 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/middleware-stack@2.0.0 - @smithy/util-stream@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/middleware-stack@1.1.0 - @smithy/types@1.2.0 - @smithy/util-stream@1.1.0 ## 1.0.5 ### Patch Changes - Updated dependencies [99d00e98] - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/util-stream@1.0.3 - @smithy/types@2.0.0 - @smithy/middleware-stack@1.0.2 ## 1.0.4 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/middleware-stack@1.0.2 - @smithy/util-stream@1.0.2 - @smithy/types@1.1.1 ## 1.0.3 ### Patch Changes - @smithy/util-stream@1.0.1 ## 1.0.2 ### Patch Changes - Migrate util-stream, add collect-body-stream - Updated dependencies - @smithy/util-stream@1.0.0 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/middleware-stack@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/smithy-client](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/smithy-client/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/client/smithy-client/NoOpLogger.ts ================================================ import type { Logger } from "@smithy/types"; /** * @internal */ export class NoOpLogger implements Logger { public trace() {} public debug() {} public info() {} public warn() {} public error() {} } ================================================ FILE: packages/core/src/submodules/client/smithy-client/client.spec.ts ================================================ import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { Client } from "./client"; describe("SmithyClient", () => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const mockHandler = vi.fn((args: any) => Promise.resolve({ output: "foo" })); // eslint-disable-next-line @typescript-eslint/no-unused-vars const mockResolveMiddleware = vi.fn((args) => mockHandler); // eslint-disable-next-line @typescript-eslint/no-unused-vars const getCommandWithOutput = (output: string) => ({ resolveMiddleware: mockResolveMiddleware, }); const client = new Client({ cacheMiddleware: true } as any); beforeEach(() => { vi.clearAllMocks(); }); it("should return response promise when only command is supplied", async () => { expect.assertions(1); await expect(client.send(getCommandWithOutput("foo") as any)).resolves.toEqual("foo"); }); it("should return response promise when command and options is supplied", async () => { expect.assertions(3); const options = { AbortSignal: "bar", }; await expect(client.send(getCommandWithOutput("foo") as any, options)).resolves.toEqual("foo"); expect(mockResolveMiddleware.mock.calls.length).toEqual(1); expect(mockResolveMiddleware.mock.calls[0][2 as any]).toEqual(options); }); it("should apply callback when command and callback is supplied", async () => { let resolve: Function; const promise = new Promise((r) => (resolve = r)); const callback = vi.fn((err, response) => { expect(response).toEqual("foo"); resolve(); }); client.send(getCommandWithOutput("foo") as any, callback); await promise; }); it("should apply callback when command, options and callback is supplied", async () => { let resolve: Function; const promise = new Promise((r) => (resolve = r)); const callback = vi.fn((err, response) => { expect(response).toEqual("foo"); expect(mockResolveMiddleware.mock.calls.length).toEqual(1); expect(mockResolveMiddleware.mock.calls[0][2 as any]).toEqual(options); resolve(); }); const options = { AbortSignal: "bar", }; client.send(getCommandWithOutput("foo") as any, options, callback); await promise; }); describe("handler caching", () => { beforeEach(() => { delete (client as any).handlers; }); const privateAccess = () => (client as any).handlers; it("should cache the resolved handler", async () => { await expect(client.send(getCommandWithOutput("foo") as any)).resolves.toEqual("foo"); expect(privateAccess().get({}.constructor)).toBeDefined(); }); it("should not cache the resolved handler if called with request options", async () => { await expect(client.send(getCommandWithOutput("foo") as any, {})).resolves.toEqual("foo"); expect(privateAccess()).toBeUndefined(); }); it("unsets the cache if client.destroy() is called.", async () => { await expect(client.send(getCommandWithOutput("foo") as any)).resolves.toEqual("foo"); client.destroy(); expect(privateAccess()).toBeUndefined(); }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/client.ts ================================================ import type { $ClientProtocol, $ClientProtocolCtor, ClientProtocol, ClientProtocolCtor, Command, FetchHttpHandlerOptions, Handler, Client as IClient, MetadataBearer, MiddlewareStack, NodeHttpHandlerOptions, RequestHandler, } from "@smithy/types"; import { constructStack } from "../middleware-stack/MiddlewareStack"; /** * @public */ export interface SmithyConfiguration { /** * @public */ requestHandler: | RequestHandler | NodeHttpHandlerOptions | FetchHttpHandlerOptions | Record; /** * Default false. * When true, the client will only resolve the middleware stack once per * Command class. This means modifying the middlewareStack of the * command or client after requests have been made will not be * recognized. * Calling client.destroy() also clears this cache. * Enable this only if needing the additional time saved (0-1ms per request) * and not needing middleware modifications between requests. * * @public */ cacheMiddleware?: boolean; /** * A client request/response protocol or constructor of one. * A protocol in this context is not e.g. https. * It is the combined implementation of how to (de)serialize and create * the messages (e.g. http requests/responses) that are being exchanged. * * @public */ protocol?: | ClientProtocol | $ClientProtocol | ClientProtocolCtor | $ClientProtocolCtor; /** * These are automatically generated and will be passed to the * config.protocol if given as a constructor. * @internal */ protocolSettings?: { defaultNamespace?: string; [setting: string]: unknown; }; /** * The API version set internally by the SDK, and is * not planned to be used by customer code. * @internal */ readonly apiVersion: string; } /** * @internal */ export type SmithyResolvedConfiguration = { requestHandler: RequestHandler; cacheMiddleware?: boolean; protocol?: ClientProtocol | $ClientProtocol; protocolSettings?: { defaultNamespace?: string; [setting: string]: unknown; }; readonly apiVersion: string; }; /** * @public */ export class Client< HandlerOptions, ClientInput extends object, ClientOutput extends MetadataBearer, ResolvedClientConfiguration extends SmithyResolvedConfiguration, > implements IClient { public middlewareStack: MiddlewareStack = constructStack(); /** * Holds an object reference to the initial configuration object. * Used to check that the config resolver stack does not create * dangling instances of an intermediate form of the configuration object. * * @internal */ public initConfig?: object; /** * May be used to cache the resolved handler function for a Command class. */ private handlers?: WeakMap> | undefined; constructor(public readonly config: ResolvedClientConfiguration) { const { protocol, protocolSettings } = config; if (protocolSettings) { if (typeof protocol === "function") { // assumed to be a constructor config.protocol = new (protocol as any)(protocolSettings); } } } send( command: Command>, options?: HandlerOptions ): Promise; send( command: Command>, cb: (err: any, data?: OutputType) => void ): void; send( command: Command>, options: HandlerOptions, cb: (err: any, data?: OutputType) => void ): void; send( command: Command>, optionsOrCb?: HandlerOptions | ((err: any, data?: OutputType) => void), cb?: (err: any, data?: OutputType) => void ): Promise | void { const options = typeof optionsOrCb !== "function" ? optionsOrCb : undefined; const callback = typeof optionsOrCb === "function" ? (optionsOrCb as (err: any, data?: OutputType) => void) : cb; const useHandlerCache = options === undefined && this.config.cacheMiddleware === true; let handler: Handler; if (useHandlerCache) { if (!this.handlers) { this.handlers = new WeakMap(); } const handlers = this.handlers!; if (handlers.has(command.constructor)) { handler = handlers.get(command.constructor)!; } else { handler = command.resolveMiddleware(this.middlewareStack as any, this.config, options); handlers.set(command.constructor, handler); } } else { delete this.handlers; handler = command.resolveMiddleware(this.middlewareStack as any, this.config, options); } if (callback) { handler(command) .then( (result) => callback(null, result.output), (err: any) => callback(err) ) .catch( // prevent any errors thrown in the callback from triggering an // unhandled promise rejection () => {} ); } else { return handler(command).then((result) => result.output); } } destroy() { this.config?.requestHandler?.destroy?.(); delete this.handlers; } } ================================================ FILE: packages/core/src/submodules/client/smithy-client/command.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { Command } from "./command"; describe(Command.name, () => { it("has optional argument if the input type has no required members", async () => { type OptionalInput = { key?: string; optional?: string; }; type RequiredInput = { key: string | undefined; optional?: string; }; class WithRequiredInputCommand extends Command.classBuilder().build() {} class WithOptionalInputCommand extends Command.classBuilder().build() {} new WithRequiredInputCommand({ key: "1" }); new WithOptionalInputCommand(); // expect no type error. }); it("implements a classBuilder", async () => { class MyCommand extends Command.classBuilder() .ep({ Endpoint: { type: "builtInParams", name: "Endpoint" }, }) .m(function () { return []; }) .s("SmithyMyClient", "SmithyMyOperation", {}) .n("MyClient", "MyCommand") .f() .ser(async (_) => _) .de(async (_) => _) .build() {} const myCommand = new MyCommand({ Prop: "prop1", }); expect(myCommand).toBeInstanceOf(Command); expect(myCommand).toBeInstanceOf(MyCommand); expect(MyCommand.getEndpointParameterInstructions()).toEqual({ Endpoint: { type: "builtInParams", name: "Endpoint" }, }); expect(myCommand.input).toEqual({ Prop: "prop1", }); // private method exists for compatibility expect((myCommand as any).serialize).toBeDefined(); // private method exists for compatibility expect((myCommand as any).deserialize).toBeDefined(); }); it("should spread requestOptions correctly for event stream commands", async () => { const handleFn = vi.fn().mockResolvedValue({ response: {} }); class MyEventStreamCommand extends Command.classBuilder() .m(function () { return []; }) .s("MyClient", "MyOp", { eventStream: true }) .n("MyClient", "MyOp") .f() .ser(async (_) => ({ ..._, headers: {}, method: "POST", protocol: "https:", hostname: "localhost", path: "/" })) .de(async (_) => ({ $metadata: {} })) .build() {} const cmd = new MyEventStreamCommand({}); const handler = cmd.resolveMiddleware( { concat: () => ({ resolve: (fn: any, ctx: any) => fn }) } as any, { logger: {} as any, requestHandler: { handle: handleFn }, }, { requestTimeout: 5000 } ); await handler({ input: {} }); expect(handleFn).toHaveBeenCalledTimes(1); const passedOptions = handleFn.mock.calls[0][1]; expect(passedOptions).toEqual({ isEventStream: true, requestTimeout: 5000, }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/command.ts ================================================ import type { HttpRequest } from "@smithy/core/protocols"; import { SMITHY_CONTEXT_KEY, type FinalizeHandlerArguments, type Handler, type HandlerExecutionContext, type Command as ICommand, type HttpRequest as IHttpRequest, type HttpResponse as IHttpResponse, type MiddlewareStack as IMiddlewareStack, type Logger, type MetadataBearer, type Mutable, type OperationSchema, type OptionalParameter, type Pluggable, type RequestHandler, type SerdeContext, type StaticOperationSchema, } from "@smithy/types"; import { constructStack } from "../middleware-stack/MiddlewareStack"; import { schemaLogFilter } from "./schemaLogFilter"; // EndpointParameterInstructions inlined to avoid circular dependency with @smithy/middleware-endpoint. type EndpointParameterInstructions = Record; /** * @public */ export abstract class Command< Input extends ClientInput, Output extends ClientOutput, ResolvedClientConfiguration, ClientInput extends object = any, ClientOutput extends MetadataBearer = any, > implements ICommand { public abstract input: Input; public readonly middlewareStack: IMiddlewareStack = constructStack(); public readonly schema?: OperationSchema | StaticOperationSchema; /** * Factory for Command ClassBuilder. * @internal */ public static classBuilder< I extends SI, O extends SO, C extends { logger: Logger; requestHandler: RequestHandler }, SI extends object = any, SO extends MetadataBearer = any, >() { return new ClassBuilder(); } abstract resolveMiddleware( stack: IMiddlewareStack, configuration: ResolvedClientConfiguration, options: any ): Handler; /** * @internal */ public resolveMiddlewareWithContext( clientStack: IMiddlewareStack, configuration: { logger: Logger; requestHandler: RequestHandler }, options: any, { middlewareFn, clientName, commandName, inputFilterSensitiveLog, outputFilterSensitiveLog, smithyContext, additionalContext, CommandCtor, }: ResolveMiddlewareContextArgs ) { for (const mw of middlewareFn.bind(this)(CommandCtor, clientStack, configuration, options)) { this.middlewareStack.use(mw); } const stack = clientStack.concat(this.middlewareStack); const { logger } = configuration; const handlerExecutionContext: HandlerExecutionContext = { logger, clientName, commandName, inputFilterSensitiveLog, outputFilterSensitiveLog, [SMITHY_CONTEXT_KEY]: { commandInstance: this, ...smithyContext, }, ...additionalContext, }; const { requestHandler } = configuration; let requestOptions = options ?? {}; if (smithyContext.eventStream) { requestOptions = { isEventStream: true, ...requestOptions, }; } return stack.resolve( (request: FinalizeHandlerArguments) => requestHandler.handle(request.request as HttpRequest, requestOptions), handlerExecutionContext ); } } /** * @internal */ type ResolveMiddlewareContextArgs = { middlewareFn: (CommandCtor: any, clientStack: any, config: any, options: any) => Pluggable[]; clientName: string; commandName: string; smithyContext: Record; additionalContext: HandlerExecutionContext; inputFilterSensitiveLog: (_: any) => any; outputFilterSensitiveLog: (_: any) => any; CommandCtor: any /* Command constructor */; }; /** * @internal */ class ClassBuilder< I extends SI, O extends SO, C extends { logger: Logger; requestHandler: RequestHandler }, SI extends object = any, SO extends MetadataBearer = any, > { private _init: (_: Command) => void = () => {}; private _ep: EndpointParameterInstructions = {}; private _middlewareFn: (CommandCtor: any, clientStack: any, config: any, options: any) => Pluggable[] = () => []; private _commandName = ""; private _clientName = ""; private _additionalContext = {} as HandlerExecutionContext; private _smithyContext = {} as Record; private _inputFilterSensitiveLog: any = undefined; private _outputFilterSensitiveLog: any = undefined; private _serializer: (input: I, context: SerdeContext | any) => Promise = null as any; private _deserializer: (output: IHttpResponse, context: SerdeContext | any) => Promise = null as any; private _operationSchema?: OperationSchema | StaticOperationSchema; /** * Optional init callback. */ public init(cb: (_: Command) => void) { this._init = cb; } /** * Set the endpoint parameter instructions. */ public ep(endpointParameterInstructions: EndpointParameterInstructions): ClassBuilder { this._ep = endpointParameterInstructions; return this; } /** * Add any number of middleware. */ public m( middlewareSupplier: (CommandCtor: any, clientStack: any, config: any, options: any) => Pluggable[] ): ClassBuilder { this._middlewareFn = middlewareSupplier; return this; } /** * Set the initial handler execution context Smithy field. */ public s( service: string, operation: string, smithyContext: Record = {} ): ClassBuilder { this._smithyContext = { service, operation, ...smithyContext, }; return this; } /** * Set the initial handler execution context. */ public c(additionalContext: HandlerExecutionContext = {}): ClassBuilder { this._additionalContext = additionalContext; return this; } /** * Set constant string identifiers for the operation. */ public n(clientName: string, commandName: string): ClassBuilder { this._clientName = clientName; this._commandName = commandName; return this; } /** * Set the input and output sensistive log filters. */ public f( inputFilter: (_: any) => any = (_) => _, outputFilter: (_: any) => any = (_) => _ ): ClassBuilder { this._inputFilterSensitiveLog = inputFilter; this._outputFilterSensitiveLog = outputFilter; return this; } /** * Sets the serializer. */ public ser( serializer: (input: I, context?: SerdeContext | any) => Promise ): ClassBuilder { this._serializer = serializer; return this; } /** * Sets the deserializer. */ public de( deserializer: (output: IHttpResponse, context?: SerdeContext | any) => Promise ): ClassBuilder { this._deserializer = deserializer; return this; } /** * Sets input/output schema for the operation. */ public sc(operation: OperationSchema | StaticOperationSchema): ClassBuilder { this._operationSchema = operation; this._smithyContext.operationSchema = operation; return this; } /** * @returns a Command class with the classBuilder properties. */ public build(): { new (input: I): CommandImpl; new (...[input]: OptionalParameter): CommandImpl; getEndpointParameterInstructions(): EndpointParameterInstructions; } { // eslint-disable-next-line @typescript-eslint/no-this-alias const closure = this; let CommandRef: any; return (CommandRef = class extends Command { public readonly input: I; /** * @public */ public static getEndpointParameterInstructions(): EndpointParameterInstructions { return closure._ep; } /** * @public */ public constructor(...[input]: OptionalParameter) { super(); this.input = input ?? ({} as unknown as I); closure._init(this); (this as Mutable).schema = closure._operationSchema; } /** * @internal */ public resolveMiddleware(stack: IMiddlewareStack, configuration: C, options: any): Handler { const op = closure._operationSchema; const input = (op as StaticOperationSchema)?.[4] ?? (op as OperationSchema)?.input; const output = (op as StaticOperationSchema)?.[5] ?? (op as OperationSchema)?.output; return this.resolveMiddlewareWithContext(stack, configuration, options, { CommandCtor: CommandRef, middlewareFn: closure._middlewareFn, clientName: closure._clientName, commandName: closure._commandName, inputFilterSensitiveLog: closure._inputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, input) : (_) => _), outputFilterSensitiveLog: closure._outputFilterSensitiveLog ?? (op ? schemaLogFilter.bind(null, output) : (_) => _), smithyContext: closure._smithyContext, additionalContext: closure._additionalContext, }); } /** * @internal */ // @ts-ignore used in middlewareFn closure. public serialize = closure._serializer; /** * @internal */ // @ts-ignore used in middlewareFn closure. public deserialize = closure._deserializer; }); } } /** * A concrete implementation of ICommand with no abstract members. * @public */ export interface CommandImpl< I extends SI, O extends SO, C extends { logger: Logger; requestHandler: RequestHandler }, SI extends object = any, SO extends MetadataBearer = any, > extends Command { readonly input: I; resolveMiddleware(stack: IMiddlewareStack, configuration: C, options: any): Handler; } ================================================ FILE: packages/core/src/submodules/client/smithy-client/constants.ts ================================================ /** * @internal */ export const SENSITIVE_STRING = "***SensitiveInformation***"; ================================================ FILE: packages/core/src/submodules/client/smithy-client/create-aggregated-client.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { createAggregatedClient } from "./create-aggregated-client"; class BaseClient { send = vi.fn() as any; } class AggregatedClient extends BaseClient { constructor(commands: Record) { super(); createAggregatedClient(commands, AggregatedClient as any); } } class UserClient extends AggregatedClient {} describe(createAggregatedClient.name, () => { it("extends its base client", async () => { const commands = { ActionCommand: vi.fn(), }; const aggregatedClient: any = new AggregatedClient(commands); expect(aggregatedClient).toBeInstanceOf(BaseClient); expect(aggregatedClient).toBeInstanceOf(AggregatedClient); }); it("is extensible", async () => { const commands = { ActionCommand: vi.fn(), }; const aggregatedClient: any = new UserClient(commands); expect(aggregatedClient).toBeInstanceOf(UserClient); expect(aggregatedClient).toBeInstanceOf(AggregatedClient); expect(aggregatedClient).toBeInstanceOf(BaseClient); }); it("should dispatch using the command lookup", async () => { const commands = { ActionCommand: vi.fn(), }; const aggregatedClient: any = new AggregatedClient(commands); expect(() => aggregatedClient.nonExistentMethod()).toThrow(); expect(() => aggregatedClient.action()).not.toThrow(); expect(typeof aggregatedClient.action).toBe("function"); }); it("should call send with the matching command", async () => { const commands = { ActionCommand: vi.fn(), }; const aggregatedClient: any = new AggregatedClient(commands); await aggregatedClient.action({ a: "a" }); expect(commands.ActionCommand).toHaveBeenCalledWith({ a: "a" }); expect(aggregatedClient.send).toHaveBeenCalled(); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/create-aggregated-client.ts ================================================ import type { PaginationConfiguration, WaiterConfiguration } from "@smithy/types"; import type { Client } from "./client"; /** * @internal */ type AggregatedClientPaginationConfiguration = Omit; /** * @internal */ type AggregatedClientWaiterConfiguration = Omit, "client">; /** * @internal * * @param commands - command lookup container. * @param Client - client instance on which to add aggregated methods. * @param options - paginator and waiter functions. * * @returns an aggregated client with dynamically created methods. */ export const createAggregatedClient = ( commands: Record, Client: { new (...args: any): Client }, options?: { paginators?: Record; waiters?: Record; } ): void => { type CommandInput = any; for (const [command, CommandCtor] of Object.entries(commands)) { const methodImpl = async function ( this: InstanceType, args: CommandInput, optionsOrCb: any, cb: any ) { const command: any = new CommandCtor(args); if (typeof optionsOrCb === "function") { this.send(command, optionsOrCb); } else if (typeof cb === "function") { if (typeof optionsOrCb !== "object") throw new Error(`Expected http options but got ${typeof optionsOrCb}`); this.send(command, optionsOrCb || {}, cb); } else { return this.send(command, optionsOrCb); } }; const methodName = (command[0].toLowerCase() + command.slice(1)).replace(/Command$/, ""); Client.prototype[methodName] = methodImpl; } const { paginators = {}, waiters = {} } = options ?? {}; for (const [paginatorName, paginatorFn] of Object.entries(paginators)) { if (Client.prototype[paginatorName] === void 0) { Client.prototype[paginatorName] = function ( this: InstanceType, commandInput: CommandInput = {}, paginationConfiguration: AggregatedClientPaginationConfiguration, ...rest: any[] ) { return paginatorFn( { ...paginationConfiguration, client: this, }, commandInput, ...rest ); }; } } for (const [waiterName, waiterFn] of Object.entries(waiters)) { if (Client.prototype[waiterName] === void 0) { Client.prototype[waiterName] = async function ( this: InstanceType, commandInput: CommandInput = {}, waiterConfiguration: AggregatedClientWaiterConfiguration | number, ...rest: any[] ) { let config = waiterConfiguration as AggregatedClientWaiterConfiguration; if (typeof waiterConfiguration === "number") { config = { maxWaitTime: waiterConfiguration, }; } return waiterFn( { ...config, client: this, }, commandInput, ...rest ); }; } } }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/default-error-handler.ts ================================================ import type { HttpResponse, ResponseMetadata } from "@smithy/types"; import { decorateServiceException } from "./exceptions"; /** * Always throws an error with the given `exceptionCtor` and other arguments. * This is only called from an error handling code path. * * @internal */ export const throwDefaultError = ({ output, parsedBody, exceptionCtor, errorCode }: any) => { const $metadata = deserializeMetadata(output); const statusCode = $metadata.httpStatusCode ? $metadata.httpStatusCode + "" : undefined; const response = new exceptionCtor({ name: parsedBody?.code || parsedBody?.Code || errorCode || statusCode || "UnknownError", $fault: "client", $metadata, }); throw decorateServiceException(response, parsedBody); }; /** * Creates {@link throwDefaultError} with bound ExceptionCtor. * * @internal */ export const withBaseException = (ExceptionCtor: { new (...args: any): any }): any => { return ({ output, parsedBody, errorCode }: any) => { throwDefaultError({ output, parsedBody, exceptionCtor: ExceptionCtor, errorCode }); }; }; const deserializeMetadata = (output: HttpResponse): ResponseMetadata => ({ httpStatusCode: output.statusCode, requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"], extendedRequestId: output.headers["x-amz-id-2"], cfId: output.headers["x-amz-cf-id"], }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/defaults-mode.ts ================================================ // smithy-typescript generated code /** * @internal */ export const loadConfigsForDefaultMode = (mode: ResolvedDefaultsMode): DefaultsModeConfigs => { switch (mode) { case "standard": return { retryMode: "standard", connectionTimeout: 3100, }; case "in-region": return { retryMode: "standard", connectionTimeout: 1100, }; case "cross-region": return { retryMode: "standard", connectionTimeout: 3100, }; case "mobile": return { retryMode: "standard", connectionTimeout: 30000, }; default: return {}; } }; /** * Option determining how certain default configuration options are resolved in the SDK. It can be one of the value listed below: * * `"standard"`:

The STANDARD mode provides the latest recommended default values that should be safe to run in most scenarios

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

* * `"in-region"`:

The IN_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services from within the same AWS region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

* * `"cross-region"`:

The CROSS_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services in a different region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

* * `"mobile"`:

The MOBILE mode builds on the standard mode and includes optimization tailored for mobile applications

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

* * `"auto"`:

The AUTO mode is an experimental mode that builds on the standard mode. The SDK will attempt to discover the execution environment to determine the appropriate settings automatically.

* * `"legacy"`:

The LEGACY mode provides default settings that vary per SDK and were used prior to establishment of defaults_mode

* * @defaultValue "legacy" */ export type DefaultsMode = "standard" | "in-region" | "cross-region" | "mobile" | "auto" | "legacy"; /** * @internal */ export type ResolvedDefaultsMode = Exclude; /** * @internal */ export interface DefaultsModeConfigs { retryMode?: string; connectionTimeout?: number; requestTimeout?: number; } ================================================ FILE: packages/core/src/submodules/client/smithy-client/emitWarningIfUnsupportedVersion.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; describe.skip("emitWarningIfUnsupportedVersion", () => { let emitWarningIfUnsupportedVersion: any; const emitWarning = process.emitWarning; const supportedVersion = "16.0.0"; beforeEach(() => { const module = require("./emitWarningIfUnsupportedVersion"); emitWarningIfUnsupportedVersion = module.emitWarningIfUnsupportedVersion; }); afterEach(() => { vi.clearAllMocks(); vi.resetModules(); process.emitWarning = emitWarning; }); describe(`emits warning for Node.js <${supportedVersion}`, () => { const getPreviousMajorVersion = (major: number) => (major === 0 ? 0 : major - 1); const getPreviousMinorVersion = ([major, minor]: [number, number]) => minor === 0 ? [getPreviousMajorVersion(major), 9] : [major, minor - 1]; const getPreviousPatchVersion = ([major, minor, patch]: [number, number, number]) => patch === 0 ? [...getPreviousMinorVersion([major, minor]), 9] : [major, minor, patch - 1]; const [major, minor, patch] = supportedVersion.split(".").map(Number); it.each( [ getPreviousPatchVersion([major, minor, patch]), [...getPreviousMinorVersion([major, minor]), 0], [getPreviousMajorVersion(major), 0, 0], ].map((arr) => `v${arr.join(".")}`) )(`%s`, async (unsupportedVersion) => { process.emitWarning = vi.fn(); emitWarningIfUnsupportedVersion(unsupportedVersion); // Verify that the warning was emitted. expect(process.emitWarning).toHaveBeenCalledTimes(1); expect(process.emitWarning).toHaveBeenCalledWith(`<>`, `NodeDeprecationWarning`); // Verify that the warning emits only once. emitWarningIfUnsupportedVersion(unsupportedVersion); expect(process.emitWarning).toHaveBeenCalledTimes(1); }); }); describe(`emits no warning for Node.js >=${supportedVersion}`, () => { const [major, minor, patch] = supportedVersion.split(".").map(Number); it.each( [ [major, minor, patch], [major, minor, patch + 1], [major, minor + 1, 0], [major + 1, 0, 0], ].map((arr) => `v${arr.join(".")}`) )(`%s`, async (unsupportedVersion) => { process.emitWarning = vi.fn(); emitWarningIfUnsupportedVersion(unsupportedVersion); expect(process.emitWarning).not.toHaveBeenCalled(); }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/emitWarningIfUnsupportedVersion.ts ================================================ // Stores whether the warning was already emitted. let warningEmitted = false; /** * Emits warning if the provided Node.js version string is pending deprecation. * * @internal * @param version - The Node.js version string. */ export const emitWarningIfUnsupportedVersion = (version: string) => { if (version && !warningEmitted && parseInt(version.substring(1, version.indexOf("."))) < 16) { warningEmitted = true; // ToDo: Turn back warning for future Node.js version deprecation // process.emitWarning( // `The AWS SDK for JavaScript (v3) will\n` + // `no longer support Node.js ${version} on <>.\n\n` + // `To continue receiving updates to AWS services, bug fixes, and security\n` + // `updates please upgrade to Node.js <> or later.\n\n` + // `For details, please refer our blog post: <>`, // `NodeDeprecationWarning` // ); } }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/exceptions.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { ServiceException, decorateServiceException, type ExceptionOptionType } from "./exceptions"; it("ServiceException extends from Error", () => { expect( new ServiceException({ name: "Error", message: "", $fault: "client", $metadata: {}, }) ).toBeInstanceOf(Error); }); it("ExceptionOptionType allows specifying message", () => { class SomeException extends ServiceException { readonly code: string; constructor(opts: ExceptionOptionType) { super({ name: "SomeException", $fault: "client", ...opts, }); this.code = opts.code; } } const exception = new SomeException({ message: "message", code: "code", $metadata: {}, }); expect(exception.message).toBe("message"); expect(exception.code).toBe("code"); }); describe("Exception Hierarchy Tests", () => { // test classes to represent the hierarchy class ClientServiceException extends ServiceException { constructor() { super({ name: "ClientServiceException", $fault: "client", $metadata: {}, }); Object.setPrototypeOf(this, ClientServiceException.prototype); } } class ModeledClientServiceException extends ClientServiceException { constructor() { super(); this.name = "ModeledClientServiceException"; Object.setPrototypeOf(this, ModeledClientServiceException.prototype); } } describe("Empty Object Tests", () => { it("empty object should not be instanceof any exception", () => { expect({} instanceof Error).toBe(false); expect({} instanceof ServiceException).toBe(false); expect({} instanceof ClientServiceException).toBe(false); expect({} instanceof ModeledClientServiceException).toBe(false); }); }); describe("Error Instance Tests", () => { const error = new Error(); it("Error instance should only be instanceof Error", () => { expect(error instanceof Error).toBe(true); expect(error instanceof ServiceException).toBe(false); expect(error instanceof ClientServiceException).toBe(false); expect(error instanceof ModeledClientServiceException).toBe(false); }); }); describe("ServiceException Instance Tests", () => { const serviceException = new ServiceException({ name: "ServiceException", $fault: "client", $metadata: {}, }); it("ServiceException instance should be instanceof Error and ServiceException", () => { expect(serviceException instanceof Error).toBe(true); expect(serviceException instanceof ServiceException).toBe(true); expect(serviceException instanceof ClientServiceException).toBe(false); expect(serviceException instanceof ModeledClientServiceException).toBe(false); }); }); describe("ClientServiceException Instance Tests", () => { const clientException = new ClientServiceException(); it("ClientServiceException instance should be instanceof Error, ServiceException, and ClientServiceException", () => { expect(clientException instanceof Error).toBe(true); expect(clientException instanceof ServiceException).toBe(true); expect(clientException instanceof ClientServiceException).toBe(true); expect(clientException instanceof ModeledClientServiceException).toBe(false); }); it("should handle exceptions where name indicates error type", () => { const egError = new ClientServiceException(); egError.name = "EgTooLarge"; // specific error type name // Should maintain instanceof chain expect(egError instanceof Error).toBe(true); expect(egError instanceof ServiceException).toBe(true); expect(egError instanceof ClientServiceException).toBe(true); // The name property can be used to identify specific error types expect(egError.name).toBe("EgTooLarge"); }); }); describe("ModeledClientServiceException Instance Tests", () => { const modeledException = new ModeledClientServiceException(); it("ModeledClientServiceException instance should be instanceof Error, ServiceException, ClientServiceException, and ModeledClientServiceException", () => { expect(modeledException instanceof Error).toBe(true); expect(modeledException instanceof ServiceException).toBe(true); expect(modeledException instanceof ClientServiceException).toBe(true); expect(modeledException instanceof ModeledClientServiceException).toBe(true); }); }); describe("Duck-Typed Object Tests", () => { it("object with only name should not be instanceof any exception", () => { const obj = { name: "Error" }; expect(obj instanceof Error).toBe(false); expect(obj instanceof ServiceException).toBe(false); expect(obj instanceof ClientServiceException).toBe(false); expect(obj instanceof ModeledClientServiceException).toBe(false); }); it("object with only $-props should be instanceof ServiceException", () => { const obj = { $fault: "client" as const, $metadata: {} }; expect(obj instanceof Error).toBe(false); expect(obj instanceof ServiceException).toBe(true); expect(obj instanceof ClientServiceException).toBe(false); expect(obj instanceof ModeledClientServiceException).toBe(false); }); it("object with ServiceException name and $-props should be instanceof ServiceException only", () => { const obj = { name: "ServiceException", $fault: "client" as const, $metadata: {} }; expect(obj instanceof Error).toBe(false); expect(obj instanceof ServiceException).toBe(true); expect(obj instanceof ClientServiceException).toBe(false); expect(obj instanceof ModeledClientServiceException).toBe(false); }); it("object with ClientServiceException name and $-props should be instanceof ServiceException and ClientServiceException", () => { const obj = { name: "ClientServiceException", $fault: "client" as const, $metadata: {} }; expect(obj instanceof Error).toBe(false); expect(obj instanceof ServiceException).toBe(true); expect(obj instanceof ClientServiceException).toBe(true); expect(obj instanceof ModeledClientServiceException).toBe(false); }); it("object with ModeledClientServiceException name and $-props should be instanceof ServiceException and ModeledClientServiceException", () => { const obj = { name: "ModeledClientServiceException", $fault: "client" as const, $metadata: {} }; expect(obj instanceof Error).toBe(false); expect(obj instanceof ServiceException).toBe(true); expect(obj instanceof ClientServiceException).toBe(false); expect(obj instanceof ModeledClientServiceException).toBe(true); }); }); }); describe("decorateServiceException", () => { const exception = new ServiceException({ name: "Error", message: "Error", $fault: "client", $metadata: {}, }); it("should inject unmodeled members to the exception", () => { const decorated = decorateServiceException(exception, { foo: "foo" }); expect((decorated as any).foo).toBe("foo"); }); it("should not inject unmodeled members to the undefined", () => { const decorated = decorateServiceException(exception, { message: undefined }); expect(decorated.message).toBe("Error"); }); it("should not overwrite the parsed exceptions", () => { const decorated = decorateServiceException(exception, { message: "Another Error" }); expect(decorated.message).toBe("Error"); }); it("should replace Message with message", () => { const decorated = decorateServiceException({ name: "Error", Message: "message", } as any); expect(decorated.message).toBe("message"); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/exceptions.ts ================================================ import type { HttpResponse, MetadataBearer, ResponseMetadata, RetryableTrait, SmithyException } from "@smithy/types"; /** * The type of the exception class constructor parameter. The returned type contains the properties * in the `ExceptionType` but not in the `BaseExceptionType`. If the `BaseExceptionType` contains * `$metadata` and `message` properties, it's also included in the returned type. * @internal */ export type ExceptionOptionType = Omit< ExceptionType, Exclude >; /** * @public */ export interface ServiceExceptionOptions extends SmithyException, MetadataBearer { message?: string; } /** * Base exception class for the exceptions from the server-side. * * @public */ export class ServiceException extends Error implements SmithyException, MetadataBearer { readonly $fault: "client" | "server"; $response?: HttpResponse; $retryable?: RetryableTrait; $metadata: ResponseMetadata; constructor(options: ServiceExceptionOptions) { super(options.message); Object.setPrototypeOf(this, Object.getPrototypeOf(this).constructor.prototype); this.name = options.name; this.$fault = options.$fault; this.$metadata = options.$metadata; } /** * Checks if a value is an instance of ServiceException (duck typed) */ public static isInstance(value: unknown): value is ServiceException { if (!value) return false; const candidate = value as ServiceException; return ( ServiceException.prototype.isPrototypeOf(candidate) || (Boolean(candidate.$fault) && Boolean(candidate.$metadata) && (candidate.$fault === "client" || candidate.$fault === "server")) ); } /** * Custom instanceof check to support the operator for ServiceException base class */ public static [Symbol.hasInstance](instance: unknown): boolean { // Handle null/undefined if (!instance) return false; const candidate = instance as ServiceException; // For ServiceException, check only $-props if (this === ServiceException) { return ServiceException.isInstance(instance); } // For subclasses, check both prototype chain and name match // Note: instance must be ServiceException first (having $-props) if (ServiceException.isInstance(instance)) { // Only do name comparison if both sides have non-empty names if (candidate.name && this.name) { return this.prototype.isPrototypeOf(instance) || candidate.name === this.name; } // Otherwise fall back to just prototype check return this.prototype.isPrototypeOf(instance); } return false; } } /** * This method inject unmodeled member to a deserialized SDK exception, * and load the error message from different possible keys('message', * 'Message'). * * @internal */ export const decorateServiceException = ( exception: E, additions: Record = {} ): E => { // apply additional properties to deserialized ServiceException object Object.entries(additions) .filter(([, v]) => v !== undefined) .forEach(([k, v]) => { // @ts-ignore examine unmodeled keys if (exception[k] == undefined || exception[k] === "") { // @ts-ignore assign unmodeled keys exception[k] = v; } }); // load error message from possible locations // @ts-expect-error message could exist in Message key. const message = exception.message || exception.Message || "UnknownError"; exception.message = message; // @ts-expect-error delete exception.Message; return exception; }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/extensions/checksum.integ.spec.ts ================================================ import { RpcV2Protocol } from "@smithy/smithy-rpcv2-cbor-schema"; import type { Checksum } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import type { PartialChecksumRuntimeConfigType } from "./checksum"; describe("checksum extension", () => { it("should allow definition of new checksum algorithms via runtime extension", async () => { class Sha256Custom implements Checksum { update() {} async digest() { return new Uint8Array(4); } reset() {} } class R1 { update() {} async digest() { return new Uint8Array(4); } reset() {} } const client = new RpcV2Protocol({ endpoint: "https://localhost", extensions: [ { configure(ext) { ext.addChecksumAlgorithm({ algorithmId() { return "r1"; }, checksumConstructor() { return R1; }, }); ext.addChecksumAlgorithm({ algorithmId() { return "sha256"; }, checksumConstructor() { return Sha256Custom; }, }); }, }, ], }); const config = client.config as typeof client.config & PartialChecksumRuntimeConfigType; expect(config.checksumAlgorithms).toEqual({ // the algo id is used as the key if it is not recognized. r1: R1, // Rhe uppercase form is used if it is recognized. // This matches the key in the algorithm selector function. SHA256: Sha256Custom, }); // for known algorithms that exist on the config, they are also set by the extension. expect(config.sha256).toEqual(Sha256Custom); expect(config.md5).toEqual(undefined); expect(config.sha1).toEqual(undefined); // for novel algorithms, they are not set to new fields on the config. expect((config as any).r1).toEqual(undefined); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/extensions/checksum.ts ================================================ import { AlgorithmId, type ChecksumAlgorithm, type ChecksumConfiguration, type ChecksumConstructor, type HashConstructor, } from "@smithy/types"; export { AlgorithmId, ChecksumAlgorithm, ChecksumConfiguration }; /** * @internal */ const knownAlgorithms: string[] = Object.values(AlgorithmId); /** * @internal */ export type PartialChecksumRuntimeConfigType = { checksumAlgorithms?: Record; sha256?: ChecksumConstructor | HashConstructor; md5?: ChecksumConstructor | HashConstructor; crc32?: ChecksumConstructor | HashConstructor; crc32c?: ChecksumConstructor | HashConstructor; sha1?: ChecksumConstructor | HashConstructor; }; /** * @param runtimeConfig - config object of the client instance. * @internal */ export const getChecksumConfiguration = (runtimeConfig: PartialChecksumRuntimeConfigType) => { const checksumAlgorithms: ChecksumAlgorithm[] = []; for (const id in AlgorithmId) { const algorithmId = AlgorithmId[id as keyof typeof AlgorithmId]; if (runtimeConfig[algorithmId] === undefined) { continue; } checksumAlgorithms.push({ algorithmId: () => algorithmId, checksumConstructor: () => runtimeConfig[algorithmId]!, }); } for (const [id, ChecksumCtor] of Object.entries(runtimeConfig.checksumAlgorithms ?? {})) { checksumAlgorithms.push({ algorithmId: () => id, checksumConstructor: () => ChecksumCtor, }); } return { addChecksumAlgorithm(algo: ChecksumAlgorithm): void { runtimeConfig.checksumAlgorithms = runtimeConfig.checksumAlgorithms ?? {}; const id = algo.algorithmId(); const ctor = algo.checksumConstructor(); if (knownAlgorithms.includes(id)) { runtimeConfig.checksumAlgorithms[id.toUpperCase()] = ctor; } else { runtimeConfig.checksumAlgorithms[id] = ctor; } checksumAlgorithms.push(algo); }, checksumAlgorithms(): ChecksumAlgorithm[] { return checksumAlgorithms; }, }; }; /** * @internal */ export const resolveChecksumRuntimeConfig = (clientConfig: ChecksumConfiguration): PartialChecksumRuntimeConfigType => { const runtimeConfig: PartialChecksumRuntimeConfigType = {}; clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => { const id = checksumAlgorithm.algorithmId(); if (knownAlgorithms.includes(id)) { runtimeConfig[id as AlgorithmId] = checksumAlgorithm.checksumConstructor(); } // else the algorithm was attached to the checksumAlgorithms object on the client config already. }); return runtimeConfig; }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/extensions/defaultExtensionConfiguration.ts ================================================ import type { DefaultExtensionConfiguration } from "@smithy/types"; import { getChecksumConfiguration, resolveChecksumRuntimeConfig, type PartialChecksumRuntimeConfigType, } from "./checksum"; import { getRetryConfiguration, resolveRetryRuntimeConfig, type PartialRetryRuntimeConfigType } from "./retry"; /** * @internal */ export type DefaultExtensionRuntimeConfigType = PartialRetryRuntimeConfigType & PartialChecksumRuntimeConfigType; /** * Helper function to resolve default extension configuration from runtime config * * @internal */ export const getDefaultExtensionConfiguration = (runtimeConfig: DefaultExtensionRuntimeConfigType) => { return Object.assign(getChecksumConfiguration(runtimeConfig), getRetryConfiguration(runtimeConfig)); }; /** * Helper function to resolve default extension configuration from runtime config * * @internal * @deprecated use getDefaultExtensionConfiguration */ export const getDefaultClientConfiguration = getDefaultExtensionConfiguration; /** * Helper function to resolve runtime config from default extension configuration * * @internal */ export const resolveDefaultRuntimeConfig = ( config: DefaultExtensionConfiguration ): DefaultExtensionRuntimeConfigType => { return Object.assign(resolveChecksumRuntimeConfig(config), resolveRetryRuntimeConfig(config)); }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/extensions/retry.ts ================================================ import type { Provider, RetryStrategy, RetryStrategyConfiguration, RetryStrategyV2 } from "@smithy/types"; /** * @internal */ export type PartialRetryRuntimeConfigType = Partial<{ retryStrategy: Provider }>; /** * @internal */ export const getRetryConfiguration = (runtimeConfig: PartialRetryRuntimeConfigType) => { return { setRetryStrategy(retryStrategy: Provider): void { runtimeConfig.retryStrategy = retryStrategy; }, retryStrategy(): Provider { return runtimeConfig.retryStrategy!; }, }; }; /** * @internal */ export const resolveRetryRuntimeConfig = ( retryStrategyConfiguration: RetryStrategyConfiguration ): PartialRetryRuntimeConfigType => { const runtimeConfig: PartialRetryRuntimeConfigType = {}; runtimeConfig.retryStrategy = retryStrategyConfiguration.retryStrategy(); return runtimeConfig; }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/get-array-if-single-item.ts ================================================ /** * The XML parser will set one K:V for a member that could * return multiple entries but only has one. * * @internal */ export const getArrayIfSingleItem = (mayBeArray: T): T | T[] => Array.isArray(mayBeArray) ? mayBeArray : [mayBeArray]; ================================================ FILE: packages/core/src/submodules/client/smithy-client/get-value-from-text-node.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { getValueFromTextNode } from "./get-value-from-text-node"; describe("getValueFromTextNode", () => { const valueInsideTextNode = "valueInsideTextNode"; it("doesn't modify object if #text is absent", () => { const input = { key: "value", keyObj: { keyInsideObj: "valueInsideObj", }, }; const output = getValueFromTextNode(input); expect(output).toBe(input); }); it("populates key with value in #text at first level", () => { const input = { key: "value", keyWithoutTextNode: { key: "value", }, keyWithTextNode: { "#text": valueInsideTextNode, }, }; const output = getValueFromTextNode(input); expect(output.key).toBe(input.key); expect(output.keyWithoutTextNode).toBe(input.keyWithoutTextNode); expect(output.keyWithTextNode).toBe(valueInsideTextNode); }); it("populates key with value in #text at second level", () => { const input = { key: "value", keyWithoutTextNodeAtAnyLevel: { keyObj: { key: "value", }, }, keyWithTextNodeAtLevel2: { keyWithTextNode: { "#text": valueInsideTextNode, }, }, }; const output = getValueFromTextNode(input); expect(output.key).toBe(input.key); expect(output.keyWithoutTextNodeAtAnyLevel).toBe(input.keyWithoutTextNodeAtAnyLevel); expect(output.keyWithTextNodeAtLevel2.keyWithTextNode).toBe(valueInsideTextNode); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/get-value-from-text-node.ts ================================================ /** * Recursively parses object and populates value is node from * "#text" key if it's available * * @internal */ export const getValueFromTextNode = (obj: any) => { const textNodeName = "#text"; for (const key in obj) { if (obj.hasOwnProperty(key) && obj[key][textNodeName] !== undefined) { obj[key] = obj[key][textNodeName]; } else if (typeof obj[key] === "object" && obj[key] !== null) { obj[key] = getValueFromTextNode(obj[key]); } } return obj; }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/is-serializable-header-value.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isSerializableHeaderValue } from "./is-serializable-header-value"; describe(isSerializableHeaderValue.name, () => { it("considers empty strings serializable", () => { expect(isSerializableHeaderValue("")).toBe(true); }); it("considers empty collections serializable", () => { expect(isSerializableHeaderValue(new Set())).toBe(true); expect(isSerializableHeaderValue([])).toBe(true); }); it("considers most falsy data values to be serializable", () => { expect(isSerializableHeaderValue(false)).toBe(true); expect(isSerializableHeaderValue(0)).toBe(true); expect(isSerializableHeaderValue(new Date(0))).toBe(true); }); it("considered undefined and null to be unserializable", () => { expect(isSerializableHeaderValue(undefined)).toBe(false); expect(isSerializableHeaderValue(null)).toBe(false); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/is-serializable-header-value.ts ================================================ /** * @internal * @returns whether the header value is serializable. */ export const isSerializableHeaderValue = (value: any) => { return value != null; }; ================================================ FILE: packages/core/src/submodules/client/smithy-client/object-mapping.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { map, take, type ObjectMappingInstructions, type SourceMappingInstructions } from "./object-mapping"; describe("object mapping", () => { const example: ObjectMappingInstructions = { lazyValue1: [, () => 1], lazyValue2: [, () => 2], lazyValue3: [, () => 3], lazyConditionalValue1: [() => true, () => 4], lazyConditionalValue2: [() => true, () => 5], lazyConditionalValue3: [true, () => 6], lazyConditionalValue4: [false, () => 44], lazyConditionalValue5: [() => false, () => 55], lazyConditionalValue6: ["", () => 66], simpleValue1: [, 7], simpleValue2: [, 8], simpleValue3: [, 9], conditionalValue1: [() => true, 10], conditionalValue2: [() => true, 11], conditionalValue3: [{}, 12], conditionalValue4: [false, 110], conditionalValue5: [() => false, 121], conditionalValue6: ["", 132], }; const exampleResult: Record = { lazyValue1: 1, lazyValue2: 2, lazyValue3: 3, lazyConditionalValue1: 4, lazyConditionalValue2: 5, lazyConditionalValue3: 6, simpleValue1: 7, simpleValue2: 8, simpleValue3: 9, conditionalValue1: 10, conditionalValue2: 11, conditionalValue3: 12, }; describe("map function", () => { it("should map various values according to their instruction sets", () => { expect(map({}, example)).toEqual(exampleResult); }); it("should allow default empty object as target", () => { expect(map(example)).toEqual(exampleResult); }); it("should allow a uniform default filter to be specified", () => { expect(map({}, (_: number) => _ % 2 === 0, exampleResult)).toEqual({ lazyValue2: 2, lazyConditionalValue1: 4, lazyConditionalValue3: 6, simpleValue2: 8, conditionalValue1: 10, conditionalValue3: 12, }); }); it("should allow a set of passing filters", () => { expect( map({ a: [, 0], b: [, false], c: [, ""], d: [, []], e: [, [void 0, void 0]], f: [, {}], g: [, [false, void 0]], h: [true, void 0], i: [1, void 0], j: [" ", void 0], k: [[], void 0], l: [{}, void 0], m: [() => true, void 0], n: [(val: any) => val === void 0, void 1], o: [() => true, () => void 0], p: [(val: any) => val !== 1, () => 1], // value is not provided to filter fn when value provider is lazy q: 0, r: false, s: "", t: undefined, u: null, }) ).toEqual({ a: 0, b: false, c: "", d: [], e: [undefined, undefined], f: {}, g: [false, undefined], h: undefined, i: undefined, j: undefined, k: undefined, l: undefined, m: undefined, n: undefined, o: undefined, p: 1, q: 0, r: false, s: "", t: undefined, u: null, }); }); it("should block a set of failing filters", () => { expect( map({ a: [, undefined], b: [, null], c: [(_: any) => _ !== "", ""], d: [(_: any) => _.length !== 0, []], e: [0, 0], f: [false, false], g: ["", ""], h: [undefined, undefined], i: [null, null], j: [() => false, void 0], k: [(val: any) => val !== void 0, void 0], l: [() => false, () => void 0], m: [(val: any) => val === 1, () => 1], // value is not provided to filter fn when value provider is lazy n: [, () => undefined], }) ).toEqual({}); }); }); describe("take function", () => { it("will not apply instructions to missing fields", () => { const input = { filteredDefault: null, filteredSupplier: undefined, filteredMapper: void 0, filteredFilter: 43, filteredMapperOnly: null, } as const; const output = {} as const; const instructions: SourceMappingInstructions = { default: [], filteredDefault: [], supplier: [, () => "x"], filteredSupplier: [, () => "x"], mapper: [, (_: any) => _ + "x"], filteredMapper: [, (_: any) => _ + "x"], filter: [(_: any) => _ === 42], filteredFilter: [(_: any) => _ === 42], sourceKey: [, , "SOURCE_KEY"], sourceKey2: [, (_: any) => "mapped" + _, "SOURCE_KEY2"], mapperOnly: (_: any) => _ + "Only", filteredMapperOnly: (_: any) => _ + "Only", }; expect(take(input, instructions)).toEqual(output); }); it("should allow a filter function or value", () => { const input = { a: 1, b: 1, c: 1, d: 1, e: 1, f: 1, } as const; const output = { a: 1, b: 1, e: 1, } as const; const instructions: SourceMappingInstructions = { a: [true], b: [1], c: [false, () => 1], d: [0, () => 1], e: [(_: any) => _ == 1], f: [(_: any) => _ == 2], }; expect(take(input, instructions)).toEqual(output); }); it("should take keys with optional filters and optional mappers", () => { const input = { default: 0, filteredDefault: null, supplier: false, filteredSupplier: undefined, mapper: "y", filteredMapper: void 0, filter: 42, filteredFilter: 43, SOURCE_KEY: "SOURCE_VALUE", SOURCE_KEY2: "SOURCE_VALUE2", mapperOnly: "mapper", filteredMapperOnly: null, } as const; const output = { default: 0, supplier: "x", mapper: "yx", filter: 42, sourceKey: "SOURCE_VALUE", sourceKey2: "mappedSOURCE_VALUE2", mapperOnly: "mapperOnly", } as const; const instructions: SourceMappingInstructions = { default: [], filteredDefault: [], supplier: [, () => "x"], filteredSupplier: [, () => "x"], mapper: [, (_: any) => _ + "x"], filteredMapper: [, (_: any) => _ + "x"], filter: [(_: any) => _ === 42], filteredFilter: [(_: any) => _ === 42], sourceKey: [, , "SOURCE_KEY"], sourceKey2: [, (_: any) => "mapped" + _, "SOURCE_KEY2"], mapperOnly: (_: any) => _ + "Only", filteredMapperOnly: (_: any) => _ + "Only", }; expect(take(input, instructions)).toEqual(output); }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/object-mapping.ts ================================================ /** * A set of instructions for multiple keys. * The aim is to provide a concise yet readable way to map and filter values * onto a target object. * * @example * ```javascript * const example: ObjectMappingInstructions = { * lazyValue1: [, () => 1], * lazyValue2: [, () => 2], * lazyValue3: [, () => 3], * lazyConditionalValue1: [() => true, () => 4], * lazyConditionalValue2: [() => true, () => 5], * lazyConditionalValue3: [true, () => 6], * lazyConditionalValue4: [false, () => 44], * lazyConditionalValue5: [() => false, () => 55], * lazyConditionalValue6: ["", () => 66], * simpleValue1: [, 7], * simpleValue2: [, 8], * simpleValue3: [, 9], * conditionalValue1: [() => true, 10], * conditionalValue2: [() => true, 11], * conditionalValue3: [{}, 12], * conditionalValue4: [false, 110], * conditionalValue5: [() => false, 121], * conditionalValue6: ["", 132], * }; * * const exampleResult: Record = { * lazyValue1: 1, * lazyValue2: 2, * lazyValue3: 3, * lazyConditionalValue1: 4, * lazyConditionalValue2: 5, * lazyConditionalValue3: 6, * simpleValue1: 7, * simpleValue2: 8, * simpleValue3: 9, * conditionalValue1: 10, * conditionalValue2: 11, * conditionalValue3: 12, * }; * ``` * * @internal */ export type ObjectMappingInstructions = Record; /** * A variant of the object mapping instruction for the `take` function. * In this case, the source value is provided to the value function, turning it * from a supplier into a mapper. * * @internal */ export type SourceMappingInstructions = Record; /** * An instruction set for assigning a value to a target object. * * @internal */ export type ObjectMappingInstruction = | LazyValueInstruction | ConditionalLazyValueInstruction | SimpleValueInstruction | ConditionalValueInstruction | UnfilteredValue; /** * non-array * * @internal */ export type UnfilteredValue = any; /** * @internal */ export type LazyValueInstruction = [FilterStatus, ValueSupplier]; /** * @internal */ export type ConditionalLazyValueInstruction = [FilterStatusSupplier, ValueSupplier]; /** * @internal */ export type SimpleValueInstruction = [FilterStatus, Value]; /** * @internal */ export type ConditionalValueInstruction = [ValueFilteringFunction, Value]; /** * @internal */ export type SourceMappingInstruction = [(ValueFilteringFunction | FilterStatus)?, ValueMapper?, string?]; /** * Filter is considered passed if * 1. It is a boolean true. * 2. It is not undefined and is itself truthy. * 3. It is undefined and the corresponding _value_ is neither null nor undefined. * * @internal */ export type FilterStatus = boolean | unknown | void; /** * Supplies the filter check but not against any value as input. * * @internal */ export type FilterStatusSupplier = () => boolean; /** * Filter check with the given value. * * @internal */ export type ValueFilteringFunction = (value: any) => boolean; /** * Supplies the value for lazy evaluation. * * @internal */ export type ValueSupplier = () => any; /** * A function that maps the source value to the target value. * Defaults to pass-through with nullish check. * * @internal */ export type ValueMapper = (value: any) => any; /** * A non-function value. * * @internal */ export type Value = any; /** * Internal/Private, for codegen use only. * * Transfer a set of keys from [instructions] to [target]. * * For each instruction in the record, the target key will be the instruction key. * The target assignment will be conditional on the instruction's filter. * The target assigned value will be supplied by the instructions as an evaluable function or non-function value. * * @see ObjectMappingInstructions for an example. * * @internal */ export function map( target: any, filter: (value: any) => boolean, instructions: Record ): typeof target; /** * @internal */ export function map(instructions: ObjectMappingInstructions): any; /** * @internal */ export function map(target: any, instructions: ObjectMappingInstructions): typeof target; /** * @internal */ export function map(arg0: any, arg1?: any, arg2?: any): any { let target: any; let filter: (value?: any) => boolean; let instructions: ObjectMappingInstructions; if (typeof arg1 === "undefined" && typeof arg2 === "undefined") { target = {}; instructions = arg0; } else { target = arg0; if (typeof arg1 === "function") { filter = arg1; instructions = arg2; return mapWithFilter(target, filter, instructions); } else { instructions = arg1; } } for (const key of Object.keys(instructions)) { if (!Array.isArray(instructions[key])) { target[key] = instructions[key]; // unchecked value. continue; } applyInstruction(target, null, instructions, key); } return target; } /** * Convert a regular object `{ k: v }` to `{ k: [, v] }` mapping instruction set with default * filter. * * @internal */ export const convertMap = (target: any): Record => { const output: Record = {}; for (const [k, v] of Object.entries(target || {})) { output[k] = [, v]; } return output; }; /** * @param source - original object with data. * @param instructions - how to map the data. * @returns new object mapped from the source object. * @internal */ export const take = (source: any, instructions: SourceMappingInstructions): any => { const out = {}; for (const key in instructions) { applyInstruction(out, source, instructions, key); } return out; }; /** * Private, for codegen use only. * * @param target - target object. * @param filter - uniform filter function to apply to all values * @param instructions - map of keys and values/suppliers (will be evaluated) * * @internal */ const mapWithFilter = ( target: any, filter: (value: any) => boolean, instructions: Record ): typeof target => { return map( target, Object.entries(instructions).reduce( ( _instructions: ObjectMappingInstructions, [key, value]: [string, ValueSupplier | Value | ObjectMappingInstruction] ) => { if (Array.isArray(value)) { // is custom instruction and not a value or value supplier _instructions[key] = value as ObjectMappingInstruction; } else { if (typeof value === "function") { _instructions[key] = [filter, value()]; } else { _instructions[key] = [filter, value]; } } return _instructions; }, {} ) ); }; /** * Applies a single instruction at the given key from source to target. * * @internal */ const applyInstruction = ( target: any, source: null | any, instructions: ObjectMappingInstructions | Record, targetKey: string ): void => { if (source !== null) { let instruction = instructions[targetKey]; if (typeof instruction === "function") { instruction = [, instruction]; } const [filter = nonNullish, valueFn = pass, sourceKey = targetKey] = instruction; if ((typeof filter === "function" && filter(source[sourceKey])) || (typeof filter !== "function" && !!filter)) { target[targetKey] = valueFn(source[sourceKey]); } return; } // eslint-disable-next-line prefer-const let [filter, value]: [((_?: any) => boolean) | unknown, any] = instructions[targetKey]; if (typeof value === "function") { let _value: any; const defaultFilterPassed = filter === undefined && (_value = value()) != null; const customFilterPassed = (typeof filter === "function" && !!filter(void 0)) || (typeof filter !== "function" && !!filter); if (defaultFilterPassed) { target[targetKey] = _value; } else if (customFilterPassed) { target[targetKey] = value(); } } else { const defaultFilterPassed = filter === undefined && value != null; const customFilterPassed = (typeof filter === "function" && !!filter(value)) || (typeof filter !== "function" && !!filter); if (defaultFilterPassed || customFilterPassed) { target[targetKey] = value; } } }; /** * internal */ const nonNullish = (_: any) => _ != null; /** * internal */ const pass = (_: any) => _; ================================================ FILE: packages/core/src/submodules/client/smithy-client/schemaLogFilter.spec.ts ================================================ import type { BooleanSchema, NumericSchema, StaticSimpleSchema, StaticStructureSchema, StringSchema, } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { schemaLogFilter } from "./schemaLogFilter"; describe(schemaLogFilter.name, () => { it("should filter sensitive trait-marked fields", () => { const sensitiveString: StaticSimpleSchema = [0, "ns", "SensitiveString", { sensitive: 1 }, 0]; const schema: StaticStructureSchema = [ 3, "ns", "Struct", 0, ["a", "b", "sensitive", "nestedSensitive", "various"], [ 0 satisfies StringSchema, 0 satisfies StringSchema, sensitiveString, [3, "ns", "NestedSensitiveStruct", 0, ["sensitive"], [sensitiveString]], [ 3, "ns", "Various", 0, ["boolean", "number", "struct", "list-s", "list", "map-s", "map"], [ [0, "ns", "Boolean", { sensitive: 1 }, 2 satisfies BooleanSchema], [0, "ns", "Numeric", { sensitive: 1 }, 1 satisfies NumericSchema], [3, "ns", "SensitiveStruct", { sensitive: 1 }, [], []], [1, "ns", "List", 0, sensitiveString], [1, "ns", "List", 0, 0 satisfies StringSchema], [2, "ns", "Map", 0, sensitiveString, 0 satisfies StringSchema], [2, "ns", "Map", 0, 0 satisfies StringSchema, 0 satisfies StringSchema], ], ], ], ]; expect( schemaLogFilter(schema, { a: "a", b: "b", sensitive: "xyz", nestedSensitive: { sensitive: "xyz", }, various: { boolean: false, number: 1, struct: { q: "rf", }, "list-s": [1, 2, 3], list: [4, 5, 6], "map-s": { a: "a", b: "b", c: "c", }, map: { a: "d", b: "e", c: "f", }, }, }) ).toEqual({ a: "a", b: "b", sensitive: "***SensitiveInformation***", nestedSensitive: { sensitive: "***SensitiveInformation***", }, various: { boolean: "***SensitiveInformation***", number: "***SensitiveInformation***", struct: "***SensitiveInformation***", "list-s": "***SensitiveInformation***", list: [4, 5, 6], "map-s": "***SensitiveInformation***", map: { a: "d", b: "e", c: "f", }, }, }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/schemaLogFilter.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import type { SchemaRef } from "@smithy/types"; const SENSITIVE_STRING = "***SensitiveInformation***"; /** * Redacts sensitive parts of any data object using its schema, for logging. * * @internal * @param schema - with filtering traits. * @param data - to be logged. */ export function schemaLogFilter(schema: SchemaRef, data: unknown): any { if (data == null) { return data; } const ns = NormalizedSchema.of(schema); if (ns.getMergedTraits().sensitive) { return SENSITIVE_STRING; } if (ns.isListSchema()) { const isSensitive = !!ns.getValueSchema().getMergedTraits().sensitive; if (isSensitive) { return SENSITIVE_STRING; } } else if (ns.isMapSchema()) { const isSensitive = !!ns.getKeySchema().getMergedTraits().sensitive || !!ns.getValueSchema().getMergedTraits().sensitive; if (isSensitive) { return SENSITIVE_STRING; } } else if (ns.isStructSchema() && typeof data === "object") { const object = data as Record; const newObject = {} as any; for (const [member, memberNs] of ns.structIterator()) { if (object[member] != null) { newObject[member] = schemaLogFilter(memberNs, object[member]); } } return newObject; } return data; } ================================================ FILE: packages/core/src/submodules/client/smithy-client/ser-utils.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { serializeDateTime, serializeFloat } from "./ser-utils"; describe("serializeFloat", () => { it("handles non-numerics", () => { expect(serializeFloat(NaN)).toEqual("NaN"); expect(serializeFloat(Infinity)).toEqual("Infinity"); expect(serializeFloat(-Infinity)).toEqual("-Infinity"); }); it("handles normal numbers", () => { expect(serializeFloat(1)).toEqual(1); expect(serializeFloat(1.1)).toEqual(1.1); }); }); describe("serializeDateTime", () => { it("should truncate at the top of the second", () => { const date = new Date(1716476757761); date.setMilliseconds(0); expect(serializeDateTime(date)).toEqual("2024-05-23T15:05:57Z"); }); it("should not truncate in general", () => { const date = new Date(1716476757761); expect(serializeDateTime(date)).toEqual("2024-05-23T15:05:57.761Z"); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/ser-utils.ts ================================================ /** * Serializes a number, turning non-numeric values into strings. * * @internal * @param value - The number to serialize. * @returns A number, or a string if the given number was non-numeric. */ export const serializeFloat = (value: number): string | number => { // NaN is not equal to everything, including itself. if (value !== value) { return "NaN"; } switch (value) { case Infinity: return "Infinity"; case -Infinity: return "-Infinity"; default: return value; } }; /** * @internal * @param date - to be serialized. * @returns https://smithy.io/2.0/spec/protocol-traits.html#timestampformat-trait date-time format. */ export const serializeDateTime = (date: Date): string => date.toISOString().replace(".000Z", "Z"); ================================================ FILE: packages/core/src/submodules/client/smithy-client/serde-json.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { _json } from "./serde-json"; describe(_json.name, () => { it("removes nullish entries", () => { expect( _json({ g: void 0, a: { e: void 0, b: { c: { f: void 0, }, d: void 0, }, }, }) ).toEqual({ a: { b: { c: {}, }, }, }); }); it("filters sparse lists", () => { expect( _json({ a: { b: 5, c: [, , , 6], }, }) ).toEqual({ a: { b: 5, c: [6] }, }); }); it("recursively removes nullish entries in arrays", () => { expect( _json({ a: { b: 5, c: [, , { a: 5, b: 6, c: null, d: undefined }, 6], }, }) ).toEqual({ a: { b: 5, c: [{ a: 5, b: 6 }, 6] }, }); }); }); ================================================ FILE: packages/core/src/submodules/client/smithy-client/serde-json.ts ================================================ /** * Maps an object through the default JSON serde behavior. * This means removing nullish fields and un-sparsifying lists. * This is also used by Smithy RPCv2 CBOR as the default serde behavior. * * @internal * @param obj - to be checked. * @returns same object with default serde behavior applied. */ export const _json = (obj: any): any => { if (obj == null) { return {}; } if (Array.isArray(obj)) { return obj.filter((_: any) => _ != null).map(_json); } if (typeof obj === "object") { const target: any = {}; for (const key of Object.keys(obj)) { if (obj[key] == null) { continue; } target[key] = _json(obj[key]); } return target; } return obj; }; ================================================ FILE: packages/core/src/submodules/client/util-middleware/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/client`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.9 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.8 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.7 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.6 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.5 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.4 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.3 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.2 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.1 ### Patch Changes - e6ea6bd5: move devDeps into deps - 5b6fa539: Add `getSmithyContext()` helper function - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-middleware](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-middleware/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/client/util-middleware/getSmithyContext.ts ================================================ import { SMITHY_CONTEXT_KEY, type HandlerExecutionContext } from "@smithy/types"; /** * @internal */ export const getSmithyContext = (context: HandlerExecutionContext): Record => context[SMITHY_CONTEXT_KEY] || (context[SMITHY_CONTEXT_KEY] = {}); ================================================ FILE: packages/core/src/submodules/client/util-middleware/normalizeProvider.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { normalizeProvider } from "./normalizeProvider"; describe(normalizeProvider.name, () => { const testCases = [ true, // boolean null, // null undefined, // undefined 1, // number "", // string {}, // object ]; it.each(testCases)("returns Provider if value is not a function: %s", async (value) => { const output = normalizeProvider(value); expect(await output()).toEqual(value); }); it.each(testCases)("returns Provider if value if a function which returns %s", (value) => { const mockValueProvider = () => Promise.resolve(value); expect(normalizeProvider(mockValueProvider)).toBe(mockValueProvider); }); }); ================================================ FILE: packages/core/src/submodules/client/util-middleware/normalizeProvider.ts ================================================ import type { Provider } from "@smithy/types"; /** * @internal * * @returns a provider function for the input value if it isn't already one. */ export const normalizeProvider = (input: T | Provider): Provider => { if (typeof input === "function") return input as Provider; const promisified = Promise.resolve(input); return () => promisified; }; ================================================ FILE: packages/core/src/submodules/client/util-waiter/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/client`. ## 4.3.0 ### Minor Changes - c1395f1: emit warning from waiter polling when repeated 403s are encountered - ed851e7: add type information to WaiterResult reason ## 4.2.16 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.15 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.14 ### Patch Changes - ce7e05f: Move `@smithy/abort-controller` to devDeps ## 4.2.13 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/abort-controller@4.2.12 ## 4.2.12 ### Patch Changes - f784187: fix(util-waiter): add optional chaining for `$response?.statusCode` in `createMessageFromResponse` to prevent TypeError when `$response` is undefined but `message` is present. ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/abort-controller@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/abort-controller@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/abort-controller@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/abort-controller@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/abort-controller@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/abort-controller@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/abort-controller@4.2.5 ## 4.2.4 ### Patch Changes - 75177cd: handle circular refs in debug messages - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/abort-controller@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/abort-controller@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/abort-controller@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/abort-controller@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/abort-controller@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/abort-controller@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/abort-controller@4.1.0 - @smithy/types@4.4.0 ## 4.0.7 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/abort-controller@4.0.5 ## 4.0.6 ### Patch Changes - a197074: clean up waiters' abort signal listener ## 4.0.5 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/abort-controller@4.0.4 ## 4.0.4 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/abort-controller@4.0.3 ## 4.0.3 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/abort-controller@4.0.2 ## 4.0.2 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/abort-controller@4.0.1 ## 4.0.1 ### Patch Changes - a147146: fix range validation in waiters ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/abort-controller@4.0.0 - @smithy/types@4.0.0 ## 3.2.0 ### Minor Changes - 8950c05: record observed responses in waiter results ## 3.1.10 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/abort-controller@3.1.9 ## 3.1.9 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/abort-controller@3.1.8 ## 3.1.8 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/abort-controller@3.1.7 ## 3.1.7 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/abort-controller@3.1.6 ## 3.1.6 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/abort-controller@3.1.5 ## 3.1.5 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/abort-controller@3.1.4 ## 3.1.4 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/abort-controller@3.1.3 ## 3.1.3 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/abort-controller@3.1.2 ## 3.1.2 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/abort-controller@3.1.1 ## 3.1.1 ### Patch Changes - 1d11480: Return stringified result object in case of failure ## 3.1.0 ### Minor Changes - c2a5595: use platform AbortController|AbortSignal implementations ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/abort-controller@3.1.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/abort-controller@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/abort-controller@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/abort-controller@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/abort-controller@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/abort-controller@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/abort-controller@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/abort-controller@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/abort-controller@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/abort-controller@2.0.16 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/abort-controller@2.0.15 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/abort-controller@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/abort-controller@2.0.13 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/abort-controller@2.0.12 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/abort-controller@2.0.11 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/abort-controller@2.0.10 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/abort-controller@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/abort-controller@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/abort-controller@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/abort-controller@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/abort-controller@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/abort-controller@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/abort-controller@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/abort-controller@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/abort-controller@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/abort-controller@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/abort-controller@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/abort-controller@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/abort-controller@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/abort-controller@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-waiter](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-waiter/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/client/util-waiter/circular-reference-bug.spec.ts ================================================ /** * Regression test for https://github.com/aws/aws-sdk-js-v3/issues/7459 * * When a waiter receives a response/error containing circular references * (e.g. Node.js IncomingMessage with req/res cycle), JSON.stringify should * not throw "Converting circular structure to JSON". */ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { runPolling } from "./poller"; import { sleep } from "./utils/sleep"; import { WaiterState, checkExceptions, type WaiterOptions, type WaiterResult } from "./waiter"; vi.mock("./utils/sleep"); /** * Creates a mock object that mimics the circular reference structure * of a Node.js IncomingMessage/ClientRequest pair, which is the exact * structure reported in the issue. */ function createCircularHttpResponse() { const incomingMessage: any = { constructor: { name: "IncomingMessage" }, statusCode: 403, headers: { "content-type": "application/json" }, }; const clientRequest: any = { constructor: { name: "ClientRequest" }, method: "POST", path: "/", }; incomingMessage.req = clientRequest; clientRequest.res = incomingMessage; return incomingMessage; } describe("GitHub Issue #7459: circular structure in waiter results", () => { const config: WaiterOptions = { minDelay: 2, maxDelay: 30, maxWaitTime: 99999, client: "mockClient", }; describe("checkExceptions", () => { it("should not throw TypeError for FAILURE result with circular reason", () => { const result: WaiterResult = { state: WaiterState.FAILURE, reason: createCircularHttpResponse(), }; expect(() => checkExceptions(result)).toThrow(); try { checkExceptions(result); } catch (e: any) { expect(e).toBeInstanceOf(Error); expect(e.message).not.toContain("Converting circular structure to JSON"); expect(e.message).toContain("[Circular]"); } }); }); describe("runPolling", () => { beforeEach(() => { vi.mocked(sleep).mockResolvedValue(""); }); afterEach(() => { vi.clearAllMocks(); }); it("should handle circular reason from acceptorChecks", async () => { const circularResponse = createCircularHttpResponse(); const mockAcceptorChecks = vi.fn().mockResolvedValueOnce({ state: WaiterState.FAILURE, reason: circularResponse, }); const result = await runPolling(config, "input", mockAcceptorChecks); expect(result.state).toBe(WaiterState.FAILURE); expect(result.reason).toBe(circularResponse); const keys = Object.keys(result.observedResponses!); expect(keys.length).toBe(1); expect(keys[0]).not.toContain("Converting circular structure"); }); it("should handle reason with $metadata and message but no $response", async () => { const mockAcceptorChecks = vi.fn().mockResolvedValueOnce({ state: WaiterState.FAILURE, reason: { message: "User is not authorized to perform acm-pca:IssueCertificate", $metadata: { httpStatusCode: 403 }, }, }); const result = await runPolling(config, "input", mockAcceptorChecks); expect(result.state).toBe(WaiterState.FAILURE); const keys = Object.keys(result.observedResponses!); expect(keys.length).toBe(1); expect(keys[0]).toContain("403"); expect(keys[0]).toContain("not authorized"); }); }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/circularReplacer.spec.ts ================================================ import { describe, expect, it } from "vitest"; import { getCircularReplacer } from "./circularReplacer"; describe("getCircularReplacer", () => { it("should handle nested circular references", () => { const x = { a: 1, b: 2, c: { d: { e: -1, f: 3, g: { h: -1, }, }, }, } as any; x.c.d.e = x; x.c.d.g.h = x; expect( JSON.parse( JSON.stringify( { x, }, getCircularReplacer() ) ) ).toEqual({ x: { a: 1, b: 2, c: { d: { e: "[Circular]", f: 3, g: { h: "[Circular]", }, }, }, }, }); }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/circularReplacer.ts ================================================ /** * Helper for JSON stringification debug logging. * * @internal */ export const getCircularReplacer = () => { const seen = new WeakSet(); return (key: any, value: any) => { if (typeof value === "object" && value !== null) { if (seen.has(value)) { return "[Circular]"; } seen.add(value); } return value; }; }; ================================================ FILE: packages/core/src/submodules/client/util-waiter/createWaiter.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { createWaiter } from "./createWaiter"; import { WaiterState, type WaiterOptions } from "./waiter"; vi.mock("./utils/validate", () => ({ validateWaiterOptions: vi.fn(), })); describe("createWaiter", () => { beforeEach(() => { vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); }); const minimalWaiterConfig = { minDelay: 2, maxDelay: 120, maxWaitTime: 9999, client: "client", } as WaiterOptions; const input = "input"; const abortedState = { state: WaiterState.ABORTED, }; const failureState = { state: WaiterState.FAILURE, }; const retryState = { state: WaiterState.RETRY, }; const successState = { state: WaiterState.SUCCESS, }; it("should abort when abortController is signalled", async () => { const abortController = new AbortController(); const mockAcceptorChecks = vi.fn().mockResolvedValue(retryState); const statusPromise = createWaiter( { ...minimalWaiterConfig, maxWaitTime: 20, abortController, }, input, mockAcceptorChecks ); vi.advanceTimersByTime(10 * 1000); abortController.abort(); // Abort before maxWaitTime(20s); expect(await statusPromise).toMatchObject(abortedState); }); it("should remove the event listener on the abort signal after the waiter resolves regardless of whether it has been invoked", async () => { const abortController = new AbortController(); vi.spyOn(abortController.signal, "addEventListener"); vi.spyOn(abortController.signal, "removeEventListener"); const mockAcceptorChecks = vi.fn().mockResolvedValue(successState); const statusPromise = createWaiter( { ...minimalWaiterConfig, abortSignal: abortController.signal, maxWaitTime: 20, }, input, mockAcceptorChecks ); expect(abortController.signal.addEventListener).toHaveBeenCalledOnce(); vi.advanceTimersByTime(minimalWaiterConfig.minDelay * 1000); expect(await statusPromise).toMatchObject(successState); expect(abortController.signal.removeEventListener).toHaveBeenCalledOnce(); }); it("should succeed when acceptor checker returns success", async () => { const mockAcceptorChecks = vi.fn().mockResolvedValue(successState); const statusPromise = createWaiter( { ...minimalWaiterConfig, maxWaitTime: 20, }, input, mockAcceptorChecks ); vi.advanceTimersByTime(minimalWaiterConfig.minDelay * 1000); expect(await statusPromise).toMatchObject(successState); }); it("should fail when acceptor checker returns failure", async () => { const mockAcceptorChecks = vi.fn().mockResolvedValue(failureState); const statusPromise = createWaiter( { ...minimalWaiterConfig, maxWaitTime: 20, }, input, mockAcceptorChecks ); vi.advanceTimersByTime(minimalWaiterConfig.minDelay * 1000); expect(await statusPromise).toMatchObject(failureState); }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/createWaiter.ts ================================================ import type { AbortSignal as DeprecatedAbortSignal } from "@smithy/types"; import { runPolling } from "./poller"; import { validateWaiterOptions } from "./utils/validate"; import { WaiterState, waiterServiceDefaults, type WaiterOptions, type WaiterResult } from "./waiter"; const abortTimeout = ( abortSignal: AbortSignal | DeprecatedAbortSignal ): { clearListener: () => void; aborted: Promise>; } => { let onAbort: () => void; const promise = new Promise>((resolve) => { onAbort = () => resolve({ state: WaiterState.ABORTED }); if (typeof (abortSignal as AbortSignal).addEventListener === "function") { // preferred. (abortSignal as AbortSignal).addEventListener("abort", onAbort); } else { // backwards compatibility abortSignal.onabort = onAbort; } }); return { clearListener() { if (typeof (abortSignal as AbortSignal).removeEventListener === "function") { (abortSignal as AbortSignal).removeEventListener("abort", onAbort); } }, aborted: promise, }; }; /** * Create a waiter promise that only resolves when: * 1. Abort controller is signaled * 2. Max wait time is reached * 3. `acceptorChecks` succeeds, or fails * Otherwise, it invokes `acceptorChecks` with exponential-backoff delay. * * @internal */ export const createWaiter = async ( options: WaiterOptions, input: Input, acceptorChecks: (client: Client, input: Input) => Promise> ): Promise> => { const params = { ...waiterServiceDefaults, ...options, }; validateWaiterOptions(params); const exitConditions = [runPolling(params, input, acceptorChecks)]; const finalize = [] as Array<() => void>; if (options.abortSignal) { const { aborted, clearListener } = abortTimeout(options.abortSignal); finalize.push(clearListener); exitConditions.push(aborted); } if (options.abortController?.signal) { const { aborted, clearListener } = abortTimeout(options.abortController.signal); finalize.push(clearListener); exitConditions.push(aborted); } return Promise.race>(exitConditions).then((result) => { for (const fn of finalize) { fn(); } return result; }); }; ================================================ FILE: packages/core/src/submodules/client/util-waiter/poller.spec.ts ================================================ import { AbortController as AbortControllerPolyfill } from "@smithy/abort-controller"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { runPolling } from "./poller"; import { sleep } from "./utils/sleep"; import { WaiterState, type WaiterOptions } from "./waiter"; vi.mock("./utils/sleep"); describe(runPolling.name, () => { const config = { minDelay: 2, maxDelay: 30, maxWaitTime: 99999, client: "mockClient", } as WaiterOptions; const input = "mockInput"; const abortedState = { state: WaiterState.ABORTED, observedResponses: { "AbortController signal aborted.": 1, }, }; const failureState = { state: WaiterState.FAILURE, reason: { mockedReason: "some-failure-value", }, final: { mockedReason: "some-failure-value", }, observedResponses: { [JSON.stringify({ mockedReason: "some-failure-value", })]: 1, }, }; const successState = { state: WaiterState.SUCCESS, reason: { mockedReason: "some-success-value", }, final: { mockedReason: "some-success-value", }, observedResponses: { [JSON.stringify({ mockedReason: "some-success-value", })]: 1, }, }; const retryState = { state: WaiterState.RETRY, reason: undefined, observedResponses: {}, }; const timeoutState = { state: WaiterState.TIMEOUT, observedResponses: {}, }; let mockAcceptorChecks; beforeEach(() => { vi.mocked(sleep).mockResolvedValueOnce(""); vi.spyOn(global.Math, "random").mockReturnValue(0.5); }); afterEach(() => { vi.clearAllMocks(); vi.spyOn(global.Math, "random").mockRestore(); }); it("should returns state and reason in case of failure", async () => { mockAcceptorChecks = vi.fn().mockResolvedValueOnce(failureState); await expect(runPolling(config, input, mockAcceptorChecks)).resolves.toStrictEqual(failureState); expect(mockAcceptorChecks).toHaveBeenCalled(); expect(mockAcceptorChecks).toHaveBeenCalledTimes(1); expect(mockAcceptorChecks).toHaveBeenCalledWith(config.client, input); expect(sleep).toHaveBeenCalledTimes(0); }); it("returns state and reason in case of success", async () => { mockAcceptorChecks = vi.fn().mockResolvedValueOnce(successState); await expect(runPolling(config, input, mockAcceptorChecks)).resolves.toStrictEqual(successState); expect(mockAcceptorChecks).toHaveBeenCalled(); expect(mockAcceptorChecks).toHaveBeenCalledTimes(1); expect(mockAcceptorChecks).toHaveBeenCalledWith(config.client, input); expect(sleep).toHaveBeenCalledTimes(0); }); it("sleeps as per exponentialBackoff in case of retry", async () => { mockAcceptorChecks = vi .fn() .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(retryState) .mockResolvedValueOnce(successState); await expect(runPolling(config, input, mockAcceptorChecks)).resolves.toStrictEqual(successState); expect(sleep).toHaveBeenCalled(); expect(mockAcceptorChecks).toHaveBeenCalledTimes(8); expect(sleep).toHaveBeenCalledTimes(7); expect(sleep).toHaveBeenNthCalledWith(1, 2); // min delay expect(sleep).toHaveBeenNthCalledWith(2, 3); // random(2, 4) expect(sleep).toHaveBeenNthCalledWith(3, 5); // random(2, 8) expect(sleep).toHaveBeenNthCalledWith(4, 9); // random(2, 16) expect(sleep).toHaveBeenNthCalledWith(5, 30); // past attemptCeiling, maxDelay expect(sleep).toHaveBeenNthCalledWith(6, 30); // past attemptCeiling expect(sleep).toHaveBeenNthCalledWith(7, 30); // past attemptCeiling }); it("resolves after the last attempt before reaching maxWaitTime ", async () => { let now = Date.now(); const delay = 2; const nowMock = vi .spyOn(Date, "now") .mockReturnValueOnce(now) // 1st invoke for getting the time stamp to wait until .mockImplementation(() => { const rtn = now; now += delay * 1000; return rtn; }); const localConfig = { ...config, minDelay: delay, maxDelay: delay, maxWaitTime: 5, }; mockAcceptorChecks = vi.fn().mockResolvedValue(retryState); await expect(runPolling(localConfig, input, mockAcceptorChecks)).resolves.toStrictEqual(timeoutState); nowMock.mockReset(); }); it.each([ { label: "native", AbortController }, { label: "smithy", AbortController: AbortControllerPolyfill }, ])("resolves when abortController is signalled ($label)", async ({ AbortController }) => { const abortController = new AbortController(); const localConfig = { ...config, abortController, }; mockAcceptorChecks = vi.fn().mockResolvedValue(retryState); abortController.abort(); await expect(runPolling(localConfig, input, mockAcceptorChecks)).resolves.toStrictEqual(abortedState); expect(sleep).not.toHaveBeenCalled(); }); it("should populate 'final' alongside 'reason' on non-retry results", async () => { const reason = { code: "ResourceReady" }; mockAcceptorChecks = vi.fn().mockResolvedValueOnce({ state: WaiterState.SUCCESS, reason }); const result = await runPolling(config, input, mockAcceptorChecks); expect(result.final).toStrictEqual(reason); expect(result.reason).toStrictEqual(reason); }); it("should populate 'final' after retries resolve to a terminal state", async () => { const reason = { code: "InstanceRunning" }; mockAcceptorChecks = vi .fn() .mockResolvedValueOnce(retryState) .mockResolvedValueOnce({ state: WaiterState.SUCCESS, reason }); const result = await runPolling(config, input, mockAcceptorChecks); expect(result.final).toStrictEqual(reason); expect(result.reason).toStrictEqual(reason); }); it("should not populate 'final' on timeout", async () => { let now = Date.now(); const delay = 2; const nowMock = vi .spyOn(Date, "now") .mockReturnValueOnce(now) .mockImplementation(() => { const rtn = now; now += delay * 1000; return rtn; }); const localConfig = { ...config, minDelay: delay, maxDelay: delay, maxWaitTime: 5, }; mockAcceptorChecks = vi.fn().mockResolvedValue(retryState); const result = await runPolling(localConfig, input, mockAcceptorChecks); expect(result.state).toBe(WaiterState.TIMEOUT); expect(result.final).toBeUndefined(); nowMock.mockReset(); }); it("should warn when polling exceeds 60s and 403s are observed", async () => { const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); const reason403 = { $metadata: { httpStatusCode: 403 }, message: "Forbidden" }; const retryWith403 = { state: WaiterState.RETRY, reason: reason403 }; // Simulate time: start at T=0, each Date.now() call advances 20s. // This ensures we cross the 60s warn403Time threshold after a few polls. let now = 1_000_000; const nowMock = vi .spyOn(Date, "now") .mockReturnValueOnce(now) // waitUntil .mockImplementation(() => { const rtn = now; now += 20_000; return rtn; }); const localConfig = { ...config, minDelay: 2, maxDelay: 2, maxWaitTime: 300, client: { config: {} }, } as WaiterOptions; mockAcceptorChecks = vi .fn() .mockResolvedValueOnce(retryWith403) // initial check .mockResolvedValueOnce(retryWith403) // poll 1 .mockResolvedValueOnce(retryWith403) // poll 2 .mockResolvedValueOnce(retryWith403) // poll 3 .mockResolvedValueOnce({ state: WaiterState.SUCCESS, reason: { $metadata: { httpStatusCode: 200 } } }); await runPolling(localConfig, input, mockAcceptorChecks); expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("403 status code encountered during waiter polling")); warnSpy.mockRestore(); nowMock.mockReset(); }); it("should not warn or throw when polling exceeds 60s without observed responses", async () => { const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); // Simulate time: start at T=0, each Date.now() call advances 20s. // This ensures we cross the 60s warn403Time threshold after a few polls. let now = 1_000_000; const nowMock = vi .spyOn(Date, "now") .mockReturnValueOnce(now) // waitUntil .mockImplementation(() => { const rtn = now; now += 20_000; return rtn; }); const localConfig = { ...config, minDelay: 2, maxDelay: 2, maxWaitTime: 300, client: { config: {} }, } as WaiterOptions; mockAcceptorChecks = vi .fn() .mockResolvedValueOnce(retryState) // initial check .mockResolvedValueOnce(retryState) // poll 1 .mockResolvedValueOnce(retryState) // poll 2 .mockResolvedValueOnce({ state: WaiterState.SUCCESS, reason: { $metadata: { httpStatusCode: 200 } } }); await expect(runPolling(localConfig, input, mockAcceptorChecks)).resolves.toMatchObject({ state: WaiterState.SUCCESS, }); expect(warnSpy).not.toHaveBeenCalled(); warnSpy.mockRestore(); nowMock.mockReset(); }); it("should truncate delay to fire a last poll before timeout", async () => { // Use real-ish time: start at T=0, advance 1s per Date.now() call. let now = 1_000_000; const nowMock = vi .spyOn(Date, "now") .mockReturnValueOnce(now) // waitUntil = now + 10_000 .mockImplementation(() => { const rtn = now; now += 1_000; return rtn; }); const localConfig = { ...config, minDelay: 2, maxDelay: 30, maxWaitTime: 10, client: "mockClient", } as WaiterOptions; mockAcceptorChecks = vi .fn() .mockResolvedValueOnce(retryState) // initial check .mockResolvedValue({ state: WaiterState.SUCCESS, reason: { ok: true } }); const result = await runPolling(localConfig, input, mockAcceptorChecks); // The backoff function should have truncated the delay so that // sleep was called with a value less than the normal backoff, // allowing one more poll before timeout. expect(sleep).toHaveBeenCalled(); const sleepArg = vi.mocked(sleep).mock.calls[0][0]; expect(sleepArg).toBeLessThanOrEqual(localConfig.maxDelay); expect(result.state).toBe(WaiterState.SUCCESS); nowMock.mockReset(); }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/poller.ts ================================================ import { getCircularReplacer } from "./circularReplacer"; import { sleep } from "./utils/sleep"; import { WaiterState, type WaiterOptions, type WaiterResult } from "./waiter"; /** * Function that runs polling as part of waiters. This will make one inital attempt and then * subsequent attempts with an increasing delay. * * @param params - options passed to the waiter. * @param client - AWS SDK Client * @param input - client input * @param acceptorChecks - function that checks the acceptor states on each poll. */ export const runPolling = async ( { minDelay, maxDelay, maxWaitTime, abortController, client, abortSignal }: WaiterOptions, input: Input, acceptorChecks: (client: Client, input: Input) => Promise> ): Promise> => { const observedResponses: Record = {}; const [minDelayMs, maxDelayMs] = [minDelay * 1000, maxDelay * 1000]; let currentAttempt = 0; const waitUntil = Date.now() + maxWaitTime * 1000; // warn about 403s if the waiter is still running at this time. const warn403Time = Date.now() + 60_000; let didWarn403 = false; while (true) { if (currentAttempt > 0) { const delayMs = exponentialBackoffWithJitter(minDelayMs, maxDelayMs, currentAttempt, waitUntil); if (abortController?.signal?.aborted || abortSignal?.aborted) { const message = "AbortController signal aborted."; observedResponses[message] |= 0; observedResponses[message] += 1; return { state: WaiterState.ABORTED, observedResponses }; } if (Date.now() + delayMs > waitUntil) { return { state: WaiterState.TIMEOUT, observedResponses }; } await sleep(delayMs / 1_000); } const { state, reason } = await acceptorChecks(client, input); if (reason) { const message = createMessageFromResponse(reason); observedResponses[message] |= 0; observedResponses[message] += 1; } if (state !== WaiterState.RETRY) { return { state, reason, final: reason, observedResponses }; } currentAttempt += 1; if (!didWarn403 && Date.now() >= warn403Time) { checkWarn403(observedResponses, client); didWarn403 = true; } } }; /** * Called after the waiter reaches at least 1 minute of wait time, * checking if the observed responses are predominantly 403s. * * In such a case, warn that 403 was encountered during waiter polling. */ const checkWarn403 = (observedResponses: Record = {}, client: any): void => { const orderedErrors = Object.keys(observedResponses); let maxCount = 0; let count403 = 0; for (const response of orderedErrors) { const n = observedResponses[response] | 0; maxCount = Math.max(n, maxCount); if (response.startsWith("403:")) { count403 += n; } } const clientLogger = client?.config?.logger; const warningLogger = typeof clientLogger?.warn === "function" && !clientLogger.constructor?.name?.includes?.("NoOpLogger") ? clientLogger : console; if (count403 >= 3 || orderedErrors[orderedErrors.length - 1]?.startsWith("403:")) { warningLogger.warn(`@smithy/util-waiter WARN - 403 status code encountered during waiter polling.`); } }; /** * Convert the result of an SDK operation, either an error or response object, to a * readable string. * * @internal */ const createMessageFromResponse = (reason: any): string => { const status = reason?.$response?.statusCode ?? reason?.$metadata?.httpStatusCode; if (reason?.$responseBodyText) { // is a deserialization error. return `${status ? status + ": " : ""}Deserialization error for body: ${reason.$responseBodyText}`; } if (status) { // has a status code. if (reason?.$response || reason?.message) { // is an error object. return `${status ?? "Unknown"}: ${reason?.message}`; } // is an output object. return `${status}: OK`; } // is an unknown object. return String(reason?.message ?? JSON.stringify(reason, getCircularReplacer()) ?? "Unknown"); }; /** * Reference: https://smithy.io/2.0/additional-specs/waiters.html#waiter-retries * * @internal */ const exponentialBackoffWithJitter = (minDelayMs: number, maxDelayMs: number, attempt: number, waitUntil: number) => { const attemptCountCeiling = Math.log(maxDelayMs / minDelayMs) / Math.log(2) + 1; if (attempt > attemptCountCeiling) { return maxDelayMs; } const delay = minDelayMs * 2 ** (attempt - 1); const capped = Math.min(delay, maxDelayMs); const waitFor = randomInRange(minDelayMs, capped); if (Date.now() + waitFor > waitUntil) { const timeRemaining = waitUntil - Date.now(); // fire the last request 500ms before the waiter would time out. return Math.max(0, timeRemaining - 500); } return waitFor; }; const randomInRange = (min: number, max: number) => min + Math.random() * (max - min); ================================================ FILE: packages/core/src/submodules/client/util-waiter/utils/sleep.ts ================================================ /** * @internal */ export const sleep = (seconds: number) => { return new Promise((resolve) => setTimeout(resolve, seconds * 1000)); }; ================================================ FILE: packages/core/src/submodules/client/util-waiter/utils/validate.spec.ts ================================================ import { beforeEach, describe, expect, test as it } from "vitest"; import type { WaiterOptions } from "../waiter"; import { validateWaiterOptions } from "./validate"; describe(validateWaiterOptions.name, () => { let waiterOptions: WaiterOptions; beforeEach(() => { waiterOptions = { maxWaitTime: 120, minDelay: 20, maxDelay: 1200, client: "client", }; }); it("should not throw an error when maxDelay is proper", () => { waiterOptions.maxDelay = 300; waiterOptions.minDelay = 200; waiterOptions.maxWaitTime = 250; try { validateWaiterOptions(waiterOptions); } catch (e) { expect(e).toBe("SHOULD NOT ERROR HERE"); } }); it("should not throw an error when maxDelay is less than minDelay", () => { waiterOptions.maxDelay = 120; waiterOptions.minDelay = 200; waiterOptions.maxWaitTime = 250; try { validateWaiterOptions(waiterOptions); expect(1).toBe("SHOULD NOT GET HERE"); } catch (e) { expect(e.toString()).toBe( "Error: WaiterConfiguration.maxDelay [120] must be greater than WaiterConfiguration.minDelay [200] for this waiter" ); } }); it("should not throw an error when maxWaitTime is proper", () => { waiterOptions.maxWaitTime = 300; waiterOptions.minDelay = 200; try { validateWaiterOptions(waiterOptions); } catch (e) { expect(e).toBe("SHOULD NOT ERROR HERE"); } }); it("should not throw an error with small decimal numbers", () => { waiterOptions.maxWaitTime = 0.5; waiterOptions.minDelay = 0.0001; waiterOptions.maxDelay = 0.4; validateWaiterOptions(waiterOptions); }); it("should throw when maxWaitTime is less than 0", () => { waiterOptions.maxWaitTime = -2; waiterOptions.minDelay = -1; try { validateWaiterOptions(waiterOptions); } catch (e) { expect(e.toString()).toBe("Error: WaiterConfiguration.maxWaitTime must be greater than 0"); } }); it("should throw when maxWaitTime is less than minDelay", () => { waiterOptions.maxWaitTime = 150; waiterOptions.minDelay = 200; try { validateWaiterOptions(waiterOptions); } catch (e) { expect(e.toString()).toBe( "Error: WaiterConfiguration.maxWaitTime [150] must be greater than WaiterConfiguration.minDelay [200] for this waiter" ); } }); it("should throw when maxWaitTime is equal tominDelay", () => { waiterOptions.maxWaitTime = 200; waiterOptions.minDelay = 200; try { validateWaiterOptions(waiterOptions); } catch (e) { expect(e.toString()).toBe( "Error: WaiterConfiguration.maxWaitTime [200] must be greater than WaiterConfiguration.minDelay [200] for this waiter" ); } }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/utils/validate.ts ================================================ import type { WaiterOptions } from "../waiter"; /** * Validates that waiter options are passed correctly * * @internal * @param options - a waiter configuration object */ export const validateWaiterOptions = (options: WaiterOptions): void => { if (options.maxWaitTime <= 0) { throw new Error(`WaiterConfiguration.maxWaitTime must be greater than 0`); } else if (options.minDelay <= 0) { throw new Error(`WaiterConfiguration.minDelay must be greater than 0`); } else if (options.maxDelay <= 0) { throw new Error(`WaiterConfiguration.maxDelay must be greater than 0`); } else if (options.maxWaitTime <= options.minDelay) { throw new Error( `WaiterConfiguration.maxWaitTime [${options.maxWaitTime}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter` ); } else if (options.maxDelay < options.minDelay) { throw new Error( `WaiterConfiguration.maxDelay [${options.maxDelay}] must be greater than WaiterConfiguration.minDelay [${options.minDelay}] for this waiter` ); } }; ================================================ FILE: packages/core/src/submodules/client/util-waiter/waiter.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { WaiterState, checkExceptions } from "./waiter"; describe(checkExceptions.name, () => { const reason = "generic reason"; it(`throw AbortError if state is ${WaiterState.ABORTED}`, () => { const result = { state: WaiterState.ABORTED, reason }; expect(() => checkExceptions(result)).toThrowError(JSON.stringify({ ...result, reason: "Request was aborted" })); }); it(`throw TimeoutError if state is ${WaiterState.TIMEOUT}`, () => { const result = { state: WaiterState.TIMEOUT, reason }; expect(() => checkExceptions(result)).toThrowError(JSON.stringify({ ...result, reason: "Waiter has timed out" })); }); it(`throw generic Error if state is ${WaiterState.RETRY}`, () => { const result = { state: WaiterState.RETRY, reason }; expect(() => checkExceptions(result)).toThrow(JSON.stringify(result)); }); it(`throw generic Error if state is ${WaiterState.FAILURE}`, () => { const result = { state: WaiterState.FAILURE, reason }; expect(() => checkExceptions(result)).toThrow(JSON.stringify(result)); }); it(`return result if state is ${WaiterState.SUCCESS}`, () => { const result = { state: WaiterState.SUCCESS }; expect(checkExceptions(result)).toEqual(result); }); }); ================================================ FILE: packages/core/src/submodules/client/util-waiter/waiter.ts ================================================ import type { WaiterConfiguration } from "@smithy/types"; import { getCircularReplacer } from "./circularReplacer"; export { WaiterConfiguration }; /** * @internal */ export const waiterServiceDefaults = { minDelay: 2, maxDelay: 120, }; /** * @internal */ export type WaiterOptions = WaiterConfiguration & Required, "minDelay" | "maxDelay">>; /** * @public */ export enum WaiterState { ABORTED = "ABORTED", FAILURE = "FAILURE", SUCCESS = "SUCCESS", RETRY = "RETRY", TIMEOUT = "TIMEOUT", } /** * @public */ export type WaiterResult = { state: WaiterState; /** * @deprecated because this was untyped as `any`, new code should use the field 'final', * which is the same value, but typed. */ reason?: any; /** * (optional) Indicates a reason for why a waiter has reached its state. */ final?: R; /** * Responses observed by the waiter during its polling, where the value * is the count. */ observedResponses?: Record; }; /** * Handles and throws exceptions resulting from the waiterResult * @internal * @param result - WaiterResult */ export const checkExceptions = (result: WaiterResult): WaiterResult => { if (result.state === WaiterState.ABORTED) { const abortError = new Error( `${JSON.stringify( { ...result, reason: "Request was aborted", }, getCircularReplacer() )}` ); abortError.name = "AbortError"; throw abortError; } else if (result.state === WaiterState.TIMEOUT) { const timeoutError = new Error( `${JSON.stringify( { ...result, reason: "Waiter has timed out", }, getCircularReplacer() )}` ); timeoutError.name = "TimeoutError"; throw timeoutError; } else if (result.state !== WaiterState.SUCCESS) { throw new Error(`${JSON.stringify(result, getCircularReplacer())}`); } return result; }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.4.17 ### Patch Changes - Updated dependencies [449ba5a] - @smithy/util-endpoints@3.4.2 ## 4.4.16 ### Patch Changes - Updated dependencies [5a18069] - Updated dependencies [cb76b1f] - Updated dependencies [131fce4] - Updated dependencies [52b4789] - Updated dependencies [b4a8b6b] - @smithy/util-endpoints@3.4.1 - @smithy/types@4.14.1 - @smithy/node-config-provider@4.3.14 - @smithy/util-middleware@4.2.14 ## 4.4.15 ### Patch Changes - Updated dependencies [8196133] - Updated dependencies [2490c8c] - @smithy/util-endpoints@3.4.0 ## 4.4.14 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/node-config-provider@4.3.13 - @smithy/util-endpoints@3.3.4 - @smithy/util-middleware@4.2.13 ## 4.4.13 ### Patch Changes - b1f0dba: fix(middleware-endpoint): update type of useDualStackEndpoint/useFipsEndpoint input config fix(config-resolver): add alternate values for NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS and NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS ## 4.4.12 ### Patch Changes - 4b5602d: fix: update default value to undefined for dualstack/fips config ## 4.4.11 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/node-config-provider@4.3.12 - @smithy/util-endpoints@3.3.3 - @smithy/util-middleware@4.2.12 ## 4.4.10 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/node-config-provider@4.3.11 - @smithy/util-config-provider@4.2.2 - @smithy/util-middleware@4.2.11 - @smithy/util-endpoints@3.3.2 ## 4.4.9 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/node-config-provider@4.3.10 - @smithy/util-endpoints@3.3.1 - @smithy/util-middleware@4.2.10 ## 4.4.8 ### Patch Changes - Updated dependencies [2bf677c] - @smithy/util-endpoints@3.3.0 ## 4.4.7 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/node-config-provider@4.3.9 - @smithy/types@4.12.1 - @smithy/util-config-provider@4.2.1 - @smithy/util-endpoints@3.2.9 - @smithy/util-middleware@4.2.9 ## 4.4.6 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/node-config-provider@4.3.8 - @smithy/util-endpoints@3.2.8 - @smithy/util-middleware@4.2.8 ## 4.4.5 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/node-config-provider@4.3.7 - @smithy/util-endpoints@3.2.7 - @smithy/util-middleware@4.2.7 ## 4.4.4 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/node-config-provider@4.3.6 - @smithy/util-endpoints@3.2.6 - @smithy/util-middleware@4.2.6 ## 4.4.3 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/node-config-provider@4.3.5 - @smithy/util-endpoints@3.2.5 - @smithy/util-middleware@4.2.5 ## 4.4.2 ### Patch Changes - 372b46f: allow \* region with warning ## 4.4.1 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/node-config-provider@4.3.4 - @smithy/util-endpoints@3.2.4 - @smithy/util-middleware@4.2.4 ## 4.4.0 ### Minor Changes - 13c5cd9: validate region is hostname component ## 4.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/node-config-provider@4.3.3 - @smithy/util-middleware@4.2.3 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/node-config-provider@4.3.2 - @smithy/util-middleware@4.2.2 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/node-config-provider@4.3.1 - @smithy/util-middleware@4.2.1 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/node-config-provider@4.3.0 - @smithy/types@4.6.0 - @smithy/util-config-provider@4.2.0 - @smithy/util-middleware@4.2.0 ## 4.2.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/node-config-provider@4.2.1 - @smithy/util-middleware@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/node-config-provider@4.2.0 - @smithy/util-config-provider@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/types@4.4.0 ## 4.1.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/node-config-provider@4.1.4 - @smithy/util-middleware@4.0.5 ## 4.1.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/node-config-provider@4.1.3 - @smithy/util-middleware@4.0.4 ## 4.1.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/node-config-provider@4.1.2 - @smithy/util-middleware@4.0.3 ## 4.1.2 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 ## 4.1.1 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/node-config-provider@4.0.2 - @smithy/util-middleware@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/node-config-provider@4.0.1 - @smithy/util-middleware@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/node-config-provider@4.0.0 - @smithy/util-config-provider@4.0.0 - @smithy/util-middleware@4.0.0 - @smithy/types@4.0.0 ## 3.0.13 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/node-config-provider@3.1.12 - @smithy/util-middleware@3.0.11 ## 3.0.12 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/node-config-provider@3.1.11 - @smithy/util-middleware@3.0.10 ## 3.0.11 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/node-config-provider@3.1.10 - @smithy/util-middleware@3.0.9 ## 3.0.10 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/node-config-provider@3.1.9 - @smithy/util-middleware@3.0.8 ## 3.0.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/node-config-provider@3.1.8 - @smithy/util-middleware@3.0.7 ## 3.0.8 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/node-config-provider@3.1.7 - @smithy/util-middleware@3.0.6 ## 3.0.7 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/node-config-provider@3.1.6 - @smithy/util-middleware@3.0.5 ## 3.0.6 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/node-config-provider@3.1.5 - @smithy/util-middleware@3.0.4 ## 3.0.5 ### Patch Changes - @smithy/node-config-provider@3.1.4 ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/node-config-provider@3.1.3 - @smithy/util-middleware@3.0.3 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/node-config-provider@3.1.2 - @smithy/util-middleware@3.0.2 ## 3.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/node-config-provider@3.1.1 - @smithy/util-middleware@3.0.1 ## 3.0.1 ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/node-config-provider@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/util-config-provider@3.0.0 - @smithy/util-middleware@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/node-config-provider@2.3.0 - @smithy/util-config-provider@2.3.0 - @smithy/util-middleware@2.2.0 - @smithy/types@2.12.0 ## 2.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 - @smithy/util-middleware@2.1.4 ## 2.1.4 ### Patch Changes - @smithy/node-config-provider@2.2.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/node-config-provider@2.2.3 - @smithy/util-middleware@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/node-config-provider@2.2.2 - @smithy/util-middleware@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/node-config-provider@2.2.1 - @smithy/types@2.9.1 - @smithy/util-config-provider@2.2.1 - @smithy/util-middleware@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/node-config-provider@2.2.0 - @smithy/util-config-provider@2.2.0 - @smithy/util-middleware@2.1.0 - @smithy/types@2.9.0 ## 2.0.23 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/node-config-provider@2.1.9 - @smithy/util-middleware@2.0.9 ## 2.0.22 ### Patch Changes - Updated dependencies [dd2b9c70] - @smithy/util-config-provider@2.1.0 ## 2.0.21 ### Patch Changes - @smithy/node-config-provider@2.1.8 ## 2.0.20 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/node-config-provider@2.1.7 - @smithy/util-middleware@2.0.8 ## 2.0.19 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/node-config-provider@2.1.6 - @smithy/util-middleware@2.0.7 ## 2.0.18 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/node-config-provider@2.1.5 - @smithy/util-middleware@2.0.6 ## 2.0.17 ### Patch Changes - @smithy/node-config-provider@2.1.4 ## 2.0.16 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/node-config-provider@2.1.3 - @smithy/util-middleware@2.0.5 ## 2.0.15 ### Patch Changes - @smithy/node-config-provider@2.1.2 ## 2.0.14 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/node-config-provider@2.1.1 - @smithy/util-middleware@2.0.4 ## 2.0.13 ### Patch Changes - Updated dependencies [7b568c39] - @smithy/node-config-provider@2.1.0 ## 2.0.12 ### Patch Changes - @smithy/node-config-provider@2.0.14 ## 2.0.11 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/node-config-provider@2.0.13 - @smithy/util-middleware@2.0.3 ## 2.0.10 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/node-config-provider@2.0.12 - @smithy/util-middleware@2.0.2 ## 2.0.9 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - Updated dependencies [5b6fa539] - @smithy/types@2.3.2 - @smithy/util-middleware@2.0.1 - @smithy/node-config-provider@2.0.11 ## 2.0.8 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/node-config-provider@2.0.10 - @smithy/util-middleware@2.0.0 ## 2.0.7 ### Patch Changes - d3daa891: Move @smithy/node-config-provider to deps - @smithy/node-config-provider@2.0.9 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/util-middleware@2.0.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/util-middleware@2.0.0 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/util-middleware@2.0.0 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/util-middleware@2.0.0 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/util-middleware@2.0.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/util-middleware@2.0.0 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-config-provider@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-config-provider@1.1.0 - @smithy/util-middleware@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/util-middleware@1.0.2 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-config-provider@1.0.2 - @smithy/util-middleware@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-config-provider@1.0.1 - @smithy/util-middleware@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/config-resolver](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/config-resolver/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/NodeUseDualstackEndpointConfigOptions.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { booleanSelector } from "../../util-config-provider/booleanSelector"; import { SelectorType } from "../../util-config-provider/types"; import { CONFIG_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_DUALSTACK_ENDPOINT, ENV_USE_DUALSTACK_ENDPOINT, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, nodeDualstackConfigSelectors, } from "./NodeUseDualstackEndpointConfigOptions"; vi.mock("../../util-config-provider/booleanSelector"); describe("NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS", () => { afterEach(() => { vi.clearAllMocks(); }); const test = (func: Function, obj: Record, key: string, type: SelectorType) => { it.each([true, false, undefined])("returns %s", (output) => { vi.mocked(booleanSelector).mockReturnValueOnce(output); expect(func(obj)).toEqual(output); expect(booleanSelector).toBeCalledWith(obj, key, type); }); it("throws error", () => { const mockError = new Error("error"); vi.mocked(booleanSelector).mockImplementationOnce(() => { throw mockError; }); expect(() => { func(obj); }).toThrow(mockError); }); }; describe("calls booleanSelector for environmentVariableSelector", () => { const env: { [ENV_USE_DUALSTACK_ENDPOINT]: any } = {} as any; const { environmentVariableSelector } = NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS; test(environmentVariableSelector, env, ENV_USE_DUALSTACK_ENDPOINT, SelectorType.ENV); }); describe("calls booleanSelector for configFileSelector", () => { const profileContent: { [CONFIG_USE_DUALSTACK_ENDPOINT]: any } = {} as any; const { configFileSelector } = NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS; test(configFileSelector, profileContent, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG); }); it("returns undefined for default", () => { const { default: defaultValue } = NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS; expect(defaultValue).toEqual(DEFAULT_USE_DUALSTACK_ENDPOINT); }); it("returns undefined for default when using nodeFipsConfigSelectors", () => { const { default: defaultValue } = nodeDualstackConfigSelectors; expect(defaultValue).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/NodeUseDualstackEndpointConfigOptions.ts ================================================ import type { LoadedConfigSelectors } from "../../node-config-provider/configLoader"; import { booleanSelector } from "../../util-config-provider/booleanSelector"; import { SelectorType } from "../../util-config-provider/types"; /** * @internal */ export const ENV_USE_DUALSTACK_ENDPOINT = "AWS_USE_DUALSTACK_ENDPOINT"; /** * @internal */ export const CONFIG_USE_DUALSTACK_ENDPOINT = "use_dualstack_endpoint"; /** * @internal */ export const DEFAULT_USE_DUALSTACK_ENDPOINT = false; /** * Don't delete this, used by older clients. * @deprecated replaced by nodeDualstackConfigSelectors in newer clients. * @internal */ export const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, SelectorType.ENV), configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG), default: false, }; /** * @internal */ export const nodeDualstackConfigSelectors: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, SelectorType.ENV), configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG), default: undefined, }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/NodeUseFipsEndpointConfigOptions.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { booleanSelector } from "../../util-config-provider/booleanSelector"; import { SelectorType } from "../../util-config-provider/types"; import { CONFIG_USE_FIPS_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT, ENV_USE_FIPS_ENDPOINT, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, nodeFipsConfigSelectors, } from "./NodeUseFipsEndpointConfigOptions"; vi.mock("../../util-config-provider/booleanSelector"); describe("NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS", () => { afterEach(() => { vi.clearAllMocks(); }); const test = (func: Function, obj: Record, key: string, type: SelectorType) => { it.each([true, false, undefined])("returns %s", (output) => { vi.mocked(booleanSelector).mockReturnValueOnce(output); expect(func(obj)).toEqual(output); expect(booleanSelector).toBeCalledWith(obj, key, type); }); it("throws error", () => { const mockError = new Error("error"); vi.mocked(booleanSelector).mockImplementationOnce(() => { throw mockError; }); expect(() => { func(obj); }).toThrow(mockError); }); }; describe("calls booleanSelector for environmentVariableSelector", () => { const env: { [ENV_USE_FIPS_ENDPOINT]: any } = {} as any; const { environmentVariableSelector } = NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS; test(environmentVariableSelector, env, ENV_USE_FIPS_ENDPOINT, SelectorType.ENV); }); describe("calls booleanSelector for configFileSelector", () => { const profileContent: { [CONFIG_USE_FIPS_ENDPOINT]: any } = {} as any; const { configFileSelector } = NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS; test(configFileSelector, profileContent, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG); }); it("returns false for default", () => { const { default: defaultValue } = NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS; expect(defaultValue).toBe(false); }); it("returns undefined for default when using nodeFipsConfigSelectors", () => { const { default: defaultValue } = nodeFipsConfigSelectors; expect(defaultValue).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/NodeUseFipsEndpointConfigOptions.ts ================================================ import type { LoadedConfigSelectors } from "../../node-config-provider/configLoader"; import { booleanSelector } from "../../util-config-provider/booleanSelector"; import { SelectorType } from "../../util-config-provider/types"; /** * @internal */ export const ENV_USE_FIPS_ENDPOINT = "AWS_USE_FIPS_ENDPOINT"; /** * @internal */ export const CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint"; /** * @internal */ export const DEFAULT_USE_FIPS_ENDPOINT = false; /** * Don't delete this, used by older clients. * @deprecated replaced by nodeFipsConfigSelectors in newer clients. * @internal */ export const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => booleanSelector(env, ENV_USE_FIPS_ENDPOINT, SelectorType.ENV), configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG), default: false, }; /** * @internal */ export const nodeFipsConfigSelectors: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => booleanSelector(env, ENV_USE_FIPS_ENDPOINT, SelectorType.ENV), configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG), default: undefined, }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/resolveCustomEndpointsConfig.spec.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { resolveCustomEndpointsConfig } from "./resolveCustomEndpointsConfig"; vi.mock("@smithy/core/client"); describe(resolveCustomEndpointsConfig.name, () => { const mockEndpoint = { protocol: "http:", hostname: "localhost", path: "/", }; const mockInput = { endpoint: mockEndpoint, urlParser: vi.fn(() => mockEndpoint), useDualstackEndpoint: () => Promise.resolve(false), } as any; beforeEach(() => { vi.mocked(normalizeProvider).mockImplementation((input) => typeof input === "function" ? (input as any) : () => Promise.resolve(input) ); }); afterEach(() => { vi.clearAllMocks(); }); it("maintains object custody", () => { const input = { ...mockInput }; expect(resolveCustomEndpointsConfig(input)).toBe(input); }); describe("tls", () => { afterEach(() => { expect(normalizeProvider).toHaveBeenCalledTimes(2); expect(normalizeProvider).toHaveBeenNthCalledWith(2, mockInput.useDualstackEndpoint); }); it.each([true, false])("returns %s when the value is passed", (tls) => { expect(resolveCustomEndpointsConfig({ ...mockInput, tls }).tls).toStrictEqual(tls); }); it("returns true if input.tls is undefined", () => { expect(resolveCustomEndpointsConfig({ ...mockInput }).tls).toStrictEqual(true); }); }); it("returns true for isCustomEndpoint", () => { expect(resolveCustomEndpointsConfig({ ...mockInput }).isCustomEndpoint).toStrictEqual(true); }); it("returns false when useDualstackEndpoint is not defined", async () => { const useDualstackEndpoint = await resolveCustomEndpointsConfig({ ...mockInput, useDualstackEndpoint: undefined, }).useDualstackEndpoint(); expect(useDualstackEndpoint).toStrictEqual(false); }); describe("returns normalized endpoint", () => { it("calls urlParser endpoint is of type string", async () => { const mockEndpointString = "http://localhost/"; const endpoint = await resolveCustomEndpointsConfig({ ...mockInput, endpoint: mockEndpointString }).endpoint(); expect(endpoint).toStrictEqual(mockEndpoint); expect(mockInput.urlParser).toHaveBeenCalledWith(mockEndpointString); expect(normalizeProvider).toHaveBeenCalledTimes(2); expect(normalizeProvider).toHaveBeenNthCalledWith(1, mockInput.endpoint); expect(normalizeProvider).toHaveBeenNthCalledWith(2, mockInput.useDualstackEndpoint); }); it("passes endpoint to normalize if not string", async () => { const endpoint = await resolveCustomEndpointsConfig({ ...mockInput }).endpoint(); expect(endpoint).toStrictEqual(mockEndpoint); expect(mockInput.urlParser).not.toHaveBeenCalled(); expect(normalizeProvider).toHaveBeenCalledTimes(2); expect(normalizeProvider).toHaveBeenNthCalledWith(1, mockInput.endpoint); expect(normalizeProvider).toHaveBeenNthCalledWith(2, mockInput.useDualstackEndpoint); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/resolveCustomEndpointsConfig.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { Endpoint, Provider, UrlParser } from "@smithy/types"; import type { EndpointsInputConfig, EndpointsResolvedConfig } from "./resolveEndpointsConfig"; /** * @public * @deprecated superseded by default endpointRuleSet generation. */ export interface CustomEndpointsInputConfig extends EndpointsInputConfig { /** * The fully qualified endpoint of the webservice. */ endpoint: string | Endpoint | Provider; } /** * @internal * @deprecated superseded by default endpointRuleSet generation. */ interface PreviouslyResolved { urlParser: UrlParser; } /** * @internal * @deprecated superseded by default endpointRuleSet generation. */ export interface CustomEndpointsResolvedConfig extends EndpointsResolvedConfig { /** * Whether the endpoint is specified by caller. * @internal */ isCustomEndpoint: true; } /** * @internal * * @deprecated superseded by default endpointRuleSet generation. */ export const resolveCustomEndpointsConfig = ( input: T & CustomEndpointsInputConfig & PreviouslyResolved ): T & CustomEndpointsResolvedConfig => { const { tls, endpoint, urlParser, useDualstackEndpoint } = input; return Object.assign(input, { tls: tls ?? true, endpoint: normalizeProvider(typeof endpoint === "string" ? urlParser(endpoint) : endpoint), isCustomEndpoint: true, useDualstackEndpoint: normalizeProvider(useDualstackEndpoint ?? false), } as CustomEndpointsResolvedConfig); }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/resolveEndpointsConfig.spec.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { normalizeProvider } from "@smithy/core/client"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { resolveEndpointsConfig } from "./resolveEndpointsConfig"; import { getEndpointFromRegion } from "./utils/getEndpointFromRegion"; vi.mock("@smithy/core/client"); vi.mock("./utils/getEndpointFromRegion"); describe(resolveEndpointsConfig.name, () => { const mockEndpoint = { protocol: "http:", hostname: "localhost", path: "/", }; const mockInput = { endpoint: mockEndpoint, urlParser: vi.fn(() => mockEndpoint), useDualstackEndpoint: () => Promise.resolve(false), useFipsEndpoint: () => Promise.resolve(false), } as any; beforeEach(() => { vi.mocked(getEndpointFromRegion).mockResolvedValueOnce(mockEndpoint); vi.mocked(normalizeProvider).mockImplementation((input) => typeof input === "function" ? (input as any) : () => Promise.resolve(input) ); }); afterEach(() => { vi.clearAllMocks(); }); it("maintains object custody", () => { const input = { ...mockInput }; expect(resolveEndpointsConfig(input)).toBe(input); }); describe("tls", () => { afterEach(() => { expect(normalizeProvider).toHaveBeenNthCalledWith(1, mockInput.useDualstackEndpoint); }); it.each([true, false])("returns %s when it's %s", (tls) => { expect(resolveEndpointsConfig({ ...mockInput, tls }).tls).toStrictEqual(tls); }); it("returns true is input.tls is undefined", () => { expect(resolveEndpointsConfig({ ...mockInput }).tls).toStrictEqual(true); }); }); describe("isCustomEndpoint", () => { afterEach(() => { expect(normalizeProvider).toHaveBeenNthCalledWith(1, mockInput.useDualstackEndpoint); }); it("returns true when endpoint is defined", () => { expect(resolveEndpointsConfig({ ...mockInput }).isCustomEndpoint).toStrictEqual(true); }); it("returns false when endpoint is not defined", () => { const { endpoint, ...mockInputWithoutEndpoint } = mockInput; expect(resolveEndpointsConfig(mockInputWithoutEndpoint).isCustomEndpoint).toStrictEqual(false); }); }); it("returns false when useDualstackEndpoint is not defined", async () => { const useDualstackEndpoint = await resolveEndpointsConfig({ ...mockInput, useDualstackEndpoint: undefined, }).useDualstackEndpoint(); expect(useDualstackEndpoint).toStrictEqual(false); }); describe("endpoint", () => { afterEach(() => { expect(normalizeProvider).toHaveBeenNthCalledWith(1, mockInput.useDualstackEndpoint); }); describe("returns from normalizeProvider when endpoint is defined", () => { afterEach(() => { expect(normalizeProvider).toHaveBeenCalledTimes(2); expect(normalizeProvider).toHaveBeenNthCalledWith(2, mockInput.endpoint); expect(getEndpointFromRegion).not.toHaveBeenCalled(); }); it("calls urlParser endpoint is of type string", async () => { const mockEndpointString = "http://localhost/"; const endpoint = await resolveEndpointsConfig({ ...mockInput, endpoint: mockEndpointString }).endpoint(); expect(endpoint).toStrictEqual(mockEndpoint); expect(mockInput.urlParser).toHaveBeenCalledWith(mockEndpointString); }); it("passes endpoint to normalize if not string", async () => { const endpoint = await resolveEndpointsConfig({ ...mockInput }).endpoint(); expect(endpoint).toStrictEqual(mockEndpoint); expect(mockInput.urlParser).not.toHaveBeenCalled(); }); }); it("returns from getEndpointFromRegion when endpoint is not defined", async () => { const { endpoint, ...mockInputWithoutEndpoint } = mockInput; const returnedEndpoint = await resolveEndpointsConfig(mockInputWithoutEndpoint).endpoint(); expect(returnedEndpoint).toStrictEqual(mockEndpoint); expect(normalizeProvider).toHaveBeenCalledTimes(1); expect(getEndpointFromRegion).toHaveBeenCalledTimes(1); expect(getEndpointFromRegion).toHaveBeenCalledWith(mockInputWithoutEndpoint); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/resolveEndpointsConfig.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { Endpoint, Provider, RegionInfoProvider, UrlParser } from "@smithy/types"; import { getEndpointFromRegion } from "./utils/getEndpointFromRegion"; /** * @public * @deprecated see \@smithy/middleware-endpoint resolveEndpointConfig. */ export interface EndpointsInputConfig { /** * The fully qualified endpoint of the webservice. This is only required when using * a custom endpoint (for example, when using a local version of S3). */ endpoint?: string | Endpoint | Provider; /** * Whether TLS is enabled for requests. */ tls?: boolean; /** * Enables IPv6/IPv4 dualstack endpoint. */ useDualstackEndpoint?: boolean | Provider; } /** * @internal * @deprecated see \@smithy/middleware-endpoint resolveEndpointConfig. */ interface PreviouslyResolved { regionInfoProvider: RegionInfoProvider; urlParser: UrlParser; region: Provider; useFipsEndpoint: Provider; } /** * @internal * @deprecated see \@smithy/middleware-endpoint resolveEndpointConfig. */ export interface EndpointsResolvedConfig extends Required { /** * Resolved value for input {@link EndpointsInputConfig.endpoint} */ endpoint: Provider; /** * Whether the endpoint is specified by caller. * @internal */ isCustomEndpoint?: boolean; /** * Resolved value for input {@link EndpointsInputConfig.useDualstackEndpoint} */ useDualstackEndpoint: Provider; } /** * All generated clients should migrate to Endpoints 2.0 endpointRuleSet traits. * * @internal * @deprecated endpoints rulesets use \@smithy/middleware-endpoint resolveEndpointConfig. */ export const resolveEndpointsConfig = ( input: T & EndpointsInputConfig & PreviouslyResolved ): T & EndpointsResolvedConfig => { const useDualstackEndpoint = normalizeProvider(input.useDualstackEndpoint ?? false); const { endpoint, useFipsEndpoint, urlParser, tls } = input; return Object.assign(input, { tls: tls ?? true, endpoint: endpoint ? normalizeProvider(typeof endpoint === "string" ? urlParser(endpoint) : endpoint) : () => getEndpointFromRegion({ ...input, useDualstackEndpoint, useFipsEndpoint }), isCustomEndpoint: !!endpoint, useDualstackEndpoint, }); }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/utils/getEndpointFromRegion.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getEndpointFromRegion } from "./getEndpointFromRegion"; describe(getEndpointFromRegion.name, () => { const mockRegion = vi.fn(); const mockUrlParser = vi.fn(); const mockRegionInfoProvider = vi.fn(); const mockUseFipsEndpoint = vi.fn(); const mockUseDualstackEndpoint = vi.fn(); const mockInput = { region: mockRegion, urlParser: mockUrlParser, regionInfoProvider: mockRegionInfoProvider, useDualstackEndpoint: mockUseDualstackEndpoint, useFipsEndpoint: mockUseFipsEndpoint, }; const mockRegionValue = "mockRegion"; const mockEndpoint = { protocol: "http:", hostname: "localhost", path: "/", }; const mockRegionInfo = { hostname: "mockHostname" }; beforeEach(() => { mockRegion.mockResolvedValue(mockRegionValue); mockUrlParser.mockResolvedValue(mockEndpoint); mockRegionInfoProvider.mockResolvedValue(mockRegionInfo); mockUseFipsEndpoint.mockResolvedValue(false); mockUseDualstackEndpoint.mockResolvedValue(false); }); afterEach(() => { expect(mockRegion).toHaveBeenCalledTimes(1); vi.clearAllMocks(); }); describe("tls", () => { afterEach(() => { expect(mockRegionInfoProvider).toHaveBeenCalledWith(mockRegionValue, { useDualstackEndpoint: false, useFipsEndpoint: false, }); }); it("uses protocol https when not defined", async () => { await getEndpointFromRegion(mockInput); expect(mockUrlParser).toHaveBeenCalledTimes(1); expect(mockUrlParser).toHaveBeenCalledWith(`https://${mockRegionInfo.hostname}`); }); it.each([ ["http:", false], ["https:", true], ])("uses protocol %s when set to %s", async (protocol, tls) => { await getEndpointFromRegion({ ...mockInput, tls }); expect(mockUrlParser).toHaveBeenCalledTimes(1); expect(mockUrlParser).toHaveBeenCalledWith(`${protocol}//${mockRegionInfo.hostname}`); }); }); describe("throws if region is invalid", () => { const errorMsg = "Invalid region in client config"; it.each([ "", "has_underscore", "-starts-with-dash", "ends-with-dash-", "-starts-and-ends-with-dash-", "-", "a-", "c0nt@in$-$ymb01$", "a".repeat(64), ])("region: %s", async (region) => { mockRegion.mockResolvedValue(region); try { await getEndpointFromRegion(mockInput); fail(`expected Error: ${errorMsg}`); } catch (error) { expect(error.message).toEqual(errorMsg); } expect(mockRegionInfoProvider).not.toHaveBeenCalled(); expect(mockUrlParser).not.toHaveBeenCalled(); }); }); it("throws if hostname is not returned by regionInfoProvider", async () => { mockRegionInfoProvider.mockResolvedValue({}); const errorMsg = "Cannot resolve hostname from client config"; try { await getEndpointFromRegion(mockInput); fail(`expected Error: ${errorMsg}`); } catch (error) { expect(error.message).toEqual(errorMsg); } expect(mockRegionInfoProvider).toHaveBeenCalledWith(mockRegionValue, { useDualstackEndpoint: false, useFipsEndpoint: false, }); expect(mockUrlParser).not.toHaveBeenCalled(); }); it("returns parsed endpoint", async () => { const endpoint = await getEndpointFromRegion(mockInput); expect(endpoint).toEqual(mockEndpoint); expect(mockRegionInfoProvider).toHaveBeenCalledWith(mockRegionValue, { useDualstackEndpoint: false, useFipsEndpoint: false, }); expect(mockUrlParser).toHaveBeenCalledWith(`https://${mockRegionInfo.hostname}`); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/endpointsConfig/utils/getEndpointFromRegion.ts ================================================ import type { Provider, RegionInfoProvider, UrlParser } from "@smithy/types"; interface GetEndpointFromRegionOptions { region: Provider; tls?: boolean; regionInfoProvider: RegionInfoProvider; urlParser: UrlParser; useDualstackEndpoint: Provider; useFipsEndpoint: Provider; } export const getEndpointFromRegion = async (input: GetEndpointFromRegionOptions) => { const { tls = true } = input; const region = await input.region(); const dnsHostRegex = new RegExp(/^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/); if (!dnsHostRegex.test(region)) { throw new Error("Invalid region in client config"); } const useDualstackEndpoint = await input.useDualstackEndpoint(); const useFipsEndpoint = await input.useFipsEndpoint(); const { hostname } = (await input.regionInfoProvider(region, { useDualstackEndpoint, useFipsEndpoint })) ?? {}; if (!hostname) { throw new Error("Cannot resolve hostname from client config"); } return input.urlParser(`${tls ? "https:" : "http:"}//${hostname}`); }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/checkRegion.spec.ts ================================================ import { isValidHostLabel } from "@smithy/util-endpoints"; import { describe, expect, test as it, vi } from "vitest"; import { checkRegion } from "./checkRegion"; describe("checkRegion", () => { const acceptedRegionExamples = [ "us-east-1", "ap-east-1", "ap-southeast-4", "ap-northeast-3", "ap-northeast-1", "eu-west-2", "il-central-1", "mx-central-1", "eu-isoe-santaclaus-125", "us-iso-reindeer-3000", "eusc-de-gingerbread-8000", "abcd", "12345", ]; it("does not throw when the region is a valid host label", () => { for (const region of acceptedRegionExamples) { expect(() => checkRegion(region)).not.toThrow(); } }); it("throws when the region is not a valid host label", () => { for (const region of [ "us-east-1-", "a".repeat(64), "-us-east-1", "", "!", "@", "#", "$", "%", "^", "&", "**", "(", ")", ".", "[", "]", ";", `'`, "?", "/", "\\", "|", "+-*/", ]) { expect(() => checkRegion(region)).toThrow( `Region not accepted: region="${region}" is not a valid hostname component.` ); } }); it("emits a warning when asterisk region is used", () => { vi.spyOn(console, "warn"); checkRegion("*"); expect(console.warn).toHaveBeenCalledWith(expect.stringContaining("@smithy/config-resolver WARN")); }); it("caches accepted regions", () => { vi.spyOn(console, "warn"); const di = { isValidHostLabel, }; for (const region of acceptedRegionExamples) { expect(() => checkRegion(region, di.isValidHostLabel)).not.toThrow(); } vi.spyOn(di, "isValidHostLabel").mockImplementation(isValidHostLabel); for (const region of acceptedRegionExamples) { expect(() => checkRegion(region, di.isValidHostLabel)).not.toThrow(); } expect(di.isValidHostLabel).toHaveBeenCalledTimes(0); expect(() => checkRegion("oh-canada", di.isValidHostLabel)).not.toThrow(); expect(di.isValidHostLabel).toHaveBeenCalledTimes(1); expect(console.warn).not.toHaveBeenCalled(); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/checkRegion.ts ================================================ import { isValidHostLabel } from "@smithy/core/endpoints"; /** * @internal */ const validRegions = new Set(); /** * Checks whether region can be a host component. * * @param region - to check. * @param check - checking function. * * @internal */ export const checkRegion = (region: string, check = isValidHostLabel) => { if (!validRegions.has(region) && !check(region)) { if (region === "*") { console.warn( `@smithy/config-resolver WARN - Please use the caller region instead of "*". See "sigv4a" in https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/CLIENTS.md.` ); } else { throw new Error(`Region not accepted: region="${region}" is not a valid hostname component.`); } } else { validRegions.add(region); } }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/config.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { NODE_REGION_CONFIG_FILE_OPTIONS, NODE_REGION_CONFIG_OPTIONS, REGION_ENV_NAME, REGION_INI_NAME, } from "./config"; describe("config", () => { describe("NODE_REGION_CONFIG_OPTIONS", () => { describe("environmentVariableSelector", () => { const { environmentVariableSelector } = NODE_REGION_CONFIG_OPTIONS; it.each([undefined, "mockRegion"])(`when env[${REGION_ENV_NAME}]: %s`, (mockEndpoint) => { expect(environmentVariableSelector({ [REGION_ENV_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); describe("configFileSelector", () => { const { configFileSelector } = NODE_REGION_CONFIG_OPTIONS; it.each([undefined, "mockRegion"])(`when env[${REGION_INI_NAME}]: %s`, (mockEndpoint) => { expect(configFileSelector({ [REGION_INI_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); it("default throws error", () => { const { default: defaultKey } = NODE_REGION_CONFIG_OPTIONS; expect(() => { (defaultKey as any)(); }).toThrowError(new Error("Region is missing")); }); }); describe("NODE_REGION_CONFIG_FILE_OPTIONS", () => { it("preferredFile contains credentials", () => { const { preferredFile } = NODE_REGION_CONFIG_FILE_OPTIONS; expect(preferredFile).toBe("credentials"); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/config.ts ================================================ import type { LoadedConfigSelectors, LocalConfigOptions } from "../../node-config-provider/configLoader"; /** * @internal */ export const REGION_ENV_NAME = "AWS_REGION"; /** * @internal */ export const REGION_INI_NAME = "region"; /** * @internal */ export const NODE_REGION_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => env[REGION_ENV_NAME], configFileSelector: (profile) => profile[REGION_INI_NAME], default: () => { throw new Error("Region is missing"); }, }; /** * @internal */ export const NODE_REGION_CONFIG_FILE_OPTIONS: LocalConfigOptions = { preferredFile: "credentials", }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/getRealRegion.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getRealRegion } from "./getRealRegion"; import { isFipsRegion } from "./isFipsRegion"; vi.mock("./isFipsRegion"); describe(getRealRegion.name, () => { beforeEach(() => { vi.mocked(isFipsRegion).mockReturnValue(true); }); afterEach(() => { expect(isFipsRegion).toHaveBeenCalledTimes(1); vi.clearAllMocks(); }); it("returns provided region if it's not FIPS", () => { const mockRegion = "mockRegion"; vi.mocked(isFipsRegion).mockReturnValue(false); expect(getRealRegion(mockRegion)).toStrictEqual(mockRegion); }); describe("FIPS regions", () => { it.each(["fips-aws-global", "aws-fips"])(`returns "us-east-1" for "%s"`, (input) => { expect(getRealRegion(input)).toStrictEqual("us-east-1"); }); it.each([ ["us-west-1", "us-west-1-fips"], ["us-west-1", "fips-us-west-1"], ["us-west-1", "fips-dkr-us-west-1"], ["us-west-1", "fips-prod-us-west-1"], ])(`returns "%s" for "%s"`, (output, input) => { expect(getRealRegion(input)).toStrictEqual(output); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/getRealRegion.ts ================================================ import { isFipsRegion } from "./isFipsRegion"; /** * @internal */ export const getRealRegion = (region: string) => isFipsRegion(region) ? ["fips-aws-global", "aws-fips"].includes(region) ? "us-east-1" : region.replace(/fips-(dkr-|prod-)?|-fips/, "") : region; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/isFipsRegion.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isFipsRegion } from "./isFipsRegion"; describe(isFipsRegion.name, () => { it.each([ [true, "fips-us-east-1"], [true, "us-east-1-fips"], [false, "us-east-1"], ])(`returns %s for region "%s"`, (output, input) => { expect(isFipsRegion(input)).toEqual(output); }); it.each([undefined, null])("returns false for %s", (input) => { expect(isFipsRegion(input as any)).toEqual(false); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/isFipsRegion.ts ================================================ /** * @internal */ export const isFipsRegion = (region: string) => typeof region === "string" && (region.startsWith("fips-") || region.endsWith("-fips")); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/resolveRegionConfig.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getRealRegion } from "./getRealRegion"; import { isFipsRegion } from "./isFipsRegion"; import { resolveRegionConfig } from "./resolveRegionConfig"; vi.mock("./getRealRegion"); vi.mock("./isFipsRegion"); describe("RegionConfig", () => { const mockRegion = "mockRegion"; const mockRealRegion = "mockRealRegion"; const mockUseFipsEndpoint = () => Promise.resolve(false); beforeEach(() => { vi.mocked(getRealRegion).mockReturnValue(mockRealRegion); vi.mocked(isFipsRegion).mockReturnValue(false); }); afterEach(() => { vi.clearAllMocks(); }); it("maintains object custody", () => { const input = { region: "us-east-1", }; expect(resolveRegionConfig(input)).toBe(input); }); describe("region", () => { it("return normalized value with real region if passed as a string", async () => { const resolvedRegionConfig = resolveRegionConfig({ region: mockRegion, useFipsEndpoint: mockUseFipsEndpoint }); const resolvedRegion = await resolvedRegionConfig.region(); expect(resolvedRegion).toBe(mockRealRegion); expect(getRealRegion).toHaveBeenCalledTimes(1); expect(getRealRegion).toHaveBeenCalledWith(mockRegion); }); it("return provider with real region if passed as a Provider", async () => { const resolvedRegionConfig = resolveRegionConfig({ region: () => Promise.resolve(mockRegion), useFipsEndpoint: mockUseFipsEndpoint, }); const resolvedRegion = await resolvedRegionConfig.region(); expect(resolvedRegion).toBe(mockRealRegion); expect(getRealRegion).toHaveBeenCalledTimes(1); expect(getRealRegion).toHaveBeenCalledWith(mockRegion); }); it("throw if region is not supplied", () => { expect(() => resolveRegionConfig({ useFipsEndpoint: mockUseFipsEndpoint })).toThrow(); }); }); describe("useFipsEndpoint", () => { let mockRegionProvider: () => Promise; let mockUseFipsEndpoint: () => Promise; beforeEach(() => { mockRegionProvider = vi.fn().mockResolvedValueOnce(Promise.resolve(mockRegion)); mockUseFipsEndpoint = vi.fn().mockResolvedValueOnce(Promise.resolve(false)); }); afterEach(() => { expect(isFipsRegion).toHaveBeenCalledTimes(1); expect(isFipsRegion).toHaveBeenCalledWith(mockRegion); expect(mockRegionProvider).toHaveBeenCalledTimes(1); }); it("can be undefined", async () => { const resolvedRegionConfig = resolveRegionConfig({ region: mockRegionProvider, }); expect(await resolvedRegionConfig.useFipsEndpoint()).toBe(false); }); it("returns Provider which returns true for FIPS endpoints", async () => { vi.mocked(isFipsRegion).mockReturnValue(true); const resolvedRegionConfig = resolveRegionConfig({ region: mockRegionProvider, useFipsEndpoint: mockUseFipsEndpoint, }); const useFipsEndpoint = await resolvedRegionConfig.useFipsEndpoint(); expect(useFipsEndpoint).toStrictEqual(true); expect(mockUseFipsEndpoint).not.toHaveBeenCalled(); }); it("returns passed Provider if endpoint is not FIPS", async () => { const resolvedRegionConfig = resolveRegionConfig({ region: mockRegionProvider, useFipsEndpoint: mockUseFipsEndpoint, }); const useFipsEndpoint = await resolvedRegionConfig.useFipsEndpoint(); expect(useFipsEndpoint).toStrictEqual(false); expect(mockUseFipsEndpoint).toHaveBeenCalledTimes(1); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionConfig/resolveRegionConfig.ts ================================================ import type { Provider } from "@smithy/types"; import { checkRegion } from "./checkRegion"; import { getRealRegion } from "./getRealRegion"; import { isFipsRegion } from "./isFipsRegion"; /** * @public */ export interface RegionInputConfig { /** * The AWS region to which this client will send requests */ region?: string | Provider; /** * Enables FIPS compatible endpoints. */ useFipsEndpoint?: boolean | Provider; } interface PreviouslyResolved {} /** * @internal */ export interface RegionResolvedConfig { /** * Resolved value for input config {@link RegionInputConfig.region} */ region: Provider; /** * Resolved value for input {@link RegionInputConfig.useFipsEndpoint} */ useFipsEndpoint: Provider; } /** * @internal */ export const resolveRegionConfig = (input: T & RegionInputConfig & PreviouslyResolved): T & RegionResolvedConfig => { const { region, useFipsEndpoint } = input; if (!region) { throw new Error("Region is missing"); } return Object.assign(input, { region: async () => { const providedRegion = typeof region === "function" ? await region() : region; const realRegion = getRealRegion(providedRegion); checkRegion(realRegion); return realRegion; }, useFipsEndpoint: async () => { const providedRegion = typeof region === "string" ? region : await region(); if (isFipsRegion(providedRegion)) { return true; } return typeof useFipsEndpoint !== "function" ? Promise.resolve(!!useFipsEndpoint) : useFipsEndpoint(); }, }); }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/EndpointVariant.ts ================================================ import type { EndpointVariantTag } from "./EndpointVariantTag"; /** * Provides hostname information for specific host label. * * @internal * @deprecated unused as of endpointsRuleSets. */ export type EndpointVariant = { hostname: string; tags: EndpointVariantTag[]; }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/EndpointVariantTag.ts ================================================ /** * * * The tag which mentions which area variant is providing information for. * Can be either "fips" or "dualstack". * * @internal * @deprecated unused for endpointRuleSets. */ export type EndpointVariantTag = "fips" | "dualstack"; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/PartitionHash.ts ================================================ import type { EndpointVariant } from "./EndpointVariant"; /** * The hash of partition with the information specific to that partition. * The information includes the list of regions belonging to that partition, * and the hostname to be used for the partition. * * @internal * @deprecated unused for endpointRuleSets. */ export type PartitionHash = Record< string, { regions: string[]; regionRegex: string; variants: EndpointVariant[]; endpoint?: string; } >; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/RegionHash.ts ================================================ import type { EndpointVariant } from "./EndpointVariant"; /** * The hash of region with the information specific to that region. * The information can include hostname, signingService and signingRegion. * * @internal * @deprecated unused for endpointRuleSets. */ export type RegionHash = Record< string, { variants: EndpointVariant[]; signingService?: string; signingRegion?: string; } >; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getHostnameFromVariants.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import type { EndpointVariant } from "./EndpointVariant"; import { getHostnameFromVariants, type GetHostnameFromVariantsOptions } from "./getHostnameFromVariants"; describe(getHostnameFromVariants.name, () => { const getMockHostname = (options: GetHostnameFromVariantsOptions) => JSON.stringify(options); const getMockTags = ({ useFipsEndpoint, useDualstackEndpoint }: GetHostnameFromVariantsOptions) => [ ...(useFipsEndpoint ? ["fips"] : []), ...(useDualstackEndpoint ? ["dualstack"] : []), ]; const getMockVariants = () => [ { useFipsEndpoint: false, useDualstackEndpoint: false }, { useFipsEndpoint: false, useDualstackEndpoint: true }, { useFipsEndpoint: true, useDualstackEndpoint: false }, { useFipsEndpoint: true, useDualstackEndpoint: true }, ].map((options) => ({ hostname: getMockHostname(options), tags: getMockTags(options), })); const testCases = [ [false, false], [false, true], [true, false], [true, true], ]; describe("returns hostname if present in variants", () => { it.each(testCases)("useFipsEndpoint: %s, useDualstackEndpoint: %s", (useFipsEndpoint, useDualstackEndpoint) => { const options = { useFipsEndpoint, useDualstackEndpoint }; const variants = getMockVariants() as EndpointVariant[]; expect(getHostnameFromVariants(variants, options)).toEqual(getMockHostname(options)); }); }); describe("returns undefined if not present in variants", () => { it.each(testCases)("useFipsEndpoint: %s, useDualstackEndpoint: %s", (useFipsEndpoint, useDualstackEndpoint) => { const options = { useFipsEndpoint, useDualstackEndpoint }; const variants = getMockVariants() as EndpointVariant[]; expect( getHostnameFromVariants( variants.filter(({ tags }) => JSON.stringify(tags) !== JSON.stringify(getMockTags(options))), options ) ).toBeUndefined(); }); }); describe("returns undefined if variants in undefined", () => { it.each(testCases)("useFipsEndpoint: %s, useDualstackEndpoint: %s", (useFipsEndpoint, useDualstackEndpoint) => { const options = { useFipsEndpoint, useDualstackEndpoint }; expect(getHostnameFromVariants(undefined, options)).toBeUndefined(); }); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getHostnameFromVariants.ts ================================================ import type { EndpointVariant } from "./EndpointVariant"; /** * @internal * @deprecated unused as of endpointsRuleSets. */ export interface GetHostnameFromVariantsOptions { useFipsEndpoint: boolean; useDualstackEndpoint: boolean; } /** * @internal * @deprecated unused as of endpointsRuleSets. */ export const getHostnameFromVariants = ( variants: EndpointVariant[] = [], { useFipsEndpoint, useDualstackEndpoint }: GetHostnameFromVariantsOptions ) => variants.find( ({ tags }) => useFipsEndpoint === tags.includes("fips") && useDualstackEndpoint === tags.includes("dualstack") )?.hostname; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getRegionInfo.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import type { PartitionHash } from "./PartitionHash"; import type { RegionHash } from "./RegionHash"; import { getHostnameFromVariants } from "./getHostnameFromVariants"; import { getRegionInfo } from "./getRegionInfo"; import { getResolvedHostname } from "./getResolvedHostname"; import { getResolvedPartition } from "./getResolvedPartition"; import { getResolvedSigningRegion } from "./getResolvedSigningRegion"; vi.mock("./getHostnameFromVariants"); vi.mock("./getResolvedHostname"); vi.mock("./getResolvedPartition"); vi.mock("./getResolvedSigningRegion"); describe(getRegionInfo.name, () => { const mockPartition = "mockPartition"; const mockSigningService = "mockSigningService"; const mockRegion = "mockRegion"; const mockRegionRegex = "mockRegionRegex"; const mockHostname = "{region}.mockHostname.com"; const mockEndpointRegion = "mockEndpointRegion"; const mockEndpointHostname = "{region}.mockEndpointHostname.com"; enum RegionCase { REGION = "Region", ENDPOINT = "Endpoint", REGION_AND_ENDPOINT = "Region and Endpoint", } const getMockRegionHash = (regionCase: RegionCase): RegionHash => ({ ...((regionCase === RegionCase.REGION || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockRegion]: { variants: [{ hostname: mockHostname, tags: [] }], }, }), ...((regionCase === RegionCase.ENDPOINT || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockEndpointRegion]: { variants: [{ hostname: mockEndpointHostname, tags: [] }], }, }), }); const getMockPartitionHash = (regionCase: RegionCase): PartitionHash => ({ [mockPartition]: { regions: [mockRegion, `${mockRegion}2`, `${mockRegion}3`], regionRegex: mockRegionRegex, variants: [{ hostname: mockHostname, tags: [] }], ...((regionCase === RegionCase.ENDPOINT || regionCase === RegionCase.REGION_AND_ENDPOINT) && { endpoint: mockEndpointRegion, }), }, }); const getMockResolvedRegion = (regionCase: RegionCase): string => regionCase !== RegionCase.ENDPOINT ? mockRegion : mockEndpointRegion; const getMockResolvedPartitionOptions = (partitionHash: PartitionHash) => ({ partitionHash }); const getMockRegionInfoOptions = (regionHash: RegionHash, getResolvedPartitionOptions: any) => ({ ...getResolvedPartitionOptions, signingService: mockSigningService, regionHash, }); beforeEach(() => { vi.mocked(getHostnameFromVariants).mockReturnValue(mockHostname); vi.mocked(getResolvedHostname).mockReturnValue(mockHostname); vi.mocked(getResolvedPartition).mockReturnValue(mockPartition); vi.mocked(getResolvedSigningRegion).mockReturnValue(undefined); }); afterEach(() => { expect(getHostnameFromVariants).toHaveBeenCalledTimes(2); expect(getResolvedHostname).toHaveBeenCalledTimes(1); expect(getResolvedPartition).toHaveBeenCalledTimes(1); vi.clearAllMocks(); }); describe("returns data based on options passed", () => { it.each(Object.values(RegionCase))("%s", (regionCase) => { const mockRegionHash = getMockRegionHash(regionCase); const mockPartitionHash = getMockPartitionHash(regionCase); const mockGetResolvedPartitionOptions = getMockResolvedPartitionOptions(mockPartitionHash); const mockGetRegionInfoOptions = getMockRegionInfoOptions(mockRegionHash, mockGetResolvedPartitionOptions); const mockResolvedRegion = getMockResolvedRegion(regionCase); const mockRegionHostname = mockGetRegionInfoOptions.regionHash[mockResolvedRegion]?.hostname; const mockPartitionHostname = mockGetRegionInfoOptions.partitionHash[mockPartition]?.hostname; vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockRegionHostname); vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockPartitionHostname); expect(getRegionInfo(mockRegion, mockGetRegionInfoOptions)).toEqual({ signingService: mockSigningService, hostname: mockHostname, partition: mockPartition, }); expect(getResolvedHostname).toHaveBeenCalledWith(mockResolvedRegion, { regionHostname: mockRegionHostname, partitionHostname: mockPartitionHostname, }); expect(getResolvedPartition).toHaveBeenCalledWith(mockRegion, mockGetResolvedPartitionOptions); expect(getResolvedSigningRegion).toHaveBeenCalledWith(mockHostname, { regionRegex: mockRegionRegex, useFipsEndpoint: false, }); }); }); describe("returns signingRegion if resolved by getResolvedSigningRegion", () => { const getMockRegionHashWithSigningRegion = ( regionCase: RegionCase, mockRegionHash: RegionHash, mockSigningRegion: string ): RegionHash => ({ ...mockRegionHash, ...((regionCase === RegionCase.REGION || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockRegion]: { ...mockRegionHash[mockRegion], signingRegion: mockSigningRegion, }, }), ...((regionCase === RegionCase.ENDPOINT || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockEndpointRegion]: { ...mockRegionHash[mockEndpointRegion], signingRegion: mockSigningRegion, }, }), }); it.each(Object.values(RegionCase))("%s", (regionCase) => { const mockSigningRegion = "mockSigningRegion"; vi.mocked(getResolvedSigningRegion).mockReturnValueOnce(mockSigningRegion); const mockRegionHash = getMockRegionHash(regionCase); const mockPartitionHash = getMockPartitionHash(regionCase); const mockGetResolvedPartitionOptions = getMockResolvedPartitionOptions(mockPartitionHash); const mockGetRegionInfoOptions = getMockRegionInfoOptions(mockRegionHash, mockGetResolvedPartitionOptions); const mockResolvedRegion = getMockResolvedRegion(regionCase); const mockRegionHostname = mockGetRegionInfoOptions.regionHash[mockResolvedRegion]?.hostname; const mockPartitionHostname = mockGetRegionInfoOptions.partitionHash[mockPartition]?.hostname; vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockRegionHostname); vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockPartitionHostname); const mockRegionHashWithSigningRegion = getMockRegionHashWithSigningRegion( regionCase, mockRegionHash, mockSigningRegion ); expect( getRegionInfo(mockRegion, { ...mockGetRegionInfoOptions, regionHash: mockRegionHashWithSigningRegion }) ).toEqual({ signingService: mockSigningService, hostname: mockHostname, partition: mockPartition, signingRegion: mockSigningRegion, }); expect(getResolvedHostname).toHaveBeenCalledWith(mockResolvedRegion, { regionHostname: mockRegionHostname, partitionHostname: mockPartitionHostname, }); expect(getResolvedPartition).toHaveBeenCalledWith(mockRegion, mockGetResolvedPartitionOptions); expect(getResolvedSigningRegion).toHaveBeenCalledWith(mockHostname, { signingRegion: mockSigningRegion, regionRegex: mockRegionRegex, useFipsEndpoint: false, }); }); }); describe("returns signingService if present in regionHash", () => { const getMockRegionHashWithSigningService = ( regionCase: RegionCase, mockRegionHash: RegionHash, mockSigningService: string ): RegionHash => ({ ...mockRegionHash, ...((regionCase === RegionCase.REGION || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockRegion]: { ...mockRegionHash[mockRegion], signingService: mockSigningService, }, }), ...((regionCase === RegionCase.ENDPOINT || regionCase === RegionCase.REGION_AND_ENDPOINT) && { [mockEndpointRegion]: { ...mockRegionHash[mockEndpointRegion], signingService: mockSigningService, }, }), }); it.each(Object.values(RegionCase))("%s", (regionCase) => { const mockSigningServiceInRegionHash = "mockSigningServiceInRegionHash"; const mockRegionHash = getMockRegionHash(regionCase); const mockPartitionHash = getMockPartitionHash(regionCase); const mockGetResolvedPartitionOptions = getMockResolvedPartitionOptions(mockPartitionHash); const mockGetRegionInfoOptions = getMockRegionInfoOptions(mockRegionHash, mockGetResolvedPartitionOptions); const mockResolvedRegion = getMockResolvedRegion(regionCase); const mockRegionHostname = mockGetRegionInfoOptions.regionHash[mockResolvedRegion]?.hostname; const mockPartitionHostname = mockGetRegionInfoOptions.partitionHash[mockPartition]?.hostname; vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockRegionHostname); vi.mocked(getHostnameFromVariants).mockReturnValueOnce(mockPartitionHostname); const mockRegionHashWithSigningRegion = getMockRegionHashWithSigningService( regionCase, mockRegionHash, mockSigningServiceInRegionHash ); expect( getRegionInfo(mockRegion, { ...mockGetRegionInfoOptions, regionHash: mockRegionHashWithSigningRegion }) ).toEqual({ signingService: mockSigningServiceInRegionHash, hostname: mockHostname, partition: mockPartition, }); expect(getResolvedHostname).toHaveBeenCalledWith(mockResolvedRegion, { regionHostname: mockRegionHostname, partitionHostname: mockPartitionHostname, }); expect(getResolvedPartition).toHaveBeenCalledWith(mockRegion, mockGetResolvedPartitionOptions); expect(getResolvedSigningRegion).toHaveBeenCalledWith(mockHostname, { regionRegex: mockRegionRegex, useFipsEndpoint: false, }); }); }); it("throws error if hostname is not defined", () => { vi.mocked(getResolvedHostname).mockReturnValueOnce(undefined); const mockRegionHash = getMockRegionHash(RegionCase.REGION); const mockPartitionHash = getMockPartitionHash(RegionCase.REGION); expect(() => { getRegionInfo(mockRegion, { signingService: mockSigningService, regionHash: mockRegionHash, partitionHash: mockPartitionHash, }); }).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getRegionInfo.ts ================================================ import type { RegionInfo } from "@smithy/types"; import type { PartitionHash } from "./PartitionHash"; import type { RegionHash } from "./RegionHash"; import { getHostnameFromVariants } from "./getHostnameFromVariants"; import { getResolvedHostname } from "./getResolvedHostname"; import { getResolvedPartition } from "./getResolvedPartition"; import { getResolvedSigningRegion } from "./getResolvedSigningRegion"; /** * @internal * @deprecated unused as of endpointsRuleSets. */ export interface GetRegionInfoOptions { useFipsEndpoint?: boolean; useDualstackEndpoint?: boolean; signingService: string; regionHash: RegionHash; partitionHash: PartitionHash; } /** * @internal * @deprecated unused as of endpointsRuleSets. */ export const getRegionInfo = ( region: string, { useFipsEndpoint = false, useDualstackEndpoint = false, signingService, regionHash, partitionHash, }: GetRegionInfoOptions ): RegionInfo => { const partition = getResolvedPartition(region, { partitionHash }); const resolvedRegion = region in regionHash ? region : partitionHash[partition]?.endpoint ?? region; const hostnameOptions = { useFipsEndpoint, useDualstackEndpoint }; const regionHostname = getHostnameFromVariants(regionHash[resolvedRegion]?.variants, hostnameOptions); const partitionHostname = getHostnameFromVariants(partitionHash[partition]?.variants, hostnameOptions); const hostname = getResolvedHostname(resolvedRegion, { regionHostname, partitionHostname }); if (hostname === undefined) { throw new Error(`Endpoint resolution failed for: ${{ resolvedRegion, useFipsEndpoint, useDualstackEndpoint }}`); } const signingRegion = getResolvedSigningRegion(hostname, { signingRegion: regionHash[resolvedRegion]?.signingRegion, regionRegex: partitionHash[partition].regionRegex, useFipsEndpoint, }); return { partition, signingService, hostname, ...(signingRegion && { signingRegion }), ...(regionHash[resolvedRegion]?.signingService && { signingService: regionHash[resolvedRegion].signingService, }), }; }; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedHostname.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { getResolvedHostname } from "./getResolvedHostname"; describe(getResolvedHostname.name, () => { const mockRegion = "mockRegion"; const mockHostname = "{region}.mockHostname.com"; afterEach(() => { vi.clearAllMocks(); }); it("returns hostname if available in regionHostname", () => { expect( getResolvedHostname(mockRegion, { regionHostname: mockHostname, }) ).toBe(mockHostname); }); it("returns hostname from partitionHostname when not available in partitionHostname", () => { expect( getResolvedHostname(mockRegion, { partitionHostname: mockHostname, }) ).toBe(mockHostname.replace("{region}", mockRegion)); }); it("returns undefined not available in either regionHostname or partitionHostname", () => { expect(getResolvedHostname(mockRegion, {})).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedHostname.ts ================================================ /** * @internal * @deprecated unused for endpointRuleSets. */ export interface GetResolvedHostnameOptions { regionHostname?: string; partitionHostname?: string; } /** * @internal * @deprecated unused for endpointRuleSets. */ export const getResolvedHostname = ( resolvedRegion: string, { regionHostname, partitionHostname }: GetResolvedHostnameOptions ): string | undefined => regionHostname ? regionHostname : partitionHostname ? partitionHostname.replace("{region}", resolvedRegion) : undefined; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedPartition.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import type { PartitionHash } from "./PartitionHash"; import { getResolvedPartition } from "./getResolvedPartition"; describe(getResolvedPartition.name, () => { const mockRegion = "mockRegion"; const mockPartition = "mockPartition"; const mockHostname = "mockHostname"; const mockRegionRegex = "mockRegionRegex"; it("returns the partition if region is present in partitionHash", () => { const mockPartitionHash: PartitionHash = { [mockPartition]: { regions: [mockRegion, `${mockRegion}2`, `${mockRegion}3`], regionRegex: mockRegionRegex, variants: [{ hostname: mockHostname, tags: [] }], }, }; expect(getResolvedPartition(mockRegion, { partitionHash: mockPartitionHash })).toBe(mockPartition); }); it("returns aws if region is not present in any partition", () => { const mockPartitionHash: PartitionHash = { [`${mockPartition}2`]: { regions: [`${mockRegion}2`, `${mockRegion}3`], regionRegex: mockRegionRegex, variants: [{ hostname: mockHostname, tags: [] }], }, }; expect(getResolvedPartition(mockRegion, { partitionHash: mockPartitionHash })).toBe("aws"); }); it("returns aws if partitionHash is empty", () => { expect(getResolvedPartition(mockRegion, { partitionHash: undefined as any })).toBe("aws"); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedPartition.ts ================================================ import type { PartitionHash } from "./PartitionHash"; /** * @internal * @deprecated unused for endpointRuleSets. */ export interface GetResolvedPartitionOptions { partitionHash: PartitionHash; } /** * @internal * @deprecated unused for endpointRuleSets. */ export const getResolvedPartition = (region: string, { partitionHash }: GetResolvedPartitionOptions) => Object.keys(partitionHash || {}).find((key) => partitionHash[key].regions.includes(region)) ?? "aws"; ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedSigningRegion.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { getResolvedSigningRegion } from "./getResolvedSigningRegion"; describe(getResolvedSigningRegion.name, () => { const mockSigningRegion = "mockSigningRegion"; const mockHostname = "mockHostname"; const mockRegionRegex = "mockRegionRegex"; const mockOptions = { regionRegex: mockRegionRegex, useFipsEndpoint: false, }; it("returns signingRegion if passed in options", () => { expect(getResolvedSigningRegion(mockHostname, { ...mockOptions, signingRegion: mockSigningRegion })).toEqual( mockSigningRegion ); }); describe("returns undefined if signingRegion is not present and", () => { it("region is not FIPS", () => { expect(getResolvedSigningRegion(mockHostname, mockOptions)).not.toBeDefined(); }); it("regionRegex does not return a match in hostname", () => { const matchSpy = vi.spyOn(String.prototype, "match").mockReturnValueOnce(null); expect(getResolvedSigningRegion(mockHostname, { ...mockOptions, useFipsEndpoint: true })).not.toBeDefined(); expect(matchSpy).toHaveBeenCalledTimes(1); expect(matchSpy).toHaveBeenCalledWith(mockRegionRegex); }); it("region is not present between dots in a hostname", () => { const regionInHostname = "us-east-1"; expect( getResolvedSigningRegion(`test-${regionInHostname}.amazonaws.com`, { ...mockOptions, regionRegex: "^(us|eu|ap|sa|ca|me|af)\\-\\w+\\-\\d+$", }) ).not.toBeDefined(); }); }); it("returns region from hostname if signingRegion is not present", () => { const regionInHostname = "us-east-1"; expect( getResolvedSigningRegion(`test.${regionInHostname}.amazonaws.com`, { ...mockOptions, regionRegex: "^(us|eu|ap|sa|ca|me|af)\\-\\w+\\-\\d+$", useFipsEndpoint: true, }) ).toEqual(regionInHostname); }); }); ================================================ FILE: packages/core/src/submodules/config/config-resolver/regionInfo/getResolvedSigningRegion.ts ================================================ /** * @internal * @deprecated unused for endpointRuleSets. */ export interface GetResolvedSigningRegionOptions { regionRegex: string; signingRegion?: string; useFipsEndpoint: boolean; } /** * @internal * @deprecated unused for endpointRuleSets. */ export const getResolvedSigningRegion = ( hostname: string, { signingRegion, regionRegex, useFipsEndpoint }: GetResolvedSigningRegionOptions ) => { if (signingRegion) { return signingRegion; } else if (useFipsEndpoint) { const regionRegexJs = regionRegex.replace("\\\\", "\\").replace(/^\^/g, "\\.").replace(/\$$/g, "\\."); const regionRegexmatchArray = hostname.match(regionRegexJs); if (regionRegexmatchArray) { return regionRegexmatchArray[0].slice(1, -1); } } }; ================================================ FILE: packages/core/src/submodules/config/defaults-mode/CHANGELOG.browser.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.3.49 ### Patch Changes - @smithy/smithy-client@4.12.13 ## 4.3.48 ### Patch Changes - @smithy/smithy-client@4.12.12 ## 4.3.47 ### Patch Changes - Updated dependencies [b69e3c9] - @smithy/smithy-client@4.12.11 ## 4.3.46 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/smithy-client@4.12.10 - @smithy/types@4.14.1 - @smithy/property-provider@4.2.14 ## 4.3.45 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/property-provider@4.2.13 - @smithy/smithy-client@4.12.9 ## 4.3.44 ### Patch Changes - @smithy/smithy-client@4.12.8 ## 4.3.43 ### Patch Changes - @smithy/smithy-client@4.12.7 ## 4.3.42 ### Patch Changes - @smithy/smithy-client@4.12.6 ## 4.3.41 ### Patch Changes - @smithy/smithy-client@4.12.5 ## 4.3.40 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/smithy-client@4.12.4 - @smithy/property-provider@4.2.12 ## 4.3.39 ### Patch Changes - @smithy/smithy-client@4.12.3 ## 4.3.38 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/property-provider@4.2.11 - @smithy/smithy-client@4.12.2 ## 4.3.37 ### Patch Changes - @smithy/smithy-client@4.12.1 ## 4.3.36 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/smithy-client@4.12.0 - @smithy/types@4.13.0 - @smithy/property-provider@4.2.10 ## 4.3.35 ### Patch Changes - @smithy/smithy-client@4.11.8 ## 4.3.34 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/property-provider@4.2.9 - @smithy/smithy-client@4.11.7 - @smithy/types@4.12.1 ## 4.3.33 ### Patch Changes - @smithy/smithy-client@4.11.6 ## 4.3.32 ### Patch Changes - @smithy/smithy-client@4.11.5 ## 4.3.31 ### Patch Changes - @smithy/smithy-client@4.11.4 ## 4.3.30 ### Patch Changes - @smithy/smithy-client@4.11.3 ## 4.3.29 ### Patch Changes - @smithy/smithy-client@4.11.2 ## 4.3.28 ### Patch Changes - @smithy/smithy-client@4.11.1 ## 4.3.27 ### Patch Changes - Updated dependencies [75145e5] - @smithy/smithy-client@4.11.0 ## 4.3.26 ### Patch Changes - @smithy/smithy-client@4.10.12 ## 4.3.25 ### Patch Changes - @smithy/smithy-client@4.10.11 ## 4.3.24 ### Patch Changes - @smithy/smithy-client@4.10.10 ## 4.3.23 ### Patch Changes - @smithy/smithy-client@4.10.9 ## 4.3.22 ### Patch Changes - @smithy/smithy-client@4.10.8 ## 4.3.21 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/property-provider@4.2.8 - @smithy/smithy-client@4.10.7 ## 4.3.20 ### Patch Changes - @smithy/smithy-client@4.10.6 ## 4.3.19 ### Patch Changes - @smithy/smithy-client@4.10.5 ## 4.3.18 ### Patch Changes - @smithy/smithy-client@4.10.4 ## 4.3.17 ### Patch Changes - @smithy/smithy-client@4.10.3 ## 4.3.16 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/property-provider@4.2.7 - @smithy/smithy-client@4.10.2 ## 4.3.15 ### Patch Changes - Updated dependencies [f3a51c2] - @smithy/smithy-client@4.10.1 ## 4.3.14 ### Patch Changes - Updated dependencies [5a56762] - @smithy/smithy-client@4.10.0 - @smithy/types@4.10.0 - @smithy/property-provider@4.2.6 ## 4.3.13 ### Patch Changes - @smithy/smithy-client@4.9.10 ## 4.3.12 ### Patch Changes - @smithy/smithy-client@4.9.9 ## 4.3.11 ### Patch Changes - @smithy/smithy-client@4.9.8 ## 4.3.10 ### Patch Changes - @smithy/smithy-client@4.9.7 ## 4.3.9 ### Patch Changes - @smithy/smithy-client@4.9.6 ## 4.3.8 ### Patch Changes - @smithy/smithy-client@4.9.5 ## 4.3.7 ### Patch Changes - @smithy/smithy-client@4.9.4 ## 4.3.6 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/property-provider@4.2.5 - @smithy/smithy-client@4.9.3 ## 4.3.5 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/property-provider@4.2.4 - @smithy/smithy-client@4.9.2 ## 4.3.4 ### Patch Changes - @smithy/smithy-client@4.9.1 ## 4.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/smithy-client@4.9.0 - @smithy/types@4.8.0 - @smithy/property-provider@4.2.3 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/smithy-client@4.8.1 - @smithy/property-provider@4.2.2 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/smithy-client@4.8.0 - @smithy/property-provider@4.2.1 ## 4.3.0 ### Minor Changes - c1544be: remove bower from mobile device detection ### Patch Changes - @smithy/smithy-client@4.7.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/property-provider@4.2.0 - @smithy/smithy-client@4.7.0 - @smithy/types@4.6.0 ## 4.1.5 ### Patch Changes - @smithy/smithy-client@4.6.5 ## 4.1.4 ### Patch Changes - @smithy/smithy-client@4.6.4 ## 4.1.3 ### Patch Changes - @smithy/smithy-client@4.6.3 ## 4.1.2 ### Patch Changes - @smithy/smithy-client@4.6.2 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/property-provider@4.1.1 - @smithy/smithy-client@4.6.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/property-provider@4.1.0 - @smithy/smithy-client@4.6.0 - @smithy/types@4.4.0 ## 4.0.29 ### Patch Changes - @smithy/smithy-client@4.5.2 ## 4.0.28 ### Patch Changes - @smithy/smithy-client@4.5.1 ## 4.0.27 ### Patch Changes - Updated dependencies [eb1ab40] - @smithy/smithy-client@4.5.0 ## 4.0.26 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/smithy-client@4.4.10 - @smithy/property-provider@4.0.5 ## 4.0.25 ### Patch Changes - @smithy/smithy-client@4.4.9 ## 4.0.24 ### Patch Changes - @smithy/smithy-client@4.4.8 ## 4.0.23 ### Patch Changes - @smithy/smithy-client@4.4.7 ## 4.0.22 ### Patch Changes - @smithy/smithy-client@4.4.6 ## 4.0.21 ### Patch Changes - @smithy/smithy-client@4.4.5 ## 4.0.20 ### Patch Changes - @smithy/smithy-client@4.4.4 ## 4.0.19 ### Patch Changes - @smithy/smithy-client@4.4.3 ## 4.0.18 ### Patch Changes - @smithy/smithy-client@4.4.2 ## 4.0.17 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/property-provider@4.0.4 - @smithy/smithy-client@4.4.1 ## 4.0.16 ### Patch Changes - Updated dependencies [23812a9] - @smithy/smithy-client@4.4.0 ## 4.0.15 ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/smithy-client@4.3.0 - @smithy/property-provider@4.0.3 ## 4.0.14 ### Patch Changes - @smithy/smithy-client@4.2.6 ## 4.0.13 ### Patch Changes - @smithy/smithy-client@4.2.5 ## 4.0.12 ### Patch Changes - @smithy/smithy-client@4.2.4 ## 4.0.11 ### Patch Changes - @smithy/smithy-client@4.2.3 ## 4.0.10 ### Patch Changes - @smithy/smithy-client@4.2.2 ## 4.0.9 ### Patch Changes - @smithy/smithy-client@4.2.1 ## 4.0.8 ### Patch Changes - Updated dependencies [e917e61] - @smithy/smithy-client@4.2.0 - @smithy/types@4.2.0 - @smithy/property-provider@4.0.2 ## 4.0.7 ### Patch Changes - @smithy/smithy-client@4.1.6 ## 4.0.6 ### Patch Changes - @smithy/smithy-client@4.1.5 ## 4.0.5 ### Patch Changes - @smithy/smithy-client@4.1.4 ## 4.0.4 ### Patch Changes - @smithy/smithy-client@4.1.3 ## 4.0.3 ### Patch Changes - @smithy/smithy-client@4.1.2 ## 4.0.2 ### Patch Changes - Updated dependencies [e87f2b3] - @smithy/smithy-client@4.1.1 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - Updated dependencies [292c134] - @smithy/types@4.1.0 - @smithy/smithy-client@4.1.0 - @smithy/property-provider@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/smithy-client@4.0.0 - @smithy/property-provider@4.0.0 - @smithy/types@4.0.0 ## 3.0.34 ### Patch Changes - Updated dependencies [a0e71d5] - @smithy/smithy-client@3.7.0 ## 3.0.33 ### Patch Changes - Updated dependencies [23129d9] - @smithy/smithy-client@3.6.0 ## 3.0.32 ### Patch Changes - @smithy/smithy-client@3.5.2 ## 3.0.31 ### Patch Changes - Updated dependencies [7f17426] - @smithy/smithy-client@3.5.1 ## 3.0.30 ### Patch Changes - Updated dependencies [70275bd] - @smithy/smithy-client@3.5.0 ## 3.0.29 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/property-provider@3.1.11 - @smithy/smithy-client@3.4.6 ## 3.0.28 ### Patch Changes - @smithy/smithy-client@3.4.5 ## 3.0.27 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/property-provider@3.1.10 - @smithy/smithy-client@3.4.4 ## 3.0.26 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/smithy-client@3.4.3 - @smithy/property-provider@3.1.9 ## 3.0.25 ### Patch Changes - @smithy/smithy-client@3.4.2 ## 3.0.24 ### Patch Changes - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/smithy-client@3.4.1 - @smithy/property-provider@3.1.8 ## 3.0.23 ### Patch Changes - Updated dependencies [75e0125] - @smithy/smithy-client@3.4.0 ## 3.0.22 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/property-provider@3.1.7 - @smithy/smithy-client@3.3.6 ## 3.0.21 ### Patch Changes - Updated dependencies [64600d8] - @smithy/smithy-client@3.3.5 ## 3.0.20 ### Patch Changes - @smithy/smithy-client@3.3.4 ## 3.0.19 ### Patch Changes - @smithy/smithy-client@3.3.3 ## 3.0.18 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/property-provider@3.1.6 - @smithy/smithy-client@3.3.2 ## 3.0.17 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/property-provider@3.1.5 - @smithy/smithy-client@3.3.1 ## 3.0.16 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [d8df7bf] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/smithy-client@3.3.0 - @smithy/property-provider@3.1.4 ## 3.0.15 ### Patch Changes - Updated dependencies [5865b65] - @smithy/smithy-client@3.2.0 ## 3.0.14 ### Patch Changes - Updated dependencies [670553a] - @smithy/smithy-client@3.1.12 ## 3.0.13 ### Patch Changes - @smithy/smithy-client@3.1.11 ## 3.0.12 ### Patch Changes - @smithy/smithy-client@3.1.10 ## 3.0.11 ### Patch Changes - @smithy/smithy-client@3.1.9 ## 3.0.10 ### Patch Changes - @smithy/smithy-client@3.1.8 ## 3.0.9 ### Patch Changes - @smithy/smithy-client@3.1.7 ## 3.0.8 ### Patch Changes - @smithy/smithy-client@3.1.6 ## 3.0.7 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/property-provider@3.1.3 - @smithy/smithy-client@3.1.5 ## 3.0.6 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/property-provider@3.1.2 - @smithy/smithy-client@3.1.4 ## 3.0.5 ### Patch Changes - @smithy/smithy-client@3.1.3 ## 3.0.4 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/property-provider@3.1.1 - @smithy/smithy-client@3.1.2 ## 3.0.3 ### Patch Changes - Updated dependencies [3689c949] - @smithy/smithy-client@3.1.1 ## 3.0.2 ### Patch Changes - Updated dependencies [1cdd3be0] - Updated dependencies [764047eb] - @smithy/property-provider@3.1.0 - @smithy/smithy-client@3.1.0 ## 3.0.1 ### Patch Changes - @smithy/smithy-client@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/property-provider@3.0.0 - @smithy/smithy-client@3.0.0 ## 2.2.1 ### Patch Changes - @smithy/smithy-client@2.5.1 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/property-provider@2.2.0 - @smithy/smithy-client@2.5.0 - @smithy/types@2.12.0 ## 2.1.7 ### Patch Changes - @smithy/smithy-client@2.4.5 ## 2.1.6 ### Patch Changes - @smithy/smithy-client@2.4.4 ## 2.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/property-provider@2.1.4 - @smithy/smithy-client@2.4.3 ## 2.1.4 ### Patch Changes - @smithy/smithy-client@2.4.2 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/property-provider@2.1.3 - @smithy/smithy-client@2.4.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/smithy-client@2.4.0 - @smithy/property-provider@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/property-provider@2.1.1 - @smithy/smithy-client@2.3.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/property-provider@2.1.0 - @smithy/smithy-client@2.3.0 - @smithy/types@2.9.0 ## 2.0.24 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/smithy-client@2.2.1 - @smithy/property-provider@2.0.17 ## 2.0.23 ### Patch Changes - Updated dependencies [164f3bbd] - Updated dependencies [164f3bbd] - @smithy/smithy-client@2.2.0 ## 2.0.22 ### Patch Changes - @smithy/smithy-client@2.1.18 ## 2.0.21 ### Patch Changes - Updated dependencies [07ff207b] - Updated dependencies [340634a5] - @smithy/smithy-client@2.1.17 - @smithy/types@2.7.0 - @smithy/property-provider@2.0.16 ## 2.0.20 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/property-provider@2.0.15 - @smithy/smithy-client@2.1.16 ## 2.0.19 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/property-provider@2.0.14 - @smithy/smithy-client@2.1.15 ## 2.0.18 ### Patch Changes - @smithy/smithy-client@2.1.14 ## 2.0.17 ### Patch Changes - 5598a033: update bundler replacement directives in package.json - @smithy/smithy-client@2.1.13 ## 2.0.16 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/property-provider@2.0.13 - @smithy/smithy-client@2.1.12 ## 2.0.15 ### Patch Changes - @smithy/smithy-client@2.1.11 ## 2.0.14 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/property-provider@2.0.12 - @smithy/smithy-client@2.1.10 ## 2.0.13 ### Patch Changes - @smithy/smithy-client@2.1.9 ## 2.0.12 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/smithy-client@2.1.8 - @smithy/property-provider@2.0.11 ## 2.0.11 ### Patch Changes - @smithy/smithy-client@2.1.7 ## 2.0.10 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/smithy-client@2.1.6 - @smithy/property-provider@2.0.10 ## 2.0.9 ### Patch Changes - e6ea6bd5: move devDeps into deps - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/property-provider@2.0.9 - @smithy/smithy-client@2.1.5 ## 2.0.8 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/property-provider@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/property-provider@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [a7598a5d] - @smithy/property-provider@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/property-provider@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/property-provider@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/property-provider@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/property-provider@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/property-provider@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/property-provider@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/property-provider@1.2.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [4ad43c6a] - Updated dependencies [d90a45b5] - Updated dependencies [5f7bcc79] - @smithy/types@2.0.0 - @smithy/property-provider@1.1.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/property-provider@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/property-provider@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-defaults-mode-browser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-defaults-mode-browser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/defaults-mode/CHANGELOG.node.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.2.54 ### Patch Changes - @smithy/smithy-client@4.12.13 ## 4.2.53 ### Patch Changes - @smithy/smithy-client@4.12.12 - @smithy/config-resolver@4.4.17 ## 4.2.52 ### Patch Changes - Updated dependencies [b69e3c9] - @smithy/smithy-client@4.12.11 ## 4.2.51 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/smithy-client@4.12.10 - @smithy/types@4.14.1 - @smithy/config-resolver@4.4.16 - @smithy/credential-provider-imds@4.2.14 - @smithy/node-config-provider@4.3.14 - @smithy/property-provider@4.2.14 ## 4.2.50 ### Patch Changes - @smithy/config-resolver@4.4.15 ## 4.2.49 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/config-resolver@4.4.14 - @smithy/credential-provider-imds@4.2.13 - @smithy/node-config-provider@4.3.13 - @smithy/property-provider@4.2.13 - @smithy/smithy-client@4.12.9 ## 4.2.48 ### Patch Changes - @smithy/smithy-client@4.12.8 ## 4.2.47 ### Patch Changes - Updated dependencies [b1f0dba] - @smithy/config-resolver@4.4.13 - @smithy/smithy-client@4.12.7 ## 4.2.46 ### Patch Changes - Updated dependencies [4b5602d] - @smithy/config-resolver@4.4.12 ## 4.2.45 ### Patch Changes - @smithy/smithy-client@4.12.6 ## 4.2.44 ### Patch Changes - @smithy/smithy-client@4.12.5 ## 4.2.43 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/smithy-client@4.12.4 - @smithy/config-resolver@4.4.11 - @smithy/credential-provider-imds@4.2.12 - @smithy/node-config-provider@4.3.12 - @smithy/property-provider@4.2.12 ## 4.2.42 ### Patch Changes - @smithy/smithy-client@4.12.3 ## 4.2.41 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/credential-provider-imds@4.2.11 - @smithy/node-config-provider@4.3.11 - @smithy/property-provider@4.2.11 - @smithy/config-resolver@4.4.10 - @smithy/smithy-client@4.12.2 ## 4.2.40 ### Patch Changes - @smithy/smithy-client@4.12.1 ## 4.2.39 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/smithy-client@4.12.0 - @smithy/types@4.13.0 - @smithy/config-resolver@4.4.9 - @smithy/credential-provider-imds@4.2.10 - @smithy/node-config-provider@4.3.10 - @smithy/property-provider@4.2.10 ## 4.2.38 ### Patch Changes - @smithy/smithy-client@4.11.8 - @smithy/config-resolver@4.4.8 ## 4.2.37 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/config-resolver@4.4.7 - @smithy/credential-provider-imds@4.2.9 - @smithy/node-config-provider@4.3.9 - @smithy/property-provider@4.2.9 - @smithy/smithy-client@4.11.7 - @smithy/types@4.12.1 ## 4.2.36 ### Patch Changes - @smithy/smithy-client@4.11.6 ## 4.2.35 ### Patch Changes - @smithy/smithy-client@4.11.5 ## 4.2.34 ### Patch Changes - @smithy/smithy-client@4.11.4 ## 4.2.33 ### Patch Changes - @smithy/smithy-client@4.11.3 ## 4.2.32 ### Patch Changes - @smithy/smithy-client@4.11.2 ## 4.2.31 ### Patch Changes - @smithy/smithy-client@4.11.1 ## 4.2.30 ### Patch Changes - Updated dependencies [75145e5] - @smithy/smithy-client@4.11.0 ## 4.2.29 ### Patch Changes - @smithy/smithy-client@4.10.12 ## 4.2.28 ### Patch Changes - @smithy/smithy-client@4.10.11 ## 4.2.27 ### Patch Changes - @smithy/smithy-client@4.10.10 ## 4.2.26 ### Patch Changes - @smithy/smithy-client@4.10.9 ## 4.2.25 ### Patch Changes - @smithy/smithy-client@4.10.8 ## 4.2.24 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/config-resolver@4.4.6 - @smithy/credential-provider-imds@4.2.8 - @smithy/node-config-provider@4.3.8 - @smithy/property-provider@4.2.8 - @smithy/smithy-client@4.10.7 ## 4.2.23 ### Patch Changes - @smithy/smithy-client@4.10.6 ## 4.2.22 ### Patch Changes - @smithy/smithy-client@4.10.5 ## 4.2.21 ### Patch Changes - @smithy/smithy-client@4.10.4 ## 4.2.20 ### Patch Changes - @smithy/smithy-client@4.10.3 ## 4.2.19 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/config-resolver@4.4.5 - @smithy/credential-provider-imds@4.2.7 - @smithy/node-config-provider@4.3.7 - @smithy/property-provider@4.2.7 - @smithy/smithy-client@4.10.2 ## 4.2.18 ### Patch Changes - Updated dependencies [f3a51c2] - @smithy/smithy-client@4.10.1 ## 4.2.17 ### Patch Changes - Updated dependencies [5a56762] - @smithy/smithy-client@4.10.0 - @smithy/types@4.10.0 - @smithy/config-resolver@4.4.4 - @smithy/credential-provider-imds@4.2.6 - @smithy/node-config-provider@4.3.6 - @smithy/property-provider@4.2.6 ## 4.2.16 ### Patch Changes - @smithy/smithy-client@4.9.10 ## 4.2.15 ### Patch Changes - @smithy/smithy-client@4.9.9 ## 4.2.14 ### Patch Changes - @smithy/smithy-client@4.9.8 ## 4.2.13 ### Patch Changes - @smithy/smithy-client@4.9.7 ## 4.2.12 ### Patch Changes - @smithy/smithy-client@4.9.6 ## 4.2.11 ### Patch Changes - @smithy/smithy-client@4.9.5 ## 4.2.10 ### Patch Changes - @smithy/smithy-client@4.9.4 ## 4.2.9 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/config-resolver@4.4.3 - @smithy/credential-provider-imds@4.2.5 - @smithy/node-config-provider@4.3.5 - @smithy/property-provider@4.2.5 - @smithy/smithy-client@4.9.3 ## 4.2.8 ### Patch Changes - Updated dependencies [372b46f] - @smithy/config-resolver@4.4.2 ## 4.2.7 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/config-resolver@4.4.1 - @smithy/credential-provider-imds@4.2.4 - @smithy/node-config-provider@4.3.4 - @smithy/property-provider@4.2.4 - @smithy/smithy-client@4.9.2 ## 4.2.6 ### Patch Changes - @smithy/smithy-client@4.9.1 ## 4.2.5 ### Patch Changes - Updated dependencies [13c5cd9] - @smithy/config-resolver@4.4.0 ## 4.2.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/smithy-client@4.9.0 - @smithy/types@4.8.0 - @smithy/config-resolver@4.3.3 - @smithy/credential-provider-imds@4.2.3 - @smithy/node-config-provider@4.3.3 - @smithy/property-provider@4.2.3 ## 4.2.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/smithy-client@4.8.1 - @smithy/config-resolver@4.3.2 - @smithy/credential-provider-imds@4.2.2 - @smithy/node-config-provider@4.3.2 - @smithy/property-provider@4.2.2 ## 4.2.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/smithy-client@4.8.0 - @smithy/config-resolver@4.3.1 - @smithy/credential-provider-imds@4.2.1 - @smithy/node-config-provider@4.3.1 - @smithy/property-provider@4.2.1 ## 4.2.1 ### Patch Changes - @smithy/smithy-client@4.7.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/config-resolver@4.3.0 - @smithy/credential-provider-imds@4.2.0 - @smithy/node-config-provider@4.3.0 - @smithy/property-provider@4.2.0 - @smithy/smithy-client@4.7.0 - @smithy/types@4.6.0 ## 4.1.5 ### Patch Changes - @smithy/smithy-client@4.6.5 ## 4.1.4 ### Patch Changes - @smithy/smithy-client@4.6.4 ## 4.1.3 ### Patch Changes - @smithy/smithy-client@4.6.3 ## 4.1.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 - @smithy/smithy-client@4.6.2 - @smithy/config-resolver@4.2.2 - @smithy/credential-provider-imds@4.1.2 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/config-resolver@4.2.1 - @smithy/credential-provider-imds@4.1.1 - @smithy/node-config-provider@4.2.1 - @smithy/property-provider@4.1.1 - @smithy/smithy-client@4.6.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/credential-provider-imds@4.1.0 - @smithy/node-config-provider@4.2.0 - @smithy/property-provider@4.1.0 - @smithy/config-resolver@4.2.0 - @smithy/smithy-client@4.6.0 - @smithy/types@4.4.0 ## 4.0.29 ### Patch Changes - @smithy/smithy-client@4.5.2 ## 4.0.28 ### Patch Changes - @smithy/smithy-client@4.5.1 ## 4.0.27 ### Patch Changes - Updated dependencies [eb1ab40] - @smithy/smithy-client@4.5.0 ## 4.0.26 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/smithy-client@4.4.10 - @smithy/config-resolver@4.1.5 - @smithy/credential-provider-imds@4.0.7 - @smithy/node-config-provider@4.1.4 - @smithy/property-provider@4.0.5 ## 4.0.25 ### Patch Changes - @smithy/smithy-client@4.4.9 ## 4.0.24 ### Patch Changes - @smithy/smithy-client@4.4.8 ## 4.0.23 ### Patch Changes - @smithy/smithy-client@4.4.7 ## 4.0.22 ### Patch Changes - @smithy/smithy-client@4.4.6 ## 4.0.21 ### Patch Changes - @smithy/smithy-client@4.4.5 ## 4.0.20 ### Patch Changes - @smithy/smithy-client@4.4.4 ## 4.0.19 ### Patch Changes - @smithy/smithy-client@4.4.3 ## 4.0.18 ### Patch Changes - @smithy/smithy-client@4.4.2 ## 4.0.17 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/config-resolver@4.1.4 - @smithy/credential-provider-imds@4.0.6 - @smithy/node-config-provider@4.1.3 - @smithy/property-provider@4.0.4 - @smithy/smithy-client@4.4.1 ## 4.0.16 ### Patch Changes - Updated dependencies [23812a9] - @smithy/smithy-client@4.4.0 ## 4.0.15 ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/smithy-client@4.3.0 - @smithy/config-resolver@4.1.3 - @smithy/credential-provider-imds@4.0.5 - @smithy/node-config-provider@4.1.2 - @smithy/property-provider@4.0.3 ## 4.0.14 ### Patch Changes - @smithy/smithy-client@4.2.6 ## 4.0.13 ### Patch Changes - @smithy/smithy-client@4.2.5 ## 4.0.12 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 - @smithy/config-resolver@4.1.2 - @smithy/credential-provider-imds@4.0.4 - @smithy/smithy-client@4.2.4 ## 4.0.11 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 - @smithy/config-resolver@4.1.1 - @smithy/credential-provider-imds@4.0.3 - @smithy/smithy-client@4.2.3 ## 4.0.10 ### Patch Changes - @smithy/smithy-client@4.2.2 ## 4.0.9 ### Patch Changes - @smithy/smithy-client@4.2.1 ## 4.0.8 ### Patch Changes - Updated dependencies [e917e61] - @smithy/config-resolver@4.1.0 - @smithy/smithy-client@4.2.0 - @smithy/types@4.2.0 - @smithy/credential-provider-imds@4.0.2 - @smithy/node-config-provider@4.0.2 - @smithy/property-provider@4.0.2 ## 4.0.7 ### Patch Changes - @smithy/smithy-client@4.1.6 ## 4.0.6 ### Patch Changes - @smithy/smithy-client@4.1.5 ## 4.0.5 ### Patch Changes - @smithy/smithy-client@4.1.4 ## 4.0.4 ### Patch Changes - @smithy/smithy-client@4.1.3 ## 4.0.3 ### Patch Changes - @smithy/smithy-client@4.1.2 ## 4.0.2 ### Patch Changes - Updated dependencies [e87f2b3] - @smithy/smithy-client@4.1.1 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - Updated dependencies [292c134] - @smithy/types@4.1.0 - @smithy/smithy-client@4.1.0 - @smithy/config-resolver@4.0.1 - @smithy/credential-provider-imds@4.0.1 - @smithy/node-config-provider@4.0.1 - @smithy/property-provider@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/credential-provider-imds@4.0.0 - @smithy/node-config-provider@4.0.0 - @smithy/config-resolver@4.0.0 - @smithy/smithy-client@4.0.0 - @smithy/property-provider@4.0.0 - @smithy/types@4.0.0 ## 3.0.34 ### Patch Changes - Updated dependencies [a0e71d5] - @smithy/smithy-client@3.7.0 ## 3.0.33 ### Patch Changes - Updated dependencies [23129d9] - @smithy/smithy-client@3.6.0 ## 3.0.32 ### Patch Changes - @smithy/smithy-client@3.5.2 ## 3.0.31 ### Patch Changes - Updated dependencies [7f17426] - @smithy/smithy-client@3.5.1 ## 3.0.30 ### Patch Changes - Updated dependencies [70275bd] - @smithy/smithy-client@3.5.0 ## 3.0.29 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/config-resolver@3.0.13 - @smithy/credential-provider-imds@3.2.8 - @smithy/node-config-provider@3.1.12 - @smithy/property-provider@3.1.11 - @smithy/smithy-client@3.4.6 ## 3.0.28 ### Patch Changes - @smithy/smithy-client@3.4.5 ## 3.0.27 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/config-resolver@3.0.12 - @smithy/credential-provider-imds@3.2.7 - @smithy/node-config-provider@3.1.11 - @smithy/property-provider@3.1.10 - @smithy/smithy-client@3.4.4 ## 3.0.26 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/smithy-client@3.4.3 - @smithy/config-resolver@3.0.11 - @smithy/credential-provider-imds@3.2.6 - @smithy/node-config-provider@3.1.10 - @smithy/property-provider@3.1.9 ## 3.0.25 ### Patch Changes - @smithy/smithy-client@3.4.2 ## 3.0.24 ### Patch Changes - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/smithy-client@3.4.1 - @smithy/config-resolver@3.0.10 - @smithy/credential-provider-imds@3.2.5 - @smithy/node-config-provider@3.1.9 - @smithy/property-provider@3.1.8 ## 3.0.23 ### Patch Changes - Updated dependencies [75e0125] - @smithy/smithy-client@3.4.0 ## 3.0.22 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/config-resolver@3.0.9 - @smithy/credential-provider-imds@3.2.4 - @smithy/node-config-provider@3.1.8 - @smithy/property-provider@3.1.7 - @smithy/smithy-client@3.3.6 ## 3.0.21 ### Patch Changes - Updated dependencies [64600d8] - @smithy/smithy-client@3.3.5 ## 3.0.20 ### Patch Changes - @smithy/smithy-client@3.3.4 ## 3.0.19 ### Patch Changes - @smithy/smithy-client@3.3.3 ## 3.0.18 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/config-resolver@3.0.8 - @smithy/credential-provider-imds@3.2.3 - @smithy/node-config-provider@3.1.7 - @smithy/property-provider@3.1.6 - @smithy/smithy-client@3.3.2 ## 3.0.17 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/config-resolver@3.0.7 - @smithy/credential-provider-imds@3.2.2 - @smithy/node-config-provider@3.1.6 - @smithy/property-provider@3.1.5 - @smithy/smithy-client@3.3.1 ## 3.0.16 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [d8df7bf] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/smithy-client@3.3.0 - @smithy/config-resolver@3.0.6 - @smithy/credential-provider-imds@3.2.1 - @smithy/node-config-provider@3.1.5 - @smithy/property-provider@3.1.4 ## 3.0.15 ### Patch Changes - Updated dependencies [5865b65] - @smithy/smithy-client@3.2.0 ## 3.0.14 ### Patch Changes - Updated dependencies [670553a] - @smithy/smithy-client@3.1.12 ## 3.0.13 ### Patch Changes - @smithy/smithy-client@3.1.11 ## 3.0.12 ### Patch Changes - Updated dependencies [3d72b04] - @smithy/credential-provider-imds@3.2.0 - @smithy/smithy-client@3.1.10 ## 3.0.11 ### Patch Changes - @smithy/smithy-client@3.1.9 ## 3.0.10 ### Patch Changes - @smithy/smithy-client@3.1.8 ## 3.0.9 ### Patch Changes - @smithy/node-config-provider@3.1.4 - @smithy/smithy-client@3.1.7 - @smithy/config-resolver@3.0.5 - @smithy/credential-provider-imds@3.1.4 ## 3.0.8 ### Patch Changes - @smithy/smithy-client@3.1.6 ## 3.0.7 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/config-resolver@3.0.4 - @smithy/credential-provider-imds@3.1.3 - @smithy/node-config-provider@3.1.3 - @smithy/property-provider@3.1.3 - @smithy/smithy-client@3.1.5 ## 3.0.6 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/config-resolver@3.0.3 - @smithy/credential-provider-imds@3.1.2 - @smithy/node-config-provider@3.1.2 - @smithy/property-provider@3.1.2 - @smithy/smithy-client@3.1.4 ## 3.0.5 ### Patch Changes - @smithy/smithy-client@3.1.3 ## 3.0.4 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/config-resolver@3.0.2 - @smithy/credential-provider-imds@3.1.1 - @smithy/node-config-provider@3.1.1 - @smithy/property-provider@3.1.1 - @smithy/smithy-client@3.1.2 ## 3.0.3 ### Patch Changes - Updated dependencies [3689c949] - @smithy/smithy-client@3.1.1 ## 3.0.2 ### Patch Changes - Updated dependencies [1cdd3be0] - Updated dependencies [764047eb] - @smithy/credential-provider-imds@3.1.0 - @smithy/node-config-provider@3.1.0 - @smithy/property-provider@3.1.0 - @smithy/smithy-client@3.1.0 - @smithy/config-resolver@3.0.1 ## 3.0.1 ### Patch Changes - @smithy/smithy-client@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/credential-provider-imds@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/property-provider@3.0.0 - @smithy/config-resolver@3.0.0 - @smithy/smithy-client@3.0.0 ## 2.3.1 ### Patch Changes - @smithy/smithy-client@2.5.1 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/credential-provider-imds@2.3.0 - @smithy/node-config-provider@2.3.0 - @smithy/property-provider@2.2.0 - @smithy/config-resolver@2.2.0 - @smithy/smithy-client@2.5.0 - @smithy/types@2.12.0 ## 2.2.7 ### Patch Changes - @smithy/smithy-client@2.4.5 ## 2.2.6 ### Patch Changes - @smithy/smithy-client@2.4.4 ## 2.2.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/config-resolver@2.1.5 - @smithy/credential-provider-imds@2.2.6 - @smithy/node-config-provider@2.2.5 - @smithy/property-provider@2.1.4 - @smithy/smithy-client@2.4.3 ## 2.2.4 ### Patch Changes - Updated dependencies [eea7af7d] - Updated dependencies [e136eb93] - @smithy/credential-provider-imds@2.2.5 ## 2.2.3 ### Patch Changes - @smithy/node-config-provider@2.2.4 - @smithy/smithy-client@2.4.2 - @smithy/config-resolver@2.1.4 - @smithy/credential-provider-imds@2.2.4 ## 2.2.2 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/config-resolver@2.1.3 - @smithy/credential-provider-imds@2.2.3 - @smithy/node-config-provider@2.2.3 - @smithy/property-provider@2.1.3 - @smithy/smithy-client@2.4.1 ## 2.2.1 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/smithy-client@2.4.0 - @smithy/config-resolver@2.1.2 - @smithy/credential-provider-imds@2.2.2 - @smithy/node-config-provider@2.2.2 - @smithy/property-provider@2.1.2 ## 2.2.0 ### Minor Changes - 280ef3a9: defer loading of credential-provider-imds in util-defaults-mode-node ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/config-resolver@2.1.1 - @smithy/credential-provider-imds@2.2.1 - @smithy/node-config-provider@2.2.1 - @smithy/property-provider@2.1.1 - @smithy/smithy-client@2.3.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/credential-provider-imds@2.2.0 - @smithy/node-config-provider@2.2.0 - @smithy/property-provider@2.1.0 - @smithy/config-resolver@2.1.0 - @smithy/smithy-client@2.3.0 - @smithy/types@2.9.0 ## 2.0.32 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/smithy-client@2.2.1 - @smithy/config-resolver@2.0.23 - @smithy/credential-provider-imds@2.1.5 - @smithy/node-config-provider@2.1.9 - @smithy/property-provider@2.0.17 ## 2.0.31 ### Patch Changes - @smithy/config-resolver@2.0.22 ## 2.0.30 ### Patch Changes - Updated dependencies [164f3bbd] - Updated dependencies [164f3bbd] - @smithy/smithy-client@2.2.0 ## 2.0.29 ### Patch Changes - @smithy/node-config-provider@2.1.8 - @smithy/config-resolver@2.0.21 - @smithy/credential-provider-imds@2.1.4 ## 2.0.28 ### Patch Changes - @smithy/smithy-client@2.1.18 ## 2.0.27 ### Patch Changes - Updated dependencies [07ff207b] - Updated dependencies [340634a5] - @smithy/smithy-client@2.1.17 - @smithy/types@2.7.0 - @smithy/config-resolver@2.0.20 - @smithy/credential-provider-imds@2.1.3 - @smithy/node-config-provider@2.1.7 - @smithy/property-provider@2.0.16 ## 2.0.26 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/config-resolver@2.0.19 - @smithy/credential-provider-imds@2.1.2 - @smithy/node-config-provider@2.1.6 - @smithy/property-provider@2.0.15 - @smithy/smithy-client@2.1.16 ## 2.0.25 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/config-resolver@2.0.18 - @smithy/credential-provider-imds@2.1.1 - @smithy/node-config-provider@2.1.5 - @smithy/property-provider@2.0.14 - @smithy/smithy-client@2.1.15 ## 2.0.24 ### Patch Changes - @smithy/smithy-client@2.1.14 ## 2.0.23 ### Patch Changes - @smithy/smithy-client@2.1.13 ## 2.0.22 ### Patch Changes - Updated dependencies [4693031d] - @smithy/credential-provider-imds@2.1.0 - @smithy/node-config-provider@2.1.4 - @smithy/config-resolver@2.0.17 ## 2.0.21 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/config-resolver@2.0.16 - @smithy/credential-provider-imds@2.0.18 - @smithy/node-config-provider@2.1.3 - @smithy/property-provider@2.0.13 - @smithy/smithy-client@2.1.12 ## 2.0.20 ### Patch Changes - @smithy/node-config-provider@2.1.2 - @smithy/config-resolver@2.0.15 - @smithy/credential-provider-imds@2.0.17 ## 2.0.19 ### Patch Changes - @smithy/smithy-client@2.1.11 ## 2.0.18 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/config-resolver@2.0.14 - @smithy/credential-provider-imds@2.0.16 - @smithy/node-config-provider@2.1.1 - @smithy/property-provider@2.0.12 - @smithy/smithy-client@2.1.10 ## 2.0.17 ### Patch Changes - Updated dependencies [7b568c39] - @smithy/node-config-provider@2.1.0 - @smithy/config-resolver@2.0.13 - @smithy/credential-provider-imds@2.0.15 ## 2.0.16 ### Patch Changes - @smithy/node-config-provider@2.0.14 - @smithy/config-resolver@2.0.12 - @smithy/credential-provider-imds@2.0.14 ## 2.0.15 ### Patch Changes - @smithy/smithy-client@2.1.9 ## 2.0.14 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/smithy-client@2.1.8 - @smithy/config-resolver@2.0.11 - @smithy/credential-provider-imds@2.0.13 - @smithy/node-config-provider@2.0.13 - @smithy/property-provider@2.0.11 ## 2.0.13 ### Patch Changes - @smithy/smithy-client@2.1.7 ## 2.0.12 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/smithy-client@2.1.6 - @smithy/config-resolver@2.0.10 - @smithy/credential-provider-imds@2.0.12 - @smithy/node-config-provider@2.0.12 - @smithy/property-provider@2.0.10 ## 2.0.11 ### Patch Changes - e6ea6bd5: move devDeps into deps - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/config-resolver@2.0.9 - @smithy/credential-provider-imds@2.0.11 - @smithy/node-config-provider@2.0.11 - @smithy/property-provider@2.0.9 - @smithy/smithy-client@2.1.5 ## 2.0.10 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/config-resolver@2.0.8 - @smithy/credential-provider-imds@2.0.10 - @smithy/node-config-provider@2.0.10 - @smithy/property-provider@2.0.8 ## 2.0.9 ### Patch Changes - Updated dependencies [d3daa891] - @smithy/config-resolver@2.0.7 - @smithy/node-config-provider@2.0.9 - @smithy/credential-provider-imds@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/config-resolver@2.0.6 - @smithy/credential-provider-imds@2.0.8 - @smithy/node-config-provider@2.0.8 - @smithy/property-provider@2.0.7 ## 2.0.7 ### Patch Changes - @smithy/node-config-provider@2.0.7 - @smithy/config-resolver@2.0.5 - @smithy/credential-provider-imds@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [a7598a5d] - @smithy/property-provider@2.0.6 - @smithy/credential-provider-imds@2.0.6 - @smithy/node-config-provider@2.0.6 - @smithy/config-resolver@2.0.5 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/config-resolver@2.0.5 - @smithy/credential-provider-imds@2.0.5 - @smithy/node-config-provider@2.0.5 - @smithy/property-provider@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/config-resolver@2.0.4 - @smithy/credential-provider-imds@2.0.4 - @smithy/node-config-provider@2.0.4 - @smithy/property-provider@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/config-resolver@2.0.3 - @smithy/credential-provider-imds@2.0.3 - @smithy/node-config-provider@2.0.3 - @smithy/property-provider@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/config-resolver@2.0.2 - @smithy/credential-provider-imds@2.0.2 - @smithy/node-config-provider@2.0.2 - @smithy/property-provider@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/config-resolver@2.0.1 - @smithy/credential-provider-imds@2.0.1 - @smithy/node-config-provider@2.0.1 - @smithy/property-provider@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/config-resolver@2.0.0 - @smithy/credential-provider-imds@2.0.0 - @smithy/node-config-provider@2.0.0 - @smithy/property-provider@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/config-resolver@1.1.0 - @smithy/credential-provider-imds@1.1.0 - @smithy/node-config-provider@1.1.0 - @smithy/property-provider@1.2.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [4ad43c6a] - Updated dependencies [d90a45b5] - Updated dependencies [5f7bcc79] - @smithy/types@2.0.0 - @smithy/property-provider@1.1.0 - @smithy/config-resolver@1.0.3 - @smithy/credential-provider-imds@1.0.3 - @smithy/node-config-provider@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/credential-provider-imds@1.0.2 - @smithy/node-config-provider@1.0.2 - @smithy/property-provider@1.0.2 - @smithy/config-resolver@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/credential-provider-imds@1.0.1 - @smithy/node-config-provider@1.0.1 - @smithy/property-provider@1.0.1 - @smithy/config-resolver@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-defaults-mode-node](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-defaults-mode-node/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/defaults-mode/constants.ts ================================================ /** * @internal */ export const AWS_EXECUTION_ENV = "AWS_EXECUTION_ENV"; /** * @internal */ export const AWS_REGION_ENV = "AWS_REGION"; /** * @internal */ export const AWS_DEFAULT_REGION_ENV = "AWS_DEFAULT_REGION"; /** * @internal */ export const ENV_IMDS_DISABLED = "AWS_EC2_METADATA_DISABLED"; /** * @internal */ export const DEFAULTS_MODE_OPTIONS = ["in-region", "cross-region", "mobile", "standard", "legacy"]; /** * @internal */ export const IMDS_REGION_PATH = "/latest/meta-data/placement/region"; ================================================ FILE: packages/core/src/submodules/config/defaults-mode/defaultsModeConfig.ts ================================================ import type { DefaultsMode } from "@smithy/core/client"; import type { LoadedConfigSelectors } from "../node-config-provider/configLoader"; const AWS_DEFAULTS_MODE_ENV = "AWS_DEFAULTS_MODE"; const AWS_DEFAULTS_MODE_CONFIG = "defaults_mode"; /** * @internal */ export const NODE_DEFAULTS_MODE_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => { return env[AWS_DEFAULTS_MODE_ENV] as DefaultsMode; }, configFileSelector: (profile) => { return profile[AWS_DEFAULTS_MODE_CONFIG] as DefaultsMode; }, default: "legacy", }; ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.browser.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { DEFAULTS_MODE_OPTIONS } from "./constants"; import { resolveDefaultsModeConfig } from "./resolveDefaultsModeConfig.browser"; /** * @internal */ type NavigatorTestAugment = Navigator & { userAgentData?: { mobile?: boolean; }; connection?: { effectiveType?: "4g" | string; rtt?: number; downlink?: number; }; }; describe("resolveDefaultsModeConfig", () => { const uaSpy = vi.spyOn(window.navigator, "userAgent", "get").mockReturnValue("some UA"); beforeEach(() => { const navigator = window.navigator as NavigatorTestAugment; if (!navigator.userAgentData || !navigator.connection) { navigator.userAgentData = {}; navigator.connection = {}; } }); afterEach(() => { const navigator = window.navigator as NavigatorTestAugment; delete navigator.userAgentData; delete navigator.connection; uaSpy.mockClear(); }); it("should default to legacy", async () => { expect(await resolveDefaultsModeConfig({})()).toBe("legacy"); expect(await resolveDefaultsModeConfig()()).toBe("legacy"); }); it.each(DEFAULTS_MODE_OPTIONS)("should resolve %s mode", async (mode) => { expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })()).toBe(mode); }); it("should resolve auto mode to mobile if platform is mobile", async () => { vi.spyOn(window.navigator as NavigatorTestAugment, "userAgentData", "get").mockReturnValue({ mobile: true, }); expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve("auto") })()).toBe("mobile"); }); it("should resolve auto mode to mobile if connection is not 4g (5g is not possible in this enum)", async () => { vi.spyOn(window.navigator as NavigatorTestAugment, "connection", "get").mockReturnValue({ effectiveType: "3g", }); expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve("auto") })()).toBe("mobile"); }); it("should resolve auto mode to standard if platform not mobile or tablet", async () => { expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve("auto") })()).toBe("standard"); }); it("should memoize the response", async () => { const defaultsMode = resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve("auto") }); await defaultsMode(); const spyInvokeCount = uaSpy.mock.calls.length; await defaultsMode(); expect(uaSpy).toBeCalledTimes(spyInvokeCount); }); it.each(["invalid", "abc"])("should throw for invalid value %s", async (mode) => { try { await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })(); fail("should throw for invalid modes"); } catch (e) { expect(e.message).toContain("Invalid parameter"); } }); }); ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.browser.ts ================================================ import type { DefaultsMode, ResolvedDefaultsMode } from "@smithy/core/client"; import type { Provider } from "@smithy/types"; import { memoize } from "../property-provider/memoize"; import { DEFAULTS_MODE_OPTIONS } from "./constants"; /** * @internal */ export interface ResolveDefaultsModeConfigOptions { defaultsMode?: DefaultsMode | Provider; } /** * Validate the defaultsMode configuration. If the value is set to "auto", it * resolves the value to "mobile" if the app is running in a mobile browser, * otherwise it resolves to "standard". * * @default "legacy" * @internal */ export const resolveDefaultsModeConfig = ({ defaultsMode, }: ResolveDefaultsModeConfigOptions = {}): Provider => memoize(async () => { const mode = typeof defaultsMode === "function" ? await defaultsMode() : defaultsMode; switch (mode?.toLowerCase()) { case "auto": return Promise.resolve(useMobileConfiguration() ? "mobile" : "standard"); case "mobile": case "in-region": case "cross-region": case "standard": case "legacy": return Promise.resolve(mode?.toLocaleLowerCase() as ResolvedDefaultsMode); case undefined: return Promise.resolve("legacy"); default: throw new Error( `Invalid parameter for "defaultsMode", expect ${DEFAULTS_MODE_OPTIONS.join(", ")}, got ${mode}` ); } }); /** * @internal */ type NavigatorAugment = { userAgentData?: { mobile?: boolean; }; connection?: { effectiveType?: "4g" | string; rtt?: number; downlink?: number; }; }; /** * The aim of the mobile detection function is not really to know whether the device is a mobile device. * This is emphasized in the modern guidance on browser detection that feature detection is correct * whereas UA "sniffing" is usually a mistake. * * So then, the underlying reason we are trying to detect a mobile device is not for any particular device feature, * but rather the implied network speed available to the program (we use it to set a default request timeout value). * * Therefore, it is better to use network speed related feature detection when available. This also saves * 20kb (minified) from the bowser dependency we were using. * * @internal * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Browser_detection_using_the_user_agent */ const useMobileConfiguration = (): boolean => { const navigator = window?.navigator as (typeof window.navigator & NavigatorAugment) | undefined; if (navigator?.connection) { // https://developer.mozilla.org/en-US/docs/Web/API/NetworkInformation/effectiveType // The maximum will report as 4g, regardless of 5g or further developments. const { effectiveType, rtt, downlink } = navigator?.connection; const slow = (typeof effectiveType === "string" && effectiveType !== "4g") || Number(rtt) > 100 || Number(downlink) < 10; if (slow) { return true; } } // without the networkInformation object, we use the userAgentData or touch feature detection as a proxy. return ( navigator?.userAgentData?.mobile || (typeof navigator?.maxTouchPoints === "number" && navigator?.maxTouchPoints > 1) ); }; ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.native.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { DEFAULTS_MODE_OPTIONS } from "./constants"; import { resolveDefaultsModeConfig } from "./resolveDefaultsModeConfig.native"; describe("resolveDefaultsModeConfig", () => { it("should default to legacy", async () => { expect(await resolveDefaultsModeConfig({})()).toBe("legacy"); expect(await resolveDefaultsModeConfig()()).toBe("legacy"); }); it("should resolve auto to mobile", async () => { expect(await resolveDefaultsModeConfig({ defaultsMode: "auto" })()).toBe("mobile"); }); it.each(DEFAULTS_MODE_OPTIONS)("should resolve %s mode", async (mode) => { expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })()).toBe(mode); }); it.each(["invalid", "abc"])("should throw for invalid value %s", async (mode) => { try { await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })(); fail("should throw for invalid modes"); } catch (e) { expect(e.message).toContain("Invalid parameter"); } }); }); ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.native.ts ================================================ import type { DefaultsMode, ResolvedDefaultsMode } from "@smithy/core/client"; import type { Provider } from "@smithy/types"; import { memoize } from "../property-provider/memoize"; import { DEFAULTS_MODE_OPTIONS } from "./constants"; /** * @internal */ export interface ResolveDefaultsModeConfigOptions { defaultsMode?: DefaultsMode | Provider; } /** * Validate the defaultsMode configuration. If the value is set to "auto", it * resolves the value to "mobile". * * @default "legacy" * @internal */ export const resolveDefaultsModeConfig = ({ defaultsMode, }: ResolveDefaultsModeConfigOptions = {}): Provider => memoize(async () => { const mode = typeof defaultsMode === "function" ? await defaultsMode() : defaultsMode; switch (mode?.toLowerCase()) { case "auto": // Because this function is only exists in React Native, so it only resolves to "mobile" // when defaultsMode set to "auto". return Promise.resolve("mobile"); case "mobile": case "in-region": case "cross-region": case "standard": case "legacy": return Promise.resolve(mode?.toLocaleLowerCase() as ResolvedDefaultsMode); case undefined: return Promise.resolve("legacy"); default: throw new Error( `Invalid parameter for "defaultsMode", expect ${DEFAULTS_MODE_OPTIONS.join(", ")}, got ${mode}` ); } }); ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { NODE_REGION_CONFIG_OPTIONS } from "../config-resolver/regionConfig/config"; import * as NodeConfigProvider from "../node-config-provider/configLoader"; import { AWS_DEFAULT_REGION_ENV, AWS_EXECUTION_ENV, AWS_REGION_ENV, DEFAULTS_MODE_OPTIONS, ENV_IMDS_DISABLED, IMDS_REGION_PATH, } from "./constants"; import { NODE_DEFAULTS_MODE_CONFIG_OPTIONS } from "./defaultsModeConfig"; import { resolveDefaultsModeConfig } from "./resolveDefaultsModeConfig"; vi.mock("../node-config-provider/configLoader"); describe("resolveDefaultsModeConfig", () => { afterEach(() => { vi.clearAllMocks(); }); it("should default to legacy", async () => { expect(await resolveDefaultsModeConfig({})()).toBe("legacy"); expect(await resolveDefaultsModeConfig()()).toBe("legacy"); }); it.each(DEFAULTS_MODE_OPTIONS)("should resolve %s mode", async (mode) => { expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })()).toBe(mode); }); it.each(["invalid", "abc"])("should throw for invalid value %s", async (mode) => { try { await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve(mode as any) })(); fail("should throw for invalid modes"); } catch (e) { expect(e.message).toContain("Invalid parameter"); } }); it("should memoize the response", async () => { const providerMock = vi.fn().mockResolvedValue("legacy"); const defaultsMode = resolveDefaultsModeConfig({ defaultsMode: providerMock }); await defaultsMode(); const mockInvokeCount = providerMock.mock.calls.length; await defaultsMode(); expect(providerMock).toBeCalledTimes(mockInvokeCount); }); it("should resolve client region from Node config provider chain", async () => { const loadConfigMock = NodeConfigProvider.loadConfig as any; loadConfigMock.mockReturnValueOnce(undefined); expect(await resolveDefaultsModeConfig({ defaultsMode: () => Promise.resolve("mobile") })()).toBe("mobile"); expect(loadConfigMock.mock.calls[0][0]).toBe(NODE_REGION_CONFIG_OPTIONS); }); it("should resolve defaults mode from Node config provider chain", async () => { const loadConfigMock = NodeConfigProvider.loadConfig as any; loadConfigMock.mockReturnValueOnce("us-west-2").mockReturnValueOnce("mobile"); expect(await resolveDefaultsModeConfig({})()).toBe("mobile"); expect(loadConfigMock.mock.calls[1][0]).toBe(NODE_DEFAULTS_MODE_CONFIG_OPTIONS); }); describe("auto mode inference", () => { const originalEnv = process.env; beforeEach(() => { process.env = {}; }); afterEach(() => { process.env = originalEnv; }); it("should use the AWS_REGION env when in an AWS service environment", async () => { process.env[AWS_EXECUTION_ENV] = "aws-lambda"; process.env[AWS_REGION_ENV] = "us-west-2"; expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("cross-region"); process.env[AWS_REGION_ENV] = "us-west-1"; expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("in-region"); }); it("should use the AWS_DEFAULT_REGION env when in an AWS service environment", async () => { process.env[AWS_EXECUTION_ENV] = "aws-lambda"; process.env[AWS_DEFAULT_REGION_ENV] = "us-west-2"; expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("cross-region"); process.env[AWS_DEFAULT_REGION_ENV] = "us-west-1"; expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("in-region"); }); it(`should skip calling IMDS if ${ENV_IMDS_DISABLED} is set`, async () => { process.env[ENV_IMDS_DISABLED] = "true"; expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("standard"); }); it("should return standard when IMDS is unreachable", async () => { // No env vars set, IMDS will fail (no server running), should fall back to standard expect(await resolveDefaultsModeConfig({ region: "us-west-1", defaultsMode: "auto" })()).toBe("standard"); }); }); }); ================================================ FILE: packages/core/src/submodules/config/defaults-mode/resolveDefaultsModeConfig.ts ================================================ import type { IncomingMessage } from "node:http"; import type { DefaultsMode, ResolvedDefaultsMode } from "@smithy/core/client"; import type { Provider } from "@smithy/types"; import { NODE_REGION_CONFIG_OPTIONS } from "../config-resolver/regionConfig/config"; import { loadConfig } from "../node-config-provider/configLoader"; import { memoize } from "../property-provider/memoize"; import { AWS_DEFAULT_REGION_ENV, AWS_EXECUTION_ENV, AWS_REGION_ENV, DEFAULTS_MODE_OPTIONS, ENV_IMDS_DISABLED, IMDS_REGION_PATH, } from "./constants"; import { NODE_DEFAULTS_MODE_CONFIG_OPTIONS } from "./defaultsModeConfig"; /** * @internal */ export interface ResolveDefaultsModeConfigOptions { defaultsMode?: DefaultsMode | Provider; region?: string | Provider; } /** * Validate the defaultsMode configuration. If the value is set to "auto", it * resolves the value to "in-region", "cross-region", or "standard". * * @default "legacy" * @internal */ export const resolveDefaultsModeConfig = ({ region = loadConfig(NODE_REGION_CONFIG_OPTIONS), defaultsMode = loadConfig(NODE_DEFAULTS_MODE_CONFIG_OPTIONS), }: ResolveDefaultsModeConfigOptions = {}): Provider => memoize(async () => { const mode = typeof defaultsMode === "function" ? await defaultsMode() : defaultsMode; switch (mode?.toLowerCase()) { case "auto": return resolveNodeDefaultsModeAuto(region); case "in-region": case "cross-region": case "mobile": case "standard": case "legacy": return Promise.resolve(mode?.toLocaleLowerCase() as ResolvedDefaultsMode); case undefined: return Promise.resolve("legacy"); default: throw new Error( `Invalid parameter for "defaultsMode", expect ${DEFAULTS_MODE_OPTIONS.join(", ")}, got ${mode}` ); } }); const resolveNodeDefaultsModeAuto = async (clientRegion?: string | Provider): Promise => { if (clientRegion) { const resolvedRegion = typeof clientRegion === "function" ? await clientRegion() : clientRegion; const inferredRegion = await inferPhysicalRegion(); if (!inferredRegion) { return "standard"; } if (resolvedRegion === inferredRegion) { return "in-region"; } else { return "cross-region"; } } return "standard"; }; /** * Infer the hosting app's physical region. */ const inferPhysicalRegion = async (): Promise => { if (process.env[AWS_EXECUTION_ENV] && (process.env[AWS_REGION_ENV] || process.env[AWS_DEFAULT_REGION_ENV])) { // We're running in an AWS service environment, so we can trust the region environment variables to be the current // region, if they're set return process.env[AWS_REGION_ENV] ?? process.env[AWS_DEFAULT_REGION_ENV]; } if (!process.env[ENV_IMDS_DISABLED]) { // We couldn't figure out the region from environment variables. Check IMDSv2 try { const endpoint = await getImdsEndpoint(); return (await imdsHttpGet({ hostname: endpoint.hostname, path: IMDS_REGION_PATH })).toString(); } catch (e) { // Swallow the error. } } }; /** * Inlined from @smithy/credential-provider-imds to avoid circular dependency. */ const getImdsEndpoint = async (): Promise<{ hostname: string; path: string }> => { const envEndpoint = process.env.AWS_EC2_METADATA_SERVICE_ENDPOINT; if (envEndpoint) { const url = new URL(envEndpoint); return { hostname: url.hostname, path: url.pathname }; } const envMode = process.env.AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE; if (envMode === "IPv6") { return { hostname: "fd00:ec2::254", path: "/" }; } return { hostname: "169.254.169.254", path: "/" }; }; const imdsHttpGet = async ({ hostname, path }: { hostname: string; path: string }): Promise => { const { request } = await import("node:http"); return new Promise((resolve, reject) => { const req = request({ method: "GET", hostname: hostname.replace(/^\[(.+)]$/, "$1"), path, timeout: 1000, signal: AbortSignal.timeout(1000), }); req.on("error", (err: Error) => { reject(err); req.destroy(); }); req.on("timeout", () => { reject(new Error("TimeoutError from instance metadata service")); req.destroy(); }); req.on("response", (res: IncomingMessage) => { const { statusCode = 400 } = res; if (statusCode < 200 || 300 <= statusCode) { reject(Object.assign(new Error("Error response received from instance metadata service"), { statusCode })); req.destroy(); return; } const chunks: Buffer[] = []; res.on("data", (chunk: Buffer) => chunks.push(chunk)); res.on("end", () => { resolve(Buffer.concat(chunks)); req.destroy(); }); }); req.end(); }); }; ================================================ FILE: packages/core/src/submodules/config/index.browser.ts ================================================ const no = Symbol.for("node-only"); // @smithy/property-provider export { ProviderError, type ProviderErrorOptionsType } from "./property-provider/ProviderError"; export { CredentialsProviderError } from "./property-provider/CredentialsProviderError"; export { TokenProviderError } from "./property-provider/TokenProviderError"; export { chain } from "./property-provider/chain"; export { fromValue } from "./property-provider/fromValue"; export { memoize } from "./property-provider/memoize"; // @smithy/util-config-provider export { booleanSelector } from "./util-config-provider/booleanSelector"; export { numberSelector } from "./util-config-provider/numberSelector"; export { SelectorType } from "./util-config-provider/types"; // @smithy/shared-ini-file-loader export const getHomeDir = no; export const ENV_PROFILE = no; export const DEFAULT_PROFILE = "default"; export const getProfileName = no; export const getSSOTokenFilepath = no; export const getSSOTokenFromFile = no; export const CONFIG_PREFIX_SEPARATOR = no; export const loadSharedConfigFiles = no; export const loadSsoSessionData = no; export const parseKnownFiles = no; export const externalDataInterceptor = no; export const readFile = no; export type { SSOToken } from "./shared-ini-file-loader/getSSOTokenFromFile"; export type { SharedConfigInit } from "./shared-ini-file-loader/loadSharedConfigFiles"; export type { SsoSessionInit } from "./shared-ini-file-loader/loadSsoSessionData"; export type { SourceProfileInit } from "./shared-ini-file-loader/parseKnownFiles"; export type { Profile, ParsedIniData, SharedConfigFiles } from "./shared-ini-file-loader/types"; export type { ReadFileOptions } from "./shared-ini-file-loader/readFile"; // @smithy/node-config-provider export const loadConfig = no; export const fromStatic = no; export type { LocalConfigOptions, LoadedConfigSelectors } from "./node-config-provider/configLoader"; export type { EnvOptions, GetterFromEnv } from "./node-config-provider/fromEnv"; export type { NodeSharedConfigInit, GetterFromConfig } from "./node-config-provider/fromSharedConfigFiles"; // @smithy/config-resolver export const ENV_USE_DUALSTACK_ENDPOINT = no; export const CONFIG_USE_DUALSTACK_ENDPOINT = no; export const DEFAULT_USE_DUALSTACK_ENDPOINT = false; export const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = no; export const nodeDualstackConfigSelectors = no; export const ENV_USE_FIPS_ENDPOINT = no; export const CONFIG_USE_FIPS_ENDPOINT = no; export const DEFAULT_USE_FIPS_ENDPOINT = false; export const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = no; export const nodeFipsConfigSelectors = no; export { resolveCustomEndpointsConfig, type CustomEndpointsInputConfig, type CustomEndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveCustomEndpointsConfig"; export { resolveEndpointsConfig, type EndpointsInputConfig, type EndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveEndpointsConfig"; // @smithy/config-resolver export const REGION_ENV_NAME = no; export const REGION_INI_NAME = no; export const NODE_REGION_CONFIG_OPTIONS = no; export const NODE_REGION_CONFIG_FILE_OPTIONS = no; export { resolveRegionConfig, type RegionInputConfig, type RegionResolvedConfig, } from "./config-resolver/regionConfig/resolveRegionConfig"; // @smithy/config-resolver export { type PartitionHash } from "./config-resolver/regionInfo/PartitionHash"; export { type RegionHash } from "./config-resolver/regionInfo/RegionHash"; export { type EndpointVariant } from "./config-resolver/regionInfo/EndpointVariant"; export { type EndpointVariantTag } from "./config-resolver/regionInfo/EndpointVariantTag"; export { getRegionInfo, type GetRegionInfoOptions } from "./config-resolver/regionInfo/getRegionInfo"; // @smithy/util-defaults-mode-browser export { resolveDefaultsModeConfig, type ResolveDefaultsModeConfigOptions, } from "./defaults-mode/resolveDefaultsModeConfig.browser"; ================================================ FILE: packages/core/src/submodules/config/index.native.ts ================================================ const no = Symbol.for("node-only"); // @smithy/property-provider export { ProviderError, type ProviderErrorOptionsType } from "./property-provider/ProviderError"; export { CredentialsProviderError } from "./property-provider/CredentialsProviderError"; export { TokenProviderError } from "./property-provider/TokenProviderError"; export { chain } from "./property-provider/chain"; export { fromValue } from "./property-provider/fromValue"; export { memoize } from "./property-provider/memoize"; // @smithy/util-config-provider export { booleanSelector } from "./util-config-provider/booleanSelector"; export { numberSelector } from "./util-config-provider/numberSelector"; export { SelectorType } from "./util-config-provider/types"; // @smithy/shared-ini-file-loader export const getHomeDir = no; export const ENV_PROFILE = no; export const DEFAULT_PROFILE = "default"; export const getProfileName = no; export const getSSOTokenFilepath = no; export const getSSOTokenFromFile = no; export const CONFIG_PREFIX_SEPARATOR = no; export const loadSharedConfigFiles = no; export const loadSsoSessionData = no; export const parseKnownFiles = no; export const externalDataInterceptor = no; export const readFile = no; export type { SSOToken } from "./shared-ini-file-loader/getSSOTokenFromFile"; export type { SharedConfigInit } from "./shared-ini-file-loader/loadSharedConfigFiles"; export type { SsoSessionInit } from "./shared-ini-file-loader/loadSsoSessionData"; export type { SourceProfileInit } from "./shared-ini-file-loader/parseKnownFiles"; export type { Profile, ParsedIniData, SharedConfigFiles } from "./shared-ini-file-loader/types"; export type { ReadFileOptions } from "./shared-ini-file-loader/readFile"; // @smithy/node-config-provider export const loadConfig = no; export const fromStatic = no; export type { LocalConfigOptions, LoadedConfigSelectors } from "./node-config-provider/configLoader"; export type { EnvOptions, GetterFromEnv } from "./node-config-provider/fromEnv"; export type { NodeSharedConfigInit, GetterFromConfig } from "./node-config-provider/fromSharedConfigFiles"; // @smithy/config-resolver export const ENV_USE_DUALSTACK_ENDPOINT = no; export const CONFIG_USE_DUALSTACK_ENDPOINT = no; export const DEFAULT_USE_DUALSTACK_ENDPOINT = false; export const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = no; export const nodeDualstackConfigSelectors = no; export const ENV_USE_FIPS_ENDPOINT = no; export const CONFIG_USE_FIPS_ENDPOINT = no; export const DEFAULT_USE_FIPS_ENDPOINT = false; export const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = no; export const nodeFipsConfigSelectors = no; export { resolveCustomEndpointsConfig, type CustomEndpointsInputConfig, type CustomEndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveCustomEndpointsConfig"; export { resolveEndpointsConfig, type EndpointsInputConfig, type EndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveEndpointsConfig"; // @smithy/config-resolver export const REGION_ENV_NAME = no; export const REGION_INI_NAME = no; export const NODE_REGION_CONFIG_OPTIONS = no; export const NODE_REGION_CONFIG_FILE_OPTIONS = no; export { resolveRegionConfig, type RegionInputConfig, type RegionResolvedConfig, } from "./config-resolver/regionConfig/resolveRegionConfig"; // @smithy/config-resolver export { type PartitionHash } from "./config-resolver/regionInfo/PartitionHash"; export { type RegionHash } from "./config-resolver/regionInfo/RegionHash"; export { type EndpointVariant } from "./config-resolver/regionInfo/EndpointVariant"; export { type EndpointVariantTag } from "./config-resolver/regionInfo/EndpointVariantTag"; export { getRegionInfo, type GetRegionInfoOptions } from "./config-resolver/regionInfo/getRegionInfo"; // @smithy/util-defaults-mode-node export { resolveDefaultsModeConfig, type ResolveDefaultsModeConfigOptions, } from "./defaults-mode/resolveDefaultsModeConfig.native"; ================================================ FILE: packages/core/src/submodules/config/index.ts ================================================ // @smithy/property-provider export { ProviderError, type ProviderErrorOptionsType } from "./property-provider/ProviderError"; export { CredentialsProviderError } from "./property-provider/CredentialsProviderError"; export { TokenProviderError } from "./property-provider/TokenProviderError"; export { chain } from "./property-provider/chain"; export { fromValue } from "./property-provider/fromValue"; export { memoize } from "./property-provider/memoize"; // @smithy/util-config-provider export { booleanSelector } from "./util-config-provider/booleanSelector"; export { numberSelector } from "./util-config-provider/numberSelector"; export { SelectorType } from "./util-config-provider/types"; // @smithy/shared-ini-file-loader export { getHomeDir } from "./shared-ini-file-loader/getHomeDir"; export { ENV_PROFILE, DEFAULT_PROFILE, getProfileName } from "./shared-ini-file-loader/getProfileName"; export { getSSOTokenFilepath } from "./shared-ini-file-loader/getSSOTokenFilepath"; export { getSSOTokenFromFile, type SSOToken } from "./shared-ini-file-loader/getSSOTokenFromFile"; export { CONFIG_PREFIX_SEPARATOR } from "./shared-ini-file-loader/constants"; export { loadSharedConfigFiles, type SharedConfigInit } from "./shared-ini-file-loader/loadSharedConfigFiles"; export { loadSsoSessionData, type SsoSessionInit } from "./shared-ini-file-loader/loadSsoSessionData"; export { parseKnownFiles, type SourceProfileInit } from "./shared-ini-file-loader/parseKnownFiles"; export { externalDataInterceptor } from "./shared-ini-file-loader/externalDataInterceptor"; export { type Profile, type ParsedIniData, type SharedConfigFiles } from "./shared-ini-file-loader/types"; export { readFile, type ReadFileOptions } from "./shared-ini-file-loader/readFile"; // @smithy/node-config-provider export { loadConfig, type LocalConfigOptions, type LoadedConfigSelectors } from "./node-config-provider/configLoader"; export { type EnvOptions, type GetterFromEnv } from "./node-config-provider/fromEnv"; export { fromStatic } from "./node-config-provider/fromStatic"; export { type NodeSharedConfigInit, type GetterFromConfig } from "./node-config-provider/fromSharedConfigFiles"; // @smithy/config-resolver export { ENV_USE_DUALSTACK_ENDPOINT, CONFIG_USE_DUALSTACK_ENDPOINT, DEFAULT_USE_DUALSTACK_ENDPOINT, NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS, nodeDualstackConfigSelectors, } from "./config-resolver/endpointsConfig/NodeUseDualstackEndpointConfigOptions"; export { ENV_USE_FIPS_ENDPOINT, CONFIG_USE_FIPS_ENDPOINT, DEFAULT_USE_FIPS_ENDPOINT, NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS, nodeFipsConfigSelectors, } from "./config-resolver/endpointsConfig/NodeUseFipsEndpointConfigOptions"; export { resolveCustomEndpointsConfig, type CustomEndpointsInputConfig, type CustomEndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveCustomEndpointsConfig"; export { resolveEndpointsConfig, type EndpointsInputConfig, type EndpointsResolvedConfig, } from "./config-resolver/endpointsConfig/resolveEndpointsConfig"; // @smithy/config-resolver export { REGION_ENV_NAME, REGION_INI_NAME, NODE_REGION_CONFIG_OPTIONS, NODE_REGION_CONFIG_FILE_OPTIONS, } from "./config-resolver/regionConfig/config"; export { resolveRegionConfig, type RegionInputConfig, type RegionResolvedConfig, } from "./config-resolver/regionConfig/resolveRegionConfig"; // @smithy/config-resolver export { type PartitionHash } from "./config-resolver/regionInfo/PartitionHash"; export { type RegionHash } from "./config-resolver/regionInfo/RegionHash"; export { type EndpointVariant } from "./config-resolver/regionInfo/EndpointVariant"; export { type EndpointVariantTag } from "./config-resolver/regionInfo/EndpointVariantTag"; export { getRegionInfo, type GetRegionInfoOptions } from "./config-resolver/regionInfo/getRegionInfo"; // @smithy/util-defaults-mode-node export { resolveDefaultsModeConfig, type ResolveDefaultsModeConfigOptions, } from "./defaults-mode/resolveDefaultsModeConfig"; ================================================ FILE: packages/core/src/submodules/config/node-config-provider/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.3.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/property-provider@4.2.14 - @smithy/shared-ini-file-loader@4.4.9 ## 4.3.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/property-provider@4.2.13 - @smithy/shared-ini-file-loader@4.4.8 ## 4.3.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/property-provider@4.2.12 - @smithy/shared-ini-file-loader@4.4.7 ## 4.3.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/shared-ini-file-loader@4.4.6 - @smithy/property-provider@4.2.11 ## 4.3.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/property-provider@4.2.10 - @smithy/shared-ini-file-loader@4.4.5 ## 4.3.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/property-provider@4.2.9 - @smithy/shared-ini-file-loader@4.4.4 - @smithy/types@4.12.1 ## 4.3.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/property-provider@4.2.8 - @smithy/shared-ini-file-loader@4.4.3 ## 4.3.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/property-provider@4.2.7 - @smithy/shared-ini-file-loader@4.4.2 ## 4.3.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/property-provider@4.2.6 - @smithy/shared-ini-file-loader@4.4.1 ## 4.3.5 ### Patch Changes - Updated dependencies [3926fd7] - Updated dependencies [d90999a] - @smithy/types@4.9.0 - @smithy/shared-ini-file-loader@4.4.0 - @smithy/property-provider@4.2.5 ## 4.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/property-provider@4.2.4 - @smithy/shared-ini-file-loader@4.3.4 ## 4.3.3 ### Patch Changes - Updated dependencies [8a2a912] - Updated dependencies [7e359e2] - @smithy/types@4.8.0 - @smithy/shared-ini-file-loader@4.3.3 - @smithy/property-provider@4.2.3 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/property-provider@4.2.2 - @smithy/shared-ini-file-loader@4.3.2 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/property-provider@4.2.1 - @smithy/shared-ini-file-loader@4.3.1 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/property-provider@4.2.0 - @smithy/shared-ini-file-loader@4.3.0 - @smithy/types@4.6.0 ## 4.2.2 ### Patch Changes - Updated dependencies [60f393e] - @smithy/shared-ini-file-loader@4.2.0 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/property-provider@4.1.1 - @smithy/shared-ini-file-loader@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/shared-ini-file-loader@4.1.0 - @smithy/property-provider@4.1.0 - @smithy/types@4.4.0 ## 4.1.4 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/property-provider@4.0.5 - @smithy/shared-ini-file-loader@4.0.5 ## 4.1.3 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/property-provider@4.0.4 - @smithy/shared-ini-file-loader@4.0.4 ## 4.1.2 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/property-provider@4.0.3 - @smithy/shared-ini-file-loader@4.0.3 ## 4.1.1 ### Patch Changes - 9f8d075: Export Getters and their configs ## 4.1.0 ### Minor Changes - 9ff783b: Pass options with signing name to environment variable selector ### Patch Changes - acefcf5: Pass logger to environment variable selector ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/property-provider@4.0.2 - @smithy/shared-ini-file-loader@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/property-provider@4.0.1 - @smithy/shared-ini-file-loader@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/shared-ini-file-loader@4.0.0 - @smithy/property-provider@4.0.0 - @smithy/types@4.0.0 ## 3.1.12 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/property-provider@3.1.11 - @smithy/shared-ini-file-loader@3.1.12 ## 3.1.11 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/property-provider@3.1.10 - @smithy/shared-ini-file-loader@3.1.11 ## 3.1.10 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/property-provider@3.1.9 - @smithy/shared-ini-file-loader@3.1.10 ## 3.1.9 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/property-provider@3.1.8 - @smithy/shared-ini-file-loader@3.1.9 ## 3.1.8 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/property-provider@3.1.7 - @smithy/shared-ini-file-loader@3.1.8 ## 3.1.7 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/property-provider@3.1.6 - @smithy/shared-ini-file-loader@3.1.7 ## 3.1.6 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/property-provider@3.1.5 - @smithy/shared-ini-file-loader@3.1.6 ## 3.1.5 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/property-provider@3.1.4 - @smithy/shared-ini-file-loader@3.1.5 ## 3.1.4 ### Patch Changes - Updated dependencies [d88521e] - @smithy/shared-ini-file-loader@3.1.4 ## 3.1.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/property-provider@3.1.3 - @smithy/shared-ini-file-loader@3.1.3 ## 3.1.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/property-provider@3.1.2 - @smithy/shared-ini-file-loader@3.1.2 ## 3.1.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/property-provider@3.1.1 - @smithy/shared-ini-file-loader@3.1.1 ## 3.1.0 ### Minor Changes - 1cdd3be0: new logging-compatible signature for CredentialsProviderError ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/shared-ini-file-loader@3.1.0 - @smithy/property-provider@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/shared-ini-file-loader@3.0.0 - @smithy/property-provider@3.0.0 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/shared-ini-file-loader@2.4.0 - @smithy/property-provider@2.2.0 - @smithy/types@2.12.0 ## 2.2.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/property-provider@2.1.4 - @smithy/shared-ini-file-loader@2.3.5 ## 2.2.4 ### Patch Changes - Updated dependencies [8fd51967] - @smithy/shared-ini-file-loader@2.3.4 ## 2.2.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/property-provider@2.1.3 - @smithy/shared-ini-file-loader@2.3.3 ## 2.2.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/property-provider@2.1.2 - @smithy/shared-ini-file-loader@2.3.2 ## 2.2.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/property-provider@2.1.1 - @smithy/shared-ini-file-loader@2.3.1 - @smithy/types@2.9.1 ## 2.2.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/shared-ini-file-loader@2.3.0 - @smithy/property-provider@2.1.0 - @smithy/types@2.9.0 ## 2.1.9 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/property-provider@2.0.17 - @smithy/shared-ini-file-loader@2.2.8 ## 2.1.8 ### Patch Changes - Updated dependencies [68849108] - @smithy/shared-ini-file-loader@2.2.7 ## 2.1.7 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/property-provider@2.0.16 - @smithy/shared-ini-file-loader@2.2.6 ## 2.1.6 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/property-provider@2.0.15 - @smithy/shared-ini-file-loader@2.2.5 ## 2.1.5 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/property-provider@2.0.14 - @smithy/shared-ini-file-loader@2.2.4 ## 2.1.4 ### Patch Changes - Updated dependencies [c27879f2] - @smithy/shared-ini-file-loader@2.2.3 ## 2.1.3 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [901cb6c9] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/shared-ini-file-loader@2.2.2 - @smithy/property-provider@2.0.13 ## 2.1.2 ### Patch Changes - Updated dependencies [5bd46820] - Updated dependencies [6ae95278] - @smithy/shared-ini-file-loader@2.2.1 ## 2.1.1 ### Patch Changes - Updated dependencies [d6b4c090] - Updated dependencies [719777c7] - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/shared-ini-file-loader@2.2.0 - @smithy/property-provider@2.0.12 ## 2.1.0 ### Minor Changes - 7b568c39: Pass configuration file as second parameter to configSelector ### Patch Changes - Updated dependencies [aa86b3fe] - @smithy/shared-ini-file-loader@2.1.0 ## 2.0.14 ### Patch Changes - Updated dependencies [60e88afe] - @smithy/shared-ini-file-loader@2.0.13 ## 2.0.13 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/property-provider@2.0.11 - @smithy/shared-ini-file-loader@2.0.12 ## 2.0.12 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/property-provider@2.0.10 - @smithy/shared-ini-file-loader@2.0.11 ## 2.0.11 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/property-provider@2.0.9 - @smithy/shared-ini-file-loader@2.0.10 ## 2.0.10 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/property-provider@2.0.8 - @smithy/shared-ini-file-loader@2.0.9 ## 2.0.9 ### Patch Changes - Updated dependencies [c4e16cfd] - @smithy/shared-ini-file-loader@2.0.8 ## 2.0.8 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/property-provider@2.0.7 - @smithy/shared-ini-file-loader@2.0.7 ## 2.0.7 ### Patch Changes - Updated dependencies [c07cde00] - @smithy/shared-ini-file-loader@2.0.6 ## 2.0.6 ### Patch Changes - Updated dependencies [a7598a5d] - @smithy/property-provider@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/property-provider@2.0.5 - @smithy/shared-ini-file-loader@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/property-provider@2.0.4 - @smithy/shared-ini-file-loader@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/property-provider@2.0.3 - @smithy/shared-ini-file-loader@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/property-provider@2.0.2 - @smithy/shared-ini-file-loader@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/property-provider@2.0.1 - @smithy/shared-ini-file-loader@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/property-provider@2.0.0 - @smithy/shared-ini-file-loader@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/property-provider@1.2.0 - @smithy/shared-ini-file-loader@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [4ad43c6a] - Updated dependencies [d90a45b5] - Updated dependencies [5f7bcc79] - @smithy/types@2.0.0 - @smithy/property-provider@1.1.0 - @smithy/shared-ini-file-loader@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/shared-ini-file-loader@1.0.2 - @smithy/property-provider@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/shared-ini-file-loader@1.0.1 - @smithy/property-provider@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/node-config-provider](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/node-config-provider/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/node-config-provider/configLoader.spec.ts ================================================ import type { Profile } from "@smithy/types"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { chain } from "../property-provider/chain"; import { memoize } from "../property-provider/memoize"; import { loadConfig } from "./configLoader"; import { fromEnv } from "./fromEnv"; import { fromSharedConfigFiles, type NodeSharedConfigInit } from "./fromSharedConfigFiles"; import { fromStatic } from "./fromStatic"; vi.mock("./fromEnv"); vi.mock("./fromSharedConfigFiles"); vi.mock("./fromStatic"); vi.mock("../property-provider/chain"); vi.mock("../property-provider/memoize"); describe("loadConfig", () => { const configuration: NodeSharedConfigInit = { profile: "profile", }; afterEach(() => { vi.clearAllMocks(); }); it("passes fromEnv(), fromSharedConfigFiles() and fromStatic() to chain", () => { const mockFromEnvReturn = "mockFromEnvReturn" as any; vi.mocked(fromEnv).mockReturnValueOnce(mockFromEnvReturn); const mockFromSharedConfigFilesReturn = "mockFromSharedConfigFilesReturn" as any; vi.mocked(fromSharedConfigFiles).mockReturnValueOnce(mockFromSharedConfigFilesReturn); const mockFromStatic = "mockFromStatic" as any; vi.mocked(fromStatic).mockReturnValueOnce(mockFromStatic); const envVarSelector = (env: Record) => env["AWS_CONFIG_FOO"]; const configKey = (profile: Profile) => profile["aws_config_foo"]; const defaultValue = "foo-value"; loadConfig( { environmentVariableSelector: envVarSelector, configFileSelector: configKey, default: defaultValue, }, configuration ); expect(fromEnv).toHaveBeenCalledTimes(1); expect(fromEnv).toHaveBeenCalledWith(envVarSelector, {}); expect(fromSharedConfigFiles).toHaveBeenCalledTimes(1); expect(fromSharedConfigFiles).toHaveBeenCalledWith(configKey, configuration); expect(fromStatic).toHaveBeenCalledTimes(1); expect(fromStatic).toHaveBeenCalledWith(defaultValue); expect(chain).toHaveBeenCalledTimes(1); expect(chain).toHaveBeenCalledWith(mockFromEnvReturn, mockFromSharedConfigFilesReturn, mockFromStatic); }); it("passes output of chain to memoize", () => { const mockChainReturn = "mockChainReturn" as any; vi.mocked(chain).mockReturnValueOnce(mockChainReturn); loadConfig({} as any); expect(chain).toHaveBeenCalledTimes(1); expect(memoize).toHaveBeenCalledTimes(1); expect(memoize).toHaveBeenCalledWith(mockChainReturn); }); it("returns output memoize", () => { const mockMemoizeReturn = "mockMemoizeReturn" as any; vi.mocked(memoize).mockReturnValueOnce(mockMemoizeReturn); expect(loadConfig({} as any)).toEqual(mockMemoizeReturn); }); it("passes signingName in options object of fromEnv()", () => { const configWithSigningName = { ...configuration, signingName: "signingName", }; const envVarSelector = (env: Record) => env["AWS_CONFIG_FOO"]; const configKey = (profile: Profile) => profile["aws_config_foo"]; const defaultValue = "foo-value"; loadConfig( { environmentVariableSelector: envVarSelector, configFileSelector: configKey, default: defaultValue, }, configWithSigningName ); expect(fromEnv).toHaveBeenCalledTimes(1); expect(fromEnv).toHaveBeenCalledWith(envVarSelector, { signingName: configWithSigningName.signingName }); }); it("passes logger in options object of fromEnv()", () => { const configWithSigningName = { ...configuration, logger: console, }; const envVarSelector = (env: Record) => env["AWS_CONFIG_FOO"]; const configKey = (profile: Profile) => profile["aws_config_foo"]; const defaultValue = "foo-value"; loadConfig( { environmentVariableSelector: envVarSelector, configFileSelector: configKey, default: defaultValue, }, configWithSigningName ); expect(fromEnv).toHaveBeenCalledTimes(1); expect(fromEnv).toHaveBeenCalledWith(envVarSelector, { logger: configWithSigningName.logger }); }); }); ================================================ FILE: packages/core/src/submodules/config/node-config-provider/configLoader.ts ================================================ import type { Provider } from "@smithy/types"; import { chain } from "../property-provider/chain"; import { memoize } from "../property-provider/memoize"; import { fromEnv, type EnvOptions, type GetterFromEnv } from "./fromEnv"; import { fromSharedConfigFiles, type GetterFromConfig, type NodeSharedConfigInit } from "./fromSharedConfigFiles"; import { fromStatic, type FromStaticConfig } from "./fromStatic"; /** * @internal */ export type LocalConfigOptions = NodeSharedConfigInit & EnvOptions; /** * @internal */ export interface LoadedConfigSelectors { /** * A getter function getting the config values from all the environment * variables. */ environmentVariableSelector: GetterFromEnv; /** * A getter function getting config values associated with the inferred * profile from shared INI files */ configFileSelector: GetterFromConfig; /** * Default value or getter */ default: FromStaticConfig; } /** * @internal */ export const loadConfig = ( { environmentVariableSelector, configFileSelector, default: defaultValue }: LoadedConfigSelectors, configuration: LocalConfigOptions = {} ): Provider => { const { signingName, logger } = configuration; const envOptions: EnvOptions = { signingName, logger }; return memoize( chain( fromEnv(environmentVariableSelector, envOptions), fromSharedConfigFiles(configFileSelector, configuration), fromStatic(defaultValue) ) ); }; ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromEnv.spec.ts ================================================ import { afterAll, afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { CredentialsProviderError } from "../property-provider/CredentialsProviderError"; import { fromEnv } from "./fromEnv"; describe("fromEnv", () => { describe("with env var getter", () => { const ENV_VAR_NAME = "ENV_VAR_NAME"; const envVarGetter = vi.fn(); const envVarValue = process.env[ENV_VAR_NAME]; const mockEnvVarValue = "mockEnvVarValue"; beforeEach(() => { envVarGetter.mockImplementation((env: Record) => { if (env[ENV_VAR_NAME]) return env[ENV_VAR_NAME]; throw new CredentialsProviderError(`Not found in ENV: ${ENV_VAR_NAME}`); }); delete process.env[ENV_VAR_NAME]; }); afterEach(() => { vi.clearAllMocks(); }); afterAll(() => { process.env[ENV_VAR_NAME] = envVarValue; }); describe("CredentialsProviderError", () => { it("is behaving as expected cross-package in vitest", () => { expect(new CredentialsProviderError("msg", {}).message).toEqual("msg"); expect(new CredentialsProviderError("msg", {}).name).toEqual("CredentialsProviderError"); }); }); it(`returns string value in '${ENV_VAR_NAME}' env var when set`, async () => { process.env[ENV_VAR_NAME] = mockEnvVarValue; await expect(fromEnv(envVarGetter)()).resolves.toBe(mockEnvVarValue); expect(envVarGetter).toHaveBeenCalledWith(process.env, undefined); }); it(`passes options to envVarSelector if it's set`, async () => { process.env[ENV_VAR_NAME] = mockEnvVarValue; const options = { signingName: "signingName" }; await expect(fromEnv(envVarGetter, options)()).resolves.toBe(mockEnvVarValue); expect(envVarGetter).toHaveBeenCalledWith(process.env, options); }); it("return complex value from the getter", () => { type Value = { Foo: string }; const value: Value = { Foo: "bar" }; const getter: (env: any) => Value = vi.fn().mockReturnValue(value); // Validate the generic type works return expect(fromEnv(getter)()).resolves.toEqual(value); }); it(`throws when '${ENV_VAR_NAME}' env var is not set`, async () => { expect.assertions(1); const error = await fromEnv(envVarGetter)().catch((_) => _); return expect(error).toEqual(new CredentialsProviderError(`Not found in ENV: ENV_VAR_NAME`, {})); }); it("throws when the getter function throws", () => { const exception = new Error("Exception when getting the config"); const getter: (env: any) => any = vi.fn().mockRejectedValue(exception); return expect(fromEnv(getter)()).rejects.toEqual(exception); }); }); }); ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromEnv.ts ================================================ import type { Logger, Provider } from "@smithy/types"; import { CredentialsProviderError } from "../property-provider/CredentialsProviderError"; import { getSelectorName } from "./getSelectorName"; /** * @internal */ export interface EnvOptions { /** * The SigV4 service signing name. */ signingName?: string; /** * For credential resolution trace logging. */ logger?: Logger; } // Using Record instead of NodeJS.ProcessEnv, in order to not get type errors in non node environments export type GetterFromEnv = (env: Record, options?: EnvOptions) => T | undefined; /** * Get config value given the environment variable name or getter from * environment variable. */ export const fromEnv = (envVarSelector: GetterFromEnv, options?: EnvOptions): Provider => async () => { try { const config = envVarSelector(process.env, options); if (config === undefined) { throw new Error(); } return config as T; } catch (e) { throw new CredentialsProviderError( e.message || `Not found in ENV: ${getSelectorName(envVarSelector.toString())}`, { logger: options?.logger } ); } }; ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromSharedConfigFiles.spec.ts ================================================ import type { ParsedIniData, Profile } from "@smithy/types"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { CredentialsProviderError } from "../property-provider/CredentialsProviderError"; import { getProfileName } from "../shared-ini-file-loader/getProfileName"; import { loadSharedConfigFiles } from "../shared-ini-file-loader/loadSharedConfigFiles"; import { fromSharedConfigFiles, type GetterFromConfig, type NodeSharedConfigInit } from "./fromSharedConfigFiles"; vi.mock("../shared-ini-file-loader/getProfileName"); vi.mock("../shared-ini-file-loader/loadSharedConfigFiles"); describe("fromSharedConfigFiles", () => { const CONFIG_KEY = "config_key"; const configGetter: GetterFromConfig = (profile: Profile) => profile[CONFIG_KEY]; const getCredentialsProviderError = (profile: string) => new CredentialsProviderError(`Not found in config files w/ profile [${profile}]: CONFIG_KEY`, {}); describe("loadedConfig", () => { const mockConfigAnswer = "mockConfigAnswer"; const mockConfigNotAnswer = "mockConfigNotAnswer"; const mockCredentialsAnswer = "mockCredentialsAnswer"; const mockCredentialsNotAnswer = "mockCredentialsNotAnswer"; type LoadedConfigTestData = { message: string; iniDataInConfig: ParsedIniData; iniDataInCredentials: ParsedIniData; } & NodeSharedConfigInit; const loadedConfigResolves: (LoadedConfigTestData & { configValueToVerify: string; })[] = [ { message: "returns configValue from default profile", iniDataInConfig: { default: { [CONFIG_KEY]: mockConfigAnswer }, }, iniDataInCredentials: { default: { [CONFIG_KEY]: mockCredentialsNotAnswer }, }, configValueToVerify: mockConfigAnswer, }, { message: "returns configValue from designated profile", iniDataInConfig: { default: { [CONFIG_KEY]: mockConfigNotAnswer }, foo: { [CONFIG_KEY]: mockConfigAnswer }, }, iniDataInCredentials: { foo: { [CONFIG_KEY]: mockCredentialsNotAnswer }, }, profile: "foo", configValueToVerify: mockConfigAnswer, }, { message: "returns configValue from credentials file if preferred", iniDataInConfig: { default: { [CONFIG_KEY]: mockConfigNotAnswer }, foo: { [CONFIG_KEY]: mockConfigNotAnswer }, }, iniDataInCredentials: { foo: { [CONFIG_KEY]: mockCredentialsAnswer }, }, profile: "foo", preferredFile: "credentials", configValueToVerify: mockCredentialsAnswer, }, { message: "returns configValue from config file if preferred credentials file doesn't contain config", iniDataInConfig: { foo: { [CONFIG_KEY]: mockConfigAnswer }, }, iniDataInCredentials: {}, configValueToVerify: mockConfigAnswer, preferredFile: "credentials", profile: "foo", }, { message: "returns configValue from credential file if preferred config file doesn't contain config", iniDataInConfig: {}, iniDataInCredentials: { foo: { [CONFIG_KEY]: mockCredentialsAnswer }, }, configValueToVerify: mockCredentialsAnswer, profile: "foo", }, ]; const loadedConfigRejects: LoadedConfigTestData[] = [ { message: "rejects if default profile is not present and profile value is not passed", iniDataInConfig: { foo: { [CONFIG_KEY]: mockConfigNotAnswer }, }, iniDataInCredentials: {}, }, { message: "rejects if designated profile is not present", iniDataInConfig: { default: { [CONFIG_KEY]: mockConfigNotAnswer }, }, iniDataInCredentials: {}, profile: "foo", }, ]; loadedConfigResolves.forEach( ({ message, iniDataInConfig, iniDataInCredentials, configValueToVerify, profile, preferredFile }) => { it(message, () => { vi.mocked(loadSharedConfigFiles).mockResolvedValueOnce({ configFile: iniDataInConfig, credentialsFile: iniDataInCredentials, }); vi.mocked(getProfileName).mockReturnValueOnce(profile ?? "default"); return expect(fromSharedConfigFiles(configGetter, { profile, preferredFile })()).resolves.toBe( configValueToVerify ); }); } ); loadedConfigRejects.forEach(({ message, iniDataInConfig, iniDataInCredentials, profile, preferredFile }) => { it(message, () => { vi.mocked(loadSharedConfigFiles).mockResolvedValueOnce({ configFile: iniDataInConfig, credentialsFile: iniDataInCredentials, }); vi.mocked(getProfileName).mockReturnValueOnce(profile ?? "default"); return expect(fromSharedConfigFiles(configGetter, { profile, preferredFile })()).rejects.toEqual( getCredentialsProviderError(profile ?? "default") ); }); }); it("rejects if getter throws", () => { const message = "Cannot load config"; const failGetter = () => { throw new Error(message); }; vi.mocked(loadSharedConfigFiles).mockResolvedValueOnce({ configFile: {}, credentialsFile: {}, }); return expect(fromSharedConfigFiles(failGetter)()).rejects.toEqual(new CredentialsProviderError(message)); }); }); describe("profile", () => { const loadedConfigData = { configFile: { default: { [CONFIG_KEY]: "configFileDefault" }, foo: { [CONFIG_KEY]: "configFileFoo" }, }, credentialsFile: { default: { [CONFIG_KEY]: "credentialsFileDefault" }, }, }; beforeEach(() => { vi.mocked(loadSharedConfigFiles).mockResolvedValueOnce(loadedConfigData); }); it.each(["foo", "default"])("returns config value from %s profile", (profile) => { vi.mocked(getProfileName).mockReturnValueOnce(profile); return expect(fromSharedConfigFiles(configGetter)()).resolves.toBe( (loadedConfigData.configFile as Record)[profile][CONFIG_KEY] ); }); }); }); ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromSharedConfigFiles.ts ================================================ import type { ParsedIniData, Profile, Provider } from "@smithy/types"; import { CredentialsProviderError } from "../property-provider/CredentialsProviderError"; import { getProfileName } from "../shared-ini-file-loader/getProfileName"; import { loadSharedConfigFiles } from "../shared-ini-file-loader/loadSharedConfigFiles"; import type { SourceProfileInit } from "../shared-ini-file-loader/parseKnownFiles"; import { getSelectorName } from "./getSelectorName"; /** * @internal */ export interface NodeSharedConfigInit extends SourceProfileInit { /** * The preferred shared ini file to load the config. "config" option refers to * the shared config file(defaults to `~/.aws/config`). "credentials" option * refers to the shared credentials file(defaults to `~/.aws/credentials`) */ preferredFile?: "config" | "credentials"; } /** * @internal */ export type GetterFromConfig = (profile: Profile, configFile?: ParsedIniData) => T | undefined; /** * Get config value from the shared config files with inferred profile name. * @internal */ export const fromSharedConfigFiles = ( configSelector: GetterFromConfig, { preferredFile = "config", ...init }: NodeSharedConfigInit = {} ): Provider => async () => { const profile = getProfileName(init); const { configFile, credentialsFile } = await loadSharedConfigFiles(init); const profileFromCredentials = credentialsFile[profile] || {}; const profileFromConfig = configFile[profile] || {}; const mergedProfile = preferredFile === "config" ? { ...profileFromCredentials, ...profileFromConfig } : { ...profileFromConfig, ...profileFromCredentials }; try { const cfgFile = preferredFile === "config" ? configFile : credentialsFile; const configValue = configSelector(mergedProfile, cfgFile); if (configValue === undefined) { throw new Error(); } return configValue; } catch (e) { throw new CredentialsProviderError( e.message || `Not found in config files w/ profile [${profile}]: ${getSelectorName(configSelector.toString())}`, { logger: init.logger } ); } }; ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromStatic.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { fromValue as convertToProvider } from "../property-provider/fromValue"; import { fromStatic } from "./fromStatic"; vi.mock("../property-provider/fromValue", () => ({ fromValue: vi.fn(), })); describe("fromStatic", () => { const value = "default" as any; it("should convert static values to provider", async () => { vi.mocked(convertToProvider).mockReturnValue(value); fromStatic(value); expect(vi.mocked(convertToProvider)).toHaveBeenCalledWith(value); }); it("should call the getter function", async () => { const getter = vi.fn().mockReturnValue(value); const config = fromStatic(getter); expect(await config()).toBe(value); expect(getter).toHaveBeenCalled(); }); it("should call the async provider function", async () => { const getter = vi.fn().mockResolvedValue(value); const config = fromStatic(getter); expect(await config()).toBe(value); expect(getter).toHaveBeenCalled(); }); }); ================================================ FILE: packages/core/src/submodules/config/node-config-provider/fromStatic.ts ================================================ import type { Provider } from "@smithy/types"; import { fromValue } from "../property-provider/fromValue"; /** * @internal */ export type FromStaticConfig = T | (() => T) | Provider; /** * @internal */ type Getter = (() => T) | Provider; /** * @internal */ const isFunction = (func: FromStaticConfig): func is Getter => typeof func === "function"; /** * @internal */ export const fromStatic = (defaultValue: FromStaticConfig): Provider => isFunction(defaultValue) ? async () => await defaultValue() : fromValue(defaultValue); ================================================ FILE: packages/core/src/submodules/config/node-config-provider/getSelectorName.ts ================================================ /** * Attempts to extract the name of the variable that the functional selector is looking for. * Improves readability over the raw Function.toString() value. * @internal * @param functionString - function's string representation. * * @returns constant value used within the function. */ export function getSelectorName(functionString: string): string { try { const constants = new Set(Array.from(functionString.match(/([A-Z_]){3,}/g) ?? [])); constants.delete("CONFIG"); constants.delete("CONFIG_PREFIX_SEPARATOR"); constants.delete("ENV"); return [...constants].join(", "); } catch (e) { return functionString; } } ================================================ FILE: packages/core/src/submodules/config/property-provider/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.1.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.1.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.1.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.1.0 ### Minor Changes - 1cdd3be0: new logging-compatible signature for CredentialsProviderError ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.17 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.16 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.15 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.14 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.13 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.12 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.11 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.10 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.9 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.8 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.7 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.6 ### Patch Changes - a7598a5d: Fix generating default rejected promise when chaining ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.2.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.1.0 ### Minor Changes - 4ad43c6a: adding @public annotation to errors ### Patch Changes - 5f7bcc79: Expose provider Errors to be officially available for error handling. - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/property-provider](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/property-provider/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/property-provider/CredentialsProviderError.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { CredentialsProviderError } from "./CredentialsProviderError"; import { ProviderError } from "./ProviderError"; describe(CredentialsProviderError.name, () => { it("should be named CredentialsProviderError", () => { expect(new CredentialsProviderError("PANIC").name).toBe("CredentialsProviderError"); }); it("should have a non-enumerable message like the base Error class", () => { expect(new CredentialsProviderError("PANIC", {}).message).toBe("PANIC"); expect( { ...new CredentialsProviderError("PANIC", {}), }.message ).toBe(undefined); }); it("should have an enumerable tryNextLink and logger like the base Error class", () => { expect(new CredentialsProviderError("PANIC", {}).tryNextLink).toBe(true); expect( { ...new CredentialsProviderError("PANIC", { tryNextLink: false }), }.tryNextLink ).toBe(false); }); it("should use logger.debug if provided", () => { const logger = { info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn(), trace: vi.fn(), }; new CredentialsProviderError("PANIC", { logger }); expect(logger.debug).toHaveBeenCalled(); expect(logger.trace).not.toHaveBeenCalled(); }); describe.each([Error, ProviderError, CredentialsProviderError])("should be instanceof %p", (classConstructor) => { it("when created using constructor", () => { expect(new CredentialsProviderError("PANIC")).toBeInstanceOf(classConstructor); }); it("when created using from()", () => { expect(CredentialsProviderError.from(new Error("PANIC"))).toBeInstanceOf(classConstructor); }); }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/CredentialsProviderError.ts ================================================ import { ProviderError, type ProviderErrorOptionsType } from "./ProviderError"; /** * An error representing a failure of an individual credential provider. * This error class has special meaning to the {@link chain} method. If a * provider in the chain is rejected with an error, the chain will only proceed * to the next provider if the value of the `tryNextLink` property on the error * is truthy. This allows individual providers to halt the chain and also * ensures the chain will stop if an entirely unexpected error is encountered. * * @public */ export class CredentialsProviderError extends ProviderError { name = "CredentialsProviderError"; /** * @override * @deprecated constructor should be given a logger. */ public constructor(message: string); /** * @override * @deprecated constructor should be given a logger. */ public constructor(message: string, tryNextLink: boolean | undefined); /** * @override * This signature is preferred for logging capability. */ public constructor(message: string, options: ProviderErrorOptionsType); /** * @override */ public constructor(message: string, options: boolean | ProviderErrorOptionsType = true) { super(message, options as ProviderErrorOptionsType); Object.setPrototypeOf(this, CredentialsProviderError.prototype); } } ================================================ FILE: packages/core/src/submodules/config/property-provider/ProviderError.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { ProviderError } from "./ProviderError"; describe(ProviderError.name, () => { it("should be named as ProviderError", () => { expect(new ProviderError("PANIC").name).toBe("ProviderError"); }); it("should direct the chain to proceed to the next link by default", () => { expect(new ProviderError("PANIC").tryNextLink).toBe(true); }); it("should allow errors to halt the chain", () => { expect(new ProviderError("PANIC", false).tryNextLink).toBe(false); }); describe.each([Error, ProviderError])("should be instanceof %p", (classConstructor) => { it("when created using constructor", () => { expect(new ProviderError("PANIC")).toBeInstanceOf(classConstructor); }); it("when created using from()", () => { expect(ProviderError.from(new Error("PANIC"))).toBeInstanceOf(classConstructor); }); }); it("should create ProviderError from existing error", () => { const error = new Error("PANIC"); // @ts-expect-error Property 'someValue' does not exist on type 'Error'. error.someValue = "foo"; const providerError = ProviderError.from(error); // @ts-expect-error Property 'someValue' does not exist on type 'ProviderError'. expect(providerError.someValue).toBe("foo"); expect(providerError.tryNextLink).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/ProviderError.ts ================================================ import type { Logger } from "@smithy/types"; /** * @public */ export type ProviderErrorOptionsType = { tryNextLink?: boolean | undefined; logger?: Logger; }; /** * An error representing a failure of an individual provider. * This error class has special meaning to the {@link chain} method. If a * provider in the chain is rejected with an error, the chain will only proceed * to the next provider if the value of the `tryNextLink` property on the error * is truthy. This allows individual providers to halt the chain and also * ensures the chain will stop if an entirely unexpected error is encountered. * * @public */ export class ProviderError extends Error { name = "ProviderError"; public readonly tryNextLink: boolean; /** * @deprecated constructor should be given a logger. */ public constructor(message: string); /** * @deprecated constructor should be given a logger. */ public constructor(message: string, tryNextLink: boolean | undefined); /** * This signature is preferred for logging capability. */ public constructor(message: string, options: ProviderErrorOptionsType); public constructor(message: string, options: boolean | ProviderErrorOptionsType = true) { let logger: Logger | undefined; let tryNextLink: boolean = true; if (typeof options === "boolean") { logger = undefined; tryNextLink = options; } else if (options != null && typeof options === "object") { logger = options.logger; tryNextLink = options.tryNextLink ?? true; } super(message); this.tryNextLink = tryNextLink; Object.setPrototypeOf(this, ProviderError.prototype); logger?.debug?.(`@smithy/property-provider ${tryNextLink ? "->" : "(!)"} ${message}`); } /** * @deprecated use new operator. */ static from(error: Error, options: boolean | ProviderErrorOptionsType = true): ProviderError { return Object.assign(new this(error.message, options as ProviderErrorOptionsType), error); } } ================================================ FILE: packages/core/src/submodules/config/property-provider/TokenProviderError.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { ProviderError } from "./ProviderError"; import { TokenProviderError } from "./TokenProviderError"; describe(TokenProviderError.name, () => { it("should be named as TokenProviderError", () => { expect(new TokenProviderError("PANIC").name).toBe("TokenProviderError"); }); describe.each([Error, ProviderError, TokenProviderError])("should be instanceof %p", (classConstructor) => { it("when created using constructor", () => { expect(new TokenProviderError("PANIC")).toBeInstanceOf(classConstructor); }); it("when created using from()", () => { expect(TokenProviderError.from(new Error("PANIC"))).toBeInstanceOf(classConstructor); }); }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/TokenProviderError.ts ================================================ import { ProviderError, type ProviderErrorOptionsType } from "./ProviderError"; /** * An error representing a failure of an individual token provider. * This error class has special meaning to the {@link chain} method. If a * provider in the chain is rejected with an error, the chain will only proceed * to the next provider if the value of the `tryNextLink` property on the error * is truthy. This allows individual providers to halt the chain and also * ensures the chain will stop if an entirely unexpected error is encountered. * * @public */ export class TokenProviderError extends ProviderError { name = "TokenProviderError"; /** * @override * @deprecated constructor should be given a logger. */ public constructor(message: string); /** * @override * @deprecated constructor should be given a logger. */ public constructor(message: string, tryNextLink: boolean | undefined); /** * @override * This signature is preferred for logging capability. */ public constructor(message: string, options: ProviderErrorOptionsType); /** * @override */ public constructor(message: string, options: boolean | ProviderErrorOptionsType = true) { super(message, options as ProviderErrorOptionsType); Object.setPrototypeOf(this, TokenProviderError.prototype); } } ================================================ FILE: packages/core/src/submodules/config/property-provider/chain.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { ProviderError } from "./ProviderError"; import { chain } from "./chain"; const resolveStatic = (staticValue: unknown) => vi.fn().mockResolvedValue(staticValue); const rejectWithError = (errorMsg: string) => vi.fn().mockRejectedValue(new Error(errorMsg)); const rejectWithProviderError = (errorMsg: string) => vi.fn().mockRejectedValue(new ProviderError(errorMsg)); describe("chain", () => { it("should distill many credential providers into one", async () => { const provider = chain(resolveStatic("foo"), resolveStatic("bar")); expect(typeof (await provider())).toBe("string"); }); it("should return the resolved value of the first successful promise", async () => { const expectedOutput = "foo"; const providers = [ rejectWithProviderError("Move along"), rejectWithProviderError("Nothing to see here"), resolveStatic(expectedOutput), ]; try { const result = await chain(...providers)(); expect(result).toBe(expectedOutput); } catch (error) { throw error; } expect(providers[0]).toHaveBeenCalledTimes(1); expect(providers[1]).toHaveBeenCalledTimes(1); expect(providers[2]).toHaveBeenCalledTimes(1); }); it("should not invoke subsequent providers once one resolves", async () => { const expectedOutput = "foo"; const providers = [ rejectWithProviderError("Move along"), resolveStatic(expectedOutput), rejectWithProviderError("This provider should not be invoked"), ]; try { const result = await chain(...providers)(); expect(result).toBe(expectedOutput); } catch (error) { throw error; } expect(providers[0]).toHaveBeenCalledTimes(1); expect(providers[1]).toHaveBeenCalledTimes(1); expect(providers[2]).not.toHaveBeenCalled(); }); describe("should throw if no provider resolves", () => { const expectedErrorMsg = "Last provider failed"; it.each([ [ProviderError, rejectWithProviderError(expectedErrorMsg)], [Error, rejectWithError(expectedErrorMsg)], ])("case %p", async (errorType, errorProviderMockFn) => { const firstProviderWhichRejects = rejectWithProviderError("Move along"); try { await chain(firstProviderWhichRejects, errorProviderMockFn)(); throw new Error("Should not get here"); } catch (error) { expect(error).toEqual(new errorType(expectedErrorMsg)); } expect(firstProviderWhichRejects).toHaveBeenCalledTimes(1); expect(errorProviderMockFn).toHaveBeenCalledTimes(1); }); }); it("should halt if an unrecognized error is encountered", async () => { const expectedErrorMsg = "Unrelated failure"; const providers = [rejectWithProviderError("Move along"), rejectWithError(expectedErrorMsg), resolveStatic("foo")]; try { await chain(...providers)(); throw new Error("Should not get here"); } catch (error) { expect(error).toEqual(new Error(expectedErrorMsg)); } expect(providers[0]).toHaveBeenCalledTimes(1); expect(providers[1]).toHaveBeenCalledTimes(1); expect(providers[2]).not.toHaveBeenCalled(); }); it("should halt if ProviderError explicitly requests it", async () => { const expectedError = new ProviderError("ProviderError with tryNextLink set to false", false); const providers = [ rejectWithProviderError("Move along"), vi.fn().mockRejectedValue(expectedError), resolveStatic("foo"), ]; try { await chain(...providers)(); throw new Error("Should not get here"); } catch (error) { expect(error).toEqual(expectedError); } expect(providers[0]).toHaveBeenCalledTimes(1); expect(providers[1]).toHaveBeenCalledTimes(1); expect(providers[2]).not.toHaveBeenCalled(); }); it("should reject chains with no links", async () => { try { await chain()(); throw new Error("Should not get here"); } catch (error) { expect(error).toEqual(new ProviderError("No providers in chain")); } }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/chain.ts ================================================ import type { Provider } from "@smithy/types"; import { ProviderError } from "./ProviderError"; /** * Compose a single credential provider function from multiple credential * providers. The first provider in the argument list will always be invoked; * subsequent providers in the list will be invoked in the order in which the * were received if the preceding provider did not successfully resolve. * If no providers were received or no provider resolves successfully, the * returned promise will be rejected. * * @internal */ export const chain = (...providers: Array>): Provider => async () => { if (providers.length === 0) { throw new ProviderError("No providers in chain"); } let lastProviderError: Error | undefined; for (const provider of providers) { try { const credentials = await provider(); return credentials; } catch (err) { lastProviderError = err; if (err?.tryNextLink) { continue; } throw err; } } throw lastProviderError; }; ================================================ FILE: packages/core/src/submodules/config/property-provider/fromValue.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { fromValue } from "./fromValue"; describe("fromStatic", () => { it("should convert a static value into a provider", async () => { const staticValue = "staticValue"; const provider = fromValue(staticValue); return expect(provider()).resolves.toStrictEqual(staticValue); }); it("should always return the same promise", () => { const provider = fromValue("string"); const result = provider(); Array.from({ length: 5 }).forEach(() => { expect(provider()).toStrictEqual(result); }); }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/fromValue.ts ================================================ import type { Provider } from "@smithy/types"; /** * @internal */ export const fromValue = (staticValue: T): Provider => () => Promise.resolve(staticValue); ================================================ FILE: packages/core/src/submodules/config/property-provider/memoize.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi, type Mock } from "vitest"; import { memoize } from "./memoize"; describe("memoize", () => { let provider: Mock; const mockReturn = "foo"; const repeatTimes = 10; beforeEach(() => { provider = vi.fn().mockResolvedValue(mockReturn); }); afterEach(() => { vi.clearAllMocks(); }); describe("static memoization", () => { it("should cache the resolved provider", async () => { expect.assertions(repeatTimes * 2 + 1); const memoized = memoize(provider); expect(provider).toHaveBeenCalledTimes(0); for (let i = 0; i < repeatTimes; i++) { expect(await memoized()).toStrictEqual(mockReturn); expect(provider).toHaveBeenCalledTimes(1); } }); it("should not make extra request for concurrent calls", async () => { const memoized = memoize(provider); const results = await Promise.all([...Array(repeatTimes).keys()].map(() => memoized())); expect(provider).toHaveBeenCalledTimes(1); for (const res of results) { expect(res).toStrictEqual(mockReturn); } }); it("should retry provider if previous provider is failed", async () => { provider .mockReset() .mockRejectedValueOnce("Error") .mockResolvedValueOnce("Retry") .mockRejectedValueOnce("Should not call 3rd time"); const memoized = memoize(provider); try { await memoized(); fail(); } catch (e) { expect(e).toBe("Error"); } expect(await memoized()).toBe("Retry"); expect(await memoized()).toBe("Retry"); expect(provider).toBeCalledTimes(2); }); it("should retry provider if forceRefresh parameter is used", async () => { provider .mockReset() .mockResolvedValueOnce("1st") .mockResolvedValueOnce("2nd") .mockRejectedValueOnce("Should not call 3rd time"); const memoized = memoize(provider); expect(await memoized()).toBe("1st"); expect(await memoized()).toBe("1st"); expect(await memoized({ forceRefresh: true })).toBe("2nd"); expect(await memoized()).toBe("2nd"); expect(provider).toBeCalledTimes(2); }); }); describe("refreshing memoization", () => { let isExpired: Mock; let requiresRefresh: Mock; beforeEach(() => { isExpired = vi.fn().mockReturnValue(true); requiresRefresh = vi.fn().mockReturnValue(false); }); describe("should not reinvoke the underlying provider while isExpired returns `false`", () => { const isExpiredFalseTest = async (requiresRefresh?: any) => { isExpired.mockReturnValue(false); const memoized = memoize(provider, isExpired, requiresRefresh); expect(provider).toHaveBeenCalledTimes(0); // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const index in [...Array(repeatTimes).keys()]) { expect(await memoized()).toEqual(mockReturn); } expect(isExpired).toHaveBeenCalledTimes(repeatTimes); if (requiresRefresh) { expect(requiresRefresh).toHaveBeenCalledTimes(repeatTimes); } expect(provider).toHaveBeenCalledTimes(1); }; it("when requiresRefresh is not passed", async () => { return isExpiredFalseTest(); }); it("when requiresRefresh returns true", () => { requiresRefresh.mockReturnValue(true); return isExpiredFalseTest(requiresRefresh); }); }); describe("should reinvoke the underlying provider when isExpired returns `true`", () => { const isExpiredTrueTest = async (requiresRefresh?: any) => { const memoized = memoize(provider, isExpired, requiresRefresh); // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const index in [...Array(repeatTimes).keys()]) { expect(await memoized()).toEqual(mockReturn); } expect(isExpired).toHaveBeenCalledTimes(repeatTimes); if (requiresRefresh) { expect(requiresRefresh).toHaveBeenCalledTimes(repeatTimes); } expect(provider).toHaveBeenCalledTimes(repeatTimes + 1); }; it("when requiresRefresh is not passed", () => { return isExpiredTrueTest(); }); it("when requiresRefresh returns true", () => { requiresRefresh.mockReturnValue(true); return isExpiredTrueTest(requiresRefresh); }); }); describe("when called with forceRefresh set to `true`", () => { it("should reinvoke the underlying provider even if isExpired returns false", async () => { const memoized = memoize(provider, isExpired, requiresRefresh); isExpired.mockReturnValue(false); for (let i = 0; i < repeatTimes; i++) { expect(await memoized({ forceRefresh: true })).toEqual(mockReturn); } expect(provider).toHaveBeenCalledTimes(repeatTimes); }); it("should reinvoke the underlying provider even if requiresRefresh returns false", async () => { const memoized = memoize(provider, isExpired, requiresRefresh); requiresRefresh.mockReturnValue(false); for (let i = 0; i < repeatTimes; i++) { expect(await memoized({ forceRefresh: true })).toEqual(mockReturn); } expect(provider).toHaveBeenCalledTimes(repeatTimes); }); }); describe("when `requiresRefresh` returns `false`", () => { const requiresRefreshFalseTest = async () => { const memoized = memoize(provider, isExpired, requiresRefresh); const result = memoized(); expect(await result).toBe(mockReturn); // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const index in [...Array(repeatTimes).keys()]) { expect(memoized()).toStrictEqual(result); expect(provider).toHaveBeenCalledTimes(1); } expect(requiresRefresh).toHaveBeenCalledTimes(1); expect(isExpired).not.toHaveBeenCalled(); }; it("should return the same promise for invocations 2-infinity if isExpired returns true", () => { return requiresRefreshFalseTest(); }); it("should return the same promise for invocations 2-infinity if isExpired returns false", () => { isExpired.mockReturnValue(false); return requiresRefreshFalseTest(); }); it("should re-evaluate `requiresRefresh` after force refresh", async () => { const memoized = memoize(provider, isExpired, requiresRefresh); for (let i = 0; i < repeatTimes; i++) { expect(await memoized({ forceRefresh: true })).toStrictEqual(mockReturn); } expect(requiresRefresh).toBeCalledTimes(repeatTimes); }); }); describe("should not make extra request for concurrent calls", () => { const requiresRefreshFalseTest = async () => { const memoized = memoize(provider, isExpired, requiresRefresh); const results = await Promise.all([...Array(repeatTimes).keys()].map(() => memoized())); expect(provider).toHaveBeenCalledTimes(1); for (const res of results) { expect(res).toStrictEqual(mockReturn); } }; it("when isExpired returns true", () => { return requiresRefreshFalseTest(); }); it("when isExpired returns false", () => { isExpired.mockReturnValue(false); return requiresRefreshFalseTest(); }); }); it("should retry provider if previous provider is failed", async () => { provider .mockReset() .mockRejectedValueOnce("Error") .mockResolvedValueOnce("Retry") .mockRejectedValueOnce("Should not call 3rd time"); isExpired.mockReset().mockReturnValue(false); const memoized = memoize(provider, isExpired); try { await memoized(); fail(); } catch (e) { expect(e).toBe("Error"); } expect(await memoized()).toBe("Retry"); expect(await memoized()).toBe("Retry"); expect(provider).toBeCalledTimes(2); }); }); }); ================================================ FILE: packages/core/src/submodules/config/property-provider/memoize.ts ================================================ import type { MemoizedProvider, Provider } from "@smithy/types"; interface MemoizeOverload { /** * * Decorates a provider function with either static memoization. * * To create a statically memoized provider, supply a provider as the only * argument to this function. The provider will be invoked once, and all * invocations of the provider returned by `memoize` will return the same * promise object. * * @param provider The provider whose result should be cached indefinitely. */ (provider: Provider): MemoizedProvider; /** * Decorates a provider function with refreshing memoization. * * @param provider The provider whose result should be cached. * @param isExpired A function that will evaluate the resolved value and * determine if it is expired. For example, when * memoizing AWS credential providers, this function * should return `true` when the credential's * expiration is in the past (or very near future) and * `false` otherwise. * @param requiresRefresh A function that will evaluate the resolved value and * determine if it represents static value or one that * will eventually need to be refreshed. For example, * AWS credentials that have no defined expiration will * never need to be refreshed, so this function would * return `true` if the credentials resolved by the * underlying provider had an expiration and `false` * otherwise. */ ( provider: Provider, isExpired: (resolved: T) => boolean, requiresRefresh?: (resolved: T) => boolean ): MemoizedProvider; } /** * @internal */ export const memoize: MemoizeOverload = ( provider: Provider, isExpired?: (resolved: T) => boolean, requiresRefresh?: (resolved: T) => boolean ): MemoizedProvider => { let resolved: T; let pending: Promise | undefined; let hasResult: boolean; let isConstant = false; // Wrapper over supplied provider with side effect to handle concurrent invocation. const coalesceProvider: Provider = async () => { if (!pending) { pending = provider(); } try { resolved = await pending; hasResult = true; isConstant = false; } finally { pending = undefined; } return resolved; }; if (isExpired === undefined) { // This is a static memoization; no need to incorporate refreshing unless using forceRefresh; return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(); } return resolved; }; } return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(); } if (isConstant) { return resolved; } if (requiresRefresh && !requiresRefresh(resolved)) { isConstant = true; return resolved; } if (isExpired(resolved)) { await coalesceProvider(); return resolved; } return resolved; }; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.4.9 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.4.8 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.4.7 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.4.6 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.4.5 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.4.4 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.4.3 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.4.2 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.4.1 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.4.0 ### Minor Changes - d90999a: export readFile from shared-ini-file-loader ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.3.3 ### Patch Changes - 7e359e2: remove and ban circular imports - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.2.0 ### Minor Changes - 60f393e: add mock controls to file loader ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.1.12 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.11 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.10 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.9 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.1.8 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.7 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.6 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.5 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.4 ### Patch Changes - d88521e: read config files from paths relative to homedir ## 3.1.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.1.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.1.0 ### Minor Changes - 1cdd3be0: new logging-compatible signature for CredentialsProviderError ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.4.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.3.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.3.4 ### Patch Changes - 8fd51967: Process sso-session names with config prefix separator ## 2.3.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.3.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.3.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.3.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.2.8 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.2.7 ### Patch Changes - 68849108: Process config files for profile names containing prefix separator ## 2.2.6 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.2.5 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.2.4 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.2.3 ### Patch Changes - c27879f2: Allow dot, solidus, percent and colon characters in profile names ## 2.2.2 ### Patch Changes - 901cb6c9: Parse profile name with invalid '+' character - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.2.1 ### Patch Changes - 5bd46820: Treat absence of prefix whitespace as section keys when reading ini files - 6ae95278: Parse profile name with invalid '@' character ## 2.2.0 ### Minor Changes - d6b4c090: Populate sso-session and services sections when loading config files ### Patch Changes - 719777c7: Export CONFIG_PREFIX_SEPARATOR from loadSharedConfigFiles - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.1.0 ### Minor Changes - aa86b3fe: Populate subsection using dot separator in section key when parsing INI files ## 2.0.13 ### Patch Changes - 60e88afe: Read values from main settings when parsing INI files ## 2.0.12 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.11 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.10 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.9 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.8 ### Patch Changes - c4e16cfd: Explicitly check for process.geteuid from global scope ## 2.0.7 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.6 ### Patch Changes - c07cde00: Cache value returned by os.homedir() ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/shared-ini-file-loader](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/shared-ini-file-loader/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/constants.ts ================================================ /** * @internal */ export const CONFIG_PREFIX_SEPARATOR = "."; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/externalDataInterceptor.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { externalDataInterceptor } from "./externalDataInterceptor"; import { getSSOTokenFromFile } from "./getSSOTokenFromFile"; import { readFile } from "./readFile"; describe("fileMockController", () => { it("intercepts readFile", async () => { externalDataInterceptor.interceptFile("abcd", "contents"); expect(await readFile("abcd")).toEqual("contents"); expect(externalDataInterceptor.getFileRecord()).toEqual({ abcd: Promise.resolve("contents"), }); expect(await externalDataInterceptor.getFileRecord().abcd).toEqual("contents"); }); it("intercepts getSSOTokenFromFile", async () => { externalDataInterceptor.interceptToken("TOKEN", "token-contents"); expect(await getSSOTokenFromFile("TOKEN")).toEqual("token-contents"); expect(externalDataInterceptor.getTokenRecord()).toEqual({ TOKEN: "token-contents", }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/externalDataInterceptor.ts ================================================ import { tokenIntercept } from "./getSSOTokenFromFile"; import { fileIntercept } from "./readFile"; /** * @internal */ export const externalDataInterceptor = { getFileRecord() { return fileIntercept; }, interceptFile(path: string, contents: string) { fileIntercept[path] = Promise.resolve(contents); }, getTokenRecord() { return tokenIntercept; }, interceptToken(id: string, contents: any) { tokenIntercept[id] = contents; }, }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getConfigData.spec.ts ================================================ import { IniSectionType } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { getConfigData } from "./getConfigData"; import { CONFIG_PREFIX_SEPARATOR } from "./loadSharedConfigFiles"; describe(getConfigData.name, () => { it("returns empty for no data", () => { expect(getConfigData({})).toStrictEqual({}); }); it("returns default profile if present", () => { const mockInput = { default: { key: "value" } }; expect(getConfigData(mockInput)).toStrictEqual(mockInput); }); it("skips profiles without prefix profile", () => { const mockInput = { test: { key: "value" } }; expect(getConfigData(mockInput)).toStrictEqual({}); }); it.each([IniSectionType.SSO_SESSION, IniSectionType.SERVICES])("includes sections with '%s' prefix", (prefix) => { const mockInput = { [[prefix, "test"].join(CONFIG_PREFIX_SEPARATOR)]: { key: "value" } }; expect(getConfigData(mockInput)).toStrictEqual(mockInput); // Profile name containing CONFIG_PREFIX_SEPARATOR const profileName = ["foo", "bar"].join(CONFIG_PREFIX_SEPARATOR); const mockInput2 = { [[prefix, profileName].join(CONFIG_PREFIX_SEPARATOR)]: { key: "value" } }; expect(getConfigData(mockInput2)).toStrictEqual(mockInput2); }); describe("normalizes profile names", () => { const getMockProfileData = (profileName: string) => [1, 2, 3] .map((num) => [`key_${profileName}_${num}`, `value_${profileName}_${num}`]) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); const getMockOutput = (profileNames: string[]) => profileNames.reduce((acc, profileName) => ({ ...acc, [profileName]: getMockProfileData(profileName) }), {}); const getMockInput = (mockOutput: Record>) => Object.entries(mockOutput).reduce( (acc, [key, value]) => ({ ...acc, [[IniSectionType.PROFILE, key].join(CONFIG_PREFIX_SEPARATOR)]: value }), {} ); it("profile containing CONFIG_PREFIX_SEPARATOR", () => { const profileName = ["foo", "bar"].join(CONFIG_PREFIX_SEPARATOR); const mockOutput = getMockOutput([profileName]); const mockInput = getMockInput(mockOutput); expect(getConfigData(mockInput)).toStrictEqual(mockOutput); }); it("single profile", () => { const mockOutput = getMockOutput(["one"]); const mockInput = getMockInput(mockOutput); expect(getConfigData(mockInput)).toStrictEqual(mockOutput); }); it("two profiles", () => { const mockOutput = getMockOutput(["one", "two"]); const mockInput = getMockInput(mockOutput); expect(getConfigData(mockInput)).toStrictEqual(mockOutput); }); it("three profiles", () => { const mockOutput = getMockOutput(["one", "two", "three"]); const mockInput = getMockInput(mockOutput); expect(getConfigData(mockInput)).toStrictEqual(mockOutput); }); it("with default", () => { const defaultInput = { default: { key: "value" } }; const mockOutput = getMockOutput(["one"]); const mockInput = getMockInput(mockOutput); expect(getConfigData({ ...defaultInput, ...mockInput })).toStrictEqual({ ...defaultInput, ...mockOutput }); }); it("with profileName without prefix", () => { const profileWithPrefix = { test: { key: "value" } }; const mockOutput = getMockOutput(["one"]); const mockInput = getMockInput(mockOutput); expect(getConfigData({ ...profileWithPrefix, ...mockInput })).toStrictEqual(mockOutput); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getConfigData.ts ================================================ import { IniSectionType, type ParsedIniData } from "@smithy/types"; import { CONFIG_PREFIX_SEPARATOR } from "./constants"; /** * Returns the config data from parsed ini data. * * Returns data for `default` * * Returns profile name without prefix. * * Returns non-profiles as is. */ export const getConfigData = (data: ParsedIniData): ParsedIniData => Object.entries(data) .filter(([key]) => { const indexOfSeparator = key.indexOf(CONFIG_PREFIX_SEPARATOR); if (indexOfSeparator === -1) { // filter out keys which do not contain CONFIG_PREFIX_SEPARATOR. return false; } // Check if prefix is a valid IniSectionType. return Object.values(IniSectionType).includes(key.substring(0, indexOfSeparator) as IniSectionType); }) // remove profile prefix, if present. .reduce( (acc, [key, value]) => { const indexOfSeparator = key.indexOf(CONFIG_PREFIX_SEPARATOR); const updatedKey = key.substring(0, indexOfSeparator) === IniSectionType.PROFILE ? key.substring(indexOfSeparator + 1) : key; acc[updatedKey] = value; return acc; }, { // Populate default profile, if present. ...(data.default && { default: data.default }), } as ParsedIniData ); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getConfigFilepath.spec.ts ================================================ import { join } from "node:path"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { ENV_CONFIG_PATH, getConfigFilepath } from "./getConfigFilepath"; import { getHomeDir } from "./getHomeDir"; vi.mock("path"); vi.mock("./getHomeDir"); describe(getConfigFilepath.name, () => { const mockSeparator = "/"; const mockHomeDir = "/mock/home/dir"; const mockConfigFilepath = "/mock/file/path/config"; const defaultConfigFilepath = `${mockHomeDir}/.aws/config`; afterEach(() => { vi.clearAllMocks(); }); it("returns configFilePath from default locations", () => { vi.mocked(join).mockImplementation((...args) => args.join(mockSeparator)); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); expect(getConfigFilepath()).toStrictEqual(defaultConfigFilepath); expect(getHomeDir).toHaveBeenCalledWith(); expect(join).toHaveBeenCalledWith(mockHomeDir, ".aws", "config"); }); it("returns configFile from location defined in environment", () => { const OLD_ENV = process.env; process.env = { ...OLD_ENV, [ENV_CONFIG_PATH]: mockConfigFilepath, }; expect(getConfigFilepath()).toStrictEqual(mockConfigFilepath); expect(getHomeDir).not.toHaveBeenCalled(); expect(join).not.toHaveBeenCalled(); process.env = OLD_ENV; }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getConfigFilepath.ts ================================================ import { join } from "node:path"; import { getHomeDir } from "./getHomeDir"; export const ENV_CONFIG_PATH = "AWS_CONFIG_FILE"; export const getConfigFilepath = () => process.env[ENV_CONFIG_PATH] || join(getHomeDir(), ".aws", "config"); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getCredentialsFilepath.spec.ts ================================================ import { join } from "node:path"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { ENV_CREDENTIALS_PATH, getCredentialsFilepath } from "./getCredentialsFilepath"; import { getHomeDir } from "./getHomeDir"; vi.mock("path"); vi.mock("./getHomeDir"); describe(getCredentialsFilepath.name, () => { const mockSeparator = "/"; const mockHomeDir = "/mock/home/dir"; const mockConfigFilepath = "/mock/file/path/credentials"; const defaultConfigFilepath = `${mockHomeDir}/.aws/credentials`; afterEach(() => { vi.clearAllMocks(); }); it("returns configFilePath from default locations", () => { vi.mocked(join).mockImplementation((...args) => args.join(mockSeparator)); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); expect(getCredentialsFilepath()).toStrictEqual(defaultConfigFilepath); expect(getHomeDir).toHaveBeenCalledWith(); expect(join).toHaveBeenCalledWith(mockHomeDir, ".aws", "credentials"); }); it("returns configFile from location defined in environment", () => { const OLD_ENV = process.env; process.env = { ...OLD_ENV, [ENV_CREDENTIALS_PATH]: mockConfigFilepath, }; expect(getCredentialsFilepath()).toStrictEqual(mockConfigFilepath); expect(getHomeDir).not.toHaveBeenCalled(); expect(join).not.toHaveBeenCalled(); process.env = OLD_ENV; }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getCredentialsFilepath.ts ================================================ import { join } from "node:path"; import { getHomeDir } from "./getHomeDir"; export const ENV_CREDENTIALS_PATH = "AWS_SHARED_CREDENTIALS_FILE"; export const getCredentialsFilepath = () => process.env[ENV_CREDENTIALS_PATH] || join(getHomeDir(), ".aws", "credentials"); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getHomeDir.spec.ts ================================================ import { homedir } from "node:os"; import { sep } from "node:path"; import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, test as it, vi, type Mock } from "vitest"; import { getHomeDir } from "./getHomeDir"; vi.mock("os"); describe(getHomeDir.name, () => { const mockUid = 1; const mockHOME = "mockHOME"; const mockUSERPROFILE = "mockUSERPROFILE"; const mockHOMEPATH = "mockHOMEPATH"; const mockHOMEDRIVE = "mockHOMEDRIVE"; const mockHomeDir = "mockHomeDir"; const OLD_ENV = process.env; beforeEach(() => { vi.mocked(homedir).mockReturnValue(mockHomeDir); process.env = { ...OLD_ENV, HOME: mockHOME, USERPROFILE: mockUSERPROFILE, HOMEPATH: mockHOMEPATH, HOMEDRIVE: mockHOMEDRIVE, }; }); afterEach(() => { process.env = OLD_ENV; vi.clearAllMocks(); vi.resetModules(); }); it("returns value in process.env.HOME first", () => { expect(getHomeDir()).toEqual(mockHOME); expect(homedir).not.toHaveBeenCalled(); }); it("returns value in process.env.USERPROFILE second", () => { process.env = { ...process.env, HOME: undefined }; expect(getHomeDir()).toEqual(mockUSERPROFILE); expect(homedir).not.toHaveBeenCalled(); }); describe("returns value in HOMEPATH third", () => { beforeEach(() => { process.env = { ...process.env, HOME: undefined, USERPROFILE: undefined }; }); afterEach(() => { expect(homedir).not.toHaveBeenCalled(); }); it("uses value in process.env.HOMEDRIVE if it's set", () => { expect(getHomeDir()).toEqual(`${mockHOMEDRIVE}${mockHOMEPATH}`); }); it("uses default if process.env.HOMEDRIVE is not set", () => { process.env = { ...process.env, HOMEDRIVE: undefined }; expect(getHomeDir()).toEqual(`C:${sep}${mockHOMEPATH}`); }); }); it("returns value from homedir fourth", () => { const processGeteuidSpy = (vi.spyOn(process, "geteuid") as Mock).mockReturnValue(mockUid); process.env = { ...process.env, HOME: undefined, USERPROFILE: undefined, HOMEPATH: undefined }; expect(getHomeDir()).toEqual(mockHomeDir); expect(homedir).toHaveBeenCalledTimes(1); expect(processGeteuidSpy).toHaveBeenCalledTimes(1); }); describe("makes one homedir call irrespective of getHomeDir calls", async () => { const testSingleHomeDirCall = async (num: number) => { const { getHomeDir } = await import("./getHomeDir"); process.env = { ...process.env, HOME: undefined, USERPROFILE: undefined, HOMEPATH: undefined }; expect(homedir).not.toHaveBeenCalled(); const homeDirArr = Array(num) .fill(num) .map(() => getHomeDir()); expect(homeDirArr).toStrictEqual(Array(num).fill(mockHomeDir)); // There is one homedir call even through getHomeDir is called num times. expect(homedir).toHaveBeenCalledTimes(1); }; describe("when geteuid is available", () => { it.each([10, 100, 1000, 10000])("calls: %d ", async (num: number) => { const processGeteuidSpy = (vi.spyOn(process, "geteuid") as Mock).mockReturnValue(mockUid); expect(processGeteuidSpy).not.toHaveBeenCalled(); await testSingleHomeDirCall(num); expect(processGeteuidSpy).toHaveBeenCalledTimes(num); }); }); describe("when geteuid is not available", () => { const OLD_GETEUID = process.geteuid; beforeAll(() => { // @ts-ignore Type 'undefined' is not assignable to type '() => number'. process.geteuid = undefined; }); afterAll(() => { process.geteuid = OLD_GETEUID; }); it.each([10, 100, 1000, 10000])("calls: %d ", testSingleHomeDirCall); }); }); describe("makes multiple homedir calls with based on UIDs", async () => { it.each([2, 10, 100])("calls: %d ", async (num: number) => { const { getHomeDir } = await import("./getHomeDir"); const processGeteuidSpy = vi.spyOn(process, "geteuid") as Mock; processGeteuidSpy.mockReturnValue(mockUid); for (let i = 0; i < num; i++) { processGeteuidSpy.mockReturnValueOnce(mockUid + i); } process.env = { ...process.env, HOME: undefined, USERPROFILE: undefined, HOMEPATH: undefined }; expect(homedir).not.toHaveBeenCalled(); expect(processGeteuidSpy).not.toHaveBeenCalled(); const homeDirArr = Array(num) .fill(num) .map(() => getHomeDir()); expect(homeDirArr).toStrictEqual(Array(num).fill(mockHomeDir)); // There is num homedir calls as each call returns different UID expect(homedir).toHaveBeenCalledTimes(num); expect(processGeteuidSpy).toHaveBeenCalledTimes(num); const homeDir = getHomeDir(); expect(homeDir).toStrictEqual(mockHomeDir); // No extra calls made to homedir, as mockUid is same as the first call. expect(homedir).toHaveBeenCalledTimes(num); // Extra call was made to geteuid to get the same UID as the first call. expect(processGeteuidSpy).toHaveBeenCalledTimes(num + 1); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getHomeDir.ts ================================================ import { homedir } from "node:os"; import { sep } from "node:path"; const homeDirCache: Record = {}; const getHomeDirCacheKey = (): string => { // geteuid is only available on POSIX platforms (i.e. not Windows or Android). if (process && process.geteuid) { return `${process.geteuid()}`; } return "DEFAULT"; }; /** * Get the HOME directory for the current runtime. * * @internal */ export const getHomeDir = (): string => { const { HOME, USERPROFILE, HOMEPATH, HOMEDRIVE = `C:${sep}` } = process.env; if (HOME) return HOME; if (USERPROFILE) return USERPROFILE; if (HOMEPATH) return `${HOMEDRIVE}${HOMEPATH}`; const homeDirCacheKey = getHomeDirCacheKey(); if (!homeDirCache[homeDirCacheKey]) homeDirCache[homeDirCacheKey] = homedir(); return homeDirCache[homeDirCacheKey]; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getProfileName.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it } from "vitest"; import { DEFAULT_PROFILE, ENV_PROFILE, getProfileName } from "./getProfileName"; describe(getProfileName.name, () => { const OLD_ENV = process.env; const mockProfileNameFromEnv = "mockProfileNameFromEnv"; beforeEach(() => { process.env = { ...OLD_ENV, [ENV_PROFILE]: mockProfileNameFromEnv, }; }); afterEach(() => { process.env = OLD_ENV; }); it("returns profile if present in param", () => { const profile = "mockProfile"; expect(getProfileName({ profile })).toBe(profile); }); it(`returns profile from env var '${ENV_PROFILE}' if present`, () => { expect(getProfileName({})).toBe(mockProfileNameFromEnv); }); it(`returns profile '${DEFAULT_PROFILE}' as default`, () => { process.env[ENV_PROFILE] = undefined; expect(getProfileName({})).toBe(DEFAULT_PROFILE); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getProfileName.ts ================================================ /** * @internal */ export const ENV_PROFILE = "AWS_PROFILE"; /** * @internal */ export const DEFAULT_PROFILE = "default"; /** * Returns profile with priority order code - ENV - default. * @internal */ export const getProfileName = (init: { profile?: string }): string => init.profile || process.env[ENV_PROFILE] || DEFAULT_PROFILE; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSSOTokenFilepath.spec.ts ================================================ import { createHash } from "node:crypto"; import { join } from "node:path"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getHomeDir } from "./getHomeDir"; import { getSSOTokenFilepath } from "./getSSOTokenFilepath"; vi.mock("crypto"); vi.mock("./getHomeDir"); describe(getSSOTokenFilepath.name, () => { const mockCacheName = "mockCacheName"; const mockDigest = vi.fn().mockReturnValue(mockCacheName); const mockUpdate = vi.fn().mockReturnValue({ digest: mockDigest }); const mockHomeDir = "/home/dir"; const mockSsoStartUrl = "mock_sso_start_url"; beforeEach(() => { vi.mocked(createHash).mockReturnValue({ update: mockUpdate } as any); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); }); afterEach(() => { expect(createHash).toHaveBeenCalledWith("sha1"); vi.clearAllMocks(); }); describe("re-throws error", () => { const mockError = new Error("error"); it("when createHash throws error", () => { vi.mocked(createHash).mockImplementationOnce(() => { throw mockError; }); expect(() => getSSOTokenFilepath(mockSsoStartUrl)).toThrow(mockError); expect(mockUpdate).not.toHaveBeenCalled(); expect(mockDigest).not.toHaveBeenCalled(); expect(getHomeDir).not.toHaveBeenCalled(); }); it("when hash.update() throws error", () => { mockUpdate.mockImplementationOnce(() => { throw mockError; }); expect(() => getSSOTokenFilepath(mockSsoStartUrl)).toThrow(mockError); expect(mockUpdate).toHaveBeenCalledWith(mockSsoStartUrl); expect(mockDigest).not.toHaveBeenCalled(); expect(getHomeDir).not.toHaveBeenCalled(); }); it("when hash.digest() throws error", () => { mockDigest.mockImplementationOnce(() => { throw mockError; }); expect(() => getSSOTokenFilepath(mockSsoStartUrl)).toThrow(mockError); expect(mockUpdate).toHaveBeenCalledWith(mockSsoStartUrl); expect(mockDigest).toHaveBeenCalledWith("hex"); expect(getHomeDir).not.toHaveBeenCalled(); }); it("when getHomeDir() throws error", () => { vi.mocked(getHomeDir).mockImplementationOnce(() => { throw mockError; }); expect(() => getSSOTokenFilepath(mockSsoStartUrl)).toThrow(mockError); expect(mockUpdate).toHaveBeenCalledWith(mockSsoStartUrl); expect(mockDigest).toHaveBeenCalledWith("hex"); expect(getHomeDir).toHaveBeenCalled(); }); }); it("returns token filepath", () => { const ssoTokenFilepath = getSSOTokenFilepath(mockSsoStartUrl); expect(ssoTokenFilepath).toStrictEqual(join(mockHomeDir, ".aws", "sso", "cache", `${mockCacheName}.json`)); expect(mockUpdate).toHaveBeenCalledWith(mockSsoStartUrl); expect(mockDigest).toHaveBeenCalledWith("hex"); expect(getHomeDir).toHaveBeenCalled(); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSSOTokenFilepath.ts ================================================ import { createHash } from "node:crypto"; import { join } from "node:path"; import { getHomeDir } from "./getHomeDir"; /** * Returns the filepath of the file where SSO token is stored. * @internal */ export const getSSOTokenFilepath = (id: string) => { const hasher = createHash("sha1"); const cacheName = hasher.update(id).digest("hex"); return join(getHomeDir(), ".aws", "sso", "cache", `${cacheName}.json`); }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSSOTokenFromFile.spec.ts ================================================ import * as promises from "node:fs/promises"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getSSOTokenFilepath } from "./getSSOTokenFilepath"; import { getSSOTokenFromFile } from "./getSSOTokenFromFile"; vi.mock("node:fs/promises", () => ({ readFile: vi.fn() })); vi.mock("./getSSOTokenFilepath"); describe(getSSOTokenFromFile.name, () => { const mockSsoStartUrl = "mock_sso_start_url"; const mockSsoTokenFilepath = "/home/dir/.aws/sso/cache/mockCacheName.json"; const mockToken = { accessToken: "mockAccessToken", expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(), }; beforeEach(() => { vi.mocked(getSSOTokenFilepath).mockReturnValue(mockSsoTokenFilepath); (promises.readFile as any).mockResolvedValue(JSON.stringify(mockToken)); }); afterEach(() => { vi.clearAllMocks(); }); it("re-throws if getting SSO Token filepath fails", async () => { const expectedError = new Error("error"); vi.mocked(getSSOTokenFilepath).mockImplementationOnce(() => { throw expectedError; }); try { await getSSOTokenFromFile(mockSsoStartUrl); fail(`expected ${expectedError}`); } catch (error) { expect(error).toStrictEqual(expectedError); } expect(promises.readFile).not.toHaveBeenCalled(); }); it("re-throws if readFile fails", async () => { const expectedError = new Error("error"); (promises.readFile as any).mockRejectedValue(expectedError); try { await getSSOTokenFromFile(mockSsoStartUrl); fail(`expected ${expectedError}`); } catch (error) { expect(error).toStrictEqual(expectedError); } expect(promises.readFile).toHaveBeenCalledWith(mockSsoTokenFilepath, "utf8"); }); it("re-throws if token is not a valid JSON", async () => { const errMsg = "Unexpected token"; (promises.readFile as any).mockReturnValue("invalid JSON"); try { await getSSOTokenFromFile(mockSsoStartUrl); fail(`expected '${errMsg}'`); } catch (error) { expect(error.message).toContain(errMsg); } expect(promises.readFile).toHaveBeenCalledWith(mockSsoTokenFilepath, "utf8"); }); it("returns token when it's valid", async () => { const token = await getSSOTokenFromFile(mockSsoStartUrl); expect(token).toStrictEqual(mockToken); expect(promises.readFile).toHaveBeenCalledWith(mockSsoTokenFilepath, "utf8"); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSSOTokenFromFile.ts ================================================ import { readFile } from "node:fs/promises"; import { getSSOTokenFilepath } from "./getSSOTokenFilepath"; /** * Cached SSO token retrieved from SSO login flow. * @public */ export interface SSOToken { /** * A base64 encoded string returned by the sso-oidc service. */ accessToken: string; /** * The expiration time of the accessToken as an RFC 3339 formatted timestamp. */ expiresAt: string; /** * The token used to obtain an access token in the event that the accessToken is invalid or expired. */ refreshToken?: string; /** * The unique identifier string for each client. The client ID generated when performing the registration * portion of the OIDC authorization flow. This is used to refresh the accessToken. */ clientId?: string; /** * A secret string generated when performing the registration portion of the OIDC authorization flow. * This is used to refresh the accessToken. */ clientSecret?: string; /** * The expiration time of the client registration (clientId and clientSecret) as an RFC 3339 formatted timestamp. */ registrationExpiresAt?: string; /** * The configured sso_region for the profile that credentials are being resolved for. */ region?: string; /** * The configured sso_start_url for the profile that credentials are being resolved for. */ startUrl?: string; } /** * For testing only. * @internal * @deprecated minimize use in application code. */ export const tokenIntercept = {} as Record; /** * Returns the SSO token from the file system. * * @internal * @param id - can be either a start URL or the SSO session name. */ export const getSSOTokenFromFile = async (id: string) => { if (tokenIntercept[id]) { return tokenIntercept[id]; } const ssoTokenFilepath = getSSOTokenFilepath(id); const ssoTokenText = await readFile(ssoTokenFilepath, "utf8"); return JSON.parse(ssoTokenText) as SSOToken; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSsoSessionData.spec.ts ================================================ import { IniSectionType } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { getSsoSessionData } from "./getSsoSessionData"; import { CONFIG_PREFIX_SEPARATOR } from "./loadSharedConfigFiles"; describe(getSsoSessionData.name, () => { it("returns empty for no data", () => { expect(getSsoSessionData({})).toStrictEqual({}); }); it("skips sections without prefix sso-session", () => { const mockInput = { test: { key: "value" } }; expect(getSsoSessionData(mockInput)).toStrictEqual({}); }); it("skips sections with different prefix", () => { const mockInput = { "not-sso-session test": { key: "value" } }; expect(getSsoSessionData(mockInput)).toStrictEqual({}); }); describe("normalizes sso-session names", () => { const getMockSsoSessionData = (ssoSessionName: string) => [1, 2, 3] .map((num) => [`key_${ssoSessionName}_${num}`, `value_${ssoSessionName}_${num}`]) .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); const getMockOutput = (ssoSessionNames: string[]) => ssoSessionNames.reduce((acc, profileName) => ({ ...acc, [profileName]: getMockSsoSessionData(profileName) }), {}); const getMockInput = (mockOutput: { [key: string]: { [key: string]: string } }) => Object.entries(mockOutput).reduce( (acc, [key, value]) => ({ ...acc, [[IniSectionType.SSO_SESSION, key].join(CONFIG_PREFIX_SEPARATOR)]: value }), {} ); it(`sso-session section with prefix separator ${CONFIG_PREFIX_SEPARATOR}`, () => { const mockOutput = getMockOutput([["prefix", "suffix"].join(CONFIG_PREFIX_SEPARATOR)]); const mockInput = getMockInput(mockOutput); expect(getSsoSessionData(mockInput)).toStrictEqual(mockOutput); }); it("single sso-session section", () => { const mockOutput = getMockOutput(["one"]); const mockInput = getMockInput(mockOutput); expect(getSsoSessionData(mockInput)).toStrictEqual(mockOutput); }); it("two sso-session sections", () => { const mockOutput = getMockOutput(["one", "two"]); const mockInput = getMockInput(mockOutput); expect(getSsoSessionData(mockInput)).toStrictEqual(mockOutput); }); it("three sso-session sections", () => { const mockOutput = getMockOutput(["one", "two", "three"]); const mockInput = getMockInput(mockOutput); expect(getSsoSessionData(mockInput)).toStrictEqual(mockOutput); }); it("with section without prefix", () => { const sectionWithoutPrefix = { test: { key: "value" } }; const mockOutput = getMockOutput(["one"]); const mockInput = getMockInput(mockOutput); expect(getSsoSessionData({ ...sectionWithoutPrefix, ...mockInput })).toStrictEqual(mockOutput); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/getSsoSessionData.ts ================================================ import { IniSectionType, type ParsedIniData } from "@smithy/types"; import { CONFIG_PREFIX_SEPARATOR } from "./loadSharedConfigFiles"; /** * Returns the sso-session data from parsed ini data by reading * ssoSessionName after sso-session prefix including/excluding quotes */ export const getSsoSessionData = (data: ParsedIniData): ParsedIniData => Object.entries(data) // filter out non sso-session keys .filter(([key]) => key.startsWith(IniSectionType.SSO_SESSION + CONFIG_PREFIX_SEPARATOR)) // replace sso-session key with sso-session name .reduce((acc, [key, value]) => ({ ...acc, [key.substring(key.indexOf(CONFIG_PREFIX_SEPARATOR) + 1)]: value }), {}); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/loadSharedConfigFiles.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getConfigData } from "./getConfigData"; import { getConfigFilepath } from "./getConfigFilepath"; import { getCredentialsFilepath } from "./getCredentialsFilepath"; import { getHomeDir } from "./getHomeDir"; import { loadSharedConfigFiles } from "./loadSharedConfigFiles"; import { parseIni } from "./parseIni"; import { readFile } from "./readFile"; vi.mock("./getConfigData"); vi.mock("./getConfigFilepath"); vi.mock("./getCredentialsFilepath"); vi.mock("./parseIni"); vi.mock("./readFile"); vi.mock("./getHomeDir"); describe("loadSharedConfigFiles", () => { const mockConfigFilepath = "/mock/file/path/config"; const mockCredsFilepath = "/mock/file/path/credentials"; const mockSharedConfigFiles = { configFile: mockConfigFilepath, credentialsFile: mockCredsFilepath, }; const mockHomeDir = "/users/alias"; beforeEach(() => { vi.mocked(getConfigFilepath).mockReturnValue(mockConfigFilepath); vi.mocked(getCredentialsFilepath).mockReturnValue(mockCredsFilepath); vi.mocked(parseIni).mockImplementation((args: any) => args); vi.mocked(getConfigData).mockImplementation((args) => args); vi.mocked(readFile).mockImplementation((path) => Promise.resolve(path)); vi.mocked(getHomeDir).mockReturnValue(mockHomeDir); }); afterEach(() => { vi.clearAllMocks(); vi.resetModules(); }); it("returns configFile and credentialsFile from default locations", async () => { const sharedConfigFiles = await loadSharedConfigFiles(); expect(sharedConfigFiles).toStrictEqual(mockSharedConfigFiles); expect(getConfigFilepath).toHaveBeenCalledWith(); expect(getCredentialsFilepath).toHaveBeenCalledWith(); }); it("returns configFile and credentialsFile from init if defined", async () => { const sharedConfigFiles = await loadSharedConfigFiles({ filepath: mockCredsFilepath, configFilepath: mockConfigFilepath, }); expect(sharedConfigFiles).toStrictEqual(mockSharedConfigFiles); expect(getConfigFilepath).not.toHaveBeenCalled(); expect(getCredentialsFilepath).not.toHaveBeenCalled(); }); it("expands homedir in configFile and credentialsFile from init if defined", async () => { const sharedConfigFiles = await loadSharedConfigFiles({ filepath: "~/path/credentials", configFilepath: "~/path/config", }); expect(sharedConfigFiles).toStrictEqual({ configFile: "/users/alias/path/config", credentialsFile: "/users/alias/path/credentials", }); expect(getHomeDir).toHaveBeenCalled(); expect(getConfigFilepath).not.toHaveBeenCalled(); expect(getCredentialsFilepath).not.toHaveBeenCalled(); }); describe("swallows error and returns empty configuration", () => { it("when readFile throws error", async () => { vi.mocked(readFile).mockRejectedValue("error"); const sharedConfigFiles = await loadSharedConfigFiles(); expect(sharedConfigFiles).toStrictEqual({ configFile: {}, credentialsFile: {} }); }); it("when parseIni throws error", async () => { vi.mocked(parseIni).mockRejectedValue("error"); const sharedConfigFiles = await loadSharedConfigFiles(); expect(sharedConfigFiles).toStrictEqual({ configFile: {}, credentialsFile: {} }); }); it("when normalizeConfigFile throws error", async () => { vi.mocked(getConfigData).mockRejectedValue("error"); const sharedConfigFiles = await loadSharedConfigFiles(); expect(sharedConfigFiles).toStrictEqual({ configFile: {}, credentialsFile: mockCredsFilepath, }); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/loadSharedConfigFiles.ts ================================================ import { join } from "node:path"; import type { Logger, SharedConfigFiles } from "@smithy/types"; import { getConfigData } from "./getConfigData"; import { getConfigFilepath } from "./getConfigFilepath"; import { getCredentialsFilepath } from "./getCredentialsFilepath"; import { getHomeDir } from "./getHomeDir"; import { parseIni } from "./parseIni"; import { readFile } from "./readFile"; /** * @public */ export interface SharedConfigInit { /** * The path at which to locate the ini credentials file. Defaults to the * value of the `AWS_SHARED_CREDENTIALS_FILE` environment variable (if * defined) or `~/.aws/credentials` otherwise. */ filepath?: string; /** * The path at which to locate the ini config file. Defaults to the value of * the `AWS_CONFIG_FILE` environment variable (if defined) or * `~/.aws/config` otherwise. */ configFilepath?: string; /** * Configuration files are normally cached after the first time they are loaded. When this * property is set, the provider will always reload any configuration files loaded before. */ ignoreCache?: boolean; /** * For credential resolution trace logging. */ logger?: Logger; } const swallowError = () => ({}); export { CONFIG_PREFIX_SEPARATOR } from "./constants"; /** * Loads the config and credentials files. * @internal */ export const loadSharedConfigFiles = async (init: SharedConfigInit = {}): Promise => { const { filepath = getCredentialsFilepath(), configFilepath = getConfigFilepath() } = init; const homeDir = getHomeDir(); const relativeHomeDirPrefix = "~/"; let resolvedFilepath = filepath; if (filepath.startsWith(relativeHomeDirPrefix)) { resolvedFilepath = join(homeDir, filepath.slice(2)); } let resolvedConfigFilepath = configFilepath; if (configFilepath.startsWith(relativeHomeDirPrefix)) { resolvedConfigFilepath = join(homeDir, configFilepath.slice(2)); } const parsedFiles = await Promise.all([ readFile(resolvedConfigFilepath, { ignoreCache: init.ignoreCache, }) .then(parseIni) .then(getConfigData) .catch(swallowError), readFile(resolvedFilepath, { ignoreCache: init.ignoreCache, }) .then(parseIni) .catch(swallowError), ]); return { configFile: parsedFiles[0], credentialsFile: parsedFiles[1], }; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/loadSsoSessionData.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getConfigFilepath } from "./getConfigFilepath"; import { getSsoSessionData } from "./getSsoSessionData"; import { loadSsoSessionData } from "./loadSsoSessionData"; import { parseIni } from "./parseIni"; import { readFile } from "./readFile"; vi.mock("./getConfigFilepath"); vi.mock("./getSsoSessionData"); vi.mock("./parseIni"); vi.mock("./readFile"); describe(loadSsoSessionData.name, () => { const mockConfigFilepath = "/mock/file/path/config"; const mockSsoSessionData = { test: { key: "value" } }; beforeEach(() => { vi.mocked(getConfigFilepath).mockReturnValue(mockConfigFilepath); vi.mocked(parseIni).mockImplementation((args: any) => args); vi.mocked(getSsoSessionData).mockReturnValue(mockSsoSessionData); vi.mocked(readFile).mockImplementation((path) => Promise.resolve(path)); }); afterEach(() => { vi.clearAllMocks(); }); it("returns configFile from default locations", async () => { const ssoSessionData = await loadSsoSessionData(); expect(ssoSessionData).toStrictEqual(mockSsoSessionData); expect(getConfigFilepath).toHaveBeenCalledWith(); }); it("returns configFile from init if defined", async () => { const ssoSessionData = await loadSsoSessionData({ configFilepath: mockConfigFilepath, }); expect(ssoSessionData).toStrictEqual(mockSsoSessionData); expect(getConfigFilepath).not.toHaveBeenCalled(); }); describe("swallows error and returns empty configuration", () => { it("when readFile throws error", async () => { vi.mocked(readFile).mockRejectedValue("error"); const ssoSessionData = await loadSsoSessionData(); expect(ssoSessionData).toStrictEqual({}); }); it("when parseIni throws error", async () => { vi.mocked(parseIni).mockRejectedValue("error"); const ssoSessionData = await loadSsoSessionData(); expect(ssoSessionData).toStrictEqual({}); }); it("when normalizeConfigFile throws error", async () => { vi.mocked(getSsoSessionData).mockRejectedValue("error"); const ssoSessionData = await loadSsoSessionData(); expect(ssoSessionData).toStrictEqual({}); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/loadSsoSessionData.ts ================================================ import type { ParsedIniData } from "@smithy/types"; import { getConfigFilepath } from "./getConfigFilepath"; import { getSsoSessionData } from "./getSsoSessionData"; import { parseIni } from "./parseIni"; import { readFile } from "./readFile"; /** * Subset of {@link SharedConfigInit}. * @internal */ export interface SsoSessionInit { /** * The path at which to locate the ini config file. Defaults to the value of * the `AWS_CONFIG_FILE` environment variable (if defined) or * `~/.aws/config` otherwise. */ configFilepath?: string; } const swallowError = () => ({}); /** * @internal */ export const loadSsoSessionData = async (init: SsoSessionInit = {}): Promise => readFile(init.configFilepath ?? getConfigFilepath()) .then(parseIni) .then(getSsoSessionData) .catch(swallowError); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/mergeConfigFiles.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { mergeConfigFiles } from "./mergeConfigFiles"; describe(mergeConfigFiles.name, () => { it("merges profiles that are in multiple files", () => { const mockConfigFile = { profileName1: { configKey: "configValue1" }, }; const mockCredentialsFile = { profileName1: { credsKey: "configValue1" }, profileName2: { credsKey: "credsValue1" }, }; expect(mergeConfigFiles(mockConfigFile, mockCredentialsFile)).toMatchInlineSnapshot(` { "profileName1": { "configKey": "configValue1", "credsKey": "configValue1", }, "profileName2": { "credsKey": "credsValue1", }, } `); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/mergeConfigFiles.ts ================================================ import type { ParsedIniData } from "@smithy/types"; /** * Merge multiple profile config files such that settings each file are kept together * * @internal */ export const mergeConfigFiles = (...files: ParsedIniData[]): ParsedIniData => { const merged: ParsedIniData = {}; for (const file of files) { for (const [key, values] of Object.entries(file)) { if (merged[key] !== undefined) { Object.assign(merged[key], values); } else { merged[key] = values; } } } return merged; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/parseIni.spec.ts ================================================ import { IniSectionType } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { CONFIG_PREFIX_SEPARATOR } from "./loadSharedConfigFiles"; import { parseIni } from "./parseIni"; describe(parseIni.name, () => { it.each(["__proto__", "profile __proto__"])("throws error if profile name is '%s'", (deniedProfileName) => { const initData = `[${deniedProfileName}]\nfoo = not_exist`; expect(() => { parseIni(initData); }).toThrowError(`Found invalid profile name "${deniedProfileName}"`); }); describe("parses config for other keys", () => { const mockProfileName = "mock_profile_name"; const mockProfileData = { key: "value" }; const getMockProfileDataEntries = (profileData: Record>) => Object.entries(profileData).map(([key, value]) => { let result = `${key}=`; if (typeof value === "string") { result += `${value}`; } else { result += `\n ${getMockProfileDataEntries(value).join("\n ")}`; } return result; }); const getMockProfileContent = (profileName: string, profileData: Record>) => `[${profileName}]\n${getMockProfileDataEntries(profileData).join("\n")}\n`; it("trims data from key/value", () => { const mockInput = `[${mockProfileName}]\n ${Object.entries(mockProfileData) .map(([key, value]) => ` ${key} = ${value} `) .join("\n")}`; expect(parseIni(mockInput)).toStrictEqual({ [mockProfileName]: mockProfileData, }); }); it("returns value with equals sign", () => { const mockProfileDataWithEqualsSign = { key: "value=value" }; const mockInput = getMockProfileContent(mockProfileName, mockProfileDataWithEqualsSign); expect(parseIni(mockInput)).toStrictEqual({ [mockProfileName]: mockProfileDataWithEqualsSign, }); }); it.each(Object.values(IniSectionType))( "returns data for section '%s' with separator", (sectionType: IniSectionType) => { const mockSectionName = "mock_section_name"; const mockSectionFullName = [sectionType, mockSectionName].join(" "); const mockInput = getMockProfileContent(mockSectionFullName, mockProfileData); expect(parseIni(mockInput)).toStrictEqual({ [[sectionType, mockSectionName].join(CONFIG_PREFIX_SEPARATOR)]: mockProfileData, }); } ); // Some characters are not allowed in profile name, but we parse them as customers use them. // `@` https://github.com/smithy-lang/smithy-typescript/issues/1026 // `+` https://github.com/aws/aws-sdk-js-v3/issues/5373 // `.` https://github.com/aws/aws-sdk-js-v3/issues/5449 // `/` https://github.com/smithy-lang/smithy-typescript/issues/1053 // `%` https://github.com/aws/aws-sdk-java-v2/pull/1538 // `:` https://github.com/aws/aws-sdk-java-v2/pull/1898 it.each(["-", "_", "@", "+", ".", "/", "%", ":"])( "returns data for character '%s' in profile name", (specialChar: string) => { const mockProfileName = ["profile", "stage"].join(specialChar); const mockSectionFullName = ["profile", mockProfileName].join(" "); const mockInput = getMockProfileContent(mockSectionFullName, mockProfileData); expect(parseIni(mockInput)).toStrictEqual({ [["profile", mockProfileName].join(CONFIG_PREFIX_SEPARATOR)]: mockProfileData, }); } ); it("returns data for two profiles", () => { const mockProfile1 = getMockProfileContent(mockProfileName, mockProfileData); const mockProfileName2 = "mock_profile_name_2"; const mockProfileData2 = { key2: "value2" }; const mockProfile2 = getMockProfileContent(mockProfileName2, mockProfileData2); expect(parseIni(`${mockProfile1}${mockProfile2}`)).toStrictEqual({ [mockProfileName]: mockProfileData, [mockProfileName2]: mockProfileData2, }); }); it("skip section if data is not present", () => { const mockProfileNameWithoutData = "mock_profile_name_without_data"; const mockInput = getMockProfileContent(mockProfileName, mockProfileData); expect(parseIni(`${mockInput}[${mockProfileNameWithoutData}]`)).toStrictEqual({ [mockProfileName]: mockProfileData, }); expect(parseIni(`[${mockProfileNameWithoutData}]\n${mockInput}`)).toStrictEqual({ [mockProfileName]: mockProfileData, }); }); it("returns data for profile containing multiple entries", () => { const mockProfileDataMultipleEntries = { key1: "value1", key2: "value2", key3: "value3" }; const mockInput = getMockProfileContent(mockProfileName, mockProfileDataMultipleEntries); expect(parseIni(mockInput)).toStrictEqual({ [mockProfileName]: mockProfileDataMultipleEntries, }); }); describe("returns data from main section, and not subsection", () => { it("if subsection comes after section", () => { const mockProfileDataWithSubSettings = { key: "keyValue", subSection: { key: "keyValueInSubSection", subKey: "subKeyValue", }, }; const mockInput = getMockProfileContent(mockProfileName, mockProfileDataWithSubSettings); expect(parseIni(mockInput)).toStrictEqual({ [mockProfileName]: { key: "keyValue", [["subSection", "key"].join(CONFIG_PREFIX_SEPARATOR)]: "keyValueInSubSection", [["subSection", "subKey"].join(CONFIG_PREFIX_SEPARATOR)]: "subKeyValue", }, }); const mockProfileName2 = "mock_profile_name_2"; const mockProfileDataWithSubSettings2 = { key: "keyValue2", subSection: { key: "keyValue2InSubSection", subKey: "subKeyValue2", }, }; const mockInput2 = getMockProfileContent(mockProfileName2, mockProfileDataWithSubSettings2); expect(parseIni(`${mockInput}${mockInput2}`)).toStrictEqual({ [mockProfileName]: { key: "keyValue", [["subSection", "key"].join(CONFIG_PREFIX_SEPARATOR)]: "keyValueInSubSection", [["subSection", "subKey"].join(CONFIG_PREFIX_SEPARATOR)]: "subKeyValue", }, [mockProfileName2]: { key: "keyValue2", [["subSection", "key"].join(CONFIG_PREFIX_SEPARATOR)]: "keyValue2InSubSection", [["subSection", "subKey"].join(CONFIG_PREFIX_SEPARATOR)]: "subKeyValue2", }, }); }); it("if subsection comes before section", () => { const mockProfileDataWithSubSettings = { subSection: { key: "keyValueInSubSection", subKey: "subKeyValue", }, key: "keyValue", }; const mockInput = getMockProfileContent(mockProfileName, mockProfileDataWithSubSettings); expect(parseIni(mockInput)).toStrictEqual({ [mockProfileName]: { [["subSection", "key"].join(CONFIG_PREFIX_SEPARATOR)]: "keyValueInSubSection", [["subSection", "subKey"].join(CONFIG_PREFIX_SEPARATOR)]: "subKeyValue", key: "keyValue", }, }); }); }); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/parseIni.ts ================================================ import { IniSectionType, type ParsedIniData } from "@smithy/types"; import { CONFIG_PREFIX_SEPARATOR } from "./constants"; const prefixKeyRegex = /^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/; const profileNameBlockList = ["__proto__", "profile __proto__"]; export const parseIni = (iniData: string): ParsedIniData => { const map: ParsedIniData = {}; let currentSection: string | undefined; let currentSubSection: string | undefined; for (const iniLine of iniData.split(/\r?\n/)) { const trimmedLine = iniLine.split(/(^|\s)[;#]/)[0].trim(); // remove comments and trim const isSection: boolean = trimmedLine[0] === "[" && trimmedLine[trimmedLine.length - 1] === "]"; if (isSection) { // New section found. Reset currentSection and currentSubSection. currentSection = undefined; currentSubSection = undefined; const sectionName = trimmedLine.substring(1, trimmedLine.length - 1); const matches = prefixKeyRegex.exec(sectionName); if (matches) { const [, prefix, , name] = matches; // Add prefix, if the section name starts with `profile`, `sso-session` or `services`. if (Object.values(IniSectionType).includes(prefix as IniSectionType)) { currentSection = [prefix, name].join(CONFIG_PREFIX_SEPARATOR); } } else { // If the section name does not match the regex, use the section name as is. currentSection = sectionName; } if (profileNameBlockList.includes(sectionName)) { throw new Error(`Found invalid profile name "${sectionName}"`); } } else if (currentSection) { const indexOfEqualsSign = trimmedLine.indexOf("="); if (![0, -1].includes(indexOfEqualsSign)) { const [name, value]: [string, string] = [ trimmedLine.substring(0, indexOfEqualsSign).trim(), trimmedLine.substring(indexOfEqualsSign + 1).trim(), ]; if (value === "") { currentSubSection = name; } else { if (currentSubSection && iniLine.trimStart() === iniLine) { // Reset currentSubSection if there is no whitespace currentSubSection = undefined; } map[currentSection] = map[currentSection] || {}; const key = currentSubSection ? [currentSubSection, name].join(CONFIG_PREFIX_SEPARATOR) : name; map[currentSection][key] = value; } } } } return map; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/parseKnownFiles.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { loadSharedConfigFiles } from "./loadSharedConfigFiles"; import { parseKnownFiles } from "./parseKnownFiles"; vi.mock("./loadSharedConfigFiles"); describe(parseKnownFiles.name, () => { const mockConfigFile = { profileName1: { configKey1: "configValue1" }, profileName2: { configKey2: "configValue2" }, }; const mockCredentialsFile = { profileName1: { credsKey1: "credsValue1" }, profileName2: { credsKey2: "credsValue2" }, }; afterEach(() => { vi.clearAllMocks(); }); it("gets parsedFiles from loadSharedConfigFiles", async () => { vi.mocked(loadSharedConfigFiles).mockReturnValue( Promise.resolve({ configFile: mockConfigFile, credentialsFile: mockCredentialsFile, }) ); const mockInit = { profile: "mockProfile" }; const parsedFiles = await parseKnownFiles(mockInit); expect(loadSharedConfigFiles).toHaveBeenCalledWith(mockInit); expect(parsedFiles).toMatchInlineSnapshot(` { "profileName1": { "configKey1": "configValue1", "credsKey1": "credsValue1", }, "profileName2": { "configKey2": "configValue2", "credsKey2": "credsValue2", }, } `); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/parseKnownFiles.ts ================================================ import type { ParsedIniData } from "@smithy/types"; import { loadSharedConfigFiles, type SharedConfigInit } from "./loadSharedConfigFiles"; import { mergeConfigFiles } from "./mergeConfigFiles"; /** * @public */ export interface SourceProfileInit extends SharedConfigInit { /** * The configuration profile to use. */ profile?: string; } /** * Load profiles from credentials and config INI files and normalize them into a * single profile list. * * @internal */ export const parseKnownFiles = async (init: SourceProfileInit): Promise => { const parsedFiles = await loadSharedConfigFiles(init); return mergeConfigFiles(parsedFiles.configFile, parsedFiles.credentialsFile); }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/readFile.spec.ts ================================================ import * as promises from "node:fs/promises"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; vi.mock("node:fs/promises", () => ({ readFile: vi.fn() })); describe("readFile", () => { const UTF8 = "utf8"; const getMockFileContents = (path: string, options = UTF8) => JSON.stringify({ path, options }); beforeEach(() => { (promises.readFile as any).mockImplementation(async (path: any, options: any) => { await new Promise((resolve) => setTimeout(resolve, 100)); return getMockFileContents(path, options); }); }); afterEach(() => { vi.clearAllMocks(); vi.resetModules(); }); describe("makes one fs.readFile call for a filepath irrespective of smithy.readFile calls", () => { it.each([10, 100, 1000, 10000])("parallel calls: %d ", async (num: number) => { const { readFile } = await import("./readFile"); const mockPath = "/mock/path"; const mockPathContent = getMockFileContents(mockPath); expect(promises.readFile).not.toHaveBeenCalled(); const fileContentArr = await Promise.all(Array(num).fill(readFile(mockPath))); expect(fileContentArr).toStrictEqual(Array(num).fill(mockPathContent)); // There is one fs.readFile call even through smithy.readFile is called in parallel num times. expect(promises.readFile).toHaveBeenCalledTimes(1); expect(promises.readFile).toHaveBeenCalledWith(mockPath, UTF8); }); it("two parallel calls and one sequential call", async () => { const { readFile } = await import("./readFile"); const mockPath = "/mock/path"; const mockPathContent = getMockFileContents(mockPath); expect(promises.readFile).not.toHaveBeenCalled(); const fileContentArr = await Promise.all([readFile(mockPath), readFile(mockPath)]); expect(fileContentArr).toStrictEqual([mockPathContent, mockPathContent]); // There is one fs.readFile call even though smithy.readFile is called in parallel twice. expect(promises.readFile).toHaveBeenCalledTimes(1); expect(promises.readFile).toHaveBeenCalledWith(mockPath, UTF8); const fileContent = await readFile(mockPath); expect(fileContent).toStrictEqual(mockPathContent); // There is one fs.readFile call even though smithy.readFile is called for the third time. expect(promises.readFile).toHaveBeenCalledTimes(1); }); }); it("makes multiple readFile calls with based on filepaths", async () => { const { readFile } = await import("./readFile"); const mockPath1 = "/mock/path/1"; const mockPathContent1 = getMockFileContents(mockPath1); const mockPath2 = "/mock/path/2"; const mockPathContent2 = getMockFileContents(mockPath2); expect(promises.readFile).not.toHaveBeenCalled(); const fileContentArr = await Promise.all([readFile(mockPath1), readFile(mockPath2)]); expect(fileContentArr).toStrictEqual([mockPathContent1, mockPathContent2]); // There are two fs.readFile calls as smithy.readFile is called in parallel with different file paths. expect(promises.readFile).toHaveBeenCalledTimes(2); expect(promises.readFile).toHaveBeenNthCalledWith(1, mockPath1, UTF8); expect(promises.readFile).toHaveBeenNthCalledWith(2, mockPath2, UTF8); const fileContent1 = await readFile(mockPath1); expect(fileContent1).toStrictEqual(mockPathContent1); const fileContent2 = await readFile(mockPath2); expect(fileContent2).toStrictEqual(mockPathContent2); // There is one fs.readFile call even though smithy.readFile is called for the third time. expect(promises.readFile).toHaveBeenCalledTimes(2); }); it("makes multiple readFile calls when called with ignoreCache option", async () => { const { readFile } = await import("./readFile"); const mockPath1 = "/mock/path/1"; const mockPathContent1 = getMockFileContents(mockPath1); expect(promises.readFile).not.toHaveBeenCalled(); const fileContentArr = await Promise.all([ readFile(mockPath1, { ignoreCache: true }), readFile(mockPath1, { ignoreCache: true }), ]); expect(fileContentArr).toStrictEqual([mockPathContent1, mockPathContent1]); // There are two fs.readFile calls as smithy.readFile is called in parallel with the same filepath. expect(promises.readFile).toHaveBeenCalledTimes(2); expect(promises.readFile).toHaveBeenNthCalledWith(1, mockPath1, UTF8); expect(promises.readFile).toHaveBeenNthCalledWith(2, mockPath1, UTF8); const fileContent1 = await readFile(mockPath1); expect(fileContent1).toStrictEqual(mockPathContent1); // There is no fs.readFile call since smithy.readFile is now called without refresh. expect(promises.readFile).toHaveBeenCalledTimes(2); }); }); ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/readFile.ts ================================================ import { readFile as fsReadFile } from "node:fs/promises"; /** * Runtime file cache. * @internal */ export const filePromises: Record> = {}; /** * For testing only. * @internal * @deprecated minimize use in application code. */ export const fileIntercept: Record> = {}; /** * @internal */ export interface ReadFileOptions { ignoreCache?: boolean; } /** * @internal */ export const readFile = (path: string, options?: ReadFileOptions) => { if (fileIntercept[path] !== undefined) { return fileIntercept[path]; } if (!filePromises[path] || options?.ignoreCache) { filePromises[path] = fsReadFile(path, "utf8"); } return filePromises[path]; }; ================================================ FILE: packages/core/src/submodules/config/shared-ini-file-loader/types.ts ================================================ import type { ParsedIniData as __ParsedIniData, Profile as __Profile, SharedConfigFiles as __SharedConfigFiles, } from "@smithy/types"; /** * @internal * @deprecated Use Profile from "\@smithy/types" instead */ export type Profile = __Profile; /** * @internal * @deprecated Use ParsedIniData from "\@smithy/types" instead */ export type ParsedIniData = __ParsedIniData; /** * @internal * @deprecated Use SharedConfigFiles from "\@smithy/types" instead */ export type SharedConfigFiles = __SharedConfigFiles; ================================================ FILE: packages/core/src/submodules/config/util-config-provider/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/config`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.2.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.2.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.1.0 ### Minor Changes - dd2b9c70: Add numberSelector utility ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-config-provider](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-config-provider/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/config/util-config-provider/booleanSelector.spec.ts ================================================ import { beforeEach, describe, expect, test as it } from "vitest"; import { booleanSelector } from "./booleanSelector"; import { SelectorType } from "./types"; describe(booleanSelector.name, () => { const key = "key"; const obj: { [key]: any } = {} as any; describe.each(Object.entries(SelectorType))(`Selector %s`, (selectorKey, selectorValue) => { beforeEach(() => { delete obj[key]; }); it(`should return undefined if ${key} is not defined`, () => { expect(booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBeUndefined(); }); it.each([ [true, "true"], [false, "false"], ])(`should return boolean %s if ${key}="%s"`, (output, input) => { obj[key] = input; expect(booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBe(output); }); it.each(["0", "1", "yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => { obj[key] = input; expect(() => booleanSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toThrow( `Cannot load ${selectorValue} "${key}". Expected "true" or "false", got ${obj[key]}.` ); }); }); }); ================================================ FILE: packages/core/src/submodules/config/util-config-provider/booleanSelector.ts ================================================ import type { SelectorType } from "./types"; /** * Returns boolean value true/false for string value "true"/"false", * if the string is defined in obj[key] * Returns undefined, if obj[key] is not defined. * Throws error for all other cases. * * @internal */ export const booleanSelector = (obj: Record, key: string, type: SelectorType) => { if (!(key in obj)) return undefined; if (obj[key] === "true") return true; if (obj[key] === "false") return false; throw new Error(`Cannot load ${type} "${key}". Expected "true" or "false", got ${obj[key]}.`); }; ================================================ FILE: packages/core/src/submodules/config/util-config-provider/numberSelector.spec.ts ================================================ import { beforeEach, describe, expect, test as it } from "vitest"; import { numberSelector } from "./numberSelector"; import { SelectorType } from "./types"; describe(numberSelector.name, () => { const key = "key"; const obj: { [key]: any } = {} as any; describe.each(Object.entries(SelectorType))(`Selector %s`, (selectorKey, selectorValue) => { beforeEach(() => { delete obj[key]; }); it(`should return undefined if ${key} is not defined`, () => { expect(numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBeUndefined(); }); it.each([ [0, "0"], [1, "1"], ])(`should return number %s if ${key}="%s"`, (output, input) => { obj[key] = input; expect(numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toBe(output); }); it.each(["yes", "no", undefined, null, void 0, ""])(`should throw if ${key}=%s`, (input) => { obj[key] = input; expect(() => numberSelector(obj, key, SelectorType[selectorKey as keyof typeof SelectorType])).toThrow( new TypeError(`Cannot load ${selectorValue} '${key}'. Expected number, got '${obj[key]}'.`) ); }); }); }); ================================================ FILE: packages/core/src/submodules/config/util-config-provider/numberSelector.ts ================================================ import type { SelectorType } from "./types"; /** * Returns number value for string value, if the string is defined in obj[key]. * Returns undefined, if obj[key] is not defined. * Throws error for all other cases. * * @internal */ export const numberSelector = (obj: Record, key: string, type: SelectorType) => { if (!(key in obj)) return undefined; const numberValue = parseInt(obj[key] as string, 10); if (Number.isNaN(numberValue)) { throw new TypeError(`Cannot load ${type} '${key}'. Expected number, got '${obj[key]}'.`); } return numberValue; }; ================================================ FILE: packages/core/src/submodules/config/util-config-provider/types.ts ================================================ export enum SelectorType { ENV = "env", CONFIG = "shared config entry", } ================================================ FILE: packages/core/src/submodules/endpoints/index.browser.ts ================================================ import { getEndpointFromConfig } from "./middleware-endpoint/adaptors/getEndpointFromConfig.browser"; import { bindGetEndpointFromInstructions } from "./middleware-endpoint/adaptors/getEndpointFromInstructions"; import { bindEndpointMiddleware } from "./middleware-endpoint/endpointMiddleware"; import { bindGetEndpointPlugin } from "./middleware-endpoint/getEndpointPlugin"; import { bindResolveEndpointConfig } from "./middleware-endpoint/resolveEndpointConfig"; export * from "./toEndpointV1"; // @smithy/util-endpoints export { BinaryDecisionDiagram } from "./util-endpoints/bdd/BinaryDecisionDiagram"; export { EndpointCache } from "./util-endpoints/cache/EndpointCache"; export { decideEndpoint } from "./util-endpoints/decideEndpoint"; export { isIpAddress } from "./util-endpoints/lib/isIpAddress"; export { isValidHostLabel } from "./util-endpoints/lib/isValidHostLabel"; export { customEndpointFunctions } from "./util-endpoints/utils/customEndpointFunctions"; export { resolveEndpoint } from "./util-endpoints/resolveEndpoint"; export * from "./util-endpoints/types"; // @smithy/middleware-endpoint export const getEndpointFromInstructions = bindGetEndpointFromInstructions(getEndpointFromConfig); export const resolveEndpointConfig = bindResolveEndpointConfig(getEndpointFromConfig); export const endpointMiddleware = bindEndpointMiddleware(getEndpointFromConfig); export const getEndpointPlugin = bindGetEndpointPlugin(getEndpointFromConfig); export { resolveParams, type EndpointParameterInstructionsSupplier, } from "./middleware-endpoint/adaptors/getEndpointFromInstructions"; export { toEndpointV1 as middlewareEndpointToEndpointV1 } from "./middleware-endpoint/adaptors/toEndpointV1"; export { endpointMiddlewareOptions } from "./middleware-endpoint/getEndpointPlugin"; export type { EndpointInputConfig, EndpointResolvedConfig } from "./middleware-endpoint/resolveEndpointConfig"; export { resolveEndpointRequiredConfig } from "./middleware-endpoint/resolveEndpointRequiredConfig"; export type { EndpointRequiredInputConfig, EndpointRequiredResolvedConfig, } from "./middleware-endpoint/resolveEndpointRequiredConfig"; export type { EndpointParameterInstructions } from "./middleware-endpoint/types"; export type { BuiltInParamInstruction, ClientContextParamInstruction, ContextParamInstruction, OperationContextParamInstruction, StaticContextParamInstruction, } from "./middleware-endpoint/types"; ================================================ FILE: packages/core/src/submodules/endpoints/index.ts ================================================ import { getEndpointFromConfig } from "./middleware-endpoint/adaptors/getEndpointFromConfig"; import { bindGetEndpointFromInstructions } from "./middleware-endpoint/adaptors/getEndpointFromInstructions"; import { bindEndpointMiddleware } from "./middleware-endpoint/endpointMiddleware"; import { bindGetEndpointPlugin } from "./middleware-endpoint/getEndpointPlugin"; import { bindResolveEndpointConfig } from "./middleware-endpoint/resolveEndpointConfig"; export * from "./toEndpointV1"; // @smithy/util-endpoints export { BinaryDecisionDiagram } from "./util-endpoints/bdd/BinaryDecisionDiagram"; export { EndpointCache } from "./util-endpoints/cache/EndpointCache"; export { decideEndpoint } from "./util-endpoints/decideEndpoint"; export { isIpAddress } from "./util-endpoints/lib/isIpAddress"; export { isValidHostLabel } from "./util-endpoints/lib/isValidHostLabel"; export { customEndpointFunctions } from "./util-endpoints/utils/customEndpointFunctions"; export { resolveEndpoint } from "./util-endpoints/resolveEndpoint"; export * from "./util-endpoints/types"; // @smithy/middleware-endpoint export const getEndpointFromInstructions = bindGetEndpointFromInstructions(getEndpointFromConfig); export const resolveEndpointConfig = bindResolveEndpointConfig(getEndpointFromConfig); export const endpointMiddleware = bindEndpointMiddleware(getEndpointFromConfig); export const getEndpointPlugin = bindGetEndpointPlugin(getEndpointFromConfig); export { resolveParams, type EndpointParameterInstructionsSupplier, } from "./middleware-endpoint/adaptors/getEndpointFromInstructions"; export { toEndpointV1 as middlewareEndpointToEndpointV1 } from "./middleware-endpoint/adaptors/toEndpointV1"; export { endpointMiddlewareOptions } from "./middleware-endpoint/getEndpointPlugin"; export type { EndpointInputConfig, EndpointResolvedConfig } from "./middleware-endpoint/resolveEndpointConfig"; export { resolveEndpointRequiredConfig } from "./middleware-endpoint/resolveEndpointRequiredConfig"; export type { EndpointRequiredInputConfig, EndpointRequiredResolvedConfig, } from "./middleware-endpoint/resolveEndpointRequiredConfig"; export type { EndpointParameterInstructions } from "./middleware-endpoint/types"; export type { BuiltInParamInstruction, ClientContextParamInstruction, ContextParamInstruction, OperationContextParamInstruction, StaticContextParamInstruction, } from "./middleware-endpoint/types"; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/endpoints`. ## 4.4.32 ### Patch Changes - @smithy/core@3.23.17 - @smithy/middleware-serde@4.2.20 ## 4.4.31 ### Patch Changes - Updated dependencies [a029f0e] - @smithy/core@3.23.16 - @smithy/middleware-serde@4.2.19 ## 4.4.30 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/middleware-serde@4.2.18 - @smithy/node-config-provider@4.3.14 - @smithy/shared-ini-file-loader@4.4.9 - @smithy/url-parser@4.2.14 - @smithy/util-middleware@4.2.14 ## 4.4.29 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/middleware-serde@4.2.17 - @smithy/node-config-provider@4.3.13 - @smithy/shared-ini-file-loader@4.4.8 - @smithy/url-parser@4.2.13 - @smithy/util-middleware@4.2.13 ## 4.4.28 ### Patch Changes - Updated dependencies [7198e09] - @smithy/core@3.23.13 - @smithy/middleware-serde@4.2.16 ## 4.4.27 ### Patch Changes - b1f0dba: fix(middleware-endpoint): update type of useDualStackEndpoint/useFipsEndpoint input config fix(config-resolver): add alternate values for NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS and NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS ## 4.4.26 ### Patch Changes - @smithy/core@3.23.12 - @smithy/middleware-serde@4.2.15 ## 4.4.25 ### Patch Changes - Updated dependencies [2edd638] - @smithy/core@3.23.11 - @smithy/middleware-serde@4.2.14 ## 4.4.24 ### Patch Changes - 5340b11: apply resolved endpoint headers to final request - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/middleware-serde@4.2.13 - @smithy/node-config-provider@4.3.12 - @smithy/shared-ini-file-loader@4.4.7 - @smithy/url-parser@4.2.12 - @smithy/util-middleware@4.2.12 ## 4.4.23 ### Patch Changes - Updated dependencies [6ef5430] - Updated dependencies [6ef5430] - @smithy/core@3.23.9 ## 4.4.22 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/shared-ini-file-loader@4.4.6 - @smithy/node-config-provider@4.3.11 - @smithy/middleware-serde@4.2.12 - @smithy/util-middleware@4.2.11 - @smithy/url-parser@4.2.11 - @smithy/core@3.23.8 ## 4.4.21 ### Patch Changes - Updated dependencies [11569eb] - @smithy/core@3.23.7 ## 4.4.20 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/core@3.23.6 - @smithy/middleware-serde@4.2.11 - @smithy/node-config-provider@4.3.10 - @smithy/shared-ini-file-loader@4.4.5 - @smithy/url-parser@4.2.10 - @smithy/util-middleware@4.2.10 ## 4.4.19 ### Patch Changes - Updated dependencies [026b177] - Updated dependencies [cde9f09] - @smithy/core@3.23.5 ## 4.4.18 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/core@3.23.4 - @smithy/middleware-serde@4.2.10 - @smithy/node-config-provider@4.3.9 - @smithy/shared-ini-file-loader@4.4.4 - @smithy/types@4.12.1 - @smithy/url-parser@4.2.9 - @smithy/util-middleware@4.2.9 ## 4.4.17 ### Patch Changes - @smithy/core@3.23.3 ## 4.4.16 ### Patch Changes - Updated dependencies [c5db01c] - @smithy/core@3.23.2 ## 4.4.15 ### Patch Changes - Updated dependencies [6f96c01] - @smithy/core@3.23.1 ## 4.4.14 ### Patch Changes - Updated dependencies [4f05c6a] - @smithy/core@3.23.0 ## 4.4.13 ### Patch Changes - @smithy/core@3.22.1 ## 4.4.12 ### Patch Changes - Updated dependencies [472bf01] - @smithy/core@3.22.0 ## 4.4.11 ### Patch Changes - Updated dependencies [fa0e0c4] - @smithy/core@3.21.1 ## 4.4.10 ### Patch Changes - Updated dependencies [c2a6f46] - @smithy/core@3.21.0 ## 4.4.9 ### Patch Changes - Updated dependencies [96cc077] - @smithy/core@3.20.8 ## 4.4.8 ### Patch Changes - Updated dependencies [ae6ef2e] - @smithy/core@3.20.7 ## 4.4.7 ### Patch Changes - Updated dependencies [862c942] - @smithy/core@3.20.6 ## 4.4.6 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/core@3.20.5 - @smithy/middleware-serde@4.2.9 - @smithy/node-config-provider@4.3.8 - @smithy/shared-ini-file-loader@4.4.3 - @smithy/url-parser@4.2.8 - @smithy/util-middleware@4.2.8 ## 4.4.5 ### Patch Changes - @smithy/core@3.20.4 ## 4.4.4 ### Patch Changes - Updated dependencies [681d6c4] - @smithy/core@3.20.3 ## 4.4.3 ### Patch Changes - Updated dependencies [dd55f1f] - @smithy/core@3.20.2 ## 4.4.2 ### Patch Changes - Updated dependencies [aa954bc] - @smithy/core@3.20.1 ## 4.4.1 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/core@3.20.0 - @smithy/middleware-serde@4.2.8 - @smithy/node-config-provider@4.3.7 - @smithy/shared-ini-file-loader@4.4.2 - @smithy/url-parser@4.2.7 - @smithy/util-middleware@4.2.7 ## 4.4.0 ### Minor Changes - 76d7994: handle clientContextParam collisions with builtin config keys ## 4.3.15 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/core@3.19.0 - @smithy/middleware-serde@4.2.7 - @smithy/node-config-provider@4.3.6 - @smithy/shared-ini-file-loader@4.4.1 - @smithy/url-parser@4.2.6 - @smithy/util-middleware@4.2.6 ## 4.3.14 ### Patch Changes - Updated dependencies [541a18f] - @smithy/core@3.18.7 ## 4.3.13 ### Patch Changes - Updated dependencies [1d6db03] - @smithy/core@3.18.6 ## 4.3.12 ### Patch Changes - Updated dependencies [77c149f] - @smithy/core@3.18.5 ## 4.3.11 ### Patch Changes - Updated dependencies [e659a06] - Updated dependencies [e659a06] - @smithy/core@3.18.4 - @smithy/middleware-serde@4.2.6 ## 4.3.10 ### Patch Changes - Updated dependencies [5bcd041] - @smithy/core@3.18.3 ## 4.3.9 ### Patch Changes - Updated dependencies [c8b148c] - @smithy/core@3.18.2 ## 4.3.8 ### Patch Changes - Updated dependencies [0976f42] - @smithy/core@3.18.1 ## 4.3.7 ### Patch Changes - Updated dependencies [3926fd7] - Updated dependencies [e77f705] - Updated dependencies [d90999a] - @smithy/types@4.9.0 - @smithy/core@3.18.0 - @smithy/shared-ini-file-loader@4.4.0 - @smithy/middleware-serde@4.2.5 - @smithy/node-config-provider@4.3.5 - @smithy/url-parser@4.2.5 - @smithy/util-middleware@4.2.5 ## 4.3.6 ### Patch Changes - Updated dependencies [6da0ab3] - Updated dependencies [df00095] - @smithy/types@4.8.1 - @smithy/core@3.17.2 - @smithy/middleware-serde@4.2.4 - @smithy/node-config-provider@4.3.4 - @smithy/shared-ini-file-loader@4.3.4 - @smithy/url-parser@4.2.4 - @smithy/util-middleware@4.2.4 ## 4.3.5 ### Patch Changes - @smithy/core@3.17.1 ## 4.3.4 ### Patch Changes - Updated dependencies [8a2a912] - Updated dependencies [7e359e2] - @smithy/types@4.8.0 - @smithy/core@3.17.0 - @smithy/shared-ini-file-loader@4.3.3 - @smithy/middleware-serde@4.2.3 - @smithy/node-config-provider@4.3.3 - @smithy/url-parser@4.2.3 - @smithy/util-middleware@4.2.3 ## 4.3.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/core@3.16.1 - @smithy/types@4.7.1 - @smithy/middleware-serde@4.2.2 - @smithy/node-config-provider@4.3.2 - @smithy/shared-ini-file-loader@4.3.2 - @smithy/url-parser@4.2.2 - @smithy/util-middleware@4.2.2 ## 4.3.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - Updated dependencies [8a2873c] - @smithy/types@4.7.0 - @smithy/core@3.16.0 - @smithy/middleware-serde@4.2.1 - @smithy/node-config-provider@4.3.1 - @smithy/shared-ini-file-loader@4.3.1 - @smithy/url-parser@4.2.1 - @smithy/util-middleware@4.2.1 ## 4.3.1 ### Patch Changes - Updated dependencies [813c9a5] - @smithy/core@3.15.0 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/core@3.14.0 - @smithy/middleware-serde@4.2.0 - @smithy/node-config-provider@4.3.0 - @smithy/shared-ini-file-loader@4.3.0 - @smithy/types@4.6.0 - @smithy/url-parser@4.2.0 - @smithy/util-middleware@4.2.0 ## 4.2.5 ### Patch Changes - Updated dependencies [59e9952] - @smithy/core@3.13.0 ## 4.2.4 ### Patch Changes - Updated dependencies [97fe0d8] - Updated dependencies [3eb73f3] - @smithy/core@3.12.0 ## 4.2.3 ### Patch Changes - Updated dependencies [f8793be] - @smithy/core@3.11.1 ## 4.2.2 ### Patch Changes - Updated dependencies [60f393e] - @smithy/shared-ini-file-loader@4.2.0 - @smithy/node-config-provider@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/core@3.11.0 - @smithy/middleware-serde@4.1.1 - @smithy/node-config-provider@4.2.1 - @smithy/shared-ini-file-loader@4.1.1 - @smithy/url-parser@4.1.1 - @smithy/util-middleware@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/shared-ini-file-loader@4.1.0 - @smithy/node-config-provider@4.2.0 - @smithy/middleware-serde@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/url-parser@4.1.0 - @smithy/types@4.4.0 - @smithy/core@3.10.0 ## 4.1.21 ### Patch Changes - Updated dependencies [06ac1f6] - @smithy/core@3.9.2 ## 4.1.20 ### Patch Changes - Updated dependencies [29fad01] - @smithy/core@3.9.1 ## 4.1.19 ### Patch Changes - Updated dependencies [ab4f33f] - Updated dependencies [d79dc91] - @smithy/core@3.9.0 ## 4.1.18 ### Patch Changes - Updated dependencies [fd00602] - Updated dependencies [64e033f] - @smithy/core@3.8.0 - @smithy/types@4.3.2 - @smithy/middleware-serde@4.0.9 - @smithy/node-config-provider@4.1.4 - @smithy/shared-ini-file-loader@4.0.5 - @smithy/url-parser@4.0.5 - @smithy/util-middleware@4.0.5 ## 4.1.17 ### Patch Changes - Updated dependencies [f4dcba0] - @smithy/core@3.7.2 ## 4.1.16 ### Patch Changes - Updated dependencies [312801c] - Updated dependencies [bb7975e] - @smithy/core@3.7.1 ## 4.1.15 ### Patch Changes - bccb1b9: fix resolving file/env configured endpoint ## 4.1.14 ### Patch Changes - 3ecb1f4: return undefined for endpointParam "endpoint" if isCustomEndpoint is false - Updated dependencies [d105c97] - @smithy/core@3.7.0 ## 4.1.13 ### Patch Changes - Updated dependencies [10a0534] - @smithy/core@3.6.0 ## 4.1.12 ### Patch Changes - 22a286e: add resolveEndpointRequiredConfig resolver ## 4.1.11 ### Patch Changes - Updated dependencies [4a31774] - @smithy/core@3.5.3 ## 4.1.10 ### Patch Changes - Updated dependencies [4642e7e] - Updated dependencies [147ceed] - Updated dependencies [ae8f1f4] - @smithy/core@3.5.2 ## 4.1.9 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/core@3.5.1 - @smithy/middleware-serde@4.0.8 - @smithy/node-config-provider@4.1.3 - @smithy/shared-ini-file-loader@4.0.4 - @smithy/url-parser@4.0.4 - @smithy/util-middleware@4.0.4 ## 4.1.8 ### Patch Changes - Updated dependencies [ae11e3a] - Updated dependencies [23812a9] - @smithy/core@3.5.0 - @smithy/middleware-serde@4.0.7 ## 4.1.7 ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [efb27ee] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/core@3.4.0 - @smithy/middleware-serde@4.0.6 - @smithy/node-config-provider@4.1.2 - @smithy/shared-ini-file-loader@4.0.3 - @smithy/url-parser@4.0.3 - @smithy/util-middleware@4.0.3 ## 4.1.6 ### Patch Changes - 786dd3a: reduce usage of endpoints2.0 type adapter in public interfaces - Updated dependencies [786dd3a] - @smithy/middleware-serde@4.0.5 - @smithy/core@3.3.3 ## 4.1.5 ### Patch Changes - Updated dependencies [103535a] - @smithy/middleware-serde@4.0.4 - @smithy/core@3.3.2 ## 4.1.4 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 ## 4.1.3 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 ## 4.1.2 ### Patch Changes - Updated dependencies [40ffcd5] - @smithy/core@3.3.1 ## 4.1.1 ### Patch Changes - Updated dependencies [5896264] - @smithy/core@3.3.0 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [02ef79c] - Updated dependencies [e917e61] - @smithy/core@3.2.0 - @smithy/types@4.2.0 - @smithy/middleware-serde@4.0.3 - @smithy/node-config-provider@4.0.2 - @smithy/shared-ini-file-loader@4.0.2 - @smithy/url-parser@4.0.2 - @smithy/util-middleware@4.0.2 ## 4.0.6 ### Patch Changes - @smithy/core@3.1.5 ## 4.0.5 ### Patch Changes - @smithy/core@3.1.4 ## 4.0.4 ### Patch Changes - @smithy/core@3.1.3 ## 4.0.3 ### Patch Changes - Updated dependencies [f5d0bac] - @smithy/middleware-serde@4.0.2 - @smithy/core@3.1.2 ## 4.0.2 ### Patch Changes - @smithy/core@3.1.1 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/core@3.1.0 - @smithy/middleware-serde@4.0.1 - @smithy/node-config-provider@4.0.1 - @smithy/shared-ini-file-loader@4.0.1 - @smithy/url-parser@4.0.1 - @smithy/util-middleware@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/shared-ini-file-loader@4.0.0 - @smithy/node-config-provider@4.0.0 - @smithy/util-middleware@4.0.0 - @smithy/core@3.0.0 - @smithy/middleware-serde@4.0.0 - @smithy/types@4.0.0 - @smithy/url-parser@4.0.0 ## 3.2.8 ### Patch Changes - @smithy/core@2.5.7 ## 3.2.7 ### Patch Changes - @smithy/core@2.5.6 ## 3.2.6 ### Patch Changes - e27d42d: fix for operation context params ## 3.2.5 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/core@2.5.5 - @smithy/middleware-serde@3.0.11 - @smithy/node-config-provider@3.1.12 - @smithy/shared-ini-file-loader@3.1.12 - @smithy/url-parser@3.0.11 - @smithy/util-middleware@3.0.11 ## 3.2.4 ### Patch Changes - Updated dependencies [9c40f7b] - @smithy/core@2.5.4 ## 3.2.3 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/core@2.5.3 - @smithy/middleware-serde@3.0.10 - @smithy/node-config-provider@3.1.11 - @smithy/shared-ini-file-loader@3.1.11 - @smithy/url-parser@3.0.10 - @smithy/util-middleware@3.0.10 ## 3.2.2 ### Patch Changes - Updated dependencies [c6ef519] - Updated dependencies [cd1929b] - @smithy/core@2.5.2 - @smithy/types@3.7.0 - @smithy/middleware-serde@3.0.9 - @smithy/node-config-provider@3.1.10 - @smithy/shared-ini-file-loader@3.1.10 - @smithy/url-parser@3.0.9 - @smithy/util-middleware@3.0.9 ## 3.2.1 ### Patch Changes - @smithy/core@2.5.1 ## 3.2.0 ### Minor Changes - d07b0ab: feature detection for custom endpoint and gzip ### Patch Changes - d07b0ab: reorganize smithy/core to be upstream of smithy/smithy-client - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/core@2.5.0 - @smithy/middleware-serde@3.0.8 - @smithy/node-config-provider@3.1.9 - @smithy/shared-ini-file-loader@3.1.9 - @smithy/url-parser@3.0.8 - @smithy/util-middleware@3.0.8 ## 3.1.4 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/middleware-serde@3.0.7 - @smithy/node-config-provider@3.1.8 - @smithy/shared-ini-file-loader@3.1.8 - @smithy/url-parser@3.0.7 - @smithy/util-middleware@3.0.7 ## 3.1.3 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/middleware-serde@3.0.6 - @smithy/node-config-provider@3.1.7 - @smithy/shared-ini-file-loader@3.1.7 - @smithy/url-parser@3.0.6 - @smithy/util-middleware@3.0.6 ## 3.1.2 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/middleware-serde@3.0.5 - @smithy/node-config-provider@3.1.6 - @smithy/shared-ini-file-loader@3.1.6 - @smithy/url-parser@3.0.5 - @smithy/util-middleware@3.0.5 ## 3.1.1 ### Patch Changes - c8c53ae: resolve service-specific endpoint once per client - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/middleware-serde@3.0.4 - @smithy/node-config-provider@3.1.5 - @smithy/shared-ini-file-loader@3.1.5 - @smithy/url-parser@3.0.4 - @smithy/util-middleware@3.0.4 ## 3.1.0 ### Minor Changes - 4a40961: add support for accountId in configValueProvider ### Patch Changes - @smithy/middleware-serde@3.0.3 ## 3.0.5 ### Patch Changes - Updated dependencies [d88521e] - @smithy/shared-ini-file-loader@3.1.4 - @smithy/node-config-provider@3.1.4 ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/middleware-serde@3.0.3 - @smithy/node-config-provider@3.1.3 - @smithy/shared-ini-file-loader@3.1.3 - @smithy/url-parser@3.0.3 - @smithy/util-middleware@3.0.3 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/middleware-serde@3.0.2 - @smithy/node-config-provider@3.1.2 - @smithy/shared-ini-file-loader@3.1.2 - @smithy/url-parser@3.0.2 - @smithy/util-middleware@3.0.2 ## 3.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/middleware-serde@3.0.1 - @smithy/node-config-provider@3.1.1 - @smithy/shared-ini-file-loader@3.1.1 - @smithy/url-parser@3.0.1 - @smithy/util-middleware@3.0.1 ## 3.0.1 ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/shared-ini-file-loader@3.1.0 - @smithy/node-config-provider@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/shared-ini-file-loader@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/middleware-serde@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/url-parser@3.0.0 ## 2.5.1 ### Patch Changes - cc54b8d1: Do not require account in checking whether a string is an S3 bucket ARN. ## 2.5.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/shared-ini-file-loader@2.4.0 - @smithy/node-config-provider@2.3.0 - @smithy/middleware-serde@2.3.0 - @smithy/util-middleware@2.2.0 - @smithy/url-parser@2.2.0 - @smithy/types@2.12.0 ## 2.4.6 ### Patch Changes - Updated dependencies [32e3f6ff] - @smithy/middleware-serde@2.2.1 ## 2.4.5 ### Patch Changes - Updated dependencies [43f3e1e2] - Updated dependencies [49640d6c] - @smithy/middleware-serde@2.2.0 - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 - @smithy/shared-ini-file-loader@2.3.5 - @smithy/url-parser@2.1.4 - @smithy/util-middleware@2.1.4 ## 2.4.4 ### Patch Changes - Updated dependencies [8fd51967] - @smithy/shared-ini-file-loader@2.3.4 - @smithy/node-config-provider@2.2.4 ## 2.4.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/middleware-serde@2.1.3 - @smithy/node-config-provider@2.2.3 - @smithy/shared-ini-file-loader@2.3.3 - @smithy/url-parser@2.1.3 - @smithy/util-middleware@2.1.3 ## 2.4.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/middleware-serde@2.1.2 - @smithy/node-config-provider@2.2.2 - @smithy/shared-ini-file-loader@2.3.2 - @smithy/url-parser@2.1.2 - @smithy/util-middleware@2.1.2 ## 2.4.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/middleware-serde@2.1.1 - @smithy/node-config-provider@2.2.1 - @smithy/shared-ini-file-loader@2.3.1 - @smithy/types@2.9.1 - @smithy/url-parser@2.1.1 - @smithy/util-middleware@2.1.1 ## 2.4.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/shared-ini-file-loader@2.3.0 - @smithy/node-config-provider@2.2.0 - @smithy/middleware-serde@2.1.0 - @smithy/util-middleware@2.1.0 - @smithy/url-parser@2.1.0 - @smithy/types@2.9.0 ## 2.3.0 ### Minor Changes - 590af6b7: support credential scope ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/middleware-serde@2.0.16 - @smithy/node-config-provider@2.1.9 - @smithy/shared-ini-file-loader@2.2.8 - @smithy/url-parser@2.0.16 - @smithy/util-middleware@2.0.9 ## 2.2.3 ### Patch Changes - Updated dependencies [68849108] - @smithy/shared-ini-file-loader@2.2.7 - @smithy/node-config-provider@2.1.8 ## 2.2.2 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/middleware-serde@2.0.15 - @smithy/node-config-provider@2.1.7 - @smithy/shared-ini-file-loader@2.2.6 - @smithy/url-parser@2.0.15 - @smithy/util-middleware@2.0.8 ## 2.2.1 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/middleware-serde@2.0.14 - @smithy/node-config-provider@2.1.6 - @smithy/shared-ini-file-loader@2.2.5 - @smithy/url-parser@2.0.14 - @smithy/util-middleware@2.0.7 ## 2.2.0 ### Minor Changes - 8044a814: feat(experimentalIdentityAndAuth): move `experimentalIdentityAndAuth` types and interfaces to `@smithy/types` and `@smithy/core` ### Patch Changes - 9e0a5a74: Add `@endpointRuleSet` signing properties to `selectedHttpAuthScheme` - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/middleware-serde@2.0.13 - @smithy/node-config-provider@2.1.5 - @smithy/shared-ini-file-loader@2.2.4 - @smithy/url-parser@2.0.13 - @smithy/util-middleware@2.0.6 ## 2.1.5 ### Patch Changes - 5598a033: update bundler replacement directives in package.json ## 2.1.4 ### Patch Changes - Updated dependencies [c27879f2] - @smithy/shared-ini-file-loader@2.2.3 - @smithy/node-config-provider@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [901cb6c9] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/shared-ini-file-loader@2.2.2 - @smithy/middleware-serde@2.0.12 - @smithy/node-config-provider@2.1.3 - @smithy/url-parser@2.0.12 - @smithy/util-middleware@2.0.5 ## 2.1.2 ### Patch Changes - Updated dependencies [5bd46820] - Updated dependencies [6ae95278] - @smithy/shared-ini-file-loader@2.2.1 - @smithy/node-config-provider@2.1.2 ## 2.1.1 ### Patch Changes - afaa68af: Add missing dependency @smithy/shared-ini-file-loader ## 2.1.0 ### Minor Changes - f64c4c2d: Read service specific endpoints from env/config ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/middleware-serde@2.0.11 - @smithy/url-parser@2.0.11 - @smithy/util-middleware@2.0.4 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/middleware-serde@2.0.10 - @smithy/url-parser@2.0.10 - @smithy/util-middleware@2.0.3 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/middleware-serde@2.0.9 - @smithy/url-parser@2.0.9 - @smithy/util-middleware@2.0.2 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - Updated dependencies [5b6fa539] - @smithy/types@2.3.2 - @smithy/util-middleware@2.0.1 - @smithy/middleware-serde@2.0.8 - @smithy/url-parser@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/middleware-serde@2.0.7 - @smithy/url-parser@2.0.7 - @smithy/util-middleware@2.0.0 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/middleware-serde@2.0.6 - @smithy/url-parser@2.0.6 - @smithy/util-middleware@2.0.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - Updated dependencies [1be3c4c9] - @smithy/types@2.2.2 - @smithy/middleware-serde@2.0.5 - @smithy/url-parser@2.0.5 - @smithy/util-middleware@2.0.0 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/middleware-serde@2.0.4 - @smithy/url-parser@2.0.4 - @smithy/util-middleware@2.0.0 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/middleware-serde@2.0.3 - @smithy/url-parser@2.0.3 - @smithy/util-middleware@2.0.0 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/middleware-serde@2.0.2 - @smithy/url-parser@2.0.2 - @smithy/util-middleware@2.0.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/middleware-serde@2.0.1 - @smithy/url-parser@2.0.1 - @smithy/util-middleware@2.0.0 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/middleware-serde@2.0.0 - @smithy/url-parser@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/middleware-serde@1.1.0 - @smithy/types@1.2.0 - @smithy/url-parser@1.1.0 - @smithy/util-middleware@1.1.0 ## 1.0.4 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/middleware-serde@1.0.3 - @smithy/url-parser@1.0.3 - @smithy/util-middleware@1.0.2 ## 1.0.3 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/middleware-serde@1.0.2 - @smithy/util-middleware@1.0.2 - @smithy/url-parser@1.0.2 - @smithy/types@1.1.1 ## 1.0.2 ### Patch Changes - 170ac764: remove unused file ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/middleware-serde@1.0.1 - @smithy/util-middleware@1.0.1 - @smithy/url-parser@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-endpoint](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-endpoint/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/createConfigValueProvider.spec.ts ================================================ import type { Endpoint } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { createConfigValueProvider } from "./createConfigValueProvider"; describe(createConfigValueProvider.name, () => { it("should create a normalized provider for any config value", async () => { const config = { a: 1, b: 2, }; expect(await createConfigValueProvider("a", "a", config)()).toEqual(1); }); it("should look up both the canonical Endpoint ruleset param name and any localized override", async () => { const config = { a: 1, b: 2, }; expect(await createConfigValueProvider("a", "x", config)()).toEqual(1); expect(await createConfigValueProvider("x", "a", config)()).toEqual(1); }); it("uses a special lookup for CredentialScope", async () => { const config = { credentials: async () => { return { credentialScope: "cred-scope", }; }, }; expect(await createConfigValueProvider("credentialScope", "CredentialScope", config)()).toEqual("cred-scope"); }); it("uses a special lookup for accountId", async () => { const config = { credentials: async () => { return { accountId: "123456789012", }; }, }; expect(await createConfigValueProvider("accountId", "AccountId", config)()).toEqual("123456789012"); }); it("should normalize endpoint objects into URLs", async () => { const sampleUrl = "https://aws.amazon.com/"; const config = { str: sampleUrl, v1: { protocol: "https:", hostname: new URL(sampleUrl).hostname, path: "/", } as Endpoint, v2: { url: new URL(sampleUrl) }, }; expect(await createConfigValueProvider("str", "endpoint", config)()).toEqual(sampleUrl); expect(await createConfigValueProvider("v1", "endpoint", config)()).toEqual(sampleUrl); expect(await createConfigValueProvider("v2", "endpoint", config)()).toEqual(sampleUrl); }); it("should prioritize clientContextParams over direct properties", async () => { const config = { stage: "prod", clientContextParams: { stage: "beta", }, }; expect(await createConfigValueProvider("stage", "stage", config, true)()).toEqual("beta"); }); it("should fall back to direct property when clientContextParams is not provided", async () => { const config = { customParam: "direct-value", }; expect(await createConfigValueProvider("customParam", "customParam", config)()).toEqual("direct-value"); }); it("should fall back to direct property when clientContextParams exists but param is not in it", async () => { const config = { customParam: "direct-value", clientContextParams: { otherParam: "other-value", }, }; expect(await createConfigValueProvider("customParam", "customParam", config)()).toEqual("direct-value"); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/createConfigValueProvider.ts ================================================ import type { Endpoint, EndpointV2 } from "@smithy/types"; /** * Normalize some key of the client config to an async provider. * @internal * * @param configKey - the key to look up in config. * @param canonicalEndpointParamKey - this is the name the EndpointRuleSet uses. * it will most likely not contain the config * value, but we use it as a fallback. * @param config - container of the config values. * @param isClientContextParam - whether this is a client context parameter. * * @returns async function that will resolve with the value. */ export const createConfigValueProvider = >( configKey: string, canonicalEndpointParamKey: string, config: Config, isClientContextParam = false ) => { const configProvider = async () => { let configValue: unknown; if (isClientContextParam) { // For client context parameters, check clientContextParams first const clientContextParams = config.clientContextParams as Record | undefined; const nestedValue: unknown = clientContextParams?.[configKey]; configValue = nestedValue ?? config[configKey] ?? config[canonicalEndpointParamKey]; } else { // For built-in parameters and other config properties configValue = config[configKey] ?? config[canonicalEndpointParamKey]; } if (typeof configValue === "function") { return configValue(); } return configValue; }; if (configKey === "credentialScope" || canonicalEndpointParamKey === "CredentialScope") { return async () => { const credentials = typeof config.credentials === "function" ? await config.credentials() : config.credentials; const configValue: string = credentials?.credentialScope ?? credentials?.CredentialScope; return configValue; }; } if (configKey === "accountId" || canonicalEndpointParamKey === "AccountId") { return async () => { const credentials = typeof config.credentials === "function" ? await config.credentials() : config.credentials; const configValue: string = credentials?.accountId ?? credentials?.AccountId; return configValue; }; } if (configKey === "endpoint" || canonicalEndpointParamKey === "endpoint") { return async () => { if (config.isCustomEndpoint === false) { return undefined; } const endpoint = await configProvider(); if (endpoint && typeof endpoint === "object") { if ("url" in endpoint) { return (endpoint as EndpointV2).url.href; } if ("hostname" in endpoint) { const { protocol, hostname, port, path } = endpoint as Endpoint; // query params are ignored in setting endpoint. return `${protocol}//${hostname}${port ? ":" + port : ""}${path}`; } } return endpoint; }; } return configProvider; }; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointFromConfig.browser.ts ================================================ // eslint-disable-next-line @typescript-eslint/no-unused-vars export const getEndpointFromConfig = async (serviceId?: string): Promise => undefined; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointFromConfig.ts ================================================ import { loadConfig } from "@smithy/core/config"; import { getEndpointUrlConfig } from "./getEndpointUrlConfig"; /** * @internal */ export const getEndpointFromConfig = async (serviceId?: string) => loadConfig(getEndpointUrlConfig(serviceId ?? ""))(); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointFromInstructions.spec.ts ================================================ import { afterAll, describe, expect, test as it, vi } from "vitest"; import { getEndpointFromInstructions } from "../../index"; describe(getEndpointFromInstructions.name, () => { afterAll(async () => { delete process.env.AWS_ENDPOINT_URL; }); it("should set the isCustomEndpoint flag after resolving an externally configured endpoint", async () => { process.env.AWS_ENDPOINT_URL = "https://localhost"; const config = { serviceId: "service id", isCustomEndpoint: false, endpointProvider: vi.fn(), }; await getEndpointFromInstructions( {}, { getEndpointParameterInstructions() { return {}; }, }, config ); expect(config.isCustomEndpoint).toBe(true); }); it("should not use externally configured endpoint if code-level endpoint was set", async () => { process.env.AWS_ENDPOINT_URL = "https://localhost"; const config = { serviceId: "service id", isCustomEndpoint: true, endpointProvider: vi.fn().mockReturnValue(Symbol.for("endpoint")), }; const endpoint = await getEndpointFromInstructions( {}, { getEndpointParameterInstructions() { return {}; }, }, config ); expect(config.isCustomEndpoint).toBe(true); expect(endpoint).toBe(Symbol.for("endpoint")); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointFromInstructions.ts ================================================ import type { EndpointParameters, EndpointV2, HandlerExecutionContext } from "@smithy/types"; import type { EndpointResolvedConfig } from "../resolveEndpointConfig"; import { resolveParamsForS3 } from "../service-customizations"; import type { EndpointParameterInstructions } from "../types"; import { createConfigValueProvider } from "./createConfigValueProvider"; import { toEndpointV1 } from "./toEndpointV1"; /** * @internal */ export type EndpointParameterInstructionsSupplier = Partial<{ getEndpointParameterInstructions(): EndpointParameterInstructions; }>; /** * @internal */ export type GetEndpointFromConfig = (serviceId?: string) => Promise; /** * @internal */ export function bindGetEndpointFromInstructions(getEndpointFromConfig: GetEndpointFromConfig) { /** * This step in the endpoint resolution process is exposed as a function * to allow packages such as signers, lib-upload, etc. to get * the V2 Endpoint associated to an instance of some api operation command * without needing to send it or resolve its middleware stack. * * @internal * @param commandInput - the input of the Command in question. * @param instructionsSupplier - this is typically a Command constructor. A static function supplying the * endpoint parameter instructions will exist for commands in services * having an endpoints ruleset trait. * @param clientConfig - config of the service client. * @param context - optional context. */ return async < T extends EndpointParameters, CommandInput extends Record, Config extends Record, >( commandInput: CommandInput, instructionsSupplier: EndpointParameterInstructionsSupplier, clientConfig: Partial> & Config, context?: HandlerExecutionContext ): Promise => { if (!clientConfig.isCustomEndpoint) { let endpointFromConfig: string | undefined; // This field is guaranteed by the type indicated by the config resolver, but is new // and some existing standalone calls to this function may not provide the function, so // this check should remain here. if (clientConfig.serviceConfiguredEndpoint) { endpointFromConfig = await clientConfig.serviceConfiguredEndpoint(); } else { endpointFromConfig = await getEndpointFromConfig(clientConfig.serviceId); } if (endpointFromConfig) { clientConfig.endpoint = () => Promise.resolve(toEndpointV1(endpointFromConfig!)); clientConfig.isCustomEndpoint = true; } } const endpointParams = await resolveParams(commandInput, instructionsSupplier, clientConfig); if (typeof clientConfig.endpointProvider !== "function") { throw new Error("config.endpointProvider is not set."); } const endpoint: EndpointV2 = clientConfig.endpointProvider!(endpointParams as T, context); // Merge headers from custom endpoint if present if (clientConfig.isCustomEndpoint && clientConfig.endpoint) { const customEndpoint = await clientConfig.endpoint(); if (customEndpoint?.headers) { endpoint.headers ??= {}; for (const [name, value] of Object.entries(customEndpoint.headers)) { endpoint.headers[name] = Array.isArray(value) ? value : [value]; } } } return endpoint; }; } /** * @internal */ export const resolveParams = async < T extends EndpointParameters, CommandInput extends Record, Config extends Record, >( commandInput: CommandInput, instructionsSupplier: EndpointParameterInstructionsSupplier, clientConfig: Partial> & Config ) => { const endpointParams: EndpointParameters = {}; const instructions: EndpointParameterInstructions = instructionsSupplier?.getEndpointParameterInstructions?.() || {}; for (const [name, instruction] of Object.entries(instructions)) { switch (instruction.type) { case "staticContextParams": endpointParams[name] = instruction.value; break; case "contextParams": endpointParams[name] = commandInput[instruction.name] as string | boolean; break; case "clientContextParams": case "builtInParams": endpointParams[name] = await createConfigValueProvider( instruction.name, name, clientConfig, instruction.type !== "builtInParams" )(); break; case "operationContextParams": endpointParams[name] = instruction.get(commandInput); break; default: throw new Error("Unrecognized endpoint parameter instruction: " + JSON.stringify(instruction)); } } if (Object.keys(instructions).length === 0) { Object.assign(endpointParams, clientConfig); } if (String(clientConfig.serviceId).toLowerCase() === "s3") { await resolveParamsForS3(endpointParams); } return endpointParams; }; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointUrlConfig.spec.ts ================================================ import { CONFIG_PREFIX_SEPARATOR } from "@smithy/core/config"; import { afterEach, beforeEach, describe, expect, test as it } from "vitest"; import { getEndpointUrlConfig } from "./getEndpointUrlConfig"; const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; const CONFIG_ENDPOINT_URL = "endpoint_url"; describe(getEndpointUrlConfig.name, () => { const serviceId = "foo"; const endpointUrlConfig = getEndpointUrlConfig(serviceId); const mockEndpoint = "https://mock-endpoint.com"; const ORIGINAL_ENV = process.env; beforeEach(() => { process.env = {}; }); afterEach(() => { process.env = ORIGINAL_ENV; }); describe("environmentVariableSelector", () => { beforeEach(() => { process.env[ENV_ENDPOINT_URL] = mockEndpoint; }); it.each([ ["foo", `${ENV_ENDPOINT_URL}_FOO`], ["foobar", `${ENV_ENDPOINT_URL}_FOOBAR`], ["foo bar", `${ENV_ENDPOINT_URL}_FOO_BAR`], ])("returns endpoint for '%s' from environment variable %s", (serviceId, envKey) => { const serviceMockEndpoint = `${mockEndpoint}/${envKey}`; process.env[envKey] = serviceMockEndpoint; const endpointUrlConfig = getEndpointUrlConfig(serviceId); expect(endpointUrlConfig.environmentVariableSelector(process.env)).toEqual(serviceMockEndpoint); }); it(`returns endpoint from environment variable ${ENV_ENDPOINT_URL}`, () => { expect(endpointUrlConfig.environmentVariableSelector(process.env)).toEqual(mockEndpoint); }); it("returns undefined, if endpoint not available in environment variables", () => { process.env[ENV_ENDPOINT_URL] = undefined; expect(endpointUrlConfig.environmentVariableSelector(process.env)).toBeUndefined(); }); }); describe("configFileSelector", () => { it.each([ ["foo", "foo"], ["foobar", "foobar"], ["foo bar", "foo_bar"], ])("returns endpoint for '%s' from config file '%s'", (serviceId, serviceConfigId) => { const servicesSectionPrefix = "services"; const servicesSectionName = "config-services"; const serviceMockEndpoint = `${mockEndpoint}/${serviceConfigId}`; const profile = { [servicesSectionPrefix]: servicesSectionName, [CONFIG_ENDPOINT_URL]: mockEndpoint, }; const config = { [serviceId]: profile, [[servicesSectionPrefix, servicesSectionName].join(CONFIG_PREFIX_SEPARATOR)]: { [[serviceConfigId, CONFIG_ENDPOINT_URL].join(CONFIG_PREFIX_SEPARATOR)]: serviceMockEndpoint, }, }; const endpointUrlConfig = getEndpointUrlConfig(serviceId); expect(endpointUrlConfig.configFileSelector(profile, config)).toEqual(serviceMockEndpoint); }); it(`returns endpoint from config ${CONFIG_ENDPOINT_URL}`, () => { const profile = { [CONFIG_ENDPOINT_URL]: mockEndpoint }; expect(endpointUrlConfig.configFileSelector(profile)).toEqual(mockEndpoint); }); it("returns undefined, if endpoint not available in config", () => { expect(endpointUrlConfig.environmentVariableSelector({})).toBeUndefined(); }); }); it("returns undefined by default", () => { expect(endpointUrlConfig.default).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/getEndpointUrlConfig.ts ================================================ import { CONFIG_PREFIX_SEPARATOR, type LoadedConfigSelectors } from "@smithy/core/config"; const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; const CONFIG_ENDPOINT_URL = "endpoint_url"; export const getEndpointUrlConfig = (serviceId: string): LoadedConfigSelectors => ({ environmentVariableSelector: (env) => { // The value provided by a service-specific environment variable. const serviceSuffixParts = serviceId.split(" ").map((w) => w.toUpperCase()); const serviceEndpointUrl = env[[ENV_ENDPOINT_URL, ...serviceSuffixParts].join("_")]; if (serviceEndpointUrl) return serviceEndpointUrl; // The value provided by the global endpoint environment variable. const endpointUrl = env[ENV_ENDPOINT_URL]; if (endpointUrl) return endpointUrl; return undefined; }, configFileSelector: (profile, config) => { // The value provided by a service-specific parameter from a services definition section if (config && profile.services) { const servicesSection = config[["services", profile.services].join(CONFIG_PREFIX_SEPARATOR)]; if (servicesSection) { const servicePrefixParts = serviceId.split(" ").map((w) => w.toLowerCase()); const endpointUrl = servicesSection[[servicePrefixParts.join("_"), CONFIG_ENDPOINT_URL].join(CONFIG_PREFIX_SEPARATOR)]; if (endpointUrl) return endpointUrl; } } // The value provided by the global parameter from a profile in the shared configuration file. const endpointUrl = profile[CONFIG_ENDPOINT_URL]; if (endpointUrl) return endpointUrl; return undefined; }, default: undefined, }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/adaptors/toEndpointV1.ts ================================================ /** * @deprecated Use `toEndpointV1` from `@smithy/core/endpoints` instead. * @internal */ export { toEndpointV1 } from "../../toEndpointV1"; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/endpointMiddleware.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import type { AuthScheme, EndpointParameters, EndpointV2, HandlerExecutionContext, MetadataBearer, SelectedHttpAuthScheme, SerializeHandler, SerializeHandlerArguments, SerializeHandlerOutput, SerializeMiddleware, SmithyFeatures, } from "@smithy/types"; import { bindGetEndpointFromInstructions, type GetEndpointFromConfig } from "./adaptors/getEndpointFromInstructions"; import type { EndpointResolvedConfig } from "./resolveEndpointConfig"; import type { EndpointParameterInstructions } from "./types"; function setFeature( context: HandlerExecutionContext, feature: F, value: SmithyFeatures[F] ) { if (!context.__smithy_context) { context.__smithy_context = { features: {} }; } else if (!context.__smithy_context.features) { context.__smithy_context.features = {}; } context.__smithy_context.features![feature] = value; } /** * @internal */ interface EndpointMiddlewareSmithyContext extends Record { selectedHttpAuthScheme?: SelectedHttpAuthScheme; } /** * @internal */ export function bindEndpointMiddleware(getEndpointFromConfig: GetEndpointFromConfig) { const getEndpointFromInstructions = bindGetEndpointFromInstructions(getEndpointFromConfig); return ({ config, instructions, }: { config: EndpointResolvedConfig; instructions: EndpointParameterInstructions; }): SerializeMiddleware => { return ( next: SerializeHandler, context: HandlerExecutionContext ): SerializeHandler => async (args: SerializeHandlerArguments): Promise> => { if (config.isCustomEndpoint) { setFeature(context, "ENDPOINT_OVERRIDE", "N"); } const endpoint: EndpointV2 = await getEndpointFromInstructions( args.input, { getEndpointParameterInstructions() { return instructions; }, }, { ...config }, context ); context.endpointV2 = endpoint; context.authSchemes = endpoint.properties?.authSchemes; const authScheme: AuthScheme | undefined = context.authSchemes?.[0]; if (authScheme) { context["signing_region"] = authScheme.signingRegion; context["signing_service"] = authScheme.signingName; const smithyContext: EndpointMiddlewareSmithyContext = getSmithyContext(context); const httpAuthOption = smithyContext?.selectedHttpAuthScheme?.httpAuthOption; if (httpAuthOption) { httpAuthOption.signingProperties = Object.assign( httpAuthOption.signingProperties || {}, { signing_region: authScheme.signingRegion, signingRegion: authScheme.signingRegion, signing_service: authScheme.signingName, signingName: authScheme.signingName, signingRegionSet: authScheme.signingRegionSet, }, authScheme.properties ); } } return next({ ...args, }); }; }; } ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/getEndpointPlugin.ts ================================================ import type { EndpointParameters, Pluggable, RelativeMiddlewareOptions, SerializeHandlerOptions } from "@smithy/types"; import type { GetEndpointFromConfig } from "./adaptors/getEndpointFromInstructions"; import { bindEndpointMiddleware } from "./endpointMiddleware"; import type { EndpointResolvedConfig } from "./resolveEndpointConfig"; import type { EndpointParameterInstructions } from "./types"; /** * Inlined from @smithy/core/serde to avoid cross-submodule CJS resolution issue. */ const serializerMiddlewareOption: SerializeHandlerOptions = { name: "serializerMiddleware", step: "serialize", tags: ["SERIALIZER"], override: true, }; /** * @internal */ export const endpointMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = { step: "serialize", tags: ["ENDPOINT_PARAMETERS", "ENDPOINT_V2", "ENDPOINT"], name: "endpointV2Middleware", override: true, relation: "before", toMiddleware: serializerMiddlewareOption.name!, }; /** * @internal */ export function bindGetEndpointPlugin(getEndpointFromConfig: GetEndpointFromConfig) { const endpointMiddleware = bindEndpointMiddleware(getEndpointFromConfig); return ( config: EndpointResolvedConfig, instructions: EndpointParameterInstructions ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( endpointMiddleware({ config, instructions, }), endpointMiddlewareOptions ); }, }); } ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/resolveEndpointConfig.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { resolveEndpointConfig } from "../index"; describe(resolveEndpointConfig.name, () => { it("maintains object custody", () => { const input = { tls: true, useFipsEndpoint: true, useDualstackEndpoint: true, endpointProvider: vi.fn(), urlParser: vi.fn(), region: async () => "us-east-1", }; expect(resolveEndpointConfig(input)).toBe(input); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/resolveEndpointConfig.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { Endpoint, EndpointParameters, EndpointV2, Logger, Provider, UrlParser } from "@smithy/types"; import type { GetEndpointFromConfig } from "./adaptors/getEndpointFromInstructions"; import { toEndpointV1 } from "./adaptors/toEndpointV1"; /** * Endpoint config interfaces and resolver for Endpoint v2. They live in separate package to allow per-service onboarding. * When all services onboard Endpoint v2, the resolver in config-resolver package can be removed. * This interface includes all the endpoint parameters with built-in bindings of "AWS::*" and "SDK::*" * * @public */ export interface EndpointInputConfig { /** * The fully qualified endpoint of the webservice. This is only for using * a custom endpoint (for example, when using a local version of S3). * * Endpoint transformations such as S3 applying a bucket to the hostname are * still applicable to this custom endpoint. */ endpoint?: string | Endpoint | Provider | EndpointV2 | Provider; /** * Providing a custom endpointProvider will override * built-in transformations of the endpoint such as S3 adding the bucket * name to the hostname, since they are part of the default endpointProvider. */ endpointProvider?: (params: T, context?: { logger?: Logger }) => EndpointV2; /** * Whether TLS is enabled for requests. * @deprecated */ tls?: boolean; /** * Enables IPv6/IPv4 dualstack endpoint. */ useDualstackEndpoint?: boolean | Provider; /** * Enables FIPS compatible endpoints. */ useFipsEndpoint?: boolean | Provider; /** * This field is used internally so you should not fill any value to this field. * * @internal */ serviceConfiguredEndpoint?: never; } /** * @internal */ export interface PreviouslyResolved { urlParser: UrlParser; endpointProvider: (params: T, context?: { logger?: Logger }) => EndpointV2; logger?: Logger; serviceId?: string; } /** * This supersedes the similarly named EndpointsResolvedConfig (no parametric types) * from resolveEndpointsConfig.ts in \@smithy/config-resolver. * * @internal */ export interface EndpointResolvedConfig { /** * Custom endpoint provided by the user. * This is normalized to a single interface from the various acceptable types. * This field will be undefined if a custom endpoint is not provided. */ endpoint?: Provider; endpointProvider: (params: T, context?: { logger?: Logger }) => EndpointV2; /** * Whether TLS is enabled for requests. * @deprecated */ tls: boolean; /** * Whether the endpoint is specified by caller. * This should be used over checking the existence of `endpoint`, since * that may have been set by other means, such as the default regional * endpoint provider function. * * @internal */ isCustomEndpoint?: boolean; /** * Resolved value for input {@link EndpointsInputConfig.useDualstackEndpoint} */ useDualstackEndpoint: Provider; /** * Resolved value for input {@link EndpointsInputConfig.useFipsEndpoint} */ useFipsEndpoint: Provider; /** * Unique service identifier. * @internal */ serviceId?: string; /** * A configured endpoint global or specific to the service from ENV or AWS SDK configuration files. * @internal */ serviceConfiguredEndpoint?: Provider; } /** * @internal */ export function bindResolveEndpointConfig(getEndpointFromConfig: GetEndpointFromConfig) { return ( input: T & EndpointInputConfig

& PreviouslyResolved

): T & EndpointResolvedConfig

=> { const tls = input.tls ?? true; const { endpoint, useDualstackEndpoint, useFipsEndpoint } = input; const customEndpointProvider = endpoint != null ? async () => toEndpointV1(await normalizeProvider(endpoint)()) : undefined; const isCustomEndpoint = !!endpoint; const resolvedConfig = Object.assign(input, { endpoint: customEndpointProvider, tls, isCustomEndpoint, useDualstackEndpoint: normalizeProvider(useDualstackEndpoint ?? false), useFipsEndpoint: normalizeProvider(useFipsEndpoint ?? false), }) as T & EndpointResolvedConfig

; let configuredEndpointPromise: undefined | Promise = undefined; resolvedConfig.serviceConfiguredEndpoint = async () => { if (input.serviceId && !configuredEndpointPromise) { configuredEndpointPromise = getEndpointFromConfig(input.serviceId); } return configuredEndpointPromise; }; return resolvedConfig; }; } ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/resolveEndpointRequiredConfig.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { resolveEndpointRequiredConfig } from "./resolveEndpointRequiredConfig"; describe(resolveEndpointRequiredConfig.name, () => { it("creates a default endpoint resolver function", async () => { const config = resolveEndpointRequiredConfig({ endpoint: undefined as any, }); expect(() => config.endpoint()).rejects.toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/resolveEndpointRequiredConfig.ts ================================================ import type { Endpoint, EndpointV2, Provider } from "@smithy/types"; /** * This is an additional config resolver layer for clients using the default * endpoints ruleset. It modifies the input and output config types to make * the endpoint configuration property required. * * It must be placed after the `resolveEndpointConfig` * resolver. This replaces the "CustomEndpoints" config resolver, which was used * prior to default endpoint rulesets. * * @public */ export interface EndpointRequiredInputConfig { endpoint: string | Endpoint | Provider | EndpointV2 | Provider; } /** * @internal */ interface PreviouslyResolved { endpoint?: Provider; } /** * @internal */ export interface EndpointRequiredResolvedConfig { endpoint: Provider; } /** * @internal */ export const resolveEndpointRequiredConfig = ( input: T & EndpointRequiredInputConfig & PreviouslyResolved ): T & EndpointRequiredResolvedConfig => { const { endpoint } = input; if (endpoint === undefined) { input.endpoint = async () => { throw new Error( "@smithy/middleware-endpoint: (default endpointRuleSet) endpoint is not set - you must configure an endpoint." ); }; } return input as T & EndpointRequiredResolvedConfig; }; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/service-customizations/index.ts ================================================ /** * @internal */ export * from "./s3"; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/service-customizations/s3.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isArnBucketName } from "./s3"; describe("S3 customizations for endpoint resolution", () => { describe(isArnBucketName.name, () => { it("should require the partition, service, and a resource id", () => { expect(isArnBucketName("arn:aws:s3:us-east-1:1234567890:bucket_name")).toBe(true); expect(() => isArnBucketName("arn::s3:us-east-1:1234567890:bucket_name")).toThrow(); expect(() => isArnBucketName("arn:aws::us-east-1:1234567890:bucket_name")).toThrow(); expect(() => isArnBucketName("arn:aws:s3:us-east-1:1234567890:")).toThrow(); }); it("should not require the account id", () => { expect(isArnBucketName("arn:aws:s3:::bucket_name")).toBe(true); expect(isArnBucketName("arn:aws:s3::123456789:bucket_name")).toBe(true); expect(() => isArnBucketName("arn:aws:s3:::")).toThrow(); expect(() => isArnBucketName("arn:aws:s3::123456789:")).toThrow(); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/service-customizations/s3.ts ================================================ import type { EndpointParameters } from "@smithy/types"; /** * @internal */ export const resolveParamsForS3 = async (endpointParams: EndpointParameters) => { const bucket = (endpointParams?.Bucket as string) || ""; if (typeof endpointParams.Bucket === "string") { endpointParams.Bucket = bucket.replace(/#/g, encodeURIComponent("#")).replace(/\?/g, encodeURIComponent("?")); } if (isArnBucketName(bucket)) { if (endpointParams.ForcePathStyle === true) { throw new Error("Path-style addressing cannot be used with ARN buckets"); } } else if ( !isDnsCompatibleBucketName(bucket) || (bucket.indexOf(".") !== -1 && !String(endpointParams.Endpoint).startsWith("http:")) || bucket.toLowerCase() !== bucket || bucket.length < 3 ) { endpointParams.ForcePathStyle = true; } if (endpointParams.DisableMultiRegionAccessPoints) { // inconsistent naming endpointParams.disableMultiRegionAccessPoints = true; endpointParams.DisableMRAP = true; } return endpointParams; }; const DOMAIN_PATTERN = /^[a-z0-9][a-z0-9\.\-]{1,61}[a-z0-9]$/; const IP_ADDRESS_PATTERN = /(\d+\.){3}\d+/; const DOTS_PATTERN = /\.\./; /** * @internal */ export const DOT_PATTERN = /\./; /** * @internal */ export const S3_HOSTNAME_PATTERN = /^(.+\.)?s3(-fips)?(\.dualstack)?[.-]([a-z0-9-]+)\./; /** * Determines whether a given string is DNS compliant per the rules outlined by * S3. Length, capitaization, and leading dot restrictions are enforced by the * DOMAIN_PATTERN regular expression. * @internal * * @see https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html */ export const isDnsCompatibleBucketName = (bucketName: string): boolean => DOMAIN_PATTERN.test(bucketName) && !IP_ADDRESS_PATTERN.test(bucketName) && !DOTS_PATTERN.test(bucketName); /** * @internal */ export const isArnBucketName = (bucketName: string): boolean => { // region and account are unused between service and bucket. const [arn, partition, service, , , bucket] = bucketName.split(":"); const isArn = arn === "arn" && bucketName.split(":").length >= 6; const isValidArn = Boolean(isArn && partition && service && bucket); if (isArn && !isValidArn) { throw new Error(`Invalid ARN: ${bucketName} was an invalid ARN.`); } return isValidArn; }; ================================================ FILE: packages/core/src/submodules/endpoints/middleware-endpoint/types.ts ================================================ /** * @internal */ export interface EndpointParameterInstructions { [name: string]: | BuiltInParamInstruction | ClientContextParamInstruction | StaticContextParamInstruction | ContextParamInstruction | OperationContextParamInstruction; } /** * @internal */ export interface BuiltInParamInstruction { type: "builtInParams"; name: string; } /** * @internal */ export interface ClientContextParamInstruction { type: "clientContextParams"; name: string; // The client resolved config name that has clientContextParams trait } /** * @internal */ export interface StaticContextParamInstruction { type: "staticContextParams"; value: string | boolean; } /** * @internal */ export interface ContextParamInstruction { type: "contextParams"; name: string; // The input structure's member name that has contextParams trait } /** * @internal */ export interface OperationContextParamInstruction { type: "operationContextParams"; get(input: any): any; } ================================================ FILE: packages/core/src/submodules/endpoints/toEndpointV1.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { toEndpointV1 } from "./toEndpointV1"; describe(toEndpointV1.name, () => { it("converts string endpoint", () => { const result = toEndpointV1("https://example.com/path"); expect(result).toEqual({ protocol: "https:", hostname: "example.com", path: "/path", }); }); it("converts EndpointV2 to EndpointV1 with url", () => { const result = toEndpointV1({ url: new URL("https://example.com/path"), }); expect(result).toEqual({ protocol: "https:", hostname: "example.com", path: "/path", }); }); it("converts EndpointV2 headers to EndpointV1 format", () => { const result = toEndpointV1({ url: new URL("https://example.com/path"), headers: { "x-api-key": ["key-value"], "x-custom-header": ["value1", "value2"], }, }); expect(result).toEqual({ protocol: "https:", hostname: "example.com", path: "/path", headers: { "x-api-key": "key-value", "x-custom-header": "value1, value2", }, }); }); it("passes through EndpointV1", () => { const v1Endpoint = { protocol: "https:", hostname: "example.com", path: "/path", }; const result = toEndpointV1(v1Endpoint); expect(result).toBe(v1Endpoint); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/toEndpointV1.ts ================================================ import { parseUrl } from "@smithy/core/protocols"; import type { Endpoint, EndpointV2 } from "@smithy/types"; /** * Converts an endpoint to EndpointV1 format. * @internal */ export const toEndpointV1 = (endpoint: string | Endpoint | EndpointV2): Endpoint => { if (typeof endpoint === "object") { if ("url" in endpoint) { // v2 const v1Endpoint = parseUrl(endpoint.url); if (endpoint.headers) { v1Endpoint.headers = {}; for (const name in endpoint.headers) { v1Endpoint.headers[name.toLowerCase()] = endpoint.headers[name].join(", "); } } return v1Endpoint; } // v1 return endpoint; } return parseUrl(endpoint); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/endpoints`. ## 3.4.2 ### Patch Changes - 449ba5a: Reduce temporary object allocations ## 3.4.1 ### Patch Changes - 5a18069: fix getAttr function when using negative index - cb76b1f: handle nullish input for getEndpointHeaders function - b4a8b6b: Resolve defaults and required params in one pass - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/node-config-provider@4.3.14 ## 3.4.0 ### Minor Changes - 8196133: add endpoint binary decision diagrams feature - 2490c8c: performance improvements for endpoint resolver functions ## 3.3.4 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/node-config-provider@4.3.13 ## 3.3.3 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/node-config-provider@4.3.12 ## 3.3.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/node-config-provider@4.3.11 ## 3.3.1 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/node-config-provider@4.3.10 ## 3.3.0 ### Minor Changes - 2bf677c: return empty when given non-ASCII input in substring ## 3.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/node-config-provider@4.3.9 - @smithy/types@4.12.1 ## 3.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/node-config-provider@4.3.8 ## 3.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/node-config-provider@4.3.7 ## 3.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/node-config-provider@4.3.6 ## 3.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/node-config-provider@4.3.5 ## 3.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/node-config-provider@4.3.4 ## 3.2.3 ### Patch Changes - 7e359e2: remove and ban circular imports - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/node-config-provider@4.3.3 ## 3.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/node-config-provider@4.3.2 ## 3.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/node-config-provider@4.3.1 ## 3.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/node-config-provider@4.3.0 - @smithy/types@4.6.0 ## 3.1.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 ## 3.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/node-config-provider@4.2.1 ## 3.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/node-config-provider@4.2.0 - @smithy/types@4.4.0 ## 3.0.7 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/node-config-provider@4.1.4 ## 3.0.6 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/node-config-provider@4.1.3 ## 3.0.5 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/node-config-provider@4.1.2 ## 3.0.4 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 ## 3.0.3 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 ## 3.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/node-config-provider@4.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/node-config-provider@4.0.1 ## 3.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/node-config-provider@4.0.0 - @smithy/types@4.0.0 ## 2.1.7 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/node-config-provider@3.1.12 ## 2.1.6 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/node-config-provider@3.1.11 ## 2.1.5 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/node-config-provider@3.1.10 ## 2.1.4 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/node-config-provider@3.1.9 ## 2.1.3 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/node-config-provider@3.1.8 ## 2.1.2 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/node-config-provider@3.1.7 ## 2.1.1 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/node-config-provider@3.1.6 ## 2.1.0 ### Minor Changes - 1ff575c: add endpoint ruleset cache ### Patch Changes - 77db9e7: Do not take protocol and port from custom Endpoint - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/node-config-provider@3.1.5 ## 2.0.5 ### Patch Changes - @smithy/node-config-provider@3.1.4 ## 2.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/node-config-provider@3.1.3 ## 2.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/node-config-provider@3.1.2 ## 2.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/node-config-provider@3.1.1 ## 2.0.1 ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/node-config-provider@3.1.0 ## 2.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - c1105634: improves the debug message in util-endpoints - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/node-config-provider@3.0.0 ## 1.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/node-config-provider@2.3.0 - @smithy/types@2.12.0 ## 1.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 ## 1.1.4 ### Patch Changes - @smithy/node-config-provider@2.2.4 ## 1.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/node-config-provider@2.2.3 ## 1.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/node-config-provider@2.2.2 ## 1.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/node-config-provider@2.2.1 - @smithy/types@2.9.1 ## 1.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/node-config-provider@2.2.0 - @smithy/types@2.9.0 ## 1.0.8 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/node-config-provider@2.1.9 ## 1.0.7 ### Patch Changes - @smithy/node-config-provider@2.1.8 ## 1.0.6 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/node-config-provider@2.1.7 ## 1.0.5 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/node-config-provider@2.1.6 ## 1.0.4 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/node-config-provider@2.1.5 ## 1.0.3 ### Patch Changes - @smithy/node-config-provider@2.1.4 ## 1.0.2 ### Patch Changes - d84019ef: Re-export existing types ## 1.0.1 ### Patch Changes - 926ba651: Migrate util-endpoints package ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/aws-region.json ================================================ { "testCases": [ { "documentation": "basic region templating", "params": { "Region": "us-east-1" }, "expect": { "endpoint": { "url": "https://us-east-1.amazonaws.com", "properties": { "authSchemes": [ { "name": "sigv4", "signingRegion": "us-east-1", "signingName": "serviceName" } ] } } } }, { "documentation": "test case where region is unset", "params": {}, "expect": { "error": "Region must be set to resolve a valid endpoint" } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/default-values.json ================================================ { "testCases": [ { "documentation": "default endpoint", "params": {}, "expect": { "endpoint": { "url": "https://fips.us-west-5.amazonaws.com" } } }, { "documentation": "test case where FIPS is disabled", "params": { "UseFips": false }, "expect": { "error": "UseFips = false" } }, { "documentation": "test case where FIPS is enabled explicitly", "params": { "UseFips": true }, "expect": { "endpoint": { "url": "https://fips.us-west-5.amazonaws.com" } } }, { "documentation": "defaults can be overridden", "params": { "Region": "us-east-1" }, "expect": { "endpoint": { "url": "https://fips.us-east-1.amazonaws.com" } } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/headers.json ================================================ { "version": "1.4", "testCases": [ { "documentation": "header set to region", "params": { "Region": "us-east-1" }, "expect": { "endpoint": { "url": "https://us-east-1.amazonaws.com", "headers": { "x-amz-region": ["us-east-1"], "x-amz-multi": ["*", "us-east-1"] } } } } ] } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/local-region-override.json ================================================ { "testCases": [ { "documentation": "local region override", "params": { "Region": "local" }, "expect": { "endpoint": { "url": "http://localhost:8080" } } }, { "documentation": "standard region templated", "params": { "Region": "us-east-2" }, "expect": { "endpoint": { "url": "https://us-east-2.someservice.amazonaws.com" } } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/parse-url.json ================================================ { "version": "1.4", "testCases": [ { "documentation": "simple URL parsing", "params": { "Endpoint": "https://authority.com/custom-path" }, "expect": { "endpoint": { "url": "https://https-authority.com.example.com/path-is/custom-path" } } }, { "documentation": "empty path no slash", "params": { "Endpoint": "https://authority.com" }, "expect": { "endpoint": { "url": "https://https-authority.com-nopath.example.com" } } }, { "documentation": "empty path with slash", "params": { "Endpoint": "https://authority.com/" }, "expect": { "endpoint": { "url": "https://https-authority.com-nopath.example.com" } } }, { "documentation": "authority with port", "params": { "Endpoint": "https://authority.com:8000/port" }, "expect": { "endpoint": { "url": "https://authority.com:8000/uri-with-port" } } }, { "documentation": "http schemes", "params": { "Endpoint": "http://authority.com:8000/port" }, "expect": { "endpoint": { "url": "http://authority.com:8000/uri-with-port" } } }, { "documentation": "arbitrary schemes are not supported", "params": { "Endpoint": "acbd://example.com" }, "expect": { "error": "endpoint was invalid" } }, { "documentation": "host labels are not validated", "params": { "Endpoint": "http://99_ab.com" }, "expect": { "endpoint": { "url": "https://http-99_ab.com-nopath.example.com" } } }, { "documentation": "host labels are not validated", "params": { "Endpoint": "http://99_ab-.com" }, "expect": { "endpoint": { "url": "https://http-99_ab-.com-nopath.example.com" } } }, { "documentation": "invalid URL", "params": { "Endpoint": "http://abc.com:a/foo" }, "expect": { "error": "endpoint was invalid" }, "skip": true }, { "documentation": "IP Address", "params": { "Endpoint": "http://192.168.1.1/foo/" }, "expect": { "endpoint": { "url": "http://192.168.1.1/foo/is-ip-addr" } } }, { "documentation": "IP Address with port", "params": { "Endpoint": "http://192.168.1.1:1234/foo/" }, "expect": { "endpoint": { "url": "http://192.168.1.1:1234/foo/is-ip-addr" } } }, { "documentation": "IPv6 Address", "params": { "Endpoint": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443" }, "expect": { "endpoint": { "url": "https://[2001:db8:85a3:8d3:1319:8a2e:370:7348]:443/is-ip-addr" } } }, { "documentation": "weird DNS name", "params": { "Endpoint": "https://999.999.abc.blah" }, "expect": { "endpoint": { "url": "https://https-999.999.abc.blah-nopath.example.com" } } }, { "documentation": "query in resolved endpoint is not supported", "params": { "Endpoint": "https://example.com/path?query1=foo" }, "expect": { "error": "endpoint was invalid" } } ] } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/substring.json ================================================ { "testCases": [ { "documentation": "substring when string is long enough", "params": { "TestCaseId": "1", "Input": "abcdefg" }, "expect": { "error": "The value is: `abcd`" } }, { "documentation": "substring when string is exactly the right length", "params": { "TestCaseId": "1", "Input": "abcd" }, "expect": { "error": "The value is: `abcd`" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "1", "Input": "abc" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "1", "Input": "" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", "params": { "TestCaseId": "1", "Input": "\ufdfd" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring when string is long enough", "params": { "TestCaseId": "2", "Input": "abcdefg" }, "expect": { "error": "The value is: `defg`" } }, { "documentation": "substring when string is exactly the right length", "params": { "TestCaseId": "2", "Input": "defg" }, "expect": { "error": "The value is: `defg`" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "2", "Input": "abc" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "2", "Input": "" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", "params": { "TestCaseId": "2", "Input": "\ufdfd" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring when string is longer", "params": { "TestCaseId": "3", "Input": "defg" }, "expect": { "error": "The value is: `ef`" } }, { "documentation": "substring when string is exact length", "params": { "TestCaseId": "3", "Input": "def" }, "expect": { "error": "The value is: `ef`" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "3", "Input": "ab" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring when string is too short", "params": { "TestCaseId": "3", "Input": "" }, "expect": { "error": "No tests matched" } }, { "documentation": "substring on wide characters (ensure that unicode code points are properly counted)", "params": { "TestCaseId": "3", "Input": "\ufdfd" }, "expect": { "error": "No tests matched" } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/uri-encode.json ================================================ { "testCases": [ { "documentation": "uriEncode when the string has nothing to encode returns the input", "params": { "TestCaseId": "1", "Input": "abcdefg" }, "expect": { "error": "The value is: `abcdefg`" } }, { "documentation": "uriEncode with single character to encode encodes only that character", "params": { "TestCaseId": "1", "Input": "abc:defg" }, "expect": { "error": "The value is: `abc%3Adefg`" } }, { "documentation": "uriEncode with all ASCII characters to encode encodes all characters", "params": { "TestCaseId": "1", "Input": "/:,?#[]{}|@! $&'()*+;=%<>\"^`\\" }, "expect": { "error": "The value is: `%2F%3A%2C%3F%23%5B%5D%7B%7D%7C%40%21%20%24%26%27%28%29%2A%2B%3B%3D%25%3C%3E%22%5E%60%5C`" } }, { "documentation": "uriEncode with ASCII characters that should not be encoded returns the input", "params": { "TestCaseId": "1", "Input": "0123456789.underscore_dash-Tilda~" }, "expect": { "error": "The value is: `0123456789.underscore_dash-Tilda~`" } }, { "documentation": "uriEncode encodes unicode characters", "params": { "TestCaseId": "1", "Input": "\ud83d\ude39" }, "expect": { "error": "The value is: `%F0%9F%98%B9`" } }, { "documentation": "uriEncode on all printable ASCII characters", "params": { "TestCaseId": "1", "Input": " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~" }, "expect": { "error": "The value is: `%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~`" } }, { "documentation": "uriEncode on an empty string", "params": { "TestCaseId": "1", "Input": "" }, "expect": { "error": "The value is: ``" } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/test-cases/valid-hostlabel.json ================================================ { "testCases": [ { "documentation": "standard region is a valid hostlabel", "params": { "Region": "us-east-1" }, "expect": { "endpoint": { "url": "https://us-east-1.amazonaws.com" } } }, { "documentation": "starting with a number is a valid hostlabel", "params": { "Region": "3aws4" }, "expect": { "endpoint": { "url": "https://3aws4.amazonaws.com" } } }, { "documentation": "when there are dots, only match if subdomains are allowed", "params": { "Region": "part1.part2" }, "expect": { "endpoint": { "url": "https://part1.part2-subdomains.amazonaws.com" } } }, { "documentation": "a space is never a valid hostlabel", "params": { "Region": "part1 part2" }, "expect": { "error": "Invalid hostlabel" } } ], "version": "1.4" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/aws-region.json ================================================ { "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region", "documentation": "The region to dispatch this request, eg. `us-east-1`." } }, "rules": [ { "documentation": "Template the region into the URI when region is set", "conditions": [ { "fn": "isSet", "argv": [ { "ref": "Region" } ] } ], "endpoint": { "url": "https://{Region}.amazonaws.com", "properties": { "authSchemes": [ { "name": "sigv4", "signingName": "serviceName", "signingRegion": "{Region}" } ] } }, "type": "endpoint" }, { "documentation": "fallback when region is unset", "conditions": [], "error": "Region must be set to resolve a valid endpoint", "type": "error" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/default-values.json ================================================ { "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region", "documentation": "The region to dispatch this request, eg. `us-east-1`.", "default": "us-west-5", "required": true }, "UseFips": { "type": "boolean", "builtIn": "AWS::UseFIPS", "default": true, "required": true } }, "rules": [ { "documentation": "Template the region into the URI when FIPS is enabled", "conditions": [ { "fn": "booleanEquals", "argv": [ { "ref": "UseFips" }, true ] } ], "endpoint": { "url": "https://fips.{Region}.amazonaws.com" }, "type": "endpoint" }, { "documentation": "error when fips is disabled", "conditions": [], "error": "UseFips = false", "type": "error" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/headers.json ================================================ { "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region", "documentation": "The region to dispatch this request, eg. `us-east-1`." } }, "rules": [ { "documentation": "Template the region into the URI when region is set", "conditions": [ { "fn": "isSet", "argv": [ { "ref": "Region" } ] } ], "endpoint": { "url": "https://{Region}.amazonaws.com", "headers": { "x-amz-region": ["{Region}"], "x-amz-multi": ["*", "{Region}"] } }, "type": "endpoint" }, { "documentation": "fallback when region is unset", "conditions": [], "error": "Region must be set to resolve a valid endpoint", "type": "error" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/local-region-override.json ================================================ { "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region", "required": true } }, "rules": [ { "documentation": "override rule for the local pseduo region", "conditions": [ { "fn": "stringEquals", "argv": ["local", "{Region}"] } ], "endpoint": { "url": "http://localhost:8080" }, "type": "endpoint" }, { "documentation": "base rule", "conditions": [], "endpoint": { "url": "https://{Region}.someservice.amazonaws.com" }, "type": "endpoint" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/parse-url.json ================================================ { "version": "1.3", "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region" }, "Endpoint": { "type": "string" } }, "rules": [ { "documentation": "endpoint is set and is a valid URL", "conditions": [ { "fn": "isSet", "argv": [ { "ref": "Endpoint" } ] }, { "fn": "parseURL", "argv": ["{Endpoint}"], "assign": "url" } ], "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { "fn": "getAttr", "argv": [ { "ref": "url" }, "isIp" ] }, true ] } ], "endpoint": { "url": "{url#scheme}://{url#authority}{url#normalizedPath}is-ip-addr" }, "type": "endpoint" }, { "conditions": [ { "fn": "stringEquals", "argv": ["{url#path}", "/port"] } ], "endpoint": { "url": "{url#scheme}://{url#authority}/uri-with-port" }, "type": "endpoint" }, { "conditions": [ { "fn": "stringEquals", "argv": ["{url#normalizedPath}", "/"] } ], "endpoint": { "url": "https://{url#scheme}-{url#authority}-nopath.example.com" }, "type": "endpoint" }, { "conditions": [], "endpoint": { "url": "https://{url#scheme}-{url#authority}.example.com/path-is{url#path}" }, "type": "endpoint" } ], "type": "tree" }, { "error": "endpoint was invalid", "conditions": [], "type": "error" } ] } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/substring.json ================================================ { "parameters": { "TestCaseId": { "type": "string", "required": true, "documentation": "Test case id used to select the test case to use" }, "Input": { "type": "string", "required": true, "documentation": "the input used to test substring" } }, "rules": [ { "documentation": "Substring from beginning of input", "conditions": [ { "fn": "stringEquals", "argv": ["{TestCaseId}", "1"] }, { "fn": "substring", "argv": ["{Input}", 0, 4, false], "assign": "output" } ], "error": "The value is: `{output}`", "type": "error" }, { "documentation": "Substring from end of input", "conditions": [ { "fn": "stringEquals", "argv": ["{TestCaseId}", "2"] }, { "fn": "substring", "argv": ["{Input}", 0, 4, true], "assign": "output" } ], "error": "The value is: `{output}`", "type": "error" }, { "documentation": "Substring the middle of the string", "conditions": [ { "fn": "stringEquals", "argv": ["{TestCaseId}", "3"] }, { "fn": "substring", "argv": ["{Input}", 1, 3, false], "assign": "output" } ], "error": "The value is: `{output}`", "type": "error" }, { "documentation": "fallback when no tests match", "conditions": [], "error": "No tests matched", "type": "error" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/uri-encode.json ================================================ { "version": "1.3", "parameters": { "TestCaseId": { "type": "string", "required": true, "documentation": "Test case id used to select the test case to use" }, "Input": { "type": "string", "required": true, "documentation": "the input used to test uriEncode" } }, "rules": [ { "documentation": "uriEncode on input", "conditions": [ { "fn": "stringEquals", "argv": ["{TestCaseId}", "1"] }, { "fn": "uriEncode", "argv": ["{Input}"], "assign": "output" } ], "error": "The value is: `{output}`", "type": "error" }, { "documentation": "fallback when no tests match", "conditions": [], "error": "No tests matched", "type": "error" } ] } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/__mocks__/valid-rules/valid-hostlabel.json ================================================ { "parameters": { "Region": { "type": "string", "builtIn": "AWS::Region", "required": true, "documentation": "The region to dispatch this request, eg. `us-east-1`." } }, "rules": [ { "documentation": "Template the region into the URI when region is set", "conditions": [ { "fn": "isValidHostLabel", "argv": [ { "ref": "Region" }, false ] } ], "endpoint": { "url": "https://{Region}.amazonaws.com" }, "type": "endpoint" }, { "documentation": "Template the region into the URI when region is set", "conditions": [ { "fn": "isValidHostLabel", "argv": [ { "ref": "Region" }, true ] } ], "endpoint": { "url": "https://{Region}-subdomains.amazonaws.com" }, "type": "endpoint" }, { "documentation": "Region was not a valid host label", "conditions": [], "error": "Invalid hostlabel", "type": "error" } ], "version": "1.3" } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/bdd/BinaryDecisionDiagram.ts ================================================ import type { EndpointObjectHeaders, ParameterObject } from "@smithy/types"; import type { Expression, FunctionArgv } from "../types/shared"; /** * @internal */ type BddCondition = [string, FunctionArgv] | [string, FunctionArgv, string]; /** * @internal */ type BddResult = | [-1] | [-1, Expression] | [string, Record, EndpointObjectHeaders] | [string, Record]; /** * @internal */ export class BinaryDecisionDiagram { public nodes: Int32Array; public root: number; public conditions: BddCondition[]; public results: BddResult[]; private constructor(bdd: Int32Array, root: number, conditions: BddCondition[] | any[], results: BddResult[] | any[]) { this.nodes = bdd; this.root = root; this.conditions = conditions; this.results = results; } public static from(bdd: Int32Array, root: number, conditions: BddCondition[] | any[], results: BddResult[] | any[]) { return new BinaryDecisionDiagram(bdd, root, conditions, results); } } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/cache/EndpointCache.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { EndpointCache } from "./EndpointCache"; describe(EndpointCache.name, () => { const endpoint1: any = {}; const endpoint2: any = {}; it("should store and retrieve items", () => { const cache = new EndpointCache({ size: 50, params: ["A", "B", "C"], }); expect(cache.get({ A: "b", B: "b" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b", C: "c" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b", C: "c" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b", C: "cc" }, () => endpoint2)).toBe(endpoint2); expect(cache.get({ A: "b", B: "b", C: "cc" }, () => endpoint2)).toBe(endpoint2); expect(cache.size()).toEqual(3); }); it("should accept a custom parameter list", () => { const cache = new EndpointCache({ size: 50, params: ["A", "B"], }); expect(cache.get({ A: "b", B: "b" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b", C: "c" }, () => endpoint1)).toBe(endpoint1); expect(cache.get({ A: "b", B: "b", C: "cc" }, () => endpoint2)).toBe(endpoint1); expect(cache.size()).toEqual(1); }); it("bypasses caching if param values include the cache key delimiter", () => { const cache = new EndpointCache({ size: 50, params: ["A", "B"], }); expect(cache.get({ A: "b", B: "aaa|;aaa" }, () => endpoint1)).toBe(endpoint1); expect(cache.size()).toEqual(0); }); it("bypasses caching if param list is empty", () => { const cache = new EndpointCache({ size: 50, params: [], }); expect(cache.get({ A: "b", B: "b" }, () => endpoint1)).toBe(endpoint1); expect(cache.size()).toEqual(0); }); it("bypasses caching if no param list is supplied", () => { const cache = new EndpointCache({ size: 50, }); expect(cache.get({ A: "b", B: "b" }, () => endpoint1)).toBe(endpoint1); expect(cache.size()).toEqual(0); }); it("should be an LRU cache", () => { const cache = new EndpointCache({ size: 5, params: ["A", "B"], }); for (let i = 0; i < 50; ++i) { cache.get({ A: "b", B: "b" + i }, () => endpoint1); } const size = cache.size(); expect(size).toBeLessThan(16); expect(cache.get({ A: "b", B: "b49" }, () => endpoint2)).toBe(endpoint1); expect(cache.size()).toEqual(size); expect(cache.get({ A: "b", B: "b1" }, () => endpoint2)).toBe(endpoint2); expect(cache.size()).toEqual(size + 1); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/cache/EndpointCache.ts ================================================ import type { EndpointParams, EndpointV2 } from "@smithy/types"; /** * Cache for endpoint ruleSet resolution. * * @internal */ export class EndpointCache { private capacity: number; private data = new Map(); private parameters: string[] = []; /** * @param [size] - desired average maximum capacity. A buffer of 10 additional keys will be allowed * before keys are dropped. * @param [params] - list of params to consider as part of the cache key. * * If the params list is not populated, no caching will happen. * This may be out of order depending on how the object is created and arrives to this class. */ public constructor({ size, params }: { size?: number; params?: string[] }) { this.capacity = size ?? 50; if (params) { this.parameters = params; } } /** * @param endpointParams - query for endpoint. * @param resolver - provider of the value if not present. * @returns endpoint corresponding to the query. */ public get(endpointParams: EndpointParams, resolver: () => EndpointV2): EndpointV2 { const key = this.hash(endpointParams); if (key === false) { return resolver(); } if (!this.data.has(key)) { if (this.data.size > this.capacity + 10) { const keys = this.data.keys(); let i = 0; while (true) { const { value, done } = keys.next(); this.data.delete(value as string); if (done || ++i > 10) { break; } } } this.data.set(key, resolver()); } return this.data.get(key)!; } public size() { return this.data.size; } /** * @returns cache key or false if not cachable. */ private hash(endpointParams: EndpointParams): string | false { let buffer = ""; const { parameters } = this; if (parameters.length === 0) { return false; } for (const param of parameters) { const val = String(endpointParams[param] ?? ""); if (val.includes("|;")) { return false; } buffer += val + "|;"; } return buffer; } } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/debug/debugId.ts ================================================ export const debugId = "endpoints"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/debug/index.ts ================================================ export * from "./debugId"; export * from "./toDebugString"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/debug/toDebugString.ts ================================================ import type { EndpointParameters, EndpointV2 } from "@smithy/types"; import type { GetAttrValue } from "../lib"; import type { EndpointObject, FunctionObject, FunctionReturn } from "../types"; export function toDebugString(input: EndpointParameters): string; export function toDebugString(input: EndpointV2): string; export function toDebugString(input: GetAttrValue): string; export function toDebugString(input: FunctionObject): string; export function toDebugString(input: FunctionReturn): string; export function toDebugString(input: EndpointObject): string; export function toDebugString(input: any): string { if (typeof input !== "object" || input == null) { return input; } if ("ref" in input) { return `$${toDebugString(input.ref)}`; } if ("fn" in input) { return `${input.fn}(${(input.argv || []).map(toDebugString).join(", ")})`; } return JSON.stringify(input, null, 2); } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/decideEndpoint.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { BinaryDecisionDiagram } from "./bdd/BinaryDecisionDiagram"; import { decideEndpoint } from "./decideEndpoint"; describe(decideEndpoint.name, () => { it("resolves an endpoint", () => { const d = "x-api-key"; const a = "isSet", b = "{endpoint}", c = ["{ApiKey}"]; const _data = { conditions: [ [a, [{ ref: "ApiKey" }]], [a, [{ ref: "CustomHeaderValue" }]], ], results: [ [-1], [b, {}, { [d]: c, "x-custom-header": ["{CustomHeaderValue}"] }], [b, {}, { [d]: c }], [b, {}, {}], ], }; const root = 2; const r = 100_000_000; const bdd = new Int32Array([-1, 1, -1, 0, 3, r + 3, 1, r + 1, r + 2]); const data = BinaryDecisionDiagram.from(bdd, root, _data.conditions, _data.results); const endpoint = decideEndpoint(data, { endpointParams: { endpoint: "https://localhost/" }, }); expect(endpoint).toEqual({ url: new URL("https://localhost"), properties: {}, headers: {}, }); }); it("evaluates templates in error messages", () => { const r = 100_000_000; const bdd = new Int32Array([0, 0, 0, 0, r + 0, -1]); const data = BinaryDecisionDiagram.from( bdd, 2, [["isSet", [{ ref: "Region" }]]], [[-1, "Invalid region: {Region}"]] ); expect(() => decideEndpoint(data, { endpointParams: { Region: "us-west-2" }, }) ).toThrow("Invalid region: us-west-2"); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/decideEndpoint.ts ================================================ import type { EndpointV2 } from "@smithy/types"; import type { BinaryDecisionDiagram } from "./bdd/BinaryDecisionDiagram"; import { EndpointError, type EndpointResolverOptions } from "./types"; import { evaluateCondition } from "./utils/evaluateCondition"; import { evaluateExpression } from "./utils/evaluateExpression"; import { getEndpointHeaders } from "./utils/getEndpointHeaders"; import { getEndpointProperties } from "./utils/getEndpointProperties"; import { getEndpointUrl } from "./utils/getEndpointUrl"; const RESULT = 100_000_000; /** * Resolves an endpoint URL by processing the endpoints bdd and options. */ export const decideEndpoint = (bdd: BinaryDecisionDiagram, options: EndpointResolverOptions): EndpointV2 => { const { nodes, root, results, conditions } = bdd; let ref = root; const referenceRecord = {} as Record; const closure = { referenceRecord, endpointParams: options.endpointParams, logger: options.logger, }; while (ref !== 1 && ref !== -1 && ref < RESULT) { const node_i = 3 * (Math.abs(ref) - 1); const [condition_i, highRef, lowRef] = [nodes[node_i], nodes[node_i + 1], nodes[node_i + 2]]; const [fn, argv, assign] = conditions[condition_i]; const evaluation = evaluateCondition({ fn, assign, argv }, closure); if (evaluation.toAssign) { const { name, value } = evaluation.toAssign; referenceRecord[name] = value; } ref = ref >= 0 === evaluation.result ? highRef : lowRef; } if (ref >= RESULT) { const result = results[ref - RESULT]; if (result[0] === -1) { const [, errorExpression] = result; throw new EndpointError(evaluateExpression(errorExpression!, "Error", closure) as string); } const [url, properties, headers] = result; return { url: getEndpointUrl(url, closure), properties: getEndpointProperties(properties, closure), headers: getEndpointHeaders(headers ?? {}, closure), }; } // ref is 1 or -1. throw new EndpointError(`No matching endpoint.`); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/getEndpointUrlConfig.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it } from "vitest"; import { getEndpointUrlConfig } from "./getEndpointUrlConfig"; const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; const CONFIG_ENDPOINT_URL = "endpoint_url"; describe(getEndpointUrlConfig.name, () => { const serviceId = "mockServiceId"; const endpointUrlConfig = getEndpointUrlConfig(serviceId); const mockEndpoint = "https://mock-endpoint.com"; const ORIGINAL_ENV = process.env; beforeEach(() => { process.env = {}; }); afterEach(() => { process.env = ORIGINAL_ENV; }); describe("environmentVariableSelector", () => { beforeEach(() => { process.env[ENV_ENDPOINT_URL] = mockEndpoint; }); it.each([ ["foo", `${ENV_ENDPOINT_URL}_FOO`], ["foobar", `${ENV_ENDPOINT_URL}_FOOBAR`], ["foo bar", `${ENV_ENDPOINT_URL}_FOO_BAR`], ])("returns endpoint for '%s' from environment variable %s", (serviceId, envKey) => { const serviceMockEndpoint = `${mockEndpoint}/${envKey}`; process.env[envKey] = serviceMockEndpoint; const endpointUrlConfig = getEndpointUrlConfig(serviceId); expect(endpointUrlConfig.environmentVariableSelector(process.env)).toEqual(serviceMockEndpoint); }); it(`returns endpoint from environment variable ${ENV_ENDPOINT_URL}`, () => { expect(endpointUrlConfig.environmentVariableSelector(process.env)).toEqual(mockEndpoint); }); it("returns undefined, if endpoint not available in environment variables", () => { process.env[ENV_ENDPOINT_URL] = undefined; expect(endpointUrlConfig.environmentVariableSelector(process.env)).toBeUndefined(); }); }); describe("configFileSelector", () => { const profile = { [CONFIG_ENDPOINT_URL]: mockEndpoint }; // ToDo: Enable once support for services section is added. it.skip.each([ ["foo", "foo"], ["foobar", "foobar"], ["foo bar", "foo_bar"], ])("returns endpoint for '%s' from config file '%s'", (serviceId, serviceConfigId) => { const serviceMockEndpoint = `${mockEndpoint}/${serviceConfigId}`; const serviceSectionName = `services ${serviceConfigId}_dev`; const profileWithServices = { ...profile, services: serviceSectionName, }; const parsedIni = { profileName: profileWithServices, [serviceSectionName]: { [serviceConfigId]: { [CONFIG_ENDPOINT_URL]: serviceMockEndpoint, }, }, }; // @ts-ignore expect(endpointUrlConfig.environmentVariableSelector(profileWithServices, parsedIni)).toEqual( serviceMockEndpoint ); }); it("returns endpoint from config file, if available", () => { expect(endpointUrlConfig.configFileSelector(profile)).toEqual(mockEndpoint); }); it("returns undefined, if endpoint not available in config", () => { expect(endpointUrlConfig.environmentVariableSelector({})).toBeUndefined(); }); }); it("returns undefined by default", () => { expect(endpointUrlConfig.default).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/getEndpointUrlConfig.ts ================================================ import type { IniSection } from "@smithy/types"; /** * Inlined from @smithy/core/config to avoid circular dependency. * * @internal */ type LoadedConfigSelectors = { environmentVariableSelector: (env: Record) => T | undefined; configFileSelector: ( profile: Record, configFile?: Record> ) => T | undefined; default: T | (() => T); }; const ENV_ENDPOINT_URL = "AWS_ENDPOINT_URL"; const CONFIG_ENDPOINT_URL = "endpoint_url"; export const getEndpointUrlConfig = (serviceId: string): LoadedConfigSelectors => ({ environmentVariableSelector: (env: NodeJS.ProcessEnv) => { // The value provided by a service-specific environment variable. const serviceEndpointUrlSections = [ENV_ENDPOINT_URL, ...serviceId.split(" ").map((w) => w.toUpperCase())]; const serviceEndpointUrl = env[serviceEndpointUrlSections.join("_")]; if (serviceEndpointUrl) return serviceEndpointUrl; // The value provided by the global endpoint environment variable. const endpointUrl = env[ENV_ENDPOINT_URL]; if (endpointUrl) return endpointUrl; return undefined; }, configFileSelector: (profile: IniSection) => { // The value provided by a service-specific parameter from a services definition section // referenced in a profile in the shared configuration file. // ToDo: profile is selected one. It does not have access to other 'services' section. // The configFileSelector interface needs to be modified to pass ParsedIniData as optional second parameter. // The value provided by the global parameter from a profile in the shared configuration file. const endpointUrl = profile[CONFIG_ENDPOINT_URL]; if (endpointUrl) return endpointUrl; return undefined; }, default: undefined, }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/booleanEquals.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { booleanEquals } from "./booleanEquals"; describe(booleanEquals.name, () => { it("returns true if values are equal", () => { expect(booleanEquals(true, true)).toBe(true); expect(booleanEquals(false, false)).toBe(true); }); it("returns false if values are not equal", () => { expect(booleanEquals(true, false)).toBe(false); expect(booleanEquals(false, true)).toBe(false); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/booleanEquals.ts ================================================ /** * Evaluates two boolean values value1 and value2 for equality and returns * true if both values match. */ export const booleanEquals = (value1: boolean, value2: boolean): boolean => value1 === value2; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/coalesce.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { coalesce } from "./coalesce"; describe(coalesce.name, () => { it("returns first non-empty value", () => { expect(coalesce("a", "b")).toBe("a"); }); it("skips undefined and returns first non-empty value", () => { expect(coalesce(undefined, "b")).toBe("b"); }); it("returns last arg when all preceding are undefined", () => { expect(coalesce(undefined, undefined, "c")).toBe("c"); }); it("returns undefined when all args are undefined", () => { expect(coalesce(undefined, undefined)).toBeUndefined(); }); it("returns false as non-empty", () => { expect(coalesce(false, true)).toBe(false); }); it("returns 0 as non-empty", () => { expect(coalesce(0, 1)).toBe(0); }); it("returns empty string as non-empty", () => { expect(coalesce("", "fallback")).toBe(""); }); it("works with more than two arguments", () => { expect(coalesce(undefined, undefined, undefined, "d")).toBe("d"); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/coalesce.ts ================================================ /** * Evaluates arguments in order and returns the first non-empty result, * otherwise returns the result of the last argument. * * @internal */ export function coalesce(...args: (T | undefined)[]): T | undefined { for (const arg of args) { if (arg != null) { return arg; } } return undefined; } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/getAttr.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { EndpointError } from "../types"; import { getAttr } from "./getAttr"; import { getAttrPathList } from "./getAttrPathList"; vi.mock("./getAttrPathList"); describe(getAttr.name, () => { const testSuccess = (value: any, input: string, output: unknown, pathList: string[]) => { vi.mocked(getAttrPathList).mockReturnValueOnce(pathList); expect(getAttr(value, input)).toEqual(output); expect(getAttrPathList).toHaveBeenCalledWith(input); }; afterEach(() => { vi.clearAllMocks(); }); describe("object", () => { const mockObj = { Thing1: "foo", Thing2: ["index0", "index1"], Thing3: { SubThing: 42 } }; it.each([ ["foo", "Thing1", ["Thing1"]], ["index0", "Thing2[0]", ["Thing2", "0"]], ["index1", "Thing2[1]", ["Thing2", "1"]], [42, "Thing3.SubThing", ["Thing3", "SubThing"]], ])("returns '%s' for '%s'", (output, input, pathList) => { testSuccess(mockObj, input, output, pathList); }); }); describe("array", () => { const mockArr = ["index0", "index1"]; it.each([ [mockArr[0], "[0]", ["0"]], [mockArr[1], "[1]", ["1"]], [mockArr[1], "[-1]", ["-1"]], [mockArr[0], "[-2]", ["-2"]], ])("returns '%s' for '%s'", (output, input, pathList) => { testSuccess(mockArr, input, output, pathList); }); }); it("rethrows error from getAttrPathList", () => { const mockPath = "mockPath"; const mockError = new Error("test"); vi.mocked(getAttrPathList).mockImplementationOnce(() => { throw mockError; }); expect(() => getAttr({}, mockPath)).toThrow(mockError); expect(getAttrPathList).toHaveBeenCalledWith(mockPath); }); it("throws error if attribute parent is not defined", () => { const mockPath = "foo.bar"; const mockObj = { foo: "bar" }; vi.mocked(getAttrPathList).mockReturnValueOnce(mockPath.split(".")); expect(() => getAttr(mockObj, mockPath)).toThrow( new EndpointError(`Index 'bar' in '${mockPath}' not found in '${JSON.stringify(mockObj)}'`) ); expect(getAttrPathList).toHaveBeenCalledWith(mockPath); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/getAttr.ts ================================================ import { EndpointError } from "../types"; import { getAttrPathList } from "./getAttrPathList"; export type GetAttrValue = string | boolean | { [key: string]: GetAttrValue } | Array; /** * Returns value corresponding to pathing string for an array or object. */ export const getAttr = (value: GetAttrValue, path: string): GetAttrValue => getAttrPathList(path).reduce((acc, index) => { if (typeof acc !== "object") { throw new EndpointError(`Index '${index}' in '${path}' not found in '${JSON.stringify(value)}'`); } else if (Array.isArray(acc)) { const i = parseInt(index); return acc[i < 0 ? acc.length + i : i]; } return acc[index]; }, value); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/getAttrPathList.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { EndpointError } from "../types"; import { getAttrPathList } from "./getAttrPathList"; describe(getAttrPathList.name, () => { const testSuccess = (input: string, output: Array) => { expect(getAttrPathList(input)).toEqual(output); }; const testFail = (input: string, errorMsg: string) => { expect(() => { getAttrPathList(input); }).toThrow(new EndpointError(errorMsg)); }; it("returns top level key", () => { testSuccess("foo", ["foo"]); }); it("returns array with index", () => { testSuccess("foo[0]", ["foo", "0"]); }); it("returns index", () => { testSuccess("[0]", ["0"]); }); it("returns object key", () => { testSuccess("foo.bar", ["foo", "bar"]); }); it("throws error if array brackets don't end", () => { const incompletePath = "foo[0"; testFail(incompletePath, `Path: '${incompletePath}' does not end with ']'`); }); it("throws error if array index is not integer", () => { const invalidIndex = "bar"; const invalidPath = `foo[${invalidIndex}]`; testFail(invalidPath, `Invalid array index: '${invalidIndex}' in path: '${invalidPath}'`); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/getAttrPathList.ts ================================================ import { EndpointError } from "../types"; /** * Parses path as a getAttr expression, returning a list of strings. */ export const getAttrPathList = (path: string): Array => { const parts = path.split("."); const pathList = []; for (const part of parts) { const squareBracketIndex = part.indexOf("["); if (squareBracketIndex !== -1) { if (part.indexOf("]") !== part.length - 1) { throw new EndpointError(`Path: '${path}' does not end with ']'`); } // Take the entire slice except for the last character (which is `]`) const arrayIndex = part.slice(squareBracketIndex + 1, -1); if (Number.isNaN(parseInt(arrayIndex))) { throw new EndpointError(`Invalid array index: '${arrayIndex}' in path: '${path}'`); } if (squareBracketIndex !== 0) { pathList.push(part.slice(0, squareBracketIndex)); } pathList.push(arrayIndex); } else { pathList.push(part); } } return pathList; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/index.ts ================================================ export * from "./booleanEquals"; export * from "./coalesce"; export * from "./getAttr"; export * from "./isSet"; export * from "./isValidHostLabel"; export * from "./ite"; export * from "./not"; export * from "./parseURL"; export * from "./split"; export * from "./stringEquals"; export * from "./substring"; export * from "./uriEncode"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isIpAddress.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isIpAddress } from "./isIpAddress"; describe(isIpAddress.name, () => { it.each([ [false, "example.com"], [true, "127.0.0.1"], [true, "[fe80::1]"], ])("returns %s for '%s'", (output, input) => { expect(isIpAddress(input)).toEqual(output); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isIpAddress.ts ================================================ const IP_V4_REGEX = new RegExp( `^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$` ); /** * Validates if the provided value is an IP address. */ export const isIpAddress = (value: string): boolean => IP_V4_REGEX.test(value) || (value.startsWith("[") && value.endsWith("]")); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isSet.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isSet } from "./isSet"; describe(isSet.name, () => { it.each([null, undefined])("returns false for %s", (notSet) => { expect(isSet(notSet)).toBe(false); }); it.each([false, 0, -0, "", NaN])("returns true for falsy value %s", (falsyVal) => { expect(isSet(falsyVal)).toBe(true); }); it.each([true, 1, -1, "true", [], {}])("returns true for truthy value %s", (falsyVal) => { expect(isSet(falsyVal)).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isSet.ts ================================================ /** * Evaluates whether a value is set (aka not null or undefined). * Returns true if the value is set, otherwise returns false. */ export const isSet = (value: unknown) => value != null; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isValidHostLabel.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isValidHostLabel } from "./isValidHostLabel"; describe(isValidHostLabel.name, () => { const testCases: Array<[boolean, string]> = [ [true, "01010"], [true, "abc"], [true, "A0c"], [false, "A0c-"], [false, "-A0c"], [true, "A-0c"], [false, "a".repeat(64)], [true, "a".repeat(63)], [false, ""], [true, "a"], [true, "0--0"], ]; describe("test without allowSubDomains", () => { it.each(testCases)("returns %s for host label '%s'", (output: boolean, input: string) => { expect(isValidHostLabel(input)).toBe(output); }); }); describe("test with allowSubDomains", () => { it.each([true, false])("tests for output: %s", (output: boolean) => { const hostLabelToTest = testCases .filter(([outputEntry]) => outputEntry === output) .map(([, value]) => value) .join("."); expect(isValidHostLabel(hostLabelToTest, true)).toBe(output); }); describe("returns false if any subdomain is invalid", () => { const validHostLabel = testCases .filter(([outputEntry]) => outputEntry === true) .map(([, value]) => value) .join("."); it.each(testCases.filter(([outputEntry]) => outputEntry === false).map(([, value]) => value))( "subdomain: %s", (invalidSubDomain: string) => { expect(isValidHostLabel([validHostLabel, invalidSubDomain].join("."), true)).toBe(false); } ); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/isValidHostLabel.ts ================================================ const VALID_HOST_LABEL_REGEX = new RegExp(`^(?!.*-$)(?!-)[a-zA-Z0-9-]{1,63}$`); /** * Evaluates whether one or more string values are valid host labels per RFC 1123. * * If allowSubDomains is true, then the provided value may be zero or more dotted * subdomains which are each validated per RFC 1123. */ export const isValidHostLabel = (value: string, allowSubDomains = false) => { if (!allowSubDomains) { return VALID_HOST_LABEL_REGEX.test(value); } const labels = value.split("."); for (const label of labels) { if (!isValidHostLabel(label)) { return false; } } return true; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/ite.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { ite } from "./ite"; describe(ite.name, () => { it.each([ [true, "-fips", "", "-fips"], [false, "-fips", "", ""], [true, "sigv4", "sigv4-s3express", "sigv4"], [false, "sigv4", "sigv4-s3express", "sigv4-s3express"], ])("ite(%s, %j, %j) returns %j", (condition, trueValue, falseValue, expected) => { expect(ite(condition, trueValue, falseValue)).toBe(expected); }); it("returns undefined trueValue when condition is true", () => { expect(ite(true, undefined, "fallback")).toBeUndefined(); }); it("returns undefined falseValue when condition is false", () => { expect(ite(false, "value", undefined)).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/ite.ts ================================================ /** * An if-then-else function that returns one of two values based on a boolean condition. * * @internal */ export function ite(condition: boolean, trueValue: T | undefined, falseValue: T | undefined): T | undefined { return condition ? trueValue : falseValue; } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/not.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { not } from "./not"; describe(not.name, () => { it.each([ [false, true], [true, false], ])("returns %s of boolean %s", (output, input) => { expect(not(input)).toBe(output); }); it.each([ [true, null], [true, undefined], [true, 0], [true, -0], [true, NaN], [false, 1], [true, ""], [false, "string"], [false, []], [false, {}], ])("returns %s of non boolean %s", (output, input) => { // @ts-expect-error: Argument of type is not assignable expect(not(input)).toBe(output); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/not.ts ================================================ /** * Performs logical negation on the provided boolean value, * returning the negated value. */ export const not = (value: boolean) => !value; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/parseURL.spec.ts ================================================ import { EndpointURLScheme, type Endpoint, type EndpointURL } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { parseURL } from "./parseURL"; describe(parseURL.name, () => { const testCases: [string, EndpointURL][] = [ [ "https://example.com", { scheme: EndpointURLScheme.HTTPS, authority: "example.com", path: "/", normalizedPath: "/", isIp: false }, ], [ "http://example.com:80/foo/bar", { scheme: EndpointURLScheme.HTTP, authority: "example.com:80", path: "/foo/bar", normalizedPath: "/foo/bar/", isIp: false, }, ], [ "https://127.0.0.1", { scheme: EndpointURLScheme.HTTPS, authority: "127.0.0.1", path: "/", normalizedPath: "/", isIp: true }, ], [ "https://127.0.0.1:8443", { scheme: EndpointURLScheme.HTTPS, authority: "127.0.0.1:8443", path: "/", normalizedPath: "/", isIp: true }, ], [ "https://[fe80::1]", { scheme: EndpointURLScheme.HTTPS, authority: "[fe80::1]", path: "/", normalizedPath: "/", isIp: true }, ], [ "https://[fe80::1]:8443", { scheme: EndpointURLScheme.HTTPS, authority: "[fe80::1]:8443", path: "/", normalizedPath: "/", isIp: true }, ], ]; it.each(testCases)("test '%s'", (input: string, output: EndpointURL) => { expect(parseURL(input)).toEqual(output); }); it("returns null for invalid scheme", () => { expect(parseURL("ws://example.com")).toBeNull(); }); it("returns null for URL with search params", () => { expect(parseURL("https://example.com:8443?foo=bar")).toBeNull(); }); it("returns null for invalid URL", () => { expect(parseURL("invalid")).toBeNull(); }); it.each(testCases)("test as URL '%s'", (input: string, output: EndpointURL) => { const url = new URL(input); expect(parseURL(url)).toEqual({ ...output, authority: url.hostname + (url.port ? `:${url.port}` : ""), }); }); it.each(testCases)("test as EndpointV1 '%s'", (input: string, output: EndpointURL) => { const url = new URL(input); const endpointV1: Endpoint = { protocol: url.protocol, hostname: url.hostname, port: url.port ? Number(url.port) : undefined, path: url.pathname, }; expect(parseURL(endpointV1)).toEqual({ ...output, authority: url.hostname + (url.port ? `:${url.port}` : ""), }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/parseURL.ts ================================================ import { EndpointURLScheme, type Endpoint, type EndpointURL } from "@smithy/types"; import { isIpAddress } from "./isIpAddress"; const DEFAULT_PORTS: Record = { [EndpointURLScheme.HTTP]: 80, [EndpointURLScheme.HTTPS]: 443, }; /** * Parses a string, URL, or Endpoint into it’s Endpoint URL components. */ export const parseURL = (value: string | URL | Endpoint): EndpointURL | null => { const whatwgURL = (() => { try { if (value instanceof URL) { return value; } if (typeof value === "object" && "hostname" in value) { const { hostname, port, protocol = "", path = "", query = {} } = value as Endpoint; const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : ""}${path}`); url.search = Object.entries(query) .map(([k, v]) => `${k}=${v}`) .join("&"); return url; } return new URL(value); } catch (error) { return null; } })(); if (!whatwgURL) { console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`); return null; } const urlString = whatwgURL.href; const { host, hostname, pathname, protocol, search } = whatwgURL; if (search) { return null; } const scheme = protocol.slice(0, -1) as EndpointURLScheme; if (!Object.values(EndpointURLScheme).includes(scheme)) { return null; } const isIp = isIpAddress(hostname); const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) || (typeof value === "string" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`)); const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`; return { scheme, authority, path: pathname, normalizedPath: pathname.endsWith("/") ? pathname : `${pathname}/`, isIp, }; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/split.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { split } from "./split"; describe(split.name, () => { it.each<[string, string, number, string[]]>([ ["a--b--c", "--", 0, ["a", "b", "c"]], ["a--b--c", "--", 2, ["a", "b--c"]], ["a--b--c", "--", 1, ["a--b--c"]], ["", "--", 0, [""]], ["--", "--", 0, ["", ""]], ["----", "--", 0, ["", "", ""]], ["--b--", "--", 0, ["", "b", ""]], ["--x-s3--azid--suffix", "--", 0, ["", "x-s3", "azid", "suffix"]], ["--x-s3--azid--suffix", "--", 2, ["", "x-s3--azid--suffix"]], ["abc", "x", 0, ["abc"]], ["mybucket", "--", 1, ["mybucket"]], ])("split(%j, %j, %d) returns %j", (value, delimiter, limit, expected) => { expect(split(value, delimiter, limit)).toEqual(expected); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/split.ts ================================================ /** * The split function divides a string into an array of substrings based on a non-empty delimiter. * The behavior is controlled by the limit parameter: * * limit = 0: Split all occurrences (unlimited). * limit = 1: No split performed (returns original string as single element array). * limit > 1: Split into at most 'limit' parts (performs limit-1 splits). * * @internal */ export function split(value: string, delimiter: string, limit: number): string[] { if (limit === 1) { return [value]; } if (value === "") { return [""]; } const parts = value.split(delimiter); if (limit === 0) { return parts; } return parts.slice(0, limit - 1).concat(parts.slice(1).join(delimiter)); } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/stringEquals.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { stringEquals } from "./stringEquals"; describe(stringEquals.name, () => { it("returns true if values are equal", () => { expect(stringEquals("foo", "foo")).toBe(true); }); it("returns false if values are not equal", () => { expect(stringEquals("foo", "bar")).toBe(false); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/stringEquals.ts ================================================ /** * Evaluates two string values value1 and value2 for equality and returns * true if both values match. */ export const stringEquals = (value1: string, value2: string): boolean => value1 === value2; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/substring.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { substring } from "./substring"; describe(substring.name, () => { describe("returns null", () => { it("when input is falsy", () => { expect(substring("", 0, 1, false)).toBeNull(); expect(substring("", 0, 0, false)).toBeNull(); expect(substring(null as any, 0, 1, false)).toBeNull(); expect(substring(undefined as any, 0, 1, false)).toBeNull(); }); it("when start >= stop", () => { expect(substring("abc", 0, 0, false)).toBeNull(); expect(substring("abc", 1, 0, false)).toBeNull(); }); it("when input.length < stop", () => { expect(substring("ab", 0, 5, false)).toBeNull(); }); it("when input contains non-ASCII characters", () => { expect(substring("abc\u0080", 0, 3, false)).toBeNull(); expect(substring("abcé", 0, 3, false)).toBeNull(); expect(substring("ab日c", 0, 3, false)).toBeNull(); }); }); it("returns substring", () => { expect(substring("abcde", 0, 3, false)).toBe("abc"); }); it("returns substring with reverse=true", () => { expect(substring("abcde", 0, 3, true)).toBe("cde"); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/substring.ts ================================================ /** * Computes the substring of a given string, conditionally indexing from the end of the string. * When the string is long enough to fully include the substring, return the substring. * Otherwise, return None. The start index is inclusive and the stop index is exclusive. * The length of the returned string will always be stop-start. */ export const substring = (input: string, start: number, stop: number, reverse: boolean): string | null => { if (input == null || start >= stop || input.length < stop || /[^\u0000-\u007f]/.test(input)) { return null; } if (!reverse) { return input.substring(start, stop); } return input.substring(input.length - stop, input.length - start); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/uriEncode.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { uriEncode } from "./uriEncode"; describe(uriEncode.name, () => { it.each([ [`;,/?:@&=+$#`, `%3B%2C%2F%3F%3A%40%26%3D%2B%24%23`], // Reserved characters [`!*'()`, `%21%2A%27%28%29`], // Specially escaped characters [` `, `%20`], // Space ])("encodes '%s' as '%s'", (input, output) => { expect(uriEncode(input)).toStrictEqual(output); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/lib/uriEncode.ts ================================================ /** * Performs percent-encoding per RFC3986 section 2.1 */ export const uriEncode = (value: string) => encodeURIComponent(value).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/resolveEndpoint.integ.spec.ts ================================================ import { existsSync, readdirSync } from "node:fs"; import { resolve } from "node:path"; import { describe, expect, test as it } from "vitest"; import { BinaryDecisionDiagram } from "./bdd/BinaryDecisionDiagram"; import { decideEndpoint } from "./decideEndpoint"; import { resolveEndpoint } from "./resolveEndpoint"; import { EndpointError } from "./types"; describe(resolveEndpoint.name, () => { const mocksDir = resolve(__dirname, "__mocks__"); const rulesDir = resolve(mocksDir, "valid-rules"); const testCasesDir = resolve(mocksDir, "test-cases"); const validRules = readdirSync(rulesDir) .filter((fileName) => fileName.endsWith(".json")) .map((fileName) => fileName.replace(".json", "")); describe.each(validRules)("%s", (ruleName) => { const rulesFile = resolve(rulesDir, `${ruleName}.json`); const testCasesFile = resolve(testCasesDir, `${ruleName}.json`); if (existsSync(testCasesFile)) { const ruleSetObject = require(rulesFile); const { testCases } = require(testCasesFile); for (const testCase of testCases) { const { documentation, params } = testCase; (testCase.skip ? it.skip : it)(documentation, () => { const _expect = testCase.expect; const { endpoint, error } = _expect; if (endpoint) { expect(resolveEndpoint(ruleSetObject, { endpointParams: params })).toStrictEqual({ ...endpoint, url: new URL(endpoint.url), }); } if (error) { expect(() => resolveEndpoint(ruleSetObject, { endpointParams: params })).toThrowError( new EndpointError(error) ); } }); } } }); }); describe(decideEndpoint.name, () => { describe("split, ite, and getAttr with negative index", () => { const r = 100_000_000; const conditions = [ ["split", [{ ref: "Splittable" }, ".", 0], "parts"], ["getAttr", [{ ref: "parts" }, "[-2]"], "tld"], ["stringEquals", [{ ref: "tld" }, "com"], "isCom"], ]; const results = [[{ fn: "ite", argv: [{ ref: "isCom" }, "https://api.___.com", "https://api.___.net"] }, {}, {}]]; const nodes = new Int32Array([ 0, 0, 0, // (2, start) - split Splittable by "." with unlimited parts and proceed to node 3. 0, 3, -1, // (3) - getAttr [-2] and assign to tld, proceed to node 4. 1, 4, -1, // (4) - compare tld to "com" as isCom and proceed to terminal 0. 2, r + 0, r + 0, ]); const bdd = BinaryDecisionDiagram.from(nodes, 2, conditions, results); it("should resolve endpoint using split + getAttr[-1] + ite", () => { const endpoint = decideEndpoint(bdd, { endpointParams: { Splittable: "___.com.___" }, }); expect(endpoint).toEqual({ url: new URL("https://api.___.com"), properties: {}, headers: {}, }); }); it("should pick alternate URL when getAttr[-1] yields non-com TLD", () => { const endpoint = decideEndpoint(bdd, { endpointParams: { Splittable: "___.org.___" }, }); expect(endpoint).toEqual({ url: new URL("https://api.___.net"), properties: {}, headers: {}, }); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/resolveEndpoint.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; /* eslint-disable @typescript-eslint/no-unused-vars */ import { resolveEndpoint } from "./resolveEndpoint"; import { EndpointError, type EndpointParams, type ParameterObject, type RuleSetObject } from "./types"; import { evaluateRules } from "./utils"; vi.mock("./utils"); describe(resolveEndpoint.name, () => { const boolParamKey = "boolParamKey"; const stringParamKey = "stringParamKey"; const requiredParamKey = "requiredParamKey"; const paramWithDefaultKey = "paramWithDefaultKey"; const mockEndpointParams: EndpointParams = { [boolParamKey]: true, [stringParamKey]: "stringParamValue", [requiredParamKey]: "requiredParamValue", [paramWithDefaultKey]: "defaultParamValue", }; const mockRules: any[] = []; const mockRuleSetParameters: Record = { [boolParamKey]: { type: "Boolean", }, [stringParamKey]: { type: "String", }, [requiredParamKey]: { type: "String", required: true, }, [paramWithDefaultKey]: { type: "String", default: "paramWithDefaultValue", }, }; const mockRuleSetObject: RuleSetObject = { version: "1.0", serviceId: "serviceId", parameters: mockRuleSetParameters, rules: mockRules, }; const mockResolvedEndpoint = { url: new URL("http://example.com") }; beforeEach(() => { vi.mocked(evaluateRules).mockReturnValue(mockResolvedEndpoint); }); afterEach(() => { vi.resetAllMocks(); }); it("should use the default value if a parameter is not set", () => { const { paramWithDefaultKey: ignored, ...endpointParamsWithoutDefault } = mockEndpointParams; const resolvedEndpoint = resolveEndpoint(mockRuleSetObject, { endpointParams: endpointParamsWithoutDefault }); expect(resolvedEndpoint).toEqual(mockResolvedEndpoint); expect(evaluateRules).toHaveBeenCalledWith(mockRules, { endpointParams: { ...mockEndpointParams, [paramWithDefaultKey]: mockRuleSetParameters[paramWithDefaultKey].default, }, referenceRecord: {}, }); }); it("should throw an error if a required parameter is missing", () => { const { requiredParamKey: ignored, ...endpointParamsWithoutRequired } = mockEndpointParams; expect(() => resolveEndpoint(mockRuleSetObject, { endpointParams: endpointParamsWithoutRequired })).toThrow( new EndpointError(`Missing required parameter: '${requiredParamKey}'`) ); expect(evaluateRules).not.toHaveBeenCalled(); }); it("should not throw an error if a default value is available for required parameter", () => { const { requiredParamKey: ignored, ...endpointParamsWithoutRequired } = mockEndpointParams; const requiredParamDefaultValue = "requiredParamDefaultValue"; const resolvedEndpoint = resolveEndpoint( { ...mockRuleSetObject, parameters: { ...mockRuleSetParameters, [requiredParamKey]: { ...mockRuleSetParameters[requiredParamKey], default: requiredParamDefaultValue, }, }, }, { endpointParams: endpointParamsWithoutRequired } ); expect(resolvedEndpoint).toEqual(mockResolvedEndpoint); expect(evaluateRules).toHaveBeenCalledWith(mockRules, { endpointParams: { ...mockEndpointParams, [requiredParamKey]: requiredParamDefaultValue, }, referenceRecord: {}, }); }); it("should call evaluateRules", () => { const resolvedEndpoint = resolveEndpoint(mockRuleSetObject, { endpointParams: mockEndpointParams }); expect(resolvedEndpoint).toEqual(mockResolvedEndpoint); expect(evaluateRules).toHaveBeenCalledWith(mockRules, { endpointParams: mockEndpointParams, referenceRecord: {}, }); }); it("should debug proper infos", () => { const { paramWithDefaultKey: ignored, ...endpointParamsWithoutDefault } = mockEndpointParams; const mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; const resolvedEndpoint = resolveEndpoint(mockRuleSetObject, { endpointParams: endpointParamsWithoutDefault, logger: mockLogger, }); expect(resolvedEndpoint).toEqual(mockResolvedEndpoint); expect(evaluateRules).toHaveBeenCalledWith(mockRules, { endpointParams: { ...mockEndpointParams, [paramWithDefaultKey]: mockRuleSetParameters[paramWithDefaultKey].default, }, logger: mockLogger, referenceRecord: {}, }); expect(mockLogger.debug).nthCalledWith( 1, "endpoints " + "Initial EndpointParams: " + "{\n" + ' "boolParamKey": true,\n' + ' "stringParamKey": "stringParamValue",\n' + ' "requiredParamKey": "requiredParamValue"\n' + "}" ); expect(mockLogger.debug).nthCalledWith(2, `endpoints Resolved endpoint: {\n "url": "http://example.com/"\n}`); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/resolveEndpoint.ts ================================================ import type { EndpointV2 } from "@smithy/types"; import { debugId, toDebugString } from "./debug"; import { EndpointError, type EndpointResolverOptions, type RuleSetObject } from "./types"; import { evaluateRules } from "./utils"; /** * Resolves an endpoint URL by processing the endpoints ruleset and options. */ export const resolveEndpoint = (ruleSetObject: RuleSetObject, options: EndpointResolverOptions): EndpointV2 => { const { endpointParams, logger } = options; const { parameters, rules } = ruleSetObject; options.logger?.debug?.(`${debugId} Initial EndpointParams: ${toDebugString(endpointParams)}`); for (const paramKey in parameters) { const parameter = parameters[paramKey]; const endpointParam = endpointParams[paramKey]; if (endpointParam == null && parameter.default != null) { endpointParams[paramKey] = parameter.default; continue; } if (parameter.required && endpointParam == null) { throw new EndpointError(`Missing required parameter: '${paramKey}'`); } } const endpoint = evaluateRules(rules, { endpointParams, logger, referenceRecord: {} }); options.logger?.debug?.(`${debugId} Resolved endpoint: ${toDebugString(endpoint)}`); return endpoint; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/EndpointError.ts ================================================ export class EndpointError extends Error { constructor(message: string) { super(message); this.name = "EndpointError"; } } ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/EndpointFunctions.ts ================================================ import type { FunctionReturn } from "./shared"; export type EndpointFunctions = Record FunctionReturn>; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/EndpointRuleObject.ts ================================================ import type { EndpointObject as __EndpointObject, EndpointObjectHeaders as __EndpointObjectHeaders, EndpointObjectProperties as __EndpointObjectProperties, EndpointRuleObject as __EndpointRuleObject, } from "@smithy/types"; export type EndpointObjectProperties = __EndpointObjectProperties; export type EndpointObjectHeaders = __EndpointObjectHeaders; export type EndpointObject = __EndpointObject; export type EndpointRuleObject = __EndpointRuleObject; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/ErrorRuleObject.ts ================================================ import type { ErrorRuleObject as __ErrorRuleObject } from "@smithy/types"; export type ErrorRuleObject = __ErrorRuleObject; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/RuleSetObject.ts ================================================ import type { DeprecatedObject as __DeprecatedObject, ParameterObject as __ParameterObject, RuleSetObject as __RuleSetObject, } from "@smithy/types"; export type DeprecatedObject = __DeprecatedObject; export type ParameterObject = __ParameterObject; export type RuleSetObject = __RuleSetObject; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/TreeRuleObject.ts ================================================ import type { RuleSetRules as __RuleSetRules, TreeRuleObject as __TreeRuleObject } from "@smithy/types"; export type RuleSetRules = __RuleSetRules; export type TreeRuleObject = __TreeRuleObject; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/index.ts ================================================ export * from "./EndpointError"; export * from "./EndpointFunctions"; export * from "./EndpointRuleObject"; export * from "./ErrorRuleObject"; export * from "./RuleSetObject"; export * from "./TreeRuleObject"; export * from "./shared"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/types/shared.ts ================================================ import type { EndpointARN, EndpointPartition, EndpointURL, Logger } from "@smithy/types"; export type ReferenceObject = { ref: string }; export type FunctionObject = { fn: string; argv: FunctionArgv }; export type FunctionArgv = Array; export type FunctionReturn = | string | boolean | number | EndpointARN | EndpointPartition | EndpointURL | { [key: string]: FunctionReturn } | Array | null; export type ConditionObject = FunctionObject & { assign?: string }; export type Expression = string | ReferenceObject | FunctionObject; export type EndpointParams = Record; export type EndpointResolverOptions = { endpointParams: EndpointParams; logger?: Logger; }; export type ReferenceRecord = Record; export type EvaluateOptions = EndpointResolverOptions & { referenceRecord: ReferenceRecord; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/callFunction.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { customEndpointFunctions } from "./customEndpointFunctions"; import { endpointFunctions } from "./endpointFunctions"; import { callFunction, group } from "./evaluateExpression"; describe(callFunction.name, () => { vi.spyOn(group, "evaluateExpression").mockImplementation(vi.fn()); const { evaluateExpression } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockReturn = "mockReturn"; const mockArgReturn = "mockArgReturn"; beforeEach(() => { vi.mocked(evaluateExpression).mockReturnValue(mockArgReturn); }); afterEach(() => { vi.clearAllMocks(); }); it.each([ "booleanEquals", "getAttr", "isSet", "isValidHostLabel", "not", "parseURL", "stringEquals", "subsgtring", "urlEncode", ] as Array)("calls built-in endpoint function %s", (builtIn) => { endpointFunctions[builtIn] = vi.fn().mockReturnValue(mockReturn) as any; const mockArg = "mockArg"; const mockFn = { fn: builtIn, argv: [mockArg] }; const result = callFunction(mockFn, mockOptions); expect(result).toBe(mockReturn); expect(endpointFunctions[builtIn]).toHaveBeenCalledWith(mockArgReturn); }); it.each([ ["boolean", true], ["boolean", false], ["number", 1], ["number", 0], ])("skips evaluateExpression for %s arg: %s", (argType, mockNotExpressionArg) => { const mockFn = { fn: "booleanEquals", argv: [mockNotExpressionArg] }; const result = callFunction(mockFn, mockOptions); expect(result).toBe(mockReturn); expect(evaluateExpression).not.toHaveBeenCalled(); expect(endpointFunctions.booleanEquals).toHaveBeenCalledWith(mockNotExpressionArg); }); it.each(["string", { ref: "ref" }, { fn: "fn", argv: [] }])( "calls evaluateExpression for expression arg: %s", (arg) => { const mockFn = { fn: "booleanEquals", argv: [arg] }; const result = callFunction(mockFn, mockOptions); expect(result).toBe(mockReturn); expect(evaluateExpression).toHaveBeenCalledWith(arg, "arg", mockOptions); expect(endpointFunctions.booleanEquals).toHaveBeenCalledWith(mockArgReturn); } ); it("calls custom endpoint functions", () => { const mockCustomFunction = vi.fn().mockReturnValue(mockReturn); customEndpointFunctions["ns"] = { mockCustomFunction, }; const mockArg = "mockArg"; const mockFn = { fn: `ns.mockCustomFunction`, argv: [mockArg] }; const result = callFunction(mockFn, mockOptions); expect(result).toBe(mockReturn); expect(evaluateExpression).toHaveBeenCalledWith(mockArg, "arg", mockOptions); expect(mockCustomFunction).toHaveBeenCalledWith(mockArgReturn); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/callFunction.ts ================================================ // breaks circular import export { callFunction } from "./evaluateExpression"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/customEndpointFunctions.ts ================================================ import type { EndpointFunctions } from "../types/EndpointFunctions"; export const customEndpointFunctions: { [key: string]: EndpointFunctions } = {}; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/endpointFunctions.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { endpointFunctions } from "./endpointFunctions"; describe("endpointFunctions", () => { it.each([ "booleanEquals", "coalesce", "getAttr", "isSet", "isValidHostLabel", "ite", "not", "parseURL", "split", "stringEquals", "substring", "uriEncode", ])("exports %s as a function", (fnName) => { expect(typeof (endpointFunctions as Record)[fnName]).toBe("function"); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/endpointFunctions.ts ================================================ import { booleanEquals, coalesce, getAttr, isSet, isValidHostLabel, ite, not, parseURL, split, stringEquals, substring, uriEncode, } from "../lib"; import type { EndpointFunctions } from "../types"; export const endpointFunctions: EndpointFunctions = { booleanEquals, coalesce, getAttr, isSet, isValidHostLabel, ite, not, parseURL, split, stringEquals, substring, uriEncode, }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateCondition.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { debugId, toDebugString } from "../debug"; import { EndpointError, type EvaluateOptions } from "../types"; import { callFunction } from "./callFunction"; import { evaluateCondition } from "./evaluateCondition"; vi.mock("./callFunction"); describe(evaluateCondition.name, () => { const mockOptions: EvaluateOptions = { endpointParams: {}, referenceRecord: {}, }; const mockAssign = "mockAssign"; const mockFnArgs = { fn: "fn", argv: ["arg"] }; it("throws error if assign is already defined in Reference Record", () => { const mockOptionsWithAssign = { ...mockOptions, referenceRecord: { [mockAssign]: true, }, }; expect(() => evaluateCondition({ assign: mockAssign, ...mockFnArgs }, mockOptionsWithAssign)).toThrow( new EndpointError(`'${mockAssign}' is already defined in Reference Record.`) ); expect(callFunction).not.toHaveBeenCalled(); }); describe("evaluates function", () => { describe.each([ [true, [true, 1, -1, "true", "false", ""]], [false, [false, 0, -0, null, undefined, NaN]], ])("returns %s for", (result, testCases) => { it.each(testCases)(`value: '%s'`, (mockReturn: any) => { const mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; vi.mocked(callFunction).mockReturnValue(mockReturn); const { result, toAssign } = evaluateCondition(mockFnArgs, { ...mockOptions, logger: mockLogger }); expect(result).toBe(result); expect(toAssign).toBeUndefined(); expect(mockLogger.debug).nthCalledWith( 1, `${debugId} evaluateCondition: ${toDebugString(mockFnArgs)} = ${mockReturn}` ); }); }); }); it("returns assigned value if defined", () => { const mockAssignedValue = "mockAssignedValue"; const mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; vi.mocked(callFunction).mockReturnValue(mockAssignedValue); const { result, toAssign } = evaluateCondition( { assign: mockAssign, ...mockFnArgs }, { ...mockOptions, logger: mockLogger } ); expect(result).toBe(true); expect(toAssign).toEqual({ name: mockAssign, value: mockAssignedValue }); expect(mockLogger.debug).nthCalledWith( 1, `${debugId} evaluateCondition: ${toDebugString(mockFnArgs)} = ${mockAssignedValue}` ); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateCondition.ts ================================================ import { debugId, toDebugString } from "../debug"; import { EndpointError, type ConditionObject, type EvaluateOptions } from "../types"; import { callFunction } from "./callFunction"; export const evaluateCondition = (condition: ConditionObject, options: EvaluateOptions) => { const { assign } = condition; if (assign && assign in options.referenceRecord) { throw new EndpointError(`'${assign}' is already defined in Reference Record.`); } const value = callFunction(condition, options); options.logger?.debug?.(`${debugId} evaluateCondition: ${toDebugString(condition)} = ${toDebugString(value)}`); const result = value === "" ? true : !!value; if (assign != null) { return { result, toAssign: { name: assign, value } }; } return { result }; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateConditions.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { debugId, toDebugString } from "../debug"; import type { ConditionObject, EvaluateOptions } from "../types"; import { evaluateCondition } from "./evaluateCondition"; import { evaluateConditions } from "./evaluateConditions"; vi.mock("./evaluateCondition"); describe(evaluateConditions.name, () => { const mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; const mockOptions: EvaluateOptions = { endpointParams: {}, referenceRecord: {}, logger: mockLogger, }; const mockCn1: ConditionObject = { fn: "fn1", argv: ["arg1"], assign: "assign1" }; const mockCn2: ConditionObject = { fn: "fn2", argv: ["arg2"], assign: "assign2" }; afterEach(() => { vi.clearAllMocks(); }); describe("returns false as soon as one condition is false", () => { it("first condition is false", () => { vi.mocked(evaluateCondition).mockReturnValueOnce({ result: false }); const { result, referenceRecord } = evaluateConditions([mockCn1, mockCn2], mockOptions); expect(result).toBe(false); expect(referenceRecord).toBeUndefined(); expect(evaluateCondition).toHaveBeenCalledWith(mockCn1, mockOptions); }); it("second condition is false", () => { vi.mocked(evaluateCondition).mockReturnValueOnce({ result: true }); vi.mocked(evaluateCondition).mockReturnValueOnce({ result: false }); const { result, referenceRecord } = evaluateConditions([mockCn1, mockCn2], mockOptions); expect(result).toBe(false); expect(referenceRecord).toBeUndefined(); expect(evaluateCondition).toHaveBeenNthCalledWith(1, mockCn1, mockOptions); expect(evaluateCondition).toHaveBeenNthCalledWith(2, mockCn2, mockOptions); }); }); it("returns true if all conditions are true with referenceRecord", () => { const value1 = "value1"; const value2 = "value2"; const capturedReferenceRecords: Record[] = []; vi.mocked(evaluateCondition) .mockImplementationOnce((_condition, options) => { capturedReferenceRecords.push({ ...options.referenceRecord }); return { result: true, toAssign: { name: mockCn1.assign!, value: value1 } }; }) .mockImplementationOnce((_condition, options) => { capturedReferenceRecords.push({ ...options.referenceRecord }); return { result: true, toAssign: { name: mockCn2.assign!, value: value2 } }; }); const { result, referenceRecord } = evaluateConditions([mockCn1, mockCn2], { ...mockOptions }); expect(result).toBe(true); expect(referenceRecord).toEqual({ [mockCn1.assign!]: value1, [mockCn2.assign!]: value2, }); expect(capturedReferenceRecords[0]).toEqual({}); expect(capturedReferenceRecords[1]).toEqual({ [mockCn1.assign!]: value1 }); expect(mockLogger.debug).nthCalledWith(1, `${debugId} assign: ${mockCn1.assign} := ${toDebugString(value1)}`); expect(mockLogger.debug).nthCalledWith(2, `${debugId} assign: ${mockCn2.assign} := ${toDebugString(value2)}`); }); it("returns true without a referenceRecord if no conditions assign values", () => { vi.mocked(evaluateCondition).mockReturnValueOnce({ result: true }).mockReturnValueOnce({ result: true }); const result = evaluateConditions([mockCn1, mockCn2], mockOptions); expect(result).toEqual({ result: true }); expect(evaluateCondition).toHaveBeenNthCalledWith(1, mockCn1, mockOptions); expect(evaluateCondition).toHaveBeenNthCalledWith(2, mockCn2, mockOptions); expect(mockLogger.debug).not.toHaveBeenCalled(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateConditions.ts ================================================ import { debugId, toDebugString } from "../debug"; import type { ConditionObject, EvaluateOptions, FunctionReturn } from "../types"; import { evaluateCondition } from "./evaluateCondition"; export const evaluateConditions = (conditions: ConditionObject[] = [], options: EvaluateOptions) => { const conditionsReferenceRecord: Record = {}; const conditionOptions: EvaluateOptions = { ...options, referenceRecord: { ...options.referenceRecord }, }; let didAssign = false; for (const condition of conditions) { const { result, toAssign } = evaluateCondition(condition, conditionOptions); if (!result) { return { result }; } if (toAssign) { didAssign = true; conditionsReferenceRecord[toAssign.name] = toAssign.value; conditionOptions.referenceRecord[toAssign.name] = toAssign.value; options.logger?.debug?.(`${debugId} assign: ${toAssign.name} := ${toDebugString(toAssign.value)}`); } } if (didAssign) { return { result: true, referenceRecord: conditionsReferenceRecord }; } return { result: true }; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateEndpointRule.spec.ts ================================================ import type { EvaluateOptions } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { debugId, toDebugString } from "../debug"; import type { ConditionObject, EndpointRuleObject } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { evaluateEndpointRule } from "./evaluateEndpointRule"; import { getEndpointHeaders } from "./getEndpointHeaders"; import { getEndpointProperties } from "./getEndpointProperties"; import { getEndpointUrl } from "./getEndpointUrl"; vi.mock("./evaluateConditions"); vi.mock("./getEndpointUrl"); vi.mock("./getEndpointHeaders"); vi.mock("./getEndpointProperties"); describe(evaluateEndpointRule.name, () => { const mockLogger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn(), }; const mockOptions: EvaluateOptions = { endpointParams: {}, referenceRecord: {}, logger: mockLogger, }; const mockConditions: ConditionObject[] = [ { fn: "fn1", argv: ["arg1"] }, { fn: "fn2", argv: ["arg2"] }, ]; const mockEndpoint = { url: "http://example.com" }; const mockEndpointRule: EndpointRuleObject = { type: "endpoint", conditions: mockConditions, endpoint: mockEndpoint, }; it("returns undefined if conditions are false", () => { vi.mocked(evaluateConditions).mockReturnValue({ result: false }); const result = evaluateEndpointRule(mockEndpointRule, mockOptions); expect(result).toBeUndefined(); expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(getEndpointUrl).not.toHaveBeenCalled(); expect(getEndpointHeaders).not.toHaveBeenCalled(); expect(getEndpointProperties).not.toHaveBeenCalled(); }); it("reuses the original options when conditions assign no references", () => { vi.mocked(evaluateConditions).mockReturnValue({ result: true }); vi.mocked(getEndpointUrl).mockReturnValue(new URL(mockEndpoint.url)); evaluateEndpointRule(mockEndpointRule, mockOptions); expect(getEndpointUrl).toHaveBeenCalledWith(mockEndpoint.url, mockOptions); }); describe("returns endpoint if conditions are true", () => { const mockReferenceRecord = { key: "value" }; const mockEndpointUrl = new URL(mockEndpoint.url); const mockUpdatedOptions = { ...mockOptions, referenceRecord: { ...mockOptions.referenceRecord, ...mockReferenceRecord }, }; beforeEach(() => { vi.mocked(evaluateConditions).mockReturnValue({ result: true, referenceRecord: mockReferenceRecord, }); vi.mocked(getEndpointUrl).mockReturnValue(mockEndpointUrl); }); afterEach(() => { expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(getEndpointUrl).toHaveBeenCalledWith(mockEndpoint.url, mockUpdatedOptions); vi.clearAllMocks(); }); it("without headers and properties", () => { const result = evaluateEndpointRule(mockEndpointRule, mockOptions); expect(result).toEqual({ url: mockEndpointUrl, }); expect(getEndpointHeaders).not.toHaveBeenCalled(); expect(getEndpointProperties).not.toHaveBeenCalled(); expect(mockLogger.debug).nthCalledWith( 1, `${debugId} Resolving endpoint from template: ${toDebugString(mockEndpointRule.endpoint)}` ); }); it("with headers and properties", () => { const mockInputHeaders = { headerKey: ["headerInputValue"] }; const mockInputProperties = { propertyKey: "propertyInputValue" }; const mockOutputHeaders = { headerKey: ["headerOutputValue"] }; const mockOutputProperties = { propertyKey: "propertyOutputValue" }; vi.mocked(getEndpointHeaders).mockReturnValue(mockOutputHeaders); vi.mocked(getEndpointProperties).mockReturnValue(mockOutputProperties); const headerEndpoint = { ...mockEndpoint, headers: mockInputHeaders, properties: mockInputProperties, }; const result = evaluateEndpointRule( { ...mockEndpointRule, endpoint: headerEndpoint, }, mockOptions ); expect(result).toEqual({ url: mockEndpointUrl, headers: mockOutputHeaders, properties: mockOutputProperties, }); expect(getEndpointHeaders).toHaveBeenCalledWith(mockInputHeaders, mockUpdatedOptions); expect(getEndpointProperties).toHaveBeenCalledWith(mockInputProperties, mockUpdatedOptions); expect(mockLogger.debug).nthCalledWith( 1, `${debugId} Resolving endpoint from template: ${toDebugString(headerEndpoint)}` ); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateEndpointRule.ts ================================================ import type { EndpointV2 } from "@smithy/types"; import { debugId, toDebugString } from "../debug"; import type { EndpointRuleObject, EvaluateOptions } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { getEndpointHeaders } from "./getEndpointHeaders"; import { getEndpointProperties } from "./getEndpointProperties"; import { getEndpointUrl } from "./getEndpointUrl"; export const evaluateEndpointRule = ( endpointRule: EndpointRuleObject, options: EvaluateOptions ): EndpointV2 | undefined => { const { conditions, endpoint } = endpointRule; const { result, referenceRecord } = evaluateConditions(conditions, options); if (!result) { return; } const endpointRuleOptions = referenceRecord ? { ...options, referenceRecord: { ...options.referenceRecord, ...referenceRecord }, } : options; const { url, properties, headers } = endpoint; options.logger?.debug?.(`${debugId} Resolving endpoint from template: ${toDebugString(endpoint)}`); const endpointToReturn: EndpointV2 = { url: getEndpointUrl(url, endpointRuleOptions) }; if (headers != null) { endpointToReturn.headers = getEndpointHeaders(headers, endpointRuleOptions); } if (properties != null) { endpointToReturn.properties = getEndpointProperties(properties, endpointRuleOptions); } return endpointToReturn; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateErrorRule.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { EndpointError, type ErrorRuleObject } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { evaluateErrorRule } from "./evaluateErrorRule"; import { evaluateExpression } from "./evaluateExpression"; vi.mock("./evaluateConditions"); vi.mock("./evaluateExpression"); describe(evaluateErrorRule.name, () => { const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockConditions = [ { fn: "fn1", argv: ["arg1"] }, { fn: "fn2", argv: ["arg2"] }, ]; const mockError = "mockError"; const mockErrorRule: ErrorRuleObject = { type: "error", conditions: mockConditions, error: mockError, }; it("returns undefined if conditions evaluate to false", () => { vi.mocked(evaluateConditions).mockReturnValue({ result: false }); const result = evaluateErrorRule(mockErrorRule, mockOptions); expect(result).toBeUndefined(); expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(evaluateExpression).not.toHaveBeenCalled(); }); it("reuses the original options if conditions assign no references", () => { const mockErrorMsg = "mockErrorMsg"; vi.mocked(evaluateConditions).mockReturnValue({ result: true }); vi.mocked(evaluateExpression).mockReturnValue(mockErrorMsg); expect(() => evaluateErrorRule(mockErrorRule, mockOptions)).toThrowError(new EndpointError(`mockErrorMsg`)); expect(evaluateExpression).toHaveBeenCalledWith(mockError, "Error", mockOptions); }); it("throws error if conditions evaluate to true", () => { const mockErrorMsg = "mockErrorMsg"; const mockReferenceRecord = { key: "value" }; vi.mocked(evaluateConditions).mockReturnValue({ result: true, referenceRecord: mockReferenceRecord }); vi.mocked(evaluateExpression).mockReturnValue(mockErrorMsg); expect(() => evaluateErrorRule(mockErrorRule, mockOptions)).toThrowError(new EndpointError(`mockErrorMsg`)); expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(evaluateExpression).toHaveBeenCalledWith(mockError, "Error", { ...mockOptions, referenceRecord: { ...mockOptions.referenceRecord, ...mockReferenceRecord }, }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateErrorRule.ts ================================================ import { EndpointError, type ErrorRuleObject, type EvaluateOptions } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { evaluateExpression } from "./evaluateExpression"; export const evaluateErrorRule = (errorRule: ErrorRuleObject, options: EvaluateOptions) => { const { conditions, error } = errorRule; const { result, referenceRecord } = evaluateConditions(conditions, options); if (!result) { return; } const errorRuleOptions = referenceRecord ? { ...options, referenceRecord: { ...options.referenceRecord, ...referenceRecord }, } : options; throw new EndpointError(evaluateExpression(error, "Error", errorRuleOptions) as string); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateExpression.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { EndpointError } from "../types"; import { callFunction, evaluateExpression, group } from "./evaluateExpression"; import { evaluateTemplate } from "./evaluateTemplate"; import { getReferenceValue } from "./getReferenceValue"; vi.mock("./getReferenceValue"); vi.mock("./evaluateTemplate"); describe(evaluateExpression.name, () => { vi.spyOn(group, "callFunction").mockImplementation(vi.fn()); const { callFunction } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockKeyName = "mockKeyName"; const mockResult = "mockResult"; afterEach(() => { vi.clearAllMocks(); }); it("calls evaluateTemplate if input is string", () => { const mockInput = "mockInput"; vi.mocked(evaluateTemplate).mockReturnValue(mockResult); const result = evaluateExpression(mockInput, mockKeyName, mockOptions); expect(result).toBe(mockResult); expect(evaluateTemplate).toHaveBeenCalledWith(mockInput, mockOptions); expect(callFunction).not.toHaveBeenCalled(); expect(getReferenceValue).not.toHaveBeenCalled(); }); it("calls callFunction if input constains 'fn' key", () => { const mockInput = { fn: "fn", argv: ["arg1"] }; vi.mocked(callFunction).mockReturnValue(mockResult); const result = evaluateExpression(mockInput, mockKeyName, mockOptions); expect(result).toBe(mockResult); expect(evaluateTemplate).not.toHaveBeenCalled(); expect(callFunction).toHaveBeenCalledWith(mockInput, mockOptions); expect(getReferenceValue).not.toHaveBeenCalled(); }); it("calls getReferenceValue if input constains 'ref' key", () => { const mockInput = { ref: "ref" }; vi.mocked(getReferenceValue).mockReturnValue(mockResult); const result = evaluateExpression(mockInput, mockKeyName, mockOptions); expect(result).toBe(mockResult); expect(evaluateTemplate).not.toHaveBeenCalled(); expect(callFunction).not.toHaveBeenCalled(); expect(getReferenceValue).toHaveBeenCalledWith(mockInput, mockOptions); }); it("throws error if input is neither string, function or reference", () => { const mockInput = {}; // @ts-ignore: Argument is not assignable expect(() => evaluateExpression(mockInput, mockKeyName, mockOptions)).toThrowError( new EndpointError(`'${mockKeyName}': ${String(mockInput)} is not a string, function or reference.`) ); expect(evaluateTemplate).not.toHaveBeenCalled(); expect(callFunction).not.toHaveBeenCalled(); expect(getReferenceValue).not.toHaveBeenCalled(); }); }); describe(callFunction.name, () => { const mockOptions = { endpointParams: {}, referenceRecord: {}, }; it("throws error for unknown function", () => { expect(() => callFunction({ fn: "unknownFn", argv: [] }, mockOptions)).toThrowError( "function unknownFn not loaded in endpointFunctions." ); }); it("calls a known endpoint function", () => { const result = callFunction({ fn: "booleanEquals", argv: [true, true] }, mockOptions); expect(result).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateExpression.ts ================================================ import { EndpointError, type EvaluateOptions, type Expression, type FunctionObject, type FunctionReturn, type ReferenceObject, } from "../types"; import { customEndpointFunctions } from "./customEndpointFunctions"; import { endpointFunctions } from "./endpointFunctions"; import { evaluateTemplate } from "./evaluateTemplate"; import { getReferenceValue } from "./getReferenceValue"; export const evaluateExpression = (obj: Expression, keyName: string, options: EvaluateOptions) => { if (typeof obj === "string") { return evaluateTemplate(obj, options); } else if ((obj as FunctionObject)["fn"]) { return group.callFunction(obj as FunctionObject, options); } else if ((obj as ReferenceObject)["ref"]) { return getReferenceValue(obj as ReferenceObject, options); } throw new EndpointError(`'${keyName}': ${String(obj)} is not a string, function or reference.`); }; export const callFunction = ({ fn, argv }: FunctionObject, options: EvaluateOptions): FunctionReturn => { const evaluatedArgs = Array(argv.length); // manual mapping - hot code path. for (let i = 0; i < evaluatedArgs.length; ++i) { const arg = argv[i]; if (typeof arg === "boolean" || typeof arg === "number") { evaluatedArgs[i] = arg; } else { evaluatedArgs[i] = group.evaluateExpression(arg, "arg", options); } } const namespaceSeparatorIndex = fn.indexOf("."); if (namespaceSeparatorIndex !== -1) { const namespaceFunctions = customEndpointFunctions[fn.slice(0, namespaceSeparatorIndex)]; const customFunction = namespaceFunctions?.[fn.slice(namespaceSeparatorIndex + 1)]; if (typeof customFunction === "function") { return customFunction(...evaluatedArgs); } } const callable = endpointFunctions[fn as keyof typeof endpointFunctions]; if (typeof callable === "function") { return callable(...evaluatedArgs); } throw new Error(`function ${fn} not loaded in endpointFunctions.`); }; export const group = { evaluateExpression, callFunction, }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateRules.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { EndpointError, type EndpointRuleObject, type ErrorRuleObject, type TreeRuleObject } from "../types"; import { evaluateEndpointRule } from "./evaluateEndpointRule"; import { evaluateErrorRule } from "./evaluateErrorRule"; import { evaluateRules, group } from "./evaluateRules"; vi.mock("./evaluateEndpointRule"); vi.mock("./evaluateErrorRule"); vi.mock("./evaluateTreeRule"); describe(evaluateRules.name, () => { vi.spyOn(group, "evaluateTreeRule").mockImplementation(vi.fn()); const { evaluateTreeRule } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockConditions = [ { fn: "fn1", argv: ["arg1"] }, { fn: "fn2", argv: ["arg2"] }, ]; const mockEndpoint = { url: "http://example.com" }; const mockEndpointRule: EndpointRuleObject = { type: "endpoint", conditions: mockConditions, endpoint: mockEndpoint, }; const mockError = "mockError"; const mockErrorRule: ErrorRuleObject = { type: "error", conditions: mockConditions, error: mockError, }; const mockTreeRule: TreeRuleObject = { type: "tree", conditions: mockConditions, rules: [], }; const mockEndpointResult = { url: new URL(mockEndpoint.url) }; const mockRules = [mockEndpointRule, mockErrorRule, mockTreeRule]; beforeEach(() => { vi.mocked(evaluateEndpointRule).mockReturnValue(undefined); vi.mocked(evaluateErrorRule).mockReturnValue(undefined); vi.mocked(evaluateTreeRule).mockReturnValue(undefined); }); afterEach(() => { vi.resetAllMocks(); }); describe("returns endpoint if defined", () => { it("from EndPoint Rule", () => { vi.mocked(evaluateEndpointRule).mockReturnValue(mockEndpointResult); const result = evaluateRules(mockRules, mockOptions); expect(result).toEqual(mockEndpointResult); expect(evaluateEndpointRule).toHaveBeenCalledWith(mockEndpointRule, mockOptions); expect(evaluateErrorRule).not.toHaveBeenCalled(); expect(evaluateTreeRule).not.toHaveBeenCalled(); }); it("from Tree Rule", () => { vi.mocked(evaluateTreeRule).mockReturnValue(mockEndpointResult); const result = evaluateRules(mockRules, mockOptions); expect(result).toEqual(mockEndpointResult); expect(evaluateEndpointRule).toHaveBeenCalledWith(mockEndpointRule, mockOptions); expect(evaluateErrorRule).toHaveBeenCalledWith(mockErrorRule, mockOptions); expect(evaluateTreeRule).toHaveBeenCalledWith(mockTreeRule, mockOptions); }); }); it("re-throws error from Error Rule, if it occurs before endpoint evaluation", () => { const mockError = new Error("mockError"); vi.mocked(evaluateErrorRule).mockImplementation(() => { throw mockError; }); expect(() => evaluateRules(mockRules, mockOptions)).toThrow(mockError); expect(evaluateEndpointRule).toHaveBeenCalledWith(mockEndpointRule, mockOptions); expect(evaluateErrorRule).toHaveBeenCalledWith(mockErrorRule, mockOptions); expect(evaluateTreeRule).not.toHaveBeenCalled(); }); it("throws error for unknown endpoint rule", () => { const mockUnknownRule = { type: "unknown", conditions: mockConditions, endpoint: mockEndpoint, }; // @ts-ignore: Argument not assignable expect(() => evaluateRules([mockUnknownRule], mockOptions)).toThrow( new EndpointError(`Unknown endpoint rule: ${mockUnknownRule}`) ); expect(evaluateEndpointRule).not.toHaveBeenCalled(); expect(evaluateErrorRule).not.toHaveBeenCalled(); expect(evaluateTreeRule).not.toHaveBeenCalled(); }); it("throws error if rules evaluation fails", () => { expect(() => evaluateRules(mockRules, mockOptions)).toThrow(new EndpointError(`Rules evaluation failed`)); expect(evaluateEndpointRule).toHaveBeenCalledWith(mockEndpointRule, mockOptions); expect(evaluateErrorRule).toHaveBeenCalledWith(mockErrorRule, mockOptions); expect(evaluateTreeRule).toHaveBeenCalledWith(mockTreeRule, mockOptions); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateRules.ts ================================================ import type { EndpointV2 } from "@smithy/types"; import { EndpointError, type EvaluateOptions, type RuleSetRules, type TreeRuleObject } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { evaluateEndpointRule } from "./evaluateEndpointRule"; import { evaluateErrorRule } from "./evaluateErrorRule"; export const evaluateRules = (rules: RuleSetRules, options: EvaluateOptions): EndpointV2 => { for (const rule of rules) { if (rule.type === "endpoint") { const endpointOrUndefined = evaluateEndpointRule(rule, options); if (endpointOrUndefined) { return endpointOrUndefined; } } else if (rule.type === "error") { evaluateErrorRule(rule, options); } else if (rule.type === "tree") { const endpointOrUndefined = group.evaluateTreeRule(rule, options); if (endpointOrUndefined) { return endpointOrUndefined; } } else { throw new EndpointError(`Unknown endpoint rule: ${rule}`); } } throw new EndpointError(`Rules evaluation failed`); }; export const evaluateTreeRule = (treeRule: TreeRuleObject, options: EvaluateOptions): EndpointV2 | undefined => { const { conditions, rules } = treeRule; const { result, referenceRecord } = evaluateConditions(conditions, options); if (!result) { return; } const treeRuleOptions = referenceRecord ? { ...options, referenceRecord: { ...options.referenceRecord, ...referenceRecord } } : options; return group.evaluateRules(rules, treeRuleOptions); }; export const group = { evaluateRules, evaluateTreeRule, }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateTemplate.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { getAttr } from "../lib"; import { evaluateTemplate } from "./evaluateTemplate"; vi.mock("../lib"); describe(evaluateTemplate.name, () => { const mockOptions = { endpointParams: {}, referenceRecord: {}, }; afterEach(() => { vi.clearAllMocks(); }); it("should not escape template without braces", () => { const templateWithoutBraces = "foo bar baz"; expect(evaluateTemplate(templateWithoutBraces, mockOptions)).toEqual(templateWithoutBraces); }); describe("should replace `{parameterName}` with value", () => { const parameterName = "bar"; const template = "foo {parameterName} baz"; afterEach(() => { expect(getAttr).not.toHaveBeenCalled(); }); it.each(["endpointParams", "referenceRecord"])("from %s", (key: string) => { expect(evaluateTemplate(template, { ...mockOptions, [key]: { parameterName } })).toBe(`foo ${parameterName} baz`); }); }); it("should escape values within double braces like {{value}}", () => { const value = "bar"; expect(evaluateTemplate("foo {{value1}} bar {{value2}} baz", { ...mockOptions, endpointParams: { value } })).toBe( "foo {value1} bar {value2} baz" ); expect(getAttr).not.toHaveBeenCalled(); }); it("should call getAttr for short-hand getAttr function", () => { const ref1 = { key1: "value1" }; const ref2 = { key2: "value2" }; vi.mocked(getAttr).mockReturnValueOnce(ref1["key1"]); vi.mocked(getAttr).mockReturnValueOnce(ref2["key2"]); expect( evaluateTemplate("foo {ref1#key1} bar {ref2#key2} baz", { ...mockOptions, referenceRecord: { ref1, ref2 } }) ).toBe(`foo ${ref1["key1"]} bar ${ref2["key2"]} baz`); expect(getAttr).toHaveBeenCalledTimes(2); expect(getAttr).toHaveBeenNthCalledWith(1, ref1, "key1"); expect(getAttr).toHaveBeenNthCalledWith(2, ref2, "key2"); }); describe("should not change template with incomplete braces", () => { it.each([ "incomplete opening bracket '{' in template", "incomplete closing bracket '}' in template", "incomplete opening escape '{{' in template", "incomplete closing escape '}}' in template", ])("%s", (template) => { expect(evaluateTemplate(template, mockOptions)).toEqual(template); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateTemplate.ts ================================================ import { getAttr } from "../lib"; import type { EvaluateOptions } from "../types"; export const evaluateTemplate = (template: string, options: EvaluateOptions) => { const evaluatedTemplateArr: string[] = []; const { referenceRecord, endpointParams } = options; let currentIndex = 0; while (currentIndex < template.length) { const openingBraceIndex = template.indexOf("{", currentIndex); if (openingBraceIndex === -1) { // No more opening braces, add the rest of the template and break. evaluatedTemplateArr.push(template.slice(currentIndex)); break; } evaluatedTemplateArr.push(template.slice(currentIndex, openingBraceIndex)); const closingBraceIndex = template.indexOf("}", openingBraceIndex); if (closingBraceIndex === -1) { // No more closing braces, add the rest of the template and break. evaluatedTemplateArr.push(template.slice(openingBraceIndex)); break; } if (template[openingBraceIndex + 1] === "{" && template[closingBraceIndex + 1] === "}") { // Escaped expression. Do not evaluate. evaluatedTemplateArr.push(template.slice(openingBraceIndex + 1, closingBraceIndex)); currentIndex = closingBraceIndex + 2; } const parameterName = template.substring(openingBraceIndex + 1, closingBraceIndex); if (parameterName.includes("#")) { const [refName, attrName] = parameterName.split("#"); evaluatedTemplateArr.push( getAttr((referenceRecord[refName] ?? endpointParams[refName]) as string, attrName) as string ); } else { evaluatedTemplateArr.push((referenceRecord[parameterName] ?? endpointParams[parameterName]) as string); } currentIndex = closingBraceIndex + 1; } return evaluatedTemplateArr.join(""); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateTreeRule.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import type { TreeRuleObject } from "../types"; import { evaluateConditions } from "./evaluateConditions"; import { group } from "./evaluateRules"; import { evaluateTreeRule } from "./evaluateTreeRule"; vi.mock("./evaluateConditions"); describe(evaluateTreeRule.name, () => { vi.spyOn(group, "evaluateRules").mockImplementation(() => ({}) as any); const { evaluateRules } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockConditions = [ { fn: "fn1", argv: ["arg1"] }, { fn: "fn2", argv: ["arg2"] }, ]; const mockTreeRule: TreeRuleObject = { type: "tree", conditions: mockConditions, rules: [], }; it("returns undefined if conditions evaluate to false", () => { vi.mocked(evaluateConditions).mockReturnValue({ result: false }); const result = evaluateTreeRule(mockTreeRule, mockOptions); expect(result).toBeUndefined(); expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(evaluateRules).not.toHaveBeenCalled(); }); it("returns evaluateRules if conditions evaluate to true", () => { const mockReferenceRecord = { key: "value" }; const mockEndpointUrl = new URL("http://example.com"); vi.mocked(evaluateConditions).mockReturnValue({ result: true, referenceRecord: mockReferenceRecord }); vi.mocked(evaluateRules).mockReturnValue(mockEndpointUrl as any); const result = evaluateTreeRule(mockTreeRule, mockOptions); expect(result).toBe(mockEndpointUrl); expect(evaluateConditions).toHaveBeenCalledWith(mockConditions, mockOptions); expect(evaluateRules).toHaveBeenCalledWith(mockTreeRule.rules, { ...mockOptions, referenceRecord: { ...mockOptions.referenceRecord, ...mockReferenceRecord, }, }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/evaluateTreeRule.ts ================================================ // breaks circular import export { evaluateTreeRule } from "./evaluateRules"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointHeaders.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { evaluateExpression } from "./evaluateExpression"; import { getEndpointHeaders } from "./getEndpointHeaders"; vi.mock("./evaluateExpression"); describe(getEndpointHeaders.name, () => { const mockOptions = { endpointParams: {}, referenceRecord: {}, }; afterEach(() => { vi.clearAllMocks(); }); it("should return an empty object if empty headers are provided", () => { expect(getEndpointHeaders(null as any, mockOptions)).toEqual({}); expect(getEndpointHeaders({}, mockOptions)).toEqual({}); expect(evaluateExpression).not.toHaveBeenCalled(); }); it("should return processed header", () => { const inputHeaderValue = "inputHeaderValue"; const outputHeaderValue = "outputHeaderValue"; const mockHeaders = { key: [inputHeaderValue] }; vi.mocked(evaluateExpression).mockReturnValue(outputHeaderValue); expect(getEndpointHeaders(mockHeaders, mockOptions)).toEqual({ key: [outputHeaderValue] }); expect(evaluateExpression).toHaveBeenCalledWith("inputHeaderValue", "Header value entry", mockOptions); }); it.each([null, undefined, true, 1])( "should throw error if evaluated expression is not string: %s", (notStringValue: any) => { const inputHeaderKey = "inputHeaderKey"; const inputHeaderValue = "inputHeaderValue"; const mockHeaders = { [inputHeaderKey]: [inputHeaderValue] }; vi.mocked(evaluateExpression).mockReturnValue(notStringValue); expect(() => getEndpointHeaders(mockHeaders, mockOptions)).toThrowError( `Header '${inputHeaderKey}' value '${notStringValue}' is not a string` ); expect(evaluateExpression).toHaveBeenCalledWith("inputHeaderValue", "Header value entry", mockOptions); } ); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointHeaders.ts ================================================ import { EndpointError, type EndpointObjectHeaders, type EvaluateOptions } from "../types"; import { evaluateExpression } from "./evaluateExpression"; export const getEndpointHeaders = (headers: EndpointObjectHeaders, options: EvaluateOptions) => Object.entries(headers ?? {}).reduce( (acc, [headerKey, headerVal]) => { acc[headerKey] = headerVal.map((headerValEntry) => { const processedExpr = evaluateExpression(headerValEntry, "Header value entry", options); if (typeof processedExpr !== "string") { throw new EndpointError(`Header '${headerKey}' value '${processedExpr}' is not a string`); } return processedExpr; }); return acc; }, {} as Record ); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointProperties.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { getEndpointProperties, group } from "./getEndpointProperties"; describe(getEndpointProperties.name, () => { vi.spyOn(group, "getEndpointProperty"); const { getEndpointProperty } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; afterEach(() => { vi.clearAllMocks(); }); it("should return an empty object if empty properties are provided", () => { expect(getEndpointProperties({}, mockOptions)).toEqual({}); }); it("return processed endpoint properties", () => { const inputPropertyValue = "inputPropertyValue"; const outputPropertyValue = "outputPropertyValue"; const mockProperties = { key: inputPropertyValue }; vi.mocked(getEndpointProperty).mockReturnValue(outputPropertyValue); expect(getEndpointProperties(mockProperties, mockOptions)).toEqual({ key: outputPropertyValue }); expect(getEndpointProperty).toHaveBeenCalledWith(inputPropertyValue, mockOptions); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointProperties.ts ================================================ import type { EndpointObjectProperty } from "@smithy/types"; import { EndpointError, type EndpointObjectProperties, type EvaluateOptions } from "../types"; import { evaluateTemplate } from "./evaluateTemplate"; export const getEndpointProperties = (properties: EndpointObjectProperties, options: EvaluateOptions) => Object.entries(properties).reduce( (acc, [propertyKey, propertyVal]) => { acc[propertyKey] = group.getEndpointProperty(propertyVal, options); return acc; }, {} as Record ); export const getEndpointProperty = ( property: EndpointObjectProperty, options: EvaluateOptions ): EndpointObjectProperty => { if (Array.isArray(property)) { return property.map((propertyEntry) => getEndpointProperty(propertyEntry, options)); } switch (typeof property) { case "string": return evaluateTemplate(property, options); case "object": if (property === null) { throw new EndpointError(`Unexpected endpoint property: ${property}`); } return group.getEndpointProperties(property, options); case "boolean": return property; default: throw new EndpointError(`Unexpected endpoint property type: ${typeof property}`); } }; export const group = { getEndpointProperty, getEndpointProperties, }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointProperty.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { EndpointError } from "../types"; import { evaluateTemplate } from "./evaluateTemplate"; import { getEndpointProperty, group } from "./getEndpointProperties"; vi.mock("./evaluateTemplate"); describe(getEndpointProperty.name, () => { vi.spyOn(group, "getEndpointProperties").mockImplementation(vi.fn()); const { getEndpointProperties } = group; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockInputString = "mockInputString"; const mockOutputString = "mockOutputString"; const mockInputObject = { key: mockInputString }; const mockOutputObject = { key: mockOutputString }; const mockBoolean = false; beforeEach(() => { vi.mocked(evaluateTemplate).mockReturnValue(mockOutputString); vi.mocked(getEndpointProperties).mockReturnValue(mockOutputObject); }); afterEach(() => { vi.clearAllMocks(); }); describe("processes each property in an array", () => { const arrayLength = 3; it.each([ ["string array", [Array(arrayLength).fill(mockInputString)], [Array(arrayLength).fill(mockOutputString)]], ["object array", [Array(arrayLength).fill(mockInputObject)], [Array(arrayLength).fill(mockOutputObject)]], ["boolean array", [Array(arrayLength).fill(mockBoolean)], [Array(arrayLength).fill(mockBoolean)]], ])("%s", (desc, inputArray, outputArray) => { expect(getEndpointProperty(inputArray, mockOptions)).toEqual(outputArray); }); }); it("returns the evaluated template", () => { expect(getEndpointProperty(mockInputString, mockOptions)).toEqual(mockOutputString); expect(evaluateTemplate).toHaveBeenCalledWith(mockInputString, mockOptions); expect(getEndpointProperties).not.toHaveBeenCalled(); }); it("returns the processed object", () => { expect(getEndpointProperty(mockInputObject, mockOptions)).toEqual(mockOutputObject); expect(evaluateTemplate).not.toHaveBeenCalled(); expect(getEndpointProperties).toHaveBeenCalledWith(mockInputObject, mockOptions); }); it("returns the boolean without processing", () => { expect(getEndpointProperty(mockBoolean, mockOptions)).toEqual(mockBoolean); expect(evaluateTemplate).not.toHaveBeenCalled(); expect(getEndpointProperties).not.toHaveBeenCalled(); }); describe("throws error for unexpected property", () => { it.each([undefined, 0])("%s", (input) => { // @ts-ignore Argument is not assignable expect(() => getEndpointProperty(input, mockOptions)).toThrow( new EndpointError(`Unexpected endpoint property type: ${typeof input}`) ); }); it("null", () => { // @ts-ignore Argument is not assignable expect(() => getEndpointProperty(null, mockOptions)).toThrow( new EndpointError(`Unexpected endpoint property: null`) ); }); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointProperty.ts ================================================ // breaks circular import export { getEndpointProperty } from "./getEndpointProperties"; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointUrl.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { EndpointError } from "../types"; import { evaluateExpression } from "./evaluateExpression"; import { getEndpointUrl } from "./getEndpointUrl"; vi.mock("./evaluateExpression"); describe(getEndpointUrl.name, () => { const mockEndpointUrlInput = "http://input.example.com"; const mockEndpointUrlOutput = "http://output.example.com"; const mockOptions = { endpointParams: {}, referenceRecord: {}, }; it("returns URL is expression evaluates to string", () => { vi.mocked(evaluateExpression).mockReturnValue(mockEndpointUrlOutput); const result = getEndpointUrl(mockEndpointUrlInput, mockOptions); expect(result).toEqual(new URL(mockEndpointUrlOutput)); expect(evaluateExpression).toHaveBeenCalledWith(mockEndpointUrlInput, "Endpoint URL", mockOptions); }); it("throws error if expression evaluates to non-string", () => { const mockNotStringOutput = 42; vi.mocked(evaluateExpression).mockReturnValue(mockNotStringOutput); expect(() => getEndpointUrl(mockEndpointUrlInput, mockOptions)).toThrowError( new EndpointError(`Endpoint URL must be a string, got ${typeof mockNotStringOutput}`) ); expect(evaluateExpression).toHaveBeenCalledWith(mockEndpointUrlInput, "Endpoint URL", mockOptions); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getEndpointUrl.ts ================================================ import { EndpointError, type EvaluateOptions, type Expression } from "../types"; import { evaluateExpression } from "./evaluateExpression"; export const getEndpointUrl = (endpointUrl: Expression, options: EvaluateOptions): URL => { const expression = evaluateExpression(endpointUrl, "Endpoint URL", options); if (typeof expression === "string") { try { return new URL(expression); } catch (error) { console.error(`Failed to construct URL with ${expression}`, error); throw error; } } throw new EndpointError(`Endpoint URL must be a string, got ${typeof expression}`); }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getReferenceValue.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { getReferenceValue } from "./getReferenceValue"; describe(getReferenceValue.name, () => { const mockOptions = { endpointParams: {}, referenceRecord: {}, }; const mockRefName = "mockRefName"; const mockRefValue = "mockRefValue"; afterEach(() => { vi.clearAllMocks(); }); describe("returns reference value if reference exists", () => { it.each(["endpointParams", "referenceRecord"])("in %s", (key) => { const mockInput = { ref: mockRefName }; const mockOptionsWithVal = { ...mockOptions, [key]: { [mockRefName]: mockRefValue } }; const result = getReferenceValue(mockInput, mockOptionsWithVal); expect(result).toBe(mockRefValue); }); }); it("returns undefined if reference does not exist", () => { expect(getReferenceValue({ ref: mockRefName }, mockOptions)).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/getReferenceValue.ts ================================================ import type { EvaluateOptions, ReferenceObject } from "../types"; export const getReferenceValue = ({ ref }: ReferenceObject, options: EvaluateOptions) => { return options.referenceRecord[ref] ?? options.endpointParams[ref]; }; ================================================ FILE: packages/core/src/submodules/endpoints/util-endpoints/utils/index.ts ================================================ export * from "./customEndpointFunctions"; export * from "./evaluateRules"; ================================================ FILE: packages/core/src/submodules/event-streams/EventStreamSerde.spec.ts ================================================ import { CborCodec, cbor, dateToTag } from "@smithy/core/cbor"; import { HttpResponse } from "@smithy/core/protocols"; import { NormalizedSchema } from "@smithy/core/schema"; import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import type { BlobSchema, BooleanSchema, Message as EventMessage, NumericSchema, StaticSimpleSchema, StaticStructureSchema, StringSchema, TimestampEpochSecondsSchema, } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { EventStreamSerde } from "./EventStreamSerde"; import { EventStreamMarshaller } from "./eventstream-serde/EventStreamMarshaller"; describe(EventStreamSerde.name, () => { describe("event stream serde", () => { const cborCodec = new CborCodec(); // this represents elements injected by the HttpProtocol caller. // we use the real event stream marshaller (universal) here to get an accurate integration test. const impl = { serializer: cborCodec.createSerializer(), deserializer: cborCodec.createDeserializer(), getEventStreamMarshaller() { return this.serdeContext.eventStreamMarshaller; }, serdeContext: { eventStreamMarshaller: new EventStreamMarshaller({ utf8Encoder: toUtf8, utf8Decoder: fromUtf8, }), }, getDefaultContentType() { return "application/cbor"; }, }; const eventStreamSerde = new EventStreamSerde({ marshaller: impl.getEventStreamMarshaller(), serializer: impl.serializer, deserializer: impl.deserializer, defaultContentType: impl.getDefaultContentType(), }); const eventStreamUnionSchema = [ 3, "ns", "EventStreamStructure", { streaming: 1 }, ["A", "B", "C", "Payload", "TextPayload", "CustomHeaders", "NoOp"], // D is omitted to represent an unknown event. [ [3, "ns", "A", 0, ["name"], [0]] satisfies StaticStructureSchema, [3, "ns", "B", 0, ["name"], [0]] satisfies StaticStructureSchema, [3, "ns", "C", 0, ["name"], [0]] satisfies StaticStructureSchema, [ 3, "ns", "Payload", 0, ["payload"], [[0, "ns", "BlobPayload", { eventPayload: 1 }, 21 satisfies BlobSchema] satisfies StaticSimpleSchema], ], [ 3, "ns", "TextPayload", 0, ["payload"], [[0, "ns", "TextPayload", { eventPayload: 1 }, 0 satisfies StringSchema] satisfies StaticSimpleSchema], ], [ 3, "ns", "CustomHeaders", 0, ["payload", "header1", "header2", "header-date", "header-number", "header-boolean", "header-blob"], [ [0, "ns", "BlobPayload", { eventPayload: 1 }, 21 satisfies BlobSchema] satisfies StaticSimpleSchema, [0, "ns", "EventHeader", { eventHeader: 1 }, 0 satisfies StringSchema] satisfies StaticSimpleSchema, [0, "ns", "EventHeader", { eventHeader: 1 }, 0 satisfies StringSchema] satisfies StaticSimpleSchema, [ 0, "ns", "EventHeader", { eventHeader: 1 }, 7 satisfies TimestampEpochSecondsSchema, ] satisfies StaticSimpleSchema, [0, "ns", "EventHeader", { eventHeader: 1 }, 1 satisfies NumericSchema] satisfies StaticSimpleSchema, [0, "ns", "EventHeader", { eventHeader: 1 }, 2 satisfies BooleanSchema] satisfies StaticSimpleSchema, [0, "ns", "EventHeader", { eventHeader: 1 }, 21 satisfies BlobSchema] satisfies StaticSimpleSchema, ], ], [3, "ns", "NoOp", 0, [], []] satisfies StaticStructureSchema, ], ] satisfies StaticStructureSchema; const eventStreamContainerSchema = [ 3, "ns", "EventStreamContainer", 0, // here the non-eventstream members form an initial-request // or initial-response when present. ["eventStreamMember", "dateMember", "blobMember"], [eventStreamUnionSchema, 7 satisfies TimestampEpochSecondsSchema, 21 satisfies BlobSchema], ] satisfies StaticStructureSchema; describe("serialization", () => { async function messageDeserializer(event: Record): Promise { return event; } const eventStreamCallerInput = { async *[Symbol.asyncIterator]() { yield { A: { name: "a" } }; yield { B: { name: "b" } }; yield { C: { name: "c" } }; yield { $unknown: ["D", { name: "d" }] }; yield { Payload: { payload: new Uint8Array([0, 1, 2, 3, 4, 5, 6]) } }; yield { TextPayload: { payload: "beep boop" } }; yield { CustomHeaders: { payload: new Uint8Array([0, 1, 2, 3]), header1: "h1", header2: "h2", "header-date": new Date(0), "header-number": -2, "header-boolean": false, "header-blob": new Uint8Array([0, 1, 2, 3]), }, }; }, }; const canonicalEvents = [ { headers: { ":event-type": { type: "string", value: "A" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: { name: "a" }, }, { headers: { ":event-type": { type: "string", value: "B" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: { name: "b" }, }, { headers: { ":event-type": { type: "string", value: "C" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: { name: "c" }, }, { headers: { ":event-type": { type: "string", value: "D" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: { name: "d" }, }, { headers: { ":event-type": { type: "string", value: "Payload" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/octet-stream" }, }, body: new Uint8Array([0, 1, 2, 3, 4, 5, 6]), }, { headers: { ":event-type": { type: "string", value: "TextPayload" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "text/plain" }, }, body: "beep boop", }, { headers: { ":event-type": { type: "string", value: "CustomHeaders" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/octet-stream" }, header1: { type: "string", value: "h1" }, header2: { type: "string", value: "h2" }, "header-boolean": { type: "boolean", value: false, }, "header-date": { type: "timestamp", value: new Date(0), }, "header-number": { type: "integer", value: -2, }, "header-blob": { type: "binary", value: new Uint8Array([0, 1, 2, 3]), }, }, body: new Uint8Array([0, 1, 2, 3]), }, ]; /** * Takes an outgoing request requestBody of event streams, * collects it, and maps to the canonical object form. */ async function collectTranslate(requestBody: any) { const reparsed = impl.getEventStreamMarshaller().deserialize(requestBody, messageDeserializer); const collect = []; for await (const chunk of reparsed) { collect.push(chunk); } return collect.map((item) => { const object = Object.values(item)[0] as any; return { headers: object.headers, body: cbor.deserialize(object.body), }; }); } it("serializes event streams", async () => { const requestBody = await eventStreamSerde.serializeEventStream({ eventStream: eventStreamCallerInput, requestSchema: NormalizedSchema.of(eventStreamContainerSchema), }); expect(await collectTranslate(requestBody)).toEqual(canonicalEvents); }); it("serializes event streams containing an initial-request", async () => { const requestBody = await eventStreamSerde.serializeEventStream({ eventStream: eventStreamCallerInput, requestSchema: NormalizedSchema.of(eventStreamContainerSchema), initialRequest: { dateMember: new Date(0), blobMember: new Uint8Array([0, 1, 2, 3]), }, }); expect(await collectTranslate(requestBody)).toEqual([ { headers: { ":event-type": { type: "string", value: "initial-request" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: { blobMember: new Uint8Array([0, 1, 2, 3]), dateMember: dateToTag(new Date(0)), }, }, ...canonicalEvents, ]); }); }); describe("deserialization", () => { /** * Converts a canonical event to a JS object representation * of an event stream event. */ function messageSerializer(event: any): EventMessage { const eventType = Object.keys(event)[0]; const data = event[eventType]; const headerKeys = Object.keys(data).filter((k) => k.startsWith("header")); const headers = { ":message-type": { type: "string", value: "event" }, ":event-type": { type: "string", value: eventType }, ":content-type": { type: "string", value: "application/cbor" }, } as any; for (const key of headerKeys) { const v = data[key]; if (v instanceof Date) { headers[key] = { type: "timestamp", value: data[key], }; } else if (typeof v === "boolean") { headers[key] = { type: "boolean", value: data[key], }; } else if (typeof v === "string") { headers[key] = { type: "string", value: data[key], }; } else if (typeof v === "number") { headers[key] = { type: "integer", value: v, }; } else if (v instanceof Uint8Array) { headers[key] = { type: "binary", value: v, }; } else { throw new Error("unhandled type"); } delete data[key]; } const payload = data.payload; if (payload) { return { headers, body: typeof payload === "string" ? fromUtf8(payload) : payload, }; } if (eventType === "NoOp") { return { headers, // simulate omitted structure body. // not technically correct for the content-type, but pre-existing // edge case. body: new Uint8Array(), }; } return { headers, body: cbor.serialize(data), }; } const eventStreamMarshaller = impl.getEventStreamMarshaller(); const canonicalEvents = { async *[Symbol.asyncIterator]() { yield { A: { name: "a" } }; yield { B: { name: "b" } }; yield { C: { name: "c" } }; yield { D: { name: "d" } }; yield { Payload: { payload: new Uint8Array([0, 1, 2, 3, 4, 5, 6]) } }; yield { TextPayload: { payload: "boop beep" } }; yield { CustomHeaders: { payload: new Uint8Array([0, 1, 2, 3]), header1: "h1", header2: "h2", "header-date": new Date(0), "header-number": -2, "header-boolean": false, "header-blob": new Uint8Array([0, 1, 2, 3]), }, }; yield { NoOp: {}, }; }, }; const $unknownEvent = { $unknown: { D: { headers: { ":message-type": { type: "string", value: "event" }, ":event-type": { type: "string", value: "D" }, ":content-type": { type: "string", value: "application/cbor" }, }, body: Uint8Array.from(cbor.serialize({ name: "d" })), }, }, }; void $unknownEvent; async function collect(asyncIterable: AsyncIterable): Promise { const collect = []; for await (const event of asyncIterable) { collect.push(event); } return collect; } it("deserializes event streams", async () => { const response = new HttpResponse({ statusCode: 200, body: eventStreamMarshaller.serialize(canonicalEvents, messageSerializer), }); const asyncIterable = await eventStreamSerde.deserializeEventStream({ response, responseSchema: NormalizedSchema.of(eventStreamContainerSchema), }); expect(await collect(asyncIterable)).toEqual([ { A: { name: `a` } }, { B: { name: `b` } }, { C: { name: `c` } }, // todo(schema) getMessageUnmarshaller.ts must be patched to return unknown events. // $unknownEvent, { Payload: { payload: new Uint8Array([0, 1, 2, 3, 4, 5, 6]) } }, { TextPayload: { payload: "boop beep" } }, { CustomHeaders: { payload: new Uint8Array([0, 1, 2, 3]), header1: "h1", header2: "h2", "header-boolean": false, "header-date": new Date(0), "header-number": -2, "header-blob": new Uint8Array([0, 1, 2, 3]), }, }, { NoOp: {}, }, ]); }); it("deserializes event streams containing an initial-response", async () => { const response = new HttpResponse({ statusCode: 200, body: eventStreamMarshaller.serialize( { async *[Symbol.asyncIterator]() { yield { "initial-response": { dateMember: 0, blobMember: "AAECAw==" }, }; for await (const it of canonicalEvents) { yield it; } }, }, messageSerializer ), }); const initialResponseContainer = {} as any; const asyncIterable = await eventStreamSerde.deserializeEventStream({ response, responseSchema: NormalizedSchema.of(eventStreamContainerSchema), initialResponseContainer, }); expect(await collect(asyncIterable)).toEqual([ { A: { name: `a` } }, { B: { name: `b` } }, { C: { name: `c` } }, // todo(schema) getMessageUnmarshaller.ts must be patched to return unknown events. // $unknownEvent, { Payload: { payload: new Uint8Array([0, 1, 2, 3, 4, 5, 6]) } }, { TextPayload: { payload: "boop beep" } }, { CustomHeaders: { payload: new Uint8Array([0, 1, 2, 3]), header1: "h1", header2: "h2", "header-boolean": false, "header-date": new Date(0), "header-number": -2, "header-blob": new Uint8Array([0, 1, 2, 3]), }, }, { NoOp: {}, }, ]); expect(initialResponseContainer).toEqual({ dateMember: new Date(0), blobMember: new Uint8Array([0, 1, 2, 3]), }); }); }); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/EventStreamSerde.ts ================================================ import type { NormalizedSchema } from "@smithy/core/schema"; import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import type { DocumentSchema, EventStreamMarshaller, Message as EventStreamMessage, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, Int64, MessageHeaderValue, MessageHeaders, SerdeFunctions, ShapeDeserializer, ShapeSerializer, StaticStructureSchema, } from "@smithy/types"; /** * Separated module for async mixin of EventStream serde capability. * This is used by the HttpProtocol base class from \@smithy/core/protocols. * * @public */ export class EventStreamSerde { private readonly marshaller: EventStreamMarshaller; private readonly serializer: ShapeSerializer; private readonly deserializer: ShapeDeserializer; private readonly serdeContext?: SerdeFunctions; private readonly defaultContentType: string; /** * Properties are injected by the HttpProtocol. */ public constructor({ marshaller, serializer, deserializer, serdeContext, defaultContentType, }: { marshaller: EventStreamMarshaller; serializer: ShapeSerializer; deserializer: ShapeDeserializer; serdeContext?: SerdeFunctions; defaultContentType: string; }) { this.marshaller = marshaller; this.serializer = serializer; this.deserializer = deserializer; this.serdeContext = serdeContext; this.defaultContentType = defaultContentType; } /** * @param eventStream - the iterable provided by the caller. * @param requestSchema - the schema of the event stream container (struct). * @param [initialRequest] - only provided if the initial-request is part of the event stream (RPC). * * @returns a stream suitable for the HTTP body of a request. */ public async serializeEventStream({ eventStream, requestSchema, initialRequest, }: { eventStream: AsyncIterable; requestSchema: NormalizedSchema; initialRequest?: any; }): Promise { const marshaller = this.marshaller; const eventStreamMember = requestSchema.getEventStreamMember(); const unionSchema = requestSchema.getMemberSchema(eventStreamMember); const serializer = this.serializer; const defaultContentType = this.defaultContentType; const initialRequestMarker = Symbol("initialRequestMarker"); const eventStreamIterable: AsyncIterable = { async *[Symbol.asyncIterator]() { if (initialRequest) { const headers: MessageHeaders = { ":event-type": { type: "string", value: "initial-request" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: defaultContentType }, }; serializer.write(requestSchema, initialRequest); const body = serializer.flush(); yield { [initialRequestMarker]: true, headers, body, }; } for await (const page of eventStream) { yield page; } }, }; return marshaller.serialize(eventStreamIterable, (event: any): EventStreamMessage => { if (event[initialRequestMarker]) { return { headers: event.headers, body: event.body, }; } let unionMember = ""; for (const key in event) { if (key !== "__type") { unionMember = key; break; } } const { additionalHeaders, body, eventType, explicitPayloadContentType } = this.writeEventBody( unionMember, unionSchema, event ); const headers: MessageHeaders = { ":event-type": { type: "string", value: eventType }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: explicitPayloadContentType ?? defaultContentType }, ...additionalHeaders, }; return { headers, body, }; }); } /** * @param response - http response from which to read the event stream. * @param unionSchema - schema of the event stream container (struct). * @param [initialResponseContainer] - provided and written to only if the initial response is part of the event stream (RPC). * * @returns the asyncIterable of the event stream for the end-user. */ public async deserializeEventStream({ response, responseSchema, initialResponseContainer, }: { response: IHttpResponse; responseSchema: NormalizedSchema; initialResponseContainer?: any; }): Promise> { const marshaller = this.marshaller; const eventStreamMember = responseSchema.getEventStreamMember(); const unionSchema = responseSchema.getMemberSchema(eventStreamMember); const memberSchemas = unionSchema.getMemberSchemas(); const initialResponseMarker = Symbol("initialResponseMarker"); const asyncIterable = marshaller.deserialize(response.body, async (event) => { let unionMember = ""; for (const key in event) { if (key !== "__type") { unionMember = key; break; } } const body = event[unionMember].body; if (unionMember === "initial-response") { const dataObject = await this.deserializer.read(responseSchema, body); delete dataObject[eventStreamMember]; return { [initialResponseMarker]: true, ...dataObject, }; } else if (unionMember in memberSchemas) { const eventStreamSchema = memberSchemas[unionMember]; if (eventStreamSchema.isStructSchema()) { // check for event stream bindings const out = {} as any; let hasBindings = false; for (const [name, member] of eventStreamSchema.structIterator()) { const { eventHeader, eventPayload } = member.getMergedTraits(); hasBindings = hasBindings || Boolean(eventHeader || eventPayload); if (eventPayload) { // https://smithy.io/2.0/spec/streaming.html#eventpayload-trait // structure > :test(member > :test(blob, string, structure, union)) if (member.isBlobSchema()) { out[name] = body; } else if (member.isStringSchema()) { out[name] = (this.serdeContext?.utf8Encoder ?? toUtf8)(body); } else if (member.isStructSchema()) { out[name] = await this.deserializer.read(member, body); } } else if (eventHeader) { const value = event[unionMember].headers[name]?.value; if (value != null) { if (member.isNumericSchema()) { if (value && typeof value === "object" && "bytes" in (value as Int64)) { out[name] = BigInt(value.toString()); } else { out[name] = Number(value); } } else { out[name] = value; } } } } if (hasBindings) { return { [unionMember]: out, }; } if (body.byteLength === 0) { // This isn't correct w.r.t. the content-type, // since 0-length data is neither valid JSON nor CBOR, // but handles an existing compatibility issue in server-side implementations. return { [unionMember]: {}, }; } } return { [unionMember]: await this.deserializer.read(eventStreamSchema, body), }; } else { // todo(schema): This union convention is ignored by the event stream marshaller. // todo(schema): This should be returned to the user instead. // see "if (deserialized.$unknown) return;" in getUnmarshalledStream.ts return { $unknown: event, }; } }); const asyncIterator = asyncIterable[Symbol.asyncIterator](); const firstEvent = await asyncIterator.next(); if (firstEvent.done) { return asyncIterable; } if (firstEvent.value?.[initialResponseMarker]) { // if the initial response is part of the event stream, we assume // that the response schema was provided because RpcProtocols are the only ones // that act in this way. if (!responseSchema) { throw new Error( "@smithy::core/protocols - initial-response event encountered in event stream but no response schema given." ); } for (const key in firstEvent.value) { initialResponseContainer[key] = firstEvent.value[key]; } } return { async *[Symbol.asyncIterator]() { if (!firstEvent?.value?.[initialResponseMarker]) { yield firstEvent.value; } while (true) { const { done, value } = await asyncIterator.next(); if (done) { break; } yield value; } }, }; } /** * @param unionMember - member name within the structure that contains an event stream union. * @param unionSchema - schema of the union. * @param event * * @returns the event body (bytes) and event type (string). */ private writeEventBody(unionMember: string, unionSchema: NormalizedSchema, event: any) { const serializer = this.serializer; let eventType = unionMember; let explicitPayloadMember = null as null | string; let explicitPayloadContentType: undefined | string; const isKnownSchema = (() => { const struct = unionSchema.getSchema() as StaticStructureSchema; return struct[4].includes(unionMember); })(); const additionalHeaders: MessageHeaders = {}; if (!isKnownSchema) { // $unknown member const [type, value] = event[unionMember]; eventType = type; serializer.write(15 satisfies DocumentSchema, value); } else { const eventSchema = unionSchema.getMemberSchema(unionMember); if (eventSchema.isStructSchema()) { for (const [memberName, memberSchema] of eventSchema.structIterator()) { const { eventHeader, eventPayload } = memberSchema.getMergedTraits(); if (eventPayload) { explicitPayloadMember = memberName; } else if (eventHeader) { const value = event[unionMember][memberName]; let type = "binary" as MessageHeaderValue["type"]; if (memberSchema.isNumericSchema()) { if ((-2) ** 31 <= value && value <= 2 ** 31 - 1) { type = "integer"; } else { type = "long"; } } else if (memberSchema.isTimestampSchema()) { type = "timestamp"; } else if (memberSchema.isStringSchema()) { type = "string"; } else if (memberSchema.isBooleanSchema()) { type = "boolean"; } if (value != null) { additionalHeaders[memberName] = { type, value, }; delete event[unionMember][memberName]; } } } if (explicitPayloadMember !== null) { const payloadSchema = eventSchema.getMemberSchema(explicitPayloadMember); if (payloadSchema.isBlobSchema()) { explicitPayloadContentType = "application/octet-stream"; } else if (payloadSchema.isStringSchema()) { explicitPayloadContentType = "text/plain"; } serializer.write(payloadSchema, event[unionMember][explicitPayloadMember]); } else { serializer.write(eventSchema, event[unionMember]); } } else if (eventSchema.isUnitSchema()) { serializer.write(eventSchema, {}); } else { throw new Error("@smithy/core/event-streams - non-struct member not supported in event stream union."); } } const messageSerialization: string | Uint8Array = serializer.flush() ?? new Uint8Array(); const body = typeof messageSerialization === "string" ? (this.serdeContext?.utf8Decoder ?? fromUtf8)(messageSerialization) : messageSerialization; return { body, eventType, explicitPayloadContentType, additionalHeaders, }; } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/event-streams`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-hex-encoding@4.2.2 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 - @smithy/util-hex-encoding@4.2.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 - @smithy/util-hex-encoding@4.2.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-hex-encoding@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 - @smithy/util-hex-encoding@4.0.0 ## 3.1.10 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.1.9 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.1.8 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.1.7 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.1.6 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.1.5 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.1.4 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.1.3 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.1.2 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.1.1 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.1.0 ### Minor Changes - 3c23a83b: update versions of @aws-crypto/\* packages ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-hex-encoding@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/util-hex-encoding@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 - @smithy/util-hex-encoding@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-hex-encoding@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-hex-encoding@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-hex-encoding@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-hex-encoding@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-hex-encoding@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/eventstream-codec](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/eventstream-codec/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/EventStreamCodec.spec.ts ================================================ import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import { describe, expect, test as it } from "vitest"; import { EventStreamCodec } from "./EventStreamCodec"; import { vectors } from "./TestVectors.fixture"; describe("eventstream parsing", () => { const eventStreamCodec = new EventStreamCodec(toUtf8, fromUtf8); for (const vectorName of Object.keys(vectors)) { const vector = vectors[vectorName]; it(`should handle the ${vectorName} test case`, () => { if (vector.expectation === "failure") { expect(() => eventStreamCodec.decode(vector.encoded)).toThrow(); } else { expect(eventStreamCodec.encode(vector.decoded)).toEqual(vector.encoded); expect(eventStreamCodec.decode(vector.encoded)).toEqual(vector.decoded); } }); } }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/EventStreamCodec.ts ================================================ import { Crc32 } from "@aws-crypto/crc32"; import type { AvailableMessage, AvailableMessages, Decoder, Encoder, Message, MessageDecoder, MessageEncoder, MessageHeaders, } from "@smithy/types"; import { HeaderMarshaller } from "./HeaderMarshaller"; import { splitMessage } from "./splitMessage"; /** * A Codec that can convert binary-packed event stream messages into * JavaScript objects and back again into their binary format. */ export class EventStreamCodec implements MessageEncoder, MessageDecoder { private readonly headerMarshaller: HeaderMarshaller; private messageBuffer: Message[]; private isEndOfStream: boolean; constructor(toUtf8: Encoder, fromUtf8: Decoder) { this.headerMarshaller = new HeaderMarshaller(toUtf8, fromUtf8); this.messageBuffer = []; this.isEndOfStream = false; } feed(message: ArrayBufferView): void { this.messageBuffer.push(this.decode(message)); } endOfStream(): void { this.isEndOfStream = true; } getMessage(): AvailableMessage { const message = this.messageBuffer.pop(); const isEndOfStream = this.isEndOfStream; return { getMessage(): Message | undefined { return message; }, isEndOfStream(): boolean { return isEndOfStream; }, }; } getAvailableMessages(): AvailableMessages { const messages = this.messageBuffer; this.messageBuffer = []; const isEndOfStream = this.isEndOfStream; return { getMessages(): Message[] { return messages; }, isEndOfStream(): boolean { return isEndOfStream; }, }; } /** * Convert a structured JavaScript object with tagged headers into a binary * event stream message. */ encode({ headers: rawHeaders, body }: Message): Uint8Array { const headers = this.headerMarshaller.format(rawHeaders); const length = headers.byteLength + body.byteLength + 16; const out = new Uint8Array(length); const view = new DataView(out.buffer, out.byteOffset, out.byteLength); const checksum = new Crc32(); // Format message view.setUint32(0, length, false); view.setUint32(4, headers.byteLength, false); view.setUint32(8, checksum.update(out.subarray(0, 8)).digest(), false); out.set(headers, 12); out.set(body, headers.byteLength + 12); // Write trailing message checksum view.setUint32(length - 4, checksum.update(out.subarray(8, length - 4)).digest(), false); return out; } /** * Convert a binary event stream message into a JavaScript object with an * opaque, binary body and tagged, parsed headers. */ decode(message: ArrayBufferView): Message { const { headers, body } = splitMessage(message); return { headers: this.headerMarshaller.parse(headers), body }; } /** * Convert a structured JavaScript object with tagged headers into a binary * event stream message header. */ formatHeaders(rawHeaders: MessageHeaders): Uint8Array { return this.headerMarshaller.format(rawHeaders); } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/HeaderMarshaller.spec.ts ================================================ import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import type { MessageHeaders } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { HeaderMarshaller } from "./HeaderMarshaller"; import { Int64 } from "./Int64"; describe("HeaderMarshaller", () => { const marshaller = new HeaderMarshaller(toUtf8, fromUtf8); const name = Uint8Array.from([0x04, 0xf0, 0x9f, 0xa6, 0x84]); const testCases: Array<[string, Uint8Array, MessageHeaders]> = [ [ "boolean true headers", Uint8Array.from([...name, 0]), { "🦄": { type: "boolean", value: true, }, }, ], [ "boolean false headers", Uint8Array.from([...name, 1]), { "🦄": { type: "boolean", value: false, }, }, ], [ "byte headers", Uint8Array.from([...name, 2, 0x7f]), { "🦄": { type: "byte", value: 127, }, }, ], [ "short headers", Uint8Array.from([...name, 3, 0x7f, 0xff]), { "🦄": { type: "short", value: 32767, }, }, ], [ "integer headers", Uint8Array.from([...name, 4, 0x7f, 0xff, 0xff, 0xff]), { "🦄": { type: "integer", value: 2147483647, }, }, ], [ "long headers", Uint8Array.from([...name, 5, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), { "🦄": { type: "long", value: new Int64(Uint8Array.from([0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])), }, }, ], [ "binary headers", Uint8Array.from([...name, 6, 0x00, 0x08, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe]), { "🦄": { type: "binary", value: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe]), }, }, ], [ "string headers", Uint8Array.from([ ...name, 7, 0x00, 0x2e, 0xd8, 0xaf, 0xd8, 0xb3, 0xd8, 0xaa, 0xe2, 0x80, 0x8c, 0xd9, 0x86, 0xd9, 0x88, 0xd8, 0xb4, 0xd8, 0xaa, 0xd9, 0x87, 0xe2, 0x80, 0x8c, 0xd9, 0x87, 0xd8, 0xa7, 0x20, 0xd9, 0x86, 0xd9, 0x85, 0xdb, 0x8c, 0xe2, 0x80, 0x8c, 0xd8, 0xb3, 0xd9, 0x88, 0xd8, 0xb2, 0xd9, 0x86, 0xd8, 0xaf, ]), { "🦄": { type: "string", value: "دست‌نوشته‌ها نمی‌سوزند", }, }, ], [ "timestamp headers", Uint8Array.from([...name, 8, 0x00, 0x00, 0x01, 0x61, 0x97, 0x16, 0xac, 0xc2]), { "🦄": { type: "timestamp", value: new Date(1518658301122), }, }, ], [ "UUID headers", Uint8Array.from([ ...name, 9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]), { "🦄": { type: "uuid", value: "ffffffff-ffff-ffff-ffff-ffffffffffff", }, }, ], [ "a sequence of headers", Uint8Array.from([ 0x04, 0xf0, 0x9f, 0xa6, 0x84, 0x06, 0x00, 0x04, 0xde, 0xad, 0xbe, 0xef, 0x04, 0xf0, 0x9f, 0x8f, 0x87, 0x00, 0x04, 0xf0, 0x9f, 0x90, 0x8e, 0x07, 0x00, 0x07, 0xe2, 0x98, 0x83, 0xf0, 0x9f, 0x92, 0xa9, 0x04, 0xf0, 0x9f, 0x90, 0xb4, 0x01, ]), { "🦄": { type: "binary", value: Uint8Array.from([0xde, 0xad, 0xbe, 0xef]), }, "🏇": { type: "boolean", value: true, }, "🐎": { type: "string", value: "☃💩", }, "🐴": { type: "boolean", value: false, }, }, ], ]; describe("#format", () => { for (const [description, encoded, decoded] of testCases) { it(`should format ${description}`, () => { expect(marshaller.format(decoded)).toEqual(encoded); }); } it("should throw if it receives an invalid UUID", () => { expect(() => marshaller.format({ uuid: { type: "uuid", value: "foo", }, }) ).toThrowError("Invalid UUID received"); }); }); describe("#parse", () => { for (const [description, encoded, decoded] of testCases) { it(`should parse ${description}`, () => { expect(marshaller.parse(new DataView(encoded.buffer))).toEqual(decoded); }); } it("should throw when unrecognized header types are encountered", () => { const header = Uint8Array.from([...name, 10]); expect(() => marshaller.parse(new DataView(header.buffer))).toThrowError("Unrecognized header type tag"); }); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/HeaderMarshaller.ts ================================================ import { fromHex, toHex } from "@smithy/core/serde"; import type { Decoder, Encoder, MessageHeaderValue, MessageHeaders } from "@smithy/types"; import { Int64 } from "./Int64"; /** * @internal */ export class HeaderMarshaller { constructor( private readonly toUtf8: Encoder, private readonly fromUtf8: Decoder ) {} format(headers: MessageHeaders): Uint8Array { const chunks: Array = []; for (const headerName of Object.keys(headers)) { const bytes = this.fromUtf8(headerName); chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName])); } const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0)); let position = 0; for (const chunk of chunks) { out.set(chunk, position); position += chunk.byteLength; } return out; } private formatHeaderValue(header: MessageHeaderValue): Uint8Array { switch (header.type) { case "boolean": return Uint8Array.from([header.value ? HEADER_VALUE_TYPE.boolTrue : HEADER_VALUE_TYPE.boolFalse]); case "byte": return Uint8Array.from([HEADER_VALUE_TYPE.byte, header.value]); case "short": const shortView = new DataView(new ArrayBuffer(3)); shortView.setUint8(0, HEADER_VALUE_TYPE.short); shortView.setInt16(1, header.value, false); return new Uint8Array(shortView.buffer); case "integer": const intView = new DataView(new ArrayBuffer(5)); intView.setUint8(0, HEADER_VALUE_TYPE.integer); intView.setInt32(1, header.value, false); return new Uint8Array(intView.buffer); case "long": const longBytes = new Uint8Array(9); longBytes[0] = HEADER_VALUE_TYPE.long; longBytes.set(header.value.bytes, 1); return longBytes; case "binary": const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength)); binView.setUint8(0, HEADER_VALUE_TYPE.byteArray); binView.setUint16(1, header.value.byteLength, false); const binBytes = new Uint8Array(binView.buffer); binBytes.set(header.value, 3); return binBytes; case "string": const utf8Bytes = this.fromUtf8(header.value); const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength)); strView.setUint8(0, HEADER_VALUE_TYPE.string); strView.setUint16(1, utf8Bytes.byteLength, false); const strBytes = new Uint8Array(strView.buffer); strBytes.set(utf8Bytes, 3); return strBytes; case "timestamp": const tsBytes = new Uint8Array(9); tsBytes[0] = HEADER_VALUE_TYPE.timestamp; tsBytes.set(Int64.fromNumber(header.value.valueOf()).bytes, 1); return tsBytes; case "uuid": if (!UUID_PATTERN.test(header.value)) { throw new Error(`Invalid UUID received: ${header.value}`); } const uuidBytes = new Uint8Array(17); uuidBytes[0] = HEADER_VALUE_TYPE.uuid; uuidBytes.set(fromHex(header.value.replace(/\-/g, "")), 1); return uuidBytes; } } parse(headers: DataView): MessageHeaders { const out: MessageHeaders = {}; let position = 0; while (position < headers.byteLength) { const nameLength = headers.getUint8(position++); const name = this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, nameLength)); position += nameLength; switch (headers.getUint8(position++)) { case HEADER_VALUE_TYPE.boolTrue: out[name] = { type: BOOLEAN_TAG, value: true, }; break; case HEADER_VALUE_TYPE.boolFalse: out[name] = { type: BOOLEAN_TAG, value: false, }; break; case HEADER_VALUE_TYPE.byte: out[name] = { type: BYTE_TAG, value: headers.getInt8(position++), }; break; case HEADER_VALUE_TYPE.short: out[name] = { type: SHORT_TAG, value: headers.getInt16(position, false), }; position += 2; break; case HEADER_VALUE_TYPE.integer: out[name] = { type: INT_TAG, value: headers.getInt32(position, false), }; position += 4; break; case HEADER_VALUE_TYPE.long: out[name] = { type: LONG_TAG, value: new Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)), }; position += 8; break; case HEADER_VALUE_TYPE.byteArray: const binaryLength = headers.getUint16(position, false); position += 2; out[name] = { type: BINARY_TAG, value: new Uint8Array(headers.buffer, headers.byteOffset + position, binaryLength), }; position += binaryLength; break; case HEADER_VALUE_TYPE.string: const stringLength = headers.getUint16(position, false); position += 2; out[name] = { type: STRING_TAG, value: this.toUtf8(new Uint8Array(headers.buffer, headers.byteOffset + position, stringLength)), }; position += stringLength; break; case HEADER_VALUE_TYPE.timestamp: out[name] = { type: TIMESTAMP_TAG, value: new Date(new Int64(new Uint8Array(headers.buffer, headers.byteOffset + position, 8)).valueOf()), }; position += 8; break; case HEADER_VALUE_TYPE.uuid: const uuidBytes = new Uint8Array(headers.buffer, headers.byteOffset + position, 16); position += 16; out[name] = { type: UUID_TAG, value: `${toHex(uuidBytes.subarray(0, 4))}-${toHex(uuidBytes.subarray(4, 6))}-${toHex( uuidBytes.subarray(6, 8) )}-${toHex(uuidBytes.subarray(8, 10))}-${toHex(uuidBytes.subarray(10))}`, }; break; default: throw new Error(`Unrecognized header type tag`); } } return out; } } const enum HEADER_VALUE_TYPE { boolTrue = 0, boolFalse, byte, short, integer, long, byteArray, string, timestamp, uuid, } const BOOLEAN_TAG = "boolean"; const BYTE_TAG = "byte"; const SHORT_TAG = "short"; const INT_TAG = "integer"; const LONG_TAG = "long"; const BINARY_TAG = "binary"; const STRING_TAG = "string"; const TIMESTAMP_TAG = "timestamp"; const UUID_TAG = "uuid"; const UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/; ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/Int64.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { Int64 } from "./Int64"; describe("Int64", () => { it("should hold integers greater than Number.MAX_SAFE_INTEGER without losing precision", () => { const bytes = Uint8Array.from([0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]); expect(new Int64(bytes).bytes).toEqual(bytes); }); it("should allow the use of Int64s in arithmetic expressions", () => { const bytes = Uint8Array.from([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10]); expect((new Int64(bytes) as any) + 4).toBe(20); }); it("should allow the use of negative Int64s in arithmetic expressions", () => { const bytes = Uint8Array.from([0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]); expect((new Int64(bytes) as any) + 2 ** 52).toBe(0); }); it("should stringify negative Int64s in base 10", () => { const bytes = Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2]); expect(String(new Int64(bytes))).toBe("-30"); }); it("should throw when given a buffer of the wrong byte length", () => { expect(() => new Int64(new Uint8Array(0))).toThrow(); }); it("should convert numbers into Int64 values", () => { expect(Int64.fromNumber(2147483647).bytes).toEqual( Uint8Array.from([0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff]) ); }); it("should convert negative numbers into Int64 values", () => { expect(Int64.fromNumber(-2147483647).bytes).toEqual( Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x01]) ); }); it("should throw when a number larger than 2^63 -1 is provided", () => { // eslint-disable-next-line @typescript-eslint/no-loss-of-precision expect(() => Int64.fromNumber(9_323_372_036_854_775_807)).toThrow(); }); it("should throw when a number smaller than -1 * 2^63 is provided", () => { // eslint-disable-next-line @typescript-eslint/no-loss-of-precision expect(() => Int64.fromNumber(-9_323_372_036_854_775_807)).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/Int64.ts ================================================ /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */ import { toHex } from "@smithy/core/serde"; import type { Int64 as IInt64 } from "@smithy/types"; export interface Int64 extends IInt64 {} /** * A lossless representation of a signed, 64-bit integer. Instances of this * class may be used in arithmetic expressions as if they were numeric * primitives, but the binary representation will be preserved unchanged as the * `bytes` property of the object. The bytes should be encoded as big-endian, * two's complement integers. */ export class Int64 { constructor(readonly bytes: Uint8Array) { if (bytes.byteLength !== 8) { throw new Error("Int64 buffers must be exactly 8 bytes"); } } static fromNumber(number: number): Int64 { // eslint-disable-next-line @typescript-eslint/no-loss-of-precision if (number > 9_223_372_036_854_775_807 || number < -9_223_372_036_854_775_808) { throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`); } const bytes = new Uint8Array(8); for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) { bytes[i] = remaining; } if (number < 0) { negate(bytes); } return new Int64(bytes); } /** * Called implicitly by infix arithmetic operators. */ valueOf(): number { const bytes = this.bytes.slice(0); const negative = bytes[0] & 0b10000000; if (negative) { negate(bytes); } return parseInt(toHex(bytes), 16) * (negative ? -1 : 1); } toString() { return String(this.valueOf()); } } function negate(bytes: Uint8Array): void { for (let i = 0; i < 8; i++) { bytes[i] ^= 0xff; } for (let i = 7; i > -1; i--) { bytes[i]++; if (bytes[i] !== 0) break; } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/Message.ts ================================================ import type { Int64 } from "./Int64"; /** * An event stream message. The headers and body properties will always be * defined, with empty headers represented as an object with no keys and an * empty body represented as a zero-length Uint8Array. */ export interface Message { headers: MessageHeaders; body: Uint8Array; } export type MessageHeaders = Record; type HeaderValue = { type: K; value: V }; export type BooleanHeaderValue = HeaderValue<"boolean", boolean>; export type ByteHeaderValue = HeaderValue<"byte", number>; export type ShortHeaderValue = HeaderValue<"short", number>; export type IntegerHeaderValue = HeaderValue<"integer", number>; export type LongHeaderValue = HeaderValue<"long", Int64>; export type BinaryHeaderValue = HeaderValue<"binary", Uint8Array>; export type StringHeaderValue = HeaderValue<"string", string>; export type TimestampHeaderValue = HeaderValue<"timestamp", Date>; export type UuidHeaderValue = HeaderValue<"uuid", string>; export type MessageHeaderValue = | BooleanHeaderValue | ByteHeaderValue | ShortHeaderValue | IntegerHeaderValue | LongHeaderValue | BinaryHeaderValue | StringHeaderValue | TimestampHeaderValue | UuidHeaderValue; ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/MessageDecoderStream.spec.ts ================================================ import type { Message } from "@smithy/types"; import { describe, expect, test as it, vi } from "vitest"; import { MessageDecoderStream } from "./MessageDecoderStream"; describe("MessageDecoderStream", () => { it("returns decoded messages", async () => { const message1 = { headers: {}, body: new Uint8Array(1), }; const message2 = { headers: {}, body: new Uint8Array(2), }; const messageDecoderMock = { decode: vi.fn().mockReturnValueOnce(message1).mockReturnValueOnce(message2), feed: vi.fn(), endOfStream: vi.fn(), getMessage: vi.fn(), getAvailableMessages: vi.fn(), }; const inputStream = async function* () { yield new Uint8Array(0); yield new Uint8Array(1); }; const messageDecoderStream = new MessageDecoderStream({ decoder: messageDecoderMock, inputStream: inputStream(), }); const messages: Array = []; for await (const message of messageDecoderStream) { messages.push(message); } expect(messages.length).toEqual(2); expect(messages[0]).toEqual(message1); expect(messages[1]).toEqual(message2); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/MessageDecoderStream.ts ================================================ import type { Message, MessageDecoder } from "@smithy/types"; /** * @internal */ export interface MessageDecoderStreamOptions { inputStream: AsyncIterable; decoder: MessageDecoder; } /** * @internal */ export class MessageDecoderStream implements AsyncIterable { constructor(private readonly options: MessageDecoderStreamOptions) {} [Symbol.asyncIterator](): AsyncIterator { return this.asyncIterator(); } private async *asyncIterator() { for await (const bytes of this.options.inputStream) { const decoded = this.options.decoder.decode(bytes); yield decoded; } } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/MessageEncoderStream.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { MessageEncoderStream } from "./MessageEncoderStream"; describe("MessageEncoderStream", () => { it("returns encoded stream with end frame", async () => { const message1 = { headers: {}, body: new Uint8Array(1), }; const message2 = { headers: {}, body: new Uint8Array(2), }; const messageEncoderMock = { encode: vi.fn().mockReturnValueOnce(new Uint8Array(1)).mockReturnValueOnce(new Uint8Array(2)), }; const inputStream = async function* () { yield message1; yield message2; }; const messageEncoderStream = new MessageEncoderStream({ encoder: messageEncoderMock, messageStream: inputStream(), includeEndFrame: true, }); const messages: Array = []; for await (const encoded of messageEncoderStream) { messages.push(encoded); } expect(messages.length).toEqual(3); expect(messages[0]).toEqual(new Uint8Array(1)); expect(messages[1]).toEqual(new Uint8Array(2)); expect(messages[2]).toEqual(new Uint8Array(0)); }); it("returns encoded stream without end frame", async () => { const message1 = { headers: {}, body: new Uint8Array(1), }; const message2 = { headers: {}, body: new Uint8Array(2), }; const messageEncoderMock = { encode: vi.fn().mockReturnValueOnce(new Uint8Array(1)).mockReturnValueOnce(new Uint8Array(2)), }; const inputStream = async function* () { yield message1; yield message2; }; const messageEncoderStream = new MessageEncoderStream({ encoder: messageEncoderMock, messageStream: inputStream(), }); const messages: Array = []; for await (const encoded of messageEncoderStream) { messages.push(encoded); } expect(messages.length).toEqual(2); expect(messages[0]).toEqual(new Uint8Array(1)); expect(messages[1]).toEqual(new Uint8Array(2)); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/MessageEncoderStream.ts ================================================ import type { Message, MessageEncoder } from "@smithy/types"; /** * @internal */ export interface MessageEncoderStreamOptions { messageStream: AsyncIterable; encoder: MessageEncoder; includeEndFrame?: boolean; } /** * @internal */ export class MessageEncoderStream implements AsyncIterable { constructor(private readonly options: MessageEncoderStreamOptions) {} [Symbol.asyncIterator](): AsyncIterator { return this.asyncIterator(); } private async *asyncIterator() { for await (const msg of this.options.messageStream) { const encoded = this.options.encoder.encode(msg); yield encoded; } if (this.options.includeEndFrame) { yield new Uint8Array(0); } } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/SmithyMessageDecoderStream.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { SmithyMessageDecoderStream } from "./SmithyMessageDecoderStream"; describe("SmithyMessageDecoderStream", () => { it("returns decoded stream", async () => { const message1 = { headers: {}, body: new Uint8Array(1), }; const message2 = { headers: {}, body: new Uint8Array(2), }; const deserializer = vi .fn() .mockReturnValueOnce(Promise.resolve("first")) .mockReturnValueOnce(Promise.resolve("second")); const inputStream = async function* () { yield message1; yield message2; }; const stream = new SmithyMessageDecoderStream({ messageStream: inputStream(), deserializer: deserializer, }); const messages: Array = []; for await (const str of stream) { messages.push(str); } expect(messages.length).toEqual(2); expect(messages[0]).toEqual("first"); expect(messages[1]).toEqual("second"); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/SmithyMessageDecoderStream.ts ================================================ import type { Message } from "@smithy/types"; /** * @internal */ export interface SmithyMessageDecoderStreamOptions { readonly messageStream: AsyncIterable; readonly deserializer: (input: Message) => Promise; } /** * @internal */ export class SmithyMessageDecoderStream implements AsyncIterable { constructor(private readonly options: SmithyMessageDecoderStreamOptions) {} [Symbol.asyncIterator](): AsyncIterator { return this.asyncIterator(); } private async *asyncIterator() { for await (const message of this.options.messageStream) { const deserialized = await this.options.deserializer(message); if (deserialized === undefined) continue; yield deserialized; } } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/SmithyMessageEncoderStream.spec.ts ================================================ import type { Message } from "@smithy/types"; import { describe, expect, test as it, vi } from "vitest"; import { SmithyMessageEncoderStream } from "./SmithyMessageEncoderStream"; describe("SmithyMessageEncoderStream", () => { it("returns encoded stream", async () => { const message1 = { headers: {}, body: new Uint8Array(1), }; const message2 = { headers: {}, body: new Uint8Array(2), }; const serializer = vi.fn().mockReturnValueOnce(message1).mockReturnValueOnce(message2); const inputStream = async function* () { yield "first"; yield "second"; }; const stream = new SmithyMessageEncoderStream({ inputStream: inputStream(), serializer: serializer, }); const messages: Array = []; for await (const str of stream) { messages.push(str); } expect(messages.length).toEqual(2); expect(messages[0]).toEqual(message1); expect(messages[1]).toEqual(message2); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/SmithyMessageEncoderStream.ts ================================================ import type { Message } from "@smithy/types"; /** * @internal */ export interface SmithyMessageEncoderStreamOptions { inputStream: AsyncIterable; serializer: (event: T) => Message; } /** * @internal */ export class SmithyMessageEncoderStream implements AsyncIterable { constructor(private readonly options: SmithyMessageEncoderStreamOptions) {} [Symbol.asyncIterator](): AsyncIterator { return this.asyncIterator(); } private async *asyncIterator() { for await (const chunk of this.options.inputStream) { const payloadBuf = this.options.serializer(chunk); yield payloadBuf; } } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/TestVectors.fixture.ts ================================================ import { Int64 } from "./Int64"; import type { TestVectors } from "./vectorTypes.fixture"; export const vectors: TestVectors = { all_headers: { expectation: "success", encoded: Uint8Array.from([ 0, 0, 0, 204, 0, 0, 0, 175, 15, 174, 100, 202, 10, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101, 4, 0, 0, 160, 12, 12, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 10, 98, 111, 111, 108, 32, 102, 97, 108, 115, 101, 1, 9, 98, 111, 111, 108, 32, 116, 114, 117, 101, 0, 4, 98, 121, 116, 101, 2, 207, 8, 98, 121, 116, 101, 32, 98, 117, 102, 6, 0, 20, 73, 39, 109, 32, 97, 32, 108, 105, 116, 116, 108, 101, 32, 116, 101, 97, 112, 111, 116, 33, 9, 116, 105, 109, 101, 115, 116, 97, 109, 112, 8, 0, 0, 0, 0, 0, 132, 95, 237, 5, 105, 110, 116, 49, 54, 3, 0, 42, 5, 105, 110, 116, 54, 52, 5, 0, 0, 0, 0, 2, 135, 87, 178, 4, 117, 117, 105, 100, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 171, 165, 241, 12, ]), decoded: { headers: { "event-type": { type: "integer", value: 40972, }, "content-type": { type: "string", value: "application/json", }, "bool false": { type: "boolean", value: false, }, "bool true": { type: "boolean", value: true, }, byte: { type: "byte", value: -49, }, "byte buf": { type: "binary", value: Uint8Array.from([ 73, 39, 109, 32, 97, 32, 108, 105, 116, 116, 108, 101, 32, 116, 101, 97, 112, 111, 116, 33, ]), }, timestamp: { type: "timestamp", value: new Date(8675309), }, int16: { type: "short", value: 42, }, int64: { type: "long", value: Int64.fromNumber(42424242), }, uuid: { type: "uuid", value: "01020304-0506-0708-090a-0b0c0d0e0f10", }, }, body: Uint8Array.from([123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125]), }, }, empty_message: { expectation: "success", encoded: Uint8Array.from([0, 0, 0, 16, 0, 0, 0, 0, 5, 194, 72, 235, 125, 152, 200, 255]), decoded: { headers: {}, body: Uint8Array.from([]), }, }, int32_header: { expectation: "success", encoded: Uint8Array.from([ 0, 0, 0, 45, 0, 0, 0, 16, 65, 196, 36, 184, 10, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101, 4, 0, 0, 160, 12, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 54, 244, 128, 160, ]), decoded: { headers: { "event-type": { type: "integer", value: 40972, }, }, body: Uint8Array.from([123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125]), }, }, payload_no_headers: { expectation: "success", encoded: Uint8Array.from([ 0, 0, 0, 29, 0, 0, 0, 0, 253, 82, 140, 90, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 195, 101, 57, 54, ]), decoded: { headers: {}, body: Uint8Array.from([123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125]), }, }, payload_one_str_header: { expectation: "success", encoded: Uint8Array.from([ 0, 0, 0, 61, 0, 0, 0, 32, 7, 253, 131, 150, 12, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 141, 156, 8, 177, ]), decoded: { headers: { "content-type": { type: "string", value: "application/json", }, }, body: Uint8Array.from([123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125]), }, }, corrupted_headers: { expectation: "failure", encoded: Uint8Array.from([ 0, 0, 0, 61, 0, 0, 0, 32, 7, 253, 131, 150, 12, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 123, 97, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 141, 156, 8, 177, ]), }, corrupted_header_len: { expectation: "failure", encoded: Uint8Array.from([ 0, 0, 0, 61, 0, 0, 0, 33, 7, 253, 131, 150, 12, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 141, 156, 8, 177, ]), }, corrupted_length: { expectation: "failure", encoded: Uint8Array.from([ 0, 0, 0, 62, 0, 0, 0, 32, 7, 253, 131, 150, 12, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 106, 115, 111, 110, 123, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 141, 156, 8, 177, ]), }, corrupted_payload: { expectation: "failure", encoded: Uint8Array.from([ 0, 0, 0, 29, 0, 0, 0, 0, 253, 82, 140, 90, 91, 39, 102, 111, 111, 39, 58, 39, 98, 97, 114, 39, 125, 195, 101, 57, 54, ]), }, }; ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/splitMessage.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { splitMessage } from "./splitMessage"; describe("splitMessage", () => { it("should throw when given a message under 16 bytes", () => { for (let i = 0; i < 16; i++) { const emptyMessage = new Uint8Array(i); expect(() => splitMessage(emptyMessage)).toThrowError("too short"); } }); it("should throw if the specified length does not match the length of the received message", () => { const message = new DataView(new ArrayBuffer(17)); message.setUint32(0, 16, false); expect(() => splitMessage(message)).toThrowError("length does not match"); }); it("should throw if the prelude checksum does not match the calculated prelude checksum", () => { const message = new DataView(new ArrayBuffer(16)); message.setUint32(0, 16, false); message.setUint32(8, 0x05c248ec, false); expect(() => splitMessage(message)).toThrowError("prelude checksum"); }); it("should throw if the message checksum does not match the calculated message checksum", () => { const message = new DataView(new ArrayBuffer(16)); message.setUint32(0, 16, false); message.setUint32(8, 0x05c248eb, false); message.setUint32(12, 0x7d98c8fe, false); expect(() => splitMessage(message)).toThrowError("message checksum"); }); it("should return header and body buffers for messages with well-formed metadata", () => { const message = new DataView(new ArrayBuffer(16)); message.setUint32(0, 16, false); message.setUint32(8, 0x05c248eb, false); message.setUint32(12, 0x7d98c8ff, false); expect(splitMessage(message)).toEqual({ headers: new DataView(new ArrayBuffer(0)), body: new Uint8Array(0), }); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/splitMessage.ts ================================================ import { Crc32 } from "@aws-crypto/crc32"; // All prelude components are unsigned, 32-bit integers const PRELUDE_MEMBER_LENGTH = 4; // The prelude consists of two components const PRELUDE_LENGTH = PRELUDE_MEMBER_LENGTH * 2; // Checksums are always CRC32 hashes. const CHECKSUM_LENGTH = 4; // Messages must include a full prelude, a prelude checksum, and a message checksum const MINIMUM_MESSAGE_LENGTH = PRELUDE_LENGTH + CHECKSUM_LENGTH * 2; /** * @internal */ export interface MessageParts { headers: DataView; body: Uint8Array; } /** * @internal */ export function splitMessage({ byteLength, byteOffset, buffer }: ArrayBufferView): MessageParts { if (byteLength < MINIMUM_MESSAGE_LENGTH) { throw new Error("Provided message too short to accommodate event stream message overhead"); } const view = new DataView(buffer, byteOffset, byteLength); const messageLength = view.getUint32(0, false); if (byteLength !== messageLength) { throw new Error("Reported message length does not match received message length"); } const headerLength = view.getUint32(PRELUDE_MEMBER_LENGTH, false); const expectedPreludeChecksum = view.getUint32(PRELUDE_LENGTH, false); const expectedMessageChecksum = view.getUint32(byteLength - CHECKSUM_LENGTH, false); const checksummer = new Crc32().update(new Uint8Array(buffer, byteOffset, PRELUDE_LENGTH)); if (expectedPreludeChecksum !== checksummer.digest()) { throw new Error( `The prelude checksum specified in the message (${expectedPreludeChecksum}) does not match the calculated CRC32 checksum (${checksummer.digest()})` ); } checksummer.update( new Uint8Array(buffer, byteOffset + PRELUDE_LENGTH, byteLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH)) ); if (expectedMessageChecksum !== checksummer.digest()) { throw new Error( `The message checksum (${checksummer.digest()}) did not match the expected value of ${expectedMessageChecksum}` ); } return { headers: new DataView(buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH, headerLength), body: new Uint8Array( buffer, byteOffset + PRELUDE_LENGTH + CHECKSUM_LENGTH + headerLength, messageLength - headerLength - (PRELUDE_LENGTH + CHECKSUM_LENGTH + CHECKSUM_LENGTH) ), }; } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-codec/vectorTypes.fixture.ts ================================================ import type { Message } from "./Message"; export interface NegativeTestVector { expectation: "failure"; encoded: Uint8Array; } export interface PositiveTestVector { expectation: "success"; encoded: Uint8Array; decoded: Message; } export type TestVector = NegativeTestVector | PositiveTestVector; export type TestVectors = Record; ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde/CHANGELOG.eventstream-serde-browser.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/event-streams`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/eventstream-serde-universal@4.2.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/eventstream-serde-universal@4.2.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/eventstream-serde-universal@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/eventstream-serde-universal@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/eventstream-serde-universal@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/eventstream-serde-universal@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/eventstream-serde-universal@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/eventstream-serde-universal@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/eventstream-serde-universal@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/eventstream-serde-universal@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/eventstream-serde-universal@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/eventstream-serde-universal@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/eventstream-serde-universal@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/eventstream-serde-universal@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/eventstream-serde-universal@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/eventstream-serde-universal@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/eventstream-serde-universal@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/eventstream-serde-universal@4.0.5 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/eventstream-serde-universal@4.0.4 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/eventstream-serde-universal@4.0.3 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/eventstream-serde-universal@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/eventstream-serde-universal@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/eventstream-serde-universal@4.0.0 - @smithy/types@4.0.0 ## 3.0.14 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/eventstream-serde-universal@3.0.13 ## 3.0.13 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/eventstream-serde-universal@3.0.12 ## 3.0.12 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/eventstream-serde-universal@3.0.11 ## 3.0.11 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/eventstream-serde-universal@3.0.10 ## 3.0.10 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/eventstream-serde-universal@3.0.9 ## 3.0.9 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/eventstream-serde-universal@3.0.8 ## 3.0.8 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/eventstream-serde-universal@3.0.7 ## 3.0.7 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/eventstream-serde-universal@3.0.6 ## 3.0.6 ### Patch Changes - Updated dependencies [b352cc1] - @smithy/eventstream-serde-universal@3.0.5 ## 3.0.5 ### Patch Changes - 1cfe243: avoid compilation of global ReadableStream with type parameter ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/eventstream-serde-universal@3.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/eventstream-serde-universal@3.0.3 ## 3.0.2 ### Patch Changes - @smithy/eventstream-serde-universal@3.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/eventstream-serde-universal@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/eventstream-serde-universal@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/eventstream-serde-universal@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/eventstream-serde-universal@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/eventstream-serde-universal@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/eventstream-serde-universal@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/eventstream-serde-universal@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/eventstream-serde-universal@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/eventstream-serde-universal@2.0.16 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/eventstream-serde-universal@2.0.15 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/eventstream-serde-universal@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/eventstream-serde-universal@2.0.13 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/eventstream-serde-universal@2.0.12 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/eventstream-serde-universal@2.0.11 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/eventstream-serde-universal@2.0.10 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/eventstream-serde-universal@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/eventstream-serde-universal@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/eventstream-serde-universal@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/eventstream-serde-universal@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/eventstream-serde-universal@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/eventstream-serde-universal@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/eventstream-serde-universal@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/eventstream-serde-universal@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/eventstream-serde-universal@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/eventstream-serde-universal@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/eventstream-serde-universal@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/eventstream-serde-universal@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/eventstream-serde-universal@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/eventstream-serde-universal@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/eventstream-serde-browser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/eventstream-serde-browser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde/CHANGELOG.eventstream-serde-node.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/event-streams`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/eventstream-serde-universal@4.2.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/eventstream-serde-universal@4.2.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/eventstream-serde-universal@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/eventstream-serde-universal@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/eventstream-serde-universal@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/eventstream-serde-universal@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/eventstream-serde-universal@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/eventstream-serde-universal@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/eventstream-serde-universal@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/eventstream-serde-universal@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/eventstream-serde-universal@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/eventstream-serde-universal@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/eventstream-serde-universal@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/eventstream-serde-universal@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/eventstream-serde-universal@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/eventstream-serde-universal@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/eventstream-serde-universal@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/eventstream-serde-universal@4.0.5 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/eventstream-serde-universal@4.0.4 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/eventstream-serde-universal@4.0.3 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/eventstream-serde-universal@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/eventstream-serde-universal@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/eventstream-serde-universal@4.0.0 - @smithy/types@4.0.0 ## 3.0.13 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/eventstream-serde-universal@3.0.13 ## 3.0.12 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/eventstream-serde-universal@3.0.12 ## 3.0.11 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/eventstream-serde-universal@3.0.11 ## 3.0.10 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/eventstream-serde-universal@3.0.10 ## 3.0.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/eventstream-serde-universal@3.0.9 ## 3.0.8 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/eventstream-serde-universal@3.0.8 ## 3.0.7 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/eventstream-serde-universal@3.0.7 ## 3.0.6 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/eventstream-serde-universal@3.0.6 ## 3.0.5 ### Patch Changes - Updated dependencies [b352cc1] - @smithy/eventstream-serde-universal@3.0.5 ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/eventstream-serde-universal@3.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/eventstream-serde-universal@3.0.3 ## 3.0.2 ### Patch Changes - @smithy/eventstream-serde-universal@3.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/eventstream-serde-universal@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/eventstream-serde-universal@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/eventstream-serde-universal@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/eventstream-serde-universal@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/eventstream-serde-universal@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/eventstream-serde-universal@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/eventstream-serde-universal@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/eventstream-serde-universal@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/eventstream-serde-universal@2.0.16 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/eventstream-serde-universal@2.0.15 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/eventstream-serde-universal@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/eventstream-serde-universal@2.0.13 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/eventstream-serde-universal@2.0.12 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/eventstream-serde-universal@2.0.11 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/eventstream-serde-universal@2.0.10 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/eventstream-serde-universal@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/eventstream-serde-universal@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/eventstream-serde-universal@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/eventstream-serde-universal@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/eventstream-serde-universal@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/eventstream-serde-universal@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/eventstream-serde-universal@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/eventstream-serde-universal@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/eventstream-serde-universal@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/eventstream-serde-universal@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/eventstream-serde-universal@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/eventstream-serde-universal@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/eventstream-serde-universal@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/eventstream-serde-universal@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/eventstream-serde-node](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/eventstream-serde-node/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde/EventStreamMarshaller.browser.ts ================================================ import type { Decoder, Encoder, EventSigner, EventStreamSerdeProvider, EventStreamMarshaller as IEventStreamMarshaller, Message, Provider, } from "@smithy/types"; import { EventStreamMarshaller as UniversalEventStreamMarshaller } from "../eventstream-serde-universal/EventStreamMarshaller"; import { iterableToReadableStream, readableStreamToIterable } from "./utils"; /** * @internal */ export interface EventStreamMarshallerOptions { utf8Encoder: Encoder; utf8Decoder: Decoder; } /** * Utility class used to serialize and deserialize event streams in * browsers and ReactNative. * * In browsers where ReadableStream API is available: * * deserialize from ReadableStream to an async iterable of output structure * * serialize from async iterable of input structure to ReadableStream * In ReactNative where only async iterable API is available: * * deserialize from async iterable of binaries to async iterable of output structure * * serialize from async iterable of input structure to async iterable of binaries * * We use ReadableStream API in browsers because of the consistency with other * streaming operations, where ReadableStream API is used to denote streaming data. * Whereas in ReactNative, ReadableStream API is not available, we use async iterable * for streaming data, although it has lower throughput. * * @internal */ export class EventStreamMarshaller implements IEventStreamMarshaller { private readonly universalMarshaller: UniversalEventStreamMarshaller; constructor({ utf8Encoder, utf8Decoder }: EventStreamMarshallerOptions) { this.universalMarshaller = new UniversalEventStreamMarshaller({ utf8Decoder, utf8Encoder, }); } deserialize( body: ReadableStream | AsyncIterable, deserializer: (input: Record) => Promise ): AsyncIterable { const bodyIterable = isReadableStream(body) ? readableStreamToIterable(body) : body; return this.universalMarshaller.deserialize(bodyIterable, deserializer); } /** * Generate a stream that serialize events into stream of binary chunks; * * Caveat is that streaming request payload doesn't work on browser with native * xhr or fetch handler currently because they don't support upload streaming. * reference: * * https://bugs.chromium.org/p/chromium/issues/detail?id=688906 * * https://bugzilla.mozilla.org/show_bug.cgi?id=1387483 * */ serialize(input: AsyncIterable, serializer: (event: T) => Message): ReadableStream | AsyncIterable { const serializedIterable = this.universalMarshaller.serialize(input, serializer); return typeof ReadableStream === "function" ? iterableToReadableStream(serializedIterable) : serializedIterable; } } /** * Warning: do not export this without aliasing the reference to * global ReadableStream. * @internal * @see https://github.com/smithy-lang/smithy-typescript/issues/1341. */ const isReadableStream = (body: any): body is ReadableStream => typeof ReadableStream === "function" && body instanceof ReadableStream; /** * @internal */ export const eventStreamSerdeProvider: EventStreamSerdeProvider = (options: { utf8Encoder: Encoder; utf8Decoder: Decoder; eventSigner: EventSigner | Provider; }) => new EventStreamMarshaller(options); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde/EventStreamMarshaller.ts ================================================ import { Readable } from "node:stream"; import type { Decoder, Encoder, EventSigner, EventStreamSerdeProvider, EventStreamMarshaller as IEventStreamMarshaller, Message, Provider, } from "@smithy/types"; import { EventStreamMarshaller as UniversalEventStreamMarshaller } from "../eventstream-serde-universal/EventStreamMarshaller"; /** * @internal */ export interface EventStreamMarshallerOptions { utf8Encoder: Encoder; utf8Decoder: Decoder; } /** * @internal */ export class EventStreamMarshaller implements IEventStreamMarshaller { private readonly universalMarshaller: UniversalEventStreamMarshaller; constructor({ utf8Encoder, utf8Decoder }: EventStreamMarshallerOptions) { this.universalMarshaller = new UniversalEventStreamMarshaller({ utf8Decoder, utf8Encoder, }); } deserialize(body: Readable, deserializer: (input: Record) => Promise): AsyncIterable { //should use stream[Symbol.asyncIterable] when the api is stable //reference: https://nodejs.org/docs/latest-v11.x/api/stream.html#stream_readable_symbol_asynciterator const bodyIterable: AsyncIterable = typeof body[Symbol.asyncIterator] === "function" ? body : readableToIterable(body); return this.universalMarshaller.deserialize(bodyIterable, deserializer); } serialize(input: AsyncIterable, serializer: (event: T) => Message): Readable { return Readable.from(this.universalMarshaller.serialize(input, serializer)); } } /** * @internal */ export const eventStreamSerdeProvider: EventStreamSerdeProvider = (options: { utf8Encoder: Encoder; utf8Decoder: Decoder; eventSigner: EventSigner | Provider; }) => new EventStreamMarshaller(options); /** * Convert object stream piped in into an async iterable. This * adaptor should be deprecated when Node stream iterator is stable. * Caveat: this adaptor won't have backpressure to inwards stream * * Reference: https://nodejs.org/docs/latest-v11.x/api/stream.html#stream_readable_symbol_asynciterator * @internal */ export async function* readableToIterable(readStream: Readable): AsyncIterable { let streamEnded = false; let generationEnded = false; const records = new Array(); readStream.on("error", (err) => { if (!streamEnded) { streamEnded = true; } if (err) { throw err; } }); readStream.on("data", (data) => { records.push(data); }); readStream.on("end", () => { streamEnded = true; }); while (!generationEnded) { // @ts-ignore TS2345: Argument of type 'T | undefined' is not assignable to type 'T | PromiseLike'. const value = await new Promise((resolve) => setTimeout(() => resolve(records.shift()), 0)); if (value) { yield value; } generationEnded = streamEnded && records.length === 0; } } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde/utils.ts ================================================ /** * A util function converting ReadableStream into an async iterable. * Reference: https://jakearchibald.com/2017/async-iterators-and-generators/#making-streams-iterate * @internal */ export const readableStreamToIterable = (readableStream: ReadableStream): AsyncIterable => ({ [Symbol.asyncIterator]: async function* () { const reader = readableStream.getReader(); try { while (true) { const { done, value } = await reader.read(); if (done) return; yield value as T; } } finally { reader.releaseLock(); } }, }); /** * A util function converting async iterable to a ReadableStream. * @internal */ export const iterableToReadableStream = (asyncIterable: AsyncIterable): ReadableStream => { const iterator = asyncIterable[Symbol.asyncIterator](); return new ReadableStream({ async pull(controller) { const { done, value } = await iterator.next(); if (done) { return controller.close(); } controller.enqueue(value); }, }); }; ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-config-resolver/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/event-streams`. ## 4.3.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.3.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.3.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.3.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.3.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.3.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.3.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.3.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.3.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.3.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.1.3 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.1.2 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.1.1 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/eventstream-serde-config-resolver](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/eventstream-serde-config-resolver/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-config-resolver/EventStreamSerdeConfig.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { resolveEventStreamSerdeConfig } from "./EventStreamSerdeConfig"; describe("resolveEventStreamSerdeConfig", () => { const eventStreamSerdeProvider = vi.fn(); afterEach(() => { vi.clearAllMocks(); }); it("maintains object custody", () => { const input = { eventStreamSerdeProvider: vi.fn(), }; expect(resolveEventStreamSerdeConfig(input)).toBe(input); }); it("sets value returned by eventStreamSerdeProvider", () => { const mockReturn = "mockReturn"; eventStreamSerdeProvider.mockReturnValueOnce(mockReturn); const input = { eventStreamSerdeProvider }; expect(resolveEventStreamSerdeConfig(input).eventStreamMarshaller).toStrictEqual(mockReturn); expect(eventStreamSerdeProvider).toHaveBeenCalledTimes(1); expect(eventStreamSerdeProvider).toHaveBeenCalledWith(input); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-config-resolver/EventStreamSerdeConfig.ts ================================================ import type { EventStreamMarshaller, EventStreamSerdeProvider } from "@smithy/types"; /** * @public */ export interface EventStreamSerdeInputConfig {} /** * @internal */ export interface EventStreamSerdeResolvedConfig { eventStreamMarshaller: EventStreamMarshaller; } /** * @internal */ interface PreviouslyResolved { /** * Provide the event stream marshaller for the given runtime * @internal */ eventStreamSerdeProvider: EventStreamSerdeProvider; } /** * @internal */ export const resolveEventStreamSerdeConfig = ( input: T & PreviouslyResolved & EventStreamSerdeInputConfig ): T & EventStreamSerdeResolvedConfig => Object.assign(input, { eventStreamMarshaller: input.eventStreamSerdeProvider(input), }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/event-streams`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/eventstream-codec@4.2.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/eventstream-codec@4.2.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/eventstream-codec@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/eventstream-codec@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/eventstream-codec@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/eventstream-codec@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/eventstream-codec@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/eventstream-codec@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/eventstream-codec@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/eventstream-codec@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/eventstream-codec@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/eventstream-codec@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/eventstream-codec@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/eventstream-codec@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/eventstream-codec@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/eventstream-codec@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/eventstream-codec@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/eventstream-codec@4.0.5 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/eventstream-codec@4.0.4 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/eventstream-codec@4.0.3 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/eventstream-codec@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/eventstream-codec@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/eventstream-codec@4.0.0 - @smithy/types@4.0.0 ## 3.0.13 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/eventstream-codec@3.1.10 ## 3.0.12 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/eventstream-codec@3.1.9 ## 3.0.11 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/eventstream-codec@3.1.8 ## 3.0.10 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/eventstream-codec@3.1.7 ## 3.0.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/eventstream-codec@3.1.6 ## 3.0.8 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/eventstream-codec@3.1.5 ## 3.0.7 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/eventstream-codec@3.1.4 ## 3.0.6 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/eventstream-codec@3.1.3 ## 3.0.5 ### Patch Changes - b352cc1: exclude test code from artifact ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/eventstream-codec@3.1.2 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/eventstream-codec@3.1.1 ## 3.0.2 ### Patch Changes - Updated dependencies [3c23a83b] - @smithy/eventstream-codec@3.1.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/eventstream-codec@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/eventstream-codec@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/eventstream-codec@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/eventstream-codec@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/eventstream-codec@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/eventstream-codec@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/eventstream-codec@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/eventstream-codec@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/eventstream-codec@2.0.16 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/eventstream-codec@2.0.15 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/eventstream-codec@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/eventstream-codec@2.0.13 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/eventstream-codec@2.0.12 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/eventstream-codec@2.0.11 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/eventstream-codec@2.0.10 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/eventstream-codec@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/eventstream-codec@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/eventstream-codec@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/eventstream-codec@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/eventstream-codec@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/eventstream-codec@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/eventstream-codec@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/eventstream-codec@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/eventstream-codec@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/eventstream-codec@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/eventstream-codec@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/eventstream-codec@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/eventstream-codec@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/eventstream-codec@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/eventstream-serde-universal](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/eventstream-serde-universal/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/EventStreamMarshaller.ts ================================================ import type { Decoder, Encoder, EventSigner, EventStreamSerdeProvider, EventStreamMarshaller as IEventStreamMarshaller, Message, Provider, } from "@smithy/types"; import { EventStreamCodec } from "../eventstream-codec/EventStreamCodec"; import { MessageDecoderStream } from "../eventstream-codec/MessageDecoderStream"; import { MessageEncoderStream } from "../eventstream-codec/MessageEncoderStream"; import { SmithyMessageDecoderStream } from "../eventstream-codec/SmithyMessageDecoderStream"; import { SmithyMessageEncoderStream } from "../eventstream-codec/SmithyMessageEncoderStream"; import { getChunkedStream } from "./getChunkedStream"; import { getMessageUnmarshaller } from "./getUnmarshalledStream"; /** * @internal */ export interface EventStreamMarshallerOptions { utf8Encoder: Encoder; utf8Decoder: Decoder; } /** * @internal */ export class EventStreamMarshaller implements IEventStreamMarshaller { private readonly eventStreamCodec: EventStreamCodec; private readonly utfEncoder: Encoder; constructor({ utf8Encoder, utf8Decoder }: EventStreamMarshallerOptions) { this.eventStreamCodec = new EventStreamCodec(utf8Encoder, utf8Decoder); this.utfEncoder = utf8Encoder; } deserialize( body: AsyncIterable, deserializer: (input: Record) => Promise ): AsyncIterable { const inputStream = getChunkedStream(body); return new SmithyMessageDecoderStream({ messageStream: new MessageDecoderStream({ inputStream, decoder: this.eventStreamCodec }), deserializer: getMessageUnmarshaller(deserializer, this.utfEncoder), }); } serialize(inputStream: AsyncIterable, serializer: (event: T) => Message): AsyncIterable { return new MessageEncoderStream({ messageStream: new SmithyMessageEncoderStream({ inputStream, serializer }), encoder: this.eventStreamCodec, includeEndFrame: true, }); } } /** * @internal */ export const eventStreamSerdeProvider: EventStreamSerdeProvider = (options: { utf8Encoder: Encoder; utf8Decoder: Decoder; eventSigner: EventSigner | Provider; }) => new EventStreamMarshaller(options); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/clientContextParams-precedence.integ.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { XYZService } from "xyz"; describe("client context parameters precedence integration test", () => { it("should handle conflicting vs non-conflicting parameter precedence correctly", async () => { // For non-conflicting params const clientWithNonConflicting = new XYZService({ endpoint: "https://localhost", apiKey: async () => ({ apiKey: "test-key" }), customParam: "user-custom-value", clientContextParams: { apiKey: "test-key", customParam: "nested-custom-value", }, }); // Verify that endpoint resolution uses the nested value over root value const resolvedConfig = clientWithNonConflicting.config; const effectiveCustomParam = resolvedConfig.clientContextParams?.customParam ?? resolvedConfig.customParam; expect(effectiveCustomParam).toBe("nested-custom-value"); // For conflicting parameters const clientWithConflicting = new XYZService({ endpoint: "https://localhost", apiKey: async () => ({ apiKey: "auth-key" }), clientContextParams: { apiKey: "endpoint-key", }, }); // Verify that both auth and endpoint contexts can coexist const resolvedConfigConflicting = clientWithConflicting.config; // Verify endpoint context has the nested value expect(resolvedConfigConflicting.clientContextParams?.apiKey).toBe("endpoint-key"); // Verify auth context has the auth provider const authIdentity = await resolvedConfigConflicting.apiKey?.(); expect(authIdentity?.apiKey).toBe("auth-key"); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/eventstream-cbor.integ.spec.ts ================================================ import { Readable } from "node:stream"; import { cbor, dateToTag } from "@smithy/core/cbor"; import { HttpResponse } from "@smithy/core/protocols"; import { requireRequestsFrom } from "@smithy/util-test/src"; import { describe, expect, test as it } from "vitest"; import { XYZService } from "xyz"; describe("local model integration test for cbor eventstreams", () => { it("should read and write cbor event streams", async () => { const client = new XYZService({ endpoint: "https://localhost", apiKey: async () => ({ apiKey: "test-api-key" }), clientContextParams: { apiKey: "test-api-key", }, }); const body = cbor.serialize({ id: "alpha", timestamp: dateToTag(new Date(0)), }); function toInt32(n: number): number[] { const uint32 = new Uint8Array(4); const dv = new DataView(uint32.buffer, 0, 4); dv.setUint32(0, n); return [...uint32]; } requireRequestsFrom(client) .toMatch({ hostname: /localhost/, async body(body) { const outgoing = []; for await (const chunk of body) { outgoing.push(chunk); } expect(outgoing).toEqual([ new Uint8Array([ 0, 0, 0, 101, 0, 0, 0, 75, 213, 254, 191, 76, 11, 58, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 5, 97, 108, 112, 104, 97, 13, 58, 109, 101, 115, 115, 97, 103, 101, 45, 116, 121, 112, 101, 7, 0, 5, 101, 118, 101, 110, 116, 13, 58, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 99, 98, 111, 114, 161, 98, 105, 100, 101, 97, 108, 112, 104, 97, 32, 93, 69, 236, ]), new Uint8Array([ 0, 0, 0, 91, 0, 0, 0, 74, 188, 232, 137, 61, 11, 58, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 4, 98, 101, 116, 97, 13, 58, 109, 101, 115, 115, 97, 103, 101, 45, 116, 121, 112, 101, 7, 0, 5, 101, 118, 101, 110, 116, 13, 58, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 99, 98, 111, 114, 160, 195, 209, 62, 47, ]), new Uint8Array([ 0, 0, 0, 91, 0, 0, 0, 74, 188, 232, 137, 61, 11, 58, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 4, 98, 101, 116, 97, 13, 58, 109, 101, 115, 115, 97, 103, 101, 45, 116, 121, 112, 101, 7, 0, 5, 101, 118, 101, 110, 116, 13, 58, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101, 7, 0, 16, 97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 99, 98, 111, 114, 160, 195, 209, 62, 47, ]), new Uint8Array(), ]); }, }) .respondWith( new HttpResponse({ statusCode: 200, headers: { "smithy-protocol": "rpc-v2-cbor", }, body: Readable.from({ async *[Symbol.asyncIterator]() { yield new Uint8Array([ /* message size */ ...toInt32(91 + body.byteLength), /* header size */ ...toInt32(75), /* prelude crc */ ...toInt32(1084132878), /* headers */ /* :event-type */ 11, ...[58, 101, 118, 101, 110, 116, 45, 116, 121, 112, 101], 7, /* alpha */ 0, 5, ...[97, 108, 112, 104, 97], /* :content-type */ 13, ...[58, 99, 111, 110, 116, 101, 110, 116, 45, 116, 121, 112, 101], 7, /* application/cbor */ 0, 16, ...[97, 112, 112, 108, 105, 99, 97, 116, 105, 111, 110, 47, 99, 98, 111, 114], /* :message-type */ 13, ...[58, 109, 101, 115, 115, 97, 103, 101, 45, 116, 121, 112, 101], 7, /* event */ 0, 5, ...[101, 118, 101, 110, 116], /* body */ ...body, /* message crc */ ...toInt32(1938836882), ]); }, }), }) ); const response = await client.tradeEventStream({ eventStream: { async *[Symbol.asyncIterator]() { yield { alpha: { id: "alpha", }, }; yield { beta: {}, }; yield { gamma: {}, }; }, }, }); const responses = [] as any[]; for await (const event of response.eventStream ?? []) { responses.push(event); } expect(responses).toEqual([ { alpha: { id: "alpha", timestamp: new Date(0), }, }, ]); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/getChunkedStream.spec.ts ================================================ import { Readable, type ReadableOptions } from "node:stream"; import { describe, expect, test as it } from "vitest"; import { getChunkedStream } from "./getChunkedStream"; export const recordEventMessage = Buffer.from( "AAAA0AAAAFX31gVLDTptZXNzYWdlLXR5cGUHAAVldmVudAs6ZXZlbnQtdHlwZQcAB1JlY29yZHMNOmNvbnRlbnQtdHlwZQcAGGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTEsRm9vLFdoZW4gbGlmZSBnaXZlcyB5b3UgZm9vLi4uCjIsQmFyLG1ha2UgQmFyIQozLEZpenosU29tZXRpbWVzIHBhaXJlZCB3aXRoLi4uCjQsQnV6eix0aGUgaW5mYW1vdXMgQnV6eiEKzxKeSw==", "base64" ); export const statsEventMessage = Buffer.from( "AAAA0QAAAEM+YpmqDTptZXNzYWdlLXR5cGUHAAVldmVudAs6ZXZlbnQtdHlwZQcABVN0YXRzDTpjb250ZW50LXR5cGUHAAh0ZXh0L3htbDxTdGF0cyB4bWxucz0iIj48Qnl0ZXNTY2FubmVkPjEyNjwvQnl0ZXNTY2FubmVkPjxCeXRlc1Byb2Nlc3NlZD4xMjY8L0J5dGVzUHJvY2Vzc2VkPjxCeXRlc1JldHVybmVkPjEwNzwvQnl0ZXNSZXR1cm5lZD48L1N0YXRzPiJ0pLk=", "base64" ); export const endEventMessage = Buffer.from( "AAAAOAAAACjBxoTUDTptZXNzYWdlLXR5cGUHAAVldmVudAs6ZXZlbnQtdHlwZQcAA0VuZM+X05I=", "base64" ); export const exception = Buffer.from( "AAAAtgAAAF8BcW64DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NOm1lc3NhZ2UtdHlwZQcACWV4Y2VwdGlvbg86ZXhjZXB0aW9uLXR5cGUHAAlFeGNlcHRpb25UaGlzIGlzIGEgbW9kZWxlZCBleGNlcHRpb24gZXZlbnQgdGhhdCB3b3VsZCBiZSB0aHJvd24gaW4gZGVzZXJpYWxpemVyLj6Gc60=", "base64" ); export interface MockEventMessageSourceOptions extends ReadableOptions { messages: Array; emitSize: number; throwError?: Error; } export class MockEventMessageSource extends Readable { private readonly data: Buffer; private readonly emitSize: number; private readonly throwError?: Error; private readCount = 0; constructor(options: MockEventMessageSourceOptions) { super(options); this.data = Buffer.concat(options.messages); this.emitSize = options.emitSize; this.throwError = options.throwError; } _read() { // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; if (this.readCount === this.data.length) { if (this.throwError) { process.nextTick(function () { self.emit("error", new Error("Throwing an error!")); }); return; } else { this.push(null); return; } } const bytesLeft = this.data.length - this.readCount; const numBytesToSend = Math.min(bytesLeft, this.emitSize); const chunk = this.data.slice(this.readCount, this.readCount + numBytesToSend); this.readCount += numBytesToSend; this.push(chunk); } } describe("getChunkedStream", () => { it("splits payloads into individual messages", async () => { const messages = []; const mockMessages = [recordEventMessage, statsEventMessage, endEventMessage]; const mockStream = new MockEventMessageSource({ messages: mockMessages, emitSize: 100, }); const chunkerStream = getChunkedStream(mockStream); for await (const msg of chunkerStream) { messages.push(msg); } expect(messages.length).toBe(3); }); it("splits payloads in correct order", async () => { const messages: Array = []; const mockMessages = [recordEventMessage, statsEventMessage, recordEventMessage, endEventMessage]; const mockStream = new MockEventMessageSource({ messages: mockMessages, emitSize: 100, }); const chunkerStream = getChunkedStream(mockStream); for await (const msg of chunkerStream) { messages.push(msg); } expect(messages.length).toBe(4); for (let i = 0; i < mockMessages.length; i++) { expect(Buffer.from(messages[i]).toString("base64")).toEqual(mockMessages[i].toString("base64")); } }); it("splits payloads when received all at once", async () => { const messages = []; const mockMessages = [recordEventMessage, statsEventMessage, endEventMessage]; const mockStream = new MockEventMessageSource({ messages: mockMessages, emitSize: mockMessages.reduce((prev, cur) => { return prev + cur.length; }, 0), }); const chunkerStream = getChunkedStream(mockStream); for await (const msg of chunkerStream) { messages.push(msg); } expect(messages.length).toBe(3); }); it("splits payloads when total event message length spans multiple chunks", async () => { const messages = []; const mockMessages = [recordEventMessage, statsEventMessage, endEventMessage]; const mockStream = new MockEventMessageSource({ messages: mockMessages, emitSize: 1, }); const chunkerStream = getChunkedStream(mockStream); for await (const msg of chunkerStream) { messages.push(msg); } expect(messages.length).toBe(3); }); it("splits payloads when total event message length spans 2 chunks", async () => { const messages = []; const mockMessages = [recordEventMessage, statsEventMessage, endEventMessage]; const mockStream = new MockEventMessageSource({ messages: mockMessages, emitSize: recordEventMessage.length + 2, }); const chunkerStream = getChunkedStream(mockStream); for await (const msg of chunkerStream) { messages.push(msg); } expect(messages.length).toBe(3); }); it("sends an error if an event message is truncated", async () => { const responseMessage = Buffer.concat([recordEventMessage, statsEventMessage, endEventMessage]); const mockStream = new MockEventMessageSource({ messages: [responseMessage.slice(0, responseMessage.length - 4)], emitSize: 10, }); const chunkerStream = getChunkedStream(mockStream); let error: Error | undefined = undefined; try { // eslint-disable-next-line @typescript-eslint/no-unused-vars for await (const msg of chunkerStream) { //Pass } } catch (err) { error = err; } expect(error!.message).toEqual("Truncated event message received."); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/getChunkedStream.ts ================================================ /** * @internal */ export function getChunkedStream(source: AsyncIterable): AsyncIterable { let currentMessageTotalLength = 0; let currentMessagePendingLength = 0; let currentMessage: Uint8Array | null = null; let messageLengthBuffer: Uint8Array | null = null; const allocateMessage = (size: number) => { if (typeof size !== "number") { throw new Error("Attempted to allocate an event message where size was not a number: " + size); } currentMessageTotalLength = size; currentMessagePendingLength = 4; currentMessage = new Uint8Array(size); const currentMessageView = new DataView(currentMessage.buffer); currentMessageView.setUint32(0, size, false); //set big-endian Uint32 to 0~3 bytes }; const iterator = async function* () { const sourceIterator = source[Symbol.asyncIterator](); while (true) { const { value, done } = await sourceIterator.next(); if (done) { if (!currentMessageTotalLength) { return; } else if (currentMessageTotalLength === currentMessagePendingLength) { yield currentMessage as Uint8Array; } else { throw new Error("Truncated event message received."); } return; } const chunkLength = value.length; let currentOffset = 0; while (currentOffset < chunkLength) { // create new message if necessary if (!currentMessage) { // working on a new message, determine total length const bytesRemaining = chunkLength - currentOffset; // prevent edge case where total length spans 2 chunks if (!messageLengthBuffer) { messageLengthBuffer = new Uint8Array(4); } const numBytesForTotal = Math.min( 4 - currentMessagePendingLength, // remaining bytes to fill the messageLengthBuffer bytesRemaining // bytes left in chunk ); messageLengthBuffer.set( // @ts-ignore error TS2532: Object is possibly 'undefined' for value value.slice(currentOffset, currentOffset + numBytesForTotal), currentMessagePendingLength ); currentMessagePendingLength += numBytesForTotal; currentOffset += numBytesForTotal; if (currentMessagePendingLength < 4) { // not enough information to create the current message break; } allocateMessage(new DataView(messageLengthBuffer.buffer).getUint32(0, false)); messageLengthBuffer = null; } // write data into current message const numBytesToWrite = Math.min( currentMessageTotalLength - currentMessagePendingLength, // number of bytes left to complete message chunkLength - currentOffset // number of bytes left in the original chunk ); currentMessage!.set( // @ts-ignore error TS2532: Object is possibly 'undefined' for value value.slice(currentOffset, currentOffset + numBytesToWrite), currentMessagePendingLength ); currentMessagePendingLength += numBytesToWrite; currentOffset += numBytesToWrite; // check if a message is ready to be pushed if (currentMessageTotalLength && currentMessageTotalLength === currentMessagePendingLength) { // push out the message yield currentMessage as Uint8Array; // cleanup currentMessage = null; currentMessageTotalLength = 0; currentMessagePendingLength = 0; } } } }; return { [Symbol.asyncIterator]: iterator, }; } ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/getUnmarshalledStream.spec.ts ================================================ import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import type { Message } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { EventStreamCodec } from "../eventstream-codec/EventStreamCodec"; import { endEventMessage, exception, recordEventMessage, statsEventMessage } from "./getChunkedStream.spec"; import { getUnmarshalledStream } from "./getUnmarshalledStream"; describe("getUnmarshalledStream", () => { it("emits parsed payload on data", async () => { const expectedMessages: Array = [ { headers: { ":content-type": { type: "string", value: "application/octet-stream", }, ":event-type": { type: "string", value: "Records" }, ":message-type": { type: "string", value: "event" }, }, body: new Uint8Array( Buffer.from( `1,Foo,When life gives you foo...\n2,Bar,make Bar!\n3,Fizz,Sometimes paired with...\n4,Buzz,the infamous Buzz!\n` ) ), }, { headers: { ":content-type": { type: "string", value: "text/xml", }, ":event-type": { type: "string", value: "Stats" }, ":message-type": { type: "string", value: "event" }, }, body: new Uint8Array( Buffer.from( '126126107' ) ), }, { headers: { ":event-type": { type: "string", value: "End" }, ":message-type": { type: "string", value: "event" }, }, body: new Uint8Array(), }, ]; const source = async function* () { yield recordEventMessage; yield statsEventMessage; yield endEventMessage; }; const unmarshallerStream = getUnmarshalledStream(source(), { eventStreamCodec: new EventStreamCodec(toUtf8, fromUtf8), deserializer: (message) => Promise.resolve(message), toUtf8, }); const messages: Array = []; for await (const message of unmarshallerStream) { messages.push(message[Object.keys(message)[0]]); } for (let i = 1; i < messages.length; i++) { expect(messages[i]).toEqual(expectedMessages[i]); } }); it("throws when deserializer throws an error", async () => { const source = { [Symbol.asyncIterator]: async function* () { yield exception; }, }; const deserStream = getUnmarshalledStream(source, { eventStreamCodec: new EventStreamCodec(toUtf8, fromUtf8), deserializer: () => { throw new Error("error event"); }, toUtf8, }); let error: Error | undefined = undefined; try { // eslint-disable-next-line @typescript-eslint/no-unused-vars for await (const event of deserStream) { //pass. } } catch (e) { error = e; } expect(error).toBeDefined(); expect(error!.message).toEqual("error event"); }); it("throws on exception event if deserializer doesn't throw", async () => { //This could happened if client-side SDK is not up-to-date const source = { [Symbol.asyncIterator]: async function* () { yield exception; }, }; const deserStream = getUnmarshalledStream(source, { eventStreamCodec: new EventStreamCodec(toUtf8, fromUtf8), deserializer: (message) => Promise.resolve({ $unknown: message, }), toUtf8, }); let error: Error | undefined = undefined; try { // eslint-disable-next-line @typescript-eslint/no-unused-vars for await (const event of deserStream) { //pass. } } catch (e) { error = e; } expect(error).toBeDefined(); expect(error?.name).toEqual("Exception"); expect(error?.message).toEqual("This is a modeled exception event that would be thrown in deserializer."); }); it("omit the unknown event type", async () => { const source = async function* () { yield recordEventMessage; }; const unmarshallerStream = getUnmarshalledStream(source(), { eventStreamCodec: new EventStreamCodec(toUtf8, fromUtf8), deserializer: (message) => Promise.resolve({ $unknown: message, } as any), //deserializer that parse anything into unknown event toUtf8, }); const messages: Array = []; for await (const message of unmarshallerStream) { messages.push(message[Object.keys(message)[0]]); } expect(messages.length).toEqual(0); }); }); ================================================ FILE: packages/core/src/submodules/event-streams/eventstream-serde-universal/getUnmarshalledStream.ts ================================================ import type { Encoder, Message } from "@smithy/types"; import type { EventStreamCodec } from "../eventstream-codec/EventStreamCodec"; /** * @internal */ export type UnmarshalledStreamOptions = { eventStreamCodec: EventStreamCodec; deserializer: (input: Record) => Promise; toUtf8: Encoder; }; /** * @internal */ export function getUnmarshalledStream>( source: AsyncIterable, options: UnmarshalledStreamOptions ): AsyncIterable { const messageUnmarshaller = getMessageUnmarshaller(options.deserializer, options.toUtf8); return { [Symbol.asyncIterator]: async function* () { for await (const chunk of source) { const message = options.eventStreamCodec.decode(chunk); const type = await messageUnmarshaller(message); if (type === undefined) continue; yield type; } }, }; } /** * @internal */ export function getMessageUnmarshaller>( deserializer: (input: Record) => Promise, toUtf8: Encoder ): (input: Message) => Promise { return async function (message: Message): Promise { const { value: messageType } = message.headers[":message-type"]; if (messageType === "error") { // Unmodeled exception in event const unmodeledError = new Error((message.headers[":error-message"].value as string) || "UnknownError"); unmodeledError.name = message.headers[":error-code"].value as string; throw unmodeledError; } else if (messageType === "exception") { // For modeled exception, push it to deserializer and throw after deserializing const code = message.headers[":exception-type"].value as string; const exception = { [code]: message }; // Get parsed exception event in key(error code) value(structured error) pair. const deserializedException = await deserializer(exception); if (deserializedException.$unknown) { //this is an unmodeled exception then try parsing it with best effort const error = new Error(toUtf8(message.body)); error.name = code; throw error; } throw deserializedException[code]; } else if (messageType === "event") { const event = { [message.headers[":event-type"].value as string]: message, }; const deserialized = await deserializer(event); if (deserialized.$unknown) return; return deserialized; } else { throw Error(`Unrecognizable event type: ${message.headers[":event-type"].value}`); } }; } ================================================ FILE: packages/core/src/submodules/event-streams/index.browser.ts ================================================ // @smithy/eventstream-codec export { EventStreamCodec } from "./eventstream-codec/EventStreamCodec"; export { HeaderMarshaller } from "./eventstream-codec/HeaderMarshaller"; export { Int64 } from "./eventstream-codec/Int64"; export type { Message, MessageHeaders, MessageHeaderValue, BooleanHeaderValue, ByteHeaderValue, ShortHeaderValue, IntegerHeaderValue, LongHeaderValue, BinaryHeaderValue, StringHeaderValue, TimestampHeaderValue, UuidHeaderValue, } from "./eventstream-codec/Message"; export { MessageDecoderStream } from "./eventstream-codec/MessageDecoderStream"; export type { MessageDecoderStreamOptions } from "./eventstream-codec/MessageDecoderStream"; export { MessageEncoderStream } from "./eventstream-codec/MessageEncoderStream"; export type { MessageEncoderStreamOptions } from "./eventstream-codec/MessageEncoderStream"; export { SmithyMessageDecoderStream } from "./eventstream-codec/SmithyMessageDecoderStream"; export type { SmithyMessageDecoderStreamOptions } from "./eventstream-codec/SmithyMessageDecoderStream"; export { SmithyMessageEncoderStream } from "./eventstream-codec/SmithyMessageEncoderStream"; export type { SmithyMessageEncoderStreamOptions } from "./eventstream-codec/SmithyMessageEncoderStream"; // @smithy/eventstream-serde-browser export { EventStreamMarshaller, eventStreamSerdeProvider } from "./eventstream-serde/EventStreamMarshaller.browser"; export type { EventStreamMarshallerOptions } from "./eventstream-serde/EventStreamMarshaller.browser"; export { readableStreamToIterable, iterableToReadableStream } from "./eventstream-serde/utils"; // @smithy/eventstream-serde-universal export { EventStreamMarshaller as UniversalEventStreamMarshaller, eventStreamSerdeProvider as universalEventStreamSerdeProvider, } from "./eventstream-serde-universal/EventStreamMarshaller"; export type { EventStreamMarshallerOptions as UniversalEventStreamMarshallerOptions } from "./eventstream-serde-universal/EventStreamMarshaller"; export { getChunkedStream } from "./eventstream-serde-universal/getChunkedStream"; export { getUnmarshalledStream, getMessageUnmarshaller } from "./eventstream-serde-universal/getUnmarshalledStream"; export type { UnmarshalledStreamOptions } from "./eventstream-serde-universal/getUnmarshalledStream"; // @smithy/eventstream-serde-config-resolver export { resolveEventStreamSerdeConfig } from "./eventstream-serde-config-resolver/EventStreamSerdeConfig"; export type { EventStreamSerdeInputConfig, EventStreamSerdeResolvedConfig, } from "./eventstream-serde-config-resolver/EventStreamSerdeConfig"; // EventStreamSerde export { EventStreamSerde } from "./EventStreamSerde"; ================================================ FILE: packages/core/src/submodules/event-streams/index.ts ================================================ // @smithy/eventstream-codec export { EventStreamCodec } from "./eventstream-codec/EventStreamCodec"; export { HeaderMarshaller } from "./eventstream-codec/HeaderMarshaller"; export { Int64 } from "./eventstream-codec/Int64"; export type { Message, MessageHeaders, MessageHeaderValue, BooleanHeaderValue, ByteHeaderValue, ShortHeaderValue, IntegerHeaderValue, LongHeaderValue, BinaryHeaderValue, StringHeaderValue, TimestampHeaderValue, UuidHeaderValue, } from "./eventstream-codec/Message"; export { MessageDecoderStream } from "./eventstream-codec/MessageDecoderStream"; export type { MessageDecoderStreamOptions } from "./eventstream-codec/MessageDecoderStream"; export { MessageEncoderStream } from "./eventstream-codec/MessageEncoderStream"; export type { MessageEncoderStreamOptions } from "./eventstream-codec/MessageEncoderStream"; export { SmithyMessageDecoderStream } from "./eventstream-codec/SmithyMessageDecoderStream"; export type { SmithyMessageDecoderStreamOptions } from "./eventstream-codec/SmithyMessageDecoderStream"; export { SmithyMessageEncoderStream } from "./eventstream-codec/SmithyMessageEncoderStream"; export type { SmithyMessageEncoderStreamOptions } from "./eventstream-codec/SmithyMessageEncoderStream"; // @smithy/eventstream-serde-node export { EventStreamMarshaller, eventStreamSerdeProvider } from "./eventstream-serde/EventStreamMarshaller"; export type { EventStreamMarshallerOptions } from "./eventstream-serde/EventStreamMarshaller"; export { readableStreamToIterable, iterableToReadableStream } from "./eventstream-serde/utils"; // @smithy/eventstream-serde-universal export { EventStreamMarshaller as UniversalEventStreamMarshaller, eventStreamSerdeProvider as universalEventStreamSerdeProvider, } from "./eventstream-serde-universal/EventStreamMarshaller"; export type { EventStreamMarshallerOptions as UniversalEventStreamMarshallerOptions } from "./eventstream-serde-universal/EventStreamMarshaller"; export { getChunkedStream } from "./eventstream-serde-universal/getChunkedStream"; export { getUnmarshalledStream, getMessageUnmarshaller } from "./eventstream-serde-universal/getUnmarshalledStream"; export type { UnmarshalledStreamOptions } from "./eventstream-serde-universal/getUnmarshalledStream"; // @smithy/eventstream-serde-config-resolver export { resolveEventStreamSerdeConfig } from "./eventstream-serde-config-resolver/EventStreamSerdeConfig"; export type { EventStreamSerdeInputConfig, EventStreamSerdeResolvedConfig, } from "./eventstream-serde-config-resolver/EventStreamSerdeConfig"; // EventStreamSerde export { EventStreamSerde } from "./EventStreamSerde"; ================================================ FILE: packages/core/src/submodules/protocols/HttpBindingProtocol.spec.ts ================================================ import { Readable } from "node:stream"; import { NormalizedSchema, op, type TypeRegistry } from "@smithy/core/schema"; import { LazyJsonString, dateToUtcString, generateIdempotencyToken, quoteHeader, toBase64 } from "@smithy/core/serde"; import { streamCollector } from "@smithy/node-http-handler"; import { HttpResponse } from "@smithy/protocol-http"; import type { $Schema, $ShapeSerializer, Codec, CodecSettings, HandlerExecutionContext, HttpResponse as IHttpResponse, ListSchemaModifier, MapSchemaModifier, MetadataBearer, NumericSchema, OperationSchema, ResponseMetadata, SerdeFunctions, ShapeDeserializer, ShapeSerializer, StaticStructureSchema, StringSchema, TimestampDateTimeSchema, TimestampDefaultSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "@smithy/types"; import { parseUrl } from "@smithy/url-parser"; import { describe, expect, test as it } from "vitest"; import { HttpBindingProtocol } from "./HttpBindingProtocol"; import { SerdeContext } from "./SerdeContext"; import { FromStringShapeDeserializer } from "./serde/FromStringShapeDeserializer"; import { determineTimestampFormat } from "./serde/determineTimestampFormat"; describe(HttpBindingProtocol.name, () => { class ToStringTestShapeSerializer extends SerdeContext implements $ShapeSerializer { private stringBuffer = ""; public constructor(private settings: CodecSettings) { super(); } public write(schema: $Schema, value: unknown): void { const ns = NormalizedSchema.of(schema); switch (typeof value) { case "object": if (value === null) { this.stringBuffer = "null"; return; } if (ns.isTimestampSchema()) { if (!(value instanceof Date)) { throw new Error( `@smithy/core/protocols - received non-Date value ${value} when schema expected Date in ${ns.getName( true )}` ); } const format = determineTimestampFormat(ns, this.settings); switch (format) { case 5 satisfies TimestampDateTimeSchema: this.stringBuffer = value.toISOString().replace(".000Z", "Z"); break; case 6 satisfies TimestampHttpDateSchema: this.stringBuffer = dateToUtcString(value); break; case 7 satisfies TimestampEpochSecondsSchema: this.stringBuffer = String(value.getTime() / 1000); break; default: console.warn("Missing timestamp format, using epoch seconds", value); this.stringBuffer = String(value.getTime() / 1000); } return; } if (ns.isBlobSchema() && "byteLength" in (value as Uint8Array)) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(value as Uint8Array); return; } if (ns.isListSchema() && Array.isArray(value)) { let buffer = ""; for (const item of value) { this.write([ns.getValueSchema(), ns.getMergedTraits()], item); const headerItem = this.flush(); const serialized = ns.getValueSchema().isTimestampSchema() ? headerItem : quoteHeader(headerItem); if (buffer !== "") { buffer += ", "; } buffer += serialized; } this.stringBuffer = buffer; return; } let b = ""; b += "{"; const keyValues = []; for (const [k, $] of ns.structIterator()) { let row = ""; const v = (value as any)[k]; if (v != null || $.isIdempotencyToken()) { row += `"${k}":"`; this.write($, v); row += this.stringBuffer; this.stringBuffer = ""; row += `"`; keyValues.push(row); } } b += keyValues.join(","); b += "}"; this.stringBuffer = b; break; case "string": const mediaType = ns.getMergedTraits().mediaType; let intermediateValue: string | LazyJsonString = value; if (mediaType) { const isJson = mediaType === "application/json" || mediaType.endsWith("+json"); if (isJson) { intermediateValue = LazyJsonString.from(intermediateValue); } if (ns.getMergedTraits().httpHeader) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(intermediateValue.toString()); return; } } this.stringBuffer = value; break; default: if (ns.isIdempotencyToken()) { this.stringBuffer = generateIdempotencyToken(); } else { this.stringBuffer = String(value); } } } public flush(): string { const buffer = this.stringBuffer; this.stringBuffer = ""; return buffer; } } class StringRestProtocol extends HttpBindingProtocol { protected serializer: ShapeSerializer; protected deserializer: ShapeDeserializer; public constructor( { defaultNamespace = "", errorTypeRegistries = [], }: { defaultNamespace: string; errorTypeRegistries?: TypeRegistry[]; } = { defaultNamespace: "", errorTypeRegistries: [], } ) { super({ defaultNamespace, errorTypeRegistries, }); const settings: CodecSettings = { timestampFormat: { useTrait: true, default: 7 satisfies TimestampEpochSecondsSchema, }, httpBindings: true, }; this.serializer = new ToStringTestShapeSerializer(settings); this.deserializer = new FromStringShapeDeserializer(settings); } public getShapeId(): string { throw new Error("Method not implemented."); } public getPayloadCodec(): Codec { throw new Error("Method not implemented."); } protected handleError( operationSchema: OperationSchema, context: HandlerExecutionContext, response: IHttpResponse, dataObject: any, metadata: ResponseMetadata ): Promise { void [operationSchema, context, response, dataObject, metadata]; throw new Error("Method not implemented."); } } it("should deserialize timestamp list with unescaped commas", async () => { const response = new HttpResponse({ statusCode: 200, headers: { "x-timestamplist": "Mon, 16 Nov 2019 23:48:18 GMT, Mon, 16 Dec 2019 23:48:18 GMT", }, }); const protocol = new StringRestProtocol(); const output = (await protocol.deserializeResponse( op("", "", 0, "unit", [ 3, "", "", 0, ["timestampList"], [ [ (64 satisfies ListSchemaModifier) | (4 satisfies TimestampDefaultSchema), { httpHeader: "x-timestamplist", }, ], ], ]), {} as any, response )) as Partial; delete output.$metadata; expect(output).toEqual({ timestampList: [new Date("2019-11-16T23:48:18.000Z"), new Date("2019-12-16T23:48:18.000Z")], }); }); it("should deserialize all headers when httpPrefixHeaders value is empty string", async () => { const response = new HttpResponse({ statusCode: 200, headers: { "x-tents": "tents", hello: "Hello", }, }); const protocol = new StringRestProtocol(); const output = (await protocol.deserializeResponse( op("", "", 0, "unit", [ 3, "", "", 0, ["httpPrefixHeaders"], [ [ (128 satisfies MapSchemaModifier) | (0 satisfies StringSchema), { httpPrefixHeaders: "", }, ], ], ]), {} as any, response )) as Partial; delete output.$metadata; expect(output).toEqual({ httpPrefixHeaders: { "x-tents": "tents", hello: "Hello", }, }); }); it("should serialize custom paths in context-provided endpoint", async () => { const protocol = new StringRestProtocol(); const request = await protocol.serializeRequest( op( "", "", { http: ["GET", "/Operation", 200], }, "unit", "unit" ), {}, { endpoint: async () => parseUrl("https://localhost/custom"), } as any ); expect(request.path).toEqual("/custom/Operation"); }); it("can deserialize a prefix header binding and header binding from the same header", async () => { type TestSignature = ( schema: $Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any ) => Promise; const deserializeHttpMessage = ((StringRestProtocol.prototype as any).deserializeHttpMessage as TestSignature).bind( { deserializer: new FromStringShapeDeserializer({ httpBindings: true, timestampFormat: { useTrait: true, default: 7 satisfies TimestampEpochSecondsSchema, }, }), } ); const httpResponse: IHttpResponse = { statusCode: 200, headers: { "my-header": "header-value", }, }; const dataObject = {}; await deserializeHttpMessage( [ 3, "", "Struct", 0, ["prefixHeaders", "header"], [ [[2, "", "Map", 0, 0, 0], { httpPrefixHeaders: "my-" }], [0, { httpHeader: "my-header" }], ], ], {} as any, httpResponse, dataObject ); expect(dataObject).toEqual({ prefixHeaders: { header: "header-value", }, header: "header-value", }); }); it("should fill in undefined idempotency tokens", async () => { const protocol = new StringRestProtocol(); const request = await protocol.serializeRequest( op( "", "", { http: ["GET", "/{labelToken}/Operation", 200], }, [ 3, "ns", "Struct", 0, ["name", "queryToken", "labelToken", "headerToken"], [ 0, [0, { idempotencyToken: 1, httpQuery: "token" }], [0, { idempotencyToken: 1, httpLabel: 1 }], [0, { idempotencyToken: 1, httpHeader: "header-token" }], ], ] satisfies StaticStructureSchema, "unit" ), { Name: "my-name", }, { endpoint: async () => parseUrl("https://localhost/custom"), } as any ); expect(request.query?.token).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); expect(request.path).toMatch(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/); expect(request.headers?.["header-token"]).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); }); it("should not serialize http-location-bound idempotency tokens into the body", async () => { const protocol = new StringRestProtocol(); const request = await protocol.serializeRequest( op( "", "", { http: ["GET", "/Operation", 200], }, [ 3, "ns", "Struct", 0, ["headerToken", "queryToken", "body1", "body2", "bodyToken"], [ [0, { idempotencyToken: 1, httpQuery: "query-token" }], [0, { idempotencyToken: 1, httpHeader: "header-token" }], 0, 0, [0, 0b0000_0100], ], ] satisfies StaticStructureSchema, "unit" ), { headerToken: undefined, body1: "text", body2: "more text", bodyToken: undefined, }, { endpoint: async () => parseUrl("https://localhost/custom"), } as any ); expect(request.headers["header-token"]).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); expect(request.query?.["query-token"]).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); const body = JSON.parse(request.body); expect(body).toMatchObject({ body1: "text", body2: "more text", bodyToken: /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/, }); expect(body.headerToken).toBeUndefined(); }); it("should discard response bodies for Unit operation outputs, making no attempt to parse them", async () => { const protocol = new StringRestProtocol(); let streamProgress = 0; const response = await protocol.deserializeResponse( op("", "", {}, "unit", "unit"), { streamCollector: streamCollector, } as any, new HttpResponse({ statusCode: 200, headers: {}, body: Readable.from({ async *[Symbol.asyncIterator]() { yield "@"; streamProgress = 25; yield "#"; streamProgress = 50; yield "$"; streamProgress = 75; yield "%"; streamProgress = 100; }, }), }) ); expect(response).toEqual({ $metadata: { cfId: undefined, extendedRequestId: undefined, httpStatusCode: 200, requestId: undefined, }, }); expect(streamProgress).toBe(100); }); it("should not create undefined fields when deserializing non-http-binding members of an output shape", async () => { const protocol = new StringRestProtocol(); const response = new HttpResponse({ statusCode: 200, headers: {}, body: Readable.from(JSON.stringify({})), }); const output = (await protocol.deserializeResponse( op("", "", 0, "unit", [3, "", "", 0, ["prop", "num"], [0 satisfies StringSchema, 1 satisfies NumericSchema]]), { streamCollector: streamCollector, } as any, response )) as Partial; // Fields not present in response should not exist in output expect("prop" in output).toBe(false); expect("num" in output).toBe(false); // Only $metadata should be present const keys = Object.keys(output); expect(keys).toEqual(["$metadata"]); }); describe("input not mutated by serializeRequest", () => { it("considers non-object inputs to be equivalent to empty objects", async () => { const protocol = new StringRestProtocol(); for (const input of [null, undefined, 5, false, "hello", "{}"]) { const request = await protocol.serializeRequest( op( "", "", { http: ["PUT", "/resource", 200], }, [3, "ns", "Struct", 0, ["a", "b", "c"], [0, 0, 0]] satisfies StaticStructureSchema, "unit" ), input as any, { endpoint: async () => parseUrl("https://localhost"), } as any ); expect(request.path).toEqual("/resource"); expect(request.body).toEqual(undefined); } }); it("should not mutate the caller's input object", async () => { const protocol = new StringRestProtocol(); const input = Object.freeze({ labelField: "my-id", headerField: "header-val", queryField: "q", bodyField: "body-val", }); const request = await protocol.serializeRequest( op( "", "", { http: ["PUT", "/{labelField}/resource", 200], }, [ 3, "ns", "Struct", 0, ["labelField", "headerField", "queryField", "bodyField"], [[0, { httpLabel: 1 }], [0, { httpHeader: "x-header" }], [0, { httpQuery: "q" }], 0], ] satisfies StaticStructureSchema, "unit" ), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); // HTTP bindings are correctly placed expect(request.path).toContain("my-id"); expect(request.headers["x-header"]).toBe("header-val"); expect(request.query?.q).toBe("q"); // Body contains only the non-HTTP-bound member const body = JSON.parse(request.body); expect(body).toEqual({ bodyField: "body-val" }); expect(body.labelField).toBeUndefined(); expect(body.headerField).toBeUndefined(); expect(body.queryField).toBeUndefined(); // Original input is untouched (frozen object didn't throw) expect(input.labelField).toBe("my-id"); expect(input.headerField).toBe("header-val"); expect(input.queryField).toBe("q"); expect(input.bodyField).toBe("body-val"); }); it("should not leak httpPayload member into body when there are also body members", async () => { const protocol = new StringRestProtocol(); const input = Object.freeze({ payloadField: "payload-data", headerField: "hdr", }); const request = await protocol.serializeRequest( op( "", "", { http: ["POST", "/resource", 200], }, [ 3, "ns", "Struct", 0, ["payloadField", "headerField"], [ [0, { httpPayload: 1 }], [0, { httpHeader: "x-hdr" }], ], ] satisfies StaticStructureSchema, "unit" ), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); expect(request.headers["x-hdr"]).toBe("hdr"); // payload is the httpPayload member directly, not a JSON body expect(request.body).toBe("payload-data"); }); it("should not leak httpPrefixHeaders members into body", async () => { const protocol = new StringRestProtocol(); const input = Object.freeze({ prefixHeaders: { suffix1: "val1", suffix2: "val2" }, bodyField: "body-data", }); const request = await protocol.serializeRequest( op( "", "", { http: ["POST", "/resource", 200], }, [ 3, "ns", "Struct", 0, ["prefixHeaders", "bodyField"], [[[2, "", "Map", 0, 0, 0], { httpPrefixHeaders: "x-prefix-" }], 0], ] satisfies StaticStructureSchema, "unit" ), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); expect(request.headers["x-prefix-suffix1"]).toBe("val1"); expect(request.headers["x-prefix-suffix2"]).toBe("val2"); const body = JSON.parse(request.body); expect(body).toEqual({ bodyField: "body-data" }); expect(body.prefixHeaders).toBeUndefined(); }); it("should not leak httpQueryParams members into body", async () => { const protocol = new StringRestProtocol(); const input = Object.freeze({ queryParams: "qval", bodyField: "body-data", }); const request = await protocol.serializeRequest( op( "", "", { http: ["POST", "/resource", 200], }, [ 3, "ns", "Struct", 0, ["queryParams", "bodyField"], [[0, { httpQueryParams: 1 }], 0], ] satisfies StaticStructureSchema, "unit" ), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); const body = JSON.parse(request.body); expect(body).toEqual({ bodyField: "body-data" }); expect(body.queryParams).toBeUndefined(); }); }); describe("httpLabel", () => { it("should throw an error if an httpLabel is missing", async () => { const protocol = new StringRestProtocol(); await expect( protocol.serializeRequest( op( "ns", "operation", { http: ["GET", "/path/{labelGoesHere}/operation?arg=1", 200], }, [3, "ns", "Struct", 0, ["labelGoesHere"], [[0, { httpLabel: 1 }]]] satisfies StaticStructureSchema, "unit" ), {}, { endpoint: async () => parseUrl("https://localhost"), } as any ) ).rejects.toThrow("No value provided for input HTTP label: labelGoesHere."); }); it("should not throw if the request path does not contain the missing httpLabel (edge case)", async () => { const protocol = new StringRestProtocol(); await protocol.serializeRequest( op( "ns", "operation", { http: ["GET", "/path/operation?arg=1", 200], }, [3, "ns", "Struct", 0, ["labelGoesHere"], [[0, { httpLabel: 1 }]]] satisfies StaticStructureSchema, "unit" ), {}, { endpoint: async () => parseUrl("https://localhost"), } as any ); }); }); }); ================================================ FILE: packages/core/src/submodules/protocols/HttpBindingProtocol.ts ================================================ import { NormalizedSchema, translateTraits, type TypeRegistry } from "@smithy/core/schema"; import { sdkStreamMixin, splitEvery, splitHeader } from "@smithy/core/serde"; import type { DocumentSchema, Endpoint, EndpointBearer, HandlerExecutionContext, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, MetadataBearer, OperationSchema, Schema, SerdeFunctions, StaticStructureSchema, TimestampDefaultSchema, } from "@smithy/types"; import { HttpProtocol } from "./HttpProtocol"; import { collectBody } from "./collect-stream-body"; import { extendedEncodeURIComponent } from "./extended-encode-uri-component"; import { HttpRequest } from "./protocol-http/httpRequest"; /** * Base for HTTP-binding protocols. Downstream examples * include AWS REST JSON and AWS REST XML. * * @public */ export abstract class HttpBindingProtocol extends HttpProtocol { /** * @override */ protected declare compositeErrorRegistry: TypeRegistry; public async serializeRequest( operationSchema: OperationSchema, _input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise { const input: any = _input && typeof _input === "object" ? _input : {}; const serializer = this.serializer; const query = {} as Record; const headers = {} as Record; const endpoint: Endpoint = await context.endpoint(); const ns = NormalizedSchema.of(operationSchema?.input); const payloadMemberNames: StaticStructureSchema[4] = []; const payloadMemberSchemas: StaticStructureSchema[5] = []; let hasNonHttpBindingMember = false; let payload: any; const request = new HttpRequest({ protocol: "", hostname: "", port: undefined, path: "", fragment: undefined, query: query, headers: headers, body: undefined, }); if (endpoint) { this.updateServiceEndpoint(request, endpoint); this.setHostPrefix(request, operationSchema, input); const opTraits = translateTraits(operationSchema.traits); if (opTraits.http) { request.method = opTraits.http[0]; const [path, search] = opTraits.http[1].split("?"); if (request.path == "/") { request.path = path; } else { request.path += path; } const traitSearchParams = new URLSearchParams(search ?? ""); for (const [key, value] of traitSearchParams) { query[key] = value; } } } for (const [memberName, memberNs] of ns.structIterator()) { const memberTraits = memberNs.getMergedTraits() ?? {}; const inputMemberValue = input[memberName]; if (inputMemberValue == null && !memberNs.isIdempotencyToken()) { if (memberTraits.httpLabel) { // at this point, we have a modeled httpLabel which has no input value. // We only throw if the request URI has a corresponding unfulfilled label. // It would be unusual for the request path not to contain the label, perhaps a modeling // error, but best to be conservative about throwing. if (request.path.includes(`{${memberName}+}`) || request.path.includes(`{${memberName}}`)) { throw new Error(`No value provided for input HTTP label: ${memberName}.`); } } continue; } if (memberTraits.httpPayload) { const isStreaming = memberNs.isStreaming(); if (isStreaming) { const isEventStream = memberNs.isStructSchema(); if (isEventStream) { // event stream (union) // initial-request is handled by other HTTP bindings. // no additional handling is needed here. if (input[memberName]) { payload = await this.serializeEventStream({ eventStream: input[memberName], requestSchema: ns, }); } } else { // data stream (blob) payload = inputMemberValue; } } else { // structural/document body serializer.write(memberNs, inputMemberValue); payload = serializer.flush(); } } else if (memberTraits.httpLabel) { serializer.write(memberNs, inputMemberValue); const replacement = serializer.flush() as string; if (request.path.includes(`{${memberName}+}`)) { request.path = request.path.replace( `{${memberName}+}`, replacement.split("/").map(extendedEncodeURIComponent).join("/") ); } else if (request.path.includes(`{${memberName}}`)) { request.path = request.path.replace(`{${memberName}}`, extendedEncodeURIComponent(replacement)); } } else if (memberTraits.httpHeader) { serializer.write(memberNs, inputMemberValue); headers[memberTraits.httpHeader.toLowerCase() as string] = String(serializer.flush()); } else if (typeof memberTraits.httpPrefixHeaders === "string") { for (const key in inputMemberValue) { const val = inputMemberValue[key]; const amalgam = memberTraits.httpPrefixHeaders + key; serializer.write([memberNs.getValueSchema(), { httpHeader: amalgam }], val); headers[amalgam.toLowerCase()] = serializer.flush() as string; } } else if (memberTraits.httpQuery || memberTraits.httpQueryParams) { this.serializeQuery(memberNs, inputMemberValue, query); } else { hasNonHttpBindingMember = true; payloadMemberNames.push(memberName); payloadMemberSchemas.push(memberNs); } } if (hasNonHttpBindingMember && input) { const [namespace, name] = (ns.getName(true) ?? "#Unknown").split("#"); const requiredMembers = (ns.getSchema() as StaticStructureSchema)[6]; const payloadSchema = [ 3, namespace, name, ns.getMergedTraits(), payloadMemberNames, payloadMemberSchemas, undefined as number | undefined, ] satisfies StaticStructureSchema; if (requiredMembers) { payloadSchema[6] = requiredMembers; } else { payloadSchema.pop(); } serializer.write(payloadSchema, input); payload = serializer.flush() as Uint8Array; // Due to Smithy validation, we can assume that the members with no HTTP // bindings DO NOT contain an event stream. } request.headers = headers; request.query = query; request.body = payload; return request; } protected serializeQuery(ns: NormalizedSchema, data: any, query: HttpRequest["query"]) { const serializer = this.serializer; const traits = ns.getMergedTraits(); if (traits.httpQueryParams) { for (const key in data) { if (!(key in query)) { const val = data[key]; const valueSchema = ns.getValueSchema(); Object.assign(valueSchema.getMergedTraits(), { // We pass on the traits to the sub-schema // because we are still in the process of serializing the map itself. ...traits, httpQuery: key, httpQueryParams: undefined, }); this.serializeQuery(valueSchema, val, query); } } return; } if (ns.isListSchema()) { const sparse = !!ns.getMergedTraits().sparse; const buffer = []; for (const item of data) { // We pass on the traits to the sub-schema // because we are still in the process of serializing the list itself. serializer.write([ns.getValueSchema(), traits], item); const serializable = serializer.flush() as string; if (sparse || serializable !== undefined) { buffer.push(serializable); } } query[traits.httpQuery as string] = buffer; } else { serializer.write([ns, traits], data); query[traits.httpQuery as string] = serializer.flush() as string; } } public async deserializeResponse( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse ): Promise { const deserializer = this.deserializer; const ns = NormalizedSchema.of(operationSchema.output); const dataObject: any = {}; if (response.statusCode >= 300) { const bytes: Uint8Array = await collectBody(response.body, context); if (bytes.byteLength > 0) { Object.assign(dataObject, await deserializer.read(15 satisfies DocumentSchema, bytes)); } await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response)); throw new Error("@smithy/core/protocols - HTTP Protocol error handler failed to throw."); } for (const header in response.headers) { const value = response.headers[header]; delete response.headers[header]; response.headers[header.toLowerCase()] = value; } const nonHttpBindingMembers = await this.deserializeHttpMessage(ns, context, response, dataObject); if (nonHttpBindingMembers.length) { const bytes: Uint8Array = await collectBody(response.body, context); if (bytes.byteLength > 0) { const dataFromBody = await deserializer.read(ns, bytes); for (const member of nonHttpBindingMembers) { if (dataFromBody[member] != null) { dataObject[member] = dataFromBody[member]; } } } // Due to Smithy validation, we can assume that the members with no HTTP // bindings DO NOT contain an event stream. } else if (nonHttpBindingMembers.discardResponseBody) { await collectBody(response.body, context); } dataObject.$metadata = this.deserializeMetadata(response); return dataObject; } /** * The base method ignores HTTP bindings. * * @deprecated (only this signature) use signature without headerBindings. * @override */ protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, headerBindings: Set, dataObject: any ): Promise; protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any ): Promise; protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, arg4: unknown, arg5?: unknown ): Promise { let dataObject: any; if (arg4 instanceof Set) { dataObject = arg5; } else { dataObject = arg4; } let discardResponseBody = true; const deserializer = this.deserializer; const ns = NormalizedSchema.of(schema); const nonHttpBindingMembers = [] as string[] & { discardResponseBody?: boolean }; for (const [memberName, memberSchema] of ns.structIterator()) { const memberTraits = memberSchema.getMemberTraits(); if (memberTraits.httpPayload) { discardResponseBody = false; const isStreaming = memberSchema.isStreaming(); if (isStreaming) { const isEventStream = memberSchema.isStructSchema(); if (isEventStream) { // event stream (union) // initial-response is handled by other HTTP bindings. dataObject[memberName] = await this.deserializeEventStream({ response, responseSchema: ns, }); } else { // data stream (blob) dataObject[memberName] = sdkStreamMixin(response.body); } } else if (response.body) { const bytes: Uint8Array = await collectBody(response.body, context as SerdeFunctions); if (bytes.byteLength > 0) { dataObject[memberName] = await deserializer.read(memberSchema, bytes); } } } else if (memberTraits.httpHeader) { const key = String(memberTraits.httpHeader).toLowerCase(); const value = response.headers[key]; if (null != value) { if (memberSchema.isListSchema()) { const headerListValueSchema = memberSchema.getValueSchema(); headerListValueSchema.getMergedTraits().httpHeader = key; let sections: string[]; if ( headerListValueSchema.isTimestampSchema() && headerListValueSchema.getSchema() === (4 satisfies TimestampDefaultSchema) ) { sections = splitEvery(value, ",", 2); } else { sections = splitHeader(value); } const list = []; for (const section of sections) { list.push(await deserializer.read(headerListValueSchema, section.trim())); } dataObject[memberName] = list; } else { dataObject[memberName] = await deserializer.read(memberSchema, value); } } } else if (memberTraits.httpPrefixHeaders !== undefined) { dataObject[memberName] = {}; for (const header in response.headers) { if (header.startsWith(memberTraits.httpPrefixHeaders)) { const value = response.headers[header]; const valueSchema = memberSchema.getValueSchema(); valueSchema.getMergedTraits().httpHeader = header; dataObject[memberName][header.slice(memberTraits.httpPrefixHeaders.length)] = await deserializer.read( valueSchema, value ); } } } else if (memberTraits.httpResponseCode) { dataObject[memberName] = response.statusCode; } else { nonHttpBindingMembers.push(memberName); } } nonHttpBindingMembers.discardResponseBody = discardResponseBody; return nonHttpBindingMembers; } } ================================================ FILE: packages/core/src/submodules/protocols/HttpProtocol.spec.ts ================================================ import { map, struct } from "@smithy/core/schema"; import { HttpRequest } from "@smithy/protocol-http"; import type { EndpointV2, HandlerExecutionContext, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, Schema, SerdeFunctions, TimestampEpochSecondsSchema, } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { HttpProtocol } from "./HttpProtocol"; import { FromStringShapeDeserializer } from "./serde/FromStringShapeDeserializer"; describe(HttpProtocol.name, () => { describe("updateServiceEndpoint", () => { it("applies endpoint-resolved headers to the request", () => { const request = new HttpRequest({ headers: { "content-type": "application/json" } }); const endpoint: EndpointV2 = { url: new URL("https://api.example.com/"), headers: { "x-api-key": ["my-api-key"], "x-custom-header": ["value1", "value2"], }, }; HttpProtocol.prototype.updateServiceEndpoint(request, endpoint); expect(request.headers).toEqual({ "content-type": "application/json", "x-api-key": "my-api-key", "x-custom-header": "value1, value2", }); }); it("handles endpoint with no headers", () => { const request = new HttpRequest({ headers: { "content-type": "application/json" } }); const endpoint: EndpointV2 = { url: new URL("https://api.example.com/"), }; HttpProtocol.prototype.updateServiceEndpoint(request, endpoint); expect(request.headers).toEqual({ "content-type": "application/json" }); }); }); it("ignores http bindings (only HttpBindingProtocol uses them)", async () => { type TestSignature = ( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any ) => Promise; const deserializeHttpMessage = ((HttpProtocol.prototype as any).deserializeHttpMessage as TestSignature).bind({ deserializer: new FromStringShapeDeserializer({ httpBindings: true, timestampFormat: { useTrait: true, default: 7 satisfies TimestampEpochSecondsSchema, }, }), }); const httpResponse: IHttpResponse = { statusCode: 200, headers: { "my-header": "header-value", }, }; const dataObject = {}; await deserializeHttpMessage( struct( "", "Struct", 0, ["prefixHeaders", "header"], [ [map("", "Map", 0, 0, 0), { httpPrefixHeaders: "my-" }], [0, { httpHeader: "my-header" }], ] ), {} as any, httpResponse, dataObject ); expect(dataObject).toEqual({ // headers were ignored }); }); }); ================================================ FILE: packages/core/src/submodules/protocols/HttpProtocol.ts ================================================ import type { EventStreamSerde } from "@smithy/core/event-streams"; import { NormalizedSchema, TypeRegistry, translateTraits } from "@smithy/core/schema"; import type { ClientProtocol, Codec, Endpoint, EndpointBearer, EndpointV2, EventStreamMarshaller, EventStreamSerdeContext, HandlerExecutionContext, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, MetadataBearer, OperationSchema, ResponseMetadata, Schema, SerdeFunctions, ShapeDeserializer, ShapeSerializer, } from "@smithy/types"; import { SerdeContext } from "./SerdeContext"; import { HttpRequest } from "./protocol-http/httpRequest"; import { HttpResponse } from "./protocol-http/httpResponse"; /** * Abstract base for HTTP-based client protocols. * * @public */ export abstract class HttpProtocol extends SerdeContext implements ClientProtocol { /** * An error registry having the namespace of the modeled service, * but combining all error schemas found within the service closure. * * Used to look up error schema during deserialization. */ protected compositeErrorRegistry: TypeRegistry; protected abstract serializer: ShapeSerializer; protected abstract deserializer: ShapeDeserializer; /** * @param options.defaultNamespace - used by various implementing classes. * @param options.errorTypeRegistries - registry instances that contribute to error deserialization. */ protected constructor( public readonly options: { defaultNamespace: string; errorTypeRegistries?: TypeRegistry[]; } ) { super(); this.compositeErrorRegistry = TypeRegistry.for(options.defaultNamespace); for (const etr of options.errorTypeRegistries ?? []) { this.compositeErrorRegistry.copyFrom(etr); } } public abstract getShapeId(): string; public abstract getPayloadCodec(): Codec; public getRequestType(): new (...args: any[]) => IHttpRequest { return HttpRequest; } public getResponseType(): new (...args: any[]) => IHttpResponse { return HttpResponse; } /** * @override */ public setSerdeContext(serdeContext: SerdeFunctions): void { this.serdeContext = serdeContext; this.serializer.setSerdeContext(serdeContext); this.deserializer.setSerdeContext(serdeContext); if (this.getPayloadCodec()) { this.getPayloadCodec().setSerdeContext(serdeContext); } } public abstract serializeRequest( operationSchema: OperationSchema, input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise; public updateServiceEndpoint(request: IHttpRequest, endpoint: EndpointV2 | Endpoint) { if ("url" in endpoint) { request.protocol = endpoint.url.protocol; request.hostname = endpoint.url.hostname; request.port = endpoint.url.port ? Number(endpoint.url.port) : undefined; request.path = endpoint.url.pathname; request.fragment = endpoint.url.hash || void 0; request.username = endpoint.url.username || void 0; request.password = endpoint.url.password || void 0; if (!request.query) { request.query = {}; } for (const [k, v] of endpoint.url.searchParams.entries()) { request.query[k] = v; } // Apply resolved endpoint headers per Endpoints 2.0 spec. if (endpoint.headers) { for (const name in endpoint.headers) { request.headers[name] = endpoint.headers[name].join(", "); } } return request; } else { request.protocol = endpoint.protocol; request.hostname = endpoint.hostname; request.port = endpoint.port ? Number(endpoint.port) : undefined; request.path = endpoint.path; request.query = { ...endpoint.query, }; // Apply endpoint headers for deprecated Endpoint type if present if (endpoint.headers) { for (const name in endpoint.headers) { request.headers[name] = endpoint.headers[name]; } } return request; } } public abstract deserializeResponse( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse ): Promise; protected setHostPrefix( request: IHttpRequest, operationSchema: OperationSchema, input: Input ): void { if (this.serdeContext?.disableHostPrefix) { return; } const inputNs = NormalizedSchema.of(operationSchema.input); const opTraits = translateTraits(operationSchema.traits ?? {}); if (opTraits.endpoint) { let hostPrefix = opTraits.endpoint?.[0]; if (typeof hostPrefix === "string") { for (const [name, member] of inputNs.structIterator()) { if (!member.getMergedTraits().hostLabel) { continue; } const replacement = input[name as keyof typeof input]; if (typeof replacement !== "string") { throw new Error(`@smithy/core/schema - ${name} in input must be a string as hostLabel.`); } hostPrefix = hostPrefix.replace(`{${name}}`, replacement); } request.hostname = hostPrefix + request.hostname; } } } protected abstract handleError( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any, metadata: ResponseMetadata ): Promise; protected deserializeMetadata(output: IHttpResponse): ResponseMetadata { return { httpStatusCode: output.statusCode, requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"], extendedRequestId: output.headers["x-amz-id-2"], cfId: output.headers["x-amz-cf-id"], }; } /** * @param eventStream - the iterable provided by the caller. * @param requestSchema - the schema of the event stream container (struct). * @param [initialRequest] - only provided if the initial-request is part of the event stream (RPC). * * @returns a stream suitable for the HTTP body of a request. */ protected async serializeEventStream({ eventStream, requestSchema, initialRequest, }: { eventStream: AsyncIterable; requestSchema: NormalizedSchema; initialRequest?: any; }): Promise { const eventStreamSerde = await this.loadEventStreamCapability(); return eventStreamSerde.serializeEventStream({ eventStream, requestSchema, initialRequest, }); } /** * @param response - http response from which to read the event stream. * @param unionSchema - schema of the event stream container (struct). * @param [initialResponseContainer] - provided and written to only if the initial response is part of the event stream (RPC). * * @returns the asyncIterable of the event stream. */ protected async deserializeEventStream({ response, responseSchema, initialResponseContainer, }: { response: IHttpResponse; responseSchema: NormalizedSchema; initialResponseContainer?: any; }): Promise> { const eventStreamSerde = await this.loadEventStreamCapability(); return eventStreamSerde.deserializeEventStream({ response, responseSchema, initialResponseContainer, }); } /** * Loads eventStream capability async (for chunking). */ protected async loadEventStreamCapability(): Promise { const { EventStreamSerde } = await import("@smithy/core/event-streams"); return new EventStreamSerde({ marshaller: this.getEventStreamMarshaller(), serializer: this.serializer, deserializer: this.deserializer, serdeContext: this.serdeContext, defaultContentType: this.getDefaultContentType(), }); } /** * @returns content-type default header value for event stream events and other documents. */ protected getDefaultContentType(): string { throw new Error( `@smithy/core/protocols - ${this.constructor.name} getDefaultContentType() implementation missing.` ); } /** * For HTTP binding protocols, this method is overridden in {@link HttpBindingProtocol}. * * @deprecated only use this for HTTP binding protocols. */ protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, headerBindings: Set, dataObject: any ): Promise; protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, dataObject: any ): Promise; protected async deserializeHttpMessage( schema: Schema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse, arg4: unknown, arg5?: unknown ): Promise { void schema; void context; void response; void arg4; void arg5; // This method is preserved for backwards compatibility. // It should remain unused. return []; } protected getEventStreamMarshaller(): EventStreamMarshaller { const context = this.serdeContext as unknown as EventStreamSerdeContext; if (!context.eventStreamMarshaller) { throw new Error("@smithy/core - HttpProtocol: eventStreamMarshaller missing in serdeContext."); } return context.eventStreamMarshaller; } } ================================================ FILE: packages/core/src/submodules/protocols/RpcProtocol.spec.ts ================================================ import { NormalizedSchema, op } from "@smithy/core/schema"; import type { $Schema, $ShapeSerializer, Codec, CodecSettings, HandlerExecutionContext, HttpResponse as IHttpResponse, OperationSchema, ResponseMetadata, ShapeDeserializer, ShapeSerializer, StaticStructureSchema, } from "@smithy/types"; import { parseUrl } from "@smithy/url-parser"; import { describe, expect, test as it } from "vitest"; import { RpcProtocol } from "./RpcProtocol"; import { SerdeContext } from "./SerdeContext"; import { FromStringShapeDeserializer } from "./serde/FromStringShapeDeserializer"; describe(RpcProtocol.name, () => { /** * Minimal serializer that records what schema+value pairs were written, * and produces a JSON string on flush. */ class SpyShapeSerializer extends SerdeContext implements $ShapeSerializer { public writeCalls: Array<{ schema: $Schema; value: unknown }> = []; private buffer = ""; public constructor(private settings: CodecSettings) { super(); } public write(schema: $Schema, value: unknown): void { this.writeCalls.push({ schema, value }); const ns = NormalizedSchema.of(schema); if (typeof value === "object" && value !== null && !Array.isArray(value)) { const entries: string[] = []; for (const [k, memberSchema] of ns.structIterator()) { const v = (value as any)[k]; if (v != null) { entries.push(`"${k}":"${v}"`); } } this.buffer = `{${entries.join(",")}}`; } else { this.buffer = JSON.stringify(value); } } public flush(): string { const result = this.buffer; this.buffer = ""; return result; } } class TestRpcProtocol extends RpcProtocol { protected serializer: ShapeSerializer; protected deserializer: ShapeDeserializer; public spySerializer: SpyShapeSerializer; public constructor() { super({ defaultNamespace: "", errorTypeRegistries: [], }); const settings: CodecSettings = { timestampFormat: { useTrait: true, default: 7 }, httpBindings: false, }; this.spySerializer = new SpyShapeSerializer(settings); this.serializer = this.spySerializer; this.deserializer = new FromStringShapeDeserializer(settings); } public getShapeId(): string { throw new Error("Method not implemented."); } public getPayloadCodec(): Codec { throw new Error("Method not implemented."); } protected handleError( operationSchema: OperationSchema, context: HandlerExecutionContext, response: IHttpResponse, dataObject: any, metadata: ResponseMetadata ): Promise { void [operationSchema, context, response, dataObject, metadata]; throw new Error("Method not implemented."); } } it("should not mutate the caller's input object", async () => { const protocol = new TestRpcProtocol(); const input = Object.freeze({ fieldA: "hello", fieldB: "world", }); const request = await protocol.serializeRequest( op("", "", 0, [3, "ns", "Struct", 0, ["fieldA", "fieldB"], [0, 0]] satisfies StaticStructureSchema, "unit"), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); // The serializer received the full input const body = JSON.parse(request.body); expect(body).toEqual({ fieldA: "hello", fieldB: "world" }); // Original input is untouched expect(input.fieldA).toBe("hello"); expect(input.fieldB).toBe("world"); }); it("should pass the original input reference to serializer.write (no spread copy)", async () => { const protocol = new TestRpcProtocol(); const input = { fieldA: "value" }; await protocol.serializeRequest( op("", "", 0, [3, "ns", "Struct", 0, ["fieldA"], [0]] satisfies StaticStructureSchema, "unit"), input, { endpoint: async () => parseUrl("https://localhost"), } as any ); // The serializer should have received the exact same object reference expect(protocol.spySerializer.writeCalls).toHaveLength(1); expect(protocol.spySerializer.writeCalls[0].value).toBe(input); }); it("should handle null/undefined input without throwing", async () => { const protocol = new TestRpcProtocol(); const request = await protocol.serializeRequest( op("", "", 0, "unit", "unit"), null as any, { endpoint: async () => parseUrl("https://localhost"), } as any ); expect(request.body).toEqual("{}"); expect(request.method).toBe("POST"); }); it("considers non-object inputs to be equivalent to empty objects", async () => { const protocol = new TestRpcProtocol(); for (const input of [null, undefined, 5, false, "hello", "{}"]) { const request = await protocol.serializeRequest( op("", "", {}, [3, "ns", "Struct", 0, ["a", "b", "c"], [0, 0, 0]] satisfies StaticStructureSchema, "unit"), input as any, { endpoint: async () => parseUrl("https://localhost"), } as any ); expect(request.path).toEqual("/"); expect(request.body).toEqual("{}"); } }); }); ================================================ FILE: packages/core/src/submodules/protocols/RpcProtocol.ts ================================================ import { NormalizedSchema, type TypeRegistry } from "@smithy/core/schema"; import type { DocumentSchema, Endpoint, EndpointBearer, HandlerExecutionContext, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, MetadataBearer, OperationSchema, SerdeFunctions, } from "@smithy/types"; import { HttpProtocol } from "./HttpProtocol"; import { collectBody } from "./collect-stream-body"; import { HttpRequest } from "./protocol-http/httpRequest"; /** * Abstract base for RPC-over-HTTP protocols. * * @public */ export abstract class RpcProtocol extends HttpProtocol { /** * @override */ protected declare compositeErrorRegistry: TypeRegistry; public async serializeRequest( operationSchema: OperationSchema, _input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise { const serializer = this.serializer; const query = {} as Record; const headers = {} as Record; const endpoint: Endpoint = await context.endpoint(); const ns = NormalizedSchema.of(operationSchema?.input); const schema = ns.getSchema(); let payload: any; const input: any = _input && typeof _input === "object" ? _input : {}; const request = new HttpRequest({ protocol: "", hostname: "", port: undefined, path: "/", fragment: undefined, query: query, headers: headers, body: undefined, }); if (endpoint) { this.updateServiceEndpoint(request, endpoint); this.setHostPrefix(request, operationSchema, input); } if (input) { const eventStreamMember = ns.getEventStreamMember(); if (eventStreamMember) { if (input[eventStreamMember]) { const initialRequest = {} as any; for (const [memberName, memberSchema] of ns.structIterator()) { if (memberName !== eventStreamMember && input[memberName]) { serializer.write(memberSchema, input[memberName]); initialRequest[memberName] = serializer.flush(); } } payload = await this.serializeEventStream({ eventStream: input[eventStreamMember], requestSchema: ns, initialRequest, }); } } else { serializer.write(schema, input); payload = serializer.flush() as Uint8Array; } } request.headers = Object.assign(request.headers, headers); request.query = query; request.body = payload; request.method = "POST"; return request; } public async deserializeResponse( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: IHttpResponse ): Promise { const deserializer = this.deserializer; const ns = NormalizedSchema.of(operationSchema.output); const dataObject: any = {}; if (response.statusCode >= 300) { const bytes: Uint8Array = await collectBody(response.body, context as SerdeFunctions); if (bytes.byteLength > 0) { Object.assign(dataObject, await deserializer.read(15 satisfies DocumentSchema, bytes)); } await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response)); throw new Error("@smithy/core/protocols - RPC Protocol error handler failed to throw."); } for (const header in response.headers) { const value = response.headers[header]; delete response.headers[header]; response.headers[header.toLowerCase()] = value; } const eventStreamMember = ns.getEventStreamMember(); if (eventStreamMember) { dataObject[eventStreamMember] = await this.deserializeEventStream({ response, responseSchema: ns, initialResponseContainer: dataObject, }); } else { const bytes: Uint8Array = await collectBody(response.body, context as SerdeFunctions); if (bytes.byteLength > 0) { Object.assign(dataObject, await deserializer.read(ns, bytes)); } } dataObject.$metadata = this.deserializeMetadata(response); return dataObject; } } ================================================ FILE: packages/core/src/submodules/protocols/SerdeContext.ts ================================================ import type { ConfigurableSerdeContext, SerdeFunctions } from "@smithy/types"; /** * This in practice should be the client config object. * @internal */ type SerdeContextType = SerdeFunctions & { disableHostPrefix?: boolean; }; /** * @internal */ export abstract class SerdeContext implements ConfigurableSerdeContext { protected serdeContext?: SerdeContextType; public setSerdeContext(serdeContext: SerdeContextType): void { this.serdeContext = serdeContext; } } ================================================ FILE: packages/core/src/submodules/protocols/collect-stream-body.spec.ts ================================================ import { Uint8ArrayBlobAdapter } from "@smithy/core/serde"; import { describe, expect, test as it } from "vitest"; import { collectBody } from "./collect-stream-body"; describe(collectBody.name, () => { it("passes through Uint8Array", async () => { const body = new Uint8Array(); const arr = await collectBody(body, { async streamCollector(stream: any) { return new Uint8Array(stream); }, }); expect(arr).toBe(body); }); it("uses the contextual streamCollector", async () => { const body = "x"; const arr = await collectBody(body, { async streamCollector(stream: any) { return Uint8ArrayBlobAdapter.fromString(stream); }, }); expect(arr.transformToString()).toEqual("x"); }); it("uses the contextual streamCollector for empty string", async () => { const body = ""; const arr = await collectBody(body, { async streamCollector(stream: any) { return Uint8ArrayBlobAdapter.fromString(stream); }, }); expect(arr.transformToString()).toEqual(""); }); it("defaults to an empty Uint8Array", async () => { const body = null; const arr = await collectBody(body, { async streamCollector(stream: any) { return Uint8ArrayBlobAdapter.fromString(stream); }, }); expect(arr.transformToString()).toEqual(""); }); }); ================================================ FILE: packages/core/src/submodules/protocols/collect-stream-body.ts ================================================ import { Uint8ArrayBlobAdapter } from "@smithy/core/serde"; import type { SerdeContext } from "@smithy/types"; /** * Collect low-level response body stream to Uint8Array. * * @internal */ export const collectBody = async ( streamBody: any = new Uint8Array(), context: { streamCollector: SerdeContext["streamCollector"]; } ): Promise => { if (streamBody instanceof Uint8Array) { return Uint8ArrayBlobAdapter.mutate(streamBody); } if (!streamBody) { return Uint8ArrayBlobAdapter.mutate(new Uint8Array()); } const fromContext = context.streamCollector(streamBody); return Uint8ArrayBlobAdapter.mutate(await fromContext); }; ================================================ FILE: packages/core/src/submodules/protocols/extended-encode-uri-component.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { extendedEncodeURIComponent } from "./extended-encode-uri-component"; describe(extendedEncodeURIComponent.name, () => { const encodedValues: [string, string][] = [ ["!", "%21"], ["'", "%27"], ["(", "%28"], [")", "%29"], ["*", "%2A"], ]; const verify = (table: [string, string][]) => { it.each(table)(`encodes %s as %s`, (input, output) => { expect(extendedEncodeURIComponent(input)).toStrictEqual(output); }); }; verify(encodedValues); verify([encodedValues.reduce((acc, [input, output]) => [acc[0].concat(input), acc[1].concat(output)], ["", ""])]); }); ================================================ FILE: packages/core/src/submodules/protocols/extended-encode-uri-component.ts ================================================ /** * Function that wraps encodeURIComponent to encode additional characters * to fully adhere to RFC 3986. * * @internal */ export function extendedEncodeURIComponent(str: string): string { return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { return "%" + c.charCodeAt(0).toString(16).toUpperCase(); }); } ================================================ FILE: packages/core/src/submodules/protocols/index.ts ================================================ export * from "./collect-stream-body"; export * from "./extended-encode-uri-component"; export * from "./HttpBindingProtocol"; export * from "./HttpProtocol"; export * from "./RpcProtocol"; export * from "./requestBuilder"; export * from "./resolve-path"; export * from "./serde/FromStringShapeDeserializer"; export * from "./serde/HttpInterceptingShapeDeserializer"; export * from "./serde/HttpInterceptingShapeSerializer"; export * from "./serde/ToStringShapeSerializer"; export * from "./serde/determineTimestampFormat"; export * from "./SerdeContext"; // @smithy/protocol-http export { Field } from "./protocol-http/Field"; export { Fields, type FieldsOptions } from "./protocol-http/Fields"; export { type HttpHandler, type HttpHandlerUserInput } from "./protocol-http/httpHandler"; export { HttpRequest, type IHttpRequest } from "./protocol-http/httpRequest"; export { HttpResponse } from "./protocol-http/httpResponse"; export { isValidHostname } from "./protocol-http/isValidHostname"; export { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, type HttpHandlerExtensionConfiguration, type HttpHandlerExtensionConfigType, } from "./protocol-http/extensions/httpExtensionConfiguration"; export { type FieldOptions, type FieldPosition, type HeaderBag, type HttpMessage, type HttpHandlerOptions, } from "./protocol-http/types"; // @smithy/middleware-content-length export { contentLengthMiddleware, contentLengthMiddlewareOptions, getContentLengthPlugin, } from "./middleware-content-length/contentLengthMiddleware"; // @smithy/util-uri-escape export { escapeUri } from "./util-uri-escape/escape-uri"; export { escapeUriPath } from "./util-uri-escape/escape-uri-path"; // @smithy/querystring-builder export { buildQueryString } from "./querystring-builder/buildQueryString"; // @smithy/querystring-parser export { parseQueryString } from "./querystring-parser/parseQueryString"; // @smithy/url-parser export { parseUrl } from "./url-parser/parseUrl"; ================================================ FILE: packages/core/src/submodules/protocols/middleware-content-length/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/protocol-http@5.3.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/protocol-http@5.3.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/protocol-http@5.3.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/protocol-http@5.3.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/protocol-http@5.3.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/protocol-http@5.3.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/protocol-http@5.3.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/protocol-http@5.3.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/protocol-http@5.3.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/protocol-http@5.3.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/protocol-http@5.3.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/protocol-http@5.2.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/protocol-http@5.2.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/protocol-http@5.1.3 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/protocol-http@5.1.2 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/protocol-http@5.1.1 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/protocol-http@5.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 ## 3.0.13 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/protocol-http@4.1.8 ## 3.0.12 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/protocol-http@4.1.7 ## 3.0.11 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/protocol-http@4.1.6 ## 3.0.10 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/protocol-http@4.1.5 ## 3.0.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/protocol-http@4.1.4 ## 3.0.8 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/protocol-http@4.1.3 ## 3.0.7 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/protocol-http@4.1.2 ## 3.0.6 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/protocol-http@4.1.1 ## 3.0.5 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 3.0.4 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/protocol-http@4.0.3 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/protocol-http@4.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/protocol-http@4.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/protocol-http@4.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/protocol-http@3.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/protocol-http@3.2.2 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/protocol-http@3.2.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/protocol-http@3.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/protocol-http@3.1.0 - @smithy/types@2.9.0 ## 2.0.18 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/protocol-http@3.0.12 ## 2.0.17 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/protocol-http@3.0.11 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/protocol-http@3.0.10 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/protocol-http@3.0.9 ## 2.0.14 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/protocol-http@3.0.8 ## 2.0.13 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/protocol-http@3.0.7 ## 2.0.12 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/protocol-http@3.0.6 ## 2.0.11 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/protocol-http@3.0.5 ## 2.0.10 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/protocol-http@3.0.4 ## 2.0.9 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/protocol-http@3.0.3 ## 2.0.8 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 2.0.7 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 ## 2.0.5 ### Patch Changes - 1be3c4c9: Add integration tests - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/protocol-http@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/protocol-http@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/protocol-http@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/protocol-http@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/protocol-http@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/protocol-http@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/protocol-http@1.2.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/protocol-http@1.1.2 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/protocol-http@1.1.1 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-content-length](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-content-length/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/middleware-content-length/contentLengthMiddleware.ts ================================================ import type { BodyLengthCalculator, BuildHandler, BuildHandlerArguments, BuildHandlerOptions, BuildHandlerOutput, BuildMiddleware, MetadataBearer, Pluggable, } from "@smithy/types"; import { HttpRequest } from "../protocol-http/httpRequest"; const CONTENT_LENGTH_HEADER = "content-length"; export function contentLengthMiddleware(bodyLengthChecker: BodyLengthCalculator): BuildMiddleware { return (next: BuildHandler): BuildHandler => async (args: BuildHandlerArguments): Promise> => { const request = args.request; if (HttpRequest.isInstance(request)) { const { body, headers } = request; if ( body && Object.keys(headers) .map((str) => str.toLowerCase()) .indexOf(CONTENT_LENGTH_HEADER) === -1 ) { try { const length = bodyLengthChecker(body); request.headers = { ...request.headers, [CONTENT_LENGTH_HEADER]: String(length), }; } catch (error) { // ToDo: Add 'transfer-encoding' as chunked only for HTTP/1.1 request // Refs: https://github.com/aws/aws-sdk-js-v3/pull/3403 } } } return next({ ...args, request, }); }; } export const contentLengthMiddlewareOptions: BuildHandlerOptions = { step: "build", tags: ["SET_CONTENT_LENGTH", "CONTENT_LENGTH"], name: "contentLengthMiddleware", override: true, }; export const getContentLengthPlugin = (options: { bodyLengthChecker: BodyLengthCalculator }): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(contentLengthMiddleware(options.bodyLengthChecker), contentLengthMiddlewareOptions); }, }); ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 5.3.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 5.3.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 5.3.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 5.3.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 5.3.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 5.3.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 5.3.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 5.3.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 5.3.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 5.3.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 5.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 5.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 5.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 5.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 5.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 5.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 5.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 5.1.3 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 5.1.2 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 5.1.1 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 5.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 5.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 5.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 4.1.8 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 4.1.7 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 4.1.6 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 4.1.5 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 4.1.4 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 4.1.3 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 4.1.2 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 4.1.1 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 4.1.0 ### Minor Changes - 86862ea: switch to static HttpRequest clone method ## 4.0.4 ### Patch Changes - 796567d: add guidance for HttpRequest cloning ## 4.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 4.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 3.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 3.2.2 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 3.2.1 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 3.2.0 ### Minor Changes - 929801bc: allow constructor parameters pass-through when initializing requestHandler ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 3.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 3.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 3.0.12 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 3.0.11 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 3.0.10 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 3.0.9 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 3.0.8 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 3.0.7 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 3.0.6 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 3.0.5 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 3.0.4 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 3.0.3 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 3.0.2 ### Patch Changes - 5b3fec37: Fix default HttpHandlerConfig type for HttpHandler ## 3.0.1 ### Patch Changes - 5db648a6: Add default generic type to HttpHandler ## 3.0.0 ### Major Changes - a03026e3: Add http client component to runtime extension ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.2.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.1.2 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.1.1 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.1.0 ### Minor Changes - adedc001c: Move types to @smithy/types ### Patch Changes - Updated dependencies [adedc001c] - @smithy/types@1.1.0 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/protocol-http](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/protocol-http/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/Field.ts ================================================ import { FieldPosition, type FieldOptions } from "@smithy/types"; /** * A name-value pair representing a single field * transmitted in an HTTP Request or Response. * * The kind will dictate metadata placement within * an HTTP message. * * All field names are case insensitive and * case-variance must be treated as equivalent. * Names MAY be normalized but SHOULD be preserved * for accuracy during transmission. */ export class Field { public readonly name: string; public readonly kind: FieldPosition; public values: string[]; constructor({ name, kind = FieldPosition.HEADER, values = [] }: FieldOptions) { this.name = name; this.kind = kind; this.values = values; } /** * Appends a value to the field. * * @param value The value to append. */ public add(value: string): void { this.values.push(value); } /** * Overwrite existing field values. * * @param values The new field values. */ public set(values: string[]): void { this.values = values; } /** * Remove all matching entries from list. * * @param value Value to remove. */ public remove(value: string): void { this.values = this.values.filter((v) => v !== value); } /** * Get comma-delimited string. * * @returns String representation of {@link Field}. */ public toString(): string { // Values with spaces or commas MUST be double-quoted return this.values.map((v) => (v.includes(",") || v.includes(" ") ? `"${v}"` : v)).join(", "); } /** * Get string values as a list * * @returns Values in {@link Field} as a list. */ public get(): string[] { return this.values; } } ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/Fields.ts ================================================ import type { FieldPosition } from "@smithy/types"; import type { Field } from "./Field"; export type FieldsOptions = { fields?: Field[]; encoding?: string }; /** * Collection of Field entries mapped by name. */ export class Fields { private readonly entries: Record = {}; private readonly encoding: string; constructor({ fields = [], encoding = "utf-8" }: FieldsOptions) { fields.forEach(this.setField.bind(this)); this.encoding = encoding; } /** * Set entry for a {@link Field} name. The `name` * attribute will be used to key the collection. * * @param field The {@link Field} to set. */ public setField(field: Field): void { this.entries[field.name.toLowerCase()] = field; } /** * Retrieve {@link Field} entry by name. * * @param name The name of the {@link Field} entry * to retrieve * @returns The {@link Field} if it exists. */ public getField(name: string): Field | undefined { return this.entries[name.toLowerCase()]; } /** * Delete entry from collection. * * @param name Name of the entry to delete. */ public removeField(name: string): void { delete this.entries[name.toLowerCase()]; } /** * Helper function for retrieving specific types of fields. * Used to grab all headers or all trailers. * * @param kind {@link FieldPosition} of entries to retrieve. * @returns The {@link Field} entries with the specified * {@link FieldPosition}. */ public getByType(kind: FieldPosition): Field[] { return Object.values(this.entries).filter((field) => field.kind === kind); } } ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/extensions/httpExtensionConfiguration.ts ================================================ import type { HttpHandler } from "../httpHandler"; /** * @internal */ export interface HttpHandlerExtensionConfiguration { setHttpHandler(handler: HttpHandler): void; httpHandler(): HttpHandler; updateHttpClientConfig(key: keyof HandlerConfig, value: HandlerConfig[typeof key]): void; httpHandlerConfigs(): HandlerConfig; } /** * @internal */ export type HttpHandlerExtensionConfigType = Partial<{ httpHandler: HttpHandler; }>; /** * Helper function to resolve default extension configuration from runtime config * * @internal */ export const getHttpHandlerExtensionConfiguration = ( runtimeConfig: HttpHandlerExtensionConfigType ) => { return { setHttpHandler(handler: HttpHandler): void { runtimeConfig.httpHandler = handler; }, httpHandler(): HttpHandler { return runtimeConfig.httpHandler!; }, updateHttpClientConfig(key: keyof HandlerConfig, value: HandlerConfig[typeof key]): void { runtimeConfig.httpHandler?.updateHttpClientConfig(key, value); }, httpHandlerConfigs(): HandlerConfig { return runtimeConfig.httpHandler!.httpHandlerConfigs(); }, }; }; /** * Helper function to resolve runtime config from default extension configuration * * @internal */ export const resolveHttpHandlerRuntimeConfig = ( httpHandlerExtensionConfiguration: HttpHandlerExtensionConfiguration ): HttpHandlerExtensionConfigType => { return { httpHandler: httpHandlerExtensionConfiguration.httpHandler(), }; }; ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/httpHandler.ts ================================================ import type { FetchHttpHandlerOptions, HttpHandlerOptions, NodeHttpHandlerOptions, RequestHandler, } from "@smithy/types"; import type { HttpRequest } from "./httpRequest"; import type { HttpResponse } from "./httpResponse"; /** * @internal */ export type HttpHandler = RequestHandler< HttpRequest, HttpResponse, HttpHandlerOptions > & { /** * @internal */ updateHttpClientConfig(key: keyof HttpHandlerConfig, value: HttpHandlerConfig[typeof key]): void; /** * @internal */ httpHandlerConfigs(): HttpHandlerConfig; }; /** * A type representing the accepted user inputs for the `requestHandler` field * of a client's constructor object. * You may provide an instance of an HttpHandler, or alternatively * provide the constructor arguments as an object which will be passed * to the constructor of the default request handler. * The default class constructor to which your arguments will be passed * varies. The Node.js default is the NodeHttpHandler and the browser/react-native * default is the FetchHttpHandler. In rarer cases specific clients may be * configured to use other default implementations such as Websocket or HTTP2. * The fallback type Record is part of the union to allow * passing constructor params to an unknown requestHandler type. * * @public */ export type HttpHandlerUserInput = | HttpHandler | NodeHttpHandlerOptions | FetchHttpHandlerOptions | Record; ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/httpRequest.spec.ts ================================================ import type { QueryParameterBag } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { HttpRequest, type IHttpRequest } from "./httpRequest"; describe("HttpRequest", () => { const httpRequest: IHttpRequest = { headers: { hKey: "header-value", }, query: { qKey: "query-value", }, method: "GET", protocol: "https", hostname: "localhost", path: "/", body: [], }; it("should statically clone with deep-cloned headers/query but shallow cloned body", () => { const httpRequest: IHttpRequest = { headers: { hKey: "header-value", }, query: { qKey: "query-value", }, method: "GET", protocol: "https", hostname: "localhost", path: "/", body: [], }; const clone1 = HttpRequest.clone(httpRequest); const clone2 = HttpRequest.clone(httpRequest); expect(new HttpRequest(httpRequest)).toEqual(clone1); expect(clone1).toEqual(clone2); expect(clone1.query).not.toBe(clone2.query); expect(clone1.headers).not.toBe(clone2.headers); expect(clone1.body).toBe(clone2.body); }); it("should maintain a deprecated instance clone method", () => { const httpRequestInstance = new HttpRequest(httpRequest); const clone1 = HttpRequest.clone(httpRequestInstance); const clone2 = HttpRequest.clone(httpRequestInstance); expect(httpRequestInstance).toEqual(clone1); expect(clone1).toEqual(clone2); expect(clone1.query).not.toBe(clone2.query); expect(clone1.headers).not.toBe(clone2.headers); expect(clone1.body).toBe(clone2.body); }); }); const cloneRequest = HttpRequest.clone; describe("cloneRequest", () => { const request: IHttpRequest = Object.freeze({ method: "GET", protocol: "https:", hostname: "foo.us-west-2.amazonaws.com", path: "/", headers: Object.freeze({ foo: "bar", compound: "value 1, value 2", }), query: Object.freeze({ fizz: "buzz", snap: ["crackle", "pop"], }), }); it("should return an object matching the provided request", () => { expect(cloneRequest(request)).toEqual(request); }); it("should return an object that with a different identity", () => { expect(cloneRequest(request)).not.toBe(request); }); it("should should deep-copy the headers", () => { const clone = cloneRequest(request); delete clone.headers.compound; expect(Object.keys(request.headers)).toEqual(["foo", "compound"]); expect(Object.keys(clone.headers)).toEqual(["foo"]); }); it("should should deep-copy the query", () => { const clone = cloneRequest(request); const { snap } = clone.query as QueryParameterBag; (snap as Array).shift(); expect((request.query as QueryParameterBag).snap).toEqual(["crackle", "pop"]); expect((clone.query as QueryParameterBag).snap).toEqual(["pop"]); }); it("should not copy the body", () => { const body = new Uint8Array(16); const req = { ...request, body }; const clone = cloneRequest(req); expect(clone.body).toBe(req.body); }); it("should handle requests without defined query objects", () => { expect(cloneRequest({ ...request, query: void 0 }).query).toEqual({}); }); }); ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/httpRequest.ts ================================================ /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */ import { HttpRequest as IHttpRequest, type HeaderBag, type HttpMessage, type QueryParameterBag, type URI, } from "@smithy/types"; type HttpRequestOptions = Partial & Partial & { method?: string }; /** * Use the distinct IHttpRequest interface from \@smithy/types instead. * This should not be used due to * overlapping with the concrete class' name. * * This is not marked deprecated since that would mark the concrete class * deprecated as well. * * @internal */ export interface HttpRequest extends IHttpRequest {} /** * @public */ export { IHttpRequest }; /** * @public */ export class HttpRequest implements HttpMessage, URI { public method: string; public protocol: string; public hostname: string; public port?: number; public path: string; public query: QueryParameterBag; public headers: HeaderBag; public username?: string; public password?: string; public fragment?: string; public body?: any; public constructor(options: HttpRequestOptions) { this.method = options.method || "GET"; this.hostname = options.hostname || "localhost"; this.port = options.port; this.query = options.query || {}; this.headers = options.headers || {}; this.body = options.body; this.protocol = options.protocol ? options.protocol.slice(-1) !== ":" ? `${options.protocol}:` : options.protocol : "https:"; this.path = options.path ? (options.path.charAt(0) !== "/" ? `/${options.path}` : options.path) : "/"; this.username = options.username; this.password = options.password; this.fragment = options.fragment; } /** * Note: this does not deep-clone the body. */ public static clone(request: IHttpRequest) { const cloned = new HttpRequest({ ...request, headers: { ...request.headers }, }); if (cloned.query) { cloned.query = cloneQuery(cloned.query); } return cloned; } /** * This method only actually asserts that request is the interface {@link IHttpRequest}, * and not necessarily this concrete class. Left in place for API stability. * * Do not call instance methods on the input of this function, and * do not assume it has the HttpRequest prototype. */ public static isInstance(request: unknown): request is HttpRequest { if (!request) { return false; } const req: any = request; return ( "method" in req && "protocol" in req && "hostname" in req && "path" in req && typeof req["query"] === "object" && typeof req["headers"] === "object" ); } /** * @deprecated use static HttpRequest.clone(request) instead. It's not safe to call * this method because {@link HttpRequest.isInstance} incorrectly * asserts that IHttpRequest (interface) objects are of type HttpRequest (class). */ public clone(): HttpRequest { return HttpRequest.clone(this); } } function cloneQuery(query: QueryParameterBag): QueryParameterBag { return Object.keys(query).reduce((carry: QueryParameterBag, paramName: string) => { const param = query[paramName]; return { ...carry, [paramName]: Array.isArray(param) ? [...param] : param, }; }, {}); } ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/httpResponse.ts ================================================ /* eslint-disable @typescript-eslint/no-unsafe-declaration-merging */ import type { HeaderBag, HttpMessage, HttpResponse as IHttpResponse } from "@smithy/types"; type HttpResponseOptions = Partial & { statusCode: number; reason?: string; }; /** * Use the distinct IHttpResponse interface from \@smithy/types instead. * This should not be used due to * overlapping with the concrete class' name. * * This is not marked deprecated since that would mark the concrete class * deprecated as well. * * @internal */ export interface HttpResponse extends IHttpResponse {} /** * @public */ export class HttpResponse { public statusCode: number; public reason?: string; public headers: HeaderBag; public body?: any; constructor(options: HttpResponseOptions) { this.statusCode = options.statusCode; this.reason = options.reason; this.headers = options.headers || {}; this.body = options.body; } static isInstance(response: unknown): response is HttpResponse { //determine if response is a valid HttpResponse if (!response) return false; const resp = response as any; return typeof resp.statusCode === "number" && typeof resp.headers === "object"; } } ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/isValidHostname.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { isValidHostname } from "./isValidHostname"; describe("implementation selection", () => { it("should return true for valid hostnames", () => { const validHostnames = ["foo", "foo.bar", "1foo.bar", "foo.bar1"]; for (const hostname of validHostnames) { expect(isValidHostname(hostname)).toBe(true); } }); it("should return false for invalid hostnames", () => { const invalidHostnames = ["foo.com/?bar", ".foo"]; for (const hostname of invalidHostnames) { expect(isValidHostname(hostname)).toBe(false); } }); }); ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/isValidHostname.ts ================================================ export function isValidHostname(hostname: string): boolean { const hostPattern = /^[a-z0-9][a-z0-9\.\-]*[a-z0-9]$/; return hostPattern.test(hostname); } ================================================ FILE: packages/core/src/submodules/protocols/protocol-http/types.ts ================================================ import type { FieldOptions as __FieldOptions, FieldPosition as __FieldPosition, HeaderBag as __HeaderBag, HttpHandlerOptions as __HttpHandlerOptions, HttpMessage as __HttpMessage, } from "@smithy/types"; /** * @deprecated Use FieldOptions from `@smithy/types` instead */ export type FieldOptions = __FieldOptions; /** * @deprecated Use FieldPosition from `@smithy/types` instead */ export type FieldPosition = __FieldPosition; /** * @deprecated Use HeaderBag from `@smithy/types` instead */ export type HeaderBag = __HeaderBag; /** * @deprecated Use HttpMessage from `@smithy/types` instead */ export type HttpMessage = __HttpMessage; /** * @deprecated Use HttpHandlerOptions from `@smithy/types` instead */ export type HttpHandlerOptions = __HttpHandlerOptions; ================================================ FILE: packages/core/src/submodules/protocols/querystring-builder/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-uri-escape@4.2.2 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 - @smithy/util-uri-escape@4.2.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 - @smithy/util-uri-escape@4.2.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-uri-escape@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 - @smithy/util-uri-escape@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-uri-escape@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/util-uri-escape@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 - @smithy/util-uri-escape@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-uri-escape@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-uri-escape@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-uri-escape@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-uri-escape@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-uri-escape@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/querystring-builder](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/querystring-builder/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/querystring-builder/buildQueryString.ts ================================================ import type { QueryParameterBag } from "@smithy/types"; import { escapeUri } from "../util-uri-escape/escape-uri"; /** * @internal */ export function buildQueryString(query: QueryParameterBag): string { const parts: string[] = []; for (let key of Object.keys(query).sort()) { const value = query[key]; key = escapeUri(key); if (Array.isArray(value)) { for (let i = 0, iLen = value.length; i < iLen; i++) { parts.push(`${key}=${escapeUri(value[i])}`); } } else { let qsEntry = key; if (value || typeof value === "string") { qsEntry += `=${escapeUri(value)}`; } parts.push(qsEntry); } } return parts.join("&"); } ================================================ FILE: packages/core/src/submodules/protocols/querystring-parser/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/querystring-parser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/querystring-parser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/querystring-parser/parseQueryString.spec.ts ================================================ import type { QueryParameterBag } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { parseQueryString } from "./parseQueryString"; describe("parseQueryString", () => { const testCases = new Map([ [ "?snap=cr%C3%A4ckle&snap=p%C3%B4p&fizz=buzz&quux", { snap: ["cräckle", "pôp"], fizz: "buzz", quux: null, }, ], ["?", {}], ["?foo=", { foo: "" }], ["foo=bar&foo=baz&foo=quux", { foo: ["bar", "baz", "quux"] }], ]); for (const [querystring, parsed] of testCases) { it(`should correctly parse ${querystring}`, () => { expect(parseQueryString(querystring)).toEqual(parsed); }); } }); ================================================ FILE: packages/core/src/submodules/protocols/querystring-parser/parseQueryString.ts ================================================ import type { QueryParameterBag } from "@smithy/types"; /** * @internal */ export function parseQueryString(querystring: string): QueryParameterBag { const query: QueryParameterBag = {}; querystring = querystring.replace(/^\?/, ""); if (querystring) { for (const pair of querystring.split("&")) { let [key, value = null] = pair.split("="); key = decodeURIComponent(key); if (value) { value = decodeURIComponent(value); } if (!(key in query)) { query[key] = value; } else if (Array.isArray(query[key])) { (query[key] as Array).push(value as string); } else { query[key] = [query[key] as string, value as string]; } } } return query; } ================================================ FILE: packages/core/src/submodules/protocols/requestBuilder.spec.ts ================================================ import { HttpRequest } from "@smithy/protocol-http"; import { describe, expect, test as it } from "vitest"; import { requestBuilder } from "./requestBuilder"; describe(requestBuilder.name, () => { it("can build requests", async () => { expect( await requestBuilder( { Key: "MyKey", Bucket: "MyBucket", }, { endpoint: async () => { return { hostname: "localhost", protocol: "https", port: 8080, path: "/a", }; }, } as any ) .bp("/{Key+}") .p("Bucket", () => "MyBucket", "{Bucket}", false) .p("Key", () => "MyKey", "{Key+}", false) .m("PUT") .h({ "my-header": "my-header-value", }) .q({ "my-query": "my-query-value", }) .b("test-body") .build() ).toEqual( new HttpRequest({ protocol: "https", hostname: "localhost", port: 8080, method: "PUT", path: "/a/MyKey", query: { "my-query": "my-query-value", }, headers: { "my-header": "my-header-value", }, body: "test-body", }) ); }); }); ================================================ FILE: packages/core/src/submodules/protocols/requestBuilder.ts ================================================ import type { SerdeContext } from "@smithy/types"; import { HttpRequest } from "./protocol-http/httpRequest"; import { resolvedPath } from "./resolve-path"; /** * used in code-generated serde. * * @internal */ export function requestBuilder(input: any, context: SerdeContext): RequestBuilder { return new RequestBuilder(input, context); } /** * @internal */ export class RequestBuilder { private query: Record = {}; private method = ""; private headers: Record = {}; private path = ""; private body: any = null; private hostname = ""; private resolvePathStack: Array<(path: string) => void> = []; public constructor( private input: any, private context: SerdeContext ) {} public async build() { const { hostname, protocol = "https", port, path: basePath } = await this.context.endpoint(); this.path = basePath; for (const resolvePath of this.resolvePathStack) { resolvePath(this.path); } return new HttpRequest({ protocol, hostname: this.hostname || hostname, port, method: this.method, path: this.path, query: this.query, body: this.body, headers: this.headers, }); } /** * Brevity setter for "hostname". */ public hn(hostname: string) { this.hostname = hostname; return this; } /** * Brevity initial builder for "basepath". */ public bp(uriLabel: string) { this.resolvePathStack.push((basePath: string) => { this.path = `${basePath?.endsWith("/") ? basePath.slice(0, -1) : basePath || ""}` + uriLabel; }); return this; } /** * Brevity incremental builder for "path". */ public p(memberName: string, labelValueProvider: () => string | undefined, uriLabel: string, isGreedyLabel: boolean) { this.resolvePathStack.push((path: string) => { this.path = resolvedPath(path, this.input, memberName, labelValueProvider, uriLabel, isGreedyLabel); }); return this; } /** * Brevity setter for "headers". */ public h(headers: Record) { this.headers = headers; return this; } /** * Brevity setter for "query". */ public q(query: Record) { this.query = query; return this; } /** * Brevity setter for "body". */ public b(body: any) { this.body = body; return this; } /** * Brevity setter for "method". */ public m(method: string) { this.method = method; return this; } } ================================================ FILE: packages/core/src/submodules/protocols/resolve-path.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { resolvedPath } from "./resolve-path"; describe("resolvedPath", () => { const basePath = "/items/{itemId}"; const uriLabel = "{itemId}"; it("replaces the label with the encoded value", () => { const result = resolvedPath(basePath, { itemId: "abc" }, "itemId", () => "abc", uriLabel, false); expect(result).toBe("/items/abc"); }); it("encodes greedy labels segment by segment", () => { const result = resolvedPath(basePath, { itemId: "a/b/c" }, "itemId", () => "a/b/c", uriLabel, true); expect(result).toBe("/items/a/b/c"); }); it("throws when labelValueProvider returns undefined", () => { expect(() => resolvedPath(basePath, { itemId: "x" }, "itemId", () => undefined, uriLabel, false)).toThrow( "Empty value provided for input HTTP label: itemId." ); }); it("throws when labelValueProvider returns null", () => { expect(() => resolvedPath(basePath, { itemId: "x" }, "itemId", () => null as unknown as string, uriLabel, false) ).toThrow("Empty value provided for input HTTP label: itemId."); }); it("throws when labelValueProvider returns an empty string", () => { expect(() => resolvedPath(basePath, { itemId: "x" }, "itemId", () => "", uriLabel, false)).toThrow( "Empty value provided for input HTTP label: itemId." ); }); it("throws when the member is not present in input", () => { expect(() => resolvedPath(basePath, {}, "itemId", () => "abc", uriLabel, false)).toThrow( "No value provided for input HTTP label: itemId." ); }); }); ================================================ FILE: packages/core/src/submodules/protocols/resolve-path.ts ================================================ import { extendedEncodeURIComponent } from "./extended-encode-uri-component"; /** * @internal */ export const resolvedPath = ( resolvedPath: string, input: unknown, memberName: string, labelValueProvider: () => string | undefined, uriLabel: string, isGreedyLabel: boolean ): string => { if (input != null && (input as Record)[memberName] !== undefined) { const labelValue = labelValueProvider(); if (labelValue == null || labelValue.length <= 0) { throw new Error("Empty value provided for input HTTP label: " + memberName + "."); } resolvedPath = resolvedPath.replace( uriLabel, isGreedyLabel ? labelValue .split("/") .map((segment) => extendedEncodeURIComponent(segment)) .join("/") : extendedEncodeURIComponent(labelValue) ); } else { throw new Error("No value provided for input HTTP label: " + memberName + "."); } return resolvedPath; }; ================================================ FILE: packages/core/src/submodules/protocols/serde/FromStringShapeDeserializer.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import { LazyJsonString, NumericValue, _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, fromBase64, splitHeader, toUtf8, } from "@smithy/core/serde"; import type { CodecSettings, Schema, ShapeDeserializer, TimestampDateTimeSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "@smithy/types"; import { SerdeContext } from "../SerdeContext"; import { determineTimestampFormat } from "./determineTimestampFormat"; /** * This deserializer reads strings. * * @public */ export class FromStringShapeDeserializer extends SerdeContext implements ShapeDeserializer { public constructor(private settings: CodecSettings) { super(); } public read(_schema: Schema, data: string): any { const ns = NormalizedSchema.of(_schema); if (ns.isListSchema()) { return splitHeader(data).map((item) => this.read(ns.getValueSchema(), item)); } if (ns.isBlobSchema()) { return (this.serdeContext?.base64Decoder ?? fromBase64)(data); } if (ns.isTimestampSchema()) { const format = determineTimestampFormat(ns, this.settings); switch (format) { case 5 satisfies TimestampDateTimeSchema: return _parseRfc3339DateTimeWithOffset(data); case 6 satisfies TimestampHttpDateSchema: return _parseRfc7231DateTime(data); case 7 satisfies TimestampEpochSecondsSchema: return _parseEpochTimestamp(data); default: console.warn("Missing timestamp format, parsing value with Date constructor:", data); return new Date(data as string | number); } } if (ns.isStringSchema()) { const mediaType = ns.getMergedTraits().mediaType; let intermediateValue: string | LazyJsonString = data; if (mediaType) { if (ns.getMergedTraits().httpHeader) { intermediateValue = this.base64ToUtf8(intermediateValue); } const isJson = mediaType === "application/json" || mediaType.endsWith("+json"); if (isJson) { intermediateValue = LazyJsonString.from(intermediateValue); } return intermediateValue; } } if (ns.isNumericSchema()) { return Number(data); } if (ns.isBigIntegerSchema()) { return BigInt(data); } if (ns.isBigDecimalSchema()) { return new NumericValue(data, "bigDecimal"); } if (ns.isBooleanSchema()) { return String(data).toLowerCase() === "true"; } return data; } private base64ToUtf8(base64String: string): any { return (this.serdeContext?.utf8Encoder ?? toUtf8)((this.serdeContext?.base64Decoder ?? fromBase64)(base64String)); } } ================================================ FILE: packages/core/src/submodules/protocols/serde/HttpInterceptingShapeDeserializer.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import { fromUtf8, toUtf8 } from "@smithy/core/serde"; import type { CodecSettings, Schema, SerdeFunctions, ShapeDeserializer } from "@smithy/types"; import { SerdeContext } from "../SerdeContext"; import { FromStringShapeDeserializer } from "./FromStringShapeDeserializer"; /** * This deserializer is a dispatcher that decides whether to use a string deserializer * or a codec deserializer based on HTTP traits. * * For example, in a JSON HTTP message, the deserialization of a field will differ depending on whether * it is bound to the HTTP header (string) or body (JSON). * * @public */ export class HttpInterceptingShapeDeserializer> extends SerdeContext implements ShapeDeserializer { private stringDeserializer: FromStringShapeDeserializer; public constructor( private codecDeserializer: CodecShapeDeserializer, codecSettings: CodecSettings ) { super(); this.stringDeserializer = new FromStringShapeDeserializer(codecSettings); } /** * @override */ public setSerdeContext(serdeContext: SerdeFunctions): void { this.stringDeserializer.setSerdeContext(serdeContext); this.codecDeserializer.setSerdeContext(serdeContext); this.serdeContext = serdeContext; } public read(schema: Schema, data: string | Uint8Array): any | Promise { const ns = NormalizedSchema.of(schema); const traits = ns.getMergedTraits(); const toString = this.serdeContext?.utf8Encoder ?? toUtf8; if (traits.httpHeader || traits.httpResponseCode) { return this.stringDeserializer.read(ns, toString(data)); } if (traits.httpPayload) { if (ns.isBlobSchema()) { const toBytes = this.serdeContext?.utf8Decoder ?? fromUtf8; if (typeof data === "string") { return toBytes(data); } return data; } else if (ns.isStringSchema()) { if ("byteLength" in (data as Uint8Array)) { return toString(data); } return data; } } return this.codecDeserializer.read(ns, data); } } ================================================ FILE: packages/core/src/submodules/protocols/serde/HttpInterceptingShapeSerializer.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import type { CodecSettings, ConfigurableSerdeContext, Schema as ISchema, SerdeFunctions, ShapeSerializer, } from "@smithy/types"; import { ToStringShapeSerializer } from "./ToStringShapeSerializer"; /** * This serializer decides whether to dispatch to a string serializer or a codec serializer * depending on HTTP binding traits within the given schema. * * For example, a JavaScript array is serialized differently when being written * to a REST JSON HTTP header (comma-delimited string) and a REST JSON HTTP body (JSON array). * * @public */ export class HttpInterceptingShapeSerializer> implements ShapeSerializer, ConfigurableSerdeContext { private buffer: string | undefined; public constructor( private codecSerializer: CodecShapeSerializer, codecSettings: CodecSettings, private stringSerializer = new ToStringShapeSerializer(codecSettings) ) {} /** * @override */ public setSerdeContext(serdeContext: SerdeFunctions): void { this.codecSerializer.setSerdeContext(serdeContext); this.stringSerializer.setSerdeContext(serdeContext); } public write(schema: ISchema, value: unknown): void { const ns = NormalizedSchema.of(schema); const traits = ns.getMergedTraits(); if (traits.httpHeader || traits.httpLabel || traits.httpQuery) { this.stringSerializer.write(ns, value); this.buffer = this.stringSerializer.flush(); return; } return this.codecSerializer.write(ns, value); } public flush(): string | Uint8Array { if (this.buffer !== undefined) { const buffer = this.buffer; this.buffer = undefined; return buffer; } return this.codecSerializer.flush(); } } ================================================ FILE: packages/core/src/submodules/protocols/serde/ToStringShapeSerializer.spec.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import type { StaticStructureSchema, TimestampEpochSecondsSchema } from "@smithy/types"; import { describe, expect, it } from "vitest"; import { ToStringShapeSerializer } from "./ToStringShapeSerializer"; describe(ToStringShapeSerializer.name, () => { it("should serialize idempotency tokens automatically", () => { const structureWithIdempotencyToken = [ 3, "ns", "Struct", 0, ["name", "token"], [ 0, [ 0, { idempotencyToken: 1, httpQuery: "token", }, ], ], ] satisfies StaticStructureSchema; const serializer = new ToStringShapeSerializer({ httpBindings: true, timestampFormat: { default: 7 satisfies TimestampEpochSecondsSchema, useTrait: true, }, }); const ns = NormalizedSchema.of(structureWithIdempotencyToken); serializer.write(ns.getMemberSchema("token"), undefined); { const serialization = serializer.flush(); expect(serialization).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/); } }); }); ================================================ FILE: packages/core/src/submodules/protocols/serde/ToStringShapeSerializer.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import { LazyJsonString, dateToUtcString, generateIdempotencyToken, quoteHeader, toBase64 } from "@smithy/core/serde"; import type { CodecSettings, Schema, ShapeSerializer, TimestampDateTimeSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "@smithy/types"; import { SerdeContext } from "../SerdeContext"; import { determineTimestampFormat } from "./determineTimestampFormat"; /** * Serializes a shape to string. * * @public */ export class ToStringShapeSerializer extends SerdeContext implements ShapeSerializer { private stringBuffer = ""; public constructor(private settings: CodecSettings) { super(); } public write(schema: Schema, value: unknown): void { const ns = NormalizedSchema.of(schema); switch (typeof value) { case "object": if (value === null) { this.stringBuffer = "null"; return; } if (ns.isTimestampSchema()) { if (!(value instanceof Date)) { throw new Error( `@smithy/core/protocols - received non-Date value ${value} when schema expected Date in ${ns.getName( true )}` ); } const format = determineTimestampFormat(ns, this.settings); switch (format) { case 5 satisfies TimestampDateTimeSchema: this.stringBuffer = value.toISOString().replace(".000Z", "Z"); break; case 6 satisfies TimestampHttpDateSchema: this.stringBuffer = dateToUtcString(value); break; case 7 satisfies TimestampEpochSecondsSchema: this.stringBuffer = String(value.getTime() / 1000); break; default: console.warn("Missing timestamp format, using epoch seconds", value); this.stringBuffer = String(value.getTime() / 1000); } return; } if (ns.isBlobSchema() && "byteLength" in (value as Uint8Array)) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(value as Uint8Array); return; } if (ns.isListSchema() && Array.isArray(value)) { let buffer = ""; for (const item of value) { this.write([ns.getValueSchema(), ns.getMergedTraits()], item); const headerItem = this.flush(); const serialized = ns.getValueSchema().isTimestampSchema() ? headerItem : quoteHeader(headerItem); if (buffer !== "") { buffer += ", "; } buffer += serialized; } this.stringBuffer = buffer; return; } this.stringBuffer = JSON.stringify(value, null, 2); break; case "string": const mediaType = ns.getMergedTraits().mediaType; let intermediateValue: string | LazyJsonString = value; if (mediaType) { const isJson = mediaType === "application/json" || mediaType.endsWith("+json"); if (isJson) { intermediateValue = LazyJsonString.from(intermediateValue); } if (ns.getMergedTraits().httpHeader) { this.stringBuffer = (this.serdeContext?.base64Encoder ?? toBase64)(intermediateValue.toString()); return; } } this.stringBuffer = value; break; default: if (ns.isIdempotencyToken()) { this.stringBuffer = generateIdempotencyToken(); } else { this.stringBuffer = String(value); } } } public flush(): string { const buffer = this.stringBuffer; this.stringBuffer = ""; return buffer; } } ================================================ FILE: packages/core/src/submodules/protocols/serde/determineTimestampFormat.ts ================================================ import type { NormalizedSchema } from "@smithy/core/schema"; import type { CodecSettings, TimestampDateTimeSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "@smithy/types"; /** * Assuming the schema is a timestamp type, the function resolves the format using * either the timestamp's own traits, or the default timestamp format from the CodecSettings. * * @internal */ export function determineTimestampFormat( ns: NormalizedSchema, settings: CodecSettings ): TimestampDateTimeSchema | TimestampHttpDateSchema | TimestampEpochSecondsSchema { if (settings.timestampFormat.useTrait) { if ( ns.isTimestampSchema() && (ns.getSchema() === (5 satisfies TimestampDateTimeSchema) || ns.getSchema() === (6 satisfies TimestampHttpDateSchema) || ns.getSchema() === (7 satisfies TimestampEpochSecondsSchema)) ) { return ns.getSchema() as TimestampDateTimeSchema | TimestampHttpDateSchema | TimestampEpochSecondsSchema; } } const { httpLabel, httpPrefixHeaders, httpHeader, httpQuery } = ns.getMergedTraits(); const bindingFormat = settings.httpBindings ? typeof httpPrefixHeaders === "string" || Boolean(httpHeader) ? (6 satisfies TimestampHttpDateSchema) : Boolean(httpQuery) || Boolean(httpLabel) ? (5 satisfies TimestampDateTimeSchema) : undefined : undefined; return bindingFormat ?? settings.timestampFormat.default; } ================================================ FILE: packages/core/src/submodules/protocols/url-parser/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/querystring-parser@4.2.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/querystring-parser@4.2.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/querystring-parser@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/querystring-parser@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/querystring-parser@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/querystring-parser@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/querystring-parser@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/querystring-parser@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/querystring-parser@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/querystring-parser@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/querystring-parser@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/querystring-parser@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/querystring-parser@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/querystring-parser@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/querystring-parser@4.2.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/querystring-parser@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/querystring-parser@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/querystring-parser@4.0.5 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/querystring-parser@4.0.4 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/querystring-parser@4.0.3 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/querystring-parser@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/querystring-parser@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/querystring-parser@4.0.0 - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/querystring-parser@3.0.11 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/querystring-parser@3.0.10 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/querystring-parser@3.0.9 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/querystring-parser@3.0.8 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/querystring-parser@3.0.7 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/querystring-parser@3.0.6 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/querystring-parser@3.0.5 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/querystring-parser@3.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/querystring-parser@3.0.3 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/querystring-parser@3.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/querystring-parser@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/querystring-parser@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/querystring-parser@2.2.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/querystring-parser@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/querystring-parser@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/querystring-parser@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/querystring-parser@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/querystring-parser@2.1.0 - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/querystring-parser@2.0.16 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/querystring-parser@2.0.15 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/querystring-parser@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/querystring-parser@2.0.13 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/querystring-parser@2.0.12 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/querystring-parser@2.0.11 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/querystring-parser@2.0.10 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/querystring-parser@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/querystring-parser@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/querystring-parser@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/querystring-parser@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/querystring-parser@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/querystring-parser@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/querystring-parser@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/querystring-parser@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/querystring-parser@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/querystring-parser@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/querystring-parser@1.1.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/querystring-parser@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/querystring-parser@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/querystring-parser@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/url-parser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/url-parser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/url-parser/parseUrl.spec.ts ================================================ import type { Endpoint } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { parseUrl } from "./parseUrl"; describe("parseUrl", () => { const testCases = new Map([ [ "https://www.example.com/path/to%20the/file.ext?snap=cr%C3%A4ckle&snap=p%C3%B4p&fizz=buzz&quux", { protocol: "https:", hostname: "www.example.com", path: "/path/to%20the/file.ext", query: { snap: ["cräckle", "pôp"], fizz: "buzz", quux: null, }, }, ], [ "http://example.com:54321", { protocol: "http:", hostname: "example.com", port: 54321, path: "/", }, ], [ "https://example.com?foo=bar", { protocol: "https:", hostname: "example.com", path: "/", query: { foo: "bar" }, }, ], ]); const testFunc = typeof URL !== "undefined" ? it : it.skip; for (const [url, parsed] of testCases) { testFunc(`should correctly parse ${url}`, () => { expect(parseUrl(url)).toEqual(parsed); }); } }); ================================================ FILE: packages/core/src/submodules/protocols/url-parser/parseUrl.ts ================================================ import type { Endpoint, QueryParameterBag, UrlParser } from "@smithy/types"; import { parseQueryString } from "../querystring-parser/parseQueryString"; /** * @internal */ export const parseUrl: UrlParser = (url: string | URL): Endpoint => { if (typeof url === "string") { return parseUrl(new URL(url)); } const { hostname, pathname, port, protocol, search } = url as URL; let query: QueryParameterBag | undefined; if (search) { query = parseQueryString(search); } return { hostname, port: port ? parseInt(port) : undefined, protocol, path: pathname, query, }; }; ================================================ FILE: packages/core/src/submodules/protocols/util-uri-escape/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/protocols`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-uri-escape](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-uri-escape/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/protocols/util-uri-escape/escape-uri-path.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { escapeUriPath } from "./escape-uri-path"; describe("escapeUriPath", () => { it(`does not escape '/'`, () => { expect(escapeUriPath("/a/path/to/nowhere")).toBe("/a/path/to/nowhere"); }); it("does escape non-forward slash characters", () => { expect(escapeUriPath("/once/more !")).toBe("/once/more%20%21"); }); }); ================================================ FILE: packages/core/src/submodules/protocols/util-uri-escape/escape-uri-path.ts ================================================ import { escapeUri } from "./escape-uri"; /** * @internal */ export const escapeUriPath = (uri: string): string => uri.split("/").map(escapeUri).join("/"); ================================================ FILE: packages/core/src/submodules/protocols/util-uri-escape/escape-uri.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { escapeUri } from "./escape-uri"; describe("escapeUri", () => { it("should convert most special characters", () => { expect(escapeUri("!@#$%^&*();':\"{}[],/?`")).toBe( "%21%40%23%24%25%5E%26%2A%28%29%3B%27%3A%22%7B%7D%5B%5D%2C%2F%3F%60" ); }); it("should not convert tildas or periods", () => { expect(escapeUri("~.")).toBe("~."); }); it("should encode spaces as %20", () => { expect(escapeUri(" ")).toBe("%20"); }); it("should convert reserved characters", () => { expect(escapeUri(`!'()*`)).toBe("%21%27%28%29%2A"); }); }); ================================================ FILE: packages/core/src/submodules/protocols/util-uri-escape/escape-uri.ts ================================================ /** * @internal */ export const escapeUri = (uri: string): string => // AWS percent-encodes some extra non-standard characters in a URI encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode); const hexEncode = (c: string) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`; ================================================ FILE: packages/core/src/submodules/retry/index.browser.ts ================================================ import { isStreamingPayload } from "./middleware-retry/isStreamingPayload/isStreamingPayload.browser"; import { bindGetRetryPlugin, bindRetryMiddleware } from "./middleware-retry/retryMiddleware"; const no = Symbol.for("node-only"); // @smithy/service-error-classification export { isRetryableByTrait, isClockSkewError, isClockSkewCorrectedError, isBrowserNetworkError, isThrottlingError, isTransientError, isServerError, isNodeJsHttp2TransientError, } from "./service-error-classification/service-error-classification"; // @smithy/util-retry export { AdaptiveRetryStrategy, type AdaptiveRetryStrategyOptions } from "./util-retry/AdaptiveRetryStrategy"; export { ConfiguredRetryStrategy } from "./util-retry/ConfiguredRetryStrategy"; export { DefaultRateLimiter, type DefaultRateLimiterOptions } from "./util-retry/DefaultRateLimiter"; export { StandardRetryStrategy, type StandardRetryStrategyOptions } from "./util-retry/StandardRetryStrategy"; export { RETRY_MODES, DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "./util-retry/config"; export { DEFAULT_RETRY_DELAY_BASE, MAXIMUM_RETRY_DELAY, THROTTLING_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, RETRY_COST, TIMEOUT_RETRY_COST, NO_RETRY_INCREMENT, INVOCATION_ID_HEADER, REQUEST_HEADER, } from "./util-retry/constants"; export type { RateLimiter } from "./util-retry/types"; export { Retry } from "./util-retry/retries-2026-config"; // @smithy/middleware-retry export { AdaptiveRetryStrategy as DeprecatedAdaptiveRetryStrategy, type AdaptiveRetryStrategyOptions as DeprecatedAdaptiveRetryStrategyOptions, } from "./middleware-retry/retry-pre-sra-deprecated/AdaptiveRetryStrategy"; export { StandardRetryStrategy as DeprecatedStandardRetryStrategy, type StandardRetryStrategyOptions as DeprecatedStandardRetryStrategyOptions, } from "./middleware-retry/retry-pre-sra-deprecated/StandardRetryStrategy"; export { defaultDelayDecider } from "./middleware-retry/retry-pre-sra-deprecated/delayDecider"; export { defaultRetryDecider } from "./middleware-retry/retry-pre-sra-deprecated/retryDecider"; export const ENV_MAX_ATTEMPTS = no; export const CONFIG_MAX_ATTEMPTS = no; export const NODE_MAX_ATTEMPT_CONFIG_OPTIONS = no; export const ENV_RETRY_MODE = no; export const CONFIG_RETRY_MODE = no; export const NODE_RETRY_MODE_CONFIG_OPTIONS = no; export { resolveRetryConfig } from "./middleware-retry/configurations"; export type { RetryInputConfig, RetryResolvedConfig, PreviouslyResolved } from "./middleware-retry/configurations"; export { omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, getOmitRetryHeadersPlugin, } from "./middleware-retry/omitRetryHeadersMiddleware"; export { retryMiddlewareOptions } from "./middleware-retry/retryMiddleware"; export { getRetryAfterHint } from "./middleware-retry/parseRetryAfterHeader"; export const retryMiddleware = bindRetryMiddleware(isStreamingPayload); export const getRetryPlugin = bindGetRetryPlugin(isStreamingPayload); ================================================ FILE: packages/core/src/submodules/retry/index.ts ================================================ import { isStreamingPayload } from "./middleware-retry/isStreamingPayload/isStreamingPayload"; import { bindGetRetryPlugin, bindRetryMiddleware } from "./middleware-retry/retryMiddleware"; // @smithy/service-error-classification export { isRetryableByTrait, isClockSkewError, isClockSkewCorrectedError, isBrowserNetworkError, isThrottlingError, isTransientError, isServerError, isNodeJsHttp2TransientError, } from "./service-error-classification/service-error-classification"; // @smithy/util-retry export { AdaptiveRetryStrategy, type AdaptiveRetryStrategyOptions } from "./util-retry/AdaptiveRetryStrategy"; export { ConfiguredRetryStrategy } from "./util-retry/ConfiguredRetryStrategy"; export { DefaultRateLimiter, type DefaultRateLimiterOptions } from "./util-retry/DefaultRateLimiter"; export { StandardRetryStrategy, type StandardRetryStrategyOptions } from "./util-retry/StandardRetryStrategy"; export { RETRY_MODES, DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "./util-retry/config"; export { DEFAULT_RETRY_DELAY_BASE, MAXIMUM_RETRY_DELAY, THROTTLING_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, RETRY_COST, TIMEOUT_RETRY_COST, NO_RETRY_INCREMENT, INVOCATION_ID_HEADER, REQUEST_HEADER, } from "./util-retry/constants"; export type { RateLimiter } from "./util-retry/types"; export { Retry } from "./util-retry/retries-2026-config"; // @smithy/middleware-retry export { AdaptiveRetryStrategy as DeprecatedAdaptiveRetryStrategy, type AdaptiveRetryStrategyOptions as DeprecatedAdaptiveRetryStrategyOptions, } from "./middleware-retry/retry-pre-sra-deprecated/AdaptiveRetryStrategy"; export { StandardRetryStrategy as DeprecatedStandardRetryStrategy, type StandardRetryStrategyOptions as DeprecatedStandardRetryStrategyOptions, } from "./middleware-retry/retry-pre-sra-deprecated/StandardRetryStrategy"; export { defaultDelayDecider } from "./middleware-retry/retry-pre-sra-deprecated/delayDecider"; export { defaultRetryDecider } from "./middleware-retry/retry-pre-sra-deprecated/retryDecider"; export { ENV_MAX_ATTEMPTS, CONFIG_MAX_ATTEMPTS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, ENV_RETRY_MODE, CONFIG_RETRY_MODE, NODE_RETRY_MODE_CONFIG_OPTIONS, resolveRetryConfig, } from "./middleware-retry/configurations"; export type { RetryInputConfig, RetryResolvedConfig, PreviouslyResolved } from "./middleware-retry/configurations"; export { omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, getOmitRetryHeadersPlugin, } from "./middleware-retry/omitRetryHeadersMiddleware"; export { retryMiddlewareOptions } from "./middleware-retry/retryMiddleware"; export { getRetryAfterHint } from "./middleware-retry/parseRetryAfterHeader"; export const retryMiddleware = bindRetryMiddleware(isStreamingPayload); export const getRetryPlugin = bindGetRetryPlugin(isStreamingPayload); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/retry`. ## 4.5.7 ### Patch Changes - Updated dependencies [2e5142c] - Updated dependencies [9c88c10] - @smithy/util-retry@4.3.6 ## 4.5.6 ### Patch Changes - Updated dependencies [15f9e53] - @smithy/service-error-classification@4.3.1 - @smithy/util-retry@4.3.5 ## 4.5.5 ### Patch Changes - Updated dependencies [b877fc2] - @smithy/util-retry@4.3.4 - @smithy/core@3.23.17 - @smithy/smithy-client@4.12.13 ## 4.5.4 ### Patch Changes - Updated dependencies [a029f0e] - Updated dependencies [60d13c8] - @smithy/core@3.23.16 - @smithy/service-error-classification@4.3.0 - @smithy/smithy-client@4.12.12 - @smithy/util-retry@4.3.3 ## 4.5.3 ### Patch Changes - Updated dependencies [b69e3c9] - @smithy/smithy-client@4.12.11 ## 4.5.2 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/smithy-client@4.12.10 - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/node-config-provider@4.3.14 - @smithy/protocol-http@5.3.14 - @smithy/service-error-classification@4.2.14 - @smithy/util-middleware@4.2.14 - @smithy/util-retry@4.3.2 ## 4.5.1 ### Patch Changes - Updated dependencies [a45aaf5] - @smithy/util-retry@4.3.1 ## 4.5.0 ### Minor Changes - cffd868: Introduce default retry behavior modifications slated for 2026. They are: less time between server error retries, but slightly more time between throttling errors. Lower retry capacity consumption for throttling, and improved parsing of the retry-after and x-amz-retry-after headers. ### Patch Changes - Updated dependencies [cffd868] - @smithy/util-retry@4.3.0 - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/node-config-provider@4.3.13 - @smithy/protocol-http@5.3.13 - @smithy/service-error-classification@4.2.13 - @smithy/smithy-client@4.12.9 - @smithy/util-middleware@4.2.13 ## 4.4.46 ### Patch Changes - Updated dependencies [3c21a57] - @smithy/util-retry@4.2.13 ## 4.4.45 ### Patch Changes - @smithy/smithy-client@4.12.8 ## 4.4.44 ### Patch Changes - @smithy/smithy-client@4.12.7 ## 4.4.43 ### Patch Changes - @smithy/smithy-client@4.12.6 ## 4.4.42 ### Patch Changes - @smithy/smithy-client@4.12.5 ## 4.4.41 ### Patch Changes - dfc743d: fix(middleware-retry): memoize default retry strategy in `resolveRetryConfig` so that `StandardRetryStrategy` capacity and `AdaptiveRetryStrategy` rate limiter state persist across requests instead of being reconstructed per-call. - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/smithy-client@4.12.4 - @smithy/node-config-provider@4.3.12 - @smithy/protocol-http@5.3.12 - @smithy/service-error-classification@4.2.12 - @smithy/util-middleware@4.2.12 - @smithy/util-retry@4.2.12 ## 4.4.40 ### Patch Changes - @smithy/smithy-client@4.12.3 ## 4.4.39 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/service-error-classification@4.2.11 - @smithy/node-config-provider@4.3.11 - @smithy/util-middleware@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/smithy-client@4.12.2 - @smithy/util-retry@4.2.11 - @smithy/uuid@1.1.2 ## 4.4.38 ### Patch Changes - @smithy/smithy-client@4.12.1 ## 4.4.37 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/smithy-client@4.12.0 - @smithy/types@4.13.0 - @smithy/node-config-provider@4.3.10 - @smithy/protocol-http@5.3.10 - @smithy/service-error-classification@4.2.10 - @smithy/util-middleware@4.2.10 - @smithy/util-retry@4.2.10 ## 4.4.36 ### Patch Changes - @smithy/smithy-client@4.11.8 ## 4.4.35 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/node-config-provider@4.3.9 - @smithy/protocol-http@5.3.9 - @smithy/service-error-classification@4.2.9 - @smithy/smithy-client@4.11.7 - @smithy/types@4.12.1 - @smithy/util-middleware@4.2.9 - @smithy/util-retry@4.2.9 - @smithy/uuid@1.1.1 ## 4.4.34 ### Patch Changes - @smithy/smithy-client@4.11.6 ## 4.4.33 ### Patch Changes - @smithy/smithy-client@4.11.5 ## 4.4.32 ### Patch Changes - @smithy/smithy-client@4.11.4 ## 4.4.31 ### Patch Changes - @smithy/smithy-client@4.11.3 ## 4.4.30 ### Patch Changes - @smithy/smithy-client@4.11.2 ## 4.4.29 ### Patch Changes - @smithy/smithy-client@4.11.1 ## 4.4.28 ### Patch Changes - Updated dependencies [75145e5] - @smithy/smithy-client@4.11.0 ## 4.4.27 ### Patch Changes - @smithy/smithy-client@4.10.12 ## 4.4.26 ### Patch Changes - @smithy/smithy-client@4.10.11 ## 4.4.25 ### Patch Changes - @smithy/smithy-client@4.10.10 ## 4.4.24 ### Patch Changes - @smithy/smithy-client@4.10.9 ## 4.4.23 ### Patch Changes - @smithy/smithy-client@4.10.8 ## 4.4.22 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/node-config-provider@4.3.8 - @smithy/protocol-http@5.3.8 - @smithy/service-error-classification@4.2.8 - @smithy/smithy-client@4.10.7 - @smithy/util-middleware@4.2.8 - @smithy/util-retry@4.2.8 ## 4.4.21 ### Patch Changes - @smithy/smithy-client@4.10.6 ## 4.4.20 ### Patch Changes - @smithy/smithy-client@4.10.5 ## 4.4.19 ### Patch Changes - @smithy/smithy-client@4.10.4 ## 4.4.18 ### Patch Changes - @smithy/smithy-client@4.10.3 ## 4.4.17 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/node-config-provider@4.3.7 - @smithy/protocol-http@5.3.7 - @smithy/service-error-classification@4.2.7 - @smithy/smithy-client@4.10.2 - @smithy/util-middleware@4.2.7 - @smithy/util-retry@4.2.7 ## 4.4.16 ### Patch Changes - Updated dependencies [f3a51c2] - @smithy/smithy-client@4.10.1 ## 4.4.15 ### Patch Changes - Updated dependencies [5a56762] - @smithy/smithy-client@4.10.0 - @smithy/types@4.10.0 - @smithy/node-config-provider@4.3.6 - @smithy/protocol-http@5.3.6 - @smithy/service-error-classification@4.2.6 - @smithy/util-middleware@4.2.6 - @smithy/util-retry@4.2.6 ## 4.4.14 ### Patch Changes - @smithy/smithy-client@4.9.10 ## 4.4.13 ### Patch Changes - @smithy/smithy-client@4.9.9 ## 4.4.12 ### Patch Changes - @smithy/smithy-client@4.9.8 ## 4.4.11 ### Patch Changes - @smithy/smithy-client@4.9.7 ## 4.4.10 ### Patch Changes - @smithy/smithy-client@4.9.6 ## 4.4.9 ### Patch Changes - @smithy/smithy-client@4.9.5 ## 4.4.8 ### Patch Changes - @smithy/smithy-client@4.9.4 ## 4.4.7 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/node-config-provider@4.3.5 - @smithy/protocol-http@5.3.5 - @smithy/service-error-classification@4.2.5 - @smithy/smithy-client@4.9.3 - @smithy/util-middleware@4.2.5 - @smithy/util-retry@4.2.5 ## 4.4.6 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/node-config-provider@4.3.4 - @smithy/protocol-http@5.3.4 - @smithy/service-error-classification@4.2.4 - @smithy/smithy-client@4.9.2 - @smithy/util-middleware@4.2.4 - @smithy/util-retry@4.2.4 ## 4.4.5 ### Patch Changes - @smithy/smithy-client@4.9.1 ## 4.4.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/smithy-client@4.9.0 - @smithy/types@4.8.0 - @smithy/node-config-provider@4.3.3 - @smithy/protocol-http@5.3.3 - @smithy/service-error-classification@4.2.3 - @smithy/util-middleware@4.2.3 - @smithy/util-retry@4.2.3 ## 4.4.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/smithy-client@4.8.1 - @smithy/node-config-provider@4.3.2 - @smithy/protocol-http@5.3.2 - @smithy/service-error-classification@4.2.2 - @smithy/util-middleware@4.2.2 - @smithy/util-retry@4.2.2 ## 4.4.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/smithy-client@4.8.0 - @smithy/node-config-provider@4.3.1 - @smithy/protocol-http@5.3.1 - @smithy/service-error-classification@4.2.1 - @smithy/util-middleware@4.2.1 - @smithy/util-retry@4.2.1 ## 4.4.1 ### Patch Changes - @smithy/smithy-client@4.7.1 ## 4.4.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/node-config-provider@4.3.0 - @smithy/protocol-http@5.3.0 - @smithy/service-error-classification@4.2.0 - @smithy/smithy-client@4.7.0 - @smithy/types@4.6.0 - @smithy/util-middleware@4.2.0 - @smithy/util-retry@4.2.0 - @smithy/uuid@1.1.0 ## 4.3.1 ### Patch Changes - @smithy/smithy-client@4.6.5 ## 4.3.0 ### Minor Changes - 97fe0d8: Replace 'uuid' with '@smithy/uuid' ### Patch Changes - @smithy/smithy-client@4.6.4 ## 4.2.4 ### Patch Changes - @smithy/smithy-client@4.6.3 ## 4.2.3 ### Patch Changes - Updated dependencies [937ac5a] - @smithy/service-error-classification@4.1.2 - @smithy/util-retry@4.1.2 ## 4.2.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 - @smithy/smithy-client@4.6.2 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/node-config-provider@4.2.1 - @smithy/protocol-http@5.2.1 - @smithy/service-error-classification@4.1.1 - @smithy/smithy-client@4.6.1 - @smithy/util-middleware@4.1.1 - @smithy/util-retry@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/service-error-classification@4.1.0 - @smithy/node-config-provider@4.2.0 - @smithy/util-middleware@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/smithy-client@4.6.0 - @smithy/util-retry@4.1.0 - @smithy/types@4.4.0 ## 4.1.22 ### Patch Changes - @smithy/smithy-client@4.5.2 ## 4.1.21 ### Patch Changes - @smithy/smithy-client@4.5.1 ## 4.1.20 ### Patch Changes - Updated dependencies [eb1ab40] - @smithy/smithy-client@4.5.0 ## 4.1.19 ### Patch Changes - fd00602: update uuid types version - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/smithy-client@4.4.10 - @smithy/node-config-provider@4.1.4 - @smithy/protocol-http@5.1.3 - @smithy/service-error-classification@4.0.7 - @smithy/util-middleware@4.0.5 - @smithy/util-retry@4.0.7 ## 4.1.18 ### Patch Changes - @smithy/smithy-client@4.4.9 ## 4.1.17 ### Patch Changes - @smithy/smithy-client@4.4.8 ## 4.1.16 ### Patch Changes - @smithy/smithy-client@4.4.7 ## 4.1.15 ### Patch Changes - @smithy/smithy-client@4.4.6 ## 4.1.14 ### Patch Changes - @smithy/smithy-client@4.4.5 ## 4.1.13 ### Patch Changes - Updated dependencies [c8d5bb2] - @smithy/service-error-classification@4.0.6 - @smithy/util-retry@4.0.6 - @smithy/smithy-client@4.4.4 ## 4.1.12 ### Patch Changes - @smithy/smithy-client@4.4.3 ## 4.1.11 ### Patch Changes - @smithy/smithy-client@4.4.2 ## 4.1.10 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/node-config-provider@4.1.3 - @smithy/protocol-http@5.1.2 - @smithy/service-error-classification@4.0.5 - @smithy/smithy-client@4.4.1 - @smithy/util-middleware@4.0.4 - @smithy/util-retry@4.0.5 ## 4.1.9 ### Patch Changes - Updated dependencies [23812a9] - @smithy/smithy-client@4.4.0 ## 4.1.8 ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/smithy-client@4.3.0 - @smithy/node-config-provider@4.1.2 - @smithy/protocol-http@5.1.1 - @smithy/service-error-classification@4.0.4 - @smithy/util-middleware@4.0.3 - @smithy/util-retry@4.0.4 ## 4.1.7 ### Patch Changes - @smithy/smithy-client@4.2.6 ## 4.1.6 ### Patch Changes - @smithy/smithy-client@4.2.5 ## 4.1.5 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 - @smithy/smithy-client@4.2.4 ## 4.1.4 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 - @smithy/smithy-client@4.2.3 ## 4.1.3 ### Patch Changes - @smithy/smithy-client@4.2.2 ## 4.1.2 ### Patch Changes - Updated dependencies [89bde09] - @smithy/service-error-classification@4.0.3 - @smithy/util-retry@4.0.3 ## 4.1.1 ### Patch Changes - @smithy/smithy-client@4.2.1 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/smithy-client@4.2.0 - @smithy/types@4.2.0 - @smithy/node-config-provider@4.0.2 - @smithy/service-error-classification@4.0.2 - @smithy/util-middleware@4.0.2 - @smithy/util-retry@4.0.2 ## 4.0.7 ### Patch Changes - @smithy/smithy-client@4.1.6 ## 4.0.6 ### Patch Changes - @smithy/smithy-client@4.1.5 ## 4.0.5 ### Patch Changes - @smithy/smithy-client@4.1.4 ## 4.0.4 ### Patch Changes - @smithy/smithy-client@4.1.3 ## 4.0.3 ### Patch Changes - @smithy/smithy-client@4.1.2 ## 4.0.2 ### Patch Changes - Updated dependencies [e87f2b3] - @smithy/smithy-client@4.1.1 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - Updated dependencies [292c134] - @smithy/types@4.1.0 - @smithy/smithy-client@4.1.0 - @smithy/node-config-provider@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/service-error-classification@4.0.1 - @smithy/util-middleware@4.0.1 - @smithy/util-retry@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/node-config-provider@4.0.0 - @smithy/util-middleware@4.0.0 - @smithy/smithy-client@4.0.0 - @smithy/util-retry@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/service-error-classification@4.0.0 - @smithy/types@4.0.0 ## 3.0.34 ### Patch Changes - Updated dependencies [a0e71d5] - @smithy/smithy-client@3.7.0 ## 3.0.33 ### Patch Changes - Updated dependencies [23129d9] - @smithy/smithy-client@3.6.0 ## 3.0.32 ### Patch Changes - @smithy/smithy-client@3.5.2 ## 3.0.31 ### Patch Changes - Updated dependencies [7f17426] - @smithy/smithy-client@3.5.1 ## 3.0.30 ### Patch Changes - Updated dependencies [70275bd] - @smithy/smithy-client@3.5.0 ## 3.0.29 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/service-error-classification@3.0.11 - @smithy/types@3.7.2 - @smithy/util-retry@3.0.11 - @smithy/node-config-provider@3.1.12 - @smithy/protocol-http@4.1.8 - @smithy/smithy-client@3.4.6 - @smithy/util-middleware@3.0.11 ## 3.0.28 ### Patch Changes - @smithy/smithy-client@3.4.5 ## 3.0.27 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/node-config-provider@3.1.11 - @smithy/protocol-http@4.1.7 - @smithy/service-error-classification@3.0.10 - @smithy/smithy-client@3.4.4 - @smithy/util-middleware@3.0.10 - @smithy/util-retry@3.0.10 ## 3.0.26 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/smithy-client@3.4.3 - @smithy/node-config-provider@3.1.10 - @smithy/protocol-http@4.1.6 - @smithy/service-error-classification@3.0.9 - @smithy/util-middleware@3.0.9 - @smithy/util-retry@3.0.9 ## 3.0.25 ### Patch Changes - @smithy/smithy-client@3.4.2 ## 3.0.24 ### Patch Changes - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/smithy-client@3.4.1 - @smithy/node-config-provider@3.1.9 - @smithy/protocol-http@4.1.5 - @smithy/service-error-classification@3.0.8 - @smithy/util-middleware@3.0.8 - @smithy/util-retry@3.0.8 ## 3.0.23 ### Patch Changes - Updated dependencies [75e0125] - @smithy/smithy-client@3.4.0 ## 3.0.22 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/node-config-provider@3.1.8 - @smithy/protocol-http@4.1.4 - @smithy/service-error-classification@3.0.7 - @smithy/smithy-client@3.3.6 - @smithy/util-middleware@3.0.7 - @smithy/util-retry@3.0.7 ## 3.0.21 ### Patch Changes - Updated dependencies [64600d8] - @smithy/smithy-client@3.3.5 ## 3.0.20 ### Patch Changes - @smithy/smithy-client@3.3.4 ## 3.0.19 ### Patch Changes - @smithy/smithy-client@3.3.3 ## 3.0.18 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/node-config-provider@3.1.7 - @smithy/protocol-http@4.1.3 - @smithy/service-error-classification@3.0.6 - @smithy/smithy-client@3.3.2 - @smithy/util-middleware@3.0.6 - @smithy/util-retry@3.0.6 ## 3.0.17 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/node-config-provider@3.1.6 - @smithy/protocol-http@4.1.2 - @smithy/service-error-classification@3.0.5 - @smithy/smithy-client@3.3.1 - @smithy/util-middleware@3.0.5 - @smithy/util-retry@3.0.5 ## 3.0.16 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [d8df7bf] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/smithy-client@3.3.0 - @smithy/node-config-provider@3.1.5 - @smithy/protocol-http@4.1.1 - @smithy/service-error-classification@3.0.4 - @smithy/util-middleware@3.0.4 - @smithy/util-retry@3.0.4 ## 3.0.15 ### Patch Changes - Updated dependencies [5865b65] - @smithy/smithy-client@3.2.0 ## 3.0.14 ### Patch Changes - Updated dependencies [670553a] - @smithy/smithy-client@3.1.12 ## 3.0.13 ### Patch Changes - @smithy/smithy-client@3.1.11 ## 3.0.12 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 - @smithy/smithy-client@3.1.10 ## 3.0.11 ### Patch Changes - @smithy/smithy-client@3.1.9 ## 3.0.10 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 - @smithy/smithy-client@3.1.8 ## 3.0.9 ### Patch Changes - @smithy/node-config-provider@3.1.4 - @smithy/smithy-client@3.1.7 ## 3.0.8 ### Patch Changes - @smithy/smithy-client@3.1.6 ## 3.0.7 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/node-config-provider@3.1.3 - @smithy/protocol-http@4.0.3 - @smithy/service-error-classification@3.0.3 - @smithy/smithy-client@3.1.5 - @smithy/util-middleware@3.0.3 - @smithy/util-retry@3.0.3 ## 3.0.6 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/node-config-provider@3.1.2 - @smithy/protocol-http@4.0.2 - @smithy/service-error-classification@3.0.2 - @smithy/smithy-client@3.1.4 - @smithy/util-middleware@3.0.2 - @smithy/util-retry@3.0.2 ## 3.0.5 ### Patch Changes - @smithy/smithy-client@3.1.3 ## 3.0.4 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/node-config-provider@3.1.1 - @smithy/protocol-http@4.0.1 - @smithy/service-error-classification@3.0.1 - @smithy/smithy-client@3.1.2 - @smithy/util-middleware@3.0.1 - @smithy/util-retry@3.0.1 ## 3.0.3 ### Patch Changes - Updated dependencies [3689c949] - @smithy/smithy-client@3.1.1 ## 3.0.2 ### Patch Changes - Updated dependencies [1cdd3be0] - Updated dependencies [764047eb] - @smithy/node-config-provider@3.1.0 - @smithy/smithy-client@3.1.0 ## 3.0.1 ### Patch Changes - @smithy/smithy-client@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/service-error-classification@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/protocol-http@4.0.0 - @smithy/smithy-client@3.0.0 - @smithy/util-retry@3.0.0 ## 2.3.1 ### Patch Changes - @smithy/smithy-client@2.5.1 ## 2.3.0 ### Minor Changes - e03a10ac: Set uuid to ^9.0.1 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/node-config-provider@2.3.0 - @smithy/util-middleware@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/smithy-client@2.5.0 - @smithy/util-retry@2.2.0 - @smithy/types@2.12.0 - @smithy/service-error-classification@2.1.5 ## 2.1.7 ### Patch Changes - @smithy/smithy-client@2.4.5 ## 2.1.6 ### Patch Changes - @smithy/smithy-client@2.4.4 ## 2.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 - @smithy/protocol-http@3.2.2 - @smithy/service-error-classification@2.1.4 - @smithy/smithy-client@2.4.3 - @smithy/util-middleware@2.1.4 - @smithy/util-retry@2.1.4 ## 2.1.4 ### Patch Changes - @smithy/node-config-provider@2.2.4 - @smithy/smithy-client@2.4.2 ## 2.1.3 ### Patch Changes - dd0d9b4b: make clock skew correcting errors transient - Updated dependencies [dd0d9b4b] - @smithy/service-error-classification@2.1.3 - @smithy/types@2.10.1 - @smithy/util-retry@2.1.3 - @smithy/node-config-provider@2.2.3 - @smithy/protocol-http@3.2.1 - @smithy/smithy-client@2.4.1 - @smithy/util-middleware@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/smithy-client@2.4.0 - @smithy/node-config-provider@2.2.2 - @smithy/service-error-classification@2.1.2 - @smithy/util-middleware@2.1.2 - @smithy/util-retry@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/node-config-provider@2.2.1 - @smithy/protocol-http@3.1.1 - @smithy/service-error-classification@2.1.1 - @smithy/smithy-client@2.3.1 - @smithy/types@2.9.1 - @smithy/util-middleware@2.1.1 - @smithy/util-retry@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/service-error-classification@2.1.0 - @smithy/node-config-provider@2.2.0 - @smithy/util-middleware@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/smithy-client@2.3.0 - @smithy/util-retry@2.1.0 - @smithy/types@2.9.0 ## 2.0.26 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/smithy-client@2.2.1 - @smithy/node-config-provider@2.1.9 - @smithy/protocol-http@3.0.12 - @smithy/service-error-classification@2.0.9 - @smithy/util-middleware@2.0.9 - @smithy/util-retry@2.0.9 ## 2.0.25 ### Patch Changes - Updated dependencies [164f3bbd] - Updated dependencies [164f3bbd] - @smithy/smithy-client@2.2.0 ## 2.0.24 ### Patch Changes - @smithy/node-config-provider@2.1.8 ## 2.0.23 ### Patch Changes - @smithy/smithy-client@2.1.18 ## 2.0.22 ### Patch Changes - 44f78bd9: prevent retries of streaming requests - Updated dependencies [07ff207b] - Updated dependencies [340634a5] - @smithy/smithy-client@2.1.17 - @smithy/types@2.7.0 - @smithy/node-config-provider@2.1.7 - @smithy/protocol-http@3.0.11 - @smithy/service-error-classification@2.0.8 - @smithy/util-middleware@2.0.8 - @smithy/util-retry@2.0.8 ## 2.0.21 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/node-config-provider@2.1.6 - @smithy/protocol-http@3.0.10 - @smithy/service-error-classification@2.0.7 - @smithy/util-middleware@2.0.7 - @smithy/util-retry@2.0.7 ## 2.0.20 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/node-config-provider@2.1.5 - @smithy/protocol-http@3.0.9 - @smithy/service-error-classification@2.0.6 - @smithy/util-middleware@2.0.6 - @smithy/util-retry@2.0.6 ## 2.0.19 ### Patch Changes - @smithy/node-config-provider@2.1.4 ## 2.0.18 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/node-config-provider@2.1.3 - @smithy/protocol-http@3.0.8 - @smithy/service-error-classification@2.0.5 - @smithy/util-middleware@2.0.5 - @smithy/util-retry@2.0.5 ## 2.0.17 ### Patch Changes - @smithy/node-config-provider@2.1.2 ## 2.0.16 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/node-config-provider@2.1.1 - @smithy/protocol-http@3.0.7 - @smithy/service-error-classification@2.0.4 - @smithy/util-middleware@2.0.4 - @smithy/util-retry@2.0.4 ## 2.0.15 ### Patch Changes - Updated dependencies [7b568c39] - @smithy/node-config-provider@2.1.0 ## 2.0.14 ### Patch Changes - @smithy/node-config-provider@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/node-config-provider@2.0.13 - @smithy/protocol-http@3.0.6 - @smithy/service-error-classification@2.0.3 - @smithy/util-middleware@2.0.3 - @smithy/util-retry@2.0.3 ## 2.0.12 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/node-config-provider@2.0.12 - @smithy/protocol-http@3.0.5 - @smithy/service-error-classification@2.0.2 - @smithy/util-middleware@2.0.2 - @smithy/util-retry@2.0.2 ## 2.0.11 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - Updated dependencies [5b6fa539] - @smithy/types@2.3.2 - @smithy/service-error-classification@2.0.1 - @smithy/util-middleware@2.0.1 - @smithy/util-retry@2.0.1 - @smithy/node-config-provider@2.0.11 - @smithy/protocol-http@3.0.4 ## 2.0.10 ### Patch Changes - 2d9473cf: Link to util-retry documentation - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/node-config-provider@2.0.10 - @smithy/protocol-http@3.0.3 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.9 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 2.0.8 ### Patch Changes - d3daa891: Move @smithy/node-config-provider to deps - @smithy/node-config-provider@2.0.9 ## 2.0.7 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.5 ### Patch Changes - 1be3c4c9: Add integration tests - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/protocol-http@2.0.5 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/protocol-http@2.0.4 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/protocol-http@2.0.3 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/protocol-http@2.0.2 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/protocol-http@2.0.1 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/protocol-http@2.0.0 - @smithy/service-error-classification@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-retry@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/protocol-http@1.2.0 - @smithy/service-error-classification@1.1.0 - @smithy/types@1.2.0 - @smithy/util-middleware@1.1.0 - @smithy/util-retry@1.1.0 ## 1.0.5 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/protocol-http@1.1.2 - @smithy/service-error-classification@1.0.3 - @smithy/util-middleware@1.0.2 - @smithy/util-retry@1.0.4 ## 1.0.4 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/service-error-classification@1.0.3 - @smithy/util-middleware@1.0.2 - @smithy/protocol-http@1.1.1 - @smithy/util-retry@1.0.4 - @smithy/types@1.1.1 ## 1.0.3 ### Patch Changes - Updated dependencies [c03ce2aa] - Updated dependencies [170ac764] - @smithy/service-error-classification@1.0.2 - @smithy/util-retry@1.0.3 ## 1.0.2 ### Patch Changes - Updated dependencies [d4dbe242] - @smithy/util-retry@1.0.2 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/service-error-classification@1.0.1 - @smithy/util-middleware@1.0.1 - @smithy/util-retry@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-retry](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-retry/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/configurations.spec.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { Provider } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { AdaptiveRetryStrategy } from "../util-retry/AdaptiveRetryStrategy"; import { StandardRetryStrategy } from "../util-retry/StandardRetryStrategy"; import { DEFAULT_MAX_ATTEMPTS } from "../util-retry/config"; import { CONFIG_MAX_ATTEMPTS, ENV_MAX_ATTEMPTS, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, resolveRetryConfig, } from "./configurations"; vi.mock("@smithy/core/client"); vi.mock("../util-retry/AdaptiveRetryStrategy"); vi.mock("../util-retry/StandardRetryStrategy"); describe(resolveRetryConfig.name, () => { const retryMode = vi.fn() as any; beforeEach(() => { vi.mocked(normalizeProvider).mockImplementation((input) => typeof input === "function" ? (input as Provider) : () => Promise.resolve(input) ); }); afterEach(() => { vi.clearAllMocks(); }); it("maintains object custody", () => { const input = { retryMode: "STANDARD", }; expect(resolveRetryConfig(input)).toBe(input); }); describe("maxAttempts", () => { it.each([1, 2, 3])("assigns provided value %s", async (maxAttempts) => { const output = await resolveRetryConfig({ maxAttempts, retryMode }).maxAttempts(); expect(output).toStrictEqual(maxAttempts); }); it(`assigns default ${DEFAULT_MAX_ATTEMPTS} is value not provided`, async () => { const output = await resolveRetryConfig({ retryMode }).maxAttempts(); expect(output).toStrictEqual(DEFAULT_MAX_ATTEMPTS); }); }); describe("retryStrategy", () => { it("passes retryStrategy if present", async () => { const mockRetryStrategy = { retry: vi.fn(), }; const { retryStrategy } = resolveRetryConfig({ retryMode, retryStrategy: mockRetryStrategy, }); expect(await retryStrategy()).toEqual(mockRetryStrategy); }); describe("creates RetryStrategy if retryStrategy not present", () => { describe("StandardRetryStrategy", () => { describe("when retryMode=standard", () => { describe("passes maxAttempts if present", () => { const retryMode = "standard"; for (const maxAttempts of [1, 2, 3]) { it(`when maxAttempts=${maxAttempts}`, async () => { const { retryStrategy } = resolveRetryConfig({ maxAttempts, retryMode }); await retryStrategy(); expect(vi.mocked(StandardRetryStrategy)).toHaveBeenCalledTimes(1); expect(vi.mocked(AdaptiveRetryStrategy)).not.toHaveBeenCalled(); const output = await vi.mocked(StandardRetryStrategy as any).mock.calls[0][0](); expect(output).toStrictEqual(maxAttempts); }); } }); }); describe("when retryMode returns 'standard'", () => { describe("passes maxAttempts if present", () => { beforeEach(() => { retryMode.mockResolvedValueOnce("standard"); }); for (const maxAttempts of [1, 2, 3]) { it(`when maxAttempts=${maxAttempts}`, async () => { const { retryStrategy } = resolveRetryConfig({ maxAttempts, retryMode }); await retryStrategy(); expect(retryMode).toHaveBeenCalledTimes(1); expect(vi.mocked(StandardRetryStrategy)).toHaveBeenCalledTimes(1); expect(vi.mocked(AdaptiveRetryStrategy)).not.toHaveBeenCalled(); const output = await vi.mocked(StandardRetryStrategy as any).mock.calls[0][0](); expect(output).toStrictEqual(maxAttempts); }); } }); }); }); describe("AdaptiveRetryStrategy", () => { describe("when retryMode=adaptive", () => { describe("passes maxAttempts if present", () => { const retryMode = "adaptive"; for (const maxAttempts of [1, 2, 3]) { it(`when maxAttempts=${maxAttempts}`, async () => { const { retryStrategy } = resolveRetryConfig({ maxAttempts, retryMode }); await retryStrategy(); expect(vi.mocked(StandardRetryStrategy)).not.toHaveBeenCalled(); expect(vi.mocked(AdaptiveRetryStrategy)).toHaveBeenCalledTimes(1); const output = await vi.mocked(AdaptiveRetryStrategy as any).mock.calls[0][0](); expect(output).toStrictEqual(maxAttempts); }); } }); }); describe("when retryMode returns 'adaptive'", () => { describe("passes maxAttempts if present", () => { beforeEach(() => { retryMode.mockResolvedValueOnce("adaptive"); }); for (const maxAttempts of [1, 2, 3]) { it(`when maxAttempts=${maxAttempts}`, async () => { const { retryStrategy } = resolveRetryConfig({ maxAttempts, retryMode }); await retryStrategy(); expect(retryMode).toHaveBeenCalledTimes(1); expect(vi.mocked(StandardRetryStrategy)).not.toHaveBeenCalled(); expect(vi.mocked(AdaptiveRetryStrategy)).toHaveBeenCalledTimes(1); const output = await vi.mocked(AdaptiveRetryStrategy as any).mock.calls[0][0](); expect(output).toStrictEqual(maxAttempts); }); } }); }); }); }); describe("memoizes default strategy across calls", () => { it("should return the same promise for concurrent calls (no race condition)", async () => { const retryMode = "standard"; const { retryStrategy } = resolveRetryConfig({ maxAttempts: 3, retryMode }); const [a, b] = await Promise.all([retryStrategy(), retryStrategy()]); expect(a).toBe(b); expect(vi.mocked(StandardRetryStrategy)).toHaveBeenCalledTimes(1); }); it("should return the same instance on sequential calls", async () => { const retryMode = "standard"; const { retryStrategy } = resolveRetryConfig({ maxAttempts: 3, retryMode }); const first = await retryStrategy(); const second = await retryStrategy(); expect(first).toBe(second); expect(vi.mocked(StandardRetryStrategy)).toHaveBeenCalledTimes(1); }); it("should memoize adaptive strategy the same way", async () => { const retryMode = "adaptive"; const { retryStrategy } = resolveRetryConfig({ maxAttempts: 3, retryMode }); const [a, b] = await Promise.all([retryStrategy(), retryStrategy()]); expect(a).toBe(b); expect(vi.mocked(AdaptiveRetryStrategy)).toHaveBeenCalledTimes(1); }); }); }); describe("node maxAttempts config options", () => { describe("environmentVariableSelector", () => { it(`should return value of env ${ENV_MAX_ATTEMPTS} is number`, () => { const value = "3"; const env = { [ENV_MAX_ATTEMPTS]: value }; expect(NODE_MAX_ATTEMPT_CONFIG_OPTIONS.environmentVariableSelector(env)).toBe(parseInt(value)); }); it(`should return undefined if env ${ENV_MAX_ATTEMPTS} is not set`, () => { expect(NODE_MAX_ATTEMPT_CONFIG_OPTIONS.environmentVariableSelector({})).toBe(undefined); }); it(`should throw if if value of env ${ENV_MAX_ATTEMPTS} is not a number`, () => { const value = "not a number"; const env = { [ENV_MAX_ATTEMPTS]: value }; expect(() => NODE_MAX_ATTEMPT_CONFIG_OPTIONS.environmentVariableSelector(env)).toThrow(); }); }); describe("configFileSelector", () => { it(`should return value of shared INI files entry ${CONFIG_MAX_ATTEMPTS} is number`, () => { const value = "3"; const profile = { [CONFIG_MAX_ATTEMPTS]: value }; expect(NODE_MAX_ATTEMPT_CONFIG_OPTIONS.configFileSelector(profile)).toBe(parseInt(value)); }); it(`should return undefined if shared INI files entry ${CONFIG_MAX_ATTEMPTS} is not set`, () => { expect(NODE_MAX_ATTEMPT_CONFIG_OPTIONS.configFileSelector({})).toBe(undefined); }); it(`should throw if shared INI files entry ${CONFIG_MAX_ATTEMPTS} is not a number`, () => { const value = "not a number"; const profile = { [CONFIG_MAX_ATTEMPTS]: value }; expect(() => NODE_MAX_ATTEMPT_CONFIG_OPTIONS.configFileSelector(profile)).toThrow(); }); }); describe("default", () => { it(`should equal to ${DEFAULT_MAX_ATTEMPTS}`, () => { expect(NODE_MAX_ATTEMPT_CONFIG_OPTIONS.default).toBe(DEFAULT_MAX_ATTEMPTS); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/configurations.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { LoadedConfigSelectors } from "@smithy/core/config"; import type { Logger, Provider, RetryStrategy, RetryStrategyV2 } from "@smithy/types"; import { AdaptiveRetryStrategy } from "../util-retry/AdaptiveRetryStrategy"; import { StandardRetryStrategy } from "../util-retry/StandardRetryStrategy"; import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE, RETRY_MODES } from "../util-retry/config"; /** * @internal */ export const ENV_MAX_ATTEMPTS = "AWS_MAX_ATTEMPTS"; /** * @internal */ export const CONFIG_MAX_ATTEMPTS = "max_attempts"; /** * @internal */ export const NODE_MAX_ATTEMPT_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => { const value = env[ENV_MAX_ATTEMPTS]; if (!value) return undefined; const maxAttempt = parseInt(value); if (Number.isNaN(maxAttempt)) { throw new Error(`Environment variable ${ENV_MAX_ATTEMPTS} mast be a number, got "${value}"`); } return maxAttempt; }, configFileSelector: (profile) => { const value = profile[CONFIG_MAX_ATTEMPTS]; if (!value) return undefined; const maxAttempt = parseInt(value); if (Number.isNaN(maxAttempt)) { throw new Error(`Shared config file entry ${CONFIG_MAX_ATTEMPTS} mast be a number, got "${value}"`); } return maxAttempt; }, default: DEFAULT_MAX_ATTEMPTS, }; /** * @public */ export interface RetryInputConfig { /** * The maximum number of times requests that encounter retryable failures should be attempted. */ maxAttempts?: number | Provider; /** * The strategy to retry the request. Using built-in exponential backoff strategy by default. */ retryStrategy?: RetryStrategy | RetryStrategyV2; } /** * @internal */ export interface PreviouslyResolved { /** * Specifies provider for retry algorithm to use. * @internal */ retryMode: string | Provider; logger?: Logger; } /** * @internal */ export interface RetryResolvedConfig { /** * Resolved value for input config {@link RetryInputConfig.maxAttempts} */ maxAttempts: Provider; /** * Resolved value for input config {@link RetryInputConfig.retryStrategy} */ retryStrategy: Provider; logger?: Logger; } /** * @internal */ export const resolveRetryConfig = (input: T & PreviouslyResolved & RetryInputConfig): T & RetryResolvedConfig => { const { retryStrategy, retryMode } = input; const maxAttempts = normalizeProvider(input.maxAttempts ?? DEFAULT_MAX_ATTEMPTS); let controller: Promise | undefined = retryStrategy ? Promise.resolve(retryStrategy) : undefined; const getDefault = async () => (await normalizeProvider(retryMode)()) === RETRY_MODES.ADAPTIVE ? new AdaptiveRetryStrategy(maxAttempts) : new StandardRetryStrategy(maxAttempts); return Object.assign(input, { maxAttempts, retryStrategy: () => (controller ??= getDefault()), }); }; /** * @internal */ export const ENV_RETRY_MODE = "AWS_RETRY_MODE"; /** * @internal */ export const CONFIG_RETRY_MODE = "retry_mode"; /** * @internal */ export const NODE_RETRY_MODE_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => env[ENV_RETRY_MODE], configFileSelector: (profile) => profile[CONFIG_RETRY_MODE], default: DEFAULT_RETRY_MODE, }; ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/isStreamingPayload/isStreamingPayload.browser.ts ================================================ import type { HttpRequest } from "@smithy/core/protocols"; /** * @internal */ export const isStreamingPayload = (request: HttpRequest): boolean => request?.body instanceof ReadableStream; ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/isStreamingPayload/isStreamingPayload.ts ================================================ import { Readable } from "node:stream"; import type { HttpRequest } from "@smithy/core/protocols"; /** * @internal */ export const isStreamingPayload = (request: HttpRequest): boolean => request?.body instanceof Readable || (typeof ReadableStream !== "undefined" && request?.body instanceof ReadableStream); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/longPollMiddleware.spec.ts ================================================ import type { HandlerExecutionContext } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { longPollMiddleware } from "./longPollMiddleware"; describe("long poll middleware", () => { it("sets long poll mode on request context", async () => { const context = {} as HandlerExecutionContext; const handler = longPollMiddleware(); const next = (async () => {}) as any; const mwFunction = handler(next, context); await mwFunction({} as any); expect(context.__retryLongPoll).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/longPollMiddleware.ts ================================================ import type { HandlerExecutionContext, InitializeHandler, InitializeHandlerArguments, InitializeHandlerOptions, InitializeHandlerOutput, MetadataBearer, Pluggable, } from "@smithy/types"; import type { RetryResolvedConfig } from "./configurations"; /** * This middleware is attached to operations designated as long-polling. * @internal */ export const longPollMiddleware = () => ( next: InitializeHandler, context: HandlerExecutionContext ): InitializeHandler => async (args: InitializeHandlerArguments): Promise> => { context.__retryLongPoll = true; return next(args); }; /** * @internal */ export const longPollMiddlewareOptions: InitializeHandlerOptions = { name: "longPollMiddleware", tags: ["RETRY"], step: "initialize", override: true, }; /** * @internal */ export const getLongPollPlugin = (options: RetryResolvedConfig): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(longPollMiddleware(), longPollMiddlewareOptions); }, }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/omitRetryHeadersMiddleware.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { FinalizeHandlerArguments, MiddlewareStack } from "@smithy/types"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "../util-retry/constants"; import { getOmitRetryHeadersPlugin, omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, } from "./omitRetryHeadersMiddleware"; describe("getOmitRetryHeadersPlugin", () => { const mockClientStack = { add: vi.fn(), addRelativeTo: vi.fn(), }; afterEach(() => { vi.clearAllMocks(); }); it(`adds omitRetryHeadersMiddleware`, () => { getOmitRetryHeadersPlugin({}).applyToStack(mockClientStack as unknown as MiddlewareStack); expect(mockClientStack.addRelativeTo).toHaveBeenCalledTimes(1); expect(mockClientStack.addRelativeTo.mock.calls[0][1]).toEqual(omitRetryHeadersMiddlewareOptions); }); }); describe("omitRetryHeadersMiddleware", () => { afterEach(() => { vi.clearAllMocks(); }); it("remove retry headers", async () => { const next = vi.fn(); const args = { request: new HttpRequest({ headers: { [INVOCATION_ID_HEADER]: "12345", [REQUEST_HEADER]: "maxAttempts=30", }, }), }; await omitRetryHeadersMiddleware()(next)(args as FinalizeHandlerArguments); expect(next).toHaveBeenCalledTimes(1); expect(next.mock.calls[0][0].request.headers[INVOCATION_ID_HEADER]).toBeUndefined(); expect(next.mock.calls[0][0].request.headers[REQUEST_HEADER]).toBeUndefined(); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/omitRetryHeadersMiddleware.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, MetadataBearer, Pluggable, RelativeMiddlewareOptions, } from "@smithy/types"; import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "../util-retry/constants"; /** * This is still in use. * See AddOmitRetryHeadersDependency.java. * @internal */ export const omitRetryHeadersMiddleware = () => (next: FinalizeHandler): FinalizeHandler => async (args: FinalizeHandlerArguments): Promise> => { const { request } = args; if (HttpRequest.isInstance(request)) { delete request.headers[INVOCATION_ID_HEADER]; delete request.headers[REQUEST_HEADER]; } return next(args); }; /** * @internal */ export const omitRetryHeadersMiddlewareOptions: RelativeMiddlewareOptions = { name: "omitRetryHeadersMiddleware", tags: ["RETRY", "HEADERS", "OMIT_RETRY_HEADERS"], relation: "before", toMiddleware: "awsAuthMiddleware", override: true, }; /** * @internal */ export const getOmitRetryHeadersPlugin = ( // eslint-disable-next-line @typescript-eslint/no-unused-vars options: unknown ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(omitRetryHeadersMiddleware(), omitRetryHeadersMiddlewareOptions); }, }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/parseRetryAfterHeader.spec.ts ================================================ import { HttpResponse } from "@smithy/core/protocols"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { parseRetryAfterHeader } from "./parseRetryAfterHeader"; describe(parseRetryAfterHeader.name, () => { const NOW = 1_773_769_074_339; beforeEach(() => { vi.useFakeTimers({ now: NOW }); }); afterEach(() => { vi.useRealTimers(); }); it("returns undefined for non-HttpResponse input", () => { expect(parseRetryAfterHeader("not a response")).toBeUndefined(); expect(parseRetryAfterHeader(null)).toBeUndefined(); expect(parseRetryAfterHeader(undefined)).toBeUndefined(); }); it("returns undefined when no retry headers are present", () => { const response = new HttpResponse({ statusCode: 503, headers: { "content-type": "application/json" } }); expect(parseRetryAfterHeader(response)).toBeUndefined(); }); describe("retry-after header", () => { it("parses plain numeric seconds", () => { const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": "120" } }); const result = parseRetryAfterHeader(response); expect(result).toEqual(new Date(NOW + 120_000)); }); it("parses RFC 7231 date string ending in GMT", () => { const futureDate = new Date(NOW + 60_000); const rfc7231 = futureDate.toUTCString(); // "Tue, 14 Nov 2023 22:14:20 GMT" const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": rfc7231 } }); const result = parseRetryAfterHeader(response); expect(result).toBeInstanceOf(Date); expect(result!.getTime()).toBeGreaterThanOrEqual(NOW + 59_000); expect(result!.getTime()).toBeLessThanOrEqual(NOW + 61_000); }); it("parses 'GMT, ' suffix format", () => { const futureDate = new Date(NOW + 30_000); const rfc7231 = futureDate.toUTCString(); const headerValue = `${rfc7231}, 45`; const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": headerValue } }); const result = parseRetryAfterHeader(response); expect(result).toEqual(new Date(NOW + 45_000)); }); it("returns undefined for non-numeric, non-date string", () => { const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": "not-a-number" } }); expect(parseRetryAfterHeader(response)).toBeUndefined(); }); it("returns undefined when RFC 7231 parsing fails", () => { const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": "Invalid Date GMT" } }); const logger = { trace: vi.fn() } as any; const result = parseRetryAfterHeader(response, logger); expect(result).toBeUndefined(); }); it("as a last resort (backwards compatibility), ISO format headers are also parsed", () => { const futureDate = new Date(NOW + 30_000); const isoDate = futureDate.toISOString(); const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": isoDate } }); const result = parseRetryAfterHeader(response); expect(result).toBeInstanceOf(Date); expect(result!.getTime()).toBeGreaterThanOrEqual(NOW + 29_000); expect(result!.getTime()).toBeLessThanOrEqual(NOW + 31_000); }); }); describe("x-amz-retry-after header", () => { it("parses milliseconds value", () => { const response = new HttpResponse({ statusCode: 503, headers: { "x-amz-retry-after": "5000" } }); const result = parseRetryAfterHeader(response); expect(result).toEqual(new Date(NOW + 5000)); }); it("returns undefined for non-numeric value", () => { const logger = { trace: vi.fn() } as any; const response = new HttpResponse({ statusCode: 503, headers: { "x-amz-retry-after": "abc" } }); expect(parseRetryAfterHeader(response, logger)).toBeUndefined(); expect(logger.trace).toHaveBeenCalled(); }); }); it("prefers retry-after over x-amz-retry-after when retry-after comes first", () => { const response = new HttpResponse({ statusCode: 503, headers: { "retry-after": "10", "x-amz-retry-after": "9999" }, }); const result = parseRetryAfterHeader(response); expect(result).toEqual(new Date(NOW + 10_000)); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/parseRetryAfterHeader.ts ================================================ import { HttpResponse } from "@smithy/core/protocols"; import { parseRfc7231DateTime } from "@smithy/core/serde"; import type { Logger } from "@smithy/types"; /** * @internal */ export function parseRetryAfterHeader(response: unknown, logger?: Logger): Date | undefined { if (!HttpResponse.isInstance(response)) { return; } for (const header of Object.keys(response.headers)) { const h = header.toLowerCase(); if (h === "retry-after") { const retryAfter = response.headers[header]; let retryAfterSeconds: number = NaN; if (retryAfter.endsWith("GMT")) { try { const date = parseRfc7231DateTime(retryAfter); retryAfterSeconds = (date!.getTime() - Date.now()) / 1000; } catch (e) { // ignored logger?.trace?.("Failed to parse retry-after header"); logger?.trace?.(e); } } else if (retryAfter.match(/ GMT, ((\d+)|(\d+\.\d+))$/)) { retryAfterSeconds = Number(retryAfter.match(/ GMT, ([\d.]+)$/)?.[1]); } else if (retryAfter.match(/^((\d+)|(\d+\.\d+))$/)) { retryAfterSeconds = Number(retryAfter); } else if (Date.parse(retryAfter) >= Date.now()) { // non-standard header value, attempt to parse as date. retryAfterSeconds = (Date.parse(retryAfter) - Date.now()) / 1000; } if (isNaN(retryAfterSeconds)) { return; } return new Date(Date.now() + retryAfterSeconds * 1000); } else if (h === "x-amz-retry-after") { const v = response.headers[header]; const backoffMilliseconds = Number(v); if (isNaN(backoffMilliseconds)) { logger?.trace?.(`Failed to parse x-amz-retry-after=${v}`); return; } return new Date(Date.now() + backoffMilliseconds); } } } /** * Backwards-compatibility alias. * @internal */ export function getRetryAfterHint(response: unknown, logger?: Logger): Date | undefined { return parseRetryAfterHeader(response, logger); } ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/AdaptiveRetryStrategy.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { DefaultRateLimiter } from "../../util-retry/DefaultRateLimiter"; import { RETRY_MODES } from "../../util-retry/config"; import type { RateLimiter } from "../../util-retry/types"; import { AdaptiveRetryStrategy } from "./AdaptiveRetryStrategy"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import type { RetryQuota } from "./types"; vi.mock("./StandardRetryStrategy"); vi.mock("../../util-retry/DefaultRateLimiter"); describe(AdaptiveRetryStrategy.name, () => { const maxAttemptsProvider = vi.fn(); const mockDefaultRateLimiter = { getSendToken: vi.fn(), updateClientSendingRate: vi.fn(), } as any; beforeEach(() => { vi.mocked(DefaultRateLimiter).mockReturnValue(mockDefaultRateLimiter); }); afterEach(() => { vi.clearAllMocks(); }); describe("constructor", () => { it("calls super constructor", () => { const retryDecider = vi.fn(); const delayDecider = vi.fn(); const retryQuota = {} as RetryQuota; const rateLimiter = {} as RateLimiter; new AdaptiveRetryStrategy(maxAttemptsProvider, { retryDecider, delayDecider, retryQuota, rateLimiter, }); expect(StandardRetryStrategy).toHaveBeenCalledWith(maxAttemptsProvider, { retryDecider, delayDecider, retryQuota, }); }); it(`sets mode=${RETRY_MODES.ADAPTIVE}`, () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider); expect(retryStrategy.mode).toStrictEqual(RETRY_MODES.ADAPTIVE); }); describe("rateLimiter init", () => { it("sets getDefaultrateLimiter if options is undefined", () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider); expect(retryStrategy["rateLimiter"]).toBe(mockDefaultRateLimiter); }); it("sets getDefaultrateLimiter if options.delayDecider undefined", () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, {}); expect(retryStrategy["rateLimiter"]).toBe(mockDefaultRateLimiter); }); it("sets options.rateLimiter if defined", () => { const rateLimiter = {} as RateLimiter; const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter, }); expect(retryStrategy["rateLimiter"]).toBe(rateLimiter); }); }); }); describe("retry", () => { const mockedSuperRetry = vi.spyOn(StandardRetryStrategy.prototype, "retry"); beforeEach(async () => { const next = vi.fn(); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider); await retryStrategy.retry(next, { request: { headers: {} } } as any); expect(mockedSuperRetry).toHaveBeenCalledTimes(1); }); afterEach(() => { vi.clearAllMocks(); }); it("calls rateLimiter.getSendToken in beforeRequest", async () => { expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(0); await mockedSuperRetry.mock.calls[0][2]!.beforeRequest(); expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(1); }); it("calls rateLimiter.updateClientSendingRate in afterRequest", async () => { expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(0); await mockedSuperRetry.mock.calls[0][2]!.afterRequest(); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(1); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/AdaptiveRetryStrategy.ts ================================================ import type { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider } from "@smithy/types"; import { DefaultRateLimiter } from "../../util-retry/DefaultRateLimiter"; import { RETRY_MODES } from "../../util-retry/config"; import type { RateLimiter } from "../../util-retry/types"; import { StandardRetryStrategy, type StandardRetryStrategyOptions } from "./StandardRetryStrategy"; /** * Strategy options to be passed to AdaptiveRetryStrategy * @public * @deprecated replaced by \@smithy/util-retry (SRA). */ export interface AdaptiveRetryStrategyOptions extends StandardRetryStrategyOptions { rateLimiter?: RateLimiter; } /** * @public * @deprecated use AdaptiveRetryStrategy from @smithy/util-retry */ export class AdaptiveRetryStrategy extends StandardRetryStrategy { private rateLimiter: RateLimiter; constructor(maxAttemptsProvider: Provider, options?: AdaptiveRetryStrategyOptions) { const { rateLimiter, ...superOptions } = options ?? {}; super(maxAttemptsProvider, superOptions); this.rateLimiter = rateLimiter ?? new DefaultRateLimiter(); this.mode = RETRY_MODES.ADAPTIVE; } async retry( next: FinalizeHandler, args: FinalizeHandlerArguments ) { return super.retry(next, args, { beforeRequest: async () => { return this.rateLimiter.getSendToken(); }, afterRequest: (response: any) => { this.rateLimiter.updateClientSendingRate(response); }, }); } } ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/StandardRetryStrategy.spec.ts ================================================ import { HttpRequest, HttpResponse } from "@smithy/core/protocols"; import { v4 } from "@smithy/core/serde"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { isThrottlingError } from "../../service-error-classification/service-error-classification"; import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from "../../util-retry/config"; import { DEFAULT_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, THROTTLING_RETRY_DELAY_BASE, } from "../../util-retry/constants"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import { getDefaultRetryQuota } from "./defaultRetryQuota"; import { defaultDelayDecider } from "./delayDecider"; import { defaultRetryDecider } from "./retryDecider"; import type { RetryQuota } from "./types"; vi.mock("@smithy/core/protocols"); vi.mock("../../service-error-classification/service-error-classification"); vi.mock("./delayDecider"); vi.mock("./retryDecider"); vi.mock("./defaultRetryQuota"); vi.mock("@smithy/core/protocols"); vi.mock("@smithy/core/serde"); describe("defaultStrategy", () => { let next: any; // variable for next mock function in utility methods const maxAttempts = 3; const mockDefaultRetryQuota = { hasRetryTokens: vi.fn().mockReturnValue(true), retrieveRetryTokens: vi.fn().mockReturnValue(1), releaseRetryTokens: vi.fn(), }; const mockSuccessfulOperation = (maxAttempts: number, options?: { mockResponse?: string }) => { next = vi.fn().mockResolvedValueOnce({ response: options?.mockResponse, output: { $metadata: {} }, }); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); return retryStrategy.retry(next, { request: { headers: {} } } as any); }; const mockFailedOperation = async (maxAttempts: number, options?: { mockError?: Error }) => { const mockError = options?.mockError ?? new Error("mockError"); next = vi.fn().mockRejectedValue(mockError); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); try { await retryStrategy.retry(next, { request: { headers: {} } } as any); } catch (error) { expect(error).toStrictEqual(mockError); return error; } }; const mockSuccessAfterOneFail = (maxAttempts: number, options?: { mockError?: Error; mockResponse?: string }) => { const mockError = options?.mockError ?? new Error("mockError"); const mockResponse = { response: options?.mockResponse, output: { $metadata: {} }, }; next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockResponse); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); return retryStrategy.retry(next, { request: { headers: {} } } as any); }; const mockSuccessAfterTwoFails = (maxAttempts: number, options?: { mockError?: Error; mockResponse?: string }) => { const mockError = options?.mockError ?? new Error("mockError"); const mockResponse = { response: options?.mockResponse, output: { $metadata: {} }, }; next = vi .fn() .mockRejectedValueOnce(mockError) .mockRejectedValueOnce(mockError) .mockResolvedValueOnce(mockResponse); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); return retryStrategy.retry(next, { request: { headers: {} } } as any); }; beforeEach(() => { vi.mocked(isThrottlingError).mockReturnValue(true); vi.mocked(defaultDelayDecider).mockReturnValue(0); vi.mocked(defaultRetryDecider).mockReturnValue(true); vi.mocked(getDefaultRetryQuota).mockReturnValue(mockDefaultRetryQuota); (HttpRequest as unknown as any).mockReturnValue({ isInstance: vi.fn().mockReturnValue(false), }); (HttpResponse as unknown as any).mockReturnValue({ isInstance: vi.fn().mockReturnValue(false), }); vi.mocked(v4).mockReturnValue("42"); }); afterEach(() => { vi.clearAllMocks(); }); it("sets maxAttemptsProvider as class member variable", async () => { await Promise.all( [1, 2, 3].map(async (maxAttempts) => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(await retryStrategy["maxAttemptsProvider"]()).toBe(maxAttempts); }) ); }); it(`sets mode=${RETRY_MODES.STANDARD}`, () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(retryStrategy.mode).toStrictEqual(RETRY_MODES.STANDARD); }); it("handles non-standard errors", async () => { const nonStandardErrors = [undefined, "foo", { foo: "bar" }, 123, false, null]; const maxAttempts = 1; const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); for (const error of nonStandardErrors) { next = vi.fn().mockRejectedValue(error); expect(await retryStrategy.retry(next, { request: { headers: {} } } as any).catch((_) => _)).toBeInstanceOf( Error ); } }); describe("retryDecider init", () => { it("sets defaultRetryDecider if options is undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(retryStrategy["retryDecider"]).toBe(defaultRetryDecider); }); it("sets defaultRetryDecider if options.retryDecider is undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), {}); expect(retryStrategy["retryDecider"]).toBe(defaultRetryDecider); }); it("sets options.retryDecider if defined", () => { const retryDecider = vi.fn(); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), { retryDecider, }); expect(retryStrategy["retryDecider"]).toBe(retryDecider); }); }); describe("delayDecider init", () => { it("sets defaultDelayDecider if options is undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(retryStrategy["delayDecider"]).toBe(defaultDelayDecider); }); it("sets defaultDelayDecider if options.delayDecider undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), {}); expect(retryStrategy["delayDecider"]).toBe(defaultDelayDecider); }); it("sets options.delayDecider if defined", () => { const delayDecider = vi.fn(); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), { delayDecider, }); expect(retryStrategy["delayDecider"]).toBe(delayDecider); }); }); describe("retryQuota init", () => { it("sets getDefaultRetryQuota if options is undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(retryStrategy["retryQuota"]).toBe(getDefaultRetryQuota(INITIAL_RETRY_TOKENS)); }); it("sets getDefaultRetryQuota if options.delayDecider undefined", () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), {}); expect(retryStrategy["retryQuota"]).toBe(getDefaultRetryQuota(INITIAL_RETRY_TOKENS)); }); it("sets options.retryQuota if defined", () => { const retryQuota = {} as RetryQuota; const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts), { retryQuota, }); expect(retryStrategy["retryQuota"]).toBe(retryQuota); }); }); describe("delayDecider", () => { describe("delayBase value passed", () => { const testDelayBasePassed = async (delayBaseToTest: number, mockThrottlingError: boolean) => { vi.mocked(isThrottlingError).mockReturnValueOnce(mockThrottlingError); const mockError = new Error(); await mockSuccessAfterOneFail(maxAttempts, { mockError }); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledWith(mockError); expect(vi.mocked(defaultDelayDecider)).toHaveBeenCalledTimes(1); expect(vi.mocked(defaultDelayDecider).mock.calls[0][0]).toBe(delayBaseToTest); }; it("should be equal to THROTTLING_RETRY_DELAY_BASE if error is throttling error", async () => { return testDelayBasePassed(THROTTLING_RETRY_DELAY_BASE, true); }); it("should be equal to DEFAULT_RETRY_DELAY_BASE in error is not a throttling error", async () => { return testDelayBasePassed(DEFAULT_RETRY_DELAY_BASE, false); }); }); describe("attempts value passed", () => { it("on successful operation", async () => { await mockSuccessfulOperation(maxAttempts); expect(vi.mocked(defaultDelayDecider)).not.toHaveBeenCalled(); }); it("in case of single failure", async () => { await mockSuccessAfterOneFail(maxAttempts); expect(vi.mocked(defaultDelayDecider)).toHaveBeenCalledTimes(1); expect(vi.mocked(defaultDelayDecider).mock.calls[0][1]).toBe(1); }); it("on all fails", async () => { await mockFailedOperation(maxAttempts); expect(vi.mocked(defaultDelayDecider)).toHaveBeenCalledTimes(2); expect(vi.mocked(defaultDelayDecider).mock.calls[0][1]).toBe(1); expect(vi.mocked(defaultDelayDecider).mock.calls[1][1]).toBe(2); }); }); describe("totalRetryDelay", () => { describe("when retry-after is not set", () => { it("should be equal to sum of values computed by delayDecider", async () => { vi.spyOn(global, "setTimeout"); const FIRST_DELAY = 100; const SECOND_DELAY = 200; vi.mocked(defaultDelayDecider).mockReturnValueOnce(FIRST_DELAY).mockReturnValueOnce(SECOND_DELAY); const maxAttempts = 3; const error = await mockFailedOperation(maxAttempts); expect(error.$metadata.totalRetryDelay).toEqual(FIRST_DELAY + SECOND_DELAY); expect(vi.mocked(defaultDelayDecider)).toHaveBeenCalledTimes(maxAttempts - 1); expect(setTimeout).toHaveBeenCalledTimes(maxAttempts - 1); expect((setTimeout as unknown as any).mock.calls[0][1]).toBe(FIRST_DELAY); expect((setTimeout as unknown as any).mock.calls[1][1]).toBe(SECOND_DELAY); }); }); describe("when retry-after is set", () => { const getErrorWithValues = async ( delayDeciderInMs: number, retryAfter: number | string, retryAfterHeaderName?: string ) => { vi.mocked(defaultDelayDecider).mockReturnValueOnce(delayDeciderInMs); const maxAttempts = 2; const mockError = new Error(); Object.defineProperty(mockError, "$response", { value: { headers: { [retryAfterHeaderName ? retryAfterHeaderName : "retry-after"]: String(retryAfter) }, }, }); const error = await mockFailedOperation(maxAttempts, { mockError }); expect(vi.mocked(defaultDelayDecider)).toHaveBeenCalledTimes(maxAttempts - 1); expect(setTimeout).toHaveBeenCalledTimes(maxAttempts - 1); return error; }; beforeEach(() => { vi.spyOn(global, "setTimeout"); }); describe("uses retry-after value if it's greater than that from delayDecider", () => { beforeEach(() => { const { isInstance } = HttpResponse; (isInstance as unknown as any).mockReturnValueOnce(true); }); describe("when value is in seconds", () => { const testWithHeaderName = async (retryAfterHeaderName: string) => { const delayDeciderInMs = 2000; const retryAfterInSeconds = 3; const error = await getErrorWithValues(delayDeciderInMs, retryAfterInSeconds, retryAfterHeaderName); expect(error.$metadata.totalRetryDelay).toEqual(retryAfterInSeconds * 1000); expect((setTimeout as unknown as any).mock.calls[0][1]).toBe(retryAfterInSeconds * 1000); }; it("with header in small case", async () => { testWithHeaderName("retry-after"); }); it("with header with first letter capital", async () => { testWithHeaderName("Retry-After"); }); }); it("when value is a Date", async () => { const mockDateNow = Date.now(); vi.spyOn(Date, "now").mockReturnValue(mockDateNow); const delayDeciderInMs = 2000; const retryAfterInSeconds = 3; const retryAfterDate = new Date(mockDateNow + retryAfterInSeconds * 1000); const error = await getErrorWithValues(delayDeciderInMs, retryAfterDate.toISOString()); expect(error.$metadata.totalRetryDelay).toEqual(retryAfterInSeconds * 1000); expect((setTimeout as unknown as any).mock.calls[0][1]).toBe(retryAfterInSeconds * 1000); }); }); it("ignores retry-after value if it's smaller than that from delayDecider", async () => { const delayDeciderInMs = 3000; const retryAfterInSeconds = 2; const error = await getErrorWithValues(delayDeciderInMs, retryAfterInSeconds); expect(error.$metadata.totalRetryDelay).toEqual(delayDeciderInMs); expect((setTimeout as unknown as any).mock.calls[0][1]).toBe(delayDeciderInMs); }); }); }); }); describe("retryQuota", () => { describe("hasRetryTokens", () => { it("not called on successful operation", async () => { const { hasRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockSuccessfulOperation(maxAttempts); expect(hasRetryTokens).not.toHaveBeenCalled(); }); it("called once in case of single failure", async () => { const { hasRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockSuccessAfterOneFail(maxAttempts); expect(hasRetryTokens).toHaveBeenCalledTimes(1); }); it("called once on each retry request", async () => { const { hasRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockFailedOperation(maxAttempts); expect(hasRetryTokens).toHaveBeenCalledTimes(maxAttempts - 1); }); }); describe("releaseRetryTokens", () => { it("called once without param on successful operation", async () => { const { releaseRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockSuccessfulOperation(maxAttempts); expect(releaseRetryTokens).toHaveBeenCalledTimes(1); expect(releaseRetryTokens).toHaveBeenCalledWith(undefined); }); it("called once with retryTokenAmount in case of single failure", async () => { const retryTokens = 15; const { releaseRetryTokens, retrieveRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); vi.mocked(retrieveRetryTokens).mockReturnValueOnce(retryTokens); await mockSuccessAfterOneFail(maxAttempts); expect(releaseRetryTokens).toHaveBeenCalledTimes(1); expect(releaseRetryTokens).toHaveBeenCalledWith(retryTokens); }); it("called once with second retryTokenAmount in case of two failures", async () => { const retryTokensFirst = 15; const retryTokensSecond = 30; const { releaseRetryTokens, retrieveRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); vi.mocked(retrieveRetryTokens).mockReturnValueOnce(retryTokensFirst).mockReturnValueOnce(retryTokensSecond); await mockSuccessAfterTwoFails(maxAttempts); expect(releaseRetryTokens).toHaveBeenCalledTimes(1); expect(releaseRetryTokens).toHaveBeenCalledWith(retryTokensSecond); }); it("not called on unsuccessful operation", async () => { const { releaseRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockFailedOperation(maxAttempts); expect(releaseRetryTokens).not.toHaveBeenCalled(); }); }); describe("retrieveRetryTokens", () => { it("not called on successful operation", async () => { const { retrieveRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockSuccessfulOperation(maxAttempts); expect(retrieveRetryTokens).not.toHaveBeenCalled(); }); it("called once in case of single failure", async () => { const { retrieveRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockSuccessAfterOneFail(maxAttempts); expect(retrieveRetryTokens).toHaveBeenCalledTimes(1); }); it("called once on each retry request", async () => { const { retrieveRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); await mockFailedOperation(maxAttempts); expect(retrieveRetryTokens).toHaveBeenCalledTimes(maxAttempts - 1); }); }); }); describe("should not retry", () => { it("when the handler completes successfully", async () => { const mockResponse = "mockResponse"; const { response, output } = await mockSuccessfulOperation(maxAttempts, { mockResponse, }); expect(response).toStrictEqual(mockResponse); expect(output.$metadata.attempts).toBe(1); expect(output.$metadata.totalRetryDelay).toBe(0); expect(vi.mocked(defaultRetryDecider)).not.toHaveBeenCalled(); expect(vi.mocked(defaultDelayDecider)).not.toHaveBeenCalled(); }); it("when retryDecider returns false", async () => { vi.mocked(defaultRetryDecider).mockReturnValueOnce(false); const mockError = new Error(); await mockFailedOperation(maxAttempts, { mockError }); expect(vi.mocked(defaultRetryDecider)).toHaveBeenCalledTimes(1); expect(vi.mocked(defaultRetryDecider)).toHaveBeenCalledWith(mockError); }); it("when the maximum number of attempts is reached", async () => { await mockFailedOperation(maxAttempts); expect(vi.mocked(defaultRetryDecider)).toHaveBeenCalledTimes(maxAttempts - 1); }); describe("when retryQuota.hasRetryTokens returns false", () => { it("in the first request", async () => { const { hasRetryTokens, retrieveRetryTokens, releaseRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); vi.mocked(hasRetryTokens).mockReturnValueOnce(false); const mockError = new Error(); await mockFailedOperation(maxAttempts, { mockError }); expect(hasRetryTokens).toHaveBeenCalledTimes(1); expect(hasRetryTokens).toHaveBeenCalledWith(mockError); expect(retrieveRetryTokens).not.toHaveBeenCalled(); expect(releaseRetryTokens).not.toHaveBeenCalled(); }); it("after the first retry", async () => { const { hasRetryTokens, retrieveRetryTokens, releaseRetryTokens } = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); vi.mocked(hasRetryTokens).mockReturnValueOnce(true).mockReturnValueOnce(false); const mockError = new Error(); await mockFailedOperation(maxAttempts, { mockError }); expect(hasRetryTokens).toHaveBeenCalledTimes(2); [1, 2].forEach((n) => { expect(hasRetryTokens).toHaveBeenNthCalledWith(n, mockError); }); expect(retrieveRetryTokens).toHaveBeenCalledTimes(1); expect(retrieveRetryTokens).toHaveBeenCalledWith(mockError); expect(releaseRetryTokens).not.toHaveBeenCalled(); }); }); }); describe("retry informational header: amz-sdk-invocation-id", () => { describe("not added if HttpRequest.isInstance returns false", () => { it("on successful operation", async () => { await mockSuccessfulOperation(maxAttempts); expect(next).toHaveBeenCalledTimes(1); expect(next.mock.calls[0][0].request.headers["amz-sdk-invocation-id"]).not.toBeDefined(); }); it("in case of single failure", async () => { await mockSuccessAfterOneFail(maxAttempts); expect(next).toHaveBeenCalledTimes(2); [0, 1].forEach((index) => { expect(next.mock.calls[index][0].request.headers["amz-sdk-invocation-id"]).not.toBeDefined(); }); }); it("in case of all failures", async () => { await mockFailedOperation(maxAttempts); expect(next).toHaveBeenCalledTimes(maxAttempts); [...Array(maxAttempts).keys()].forEach((index) => { expect(next.mock.calls[index][0].request.headers["amz-sdk-invocation-id"]).not.toBeDefined(); }); }); }); it("uses a unique header for every SDK operation invocation", async () => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValue(true); const uuidForInvocationOne = "uuid-invocation-1"; const uuidForInvocationTwo = "uuid-invocation-2"; vi.mocked(v4).mockReturnValueOnce(uuidForInvocationOne).mockReturnValueOnce(uuidForInvocationTwo); const next = vi.fn().mockResolvedValue({ response: "mockResponse", output: { $metadata: {} }, }); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); await retryStrategy.retry(next, { request: { headers: {} } } as any); await retryStrategy.retry(next, { request: { headers: {} } } as any); expect(next).toHaveBeenCalledTimes(2); expect(next.mock.calls[0][0].request.headers["amz-sdk-invocation-id"]).toBe(uuidForInvocationOne); expect(next.mock.calls[1][0].request.headers["amz-sdk-invocation-id"]).toBe(uuidForInvocationTwo); (isInstance as unknown as any).mockReturnValue(false); }); it("uses same value for additional HTTP requests associated with an SDK operation", async () => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValueOnce(true); const uuidForInvocation = "uuid-invocation-1"; vi.mocked(v4).mockReturnValueOnce(uuidForInvocation); await mockSuccessAfterOneFail(maxAttempts); expect(next).toHaveBeenCalledTimes(2); expect(next.mock.calls[0][0].request.headers["amz-sdk-invocation-id"]).toBe(uuidForInvocation); expect(next.mock.calls[1][0].request.headers["amz-sdk-invocation-id"]).toBe(uuidForInvocation); (isInstance as unknown as any).mockReturnValue(false); }); }); describe("retry informational header: amz-sdk-request", () => { describe("not added if HttpRequest.isInstance returns false", () => { it("on successful operation", async () => { await mockSuccessfulOperation(maxAttempts); expect(next).toHaveBeenCalledTimes(1); expect(next.mock.calls[0][0].request.headers["amz-sdk-request"]).not.toBeDefined(); }); it("in case of single failure", async () => { await mockSuccessAfterOneFail(maxAttempts); expect(next).toHaveBeenCalledTimes(2); [0, 1].forEach((index) => { expect(next.mock.calls[index][0].request.headers["amz-sdk-request"]).not.toBeDefined(); }); }); it("in case of all failures", async () => { await mockFailedOperation(maxAttempts); expect(next).toHaveBeenCalledTimes(maxAttempts); [...Array(maxAttempts).keys()].forEach((index) => { expect(next.mock.calls[index][0].request.headers["amz-sdk-request"]).not.toBeDefined(); }); }); }); it("adds header for each attempt", async () => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValue(true); const mockError = new Error("mockError"); next = vi.fn((args) => { // the header needs to be verified inside vi.Mock as arguments in // vi.mocks.calls has the value passed in final call const index = next.mock.calls.length - 1; expect(args.request.headers["amz-sdk-request"]).toBe(`attempt=${index + 1}; max=${maxAttempts}`); throw mockError; }); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); try { await retryStrategy.retry(next, { request: { headers: {} } } as any); } catch (error) { expect(error).toStrictEqual(mockError); return error; } expect(next).toHaveBeenCalledTimes(maxAttempts); (isInstance as unknown as any).mockReturnValue(false); }); }); describe("defaults maxAttempts to DEFAULT_MAX_ATTEMPTS", () => { it("when maxAttemptsProvider throws error", async () => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValue(true); next = vi.fn((args) => { expect(args.request.headers["amz-sdk-request"]).toBe(`attempt=1; max=${DEFAULT_MAX_ATTEMPTS}`); return Promise.resolve({ response: "mockResponse", output: { $metadata: {} }, }); }); const retryStrategy = new StandardRetryStrategy(() => Promise.reject("ERROR")); await retryStrategy.retry(next, { request: { headers: {} } } as any); expect(next).toHaveBeenCalledTimes(1); (isInstance as unknown as any).mockReturnValue(false); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/StandardRetryStrategy.ts ================================================ import { HttpRequest, HttpResponse } from "@smithy/core/protocols"; import { v4 } from "@smithy/core/serde"; import type { FinalizeHandler, FinalizeHandlerArguments, MetadataBearer, Provider, RetryStrategy, SdkError, } from "@smithy/types"; import { isThrottlingError } from "../../service-error-classification/service-error-classification"; import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from "../../util-retry/config"; import { DEFAULT_RETRY_DELAY_BASE, INITIAL_RETRY_TOKENS, INVOCATION_ID_HEADER, REQUEST_HEADER, THROTTLING_RETRY_DELAY_BASE, } from "../../util-retry/constants"; import { asSdkError } from "../util"; import { getDefaultRetryQuota } from "./defaultRetryQuota"; import { defaultDelayDecider } from "./delayDecider"; import { defaultRetryDecider } from "./retryDecider"; import type { DelayDecider, RetryDecider, RetryQuota } from "./types"; /** * Strategy options to be passed to StandardRetryStrategy * @public * @deprecated use StandardRetryStrategy from @smithy/util-retry */ export interface StandardRetryStrategyOptions { retryDecider?: RetryDecider; delayDecider?: DelayDecider; retryQuota?: RetryQuota; } /** * @public * @deprecated use StandardRetryStrategy from @smithy/util-retry */ export class StandardRetryStrategy implements RetryStrategy { private retryDecider: RetryDecider; private delayDecider: DelayDecider; private retryQuota: RetryQuota; public mode: string = RETRY_MODES.STANDARD; constructor( private readonly maxAttemptsProvider: Provider, options?: StandardRetryStrategyOptions ) { this.retryDecider = options?.retryDecider ?? defaultRetryDecider; this.delayDecider = options?.delayDecider ?? defaultDelayDecider; this.retryQuota = options?.retryQuota ?? getDefaultRetryQuota(INITIAL_RETRY_TOKENS); } private shouldRetry(error: SdkError, attempts: number, maxAttempts: number) { return attempts < maxAttempts && this.retryDecider(error) && this.retryQuota.hasRetryTokens(error); } private async getMaxAttempts() { let maxAttempts: number; try { maxAttempts = await this.maxAttemptsProvider(); } catch (error) { maxAttempts = DEFAULT_MAX_ATTEMPTS; } return maxAttempts; } async retry( next: FinalizeHandler, args: FinalizeHandlerArguments, options?: { beforeRequest: Function; afterRequest: Function; } ) { let retryTokenAmount; let attempts = 0; let totalDelay = 0; const maxAttempts = await this.getMaxAttempts(); const { request } = args; if (HttpRequest.isInstance(request)) { request.headers[INVOCATION_ID_HEADER] = v4(); } while (true) { try { if (HttpRequest.isInstance(request)) { request.headers[REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; } if (options?.beforeRequest) { await options.beforeRequest(); } const { response, output } = await next(args); if (options?.afterRequest) { options.afterRequest(response); } this.retryQuota.releaseRetryTokens(retryTokenAmount); output.$metadata.attempts = attempts + 1; output.$metadata.totalRetryDelay = totalDelay; return { response, output }; } catch (e) { const err = asSdkError(e); attempts++; if (this.shouldRetry(err as SdkError, attempts, maxAttempts)) { retryTokenAmount = this.retryQuota.retrieveRetryTokens(err); const delayFromDecider = this.delayDecider( isThrottlingError(err) ? THROTTLING_RETRY_DELAY_BASE : DEFAULT_RETRY_DELAY_BASE, attempts ); const delayFromResponse = getDelayFromRetryAfterHeader(err.$response); const delay = Math.max(delayFromResponse || 0, delayFromDecider); totalDelay += delay; await new Promise((resolve) => setTimeout(resolve, delay)); continue; } if (!err.$metadata) { err.$metadata = {}; } err.$metadata.attempts = attempts; err.$metadata.totalRetryDelay = totalDelay; throw err; } } } } /** * Returns number of milliseconds to wait based on "Retry-After" header value. * @internal * @deprecated */ const getDelayFromRetryAfterHeader = (response: unknown): number | undefined => { if (!HttpResponse.isInstance(response)) return; const retryAfterHeaderName = Object.keys(response.headers).find((key) => key.toLowerCase() === "retry-after"); if (!retryAfterHeaderName) return; const retryAfter = response.headers[retryAfterHeaderName]; const retryAfterSeconds = Number(retryAfter); if (!Number.isNaN(retryAfterSeconds)) return retryAfterSeconds * 1000; const retryAfterDate = new Date(retryAfter); return retryAfterDate.getTime() - Date.now(); }; ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/defaultRetryQuota.spec.ts ================================================ import type { SdkError } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { INITIAL_RETRY_TOKENS, NO_RETRY_INCREMENT, RETRY_COST, TIMEOUT_RETRY_COST } from "../../util-retry/constants"; import { getDefaultRetryQuota } from "./defaultRetryQuota"; describe("defaultRetryQuota", () => { const getMockError = () => new Error() as SdkError; const getMockTimeoutError = () => Object.assign(new Error(), { name: "TimeoutError", }) as SdkError; const getDrainedRetryQuota = ( targetCapacity: number, error: SdkError, initialRetryTokens: number = INITIAL_RETRY_TOKENS ) => { const retryQuota = getDefaultRetryQuota(initialRetryTokens); let availableCapacity = initialRetryTokens; while (availableCapacity >= targetCapacity) { retryQuota.retrieveRetryTokens(error); availableCapacity -= targetCapacity; } return retryQuota; }; describe("custom initial retry tokens", () => { it("hasRetryTokens returns false if capacity is not available", () => { const customRetryTokens = 100; const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error, customRetryTokens); expect(retryQuota.hasRetryTokens(error)).toBe(false); }); it("retrieveRetryToken throws error if retry tokens not available", () => { const customRetryTokens = 100; const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error, customRetryTokens); expect(() => { retryQuota.retrieveRetryTokens(error); }).toThrowError(new Error("No retry token available")); }); }); describe("hasRetryTokens", () => { describe("returns true if capacity is available", () => { it("when it's TimeoutError", () => { const timeoutError = getMockTimeoutError(); expect(getDefaultRetryQuota(INITIAL_RETRY_TOKENS).hasRetryTokens(timeoutError)).toBe(true); }); it("when it's not TimeoutError", () => { expect(getDefaultRetryQuota(INITIAL_RETRY_TOKENS).hasRetryTokens(getMockError())).toBe(true); }); }); describe("returns false if capacity is not available", () => { it("when it's TimeoutError", () => { const timeoutError = getMockTimeoutError(); const retryQuota = getDrainedRetryQuota(TIMEOUT_RETRY_COST, timeoutError); expect(retryQuota.hasRetryTokens(timeoutError)).toBe(false); }); it("when it's not TimeoutError", () => { const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error); expect(retryQuota.hasRetryTokens(error)).toBe(false); }); }); }); describe("retrieveRetryToken", () => { describe("returns retry tokens amount if available", () => { it("when it's TimeoutError", () => { const timeoutError = getMockTimeoutError(); expect(getDefaultRetryQuota(INITIAL_RETRY_TOKENS).retrieveRetryTokens(timeoutError)).toBe(TIMEOUT_RETRY_COST); }); it("when it's not TimeoutError", () => { expect(getDefaultRetryQuota(INITIAL_RETRY_TOKENS).retrieveRetryTokens(getMockError())).toBe(RETRY_COST); }); }); describe("throws error if retry tokens not available", () => { it("when it's TimeoutError", () => { const timeoutError = getMockTimeoutError(); const retryQuota = getDrainedRetryQuota(TIMEOUT_RETRY_COST, timeoutError); expect(() => { retryQuota.retrieveRetryTokens(timeoutError); }).toThrowError(new Error("No retry token available")); }); it("when it's not TimeoutError", () => { const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error); expect(() => { retryQuota.retrieveRetryTokens(error); }).toThrowError(new Error("No retry token available")); }); }); }); describe("releaseRetryToken", () => { it("adds capacityReleaseAmount if passed", () => { const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error); // Ensure that retry tokens are not available. expect(retryQuota.hasRetryTokens(error)).toBe(false); // Release RETRY_COST tokens. retryQuota.releaseRetryTokens(RETRY_COST); expect(retryQuota.hasRetryTokens(error)).toBe(true); expect(retryQuota.retrieveRetryTokens(error)).toBe(RETRY_COST); expect(retryQuota.hasRetryTokens(error)).toBe(false); }); it("adds NO_RETRY_INCREMENT if capacityReleaseAmount not passed", () => { const error = getMockError(); const retryQuota = getDrainedRetryQuota(RETRY_COST, error); // retry tokens will not be available till NO_RETRY_INCREMENT is added // till it's equal to RETRY_COST - (INITIAL_RETRY_TOKENS % RETRY_COST) let tokensReleased = 0; const tokensToBeReleased = RETRY_COST - (INITIAL_RETRY_TOKENS % RETRY_COST); while (tokensReleased < tokensToBeReleased) { expect(retryQuota.hasRetryTokens(error)).toBe(false); retryQuota.releaseRetryTokens(); tokensReleased += NO_RETRY_INCREMENT; } expect(retryQuota.hasRetryTokens(error)).toBe(true); }); it("ensures availableCapacity is maxed at INITIAL_RETRY_TOKENS", () => { const error = getMockError(); const retryQuota = getDefaultRetryQuota(INITIAL_RETRY_TOKENS); // release 100 tokens. [...Array(100).keys()].forEach(() => { retryQuota.releaseRetryTokens(); }); // availableCapacity is still maxed at INITIAL_RETRY_TOKENS // hasRetryTokens would be true only till INITIAL_RETRY_TOKENS/RETRY_COST times [...Array(Math.floor(INITIAL_RETRY_TOKENS / RETRY_COST)).keys()].forEach(() => { expect(retryQuota.hasRetryTokens(error)).toBe(true); retryQuota.retrieveRetryTokens(error); }); expect(retryQuota.hasRetryTokens(error)).toBe(false); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/defaultRetryQuota.ts ================================================ import type { SdkError } from "@smithy/types"; import { NO_RETRY_INCREMENT, RETRY_COST, TIMEOUT_RETRY_COST } from "../../util-retry/constants"; import type { RetryQuota } from "./types"; /** * @internal * @deprecated replaced by \@smithy/util-retry (SRA). */ export interface DefaultRetryQuotaOptions { /** * The total amount of retry token to be incremented from retry token balance * if an SDK operation invocation succeeds without requiring a retry request. */ noRetryIncrement?: number; /** * The total amount of retry tokens to be decremented from retry token balance. */ retryCost?: number; /** * The total amount of retry tokens to be decremented from retry token balance * when a throttling error is encountered. */ timeoutRetryCost?: number; } /** * @internal * @deprecated replaced by \@smithy/util-retry (SRA). */ export const getDefaultRetryQuota = (initialRetryTokens: number, options?: DefaultRetryQuotaOptions): RetryQuota => { const MAX_CAPACITY = initialRetryTokens; const noRetryIncrement = options?.noRetryIncrement ?? NO_RETRY_INCREMENT; const retryCost = options?.retryCost ?? RETRY_COST; const timeoutRetryCost = options?.timeoutRetryCost ?? TIMEOUT_RETRY_COST; let availableCapacity = initialRetryTokens; const getCapacityAmount = (error: SdkError) => (error.name === "TimeoutError" ? timeoutRetryCost : retryCost); const hasRetryTokens = (error: SdkError) => getCapacityAmount(error) <= availableCapacity; const retrieveRetryTokens = (error: SdkError) => { if (!hasRetryTokens(error)) { // retryStrategy should stop retrying, and return last error throw new Error("No retry token available"); } const capacityAmount = getCapacityAmount(error); availableCapacity -= capacityAmount; return capacityAmount; }; const releaseRetryTokens = (capacityReleaseAmount?: number) => { availableCapacity += capacityReleaseAmount ?? noRetryIncrement; availableCapacity = Math.min(availableCapacity, MAX_CAPACITY); }; return Object.freeze({ hasRetryTokens, retrieveRetryTokens, releaseRetryTokens, }); }; ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/delayDecider.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { MAXIMUM_RETRY_DELAY } from "../../util-retry/constants"; import { defaultDelayDecider } from "./delayDecider"; describe("defaultDelayDecider", () => { const mathDotRandom = Math.random; beforeEach(() => { Math.random = vi.fn().mockReturnValue(1); }); afterEach(() => { Math.random = mathDotRandom; }); describe(`retry delay increases exponentially with attempt number`, () => { [0, 1, 2, 3].forEach((attempts) => { const mockDelayBase = 100; const expectedDelay = Math.floor(2 ** attempts * mockDelayBase); it(`(${mockDelayBase}, ${attempts}) returns ${expectedDelay}`, () => { expect(defaultDelayDecider(mockDelayBase, attempts)).toBe(expectedDelay); }); }); }); describe(`caps retry delay at ${MAXIMUM_RETRY_DELAY / 1000} seconds`, () => { it("when value exceeded because of high delayBase", () => { expect(defaultDelayDecider(MAXIMUM_RETRY_DELAY + 1, 0)).toBe(MAXIMUM_RETRY_DELAY); expect(defaultDelayDecider(MAXIMUM_RETRY_DELAY + 2, 0)).toBe(MAXIMUM_RETRY_DELAY); }); it("when value exceeded because of high attempts number", () => { const largeAttemptsNumber = Math.ceil(Math.log2(MAXIMUM_RETRY_DELAY)); expect(defaultDelayDecider(1, largeAttemptsNumber)).toBe(MAXIMUM_RETRY_DELAY); expect(defaultDelayDecider(1, largeAttemptsNumber + 1)).toBe(MAXIMUM_RETRY_DELAY); }); }); describe("randomizes the retry delay value", () => { Array.from({ length: 3 }, () => Math.random()).forEach((mockRandomValue) => { const attempts = 0; const delayBase = 100; const expectedDelay = Math.floor(mockRandomValue * 2 ** attempts * delayBase); it(`(${delayBase}, ${attempts}) with mock Math.random=${mockRandomValue} returns ${expectedDelay}`, () => { Math.random = vi.fn().mockReturnValue(mockRandomValue); expect(defaultDelayDecider(delayBase, attempts)).toBe(expectedDelay); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/delayDecider.ts ================================================ import { MAXIMUM_RETRY_DELAY } from "../../util-retry/constants"; /** * Calculate a capped, fully-jittered exponential backoff time. * @internal * @deprecated replaced by \@smithy/util-retry (SRA). */ export const defaultDelayDecider = (delayBase: number, attempts: number) => Math.floor(Math.min(MAXIMUM_RETRY_DELAY, Math.random() * 2 ** attempts * delayBase)); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/retryDecider.spec.ts ================================================ import type { SdkError } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { isClockSkewError, isRetryableByTrait, isThrottlingError, isTransientError, } from "../../service-error-classification/service-error-classification"; import { defaultRetryDecider } from "./retryDecider"; vi.mock("../../service-error-classification/service-error-classification"); describe("defaultRetryDecider", () => { const createMockError = () => Object.assign(new Error(), { $metadata: {} }) as SdkError; beforeEach(() => { vi.mocked(isRetryableByTrait).mockReturnValue(false); vi.mocked(isClockSkewError).mockReturnValue(false); vi.mocked(isThrottlingError).mockReturnValue(false); vi.mocked(isTransientError).mockReturnValue(false); }); afterEach(() => { vi.clearAllMocks(); }); it("should return false when the provided error is falsy", () => { expect(defaultRetryDecider(null as any)).toBe(false); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(0); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(0); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(0); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(0); }); it("should return true for RetryableByTrait error", () => { vi.mocked(isRetryableByTrait).mockReturnValueOnce(true); expect(defaultRetryDecider(createMockError())).toBe(true); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(1); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(0); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(0); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(0); }); it("should return true for ClockSkewError", () => { vi.mocked(isClockSkewError).mockReturnValueOnce(true); expect(defaultRetryDecider(createMockError())).toBe(true); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(1); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(0); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(0); }); it("should return true for ThrottlingError", () => { vi.mocked(isThrottlingError).mockReturnValueOnce(true); expect(defaultRetryDecider(createMockError())).toBe(true); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(1); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(0); }); it("should return true for TransientError", () => { vi.mocked(isTransientError).mockReturnValueOnce(true); expect(defaultRetryDecider(createMockError())).toBe(true); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(1); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(1); }); it("should return false for other errors", () => { expect(defaultRetryDecider(createMockError())).toBe(false); expect(vi.mocked(isRetryableByTrait)).toHaveBeenCalledTimes(1); expect(vi.mocked(isClockSkewError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isThrottlingError)).toHaveBeenCalledTimes(1); expect(vi.mocked(isTransientError)).toHaveBeenCalledTimes(1); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/retryDecider.ts ================================================ import type { SdkError } from "@smithy/types"; import { isClockSkewError, isRetryableByTrait, isThrottlingError, isTransientError, } from "../../service-error-classification/service-error-classification"; /** * @internal * @deprecated this is only used in the deprecated StandardRetryStrategy. Do not use in new code. */ export const defaultRetryDecider = (error: SdkError) => { if (!error) { return false; } return isRetryableByTrait(error) || isClockSkewError(error) || isThrottlingError(error) || isTransientError(error); }; ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retry-pre-sra-deprecated/types.ts ================================================ import type { SdkError } from "@smithy/types"; /** * Determines whether an error is retryable based on the number of retries * already attempted, the HTTP status code, and the error received (if any). * * @param error - The error encountered. * * @deprecated * @internal */ export interface RetryDecider { (error: SdkError): boolean; } /** * Determines the number of milliseconds to wait before retrying an action. * * @param delayBase - The base delay (in milliseconds). * @param attempts - The number of times the action has already been tried. * * @deprecated * @internal */ export interface DelayDecider { (delayBase: number, attempts: number): number; } /** * Interface that specifies the retry quota behavior. * @deprecated * @internal */ export interface RetryQuota { /** * returns true if retry tokens are available from the retry quota bucket. */ hasRetryTokens: (error: SdkError) => boolean; /** * returns token amount from the retry quota bucket. * throws error is retry tokens are not available. */ retrieveRetryTokens: (error: SdkError) => number; /** * releases tokens back to the retry quota. */ releaseRetryTokens: (releaseCapacityAmount?: number) => void; } /** * @deprecated * @internal */ export interface RateLimiter { /** * If there is sufficient capacity (tokens) available, it immediately returns. * If there is not sufficient capacity, it will either sleep a certain amount * of time until the rate limiter can retrieve a token from its token bucket * or raise an exception indicating there is insufficient capacity. */ getSendToken: () => Promise; /** * Updates the client sending rate based on response. * If the response was successful, the capacity and fill rate are increased. * If the response was a throttling response, the capacity and fill rate are * decreased. Transient errors do not affect the rate limiter. */ updateClientSendingRate: (response: any) => void; } ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retryMiddleware.spec.ts ================================================ import { HttpResponse } from "@smithy/core/protocols"; import { v4 } from "@smithy/core/serde"; import type { FinalizeHandlerArguments, HandlerExecutionContext, MiddlewareStack } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getRetryPlugin, retryMiddleware, retryMiddlewareOptions } from "../index"; import { isServerError, isThrottlingError, isTransientError, } from "../service-error-classification/service-error-classification"; import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "../util-retry/constants"; vi.mock("../service-error-classification/service-error-classification"); vi.mock("@smithy/core/serde"); describe(getRetryPlugin.name, () => { const mockClientStack = { add: vi.fn(), }; const mockRetryStrategy = { mode: "mock", retry: vi.fn(), }; beforeEach(() => { vi.mocked(isThrottlingError).mockReturnValue(false); vi.mocked(isTransientError).mockReturnValue(false); vi.mocked(isServerError).mockReturnValue(false); vi.mocked(v4).mockReturnValue("42"); }); afterEach(() => { vi.clearAllMocks(); }); describe("adds retryMiddleware", () => { [1, 2, 3].forEach((maxAttempts) => { it(`when maxAttempts=${maxAttempts}`, () => { getRetryPlugin({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue(mockRetryStrategy), }).applyToStack(mockClientStack as unknown as MiddlewareStack); expect(mockClientStack.add).toHaveBeenCalledTimes(1); expect(mockClientStack.add.mock.calls[0][1]).toEqual(retryMiddlewareOptions); }); }); }); }); describe(retryMiddleware.name, () => { const maxAttempts = 2; const args = { request: { method: "POST", protocol: "https", hostname: "localhost", path: "/", headers: {}, query: {}, }, }; beforeEach(() => { args.request = { method: "POST", protocol: "https", hostname: "localhost", path: "/", headers: {}, query: {}, }; }); afterEach(() => { vi.clearAllMocks(); }); describe("RetryStrategy", () => { const mockRetryStrategy = { mode: "mock", retry: vi.fn(), }; it("calls retryStrategy.retry with next and args", async () => { const next = vi.fn(); const context: HandlerExecutionContext = {}; await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.retry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.retry).toHaveBeenCalledWith(next, args); expect(context.userAgent).toContainEqual(["cfg/retry-mode", mockRetryStrategy.mode]); }); }); describe("RetryStrategyV2", () => { const partitionId = "test_partition_id"; const context: HandlerExecutionContext = { partition_id: partitionId, }; const mockRetryToken = { getRetryToken: () => 1, getRetryDelay: () => 1, getRetryCount: () => 1, }; const mockRetryStrategy = { mode: "mock", acquireInitialRetryToken: vi.fn().mockResolvedValue(mockRetryToken), refreshRetryTokenForRetry: vi.fn().mockResolvedValue(mockRetryToken), recordSuccess: vi.fn(), }; const mockSuccess = { response: new HttpResponse({ headers: {}, statusCode: 200, }), output: { $metadata: {}, }, }; const getErrorWithValues = (retryAfter: number | string, retryAfterHeaderName = "retry-after") => { const error = new Error("mockError"); Object.defineProperty(error, "$response", { value: { statusCode: 503, headers: { [retryAfterHeaderName]: String(retryAfter) }, }, }); return error; }; it("calls acquireInitialRetryToken and records success when next succeeds", async () => { const next = vi.fn().mockResolvedValueOnce(mockSuccess); const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.recordSuccess).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.recordSuccess).toHaveBeenCalledWith(mockRetryToken); expect(output.$metadata.attempts).toBe(1); }); describe("throws when token cannot be refreshed", () => { it("throw last request error", async () => { const requestError = new Error("mockRequestError"); vi.mocked(isThrottlingError).mockReturnValue(true); const next = vi.fn().mockRejectedValue(requestError); const errorInfo = { error: requestError, errorType: "THROTTLING", }; const mockRetryStrategy = { mode: "mock", acquireInitialRetryToken: vi.fn().mockResolvedValue(mockRetryToken), refreshRetryTokenForRetry: vi.fn().mockRejectedValue(new Error("Cannot refresh token")), recordSuccess: vi.fn(), }; try { await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); } catch (error) { expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(error).toStrictEqual(requestError); expect(error.$metadata.attempts).toBe(1); expect(error.$metadata.totalRetryDelay).toBeDefined(); } }); }); describe("calls acquireInitialRetryToken and refreshes retry token", () => { const mockError = new Error("mockError"); it("sets throttling error type", async () => { vi.mocked(isThrottlingError).mockReturnValue(true); const next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockSuccess); const errorInfo = { error: mockError, errorType: "THROTTLING", }; const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); it("sets transient error type", async () => { vi.mocked(isTransientError).mockReturnValue(true); vi.mocked(isThrottlingError).mockReturnValue(false); const next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockSuccess); const errorInfo = { error: mockError, errorType: "TRANSIENT", }; const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); it("sets server error type", async () => { vi.mocked(isServerError).mockReturnValue(true); vi.mocked(isTransientError).mockReturnValue(false); vi.mocked(isThrottlingError).mockReturnValue(false); const next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockSuccess); const errorInfo = { error: mockError, errorType: "SERVER_ERROR", }; const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); it("sets client error type", async () => { vi.mocked(isServerError).mockReturnValue(false); vi.mocked(isTransientError).mockReturnValue(false); vi.mocked(isThrottlingError).mockReturnValue(false); const next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockSuccess); const errorInfo = { error: mockError, errorType: "CLIENT_ERROR", }; const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); describe("when retry-after is not set", () => { it("should not set retryAfter in errorInfo", async () => { Object.defineProperty(mockError, "$response", { value: { headers: { ["other-header"]: "foo" }, }, }); const next = vi.fn().mockRejectedValueOnce(mockError).mockResolvedValueOnce(mockSuccess); const errorInfo = { error: mockError, errorType: "CLIENT_ERROR", }; const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); }); describe("when retry-after is set", () => { const now = Date.now(); const retryAfterDate = new Date(now + 3000); const errorInfo = { error: mockError, errorType: "CLIENT_ERROR", retryAfterHint: retryAfterDate, }; it("parses retry-after from date string", async () => { const error = getErrorWithValues(retryAfterDate.toISOString()); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); it("parses retry-after from seconds", async () => { const error = getErrorWithValues(3); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); const call = mockRetryStrategy.refreshRetryTokenForRetry.mock.calls[0]; expect(call[0]).toEqual(mockRetryToken); expect(call[1].error).toEqual(errorInfo.error); expect(call[1].errorType).toEqual(errorInfo.errorType); expect(call[1].retryAfterHint).toBeInstanceOf(Date); expect(call[1].retryAfterHint.getTime()).toBeGreaterThanOrEqual(errorInfo.retryAfterHint.getTime() - 1_000); expect(call[1].retryAfterHint.getTime()).toBeLessThanOrEqual(errorInfo.retryAfterHint.getTime() + 1_000); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); it("parses retry-after from Retry-After header name", async () => { const error = getErrorWithValues(retryAfterDate.toISOString(), "Retry-After"); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); }); describe("when x-amz-retry-after is set", () => { const now = Date.now(); const retryAfterDate = new Date(now + 3000); const errorInfo = { error: mockError, errorType: "CLIENT_ERROR", retryAfterHint: retryAfterDate, }; for (const h of ["x-amz-retry-after", "X-Amz-Retry-After"]) { it("parses x-amz-retry-after as milliseconds delay", async () => { const error = getErrorWithValues(3000, h); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); const { output } = await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledTimes(1); expect(mockRetryStrategy.acquireInitialRetryToken).toHaveBeenCalledWith(partitionId); expect(mockRetryStrategy.refreshRetryTokenForRetry).toHaveBeenCalledTimes(1); const call = mockRetryStrategy.refreshRetryTokenForRetry.mock.calls[0]; expect(call[0]).toEqual(mockRetryToken); expect(call[1].error).toEqual(errorInfo.error); expect(call[1].errorType).toEqual(errorInfo.errorType); expect(call[1].retryAfterHint).toBeInstanceOf(Date); expect(call[1].retryAfterHint.getTime()).toBeGreaterThanOrEqual(errorInfo.retryAfterHint.getTime() - 1_000); expect(call[1].retryAfterHint.getTime()).toBeLessThanOrEqual(errorInfo.retryAfterHint.getTime() + 1_000); expect(output.$metadata.attempts).toBe(2); expect(output.$metadata.totalRetryDelay).toBeDefined(); }); } }); }); describe("retry headers", () => { describe("not added if HttpRequest.isInstance returns false", () => { beforeEach(() => { args.request = { headers: {}, } as any; }); it(`retry informational header: ${INVOCATION_ID_HEADER}`, async () => { const next = vi.fn().mockResolvedValueOnce(mockSuccess); await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(next).toHaveBeenCalledTimes(1); expect(next.mock.calls[0][0].request.headers[INVOCATION_ID_HEADER]).not.toBeDefined(); }); it(`header for each attempt as ${REQUEST_HEADER}`, async () => { const next = vi.fn().mockResolvedValueOnce(mockSuccess); await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(next).toHaveBeenCalledTimes(1); expect(next.mock.calls[0][0].request.headers[REQUEST_HEADER]).not.toBeDefined(); }); }); describe("added if HttpRequest.isInstance returns true", () => { it(`retry informational header: ${INVOCATION_ID_HEADER}`, async () => { const retryAfterDate = new Date(Date.now() + 3000); const error = getErrorWithValues(retryAfterDate.toISOString()); vi.mocked(isThrottlingError).mockReturnValue(true); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(next).toHaveBeenCalledTimes(2); expect(next.mock.calls[0][0].request.headers[INVOCATION_ID_HEADER]).toBeDefined(); expect(next.mock.calls[1][0].request.headers[INVOCATION_ID_HEADER]).toBeDefined(); }); it(`header for each attempt as ${REQUEST_HEADER}`, async () => { const retryAfterDate = new Date(Date.now() + 3000); const error = getErrorWithValues(retryAfterDate.toISOString()); vi.mocked(isThrottlingError).mockReturnValue(true); const next = vi.fn().mockRejectedValueOnce(error).mockResolvedValueOnce(mockSuccess); await retryMiddleware({ maxAttempts: () => Promise.resolve(maxAttempts), retryStrategy: vi.fn().mockResolvedValue({ ...mockRetryStrategy, maxAttempts }), })( next, context )(args as FinalizeHandlerArguments); expect(next).toHaveBeenCalledTimes(2); expect(next.mock.calls[0][0].request.headers[REQUEST_HEADER]).toBeDefined(); expect(next.mock.calls[1][0].request.headers[REQUEST_HEADER]).toBeDefined(); }); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/retryMiddleware.ts ================================================ import { NoOpLogger } from "@smithy/core/client"; import { HttpRequest } from "@smithy/core/protocols"; import { v4 } from "@smithy/core/serde"; import type { AbsoluteLocation, FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, FinalizeRequestHandlerOptions, HandlerExecutionContext, Logger, MetadataBearer, Pluggable, RetryErrorInfo, RetryErrorType, RetryStrategy, RetryStrategyV2, RetryToken, SdkError, } from "@smithy/types"; import { isServerError, isThrottlingError, isTransientError, } from "../service-error-classification/service-error-classification"; import { INVOCATION_ID_HEADER, REQUEST_HEADER } from "../util-retry/constants"; import type { RetryResolvedConfig } from "./configurations"; import { parseRetryAfterHeader } from "./parseRetryAfterHeader"; import { asSdkError } from "./util"; /** * @internal */ export type IsStreamingPayload = (request: HttpRequest) => boolean; /** * @internal */ export function bindRetryMiddleware(isStreamingPayload: IsStreamingPayload) { return (options: RetryResolvedConfig) => ( next: FinalizeHandler, context: HandlerExecutionContext ): FinalizeHandler => async (args: FinalizeHandlerArguments): Promise> => { let retryStrategy = await options.retryStrategy(); const maxAttempts = await options.maxAttempts(); if (isRetryStrategyV2(retryStrategy)) { retryStrategy = retryStrategy as RetryStrategyV2; let retryToken: RetryToken = await retryStrategy.acquireInitialRetryToken( (context["partition_id"] ?? "") + (context.__retryLongPoll ? ":longpoll" : "") ); let lastError: SdkError = new Error(); let attempts = 0; let totalRetryDelay = 0; const { request } = args; const isRequest = HttpRequest.isInstance(request); if (isRequest) { request.headers[INVOCATION_ID_HEADER] = v4(); } while (true) { try { if (isRequest) { request.headers[REQUEST_HEADER] = `attempt=${attempts + 1}; max=${maxAttempts}`; } const { response, output } = await next(args); retryStrategy.recordSuccess(retryToken); output.$metadata.attempts = attempts + 1; output.$metadata.totalRetryDelay = totalRetryDelay; return { response, output }; } catch (e: any) { const retryErrorInfo = getRetryErrorInfo(e, options.logger); lastError = asSdkError(e); if (isRequest && isStreamingPayload(request)) { (context.logger instanceof NoOpLogger ? console : context.logger)?.warn( "An error was encountered in a non-retryable streaming request." ); throw lastError; } try { retryToken = await retryStrategy.refreshRetryTokenForRetry(retryToken, retryErrorInfo); } catch (refreshError) { if (typeof refreshError.$backoff === "number") { await cooldown(refreshError.$backoff); } if (!lastError.$metadata) { lastError.$metadata = {}; } lastError.$metadata.attempts = attempts + 1; lastError.$metadata.totalRetryDelay = totalRetryDelay; throw lastError; } attempts = retryToken.getRetryCount(); const delay = retryToken.getRetryDelay(); totalRetryDelay += delay; await cooldown(delay); } } } else { retryStrategy = retryStrategy as RetryStrategy; if (retryStrategy?.mode) { context.userAgent = [...(context.userAgent || []), ["cfg/retry-mode", retryStrategy.mode]]; } return retryStrategy.retry(next, args); } }; } const cooldown = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); const isRetryStrategyV2 = (retryStrategy: RetryStrategy | RetryStrategyV2) => typeof (retryStrategy as RetryStrategyV2).acquireInitialRetryToken !== "undefined" && typeof (retryStrategy as RetryStrategyV2).refreshRetryTokenForRetry !== "undefined" && typeof (retryStrategy as RetryStrategyV2).recordSuccess !== "undefined"; const getRetryErrorInfo = (error: SdkError, logger?: Logger): RetryErrorInfo => { const errorInfo: RetryErrorInfo = { error, errorType: getRetryErrorType(error), }; const retryAfterHint = parseRetryAfterHeader(error.$response, logger); if (retryAfterHint) { errorInfo.retryAfterHint = retryAfterHint; } return errorInfo; }; const getRetryErrorType = (error: SdkError): RetryErrorType => { if (isThrottlingError(error)) return "THROTTLING"; if (isTransientError(error)) return "TRANSIENT"; if (isServerError(error)) return "SERVER_ERROR"; return "CLIENT_ERROR"; }; /** * @internal */ export const retryMiddlewareOptions: FinalizeRequestHandlerOptions & AbsoluteLocation = { name: "retryMiddleware", tags: ["RETRY"], step: "finalizeRequest", priority: "high", override: true, }; /** * @internal */ export function bindGetRetryPlugin(isStreamingPayload: IsStreamingPayload) { const retryMiddleware = bindRetryMiddleware(isStreamingPayload); return (options: RetryResolvedConfig): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(retryMiddleware(options), retryMiddlewareOptions); }, }); } ================================================ FILE: packages/core/src/submodules/retry/middleware-retry/util.ts ================================================ import type { SdkError } from "@smithy/types"; export const asSdkError = (error: unknown): SdkError => { if (error instanceof Error) return error; if (error instanceof Object) return Object.assign(new Error(), error); if (typeof error === "string") return new Error(error); return new Error(`AWS SDK error wrapper for ${error}`); }; ================================================ FILE: packages/core/src/submodules/retry/retry-rate-target.integ.spec.ts ================================================ import { Readable } from "node:stream"; import { cbor } from "@smithy/core/cbor"; import { HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import { describe, expect, test as it } from "vitest"; import { GetNumbersCommand, XYZService } from "xyz-schema"; import { Retry } from "./util-retry/retries-2026-config"; Retry.v2026 = true; class ThrottlingHandler implements HttpHandler { public readonly metadata = { handlerProtocol: "http/1.1" }; public timestamps: number[] = []; private static okBody = cbor.serialize({}); private static throttleBody = cbor.serialize({ __type: "ThrottlingException", message: "Rate exceeded" }); private ratePerSecond: number; private tokens: number; private lastRefillMs: number; public constructor(ratePerSecond: number) { this.ratePerSecond = ratePerSecond; this.tokens = ratePerSecond; this.lastRefillMs = performance.now(); } public updateHttpClientConfig(key: never, value: never): void { throw new Error("Method not implemented."); } public httpHandlerConfigs(): {} { throw new Error("Method not implemented."); } public setRate(rps: number) { this.refill(); this.ratePerSecond = rps; this.tokens = Math.min(this.tokens, rps); } public async handle() { this.refill(); this.timestamps.push(performance.now()); if (this.tokens >= 1) { this.tokens -= 1; return { response: new HttpResponse({ statusCode: 200, headers: { "smithy-protocol": "rpc-v2-cbor" }, body: Readable.from(ThrottlingHandler.okBody), }), }; } return { response: new HttpResponse({ statusCode: 429, headers: { "smithy-protocol": "rpc-v2-cbor" }, body: Readable.from(ThrottlingHandler.throttleBody), }), }; } public rpsInInterval(startMs: number, endMs: number): number { const count = this.timestamps.filter((t) => t >= startMs && t < endMs).length; const durationSeconds = (endMs - startMs) / 1000; return durationSeconds > 0 ? count / durationSeconds : 0; } private refill() { const now = performance.now(); const elapsedSeconds = (now - this.lastRefillMs) / 1000; this.tokens = Math.min(this.ratePerSecond, this.tokens + elapsedSeconds * this.ratePerSecond); this.lastRefillMs = now; } } function createClient(handler: ThrottlingHandler) { return new XYZService({ endpoint: "https://localhost", apiKey: { apiKey: "test" }, retryMode: "adaptive", maxAttempts: 4, requestHandler: handler, }); } async function continuousInvoke( client: XYZService, maxDurationMs: number, workers: number, signal: AbortSignal ): Promise { const deadline = performance.now() + maxDurationMs; const worker = async () => { while (performance.now() < deadline && !signal.aborted) { try { await client.send(new GetNumbersCommand({})); } catch { // throttling errors expected } } }; await Promise.all(Array.from({ length: workers }, () => worker())); } /** * Polls the handler's RPS every 500ms. Resolves once the measured RPS * over the last `windowMs` falls within [lower, upper], or when * `maxWaitMs` elapses. */ async function waitForRpsInRange( handler: ThrottlingHandler, lower: number, upper: number, maxWaitMs: number, windowMs = 2000 ): Promise { const deadline = performance.now() + maxWaitMs; while (performance.now() < deadline) { await new Promise((r) => setTimeout(r, 500)); const now = performance.now(); const rps = handler.rpsInInterval(now - windowMs, now); if (rps >= lower && rps <= upper) return; } } describe("adaptive retry rate targeting", () => { const THROTTLE_RPS = 20; it("converges send rate to match server throttle (20 RPS)", async () => { const handler = new ThrottlingHandler(THROTTLE_RPS); const client = createClient(handler); const abort = new AbortController(); const lower = THROTTLE_RPS * 0.5; const upper = THROTTLE_RPS * 1.5; const invoke = continuousInvoke(client, 30_000, 10, abort.signal); await waitForRpsInRange(handler, lower, upper, 15_000); const now = performance.now(); const measuredRps = handler.rpsInInterval(now - 2000, now); abort.abort(); await invoke; expect(measuredRps).toBeGreaterThanOrEqual(lower); expect(measuredRps).toBeLessThanOrEqual(upper); }, 30_000); it("reduces send rate when server throttle drops (10k -> 10 RPS)", async () => { const REDUCED_RPS = 10; const lower = REDUCED_RPS * 0.3; const upper = REDUCED_RPS * 2; const handler = new ThrottlingHandler(10_000); const client = createClient(handler); const abort = new AbortController(); setTimeout(() => handler.setRate(REDUCED_RPS), 3000); const invoke = continuousInvoke(client, 30_000, 10, abort.signal); await new Promise((r) => setTimeout(r, 3500)); await waitForRpsInRange(handler, lower, upper, 12_000); const now = performance.now(); const measuredRps = handler.rpsInInterval(now - 2000, now); abort.abort(); await invoke; expect(measuredRps).toBeGreaterThanOrEqual(lower); expect(measuredRps).toBeLessThanOrEqual(upper); }, 30_000); it("recovers send rate after temporary throttle blip (10k -> 20 -> 10k RPS)", async () => { const handler = new ThrottlingHandler(10_000); const client = createClient(handler); const abort = new AbortController(); setTimeout(() => handler.setRate(20), 2000); setTimeout(() => handler.setRate(10_000), 4000); const invoke = continuousInvoke(client, 15_000, 5, abort.signal); await invoke; const now = performance.now(); const recoveryRps = handler.rpsInInterval(now - 3000, now); expect(recoveryRps).toBeGreaterThan(20); }, 25_000); }); ================================================ FILE: packages/core/src/submodules/retry/service-error-classification/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/retry`. ## 4.3.1 ### Patch Changes - 15f9e53: retry clock skew errors for freeze/thaw/drift situations ## 4.3.0 ### Minor Changes - 60d13c8: include http refused stream as transient error for Node.js ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 ## 4.1.2 ### Patch Changes - 937ac5a: make $retryable-trait errors considered transient in StandardRetryStrategyV2 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/types@4.4.0 ## 4.0.7 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.6 ### Patch Changes - c8d5bb2: Treat Node.js network errors as transient ## 4.0.5 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.4 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.3 ### Patch Changes - 89bde09: add browser connection issues as transient errors to retry on ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - b52b4e8: add support for error cause in transient error checks - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.1.5 ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - dd0d9b4b: make clock skew correcting errors transient - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.9 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.8 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.7 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.6 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.5 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.4 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.3 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.2 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.1 ### Patch Changes - e6ea6bd5: move devDeps into deps - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.3 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.2 ### Patch Changes - c03ce2aa: Remove AbortError from the list of transient error codes ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/service-error-classification](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/service-error-classification/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/retry/service-error-classification/constants.ts ================================================ /** * Errors encountered when the client clock and server clock cannot agree on the * current time. * * These errors are retryable, assuming the SDK has enabled clock skew * correction. */ export const CLOCK_SKEW_ERROR_CODES = [ "AuthFailure", "InvalidSignatureException", "RequestExpired", "RequestInTheFuture", "RequestTimeTooSkewed", "SignatureDoesNotMatch", ]; /** * Errors that indicate the SDK is being throttled. * * These errors are always retryable. */ export const THROTTLING_ERROR_CODES = [ "BandwidthLimitExceeded", "EC2ThrottledException", "LimitExceededException", "PriorRequestNotComplete", "ProvisionedThroughputExceededException", "RequestLimitExceeded", "RequestThrottled", "RequestThrottledException", "SlowDown", "ThrottledException", "Throttling", "ThrottlingException", "TooManyRequestsException", "TransactionInProgressException", // DynamoDB ]; /** * Error codes that indicate transient issues */ export const TRANSIENT_ERROR_CODES = ["TimeoutError", "RequestTimeout", "RequestTimeoutException"]; /** * Error codes that indicate transient issues */ export const TRANSIENT_ERROR_STATUS_CODES = [500, 502, 503, 504]; /** * Node.js system error codes that indicate timeout. */ export const NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "ECONNREFUSED", "EPIPE", "ETIMEDOUT"]; /** * Node.js system error codes that indicate network error. */ export const NODEJS_NETWORK_ERROR_CODES = ["EHOSTUNREACH", "ENETUNREACH", "ENOTFOUND"]; ================================================ FILE: packages/core/src/submodules/retry/service-error-classification/service-error-classification.spec.ts ================================================ import type { RetryableTrait, SdkError } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { CLOCK_SKEW_ERROR_CODES, NODEJS_NETWORK_ERROR_CODES, NODEJS_TIMEOUT_ERROR_CODES, THROTTLING_ERROR_CODES, TRANSIENT_ERROR_CODES, TRANSIENT_ERROR_STATUS_CODES, } from "./constants"; import { isClockSkewError, isNodeJsHttp2TransientError, isRetryableByTrait, isServerError, isThrottlingError, isTransientError, } from "./service-error-classification"; const checkForErrorType = ( isErrorTypeFunc: (error: SdkError) => boolean, options: { name?: string; httpStatusCode?: number; $retryable?: RetryableTrait; cause?: Partial; code?: string; }, errorTypeResult: boolean ) => { const { name, httpStatusCode, $retryable, cause, code } = options; const error = Object.assign(new Error(), { name, $metadata: { httpStatusCode }, $retryable, cause, code, }); expect(isErrorTypeFunc(error as SdkError)).toBe(errorTypeResult); }; describe("isRetryableByTrait", () => { it("should declare error with $retryable set to be a Retryable by trait", () => { const $retryable = {}; checkForErrorType(isRetryableByTrait, { $retryable }, true); }); it("should not declare error with $retryable not set to be a Retryable by trait", () => { checkForErrorType(isRetryableByTrait, {}, false); }); }); describe("isClockSkewError", () => { CLOCK_SKEW_ERROR_CODES.forEach((name) => { it(`should declare error with the name "${name}" to be a ClockSkew error`, () => { checkForErrorType(isClockSkewError, { name }, true); }); }); while (true) { const name = Math.random().toString(36).substring(2); if (!CLOCK_SKEW_ERROR_CODES.includes(name)) { it(`should not declare error with the name "${name}" to be a ClockSkew error`, () => { checkForErrorType(isClockSkewError, { name }, false); }); break; } } }); describe("isThrottlingError", () => { [429].forEach((httpStatusCode) => { it(`should declare error with the HTTP Status Code "${httpStatusCode}" to be a Throttling error`, () => { checkForErrorType(isTransientError, { httpStatusCode }, false); }); }); THROTTLING_ERROR_CODES.forEach((name) => { it(`should declare error with the name "${name}" to be a Throttling error`, () => { checkForErrorType(isThrottlingError, { name }, true); }); }); while (true) { const name = Math.random().toString(36).substring(2); if (!THROTTLING_ERROR_CODES.includes(name)) { it(`should not declare error with the name "${name}" to be a Throttling error`, () => { checkForErrorType(isThrottlingError, { name }, false); }); break; } } it("should declare error with $retryable.throttling set to true to be a Throttling error", () => { const $retryable = { throttling: true }; checkForErrorType(isThrottlingError, { $retryable }, true); }); it("should not declare error with $retryable.throttling set to false to be a Throttling error", () => { const $retryable = { throttling: false }; checkForErrorType(isThrottlingError, { $retryable }, false); }); it("should not declare error with $retryable.throttling not set to be a Throttling error", () => { const $retryable = {}; checkForErrorType(isThrottlingError, { $retryable }, false); }); }); describe("isTransientError", () => { TRANSIENT_ERROR_CODES.forEach((name) => { it(`should declare error with the name "${name}" to be a Transient error`, () => { checkForErrorType(isTransientError, { name }, true); }); }); TRANSIENT_ERROR_STATUS_CODES.forEach((httpStatusCode) => { it(`should declare error with the HTTP Status Code "${httpStatusCode}" to be a Transient error`, () => { checkForErrorType(isTransientError, { httpStatusCode }, true); }); }); while (true) { const name = Math.random().toString(36).substring(2); if (!TRANSIENT_ERROR_CODES.includes(name)) { it(`should not declare error with the name "${name}" to be a Transient error`, () => { checkForErrorType(isTransientError, { name }, false); }); break; } } while (true) { const httpStatusCode = Math.ceil(Math.random() * 10 ** 3); if (!TRANSIENT_ERROR_STATUS_CODES.includes(httpStatusCode)) { it(`should declare error with the HTTP Status Code "${httpStatusCode}" to be a Transient error`, () => { checkForErrorType(isTransientError, { httpStatusCode }, false); }); break; } } TRANSIENT_ERROR_CODES.forEach((name) => { it(`should declare error with cause with the name "${name}" to be a Transient error`, () => { checkForErrorType(isTransientError, { cause: { name } }, true); }); }); it("should limit recursion to 10 depth", () => { const error = { cause: null } as unknown as SdkError; error.cause = error; checkForErrorType(isTransientError, { cause: error }, false); }); NODEJS_TIMEOUT_ERROR_CODES.forEach((code) => { it(`should declare error with cause with the code "${code}" to be a Transient error`, () => { checkForErrorType(isTransientError, { code }, true); }); }); NODEJS_NETWORK_ERROR_CODES.forEach((code) => { it(`should declare error with cause with the code "${code}" to be a Transient error`, () => { checkForErrorType(isTransientError, { code }, true); }); }); }); describe("isServerError", () => { [501, 505, 511].forEach((httpStatusCode) => { it(`should declare error with the HTTP Status Code "${httpStatusCode}" to be a Server error`, () => { checkForErrorType(isServerError, { httpStatusCode }, true); }); }); TRANSIENT_ERROR_STATUS_CODES.forEach((httpStatusCode) => { it(`should declare error with the HTTP Status Code "${httpStatusCode}" to not be be a Server error`, () => { checkForErrorType(isServerError, { httpStatusCode }, false); }); }); }); describe("isNodeJsHttp2TransientError", () => { it("should return true for ERR_HTTP2_STREAM_ERROR with NGHTTP2_REFUSED_STREAM", () => { const error = Object.assign(new Error("Stream closed with error code NGHTTP2_REFUSED_STREAM"), { code: "ERR_HTTP2_STREAM_ERROR", }); expect(isNodeJsHttp2TransientError(error)).toBe(true); }); it("should return false for unrelated errors", () => { const error = Object.assign(new Error("something else"), { code: "ECONNRESET" }); expect(isNodeJsHttp2TransientError(error)).toBe(false); }); it("should classify ERR_HTTP2_STREAM_ERROR with NGHTTP2_REFUSED_STREAM as transient via isTransientError", () => { const error = Object.assign(new Error("Stream closed with error code NGHTTP2_REFUSED_STREAM"), { code: "ERR_HTTP2_STREAM_ERROR", $metadata: {}, }); expect(isTransientError(error as SdkError)).toBe(true); }); it("should classify ERR_HTTP2_STREAM_ERROR with NGHTTP2_REFUSED_STREAM in cause as transient", () => { const cause = Object.assign(new Error("Stream closed with error code NGHTTP2_REFUSED_STREAM"), { code: "ERR_HTTP2_STREAM_ERROR", $metadata: {}, }); const error = Object.assign(new Error("request failed"), { $metadata: {}, cause, }); expect(isTransientError(error as SdkError)).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/retry/service-error-classification/service-error-classification.ts ================================================ import type { SdkError } from "@smithy/types"; import { CLOCK_SKEW_ERROR_CODES, NODEJS_NETWORK_ERROR_CODES, NODEJS_TIMEOUT_ERROR_CODES, THROTTLING_ERROR_CODES, TRANSIENT_ERROR_CODES, TRANSIENT_ERROR_STATUS_CODES, } from "./constants"; export const isRetryableByTrait = (error: SdkError) => error?.$retryable !== undefined; /** * @deprecated use isClockSkewCorrectedError. This is only used in deprecated code. */ export const isClockSkewError = (error: SdkError) => CLOCK_SKEW_ERROR_CODES.includes(error.name); /** * @returns whether the error resulted in a systemClockOffset aka clock skew correction. */ export const isClockSkewCorrectedError = (error: SdkError) => error.$metadata?.clockSkewCorrected; /** * * @internal */ export const isBrowserNetworkError = (error: SdkError) => { const errorMessages = new Set([ "Failed to fetch", // Chrome "NetworkError when attempting to fetch resource", // Firefox "The Internet connection appears to be offline", // Safari 16 "Load failed", // Safari 17+ "Network request failed", // `cross-fetch` ]); const isValid = error && error instanceof TypeError; if (!isValid) { return false; } return errorMessages.has(error.message); }; export const isThrottlingError = (error: SdkError) => error.$metadata?.httpStatusCode === 429 || THROTTLING_ERROR_CODES.includes(error.name) || error.$retryable?.throttling == true; /** * Though NODEJS_TIMEOUT_ERROR_CODES are platform specific, they are * included here because there is an error scenario with unknown root * cause where the NodeHttpHandler does not decorate the Error with * the name "TimeoutError" to be checked by the TRANSIENT_ERROR_CODES condition. */ export const isTransientError = (error: SdkError, depth = 0): boolean => isRetryableByTrait(error) || isClockSkewCorrectedError(error) || (error.name === "InvalidSignatureException" && error.message?.includes("Signature expired")) || TRANSIENT_ERROR_CODES.includes(error.name) || NODEJS_TIMEOUT_ERROR_CODES.includes((error as { code?: string })?.code || "") || NODEJS_NETWORK_ERROR_CODES.includes((error as { code?: string })?.code || "") || TRANSIENT_ERROR_STATUS_CODES.includes(error.$metadata?.httpStatusCode || 0) || isBrowserNetworkError(error) || isNodeJsHttp2TransientError(error) || (error.cause !== undefined && depth <= 10 && isTransientError(error.cause, depth + 1)); export const isServerError = (error: SdkError) => { if (error.$metadata?.httpStatusCode !== undefined) { const statusCode = error.$metadata.httpStatusCode; if (500 <= statusCode && statusCode <= 599 && !isTransientError(error)) { return true; } return false; } return false; }; /** * @internal */ export function isNodeJsHttp2TransientError(error: Error & { code?: string }): boolean { return error.code === "ERR_HTTP2_STREAM_ERROR" && error.message.includes("NGHTTP2_REFUSED_STREAM"); } ================================================ FILE: packages/core/src/submodules/retry/util-retry/AdaptiveRetryStrategy.spec.ts ================================================ import type { RetryErrorInfo, StandardRetryToken } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { AdaptiveRetryStrategy } from "./AdaptiveRetryStrategy"; import { DefaultRateLimiter } from "./DefaultRateLimiter"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import { RETRY_MODES } from "./config"; import type { RateLimiter } from "./types"; vi.mock("./StandardRetryStrategy"); vi.mock("./DefaultRateLimiter"); describe(AdaptiveRetryStrategy.name, () => { const maxAttemptsProvider = vi.fn(); const retryTokenScope = "scope"; const mockDefaultRateLimiter = { getSendToken: vi.fn(), updateClientSendingRate: vi.fn(), } as any; const mockRetryToken: StandardRetryToken = { getRetryCost: () => 1, getRetryCount: () => 1, getRetryDelay: () => 1, }; const errorInfo = { errorType: "TRANSIENT", } as RetryErrorInfo; beforeEach(() => { vi.mocked(DefaultRateLimiter).mockReturnValue(mockDefaultRateLimiter); }); afterEach(() => { vi.clearAllMocks(); }); it(`sets mode=${RETRY_MODES.ADAPTIVE}`, () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider); expect(retryStrategy.mode).toStrictEqual(RETRY_MODES.ADAPTIVE); }); describe("rateLimiter init", () => { it("sets getDefaultrateLimiter if options is undefined", () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider); expect(retryStrategy["rateLimiter"]).toBe(mockDefaultRateLimiter); }); it("sets DefaultRateLimiter if options.rateLimiter undefined", () => { const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, {}); expect(retryStrategy["rateLimiter"]).toBe(mockDefaultRateLimiter); }); it("sets options.rateLimiter if defined", () => { const rateLimiter = {} as RateLimiter; const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter, }); expect(retryStrategy["rateLimiter"]).toBe(rateLimiter); }); }); describe("acquireInitialRetryToken", () => { it("calls rateLimiter.getSendToken and returns initial retry token ", async () => { const mockedStandardRetryStrategy = vi.spyOn(StandardRetryStrategy.prototype, "acquireInitialRetryToken"); mockedStandardRetryStrategy.mockResolvedValue(mockRetryToken); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(1); expect(mockedStandardRetryStrategy).toHaveBeenCalledTimes(1); expect(token).toStrictEqual(mockRetryToken); }); it("resolves the token before calling getSendToken", async () => { const mockedStandardRetryStrategy = vi.spyOn(StandardRetryStrategy.prototype, "acquireInitialRetryToken"); let tokenResolved = false; mockedStandardRetryStrategy.mockImplementation( () => new Promise((resolve) => setTimeout(() => { tokenResolved = true; resolve(mockRetryToken); }, 10) ) ); mockDefaultRateLimiter.getSendToken.mockImplementation(() => { expect(tokenResolved).toBe(true); return Promise.resolve(); }); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); expect(token).toStrictEqual(mockRetryToken); }); }); describe("refreshRetryTokenForRetry", () => { it("calls getSendToken, updateClientSendingRate, and refreshes retry token", async () => { const mockedStandardRetryStrategy = vi.spyOn(StandardRetryStrategy.prototype, "refreshRetryTokenForRetry"); mockedStandardRetryStrategy.mockResolvedValue(mockRetryToken); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); const token = await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(1); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(1); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledWith(errorInfo); expect(mockedStandardRetryStrategy).toHaveBeenCalledTimes(1); expect(mockedStandardRetryStrategy).toHaveBeenCalledWith(mockRetryToken, errorInfo); expect(token).toStrictEqual(mockRetryToken); }); it("resolves the token before calling getSendToken", async () => { let tokenResolved = false; vi.spyOn(StandardRetryStrategy.prototype, "refreshRetryTokenForRetry").mockImplementation( () => new Promise((resolve) => setTimeout(() => { tokenResolved = true; resolve(mockRetryToken); }, 10) ) ); mockDefaultRateLimiter.getSendToken.mockImplementation(() => { expect(tokenResolved).toBe(true); return Promise.resolve(); }); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); const token = await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); expect(token).toStrictEqual(mockRetryToken); }); it("calls updateClientSendingRate before getSendToken", async () => { const callOrder: string[] = []; mockDefaultRateLimiter.getSendToken.mockImplementation(() => { callOrder.push("getSendToken"); return Promise.resolve(); }); mockDefaultRateLimiter.updateClientSendingRate.mockImplementation(() => { callOrder.push("updateClientSendingRate"); }); vi.spyOn(StandardRetryStrategy.prototype, "refreshRetryTokenForRetry").mockResolvedValue(mockRetryToken); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); expect(callOrder).toEqual(["updateClientSendingRate", "getSendToken"]); }); it("calls getSendToken for each retry in a multi-retry sequence", async () => { vi.spyOn(StandardRetryStrategy.prototype, "refreshRetryTokenForRetry").mockResolvedValue(mockRetryToken); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); await retryStrategy.refreshRetryTokenForRetry(mockRetryToken, errorInfo); expect(mockDefaultRateLimiter.getSendToken).toHaveBeenCalledTimes(3); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(3); }); }); describe("recordSuccess", () => { it("rateLimiter.updateCientSendingRate and records success on token", async () => { const mockedStandardRetryStrategy = vi.spyOn(StandardRetryStrategy.prototype, "recordSuccess"); const retryStrategy = new AdaptiveRetryStrategy(maxAttemptsProvider, { rateLimiter: mockDefaultRateLimiter, }); retryStrategy.recordSuccess(mockRetryToken); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledTimes(1); expect(mockDefaultRateLimiter.updateClientSendingRate).toHaveBeenCalledWith({}); expect(mockedStandardRetryStrategy).toHaveBeenCalledTimes(1); expect(mockedStandardRetryStrategy).toHaveBeenCalledWith(mockRetryToken); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/AdaptiveRetryStrategy.ts ================================================ import type { Provider, RetryErrorInfo, RetryStrategyV2, RetryToken, StandardRetryToken } from "@smithy/types"; import { DefaultRateLimiter } from "./DefaultRateLimiter"; import { StandardRetryStrategy, type StandardRetryStrategyOptions } from "./StandardRetryStrategy"; import { RETRY_MODES } from "./config"; import type { RateLimiter } from "./types"; /** * Strategy options to be passed to AdaptiveRetryStrategy * * @public */ export interface AdaptiveRetryStrategyOptions extends Partial { rateLimiter?: RateLimiter; } /** * The AdaptiveRetryStrategy is a retry strategy for executing against a very * resource constrained set of resources. Care should be taken when using this * retry strategy. By default, it uses a dynamic backoff delay based on load * currently perceived against the downstream resource and performs circuit * breaking to disable retries in the event of high downstream failures using * the DefaultRateLimiter. * * @public * * @see {@link StandardRetryStrategy} * @see {@link DefaultRateLimiter } */ export class AdaptiveRetryStrategy implements RetryStrategyV2 { public readonly mode: string = RETRY_MODES.ADAPTIVE; private rateLimiter: RateLimiter; private standardRetryStrategy: StandardRetryStrategy; constructor(maxAttemptsProvider: number | Provider, options?: AdaptiveRetryStrategyOptions) { const { rateLimiter } = options ?? {}; this.rateLimiter = rateLimiter ?? new DefaultRateLimiter(); this.standardRetryStrategy = options ? new StandardRetryStrategy({ maxAttempts: typeof maxAttemptsProvider === "number" ? maxAttemptsProvider : 3, ...options, }) : new StandardRetryStrategy(maxAttemptsProvider as Provider); } public async acquireInitialRetryToken(retryTokenScope: string): Promise { const token = await this.standardRetryStrategy.acquireInitialRetryToken(retryTokenScope); await this.rateLimiter.getSendToken(); return token; } public async refreshRetryTokenForRetry( tokenToRenew: StandardRetryToken, errorInfo: RetryErrorInfo ): Promise { this.rateLimiter.updateClientSendingRate(errorInfo); const token = await this.standardRetryStrategy.refreshRetryTokenForRetry(tokenToRenew, errorInfo); // called prior to return in case the token refresh throws (no need to wait in that case). await this.rateLimiter.getSendToken(); return token; } public recordSuccess(token: StandardRetryToken): void { this.rateLimiter.updateClientSendingRate({}); this.standardRetryStrategy.recordSuccess(token); } /** * There is an existing integration which accesses this field. * @deprecated */ public async maxAttemptsProvider(): Promise { return this.standardRetryStrategy.maxAttempts(); } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/retry`. ## 4.3.7 ### Patch Changes - add missing await to token acquisition in AdaptiveRetryStrategy ## 4.3.6 ### Patch Changes - 2e5142c: add a missing call to getSendToken in Adaptive mode retries - 9c88c10: adaptive retry fixes for checking capacity during the rate limiter waiting step ## 4.3.5 ### Patch Changes - Updated dependencies [15f9e53] - @smithy/service-error-classification@4.3.1 ## 4.3.4 ### Patch Changes - b877fc2: refine conditions for long poll backoff in v2026 retry behavior ## 4.3.3 ### Patch Changes - Updated dependencies [60d13c8] - @smithy/service-error-classification@4.3.0 ## 4.3.2 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/service-error-classification@4.2.14 ## 4.3.1 ### Patch Changes - a45aaf5: add maxAttempts and maxAttemptsProvider public methods to StandardRetryStrategy/AdaptiveRetryStrategy ## 4.3.0 ### Minor Changes - cffd868: Introduce default retry behavior modifications slated for 2026. They are: less time between server error retries, but slightly more time between throttling errors. Lower retry capacity consumption for throttling, and improved parsing of the retry-after and x-amz-retry-after headers. ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/service-error-classification@4.2.13 ## 4.2.13 ### Patch Changes - 3c21a57: fix AdaptiveRetryStrategy throttling detection ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/service-error-classification@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/service-error-classification@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/service-error-classification@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/service-error-classification@4.2.9 - @smithy/types@4.12.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/service-error-classification@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/service-error-classification@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/service-error-classification@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/service-error-classification@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/service-error-classification@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/service-error-classification@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/service-error-classification@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/service-error-classification@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/service-error-classification@4.2.0 - @smithy/types@4.6.0 ## 4.1.2 ### Patch Changes - 937ac5a: make $retryable-trait errors considered transient in StandardRetryStrategyV2 - Updated dependencies [937ac5a] - @smithy/service-error-classification@4.1.2 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/service-error-classification@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/service-error-classification@4.1.0 - @smithy/types@4.4.0 ## 4.0.7 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/service-error-classification@4.0.7 ## 4.0.6 ### Patch Changes - Updated dependencies [c8d5bb2] - @smithy/service-error-classification@4.0.6 ## 4.0.5 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/service-error-classification@4.0.5 ## 4.0.4 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/service-error-classification@4.0.4 ## 4.0.3 ### Patch Changes - Updated dependencies [89bde09] - @smithy/service-error-classification@4.0.3 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/service-error-classification@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/service-error-classification@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/service-error-classification@4.0.0 - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/service-error-classification@3.0.11 - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/service-error-classification@3.0.10 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/service-error-classification@3.0.9 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/service-error-classification@3.0.8 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/service-error-classification@3.0.7 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/service-error-classification@3.0.6 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/service-error-classification@3.0.5 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/service-error-classification@3.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/service-error-classification@3.0.3 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/service-error-classification@3.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/service-error-classification@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/service-error-classification@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 - @smithy/service-error-classification@2.1.5 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/service-error-classification@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/service-error-classification@2.1.3 - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/service-error-classification@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/service-error-classification@2.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/service-error-classification@2.1.0 - @smithy/types@2.9.0 ## 2.0.9 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/service-error-classification@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/service-error-classification@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/service-error-classification@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/service-error-classification@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/service-error-classification@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/service-error-classification@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/service-error-classification@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/service-error-classification@2.0.2 ## 2.0.1 ### Patch Changes - e6ea6bd5: move devDeps into deps - Updated dependencies [fbfeebee] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/service-error-classification@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/service-error-classification@2.0.0 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/service-error-classification@1.1.0 ## 1.0.4 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/service-error-classification@1.0.3 ## 1.0.3 ### Patch Changes - 170ac764: fix error in documentation - Updated dependencies [c03ce2aa] - @smithy/service-error-classification@1.0.2 ## 1.0.2 ### Patch Changes - d4dbe242: Fix attempts count on StandardRetryStrategy ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/service-error-classification@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-retry](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-retry/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/retry/util-retry/ConfiguredRetryStrategy.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { ConfiguredRetryStrategy } from "./ConfiguredRetryStrategy"; describe(ConfiguredRetryStrategy.name, () => { it("allows setting a custom backoff function", async () => { const strategy = new ConfiguredRetryStrategy(5, (attempt) => attempt * 1000); const token = await strategy.acquireInitialRetryToken(""); token.getRetryCount = () => 3; const retryToken = await strategy.refreshRetryTokenForRetry(token, { errorType: "TRANSIENT", }); expect(retryToken.getRetryCount()).toBe(4); expect(retryToken.getRetryDelay()).toBe(4000); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/ConfiguredRetryStrategy.ts ================================================ import type { Provider, RetryBackoffStrategy, RetryErrorInfo, RetryStrategyV2, StandardRetryToken, } from "@smithy/types"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import { Retry } from "./retries-2026-config"; /** * This extension of the StandardRetryStrategy allows customizing the * backoff computation. * * @public */ export class ConfiguredRetryStrategy extends StandardRetryStrategy implements RetryStrategyV2 { private readonly computeNextBackoffDelay: (attempt: number) => number; /** * @param maxAttempts - the maximum number of retry attempts allowed. * e.g., if set to 3, then 4 total requests are possible. * @param computeNextBackoffDelay - a millisecond delay for each retry or a function that takes the retry attempt * and returns the delay. * * @example exponential backoff. * ```js * new Client({ * retryStrategy: new ConfiguredRetryStrategy(3, (attempt) => attempt ** 2) * }); * ``` * @example constant delay. * ```js * new Client({ * retryStrategy: new ConfiguredRetryStrategy(3, 2000) * }); * ``` */ public constructor( maxAttempts: number | Provider, computeNextBackoffDelay: number | RetryBackoffStrategy["computeNextBackoffDelay"] = Retry.delay() ) { super(typeof maxAttempts === "function" ? maxAttempts : async () => maxAttempts); if (typeof computeNextBackoffDelay === "number") { this.computeNextBackoffDelay = () => computeNextBackoffDelay; } else { this.computeNextBackoffDelay = computeNextBackoffDelay; } } public async refreshRetryTokenForRetry( tokenToRenew: StandardRetryToken, errorInfo: RetryErrorInfo ): Promise { const token = await super.refreshRetryTokenForRetry(tokenToRenew, errorInfo); token.getRetryDelay = () => this.computeNextBackoffDelay(token.getRetryCount()); return token; } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRateLimiter.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { isThrottlingError } from "../service-error-classification/service-error-classification"; import { DefaultRateLimiter } from "./DefaultRateLimiter"; vi.mock("../service-error-classification/service-error-classification"); describe(DefaultRateLimiter.name, () => { beforeEach(() => { vi.mocked(isThrottlingError).mockReturnValue(false); }); afterEach(() => { vi.clearAllMocks(); }); describe("getSendToken", () => { beforeEach(() => { vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); }); it.each([ [0.5, 892.8571428571428], [1, 1785.7142857142856], [2, 2000], ])("timestamp: %d, delay: %d", async (timestamp, delay) => { const spy = vi.spyOn(DefaultRateLimiter as any, "setTimeoutFn"); vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); vi.mocked(isThrottlingError).mockReturnValueOnce(true); vi.spyOn(Date, "now").mockImplementation(() => timestamp * 1000); rateLimiter.updateClientSendingRate({}); rateLimiter.getSendToken(); vi.runAllTimers(); expect(spy).toHaveBeenLastCalledWith(expect.any(Function), delay); }); }); describe("cubicSuccess", () => { it.each([ [5, 7], [6, 9.64893601], [7, 10.00003085], [8, 10.45328452], [9, 13.40869703], [10, 21.26626836], [11, 36.42599853], ])("timestamp: %d, calculatedRate: %d", (timestamp, calculatedRate) => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); rateLimiter["lastMaxRate"] = 10; rateLimiter["lastThrottleTime"] = 5; vi.spyOn(Date, "now").mockImplementation(() => timestamp * 1000); const cubicSuccessSpy = vi.spyOn(DefaultRateLimiter.prototype as any, "cubicSuccess"); rateLimiter.updateClientSendingRate({}); expect(cubicSuccessSpy).toHaveLastReturnedWith(calculatedRate); }); }); describe("cubicThrottle", () => { it.each([ [5, 0.112], [6, 0.09333333], [7, 0.08], [8, 0.07], [9, 0.06222222], ])("timestamp: %d, calculatedRate: %d", (timestamp, calculatedRate) => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); rateLimiter["lastMaxRate"] = 10; rateLimiter["lastThrottleTime"] = 5; vi.mocked(isThrottlingError).mockReturnValueOnce(true); vi.spyOn(Date, "now").mockImplementation(() => timestamp * 1000); const cubicThrottleSpy = vi.spyOn(DefaultRateLimiter.prototype as any, "cubicThrottle"); rateLimiter.updateClientSendingRate({}); expect(cubicThrottleSpy).toHaveLastReturnedWith(calculatedRate); }); }); it("detects throttling from an error with status code 429 or $retryable.throttling", async () => { const { isThrottlingError: realIsThrottlingError } = await vi.importActual( "@smithy/service-error-classification" ); vi.spyOn(Date, "now").mockImplementation(() => 0); for (const error of [ { name: "ThrottlingStatusCodeException", $metadata: { httpStatusCode: 429 } }, { name: "ThrottlingModelMetadataException", $retryable: { throttling: true } }, ]) { const rateLimiter = new DefaultRateLimiter(); vi.mocked(isThrottlingError).mockImplementation(realIsThrottlingError); vi.spyOn(Date, "now").mockImplementation(() => 1000); rateLimiter.updateClientSendingRate({ errorType: "TRANSIENT", error } as any); expect(rateLimiter["enabled"]).toBe(true); } }); it("treats a RetryErrorInfo with errorType THROTTLING as a throttling error", () => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); vi.spyOn(Date, "now").mockImplementation(() => 1000); rateLimiter.updateClientSendingRate({ errorType: "THROTTLING" }); expect(rateLimiter["enabled"]).toBe(true); expect(isThrottlingError).not.toHaveBeenCalled(); }); describe("acquireTokenBucket re-checks after sleep", () => { it("availableTokens is never negative after acquire", async () => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); // Enable the rate limiter with a throttle. vi.mocked(isThrottlingError).mockReturnValueOnce(true); vi.spyOn(Date, "now").mockImplementation(() => 1000); rateLimiter.updateClientSendingRate({}); // Drain tokens to force a sleep path. rateLimiter["availableTokens"] = 0.1; rateLimiter["fillRate"] = 10; rateLimiter["lastTimestamp"] = 1; // Time advances during the sleep so refill provides tokens. let now = 1000; vi.spyOn(Date, "now").mockImplementation(() => now); const spy = vi.spyOn(DefaultRateLimiter as any, "setTimeoutFn"); spy.mockImplementation((resolve: any) => { now += 200; // 200ms passes during sleep resolve(); }); await rateLimiter.getSendToken(); expect(rateLimiter["availableTokens"]).toBeGreaterThanOrEqual(0); }); it("loops when fill rate decreases during sleep", async () => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); // Enable the rate limiter. vi.mocked(isThrottlingError).mockReturnValueOnce(true); vi.spyOn(Date, "now").mockImplementation(() => 1000); rateLimiter.updateClientSendingRate({}); rateLimiter["availableTokens"] = 0; rateLimiter["fillRate"] = 10; rateLimiter["maxCapacity"] = 10; rateLimiter["lastTimestamp"] = 1; let now = 1000; vi.spyOn(Date, "now").mockImplementation(() => now); let callCount = 0; const spy = vi.spyOn(DefaultRateLimiter as any, "setTimeoutFn"); spy.mockImplementation((resolve: any) => { callCount++; now += 50; // 50ms passes if (callCount === 1) { // Simulate rate dropping mid-sleep (e.g. concurrent throttle response). rateLimiter["fillRate"] = 0.5; rateLimiter["maxCapacity"] = 1; } resolve(); }); await rateLimiter.getSendToken(); // Should have looped more than once because the first sleep // didn't provide enough tokens after the rate drop. expect(callCount).toBeGreaterThan(1); expect(rateLimiter["availableTokens"]).toBeGreaterThanOrEqual(0); }); it("refills token bucket after each sleep iteration", async () => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); // Enable the rate limiter. vi.mocked(isThrottlingError).mockReturnValueOnce(true); vi.spyOn(Date, "now").mockImplementation(() => 1000); rateLimiter.updateClientSendingRate({}); rateLimiter["availableTokens"] = 0; rateLimiter["fillRate"] = 2; rateLimiter["maxCapacity"] = 2; rateLimiter["lastTimestamp"] = 1; let now = 1000; vi.spyOn(Date, "now").mockImplementation(() => now); const refillSpy = vi.spyOn(rateLimiter as any, "refillTokenBucket"); const spy = vi.spyOn(DefaultRateLimiter as any, "setTimeoutFn"); spy.mockImplementation((resolve: any) => { now += 600; // enough time for refill to provide tokens resolve(); }); await rateLimiter.getSendToken(); // refillTokenBucket called: once before the loop + once inside the loop expect(refillSpy).toHaveBeenCalledTimes(2); }); }); it("updateClientSendingRate", () => { vi.spyOn(Date, "now").mockImplementation(() => 0); const rateLimiter = new DefaultRateLimiter(); const testCases: [boolean, number, number, number][] = [ [false, 0.2, 0, 0.5], [false, 0.4, 0, 0.5], [false, 0.6, 4.8, 0.5], [false, 0.8, 4.8, 0.5], [false, 1, 4.16, 0.5], [false, 1.2, 4.16, 0.6912], [false, 1.4, 4.16, 1.0976], [false, 1.6, 5.632, 1.6384], [false, 1.8, 5.632, 2.3328], [true, 2, 4.3264, 3.02848], [false, 2.2, 4.3264, 3.486639], [false, 2.4, 4.3264, 3.821874], [false, 2.6, 5.66528, 4.053386], [false, 2.8, 5.66528, 4.200373], [false, 3.0, 4.333056, 4.282037], [true, 3.2, 4.333056, 2.997426], [false, 3.4, 4.333056, 3.452226], ]; testCases.forEach(([isThrottlingErrorReturn, timestamp, measuredTxRate, fillRate]) => { vi.mocked(isThrottlingError).mockReturnValue(isThrottlingErrorReturn); vi.spyOn(Date, "now").mockImplementation(() => timestamp * 1000); rateLimiter.updateClientSendingRate({}); expect(rateLimiter["measuredTxRate"]).toEqual(measuredTxRate); expect(parseFloat(rateLimiter["fillRate"].toFixed(6))).toEqual(fillRate); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRateLimiter.ts ================================================ import type { RetryErrorInfo } from "@smithy/types"; import { isThrottlingError } from "../service-error-classification/service-error-classification"; import type { RateLimiter } from "./types"; /** * @public */ export interface DefaultRateLimiterOptions { /** * Coefficient for controlling how aggressively the rate decreases on throttle. * @defaultValue 0.7 */ beta?: number; /** * Minimum token bucket capacity in adaptive-tokens. * @defaultValue 1 */ minCapacity?: number; /** * Minimum fill rate in adaptive-tokens per second. * @defaultValue 0.5 */ minFillRate?: number; /** * Scale constant used in the cubic rate calculation. * @defaultValue 0.4 */ scaleConstant?: number; /** * Smoothing factor for the exponential moving average of the measured send rate. * @defaultValue 0.8 */ smooth?: number; } /** * @public */ export class DefaultRateLimiter implements RateLimiter { /** * Only used in testing. */ private static setTimeoutFn = setTimeout; // User configurable constants private readonly beta: number; private readonly minCapacity: number; private readonly minFillRate: number; private readonly scaleConstant: number; private readonly smooth: number; /** * Whether adaptive retry rate limiting is active. * Remains `false` until a throttling error is detected. */ private enabled = false; /** * Current number of available adaptive-tokens. When exhausted, requests wait based on fill rate. */ private availableTokens = 0; /** * The most recent maximum fill rate in adaptive-tokens per second, recorded at the last throttle event. */ private lastMaxRate = 0; /** * Smoothed measured send rate in requests per second. */ private measuredTxRate = 0; /** * Number of requests observed in the current measurement time bucket. */ private requestCount = 0; /** * Current token bucket fill rate in adaptive-tokens per second. Defaults to {@link minFillRate}. */ private fillRate: number; /** * Timestamp in seconds of the most recent throttle event. */ private lastThrottleTime: number; /** * Timestamp in seconds of the last token bucket refill. */ private lastTimestamp = 0; /** * The time bucket (in seconds) used for measuring the send rate. */ private lastTxRateBucket: number; /** * Maximum token bucket capacity in adaptive-tokens. Defaults to {@link minCapacity}. * Updated in {@link updateTokenBucketRate} to match the new fill rate, floored by {@link minCapacity}. */ private maxCapacity: number; /** * Calculated time window in seconds used in the cubic rate recovery function. */ private timeWindow = 0; public constructor(options?: DefaultRateLimiterOptions) { this.beta = options?.beta ?? 0.7; this.minCapacity = options?.minCapacity ?? 1; this.minFillRate = options?.minFillRate ?? 0.5; this.scaleConstant = options?.scaleConstant ?? 0.4; this.smooth = options?.smooth ?? 0.8; this.lastThrottleTime = this.getCurrentTimeInSeconds(); this.lastTxRateBucket = Math.floor(this.getCurrentTimeInSeconds()); this.fillRate = this.minFillRate; this.maxCapacity = this.minCapacity; } public async getSendToken() { return this.acquireTokenBucket(1); } public updateClientSendingRate(response: any) { /** * New fill rate in adaptive-tokens per second, derived from * {@link cubicThrottle} on throttle or {@link cubicSuccess} otherwise. */ let calculatedRate: number; this.updateMeasuredRate(); const retryErrorInfo = response as RetryErrorInfo; const isThrottling = retryErrorInfo?.errorType === "THROTTLING" || isThrottlingError(retryErrorInfo?.error ?? response); if (isThrottling) { const rateToUse = !this.enabled ? this.measuredTxRate : Math.min(this.measuredTxRate, this.fillRate); this.lastMaxRate = rateToUse; this.calculateTimeWindow(); this.lastThrottleTime = this.getCurrentTimeInSeconds(); calculatedRate = this.cubicThrottle(rateToUse); this.enableTokenBucket(); } else { this.calculateTimeWindow(); calculatedRate = this.cubicSuccess(this.getCurrentTimeInSeconds()); } const newRate = Math.min(calculatedRate, 2 * this.measuredTxRate); this.updateTokenBucketRate(newRate); } private getCurrentTimeInSeconds() { return Date.now() / 1000; } private async acquireTokenBucket(amount: number) { // Client side throttling is not enabled until we see a throttling error. if (!this.enabled) { return; } this.refillTokenBucket(); while (amount > this.availableTokens) { const delay = ((amount - this.availableTokens) / this.fillRate) * 1000; await new Promise((resolve) => DefaultRateLimiter.setTimeoutFn(resolve, delay)); this.refillTokenBucket(); } this.availableTokens = this.availableTokens - amount; } private refillTokenBucket() { const timestamp = this.getCurrentTimeInSeconds(); if (!this.lastTimestamp) { this.lastTimestamp = timestamp; return; } const fillAmount = (timestamp - this.lastTimestamp) * this.fillRate; this.availableTokens = Math.min(this.maxCapacity, this.availableTokens + fillAmount); this.lastTimestamp = timestamp; } private calculateTimeWindow() { this.timeWindow = this.getPrecise(Math.pow((this.lastMaxRate * (1 - this.beta)) / this.scaleConstant, 1 / 3)); } /** * Returns a new fill rate in adaptive-tokens per second by reducing * the given rate by a factor of {@link beta}. */ private cubicThrottle(rateToUse: number) { return this.getPrecise(rateToUse * this.beta); } /** * Returns a new fill rate in adaptive-tokens per second using a CUBIC * congestion control curve. The rate recovers toward {@link lastMaxRate}, * then continues growing beyond it. The caller caps the result at * `2 * measuredTxRate`. */ private cubicSuccess(timestamp: number) { return this.getPrecise( this.scaleConstant * Math.pow(timestamp - this.lastThrottleTime - this.timeWindow, 3) + this.lastMaxRate ); } private enableTokenBucket() { this.enabled = true; } /** * Set a new fill rate for adaptive-tokens. * The max capacity is updated to allow for one second of time to approximately * refill the adaptive-token capacity. */ private updateTokenBucketRate(newRate: number) { // Refill based on our current rate before we update to the new fill rate. this.refillTokenBucket(); this.fillRate = Math.max(newRate, this.minFillRate); this.maxCapacity = Math.max(newRate, this.minCapacity); // When we scale down we can't have a current capacity that exceeds our maxCapacity. this.availableTokens = Math.min(this.availableTokens, this.maxCapacity); } private updateMeasuredRate() { const t = this.getCurrentTimeInSeconds(); const timeBucket = Math.floor(t * 2) / 2; this.requestCount++; if (timeBucket > this.lastTxRateBucket) { const currentRate = this.requestCount / (timeBucket - this.lastTxRateBucket); this.measuredTxRate = this.getPrecise(currentRate * this.smooth + this.measuredTxRate * (1 - this.smooth)); this.requestCount = 0; this.lastTxRateBucket = timeBucket; } } private getPrecise(num: number) { return parseFloat(num.toFixed(8)); } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRetryBackoffStrategy.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { DefaultRetryBackoffStrategy } from "./DefaultRetryBackoffStrategy"; import { MAXIMUM_RETRY_DELAY } from "./constants"; import { Retry } from "./retries-2026-config"; describe("defaultRetryBackoffStrategy", () => { const mathDotRandom = Math.random; beforeEach(() => { Math.random = vi.fn().mockReturnValue(1); }); afterEach(() => { Math.random = mathDotRandom; }); describe(`uses ${Retry.delay()} by default`, () => { [0, 1, 2, 3].forEach((attempts) => { const expectedDelay = Math.floor(2 ** attempts * Retry.delay()); const retryBackoffStrategy = new DefaultRetryBackoffStrategy(); it(`(${attempts}) returns ${expectedDelay}`, () => { expect(retryBackoffStrategy.computeNextBackoffDelay(attempts)).toBe(expectedDelay); }); }); }); describe("retry delay increases exponentially with attempt number", () => { [0, 1, 2, 3].forEach((attempts) => { const mockDelayBase = 50; const expectedDelay = Math.floor(2 ** attempts * mockDelayBase); const retryBackoffStrategy = new DefaultRetryBackoffStrategy(); retryBackoffStrategy.setDelayBase(mockDelayBase); it(`(${attempts}) returns ${expectedDelay}`, () => { expect(retryBackoffStrategy.computeNextBackoffDelay(attempts)).toBe(expectedDelay); }); }); }); describe(`caps retry delay at ${MAXIMUM_RETRY_DELAY / 1000} seconds`, () => { const retryBackoffStrategy = new DefaultRetryBackoffStrategy(); it("when value exceeded because of high delayBase", () => { retryBackoffStrategy.setDelayBase(MAXIMUM_RETRY_DELAY + 1); expect(retryBackoffStrategy.computeNextBackoffDelay(0)).toBe(MAXIMUM_RETRY_DELAY); retryBackoffStrategy.setDelayBase(MAXIMUM_RETRY_DELAY + 2); expect(retryBackoffStrategy.computeNextBackoffDelay(0)).toBe(MAXIMUM_RETRY_DELAY); }); it("when value exceeded because of high attempts number", () => { const largeAttemptsNumber = Math.ceil(Math.log2(MAXIMUM_RETRY_DELAY)); retryBackoffStrategy.setDelayBase(1); expect(retryBackoffStrategy.computeNextBackoffDelay(largeAttemptsNumber)).toBe(MAXIMUM_RETRY_DELAY); expect(retryBackoffStrategy.computeNextBackoffDelay(largeAttemptsNumber + 1)).toBe(MAXIMUM_RETRY_DELAY); }); }); describe("randomizes the retry delay value", () => { const retryBackoffStrategy = new DefaultRetryBackoffStrategy(); Array.from({ length: 3 }, () => Math.random()).forEach((mockRandomValue) => { const attempts = 0; const delayBase = 100; const expectedDelay = Math.floor(mockRandomValue * 2 ** attempts * delayBase); retryBackoffStrategy.setDelayBase(delayBase); it(`(${delayBase}, ${attempts}) with mock Math.random=${mockRandomValue} returns ${expectedDelay}`, () => { Math.random = vi.fn().mockReturnValue(mockRandomValue); expect(retryBackoffStrategy.computeNextBackoffDelay(attempts)).toBe(expectedDelay); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRetryBackoffStrategy.ts ================================================ import type { StandardRetryBackoffStrategy } from "@smithy/types"; import { MAXIMUM_RETRY_DELAY } from "./constants"; import { Retry } from "./retries-2026-config"; /** * @internal */ export class DefaultRetryBackoffStrategy implements StandardRetryBackoffStrategy { protected x: number = Retry.delay(); /** * @param i - attempt count starting from zero. */ public computeNextBackoffDelay(i: number): number { // These values are named after the variables present in the spec // for easier cross-checking. const b = Math.random(); const r = 2; const t_i = b * Math.min(this.x * r ** i, MAXIMUM_RETRY_DELAY); return Math.floor(t_i); } public setDelayBase(delay: number): void { this.x = delay; } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRetryToken.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { DefaultRetryToken } from "./DefaultRetryToken"; import { MAXIMUM_RETRY_DELAY } from "./constants"; import { Retry } from "./retries-2026-config"; vi.mock("./defaultRetryBackoffStrategy"); describe("defaultRetryToken", () => { describe("getRetryCost", () => { it("is undefined before an error is encountered", () => { const retryToken = new DefaultRetryToken(Retry.delay(), 0, undefined, false); expect(retryToken.getRetryCost()).toBeUndefined(); }); it("returns set value", () => { const retryToken = new DefaultRetryToken(Retry.delay(), 0, 25, false); expect(retryToken.getRetryCost()).toBe(25); }); }); describe("getRetryCount", () => { it("returns amount set when token is created", () => { const retryCount = 3; const retryToken = new DefaultRetryToken(Retry.delay(), retryCount, 0, false); expect(retryToken.getRetryCount()).toBe(retryCount); }); }); describe("getRetryDelay", () => { it("returns initial delay", () => { const retryToken = new DefaultRetryToken(Retry.delay(), 0, 0, false); expect(retryToken.getRetryDelay()).toBe(Retry.delay()); }); describe(`caps retry delay at ${MAXIMUM_RETRY_DELAY / 1000} seconds`, () => { it("when value exceeded because of high delayBase", () => { const retryToken = new DefaultRetryToken(Retry.delay() * 1000, 0, 0, false); expect(retryToken.getRetryDelay()).toBe(MAXIMUM_RETRY_DELAY); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/DefaultRetryToken.ts ================================================ import type { StandardRetryToken } from "@smithy/types"; import { MAXIMUM_RETRY_DELAY } from "./constants"; /** * @internal */ export class DefaultRetryToken implements StandardRetryToken { public constructor( private readonly delay: number, private readonly count: number, private readonly cost: number | undefined, private readonly longPoll: boolean ) {} public getRetryCount(): number { return this.count; } public getRetryDelay(): number { return Math.min(MAXIMUM_RETRY_DELAY, this.delay); } public getRetryCost(): number | undefined { return this.cost; } public isLongPoll(): boolean { return this.longPoll; } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/StandardRetryStrategy.spec.ts ================================================ import type { RetryErrorInfo } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { DefaultRetryBackoffStrategy } from "./DefaultRetryBackoffStrategy"; import { DefaultRetryToken } from "./DefaultRetryToken"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import { RETRY_MODES } from "./config"; import { MAXIMUM_RETRY_DELAY } from "./constants"; import { Retry } from "./retries-2026-config"; class DeterministicRetryBackoffStrategy extends DefaultRetryBackoffStrategy { public computeNextBackoffDelay(i: number): number { const b = 1; // maximum instead of Math.random() const r = 2; const t_i = b * Math.min(this.x * r ** i, MAXIMUM_RETRY_DELAY); return Math.floor(t_i); } } vi.mock("./DefaultRetryToken"); describe(StandardRetryStrategy.name, () => { const maxAttempts = 3; const retryTokenScope = "scope"; const noRetryTokenAvailableError = new Error("No retry token available"); const errorInfo = { errorType: "TRANSIENT" } as RetryErrorInfo; afterEach(() => { vi.clearAllMocks(); }); it("sets maxAttemptsProvider as a class member variable", async () => { for (const maxAttempts of [1, 2, 3]) { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); await expect(retryStrategy["maxAttemptsProvider"]()).resolves.toBe(maxAttempts); } }); it(`sets mode=${RETRY_MODES.STANDARD}`, () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); expect(retryStrategy.mode).toStrictEqual(RETRY_MODES.STANDARD); }); describe("acquireInitialRetryToken", () => { it("returns default retryToken", async () => { const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); const retryToken = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const defaultToken = new DefaultRetryToken(Retry.delay(), 0, 0, false); expect([retryToken.getRetryCost(), retryToken.getRetryCount(), retryToken.getRetryDelay()]).toEqual([ defaultToken.getRetryCost(), defaultToken.getRetryCount(), defaultToken.getRetryDelay(), ]); }); }); describe("refreshRetryTokenForRetry", () => { it("refreshes the token", async () => { const getRetryCount = vi.fn().mockReturnValue(0); vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); expect(getRetryCount).toHaveBeenCalledTimes(3); }); it("disables any retries when maxAttempts is 1", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(1); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); try { await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); fail(`expected ${noRetryTokenAvailableError}`); } catch (error) { expect(error).toStrictEqual(noRetryTokenAvailableError); } }); it("throws when attempts exceeds maxAttempts", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 2, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(1)); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); try { await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); fail(`expected ${noRetryTokenAvailableError}`); } catch (error) { expect(error).toStrictEqual(noRetryTokenAvailableError); } }); it("throws when attempts exceeds default max attempts (3)", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 5, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(5)); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); try { await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); fail(`expected ${noRetryTokenAvailableError}`); } catch (error) { expect(error).toStrictEqual(noRetryTokenAvailableError); } }); it("throws when error is non-retryable", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(() => Promise.resolve(maxAttempts)); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const errorInfo = { errorType: "CLIENT_ERROR", } as RetryErrorInfo; try { await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); fail(`expected ${noRetryTokenAvailableError}`); } catch (error) { expect(error).toStrictEqual(noRetryTokenAvailableError); } }); }); describe("retryCode", () => { it("returns code 1 (non-retryable) with highest priority over other reasons", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 5, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(1); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); // non-retryable + attempts exhausted: should get code 1 (non-retryable wins) const result = retryStrategy["retryCode"](token, { errorType: "CLIENT_ERROR" } as RetryErrorInfo, 1); expect(result).toBe(1); }); it("returns code 2 (attempts exhausted) when retryable but no attempts left", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 2, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const result = retryStrategy["retryCode"](token, errorInfo, maxAttempts); expect(result).toBe(2); }); it("returns code 3 (no capacity) when retryable with attempts left but no tokens", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); retryStrategy["capacity"] = 0; const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const result = retryStrategy["retryCode"](token, errorInfo, maxAttempts); expect(result).toBe(3); }); it("returns code 0 (OK to retry) when all conditions are met", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const result = retryStrategy["retryCode"](token, errorInfo, maxAttempts); expect(result).toBe(0); }); }); describe("long-poll token behavior", () => { it("throws with $backoff when long-poll token has no capacity (code 3)", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, isLongPoll: () => true, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); retryStrategy["capacity"] = 0; const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); try { await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); fail("expected error"); } catch (error: any) { expect(error.message).toBe("No retry token available"); // $backoff is 0 when Retry.v2026 is false, non-zero when true expect(error.$backoff).toBe(0); } }); it("throws with $backoff=0 when long-poll token fails for non-capacity reason (code 1)", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, isLongPoll: () => true, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); try { await retryStrategy.refreshRetryTokenForRetry(token, { errorType: "CLIENT_ERROR" } as RetryErrorInfo); fail("expected error"); } catch (error: any) { expect(error.message).toBe("No retry token available"); expect(error.$backoff).toBe(0); } }); it("retries long-poll token even when retryCode is non-zero, if capacity exists", async () => { const getRetryCount = vi.fn().mockReturnValue(0); vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount, getRetryCost: () => 0, getRetryDelay: () => 0, isLongPoll: () => true, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); const refreshed = await retryStrategy.refreshRetryTokenForRetry(token, errorInfo); expect(refreshed).toBeDefined(); }); describe("with Retry.v2026 enabled", () => { let originalV2026: boolean; beforeEach(() => { originalV2026 = Retry.v2026; Retry.v2026 = true; }); afterEach(() => { Retry.v2026 = originalV2026; }); it("throws with non-zero $backoff for code 3", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, isLongPoll: () => true, }) as any ); const retryStrategy = new StandardRetryStrategy({ maxAttempts, backoff: new DeterministicRetryBackoffStrategy(), }); retryStrategy["capacity"] = 0; const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); await expect(retryStrategy.refreshRetryTokenForRetry(token, errorInfo)).rejects.toMatchObject({ message: "No retry token available", $backoff: 50, // b=1 * min(50 * 2^0, 20000) = 50 }); }); it("throws with $backoff=0 for non-capacity code", async () => { vi.mocked(DefaultRetryToken).mockImplementation( () => ({ getRetryCount: () => 0, getRetryCost: () => 0, getRetryDelay: () => 0, isLongPoll: () => true, }) as any ); const retryStrategy = new StandardRetryStrategy(maxAttempts); const token = await retryStrategy.acquireInitialRetryToken(retryTokenScope); await expect( retryStrategy.refreshRetryTokenForRetry(token, { errorType: "CLIENT_ERROR" } as RetryErrorInfo) ).rejects.toMatchObject({ message: "No retry token available", $backoff: 0, }); }); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/StandardRetryStrategy.ts ================================================ import type { Provider, RetryErrorInfo, RetryErrorType, RetryStrategyV2, StandardRetryBackoffStrategy, StandardRetryToken, } from "@smithy/types"; import { DefaultRetryBackoffStrategy } from "./DefaultRetryBackoffStrategy"; import { DefaultRetryToken } from "./DefaultRetryToken"; import { DEFAULT_MAX_ATTEMPTS, RETRY_MODES } from "./config"; import { INITIAL_RETRY_TOKENS, NO_RETRY_INCREMENT } from "./constants"; import { Retry } from "./retries-2026-config"; /** * @public */ export type StandardRetryStrategyOptions = { /** * Maximum number of attempts. If set to 1, no retries will be made. */ maxAttempts: number; /** * When present, overrides the base delay for non-throttling retries. */ baseDelay?: number; /** * Backoff calculator. */ backoff?: StandardRetryBackoffStrategy; }; /** * Reason for refusing to retry. * @internal */ const refusal = { /** * Error is not retryable via classification. */ incompatible: 1, /** * attempt count exhausted. */ attempts: 2, /** * capacity exhausted. */ capacity: 3, } as const; /** * @public */ export class StandardRetryStrategy implements RetryStrategyV2 { public readonly mode: string = RETRY_MODES.STANDARD; private capacity: number = INITIAL_RETRY_TOKENS; private readonly retryBackoffStrategy: StandardRetryBackoffStrategy; private readonly maxAttemptsProvider: Provider; private readonly baseDelay: number; public constructor(maxAttempts: number); public constructor(maxAttemptsProvider: Provider); public constructor(options: StandardRetryStrategyOptions); public constructor(arg1: number | Provider | StandardRetryStrategyOptions) { if (typeof arg1 === "number") { this.maxAttemptsProvider = async () => arg1; } else if (typeof arg1 === "function") { this.maxAttemptsProvider = arg1; } else if (arg1 && typeof arg1 === "object") { this.maxAttemptsProvider = async () => arg1.maxAttempts; this.baseDelay = arg1.baseDelay!; this.retryBackoffStrategy = arg1.backoff!; } this.maxAttemptsProvider ??= async () => DEFAULT_MAX_ATTEMPTS; this.baseDelay ??= Retry.delay(); this.retryBackoffStrategy ??= new DefaultRetryBackoffStrategy(); } public async acquireInitialRetryToken(retryTokenScope: string): Promise { return new DefaultRetryToken(Retry.delay(), 0, undefined, Retry.v2026 && retryTokenScope.includes(":longpoll")); } public async refreshRetryTokenForRetry( token: StandardRetryToken, errorInfo: RetryErrorInfo ): Promise { const maxAttempts = await this.getMaxAttempts(); const retryCode = this.retryCode(token, errorInfo, maxAttempts); const shouldRetry = retryCode === 0; const isLongPoll = token.isLongPoll?.(); if (shouldRetry || isLongPoll) { const errorType = errorInfo.errorType; this.retryBackoffStrategy.setDelayBase(errorType === "THROTTLING" ? Retry.throttlingDelay() : this.baseDelay); const delayFromErrorType = this.retryBackoffStrategy.computeNextBackoffDelay(token.getRetryCount()); let retryDelay = delayFromErrorType; if (errorInfo.retryAfterHint instanceof Date) { retryDelay = Math.max( delayFromErrorType /* lower bound */, Math.min(errorInfo.retryAfterHint.getTime() - Date.now(), delayFromErrorType + 5_000 /* upper bound */) ); } if (!shouldRetry) { /** * We only apply additional backoff if `isLongPoll` and the retryCode=3 indicates * that capacity is exhausted. Running out of attempts or having a * non-retryable error does *not* apply backoff. */ throw Object.assign(new Error("No retry token available"), { $backoff: Retry.v2026 && retryCode === refusal.capacity && isLongPoll ? retryDelay : 0, }); } else { const capacityCost = this.getCapacityCost(errorType); this.capacity -= capacityCost; return new DefaultRetryToken( retryDelay, token.getRetryCount() + 1, capacityCost, token.isLongPoll?.() ?? false ); } } throw new Error("No retry token available"); } public recordSuccess(token: StandardRetryToken): void { this.capacity = Math.min(INITIAL_RETRY_TOKENS, this.capacity + (token.getRetryCost() ?? NO_RETRY_INCREMENT)); } /** * This number decreases when retries are executed and refills when requests or retries succeed. * @returns the current available retry capacity. */ public getCapacity(): number { return this.capacity; } /** * There is an existing integration which accesses this field. * @deprecated */ public async maxAttempts(): Promise { return this.maxAttemptsProvider(); } private async getMaxAttempts() { try { return await this.maxAttemptsProvider(); } catch (error) { console.warn(`Max attempts provider could not resolve. Using default of ${DEFAULT_MAX_ATTEMPTS}`); return DEFAULT_MAX_ATTEMPTS; } } /** * 0 - OK to retry. * 1 - error is not classified as retryable. * 2 - attempt count exhausted. * 3 - no capacity left (retry tokens exhausted). * * @returns 0 or the number of the highest priority (lowest integer) reason why retry is not possible. */ private retryCode( tokenToRenew: StandardRetryToken, errorInfo: RetryErrorInfo, maxAttempts: number ): 0 | (typeof refusal)[keyof typeof refusal] { const attempts = tokenToRenew.getRetryCount() + 1; const retryableStatus = this.isRetryableError(errorInfo.errorType) ? 0 : refusal.incompatible; const attemptStatus = attempts < maxAttempts ? 0 : refusal.attempts; const capacityStatus = this.capacity >= this.getCapacityCost(errorInfo.errorType) ? 0 : refusal.capacity; return retryableStatus || attemptStatus || capacityStatus; } private getCapacityCost(errorType: RetryErrorType) { return errorType === Retry.modifiedCostType() ? Retry.throttlingCost() : Retry.cost(); } private isRetryableError(errorType: RetryErrorType): boolean { return errorType === "THROTTLING" || errorType === "TRANSIENT"; } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/config.ts ================================================ /** * @public */ export enum RETRY_MODES { STANDARD = "standard", ADAPTIVE = "adaptive", } /** * The default value for how many HTTP requests an SDK should make for a * single SDK operation invocation before giving up * * @public */ export const DEFAULT_MAX_ATTEMPTS = 3; /** * The default retry algorithm to use. * * @public */ export const DEFAULT_RETRY_MODE = RETRY_MODES.STANDARD; ================================================ FILE: packages/core/src/submodules/retry/util-retry/constants.ts ================================================ /** * The base number of milliseconds to use in calculating a suitable cool-down * time when a retryable error is encountered. * * @public */ export const DEFAULT_RETRY_DELAY_BASE = 100; /** * The maximum amount of time (in milliseconds) that will be used as a delay * between retry attempts. * * @public */ export const MAXIMUM_RETRY_DELAY = 20 * 1000; /** * The retry delay base (in milliseconds) to use when a throttling error is * encountered. * * @public */ export const THROTTLING_RETRY_DELAY_BASE = 500; /** * Initial number of retry tokens in Retry Quota * * @public */ export const INITIAL_RETRY_TOKENS = 500; /** * The total amount of retry tokens to be decremented from retry token balance. * * @public */ export const RETRY_COST = 5; /** * The total amount of retry tokens to be decremented from retry token balance * when a throttling error is encountered. * * @public */ export const TIMEOUT_RETRY_COST = 10; /** * The total amount of retry token to be incremented from retry token balance * if an SDK operation invocation succeeds without requiring a retry request. * * @public * */ export const NO_RETRY_INCREMENT = 1; /** * Header name for SDK invocation ID * * @public */ export const INVOCATION_ID_HEADER = "amz-sdk-invocation-id"; /** * Header name for request retry information. * * @public */ export const REQUEST_HEADER = "amz-sdk-request"; ================================================ FILE: packages/core/src/submodules/retry/util-retry/retries-2026-config.ts ================================================ import type { DEFAULT_RETRY_DELAY_BASE, RETRY_COST, THROTTLING_RETRY_DELAY_BASE, TIMEOUT_RETRY_COST, } from "./constants"; /** * @internal */ export abstract class Retry { public static v2026 = typeof process !== "undefined" && process.env?.SMITHY_NEW_RETRIES_2026 === "true"; public static delay() { return Retry.v2026 ? 50 : (100 satisfies typeof DEFAULT_RETRY_DELAY_BASE); } public static throttlingDelay() { return Retry.v2026 ? 1_000 : (500 satisfies typeof THROTTLING_RETRY_DELAY_BASE); } public static cost() { return Retry.v2026 ? 14 : (5 satisfies typeof RETRY_COST); } public static throttlingCost() { return Retry.v2026 ? 5 : (10 satisfies typeof TIMEOUT_RETRY_COST); } public static modifiedCostType() { return Retry.v2026 ? "THROTTLING" : "TRANSIENT"; } } ================================================ FILE: packages/core/src/submodules/retry/util-retry/retries.integ.spec.ts ================================================ import { Readable } from "node:stream"; import { cbor } from "@smithy/core/cbor"; import { HttpResponse } from "@smithy/protocol-http"; import type { RetryErrorType, StandardRetryToken } from "@smithy/types"; import { requireRequestsFrom } from "@smithy/util-test/src"; import { afterAll, beforeAll, describe, expect, test as it } from "vitest"; import { XYZService } from "xyz"; import { DefaultRetryBackoffStrategy } from "./DefaultRetryBackoffStrategy"; import { StandardRetryStrategy } from "./StandardRetryStrategy"; import { MAXIMUM_RETRY_DELAY } from "./constants"; import { Retry } from "./retries-2026-config"; class DeterministicRetryBackoffStrategy extends DefaultRetryBackoffStrategy { public computeNextBackoffDelay(i: number): number { const b = 1; // maximum instead of Math.random() const r = 2; const t_i = b * Math.min(this.x * r ** i, MAXIMUM_RETRY_DELAY); return Math.floor(t_i); } } describe("retries", () => { function createCborResponse(body: any, status = 200) { const bytes = cbor.serialize(body); return new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, body: Readable.from(bytes), statusCode: status, }); } it("should retry throttling and transient-error status codes", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( createCborResponse( { __type: "HaltError", }, 429 ), createCborResponse( { __type: "HaltError", }, 500 ), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(3); }); it("should retry when a retryable trait is modeled", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( createCborResponse( { __type: "RetryableError", }, 400 // not retryable status code ), createCborResponse( { __type: "RetryableError", }, 400 // not retryable status code ), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(3); }); it("should retry retryable trait with throttling", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( createCborResponse( { __type: "CodedThrottlingError", }, 429 ), createCborResponse( { __type: "MysteryThrottlingError", }, 400 // not a retryable status code, but error is modeled as retryable. ), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(3); }); it("should not retry if the error is not modeled with retryable trait and is not otherwise retryable", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( createCborResponse( { __type: "HaltError", }, 429 // not modeled as retryable, but this is a retryable status code. ), createCborResponse( { __type: "HaltError", }, 400 ), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); // stopped at the second error. expect(response.$metadata.attempts).toEqual(2); }); }); describe(StandardRetryStrategy.name, () => { const inline = (token: StandardRetryToken) => { return [token.getRetryCount(), token.getRetryCost(), token.getRetryDelay(), token.isLongPoll?.()]; }; describe("retry timings", () => { const testCases: Array<{ name: string; timings: [RetryErrorType, number, number | undefined, number, boolean][]; scope?: string; v2026?: boolean; }> = [ { name: "3x - transient", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["TRANSIENT", 1, 10, 100, false], ["TRANSIENT", 2, 10, 200, false], ], }, { name: "3x - throttling", timings: [ ["THROTTLING", 0, undefined, 100, false], ["THROTTLING", 1, 5, 500, false], ["THROTTLING", 2, 5, 1000, false], ], }, { name: "3x - throttling mixed", timings: [ ["THROTTLING", 0, undefined, 100, false], ["TRANSIENT", 1, 10, 100, false], ["THROTTLING", 2, 5, 1000, false], ], }, { name: "3x - transient mixed", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["THROTTLING", 1, 5, 500, false], ["TRANSIENT", 2, 10, 200, false], ], }, { name: "8x - transient", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["TRANSIENT", 1, 10, 100, false], ["TRANSIENT", 2, 10, 200, false], ["TRANSIENT", 3, 10, 400, false], ["TRANSIENT", 4, 10, 800, false], ["TRANSIENT", 5, 10, 1600, false], ["TRANSIENT", 6, 10, 3200, false], ["TRANSIENT", 7, 10, 6400, false], ], }, { name: "8x - throttling", timings: [ ["THROTTLING", 0, undefined, 100, false], ["THROTTLING", 1, 5, 500, false], ["THROTTLING", 2, 5, 1000, false], ["THROTTLING", 3, 5, 2000, false], ["THROTTLING", 4, 5, 4000, false], ["THROTTLING", 5, 5, 8000, false], ["THROTTLING", 6, 5, 16000, false], ["THROTTLING", 7, 5, 20000, false], ], }, { name: "8x - transient mixed", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["THROTTLING", 1, 5, 500, false], ["THROTTLING", 2, 5, 1000, false], ["TRANSIENT", 3, 10, 400, false], ["TRANSIENT", 4, 10, 800, false], ["TRANSIENT", 5, 10, 1600, false], ["TRANSIENT", 6, 10, 3200, false], ["THROTTLING", 7, 5, 20000, false], ], }, { name: "8x - throttling mixed", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["TRANSIENT", 1, 10, 100, false], ["THROTTLING", 2, 5, 1000, false], ["THROTTLING", 3, 5, 2000, false], ["THROTTLING", 4, 5, 4000, false], ["THROTTLING", 5, 5, 8000, false], ["TRANSIENT", 6, 10, 3200, false], ["THROTTLING", 7, 5, 20000, false], ], }, { name: "12x - throttling mixed longpoll", scope: ":longpoll", timings: [ ["TRANSIENT", 0, undefined, 100, false], ["TRANSIENT", 1, 10, 100, false], ["THROTTLING", 2, 5, 1000, false], ["THROTTLING", 3, 5, 2000, false], ["THROTTLING", 4, 5, 4000, false], ["THROTTLING", 5, 5, 8000, false], ["TRANSIENT", 6, 10, 3200, false], ["THROTTLING", 7, 5, 20000, false], ["THROTTLING", 8, 5, 20000, false], ["THROTTLING", 9, 5, 20000, false], ["THROTTLING", 10, 5, 20000, false], ["THROTTLING", 11, 5, 20000, false], ], }, ]; testCases.push( ...( [ { name: "8x - transient mixed", timings: [ ["TRANSIENT", 0, undefined, 50, false], ["THROTTLING", 1, 5, 1000, false], ["THROTTLING", 2, 5, 2000, false], ["TRANSIENT", 3, 14, 200, false], ["TRANSIENT", 4, 14, 400, false], ["TRANSIENT", 5, 14, 800, false], ["TRANSIENT", 6, 14, 1600, false], ["THROTTLING", 7, 5, 20000, false], ], }, { name: "8x - throttling mixed", timings: [ ["TRANSIENT", 0, undefined, 50, false], ["TRANSIENT", 1, 14, 50, false], ["THROTTLING", 2, 5, 2000, false], ["THROTTLING", 3, 5, 4000, false], ["THROTTLING", 4, 5, 8000, false], ["THROTTLING", 5, 5, 16000, false], ["TRANSIENT", 6, 14, 1600, false], ["THROTTLING", 7, 5, 20000, false], ], }, { name: "12x - throttling mixed longpoll", scope: ":longpoll", timings: [ ["TRANSIENT", 0, undefined, 50, true], ["TRANSIENT", 1, 14, 50, true], ["THROTTLING", 2, 5, 2000, true], ["THROTTLING", 3, 5, 4000, true], ["THROTTLING", 4, 5, 8000, true], ["THROTTLING", 5, 5, 16000, true], ["TRANSIENT", 6, 14, 1600, true], ["THROTTLING", 7, 5, 20000, true], ["THROTTLING", 8, 5, 20000, true], ["THROTTLING", 9, 5, 20000, true], ["THROTTLING", 10, 5, 20000, true], ["THROTTLING", 11, 5, 20000, true], ], }, ] as typeof testCases ).map((c) => { c.v2026 = true; return c; }) ); for (const { name, timings, scope, v2026 } of testCases) { describe(name + (v2026 ? " (2026)" : ""), async () => { let retryStrategy!: StandardRetryStrategy; beforeAll(() => { if (v2026) { process.env.SMITHY_NEW_RETRIES_2026 = "true"; Retry.v2026 = true; } else { delete process.env.SMITHY_NEW_RETRIES_2026; Retry.v2026 = false; } retryStrategy = new StandardRetryStrategy({ maxAttempts: timings.length, backoff: new DeterministicRetryBackoffStrategy(), }); }); const tokens: StandardRetryToken[] = []; for (let i = 0; i < timings.length; ++i) { it(String(i), async () => { if (i === 0) { const token = await retryStrategy.acquireInitialRetryToken(scope ?? "none"); tokens.push(token); } else { const token = await retryStrategy.refreshRetryTokenForRetry(tokens[i - 1], { errorType: timings[i][0], }); tokens.push(token); } expect(inline(tokens[i])).toEqual(timings[i].slice(1)); if (i === timings.length - 1) { const expectedCapacityRemaining = 500 - timings.reduce((acc, [, , cost]) => acc + (cost ?? 0), 0); expect(retryStrategy.getCapacity()).toEqual(expectedCapacityRemaining); } }); } }); } }); }); describe("specification tests", () => { type Outcome = "success" | "retry_request" | "max_attempts_exceeded" | "retry_quota_exceeded"; interface ResponseStep { response: { status_code: number; error_code?: string; headers?: Record }; expected: { outcome: Outcome; retry_quota: number; delay?: number }; } interface SpecTestCase { name: string; given: { max_attempts?: number; initial_retry_tokens?: number; exponential_base?: number; max_backoff_time?: number; service?: string; operation?: string; }; responses: ResponseStep[]; } function errorTypeForResponse(r: ResponseStep["response"]): RetryErrorType { if ( r.status_code === 429 || r.error_code === "Throttling" || r.error_code === "ThrottlingException" || r.error_code === "ProvisionedThroughputExceededException" ) { return "THROTTLING"; } if ([500, 502, 503, 504].includes(r.status_code)) { return "TRANSIENT"; } return "CLIENT_ERROR"; } const specTestCases: SpecTestCase[] = [ { name: "Retry eventually succeeds", given: { exponential_base: 1 }, responses: [ { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 486, delay: 0.05 } }, { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 472, delay: 0.1 } }, { response: { status_code: 200 }, expected: { outcome: "success", retry_quota: 486 } }, ], }, { name: "Fail due to max attempts reached", given: { exponential_base: 1 }, responses: [ { response: { status_code: 502 }, expected: { outcome: "retry_request", retry_quota: 486, delay: 0.05 } }, { response: { status_code: 502 }, expected: { outcome: "retry_request", retry_quota: 472, delay: 0.1 } }, { response: { status_code: 502 }, expected: { outcome: "max_attempts_exceeded", retry_quota: 472 } }, ], }, { name: "Retry Quota reached after a single retry", given: { initial_retry_tokens: 14, exponential_base: 1 }, responses: [ { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 0, delay: 0.05 } }, { response: { status_code: 500 }, expected: { outcome: "retry_quota_exceeded", retry_quota: 0 } }, ], }, { name: "No retries at all if retry quota is 0", given: { initial_retry_tokens: 0, exponential_base: 1 }, responses: [{ response: { status_code: 500 }, expected: { outcome: "retry_quota_exceeded", retry_quota: 0 } }], }, { name: "Verifying exponential backoff timing", given: { max_attempts: 5, exponential_base: 1 }, responses: [ { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 486, delay: 0.05 } }, { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 472, delay: 0.1 } }, { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 458, delay: 0.2 } }, { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 444, delay: 0.4 } }, { response: { status_code: 500 }, expected: { outcome: "max_attempts_exceeded", retry_quota: 444 } }, ], }, { name: "Retry Stops After Retry Quota Exhaustion", given: { max_attempts: 5, initial_retry_tokens: 20, exponential_base: 1 }, responses: [ { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 6, delay: 0.05 } }, { response: { status_code: 502 }, expected: { outcome: "retry_quota_exceeded", retry_quota: 6 } }, ], }, { name: "Retry quota Recovery After Successful Responses", given: { max_attempts: 5, initial_retry_tokens: 30, exponential_base: 1 }, responses: [ { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 16, delay: 0.05 } }, { response: { status_code: 502 }, expected: { outcome: "retry_request", retry_quota: 2, delay: 0.1 } }, { response: { status_code: 200 }, expected: { outcome: "success", retry_quota: 16 } }, { response: { status_code: 500 }, expected: { outcome: "retry_request", retry_quota: 2, delay: 0.05 } }, { response: { status_code: 200 }, expected: { outcome: "success", retry_quota: 16 } }, ], }, { name: "Throttling Error Token Bucket Drain (5 tokens) and Backoff Duration (1000ms)", given: { exponential_base: 1 }, responses: [ { response: { status_code: 400, error_code: "Throttling" }, expected: { outcome: "retry_request", retry_quota: 495, delay: 1 }, }, { response: { status_code: 200 }, expected: { outcome: "success", retry_quota: 500 } }, ], }, ]; let defaultRetryV2026Flag: boolean; beforeAll(() => { defaultRetryV2026Flag = Retry.v2026; Retry.v2026 = true; process.env.SMITHY_NEW_RETRIES_2026 = "true"; }); afterAll(() => { Retry.v2026 = defaultRetryV2026Flag; if (!defaultRetryV2026Flag) { delete process.env.SMITHY_NEW_RETRIES_2026; } }); describe("StandardRetryStrategy unit tests", () => { for (const tc of specTestCases) { describe(tc.name, () => { let strategy: StandardRetryStrategy; let currentToken: StandardRetryToken; beforeAll(() => { strategy = new StandardRetryStrategy({ maxAttempts: tc.given.max_attempts ?? 3, backoff: new DeterministicRetryBackoffStrategy(), }); if (tc.given.initial_retry_tokens !== undefined) { (strategy as any).capacity = tc.given.initial_retry_tokens; } }); for (let i = 0; i < tc.responses.length; i++) { const step = tc.responses[i]; const { outcome, retry_quota, delay } = step.expected; const isNewSequence = i === 0 || tc.responses[i - 1].expected.outcome === "success"; it(`step ${i}: ${outcome} (status=${step.response.status_code})`, async () => { if (isNewSequence) { currentToken = await strategy.acquireInitialRetryToken("none"); } if (outcome === "success") { strategy.recordSuccess(currentToken); expect(strategy.getCapacity()).toEqual(retry_quota); return; } if (outcome === "retry_request") { const errorType = errorTypeForResponse(step.response); currentToken = await strategy.refreshRetryTokenForRetry(currentToken, { errorType }); expect(strategy.getCapacity()).toEqual(retry_quota); expect(currentToken.getRetryDelay()).toEqual(delay! * 1000); return; } // max_attempts_exceeded or retry_quota_exceeded const errorType = errorTypeForResponse(step.response); await expect(strategy.refreshRetryTokenForRetry(currentToken, { errorType })).rejects.toThrow(); expect(strategy.getCapacity()).toEqual(retry_quota); }); } }); } }); describe("end-to-end with requireRequestsFrom", () => { function createCborResponse(body: any, status = 200, headers: Record = {}) { const bytes = cbor.serialize(body); return new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", ...headers }, body: Readable.from(bytes), statusCode: status, }); } /** * Asserts that the actual value is within ±10% of the expected value. */ const expectApprox = (actual: number, expected: number) => { expect(actual).toBeGreaterThanOrEqual(expected * 0.9); expect(actual).toBeLessThanOrEqual(expected * 1.1); }; it("Retry eventually succeeds (3 attempts)", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, retryStrategy: new StandardRetryStrategy({ maxAttempts: 3, backoff: new DeterministicRetryBackoffStrategy(), }), }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/ }) .respondWith( createCborResponse({ __type: "RetryableError" }, 500), createCborResponse({ __type: "RetryableError" }, 500), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(3); // 2 transient retries: 50ms + 100ms = 150ms expectApprox(response.$metadata.totalRetryDelay, 150); }); it("Fail due to max attempts reached (3 attempts, all 502)", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, retryStrategy: new StandardRetryStrategy({ maxAttempts: 3, backoff: new DeterministicRetryBackoffStrategy(), }), }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/ }) .respondWith( createCborResponse({ __type: "RetryableError" }, 502), createCborResponse({ __type: "RetryableError" }, 502), createCborResponse({ __type: "RetryableError" }, 502) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(3); expect(response.name).toEqual("RetryableError"); // 2 transient retries: 50ms + 100ms = 150ms expectApprox(response.$metadata.totalRetryDelay, 150); }); it("Throttling error retries and succeeds", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, retryStrategy: new StandardRetryStrategy({ maxAttempts: 3, backoff: new DeterministicRetryBackoffStrategy(), }), }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/ }) .respondWith(createCborResponse({ __type: "CodedThrottlingError" }, 429), createCborResponse("", 200)); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(2); // 1 throttling retry: 1000ms expectApprox(response.$metadata.totalRetryDelay, 1000); }); it("x-amz-retry-after header is honored", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, retryStrategy: new StandardRetryStrategy({ maxAttempts: 3, backoff: new DeterministicRetryBackoffStrategy(), }), }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/ }) .respondWith( createCborResponse({ __type: "RetryableError" }, 500, { "x-amz-retry-after": "1500" }), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(2); // x-amz-retry-after=1500ms, clamped to max(50, min(1500, 50+5000)) = 1500ms expectApprox(response.$metadata.totalRetryDelay, 1500); }); it("Invalid x-amz-retry-after falls back to exponential backoff", async () => { const client = new XYZService({ endpoint: "https://localhost/nowhere", apiKey: { apiKey: "test-api-key" }, retryStrategy: new StandardRetryStrategy({ maxAttempts: 3, backoff: new DeterministicRetryBackoffStrategy(), }), }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/ }) .respondWith( createCborResponse({ __type: "RetryableError" }, 500, { "x-amz-retry-after": "invalid" }), createCborResponse("", 200) ); const response = await client.getNumbers().catch((e) => e); expect(response.$metadata.attempts).toEqual(2); // Invalid header ignored, falls back to transient backoff: 50ms expectApprox(response.$metadata.totalRetryDelay, 50); }); }); }); ================================================ FILE: packages/core/src/submodules/retry/util-retry/types.ts ================================================ /** * @public */ export interface RateLimiter { /** * If there is sufficient capacity (tokens) available, it immediately returns. * If there is not sufficient capacity, it will either sleep a certain amount * of time until the rate limiter can retrieve a token from its token bucket * or raise an exception indicating there is insufficient capacity. */ getSendToken: () => Promise; /** * Updates the client sending rate based on response. * If the response was successful, the capacity and fill rate are increased. * If the response was a throttling response, the capacity and fill rate are * decreased. Transient errors do not affect the rate limiter. */ updateClientSendingRate: (response: any) => void; } ================================================ FILE: packages/core/src/submodules/schema/TypeRegistry.spec.ts ================================================ import type { StaticErrorSchema, StaticListSchema, StaticMapSchema, StaticStructureSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { TypeRegistry } from "./TypeRegistry"; describe(TypeRegistry.name, () => { const [List, Map, Struct]: [StaticListSchema, StaticMapSchema, () => StaticStructureSchema] = [ [1, "NAMESPACE", "List", { sparse: 1 }, 0], [2, "NAMESPACE", "Map", 0, 0, 1], () => schema, ]; const schema: StaticStructureSchema = [ 3, "NAMESPACE", "Structure", {}, ["list", "map", "struct"], [List, Map, Struct], ]; it("stores and retrieves schema objects", () => { const tr = TypeRegistry.for("NAMESPACE"); tr.register(`${List[1]}#${List[2]}`, List); expect(tr.getSchema("List")).toBe(List); tr.register(`${Map[1]}#${Map[2]}`, Map); expect(tr.getSchema("Map")).toBe(Map); tr.register(`${Struct()[1]}#${Struct()[2]}`, Struct()); expect(tr.getSchema("Structure")).toBe(schema); }); it("has a helper method to retrieve a synthetic base exception", () => { // the service namespace is appended to the synthetic prefix. const err = [ -3, "smithy.ts.sdk.synthetic.NAMESPACE", "UhOhServiceException", 0, [], [], ] satisfies StaticErrorSchema; const tr = TypeRegistry.for(err[1]); tr.registerError(err, Error); expect(tr.getBaseException()).toBe(err); }); describe("unqualified shapeId lookup", () => { it("resolves an unqualified name when there is exactly one matching schema", () => { const tr = TypeRegistry.for("com.unrelated"); tr.register("com.example#MyShape", List); expect(tr.getSchema("MyShape")).toBe(List); }); it("throws when an unqualified name matches multiple schemas", () => { const tr = TypeRegistry.for("com.unrelated"); tr.register("com.example#Ambiguous", List); tr.register("com.other#Ambiguous", Map); expect(() => tr.getSchema("Ambiguous")).toThrow("schema not found"); }); it("throws when an unqualified name matches no schemas", () => { const tr = TypeRegistry.for("com.unrelated"); tr.register("com.example#Exists", List); expect(() => tr.getSchema("DoesNotExist")).toThrow("schema not found"); }); }); describe("composition", () => { it("can be composed", () => { const tr1 = TypeRegistry.for("namespace"); const tr2 = TypeRegistry.for("other"); tr1.register("namespace#List", List); tr2.register("other#List", List); tr1.copyFrom(tr2); tr2.copyFrom(tr1); expect(tr1.getSchema("other#List")).toBe(List); expect(tr2.getSchema("namespace#List")).toBe(List); expect(() => tr1.getSchema("List")).not.toThrow(); expect(() => tr2.getSchema("List")).not.toThrow(); }); it("does not overwrite during composition", () => { const nsRegistry = TypeRegistry.for("namespace"); const otherRegistry = TypeRegistry.for("other"); // non-canonical otherRegistry.register("namespace#Value", 1); // canonical nsRegistry.register("namespace#Value", 0); // non-canonical nsRegistry.register("other#Value", 1); // canonical otherRegistry.register("other#Value", 0); nsRegistry.copyFrom(otherRegistry); otherRegistry.copyFrom(nsRegistry); expect(nsRegistry.getSchema("namespace#Value")).toBe(0); expect(nsRegistry.getSchema("other#Value")).toBe(1); expect(otherRegistry.getSchema("namespace#Value")).toBe(1); expect(otherRegistry.getSchema("other#Value")).toBe(0); }); }); }); ================================================ FILE: packages/core/src/submodules/schema/TypeRegistry.ts ================================================ import type { Schema as ISchema, StaticErrorSchema } from "@smithy/types"; import type { ErrorSchema } from "./schemas/ErrorSchema"; /** * A way to look up schema by their ShapeId values. * * @public */ export class TypeRegistry { public static readonly registries = new Map(); private constructor( public readonly namespace: string, private schemas: Map = new Map(), private exceptions: Map = new Map() ) {} /** * @param namespace - specifier. * @returns the schema for that namespace, creating it if necessary. */ public static for(namespace: string): TypeRegistry { if (!TypeRegistry.registries.has(namespace)) { TypeRegistry.registries.set(namespace, new TypeRegistry(namespace)); } return TypeRegistry.registries.get(namespace)!; } /** * Copies entries from another instance without changing the namespace of self. * The composition is additive but non-destructive and will not overwrite existing entries. * * @param other - another TypeRegistry. */ public copyFrom(other: TypeRegistry) { const { schemas, exceptions } = this; for (const [k, v] of other.schemas) { if (!schemas.has(k)) { schemas.set(k, v); } } for (const [k, v] of other.exceptions) { if (!exceptions.has(k)) { exceptions.set(k, v); } } } /** * Adds the given schema to a type registry with the same namespace, and this registry. * * @param shapeId - to be registered. * @param schema - to be registered. */ public register(shapeId: string, schema: ISchema) { const qualifiedName = this.normalizeShapeId(shapeId); for (const r of [this, TypeRegistry.for(qualifiedName.split("#")[0])]) { r.schemas.set(qualifiedName, schema); } } /** * @param shapeId - query. * @returns the schema. */ public getSchema(shapeId: string): ISchema { const id = this.normalizeShapeId(shapeId); if (!this.schemas.has(id)) { if (!shapeId.includes("#")) { const suffix = "#" + shapeId; const candidates: ISchema[] = []; for (const [shapeId, schema] of this.schemas.entries()) { if (shapeId.endsWith(suffix)) { candidates.push(schema); } } if (candidates.length === 1) { return candidates[0]; } } throw new Error(`@smithy/core/schema - schema not found for ${id}`); } return this.schemas.get(id)!; } /** * Associates an error schema with its constructor. */ public registerError(es: ErrorSchema | StaticErrorSchema, ctor: any) { const $error = es as StaticErrorSchema; const ns = $error[1]; for (const r of [this, TypeRegistry.for(ns)]) { r.schemas.set(ns + "#" + $error[2], $error); r.exceptions.set($error, ctor); } } /** * @param es - query. * @returns Error constructor that extends the service's base exception. */ public getErrorCtor(es: ErrorSchema | StaticErrorSchema): any { const $error = es as StaticErrorSchema; if (this.exceptions.has($error)) { return this.exceptions.get($error); } const registry = TypeRegistry.for($error[1]); return registry.exceptions.get($error); } /** * The smithy-typescript code generator generates a synthetic (i.e. unmodeled) base exception, * because generated SDKs before the introduction of schemas have the notion of a ServiceBaseException, which * is unique per service/model. * * This is generated under a unique prefix that is combined with the service namespace, and this * method is used to retrieve it. * * The base exception synthetic schema is used when an error is returned by a service, but we cannot * determine what existing schema to use to deserialize it. * * @returns the synthetic base exception of the service namespace associated with this registry instance. */ public getBaseException(): StaticErrorSchema | undefined { for (const exceptionKey of this.exceptions.keys()) { if (Array.isArray(exceptionKey)) { const [, ns, name] = exceptionKey; const id = ns + "#" + name; if (id.startsWith("smithy.ts.sdk.synthetic.") && id.endsWith("ServiceException")) { return exceptionKey; } } } return undefined; } /** * @param predicate - criterion. * @returns a schema in this registry matching the predicate. */ public find(predicate: (schema: ISchema) => boolean) { for (const schema of this.schemas.values()) { if (predicate(schema)) { return schema; } } return undefined; } /** * Unloads the current TypeRegistry. */ public clear() { this.schemas.clear(); this.exceptions.clear(); } private normalizeShapeId(shapeId: string) { if (shapeId.includes("#")) { return shapeId; } return this.namespace + "#" + shapeId; } } ================================================ FILE: packages/core/src/submodules/schema/deref.ts ================================================ import type { Schema, SchemaRef } from "@smithy/types"; /** * Dereferences a SchemaRef if needed. * @internal */ export const deref = (schemaRef: SchemaRef): Schema => { if (typeof schemaRef === "function") { return schemaRef(); } return schemaRef; }; ================================================ FILE: packages/core/src/submodules/schema/index.ts ================================================ export * from "./deref"; export * from "./middleware/getSchemaSerdePlugin"; export * from "./schemas/ListSchema"; export * from "./schemas/MapSchema"; export * from "./schemas/OperationSchema"; export * from "./schemas/operation"; export * from "./schemas/ErrorSchema"; export * from "./schemas/NormalizedSchema"; export * from "./schemas/Schema"; export * from "./schemas/SimpleSchema"; export * from "./schemas/StructureSchema"; export * from "./schemas/sentinels"; export * from "./schemas/translateTraits"; export * from "./TypeRegistry"; ================================================ FILE: packages/core/src/submodules/schema/middleware/getSchemaSerdePlugin.ts ================================================ import type { DeserializeHandlerOptions, MetadataBearer, MiddlewareStack, Pluggable, SerdeFunctions, SerializeHandlerOptions, } from "@smithy/types"; import type { PreviouslyResolved } from "./schema-middleware-types"; import { schemaDeserializationMiddleware } from "./schemaDeserializationMiddleware"; import { schemaSerializationMiddleware } from "./schemaSerializationMiddleware"; /** * @internal */ export const deserializerMiddlewareOption: DeserializeHandlerOptions = { name: "deserializerMiddleware", step: "deserialize", tags: ["DESERIALIZER"], override: true, }; /** * @internal */ export const serializerMiddlewareOption: SerializeHandlerOptions = { name: "serializerMiddleware", step: "serialize", tags: ["SERIALIZER"], override: true, }; /** * @internal */ export function getSchemaSerdePlugin( config: PreviouslyResolved ): Pluggable { return { applyToStack: (commandStack: MiddlewareStack) => { commandStack.add(schemaSerializationMiddleware(config), serializerMiddlewareOption); commandStack.add(schemaDeserializationMiddleware(config), deserializerMiddlewareOption); // `config` is fully resolved at the point of applying plugins. // As such, config qualifies as SerdeContext. config.protocol.setSerdeContext(config as SerdeFunctions); }, }; } ================================================ FILE: packages/core/src/submodules/schema/middleware/schema-middleware-types.ts ================================================ import type { ClientProtocol, SerdeContext, UrlParser } from "@smithy/types"; /** * @internal */ export type PreviouslyResolved = Omit< SerdeContext & { urlParser: UrlParser; protocol: ClientProtocol; }, "endpoint" >; ================================================ FILE: packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.spec.ts ================================================ import { HttpResponse } from "@smithy/protocol-http"; import type { SchemaRef } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { schemaDeserializationMiddleware } from "./schemaDeserializationMiddleware"; describe(schemaDeserializationMiddleware.name, () => { const mockNext = vi.fn(); const mockDeserializer = vi.fn(); const mockProtocol = { deserializeResponse: mockDeserializer, }; const mockOptions = { endpoint: () => Promise.resolve({ protocol: "protocol", hostname: "hostname", path: "path", }), protocol: mockProtocol, } as any; const mockOptionsDeserializationError = { ...mockOptions, protocol: { async deserializeResponse() { JSON.parse(`this isn't JSON`); }, } as any, } as any; const mockArgs = { input: { inputKey: "inputValue", }, request: { method: "GET", headers: {}, }, }; const mockOutput = { $metadata: { statusCode: 200, requestId: "requestId", }, outputKey: "outputValue", }; const mockNextResponse = { response: { statusCode: 200, headers: {}, }, $metadata: { httpStatusCode: 200, requestId: undefined, extendedRequestId: undefined, cfId: undefined, }, }; const mockResponse = { response: mockNextResponse.response, output: mockOutput, }; beforeEach(() => { mockNext.mockResolvedValueOnce(mockNextResponse); mockDeserializer.mockResolvedValueOnce(mockOutput); }); afterEach(() => { vi.clearAllMocks(); }); it("calls deserializer and populates response object", async () => { await expect(schemaDeserializationMiddleware(mockOptions)(mockNext, {})(mockArgs)).resolves.toStrictEqual( mockResponse ); expect(mockNext).toHaveBeenCalledTimes(1); expect(mockNext).toHaveBeenCalledWith(mockArgs); expect(mockDeserializer).toHaveBeenCalledTimes(1); expect(mockDeserializer).toHaveBeenCalledWith( {}, { ...mockOptions, __smithy_context: {}, }, mockNextResponse.response ); }); it("injects non-enumerable $response reference to deserializing exceptions", async () => { const exception = Object.assign(new Error("MockException"), mockNextResponse.response); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await schemaDeserializationMiddleware(mockOptions)(mockNext, {})(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e).toMatchObject(exception); expect(e.$response).toEqual(mockNextResponse.response); expect(Object.keys(e)).not.toContain("$response"); } }); it("adds a hint about $response to the message of the thrown error", async () => { const exception = Object.assign(new Error("MockException"), mockNextResponse.response, { $response: { body: "", }, $responseBodyText: "oh no", }); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await schemaDeserializationMiddleware(mockOptions)(mockNext, {})(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.message).toContain( "to see the raw response, inspect the hidden field {error}.$response on this object." ); expect(e.$response.body).toEqual("oh no"); } }); it("handles unwritable error.message", async () => { const exception = Object.assign({}, mockNextResponse.response, { $response: { body: "", }, $responseBodyText: "oh no", }); Object.defineProperty(exception, "message", { set() { throw new Error("may not call setter"); }, get() { return "MockException"; }, }); const sink = vi.fn(); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await schemaDeserializationMiddleware(mockOptions)(mockNext, { logger: { debug: sink, info: sink, warn: sink, error: sink, }, })(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(sink).toHaveBeenCalledWith( `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.` ); expect(e.message).toEqual("MockException"); expect(e.$response.body).toEqual("oh no"); } }); describe("metadata", () => { it("assigns metadata from the response in the event of a deserializer failure", async () => { const midware = schemaDeserializationMiddleware(mockOptionsDeserializationError); const handler = midware( async () => ({ response: new HttpResponse({ headers: { "x-namespace-requestid": "requestid", "x-namespace-id-2": "id2", "x-namespace-cf-id": "cf", }, statusCode: 503, }), }), { __smithy_context: { operationSchema: [9, "", "", 0, "unit", "unit"], }, } ); try { await handler(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.$metadata).toEqual({ httpStatusCode: 503, requestId: "requestid", extendedRequestId: "id2", cfId: "cf", }); } expect.assertions(1); }); it("assigns any available metadata from the response in the event of a deserializer failure", async () => { const midware = schemaDeserializationMiddleware(mockOptionsDeserializationError); const handler = midware( async () => ({ response: new HttpResponse({ statusCode: 301, headers: { "x-namespace-requestid": "requestid", }, }), }), { __smithy_context: { operationSchema: [9, "", "", 0, "unit", "unit"], }, } ); try { await handler(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.$metadata).toEqual({ httpStatusCode: 301, requestId: "requestid", extendedRequestId: undefined, cfId: undefined, }); } expect.assertions(1); }); }); }); ================================================ FILE: packages/core/src/submodules/schema/middleware/schemaDeserializationMiddleware.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import { HttpResponse } from "@smithy/core/protocols"; import type { DeserializeHandler, DeserializeHandlerArguments, HandlerExecutionContext, MetadataBearer, StaticOperationSchema, } from "@smithy/types"; import { operation } from "../schemas/operation"; import type { PreviouslyResolved } from "./schema-middleware-types"; /** * @internal */ export const schemaDeserializationMiddleware = (config: PreviouslyResolved) => (next: DeserializeHandler, context: HandlerExecutionContext) => async (args: DeserializeHandlerArguments) => { const { response } = await next(args); const { operationSchema } = getSmithyContext(context) as { operationSchema: StaticOperationSchema; }; const [, ns, n, t, i, o] = operationSchema ?? []; try { const parsed = await config.protocol.deserializeResponse( operation(ns, n, t, i, o), { ...config, ...context, }, response ); return { response, output: parsed as O, }; } catch (error) { // For security reasons, the error response is not completely visible by default. Object.defineProperty(error, "$response", { value: response, // we need to define these properties explicitly because // the service exception class may have set the value to undefined, but populated the key. enumerable: false, writable: false, configurable: false, }); if (!("$metadata" in error)) { // only apply this to non-ServiceException. const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`; try { error.message += "\n " + hint; } catch (e) { // Error with an unwritable message (strict mode getter with no setter). if (!context.logger || context.logger?.constructor?.name === "NoOpLogger") { console.warn(hint); } else { context.logger?.warn?.(hint); } } if (typeof error.$responseBodyText !== "undefined") { // if $responseBodyText was collected by the error parser, assign it to // replace the response body, because it was consumed and is now empty. if (error.$response) { error.$response.body = error.$responseBodyText; } } try { // if the deserializer failed, then $metadata may still be set // by taking information from the response. if (HttpResponse.isInstance(response)) { const { headers = {} } = response; const headerEntries = Object.entries(headers); (error as MetadataBearer).$metadata = { httpStatusCode: response.statusCode, requestId: findHeader(/^x-[\w-]+-request-?id$/, headerEntries), extendedRequestId: findHeader(/^x-[\w-]+-id-2$/, headerEntries), cfId: findHeader(/^x-[\w-]+-cf-id$/, headerEntries), }; } } catch (e) { // ignored, error object was not writable. } } throw error; } }; /** * @internal * @returns header value where key matches regex. */ const findHeader = (pattern: RegExp, headers: [string, string][]): string | undefined => { return (headers.find(([k]) => { return k.match(pattern); }) || [void 0, void 1])[1]; }; ================================================ FILE: packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.spec.ts ================================================ import type { SchemaRef } from "@smithy/types"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { schemaSerializationMiddleware } from "./schemaSerializationMiddleware"; describe(schemaSerializationMiddleware.name, () => { const mockNext = vi.fn(); const mockSerializer = vi.fn(); const mockProtocol = { serializeRequest: mockSerializer, }; const mockOptions = { endpoint: () => Promise.resolve({ protocol: "protocol", hostname: "hostname", path: "path", }), protocol: mockProtocol, } as any; const mockRequest = { method: "GET", headers: {}, }; const mockResponse = { statusCode: 200, headers: {}, }; const mockOutput = { $metadata: { statusCode: 200, requestId: "requestId", }, outputKey: "outputValue", }; const mockReturn = { response: mockResponse, output: mockOutput, }; const mockArgs = { input: { inputKey: "inputValue", }, }; beforeEach(() => { mockNext.mockResolvedValueOnce(mockReturn); mockSerializer.mockResolvedValueOnce(mockRequest); }); it("calls serializer and populates request object", async () => { await expect(schemaSerializationMiddleware(mockOptions)(mockNext, {})(mockArgs)).resolves.toStrictEqual(mockReturn); expect(mockSerializer).toHaveBeenCalledTimes(1); expect(mockSerializer).toHaveBeenCalledWith({}, mockArgs.input, { ...mockOptions, __smithy_context: {}, }); expect(mockNext).toHaveBeenCalledTimes(1); expect(mockNext).toHaveBeenCalledWith({ ...mockArgs, request: mockRequest }); }); }); ================================================ FILE: packages/core/src/submodules/schema/middleware/schemaSerializationMiddleware.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import { toEndpointV1 } from "@smithy/core/endpoints"; import type { EndpointBearer, HandlerExecutionContext, SerializeHandler, SerializeHandlerArguments, StaticOperationSchema, } from "@smithy/types"; import { operation } from "../schemas/operation"; import type { PreviouslyResolved } from "./schema-middleware-types"; /** * @internal */ export const schemaSerializationMiddleware = (config: PreviouslyResolved) => (next: SerializeHandler, context: HandlerExecutionContext) => async (args: SerializeHandlerArguments) => { const { operationSchema } = getSmithyContext(context) as { operationSchema: StaticOperationSchema; }; const [, ns, n, t, i, o] = operationSchema ?? []; const endpoint = context.endpointV2 ? async () => toEndpointV1(context.endpointV2!) : (config as unknown as EndpointBearer).endpoint!; const request = await config.protocol.serializeRequest(operation(ns, n, t, i, o), args.input, { ...config, ...context, endpoint, }); return next({ ...args, request, }); }; ================================================ FILE: packages/core/src/submodules/schema/schemas/ErrorSchema.ts ================================================ import type { SchemaRef, SchemaTraits } from "@smithy/types"; import { Schema } from "./Schema"; import { StructureSchema } from "./StructureSchema"; /** * A schema for a structure shape having the error trait. These represent enumerated operation errors. * Because Smithy-TS SDKs use classes for exceptions, whereas plain objects are used for all other data, * and have an existing notion of a XYZServiceBaseException, the ErrorSchema differs from a StructureSchema * by additionally holding the class reference for the corresponding ServiceException class. * * @internal * @deprecated use StaticSchema */ export class ErrorSchema extends StructureSchema { public static readonly symbol = Symbol.for("@smithy/err"); /** * @deprecated - field unused. */ public ctor!: any; protected readonly symbol = ErrorSchema.symbol; } /** * Factory for ErrorSchema, to reduce codegen output and register the schema. * * @internal * @deprecated use StaticSchema * * @param namespace - shapeId namespace. * @param name - shapeId name. * @param traits - shape level serde traits. * @param memberNames - list of member names. * @param memberList - list of schemaRef corresponding to each * @param ctor - class reference for the existing Error extending class. */ export const error = ( namespace: string, name: string, traits: SchemaTraits, memberNames: string[], memberList: SchemaRef[], /** * @deprecated - field unused. */ ctor?: any ): ErrorSchema => Schema.assign(new ErrorSchema(), { name, namespace, traits, memberNames, memberList, ctor: null, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/ListSchema.ts ================================================ import type { ListSchema as IListSchema, SchemaRef, SchemaTraits } from "@smithy/types"; import { Schema } from "./Schema"; /** * A schema with a single member schema. * The deprecated Set type may be represented as a list. * * @internal * @deprecated use StaticSchema */ export class ListSchema extends Schema implements IListSchema { public static readonly symbol = Symbol.for("@smithy/lis"); public name!: string; public traits!: SchemaTraits; public valueSchema!: SchemaRef; protected readonly symbol = ListSchema.symbol; } /** * Factory for ListSchema. * * @internal * @deprecated use StaticSchema */ export const list = (namespace: string, name: string, traits: SchemaTraits, valueSchema: SchemaRef): ListSchema => Schema.assign(new ListSchema(), { name, namespace, traits, valueSchema, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/MapSchema.ts ================================================ import type { MapSchema as IMapSchema, SchemaRef, SchemaTraits } from "@smithy/types"; import { Schema } from "./Schema"; /** * A schema with a key schema and value schema. * @internal * @deprecated use StaticSchema */ export class MapSchema extends Schema implements IMapSchema { public static readonly symbol = Symbol.for("@smithy/map"); public name!: string; public traits!: SchemaTraits; /** * This is expected to be StringSchema, but may have traits. */ public keySchema!: SchemaRef; public valueSchema!: SchemaRef; protected readonly symbol = MapSchema.symbol; } /** * Factory for MapSchema. * @internal * @deprecated use StaticSchema */ export const map = ( namespace: string, name: string, traits: SchemaTraits, keySchema: SchemaRef, valueSchema: SchemaRef ): MapSchema => Schema.assign(new MapSchema(), { name, namespace, traits, keySchema, valueSchema, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/NormalizedSchema.spec.ts ================================================ import type { $MemberSchema, BigDecimalSchema, BigIntegerSchema, BlobSchema, BooleanSchema, DocumentSchema, ListSchemaModifier, MapSchemaModifier, NumericSchema, StaticListSchema, StaticMapSchema, StaticSimpleSchema, StaticStructureSchema, StaticUnionSchema, StreamingBlobSchema, StringSchema, TimestampDefaultSchema, } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { NormalizedSchema } from "./NormalizedSchema"; import { translateTraits } from "./translateTraits"; describe(NormalizedSchema.name, () => { const [List, Map, Struct, Union]: [ StaticListSchema, StaticMapSchema, () => StaticStructureSchema, StaticUnionSchema, ] = [ [1, "ack", "List", { sparse: 1 }, 0] satisfies StaticListSchema, [2, "ack", "Map", 0, 0, 1] satisfies StaticMapSchema, () => schema, [4, "ack", "Union", 0, ["a", "b", "c"], ["unit", 0, 128]], ]; const schema: StaticStructureSchema = [ 3, "ack", "Structure", {}, ["list", "map", "struct", "union"], [List, Map, Struct, Union], ]; const ns = NormalizedSchema.of(schema); const nsFromIndirect = NormalizedSchema.of(() => ns); it("has a static constructor", () => { expect(NormalizedSchema.of(ns)).toBeInstanceOf(NormalizedSchema); }); it("has a name", () => { expect(ns.getName()).toEqual("Structure"); expect(ns.getName(true)).toEqual("ack#Structure"); }); describe("inner schema", () => { it("has an inner schema", () => { // intentional reference equality comparison. expect(ns.getSchema()).toBe(schema); }); it("peels NormalizedSchema from its input schemaRef", () => { const layered = NormalizedSchema.of( NormalizedSchema.of(NormalizedSchema.of(NormalizedSchema.of(NormalizedSchema.of(nsFromIndirect)))) ); // intentional reference equality comparison. expect(layered.getSchema()).toBe(schema); }); }); it("translates a bitvector of traits to a traits object", () => { expect(translateTraits(0b0000_0000)).toEqual({}); expect(translateTraits(0b0000_0001)).toEqual({ httpLabel: 1, }); expect(translateTraits(0b0000_0011)).toEqual({ httpLabel: 1, idempotent: 1, }); expect(translateTraits(0b0000_0110)).toEqual({ idempotent: 1, idempotencyToken: 1, }); expect(translateTraits(0b0000_1100)).toEqual({ idempotencyToken: 1, sensitive: 1, }); expect(translateTraits(0b0001_1000)).toEqual({ sensitive: 1, httpPayload: 1, }); expect(translateTraits(0b0011_0000)).toEqual({ httpPayload: 1, httpResponseCode: 1, }); expect(translateTraits(0b0110_0000)).toEqual({ httpResponseCode: 1, httpQueryParams: 1, }); }); describe("member schema", () => { const member = ns.getMemberSchema("list"); it("can represent a member schema", () => { expect(member).toBeInstanceOf(NormalizedSchema); expect(member.isMemberSchema()).toBe(true); expect(member.isListSchema()).toBe(true); expect(member.getSchema()).toBe(List); expect(member.getMemberName()).toBe("list"); }); }); describe("traversal and type identifiers", () => { it("type identifiers", () => { expect(NormalizedSchema.of("unit").isUnitSchema()).toBe(true); expect(NormalizedSchema.of((64 satisfies ListSchemaModifier) | (1 satisfies NumericSchema)).isListSchema()).toBe( true ); expect(NormalizedSchema.of((128 satisfies MapSchemaModifier) | (1 satisfies NumericSchema)).isMapSchema()).toBe( true ); expect(NormalizedSchema.of(15 satisfies DocumentSchema).isDocumentSchema()).toBe(true); expect(NormalizedSchema.of(ns.getMemberSchema("struct")).isStructSchema()).toBe(true); expect(NormalizedSchema.of(21 satisfies BlobSchema).isBlobSchema()).toBe(true); expect(NormalizedSchema.of(4 satisfies TimestampDefaultSchema).isTimestampSchema()).toBe(true); expect(NormalizedSchema.of(0 satisfies StringSchema).isStringSchema()).toBe(true); expect(NormalizedSchema.of(2 satisfies BooleanSchema).isBooleanSchema()).toBe(true); expect(NormalizedSchema.of(1 satisfies NumericSchema).isNumericSchema()).toBe(true); expect(NormalizedSchema.of(17 satisfies BigIntegerSchema).isBigIntegerSchema()).toBe(true); expect(NormalizedSchema.of(19 satisfies BigDecimalSchema).isBigDecimalSchema()).toBe(true); expect(NormalizedSchema.of(42 satisfies StreamingBlobSchema).isStreaming()).toBe(true); const structWithStreamingMember = [ 3, "ack", "StructWithStreamingMember", 0, ["m"], [[0, "ns", "blob", { streaming: 1 }, 21 as BlobSchema] satisfies StaticSimpleSchema], ] satisfies StaticStructureSchema; expect(NormalizedSchema.of(structWithStreamingMember).getMemberSchema("m").isStreaming()).toBe(true); }); describe("list member", () => { it("list itself", () => { const member = ns.getMemberSchema("list"); expect(member.isMemberSchema()).toBe(true); expect(member.isListSchema()).toBe(true); expect(member.getSchema()).toBe(List); expect(member.getMemberName()).toBe("list"); }); it("list value member", () => { const member = ns.getMemberSchema("list").getValueSchema(); expect(member.isMemberSchema()).toBe(true); expect(member.isListSchema()).toBe(false); expect(member.isStringSchema()).toBe(true); expect(member.getSchema()).toBe(0); expect(member.getMemberName()).toBe("member"); }); }); describe("map member", () => { it("map itself", () => { const member = ns.getMemberSchema("map"); expect(member.isMemberSchema()).toBe(true); expect(member.isMapSchema()).toBe(true); expect(member.getSchema()).toBe(Map); expect(member.getMemberName()).toBe("map"); }); it("map key member", () => { const member = ns.getMemberSchema("map").getKeySchema(); expect(member.isMemberSchema()).toBe(true); expect(member.isNumericSchema()).toBe(false); expect(member.isStringSchema()).toBe(true); expect(member.getSchema()).toBe(0); expect(member.getMemberName()).toBe("key"); }); it("should return a defined key schema even if the map was defined by a numeric sentinel value", () => { const map = NormalizedSchema.of((128 satisfies MapSchemaModifier) | (1 satisfies NumericSchema)); expect(map.getKeySchema().isStringSchema()).toBe(true); expect(map.getValueSchema().isNumericSchema()).toBe(true); }); it("map value member", () => { const member = ns.getMemberSchema("map").getValueSchema(); expect(member.isMemberSchema()).toBe(true); expect(member.isNumericSchema()).toBe(true); expect(member.isStringSchema()).toBe(false); expect(member.getSchema()).toBe(1); expect(member.getMemberName()).toBe("value"); }); }); describe("struct member", () => { it("struct member", () => { const member = ns.getMemberSchema("struct"); expect(member.getName(true)).toBe("ack#Structure"); expect(member.isMemberSchema()).toBe(true); expect(member.isListSchema()).toBe(false); expect(member.isMapSchema()).toBe(false); expect(member.isStructSchema()).toBe(true); expect(member.getMemberName()).toBe("struct"); }); it("nested recursion", () => { expect(ns.getMemberSchema("struct").isStructSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("list").isListSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("map").isMapSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("struct").isStructSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("struct").getMemberSchema("list").getName(true)).toBe( ns.getMemberSchema("list").getName(true) ); }); }); describe("union member", () => { it("is a union and a struct", () => { const member = ns.getMemberSchema("union"); expect(member.getName(true)).toBe("ack#Union"); expect(member.isMemberSchema()).toBe(true); expect(member.isListSchema()).toBe(false); expect(member.isMapSchema()).toBe(false); expect(member.isStructSchema()).toBe(true); expect(member.isUnionSchema()).toBe(true); expect(member.getMemberName()).toBe("union"); expect(member.getMemberSchema("a").isUnitSchema()).toBe(true); expect(member.getMemberSchema("b").isStringSchema()).toBe(true); expect(member.getMemberSchema("c").isMapSchema()).toBe(true); }); }); }); describe("iteration", () => { it("iterates over member schemas", () => { const iteration = Array.from(ns.structIterator()) as [string, NormalizedSchema][]; const entries = Object.entries(ns.getMemberSchemas()) as [string, NormalizedSchema][]; for (let i = 0; i < iteration.length; i++) { const [name, schema] = iteration[i]; const [entryName, entrySchema] = entries[i]; expect(name).toBe(entryName); expect(schema.getMemberName()).toEqual(entrySchema.getMemberName()); expect(schema.getMergedTraits()).toEqual(entrySchema.getMergedTraits()); } }); it("can acquire structIterator on the unit schema type and its iteration is empty", () => { const iteration = Array.from(NormalizedSchema.of("unit").structIterator()); expect(iteration.length).toBe(0); }); }); describe("traits", () => { const member: $MemberSchema = [ [0, "ack", "SimpleString", { idempotencyToken: 1 }, 0] satisfies StaticSimpleSchema, 0b0000_0001, ]; const container: StaticStructureSchema = [3, "ack", "Container", 0, ["member_name"], [member, 0]]; const ns = NormalizedSchema.of(container).getMemberSchema("member_name"); it("has merged traits", () => { expect(ns.getMergedTraits()).toEqual({ idempotencyToken: 1, httpLabel: 1, }); }); it("has member traits if it is a member", () => { expect(ns.isMemberSchema()).toBe(true); expect(ns.getMemberTraits()).toEqual({ httpLabel: 1, }); }); it("has own traits", () => { expect(ns.getOwnTraits()).toEqual({ idempotencyToken: 1, }); }); }); describe("idempotency token detection", () => { const idempotencyTokenSchemas = [ NormalizedSchema.of([0, "", "StringWithTraits", 0b0100, 0] satisfies StaticSimpleSchema), NormalizedSchema.of([0, "", "StringWithTraits", { idempotencyToken: 1 }, 0] satisfies StaticSimpleSchema), ]; const plainSchemas = [ NormalizedSchema.of(0), NormalizedSchema.of([0, "", "StringWithTraits", 0, 0] satisfies StaticSimpleSchema), NormalizedSchema.of([0, "", "StringWithTraits", {}, 0] satisfies StaticSimpleSchema), ]; it("has a consistent shortcut method for idempotencyToken detection", () => { for (const schema of idempotencyTokenSchemas) { expect(schema.isIdempotencyToken()).toBe(true); expect(schema.getMergedTraits().idempotencyToken).toBe(1); } for (const schema of plainSchemas) { expect(schema.isIdempotencyToken()).toBe(false); expect(schema.getMergedTraits().idempotencyToken).toBe(undefined); } }); it("can understand members with the idempotencyToken trait", () => { for (const schema of plainSchemas) { expect(schema.isIdempotencyToken()).toBe(false); expect(schema.getMergedTraits().idempotencyToken).toBe(undefined); const structure = [ 3, "", "StructureWithIdempotencyTokenMember", 0, ["token"], [[() => schema, 0b0100]], ] satisfies StaticStructureSchema; const ns = NormalizedSchema.of(structure).getMemberSchema("token"); expect(ns.isIdempotencyToken()).toBe(true); } }); }); describe("event stream detection", () => { it("should retrieve the event stream member", () => { const schema: StaticStructureSchema = [ 3, "ns", "StructureWithEventStream", 0, ["A", "B", "C", "D", "EventStream"], [0, 0, 0, 0, [3, "ns", "Union", { streaming: 1 }, [], []] satisfies StaticStructureSchema], ]; const ns = NormalizedSchema.of(schema); expect(ns.getEventStreamMember()).toEqual("EventStream"); }); it("should return empty string if no event stream member is present", () => { const schema: StaticStructureSchema = [ 3, "ns", "StructureWithEventStream", 0, ["A", "B", "C", "D", "EventStream"], [0, 0, 0, 0, [3, "ns", "Union", 0, [], []] satisfies StaticStructureSchema], ]; const ns = NormalizedSchema.of(schema); expect(ns.getEventStreamMember()).toEqual(""); }); it("should not throw an exception if the NormalizedSchema is not a structure", () => { const schema = 0; const ns = NormalizedSchema.of(schema); expect(ns.getEventStreamMember()).toEqual(""); }); }); describe("static schema", () => { it("can normalize static schema indifferently to schema class objects", () => { const [List, Map, Struct]: [StaticListSchema, StaticMapSchema, () => StaticStructureSchema] = [ [1, "ack", "List", { sparse: 1 }, 0], [2, "ack", "Map", 0, 0, 1], () => schema, ]; const schema: StaticStructureSchema = [3, "ack", "Structure", {}, ["list", "map", "struct"], [List, Map, Struct]]; const ns = NormalizedSchema.of(schema); expect(ns.isStructSchema()).toBe(true); expect(ns.getMemberSchema("list").isListSchema()).toBe(true); expect(ns.getMemberSchema("list").getMergedTraits().sparse).toBe(1); expect(ns.getMemberSchema("map").isMapSchema()).toBe(true); expect(ns.getMemberSchema("map").getKeySchema().isStringSchema()).toBe(true); expect(ns.getMemberSchema("map").getValueSchema().isNumericSchema()).toBe(true); expect(ns.getMemberSchema("struct").isStructSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("list").isListSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("list").getMergedTraits().sparse).toBe(1); expect(ns.getMemberSchema("struct").getMemberSchema("map").isMapSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("map").getKeySchema().isStringSchema()).toBe(true); expect(ns.getMemberSchema("struct").getMemberSchema("map").getValueSchema().isNumericSchema()).toBe(true); }); }); describe("simple schema wrapper", () => { it("should still be able to detect the inner schema type", () => { const schema: StaticSimpleSchema = [0, "ack", "String", { unknownTrait: 1 }, 0]; const ns = NormalizedSchema.of(schema); expect(ns.isStringSchema()).toBe(true); }); }); }); describe("schema initialization performance", () => { it("throughput - object", () => { const schema: StaticStructureSchema = [3, "ns", "CachedStruct", 0, ["a"], [0]]; const start = performance.now(); for (let i = 0; i < 1_000_000; ++i) { NormalizedSchema.of(schema); } const end = performance.now(); // it's 8ms on kuhe's computer. expect(end - start).toBeLessThanOrEqual(200); }); it("throughput - string sentinel", () => { const schema = "unit" as const; const start = performance.now(); for (let i = 0; i < 1_000_000; ++i) { NormalizedSchema.of(schema); } const end = performance.now(); // it's 8ms on kuhe's computer. expect(end - start).toBeLessThanOrEqual(200); }); it("throughput - numeric sentinel", () => { const schema: StringSchema = 0; const start = performance.now(); for (let i = 0; i < 1_000_000; ++i) { NormalizedSchema.of(schema); } const end = performance.now(); // it's 8ms on kuhe's computer. expect(end - start).toBeLessThanOrEqual(200); }); }); describe("NormalizedSchema.of() caching", () => { it("returns the same instance for repeated calls with the same object-type schema", () => { const schema: StaticStructureSchema = [3, "ns", "CachedStruct", 0, ["a"], [0]]; const first = NormalizedSchema.of(schema); const second = NormalizedSchema.of(schema); expect(second).toBe(first); }); it("returns the same NormalizedSchema instance when passed to of()", () => { const schema: StaticStructureSchema = [3, "ns", "PassThrough", 0, ["a"], [0]]; const ns = NormalizedSchema.of(schema); const result = NormalizedSchema.of(ns); expect(result).toBe(ns); }); it("cached instances produce correct getSchema(), getName(), and getMergedTraits()", () => { const schema: StaticStructureSchema = [3, "ns", "Equiv", { sensitive: 1 }, ["x"], [0]]; const first = NormalizedSchema.of(schema); const second = NormalizedSchema.of(schema); // same cached instance expect(second).toBe(first); // correct results from cached instance expect(first.getSchema()).toBe(schema); expect(first.getName()).toBe("Equiv"); expect(first.getName(true)).toBe("ns#Equiv"); expect(first.getMergedTraits()).toEqual({ sensitive: 1 }); expect(second.getSchema()).toBe(schema); expect(second.getName()).toBe("Equiv"); expect(second.getName(true)).toBe("ns#Equiv"); expect(second.getMergedTraits()).toEqual({ sensitive: 1 }); }); it("primitive schemas return the same cached instance across calls", () => { const a = NormalizedSchema.of(0); const b = NormalizedSchema.of(0); expect(b).toBe(a); }); describe("member schema branch", () => { it("throws for unwrapped member schemas", () => { const unwrappedMember = [[0, "ns", "Simple", 0, 0] satisfies StaticSimpleSchema, 0b0000_0001] as any; expect(() => NormalizedSchema.of(unwrappedMember)).toThrow( "@smithy/core/schema - may not init unwrapped member schema=" ); }); it("mutates traits for NormalizedSchema-wrapped members", () => { const innerSchema: StaticSimpleSchema = [0, "ns", "Inner", 0, 0]; const container: StaticStructureSchema = [3, "ns", "Container", 0, ["m"], [[innerSchema, 0b0000_0001]]]; const memberNs = NormalizedSchema.of(container).getMemberSchema("m"); // The member should have httpLabel trait from the bitmask 0b0000_0001 expect(memberNs.getMemberTraits()).toEqual({ httpLabel: 1 }); // Now pass the NormalizedSchema-wrapped member as a member schema to of() // This should mutate its merged traits with the additional traits const result = NormalizedSchema.of([memberNs, 0b0000_1000] as any); expect(result).toBe(memberNs); expect(result.getMergedTraits().sensitive).toBe(1); }); }); /** * Structurally identical but referentially distinct schemas must produce independent cache entries. */ it("distinct schema arrays with same shape are cached independently", () => { const a: StaticStructureSchema = [3, "ns", "Foo", 0, ["x"], [0]]; const b: StaticStructureSchema = [3, "ns", "Foo", 0, ["x"], [0]]; expect(NormalizedSchema.of(a)).not.toBe(NormalizedSchema.of(b)); }); }); ================================================ FILE: packages/core/src/submodules/schema/schemas/NormalizedSchema.ts ================================================ import type { $MemberSchema, $Schema, $SchemaRef, BigDecimalSchema, BigIntegerSchema, BlobSchema, BooleanSchema, DocumentSchema, NormalizedSchema as INormalizedSchema, ListSchemaModifier, MapSchemaModifier, NumericSchema, SchemaRef, SchemaTraits, SchemaTraitsObject, SimpleSchema, StaticListSchema, StaticMapSchema, StaticSchema, StaticSchemaIdError, StaticSchemaIdList, StaticSchemaIdMap, StaticSchemaIdStruct, StaticSchemaIdUnion, StaticSimpleSchema, StaticStructureSchema, StreamingBlobSchema, StringSchema, TimestampDefaultSchema, TimestampEpochSecondsSchema, UnitSchema, } from "@smithy/types"; import { deref } from "../deref"; import { translateTraits } from "./translateTraits"; /** * Annotations for cacheable schema-derived data. * @internal */ const anno = { // reference to structure's member iterator. it: Symbol.for("@smithy/nor-struct-it"), /** * Key for a cached NormalizedSchema on a $SchemaRef object. * For non-object refs, we use `simpleSchemaCache(N|S)`. */ ns: Symbol.for("@smithy/ns"), }; /** * Cache for numeric schemaRef. Having separate cache objects for number/string improves * lookup performance. * @internal */ export const simpleSchemaCacheN: Array = []; /** * Cache for string schemaRef. * @internal */ export const simpleSchemaCacheS: Record = {}; /** * Wraps both class instances, numeric sentinel values, and member schema pairs. * Presents a consistent interface for interacting with polymorphic schema representations. * * @public */ export class NormalizedSchema implements INormalizedSchema { // ======================== // // This class implementation may be a little bit code-golfed to save space. // This class is core to all clients in schema-serde mode. // For readability, add comments rather than code. // // ======================== public static readonly symbol = Symbol.for("@smithy/nor"); protected readonly symbol = NormalizedSchema.symbol; private readonly name!: string; private readonly schema!: Exclude<$Schema, $MemberSchema | INormalizedSchema>; private readonly _isMemberSchema: boolean; private readonly traits!: SchemaTraits; private readonly memberTraits: SchemaTraits; private normalizedTraits?: SchemaTraitsObject; /** * @param ref - a polymorphic SchemaRef to be dereferenced/normalized. * @param memberName - optional memberName if this NormalizedSchema should be considered a member schema. */ private constructor( readonly ref: $SchemaRef, private readonly memberName?: string ) { const traitStack = [] as SchemaTraits[]; let _ref = ref; let schema = ref; this._isMemberSchema = false; while (isMemberSchema(_ref)) { traitStack.push(_ref[1]); _ref = _ref[0] as $SchemaRef; schema = deref(_ref) as $Schema; this._isMemberSchema = true; } if (traitStack.length > 0) { this.memberTraits = {}; for (let i = traitStack.length - 1; i >= 0; --i) { const traitSet = traitStack[i]; Object.assign(this.memberTraits, translateTraits(traitSet)); } } else { this.memberTraits = 0; } if (schema instanceof NormalizedSchema) { const computedMemberTraits = this.memberTraits; Object.assign(this, schema); this.memberTraits = Object.assign({}, computedMemberTraits, schema.getMemberTraits(), this.getMemberTraits()); this.normalizedTraits = void 0; this.memberName = memberName ?? schema.memberName; return; } this.schema = deref(schema) as Exclude<$Schema, $MemberSchema | INormalizedSchema>; if (isStaticSchema(this.schema)) { this.name = `${this.schema[1]}#${this.schema[2]}`; this.traits = this.schema[3]; } else { this.name = this.memberName ?? String(schema); this.traits = 0; } if (this._isMemberSchema && !memberName) { throw new Error(`@smithy/core/schema - NormalizedSchema member init ${this.getName(true)} missing member name.`); } } public static [Symbol.hasInstance](lhs: unknown): lhs is NormalizedSchema { const isPrototype = this.prototype.isPrototypeOf(lhs as any); if (!isPrototype && typeof lhs === "object" && lhs !== null) { const ns = lhs as any; return ns.symbol === (this as any).symbol; } return isPrototype; } /** * Static constructor that attempts to avoid wrapping a NormalizedSchema within another. */ public static of(ref: SchemaRef | $SchemaRef): NormalizedSchema { const keyAble = typeof ref === "function" || (typeof ref === "object" && ref !== null); if (typeof ref === "number") { if (simpleSchemaCacheN[ref]) { return simpleSchemaCacheN[ref]; } } else if (typeof ref === "string") { if (simpleSchemaCacheS[ref]) { return simpleSchemaCacheS[ref]; } } else if (keyAble) { if ((ref as any)[anno.ns]) { return (ref as any)[anno.ns]; } } const sc = deref(ref); if (sc instanceof NormalizedSchema) { return sc; } if (isMemberSchema(sc)) { const [ns, traits] = sc; if (ns instanceof NormalizedSchema) { Object.assign(ns.getMergedTraits(), translateTraits(traits)); return ns; } // An aggregate schema must be initialized with members and the member retrieved through the aggregate // container. throw new Error(`@smithy/core/schema - may not init unwrapped member schema=${JSON.stringify(ref, null, 2)}.`); } const ns = new NormalizedSchema(sc as $SchemaRef); if (keyAble) { // we check ref type here because the inner schema may be a simple value, but any // object or function ref can be assigned a symbol key. return ((ref as any)[anno.ns] = ns); } if (typeof sc === "string") { return (simpleSchemaCacheS[sc] = ns); } if (typeof sc === "number") { return (simpleSchemaCacheN[sc] = ns); } return ns; } /** * @returns the underlying non-normalized schema. */ public getSchema(): Exclude<$Schema, $MemberSchema | INormalizedSchema> { const sc = this.schema; // array check is to prevent autoboxing or something like that. if (Array.isArray(sc) && (sc as StaticSimpleSchema)[0] === 0) { return (sc as StaticSimpleSchema)[4] as SimpleSchema; } return sc as Exclude<$Schema, $MemberSchema | INormalizedSchema>; } /** * @param withNamespace - qualifies the name. * @returns e.g. `MyShape` or `com.namespace#MyShape`. */ public getName(withNamespace = false): string | undefined { const { name } = this; const short = !withNamespace && name && name.includes("#"); // empty name should return as undefined return short ? name.split("#")[1] : name || undefined; } /** * @returns the member name if the schema is a member schema. */ public getMemberName(): string { return this.memberName!; } public isMemberSchema(): boolean { return this._isMemberSchema; } /** * boolean methods on this class help control flow in shape serialization and deserialization. */ public isListSchema(): boolean { const sc = this.getSchema(); return typeof sc === "number" ? sc >= (64 satisfies ListSchemaModifier) && sc < (128 satisfies MapSchemaModifier) : (sc as StaticSchema)[0] === (1 satisfies StaticSchemaIdList); } public isMapSchema(): boolean { const sc = this.getSchema(); return typeof sc === "number" ? sc >= (128 satisfies MapSchemaModifier) && sc <= 0b1111_1111 : (sc as StaticSchema)[0] === (2 satisfies StaticSchemaIdMap); } /** * To simplify serialization logic, static union schemas are considered a specialization * of structs in the TypeScript typings and JS runtime, as well as static error schemas * which have a different identifier. */ public isStructSchema(): boolean { const sc = this.getSchema(); if (typeof sc !== "object") { return false; } const id = (sc satisfies StaticSchema)[0]; return ( id === (3 satisfies StaticSchemaIdStruct) || id === (-3 satisfies StaticSchemaIdError) || id === (4 satisfies StaticSchemaIdUnion) ); } public isUnionSchema(): boolean { const sc = this.getSchema(); if (typeof sc !== "object") { return false; } return (sc satisfies StaticSchema)[0] === (4 satisfies StaticSchemaIdUnion); } public isBlobSchema(): boolean { const sc = this.getSchema(); return sc === (21 satisfies BlobSchema) || sc === (42 satisfies StreamingBlobSchema); } public isTimestampSchema(): boolean { const sc = this.getSchema(); return ( typeof sc === "number" && sc >= (4 satisfies TimestampDefaultSchema) && sc <= (7 satisfies TimestampEpochSecondsSchema) ); } public isUnitSchema(): boolean { return this.getSchema() === ("unit" satisfies UnitSchema); } public isDocumentSchema(): boolean { return this.getSchema() === (15 satisfies DocumentSchema); } public isStringSchema(): boolean { return this.getSchema() === (0 satisfies StringSchema); } public isBooleanSchema(): boolean { return this.getSchema() === (2 satisfies BooleanSchema); } public isNumericSchema(): boolean { return this.getSchema() === (1 satisfies NumericSchema); } public isBigIntegerSchema(): boolean { return this.getSchema() === (17 satisfies BigIntegerSchema); } public isBigDecimalSchema(): boolean { return this.getSchema() === (19 satisfies BigDecimalSchema); } public isStreaming(): boolean { const { streaming } = this.getMergedTraits(); return !!streaming || this.getSchema() === (42 satisfies StreamingBlobSchema); } /** * @returns whether the schema has the idempotencyToken trait. */ public isIdempotencyToken(): boolean { /* It's faster to create the normalized trait object than to attempt to match against multiple value types. */ return !!this.getMergedTraits().idempotencyToken; } /** * @returns own traits merged with member traits, where member traits of the same trait key take priority. * This method is cached. */ public getMergedTraits(): SchemaTraitsObject { return ( this.normalizedTraits ?? (this.normalizedTraits = { ...this.getOwnTraits(), ...this.getMemberTraits(), }) ); } /** * @returns only the member traits. If the schema is not a member, this returns empty. */ public getMemberTraits(): SchemaTraitsObject { return translateTraits(this.memberTraits); } /** * @returns only the traits inherent to the shape or member target shape if this schema is a member. * If there are any member traits they are excluded. */ public getOwnTraits(): SchemaTraitsObject { return translateTraits(this.traits); } /** * @returns the map's key's schema. Returns a dummy Document schema if this schema is a Document. * * @throws Error if the schema is not a Map or Document. */ public getKeySchema(): NormalizedSchema { const [isDoc, isMap] = [this.isDocumentSchema(), this.isMapSchema()]; if (!isDoc && !isMap) { throw new Error(`@smithy/core/schema - cannot get key for non-map: ${this.getName(true)}`); } const schema = this.getSchema(); const memberSchema = isDoc ? (15 satisfies DocumentSchema) : (schema as StaticMapSchema)[4] ?? (0 satisfies StringSchema); return member([memberSchema, 0], "key"); } /** * @returns the schema of the map's value or list's member. * Returns a dummy Document schema if this schema is a Document. * * @throws Error if the schema is not a Map, List, nor Document. */ public getValueSchema(): NormalizedSchema { const sc = this.getSchema(); const [isDoc, isMap, isList] = [this.isDocumentSchema(), this.isMapSchema(), this.isListSchema()]; const memberSchema = typeof sc === "number" ? 0b0011_1111 & sc : sc && typeof sc === "object" && (isMap || isList) ? ((sc as StaticMapSchema | StaticListSchema)[3 + (sc as StaticSchema)[0]] as typeof sc) : isDoc ? (15 satisfies DocumentSchema) : void 0; if (memberSchema != null) { return member([memberSchema, 0], isMap ? "value" : "member"); } throw new Error(`@smithy/core/schema - ${this.getName(true)} has no value member.`); } /** * @returns the NormalizedSchema for the given member name. The returned instance will return true for `isMemberSchema()` * and will have the member name given. * @param memberName - which member to retrieve and wrap. * * @throws Error if member does not exist or the schema is neither a document nor structure. * Note that errors are assumed to be structures and unions are considered structures for these purposes. */ public getMemberSchema(memberName: string): NormalizedSchema { const struct = this.getSchema() as StaticStructureSchema; if (this.isStructSchema() && struct[4].includes(memberName)) { const i = struct[4].indexOf(memberName); const memberSchema = struct[5][i]; return member(isMemberSchema(memberSchema) ? memberSchema : [memberSchema, 0], memberName); } if (this.isDocumentSchema()) { return member([15 satisfies DocumentSchema, 0], memberName); } throw new Error(`@smithy/core/schema - ${this.getName(true)} has no member=${memberName}.`); } /** * This can be used for checking the members as a hashmap. * Prefer the structIterator method for iteration. * * This does NOT return list and map members, it is only for structures. * * @deprecated use (checked) structIterator instead. * * @returns a map of member names to member schemas (normalized). */ public getMemberSchemas(): Record { const buffer = {} as any; try { for (const [k, v] of this.structIterator()) { buffer[k] = v; } } catch (ignored) {} return buffer; } /** * @returns member name of event stream or empty string indicating none exists or this * isn't a structure schema. */ public getEventStreamMember(): string { if (this.isStructSchema()) { for (const [memberName, memberSchema] of this.structIterator()) { if (memberSchema.isStreaming() && memberSchema.isStructSchema()) { return memberName; } } } return ""; } /** * Allows iteration over members of a structure schema. * Each yield is a pair of the member name and member schema. * * This avoids the overhead of calling Object.entries(ns.getMemberSchemas()). */ public *structIterator(): Generator<[string, NormalizedSchema], undefined, undefined> { if (this.isUnitSchema()) { return; } if (!this.isStructSchema()) { throw new Error("@smithy/core/schema - cannot iterate non-struct schema."); } const struct = this.getSchema() as StaticStructureSchema & { // the static structure may have a cached iterator list of // its members. [anno.it]?: Array<[string, NormalizedSchema]>; }; const z = struct[4].length; let it = struct[anno.it]; // to yield the cached iterator, it must exist and be // the same length as the current member list. if (it && z === it.length) { yield* it; return; } it = Array(z); for (let i = 0; i < z; ++i) { const k = struct[4][i]; const v = member([struct[5][i], 0], k); yield (it[i] = [k, v]); } // cache the iterator only if all uncached items were iterated successfully. struct[anno.it] = it; } } /** * Creates a normalized member schema from the given schema and member name. * * @internal */ function member(memberSchema: NormalizedSchema | [SchemaRef, SchemaTraits], memberName: string): NormalizedSchema { if (memberSchema instanceof NormalizedSchema) { return Object.assign(memberSchema, { memberName, _isMemberSchema: true, }); } const internalCtorAccess = NormalizedSchema as any; return new internalCtorAccess(memberSchema, memberName); } /** * @internal */ const isMemberSchema = (sc: SchemaRef): sc is $MemberSchema => Array.isArray(sc) && sc.length === 2; /** * @internal */ export const isStaticSchema = (sc: SchemaRef): sc is StaticSchema => Array.isArray(sc) && sc.length >= 5; ================================================ FILE: packages/core/src/submodules/schema/schemas/OperationSchema.ts ================================================ import type { OperationSchema as IOperationSchema, SchemaRef, SchemaTraits } from "@smithy/types"; import { Schema } from "./Schema"; /** * This is used as a reference container for the input/output pair of schema, and for trait * detection on the operation that may affect client protocol logic. * * @internal * @deprecated use StaticSchema */ export class OperationSchema extends Schema implements IOperationSchema { public static readonly symbol = Symbol.for("@smithy/ope"); public name!: string; public traits!: SchemaTraits; public input!: SchemaRef; public output!: SchemaRef; protected readonly symbol = OperationSchema.symbol; } /** * Factory for OperationSchema. * @internal * @deprecated use StaticSchema */ export const op = ( namespace: string, name: string, traits: SchemaTraits, input: SchemaRef, output: SchemaRef ): OperationSchema => Schema.assign(new OperationSchema(), { name, namespace, traits, input, output, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/Schema.ts ================================================ import type { SchemaTraits, TraitsSchema } from "@smithy/types"; import { TypeRegistry } from "../TypeRegistry"; /** * Abstract base for class-based Schema except NormalizedSchema. * * @internal * @deprecated use StaticSchema */ export abstract class Schema implements TraitsSchema { public name!: string; public namespace!: string; public traits!: SchemaTraits; protected abstract readonly symbol: symbol; public static assign(instance: T, values: Omit): T { const schema = Object.assign(instance, values); // TypeRegistry.for(schema.namespace).register(schema.name, schema); return schema; } public static [Symbol.hasInstance](lhs: unknown) { const isPrototype = this.prototype.isPrototypeOf(lhs as any); if (!isPrototype && typeof lhs === "object" && lhs !== null) { const list = lhs as any; return list.symbol === (this as any).symbol; } return isPrototype; } public getName(): string { return this.namespace + "#" + this.name; } } ================================================ FILE: packages/core/src/submodules/schema/schemas/SimpleSchema.ts ================================================ import type { SchemaRef, SchemaTraits, TraitsSchema } from "@smithy/types"; import { TypeRegistry } from "../TypeRegistry"; import { Schema } from "./Schema"; /** * Although numeric values exist for most simple schema, this class is used for cases where traits are * attached to those schema, since a single number cannot easily represent both a schema and its traits. * * @internal * @deprecated use StaticSchema */ export class SimpleSchema extends Schema implements TraitsSchema { public static readonly symbol = Symbol.for("@smithy/sim"); public name!: string; public schemaRef!: SchemaRef; public traits!: SchemaTraits; protected readonly symbol = SimpleSchema.symbol; } /** * Factory for simple schema class objects. * * @internal * @deprecated use StaticSchema */ export const sim = (namespace: string, name: string, schemaRef: SchemaRef, traits: SchemaTraits) => Schema.assign(new SimpleSchema(), { name, namespace, traits, schemaRef, }); /** * @internal * @deprecated */ export const simAdapter = (namespace: string, name: string, traits: SchemaTraits, schemaRef: SchemaRef) => Schema.assign(new SimpleSchema(), { name, namespace, traits, schemaRef, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/StructureSchema.ts ================================================ import type { StructureSchema as IStructureSchema, MemberSchema, SchemaRef, SchemaTraits } from "@smithy/types"; import { TypeRegistry } from "../TypeRegistry"; import { Schema } from "./Schema"; /** * A structure schema has a known list of members. This is also used for unions. * * @internal * @deprecated use StaticSchema */ export class StructureSchema extends Schema implements IStructureSchema { public static symbol = Symbol.for("@smithy/str"); public name!: string; public traits!: SchemaTraits; public memberNames!: string[]; public memberList!: SchemaRef[]; protected readonly symbol = StructureSchema.symbol; } /** * Factory for StructureSchema. * * @internal * @deprecated use StaticSchema */ export const struct = ( namespace: string, name: string, traits: SchemaTraits, memberNames: string[], memberList: SchemaRef[] ): StructureSchema => Schema.assign(new StructureSchema(), { name, namespace, traits, memberNames, memberList, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/operation.ts ================================================ import type { OperationSchema, SchemaRef, SchemaTraits } from "@smithy/types"; /** * Converts the static schema array into an object-form to adapt * to the signature of ClientProtocol classes. * @internal */ export const operation = ( namespace: string, name: string, traits: SchemaTraits, input: SchemaRef, output: SchemaRef ): OperationSchema => ({ name, namespace, traits, input, output, }); ================================================ FILE: packages/core/src/submodules/schema/schemas/schemas.spec.ts ================================================ import type { SchemaRef, SchemaTraits } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { ErrorSchema, error } from "./ErrorSchema"; import { ListSchema, list } from "./ListSchema"; import { MapSchema, map } from "./MapSchema"; import { OperationSchema, op } from "./OperationSchema"; import { Schema } from "./Schema"; import { SimpleSchema, sim } from "./SimpleSchema"; import { StructureSchema, struct } from "./StructureSchema"; describe("schemas", () => { describe(ErrorSchema.name, () => { const schema = error("ack", "Error", 0, [], []); it("is a StructureSchema", () => { expect(schema).toBeInstanceOf(StructureSchema); expect(schema).toBeInstanceOf(ErrorSchema); }); it("deprecated reference to the error constructor", () => { expect(schema.ctor).toBe(null); }); it("has a factory", () => { expect(error("ack", "Error", 0, [], [])).toEqual(schema); }); it("has an instanceOf operator", () => { const object = { ...schema }; expect(ErrorSchema.prototype.isPrototypeOf(object)).toBe(false); expect(object).toBeInstanceOf(ErrorSchema); }); }); describe(ListSchema.name, () => { const schema = list("ack", "List", 0, 0); it("is a Schema", () => { expect(schema).toBeInstanceOf(Schema); expect(schema).toBeInstanceOf(ListSchema); }); it("has a value schema", () => { expect(schema.valueSchema).toBe(0 as SchemaRef); }); it("has a factory", () => { expect(list("ack", "List", 0, 0)).toEqual(schema); }); it("has an instanceOf operator", () => { const object = { ...schema }; expect(ListSchema.prototype.isPrototypeOf(object)).toBe(false); expect(object).toBeInstanceOf(ListSchema); }); }); describe(MapSchema.name, () => { const schema = map("ack", "Map", 0, 0, 1); it("is a Schema", () => { expect(schema).toBeInstanceOf(Schema); expect(schema).toBeInstanceOf(MapSchema); }); it("has a key and value schema", () => { expect(schema.keySchema).toBe(0 as SchemaRef); expect(schema.valueSchema).toBe(1 as SchemaRef); }); it("has a factory", () => { expect(map("ack", "Map", 0, 0, 1)).toEqual(schema); }); it("has an instanceOf operator", () => { const object = { ...schema }; expect(MapSchema.prototype.isPrototypeOf(object)).toBe(false); expect(object).toBeInstanceOf(MapSchema); }); }); describe(OperationSchema.name, () => { const schema = op("ack", "Operation", 0, "unit", "unit"); it("is a Schema", () => { expect(schema).toBeInstanceOf(Schema); expect(schema).toBeInstanceOf(OperationSchema); }); it("has an input and output schema", () => { expect(schema.input).toEqual("unit"); expect(schema.output).toEqual("unit"); }); it("has a factory", () => { expect(op("ack", "Operation", 0, "unit", "unit")).toEqual(schema); }); }); describe(Schema.name, () => { const schema = new (class extends Schema { protected symbol = Symbol(); public constructor(name: string, traits: SchemaTraits) { super(); this.name = name; this.traits = traits; } })("ack#Abstract", { a: 0, b: 1, }); it("has a name", () => { expect(schema.name).toBe("ack#Abstract"); }); it("has traits", () => { expect(schema.traits).toEqual({ a: 0, b: 1, }); }); }); describe(SimpleSchema.name, () => { const schema = sim("ack", "Simple", 0, 0); it("is a Schema", () => { expect(schema).toBeInstanceOf(Schema); expect(schema).toBeInstanceOf(SimpleSchema); }); it("has a factory", () => { expect(sim("ack", "Simple", 0, 0)).toEqual(schema); }); it("has an instanceOf operator", () => { const object = { ...schema }; expect(SimpleSchema.prototype.isPrototypeOf(object)).toBe(false); expect(object).toBeInstanceOf(SimpleSchema); }); }); describe(StructureSchema.name, () => { const schema = struct("ack", "Structure", 0, ["a", "b", "c"], [0, 1, 2]); it("is a Schema", () => { expect(schema).toBeInstanceOf(Schema); expect(schema).toBeInstanceOf(StructureSchema); expect(schema).not.toBeInstanceOf(ErrorSchema); }); it("has member schemas", () => { expect(schema.memberNames).toEqual(["a", "b", "c"]); expect(schema.memberList).toEqual([0, 1, 2]); }); it("has a factory", () => { expect(struct("ack", "Structure", 0, ["a", "b", "c"], [0, 1, 2])).toEqual(schema); }); it("has an instanceOf operator", () => { const object = { ...schema }; expect(StructureSchema.prototype.isPrototypeOf(object)).toBe(false); expect(object).toBeInstanceOf(StructureSchema); }); }); }); ================================================ FILE: packages/core/src/submodules/schema/schemas/sentinels.ts ================================================ import type { BigDecimalSchema, BigIntegerSchema, BlobSchema, BooleanSchema, DocumentSchema, ListSchemaModifier, MapSchemaModifier, NumericSchema, StreamingBlobSchema, StringSchema, TimestampDateTimeSchema, TimestampDefaultSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "@smithy/types"; /** * Schema sentinel runtime values. * @internal * * @deprecated use inline numbers with type annotation to save space. */ export const SCHEMA: { BLOB: BlobSchema; STREAMING_BLOB: StreamingBlobSchema; BOOLEAN: BooleanSchema; STRING: StringSchema; NUMERIC: NumericSchema; BIG_INTEGER: BigIntegerSchema; BIG_DECIMAL: BigDecimalSchema; DOCUMENT: DocumentSchema; TIMESTAMP_DEFAULT: TimestampDefaultSchema; TIMESTAMP_DATE_TIME: TimestampDateTimeSchema; TIMESTAMP_HTTP_DATE: TimestampHttpDateSchema; TIMESTAMP_EPOCH_SECONDS: TimestampEpochSecondsSchema; LIST_MODIFIER: ListSchemaModifier; MAP_MODIFIER: MapSchemaModifier; } = { BLOB: 0b0001_0101, // 21 STREAMING_BLOB: 0b0010_1010, // 42 BOOLEAN: 0b0000_0010, // 2 STRING: 0b0000_0000, // 0 NUMERIC: 0b0000_0001, // 1 BIG_INTEGER: 0b0001_0001, // 17 BIG_DECIMAL: 0b0001_0011, // 19 DOCUMENT: 0b0000_1111, // 15 TIMESTAMP_DEFAULT: 0b0000_0100, // 4 TIMESTAMP_DATE_TIME: 0b0000_0101, // 5 TIMESTAMP_HTTP_DATE: 0b0000_0110, // 6 TIMESTAMP_EPOCH_SECONDS: 0b0000_0111, // 7 LIST_MODIFIER: 0b0100_0000, // 64 MAP_MODIFIER: 0b1000_0000, // 128 }; ================================================ FILE: packages/core/src/submodules/schema/schemas/translateTraits.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { translateTraits } from "./translateTraits"; describe("translateTraits() caching", () => { it("returns the same reference for repeated calls with the same numeric bitmask", () => { const first = translateTraits(0b0000_0001); const second = translateTraits(0b0000_0001); expect(second).toBe(first); const a = translateTraits(0b0000_0101); const b = translateTraits(0b0000_0101); expect(b).toBe(a); }); it("returns object-type indicators as-is (reference equality) without caching", () => { const obj = { sensitive: 1 } as const; const result = translateTraits(obj); expect(result).toBe(obj); }); /** * Validates bitmask decoding correctness. */ describe("bitmask decoding produces correct trait keys", () => { it("0b0000_0001 → { httpLabel: 1 }", () => { expect(translateTraits(0b0000_0001)).toEqual({ httpLabel: 1 }); }); it("0b0000_0101 → { httpLabel: 1, idempotencyToken: 1 }", () => { expect(translateTraits(0b0000_0101)).toEqual({ httpLabel: 1, idempotencyToken: 1 }); }); it("0b0000_0010 → { idempotent: 1 }", () => { expect(translateTraits(0b0000_0010)).toEqual({ idempotent: 1 }); }); it("0b0000_1000 → { sensitive: 1 }", () => { expect(translateTraits(0b0000_1000)).toEqual({ sensitive: 1 }); }); it("0b0001_0000 → { httpPayload: 1 }", () => { expect(translateTraits(0b0001_0000)).toEqual({ httpPayload: 1 }); }); it("0b0100_0000 → { httpQueryParams: 1 }", () => { expect(translateTraits(0b0100_0000)).toEqual({ httpQueryParams: 1 }); }); it("0b0111_1111 → all traits set", () => { expect(translateTraits(0b0111_1111)).toEqual({ httpLabel: 1, idempotent: 1, idempotencyToken: 1, sensitive: 1, httpPayload: 1, httpResponseCode: 1, httpQueryParams: 1, }); }); it("0b0000_0000 → empty object", () => { expect(translateTraits(0b0000_0000)).toEqual({}); }); }); }); describe("performance", () => { it("translates traits", () => { const start = performance.now(); for (let i = 0; i < 1_000_000; i++) { const n = i % 128; translateTraits(n); } const end = performance.now(); // 9ms on kuhe's computer. expect(end - start).toBeLessThanOrEqual(200); }); }); ================================================ FILE: packages/core/src/submodules/schema/schemas/translateTraits.ts ================================================ import type { SchemaTraits, SchemaTraitsObject } from "@smithy/types"; /** * Module-level cache for translateTraits() numeric bitmask inputs. * * @internal */ export const traitsCache: SchemaTraitsObject[] = []; /** * @internal * @param indicator - numeric indicator for preset trait combination. * @returns equivalent trait object. */ export function translateTraits(indicator: SchemaTraits): SchemaTraitsObject { if (typeof indicator === "object") { return indicator; } indicator = indicator | 0; if (traitsCache[indicator]) { return traitsCache[indicator]; } const traits = {} as SchemaTraitsObject; let i = 0; for (const trait of [ "httpLabel", "idempotent", "idempotencyToken", "sensitive", "httpPayload", "httpResponseCode", "httpQueryParams", ] as Array) { if (((indicator >> i++) & 1) === 1) { traits[trait] = 1; } } return (traitsCache[indicator] = traits); } ================================================ FILE: packages/core/src/submodules/serde/copyDocumentWithTransform.ts ================================================ import type { SchemaRef } from "@smithy/types"; /** * @internal * @deprecated the former functionality has been internalized to the CborCodec. */ export const copyDocumentWithTransform = ( source: any, schemaRef: SchemaRef, transform: (_: any, schemaRef: SchemaRef) => any = (_) => _ ): any => source; ================================================ FILE: packages/core/src/submodules/serde/date-utils.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { parseEpochTimestamp, parseRfc3339DateTime, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, } from "./date-utils"; const invalidRfc3339DateTimes = [ "85-04-12T23:20:50.52Z", "985-04-12T23:20:50.52Z", "1985-13-12T23:20:50.52Z", "1985-00-12T23:20:50.52Z", "1985-4-12T23:20:50.52Z", "1985-04-32T23:20:50.52Z", "1985-04-00T23:20:50.52Z", "1985-04-05T24:20:50.52Z", "1985-04-05T23:61:50.52Z", "1985-04-05T23:20:61.52Z", "1985-04-31T23:20:50.52Z", "2005-02-29T15:59:59Z", "1996-12-19T16:39:57", "Mon, 31 Dec 1990 15:59:60 GMT", "Monday, 31-Dec-90 15:59:60 GMT", "Mon Dec 31 15:59:60 1990", "1985-04-12T23:20:50.52Z1985-04-12T23:20:50.52Z", "1985-04-12T23:20:50.52ZA", "A1985-04-12T23:20:50.52Z", ]; describe("parseRfc3339DateTime", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(parseRfc3339DateTime(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { it("with fractional seconds", () => { expect(parseRfc3339DateTime("1985-04-12T23:20:50.52Z")).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520))); }); it("without fractional seconds", () => { expect(parseRfc3339DateTime("1985-04-12T23:20:50Z")).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0))); }); it("with leap seconds", () => { expect(parseRfc3339DateTime("1990-12-31T15:59:60Z")).toEqual(new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0))); }); it("with leap days", () => { expect(parseRfc3339DateTime("2004-02-29T15:59:59Z")).toEqual(new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0))); }); it("with leading zeroes", () => { expect(parseRfc3339DateTime("0004-02-09T05:09:09.09Z")).toEqual(new Date(Date.UTC(4, 1, 9, 5, 9, 9, 90))); expect(parseRfc3339DateTime("0004-02-09T00:00:00.00Z")).toEqual(new Date(Date.UTC(4, 1, 9, 0, 0, 0, 0))); }); }); it.each(invalidRfc3339DateTimes)("rejects %s", (value) => { expect(() => parseRfc3339DateTime(value)).toThrowError(); }); // parseRfc3339DateTime throws on offsets. parseRfc3339DateTimeWithOffset can handle these. it.each(["2019-12-16T22:48:18+02:04", "2019-12-16T22:48:18-01:02"])("rejects %s", (value) => { expect(() => parseRfc3339DateTime(value)).toThrowError(); }); }); describe("parseRfc3339DateTimeWithOffset", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(parseRfc3339DateTime(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { it("with fractional seconds", () => { expect(parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50.52Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520)) ); }); it("without fractional seconds", () => { expect(parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0)) ); }); it("with leap seconds", () => { expect(parseRfc3339DateTimeWithOffset("1990-12-31T15:59:60Z")).toEqual( new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0)) ); }); it("with leap days", () => { expect(parseRfc3339DateTimeWithOffset("2004-02-29T15:59:59Z")).toEqual( new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0)) ); }); it("with leading zeroes", () => { expect(parseRfc3339DateTimeWithOffset("0004-02-09T05:09:09.09Z")).toEqual( new Date(Date.UTC(4, 1, 9, 5, 9, 9, 90)) ); expect(parseRfc3339DateTimeWithOffset("0004-02-09T00:00:00.00Z")).toEqual( new Date(Date.UTC(4, 1, 9, 0, 0, 0, 0)) ); }); it("with negative offset", () => { expect(parseRfc3339DateTimeWithOffset("2019-12-16T22:48:18-01:02")).toEqual( new Date(Date.UTC(2019, 11, 16, 23, 50, 18, 0)) ); }); it("with positive offset", () => { expect(parseRfc3339DateTimeWithOffset("2019-12-16T22:48:18+02:04")).toEqual( new Date(Date.UTC(2019, 11, 16, 20, 44, 18, 0)) ); }); }); it.each(invalidRfc3339DateTimes)("rejects %s", (value) => { expect(() => parseRfc3339DateTimeWithOffset(value)).toThrowError(); }); }); describe("parseRfc7231DateTime", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(parseRfc7231DateTime(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { describe("with fractional seconds", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 08:49:37.52 GMT"], ["rfc-850", "Sunday, 06-Nov-94 08:49:37.52 GMT"], ["asctime", "Sun Nov 6 08:49:37.52 1994"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 520))); }); }); describe("with fractional seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 8:49:37.52 GMT"], ["rfc-850", "Sunday, 06-Nov-94 8:49:37.52 GMT"], ["asctime", "Sun Nov 6 8:49:37.52 1994"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 520))); }); }); describe("without fractional seconds", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 08:49:37 GMT"], ["rfc-850", "Sunday, 06-Nov-94 08:49:37 GMT"], ["asctime", "Sun Nov 6 08:49:37 1994"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 0))); }); }); describe("without fractional seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 8:49:37 GMT"], ["rfc-850", "Sunday, 06-Nov-94 8:49:37 GMT"], ["asctime", "Sun Nov 6 8:49:37 1994"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 0))); }); }); describe("with leap seconds", () => { it.each([ ["imf-fixdate", "Mon, 31 Dec 1990 15:59:60 GMT"], ["rfc-850", "Monday, 31-Dec-90 15:59:60 GMT"], ["asctime", "Mon Dec 31 15:59:60 1990"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0))); }); }); describe("with leap seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Mon, 31 Dec 1990 8:59:60 GMT"], ["rfc-850", "Monday, 31-Dec-90 8:59:60 GMT"], ["asctime", "Mon Dec 31 8:59:60 1990"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1990, 11, 31, 8, 59, 60, 0))); }); }); describe("with leap days", () => { it.each([ ["imf-fixdate", "Sun, 29 Feb 2004 15:59:59 GMT"], ["rfc-850", "Sunday, 29-Feb-04 15:59:59 GMT"], ["asctime", "Sun Feb 29 15:59:59 2004"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0))); }); }); describe("with leap days - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 29 Feb 2004 8:59:59 GMT"], ["rfc-850", "Sunday, 29-Feb-04 8:59:59 GMT"], ["asctime", "Sun Feb 29 8:59:59 2004"], ])("in format %s", (_, value) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(2004, 1, 29, 8, 59, 59, 0))); }); }); describe("with leading zeroes", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 0004 08:09:07.02 GMT", 4], ["rfc-850", "Sunday, 06-Nov-04 08:09:07.02 GMT", 2004], ["asctime", "Sun Nov 6 08:09:07.02 0004", 4], ])("in format %s", (_, value, year) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(year, 10, 6, 8, 9, 7, 20))); }); }); describe("with all-zero components", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 0004 00:00:00.00 GMT", 4], ["rfc-850", "Sunday, 06-Nov-04 00:00:00.00 GMT", 2004], ["asctime", "Sun Nov 6 00:00:00.00 0004", 4], ])("in format %s", (_, value, year) => { expect(parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(year, 10, 6, 0, 0, 0, 0))); }); }); }); describe("when parsing rfc-850 dates", () => { it("properly adjusts 2-digit years", () => { // These tests will fail in a couple of decades. Good luck future developers. expect(parseRfc7231DateTime("Friday, 31-Dec-99 12:34:56.789 GMT")).toEqual( new Date(Date.UTC(1999, 11, 31, 12, 34, 56, 789)) ); expect(parseRfc7231DateTime("Thursday, 31-Dec-65 12:34:56.789 GMT")).toEqual( new Date(Date.UTC(2065, 11, 31, 12, 34, 56, 789)) ); }); }); it.each([ "1985-04-12T23:20:50.52Z", "1985-04-12T23:20:50Z", "Sun, 06 Nov 0004 08:09:07.02 GMTSun, 06 Nov 0004 08:09:07.02 GMT", "Sun, 06 Nov 0004 08:09:07.02 GMTA", "ASun, 06 Nov 0004 08:09:07.02 GMT", "Sun, 06 Nov 94 08:49:37 GMT", "Sun, 06 Dov 1994 08:49:37 GMT", "Mun, 06 Nov 1994 08:49:37 GMT", "Sunday, 06 Nov 1994 08:49:37 GMT", "Sun, 06 November 1994 08:49:37 GMT", "Sun, 06 Nov 1994 24:49:37 GMT", "Sun, 06 Nov 1994 08:69:37 GMT", "Sun, 06 Nov 1994 08:49:67 GMT", "Sun, 06-11-1994 08:49:37 GMT", "Sun, 06 11 1994 08:49:37 GMT", "Sun, 31 Nov 1994 08:49:37 GMT", "Sun, 29 Feb 2005 15:59:59 GMT", "Sunday, 06-Nov-04 08:09:07.02 GMTSunday, 06-Nov-04 08:09:07.02 GMT", "ASunday, 06-Nov-04 08:09:07.02 GMT", "Sunday, 06-Nov-04 08:09:07.02 GMTA", "Sunday, 06-Nov-1994 08:49:37 GMT", "Sunday, 06-Dov-94 08:49:37 GMT", "Sundae, 06-Nov-94 08:49:37 GMT", "Sun, 06-Nov-94 08:49:37 GMT", "Sunday, 06-November-94 08:49:37 GMT", "Sunday, 06-Nov-94 24:49:37 GMT", "Sunday, 06-Nov-94 08:69:37 GMT", "Sunday, 06-Nov-94 08:49:67 GMT", "Sunday, 06 11 94 08:49:37 GMT", "Sunday, 06-11-1994 08:49:37 GMT", "Sunday, 31-Nov-94 08:49:37 GMT", "Sunday, 29-Feb-05 15:59:59 GMT", "Sun Nov 6 08:09:07.02 0004Sun Nov 6 08:09:07.02 0004", "ASun Nov 6 08:09:07.02 0004", "Sun Nov 6 08:09:07.02 0004A", "Sun Nov 6 08:49:37 94", "Sun Dov 6 08:49:37 1994", "Mun Nov 6 08:49:37 1994", "Sunday Nov 6 08:49:37 1994", "Sun November 6 08:49:37 1994", "Sun Nov 6 24:49:37 1994", "Sun Nov 6 08:69:37 1994", "Sun Nov 6 08:49:67 1994", "Sun 06-11 08:49:37 1994", "Sun 06 11 08:49:37 1994", "Sun 11 6 08:49:37 1994", "Sun Nov 31 08:49:37 1994", "Sun Feb 29 15:59:59 2005", "Sun Nov 6 08:49:37 1994", ])("rejects %s", (value) => { expect(() => parseRfc7231DateTime(value)).toThrowError(); }); }); describe("parseEpochTimestamp", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(parseEpochTimestamp(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { describe("with fractional seconds", () => { it.each(["482196050.52", 482196050.52])("parses %s", (value) => { expect(parseEpochTimestamp(value)).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520))); }); }); describe("without fractional seconds", () => { it.each(["482196050", 482196050, 482196050.0])("parses %s", (value) => { expect(parseEpochTimestamp(value)).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0))); }); }); }); it.each([ "1985-04-12T23:20:50.52Z", "1985-04-12T23:20:50Z", "Mon, 31 Dec 1990 15:59:60 GMT", "Monday, 31-Dec-90 15:59:60 GMT", "Mon Dec 31 15:59:60 1990", "NaN", NaN, "Infinity", Infinity, "0x42", ])("rejects %s", (value) => { expect(() => parseEpochTimestamp(value)).toThrowError(); }); }); ================================================ FILE: packages/core/src/submodules/serde/date-utils.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { strictParseByte, strictParseDouble, strictParseFloat32, strictParseShort } from "./parse-utils"; // Build indexes outside so we allocate them once. const DAYS: Array = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // These must be kept in order // prettier-ignore const MONTHS: Array = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; /** * Builds a proper UTC HttpDate timestamp from a Date object * since not all environments will have this as the expected * format. * - Prior to ECMAScript 2018, the format of the return value * - varied according to the platform. The most common return * - value was an RFC-1123 formatted date stamp, which is a * - slightly updated version of RFC-822 date stamps. * * @internal * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString} */ export function dateToUtcString(date: Date): string { const year = date.getUTCFullYear(); const month = date.getUTCMonth(); const dayOfWeek = date.getUTCDay(); const dayOfMonthInt = date.getUTCDate(); const hoursInt = date.getUTCHours(); const minutesInt = date.getUTCMinutes(); const secondsInt = date.getUTCSeconds(); // Build 0 prefixed strings for contents that need to be // two digits and where we get an integer back. const dayOfMonthString = dayOfMonthInt < 10 ? `0${dayOfMonthInt}` : `${dayOfMonthInt}`; const hoursString = hoursInt < 10 ? `0${hoursInt}` : `${hoursInt}`; const minutesString = minutesInt < 10 ? `0${minutesInt}` : `${minutesInt}`; const secondsString = secondsInt < 10 ? `0${secondsInt}` : `${secondsInt}`; return `${DAYS[dayOfWeek]}, ${dayOfMonthString} ${MONTHS[month]} ${year} ${hoursString}:${minutesString}:${secondsString} GMT`; } const RFC3339 = new RegExp(/^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?[zZ]$/); /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a string that can be parsed * as an RFC 3339 date. * Input strings must conform to RFC3339 section 5.6, and cannot have a UTC * offset. Fractional precision is supported. * * @internal * @see {@link https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14} * @param value - the value to parse * @returns a Date or undefined */ export const parseRfc3339DateTime = (value: unknown): Date | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value !== "string") { throw new TypeError("RFC-3339 date-times must be expressed as strings"); } const match = RFC3339.exec(value); if (!match) { throw new TypeError("Invalid RFC-3339 date-time value"); } const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds] = match; const year = strictParseShort(stripLeadingZeroes(yearStr))!; const month = parseDateValue(monthStr, "month", 1, 12); const day = parseDateValue(dayStr, "day", 1, 31); return buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); }; const RFC3339_WITH_OFFSET = new RegExp( /^(\d{4})-(\d{2})-(\d{2})[tT](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?(([-+]\d{2}\:\d{2})|[zZ])$/ ); /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a string that can be parsed * as an RFC 3339 date. * Input strings must conform to RFC3339 section 5.6, and can have a UTC * offset. Fractional precision is supported. * * @internal * @see {@link https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14} * @param value - the value to parse * @returns a Date or undefined */ export const parseRfc3339DateTimeWithOffset = (value: unknown): Date | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value !== "string") { throw new TypeError("RFC-3339 date-times must be expressed as strings"); } const match = RFC3339_WITH_OFFSET.exec(value); if (!match) { throw new TypeError("Invalid RFC-3339 date-time value"); } const [_, yearStr, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, offsetStr] = match; const year = strictParseShort(stripLeadingZeroes(yearStr))!; const month = parseDateValue(monthStr, "month", 1, 12); const day = parseDateValue(dayStr, "day", 1, 31); const date = buildDate(year, month, day, { hours, minutes, seconds, fractionalMilliseconds }); // The final regex capture group is either an offset, or "z". If it is not a "z", // attempt to parse the offset and adjust the date. if (offsetStr.toUpperCase() != "Z") { date.setTime(date.getTime() - parseOffsetToMilliseconds(offsetStr)); } return date; }; const IMF_FIXDATE = new RegExp( /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d{2}) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/ ); const RFC_850_DATE = new RegExp( /^(?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d{2})-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? GMT$/ ); const ASC_TIME = new RegExp( /^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( [1-9]|\d{2}) (\d{1,2}):(\d{2}):(\d{2})(?:\.(\d+))? (\d{4})$/ ); /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a string that can be parsed * as an RFC 7231 IMF-fixdate or obs-date. * Input strings must conform to RFC7231 section 7.1.1.1. Fractional seconds are supported. * * @internal * @see {@link https://datatracker.ietf.org/doc/html/rfc7231.html#section-7.1.1.1} * @param value - the value to parse * @returns a Date or undefined */ export const parseRfc7231DateTime = (value: unknown): Date | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value !== "string") { throw new TypeError("RFC-7231 date-times must be expressed as strings"); } let match = IMF_FIXDATE.exec(value); if (match) { const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; return buildDate( strictParseShort(stripLeadingZeroes(yearStr))!, parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds } ); } match = RFC_850_DATE.exec(value); if (match) { const [_, dayStr, monthStr, yearStr, hours, minutes, seconds, fractionalMilliseconds] = match; // RFC 850 dates use 2-digit years. So we parse the year specifically, // and then once we've constructed the entire date, we adjust it if the resultant date // is too far in the future. return adjustRfc850Year( buildDate(parseTwoDigitYear(yearStr), parseMonthByShortName(monthStr), parseDateValue(dayStr, "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds, }) ); } match = ASC_TIME.exec(value); if (match) { const [_, monthStr, dayStr, hours, minutes, seconds, fractionalMilliseconds, yearStr] = match; return buildDate( strictParseShort(stripLeadingZeroes(yearStr))!, parseMonthByShortName(monthStr), parseDateValue(dayStr.trimLeft(), "day", 1, 31), { hours, minutes, seconds, fractionalMilliseconds } ); } throw new TypeError("Invalid RFC-7231 date-time value"); }; /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a number or a parseable string. * Input strings must be an integer or floating point number. Fractional seconds are supported. * * @internal * @param value - the value to parse * @returns a Date or undefined */ export const parseEpochTimestamp = (value: unknown): Date | undefined => { if (value === null || value === undefined) { return undefined; } let valueAsDouble: number; if (typeof value === "number") { valueAsDouble = value; } else if (typeof value === "string") { valueAsDouble = strictParseDouble(value)!; } else if (typeof value === "object" && (value as { tag: number; value: number }).tag === 1) { // timestamp is a CBOR tag type. valueAsDouble = (value as { tag: number; value: number }).value; } else { throw new TypeError("Epoch timestamps must be expressed as floating point numbers or their string representation"); } if (Number.isNaN(valueAsDouble) || valueAsDouble === Infinity || valueAsDouble === -Infinity) { throw new TypeError("Epoch timestamps must be valid, non-Infinite, non-NaN numerics"); } return new Date(Math.round(valueAsDouble * 1000)); }; interface RawTime { hours: string; minutes: string; seconds: string; fractionalMilliseconds: string | undefined; } /** * Build a date from a numeric year, month, date, and an match with named groups * "H", "m", s", and "frac", representing hours, minutes, seconds, and optional fractional seconds. * @param year - numeric year * @param month - numeric month, 1-indexed * @param day - numeric year * @param match - match with groups "H", "m", s", and "frac" */ const buildDate = (year: number, month: number, day: number, time: RawTime): Date => { const adjustedMonth = month - 1; // JavaScript, and our internal data structures, expect 0-indexed months validateDayOfMonth(year, adjustedMonth, day); // Adjust month down by 1 return new Date( Date.UTC( year, adjustedMonth, day, parseDateValue(time.hours, "hour", 0, 23), parseDateValue(time.minutes, "minute", 0, 59), // seconds can go up to 60 for leap seconds parseDateValue(time.seconds, "seconds", 0, 60), parseMilliseconds(time.fractionalMilliseconds) ) ); }; /** * RFC 850 dates use a 2-digit year; start with the assumption that if it doesn't * match the current year, then it's a date in the future, then let adjustRfc850Year adjust * the final date back to the past if it's too far in the future. * * Example: in 2021, start with the assumption that '11' is '2111', and that '22' is '2022'. * adjustRfc850Year will adjust '11' to 2011, (as 2111 is more than 50 years in the future), * but keep '22' as 2022. in 2099, '11' will represent '2111', but '98' should be '2098'. * There's no description of an RFC 850 date being considered too far in the past in RFC-7231, * so it's entirely possible that 2011 is a valid interpretation of '11' in 2099. * @param value - the 2 digit year to parse * @returns number a year that is equal to or greater than the current UTC year */ const parseTwoDigitYear = (value: string): number => { const thisYear = new Date().getUTCFullYear(); const valueInThisCentury = Math.floor(thisYear / 100) * 100 + strictParseShort(stripLeadingZeroes(value))!; if (valueInThisCentury < thisYear) { // This may end up returning a year that adjustRfc850Year turns back by 100. // That's fine! We don't know the other components of the date yet, so there are // boundary conditions that only adjustRfc850Year can handle. return valueInThisCentury + 100; } return valueInThisCentury; }; const FIFTY_YEARS_IN_MILLIS = 50 * 365 * 24 * 60 * 60 * 1000; /** * Adjusts the year value found in RFC 850 dates according to the rules * expressed in RFC7231, which state: * *

Recipients of a timestamp value in rfc850-date format, which uses a * two-digit year, MUST interpret a timestamp that appears to be more * than 50 years in the future as representing the most recent year in * the past that had the same last two digits.
* * @param input - a Date that assumes the two-digit year was in the future * @returns a Date that is in the past if input is \> 50 years in the future */ const adjustRfc850Year = (input: Date): Date => { if (input.getTime() - new Date().getTime() > FIFTY_YEARS_IN_MILLIS) { return new Date( Date.UTC( input.getUTCFullYear() - 100, input.getUTCMonth(), input.getUTCDate(), input.getUTCHours(), input.getUTCMinutes(), input.getUTCSeconds(), input.getUTCMilliseconds() ) ); } return input; }; const parseMonthByShortName = (value: string): number => { const monthIdx = MONTHS.indexOf(value); if (monthIdx < 0) { throw new TypeError(`Invalid month: ${value}`); } return monthIdx + 1; }; const DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; /** * Validate the day is valid for the given month. * @param year - the year * @param month - the month (0-indexed) * @param day - the day of the month */ const validateDayOfMonth = (year: number, month: number, day: number) => { let maxDays = DAYS_IN_MONTH[month]; if (month === 1 && isLeapYear(year)) { maxDays = 29; } if (day > maxDays) { throw new TypeError(`Invalid day for ${MONTHS[month]} in ${year}: ${day}`); } }; const isLeapYear = (year: number): boolean => { return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0); }; const parseDateValue = (value: string, type: string, lower: number, upper: number): number => { const dateVal = strictParseByte(stripLeadingZeroes(value))!; if (dateVal < lower || dateVal > upper) { throw new TypeError(`${type} must be between ${lower} and ${upper}, inclusive`); } return dateVal; }; const parseMilliseconds = (value: string | undefined): number => { if (value === null || value === undefined) { return 0; } return strictParseFloat32("0." + value)! * 1000; }; // Parses offset string and returns offset in milliseconds. const parseOffsetToMilliseconds = (value: string): number => { const directionStr = value[0]; let direction = 1; if (directionStr == "+") { direction = 1; } else if (directionStr == "-") { direction = -1; } else { throw new TypeError(`Offset direction, ${directionStr}, must be "+" or "-"`); } const hour = Number(value.substring(1, 3)); const minute = Number(value.substring(4, 6)); return direction * (hour * 60 + minute) * 60 * 1000; }; const stripLeadingZeroes = (value: string): string => { let idx = 0; while (idx < value.length - 1 && value.charAt(idx) === "0") { idx++; } if (idx === 0) { return value; } return value.slice(idx); }; ================================================ FILE: packages/core/src/submodules/serde/generateIdempotencyToken.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { generateIdempotencyToken } from "./index"; describe("generateIdempotencyToken", () => { // This test is not meaningful when using uuid v4 as an external package, but // will become useful if replacing the uuid implementation in the future. const tokens = {} as Record; it("should repeatedly generate uuid v4 strings", () => { for (let i = 0; i < 1000; ++i) { const token = generateIdempotencyToken(); tokens[token] = true; expect(generateIdempotencyToken()).toMatch( /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i ); } expect(Object.keys(tokens)).toHaveLength(1000); }); }); ================================================ FILE: packages/core/src/submodules/serde/hash-node/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-buffer-from@4.2.2 - @smithy/util-utf8@4.2.2 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/types@4.12.1 - @smithy/util-buffer-from@4.2.1 - @smithy/util-utf8@4.2.1 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/types@4.6.0 - @smithy/util-buffer-from@4.2.0 - @smithy/util-utf8@4.2.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-buffer-from@4.1.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 4.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 ## 4.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 ## 4.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-buffer-from@4.0.0 - @smithy/util-utf8@4.0.0 - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-buffer-from@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/util-buffer-from@2.2.0 - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 - @smithy/util-buffer-from@2.1.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-buffer-from@2.1.0 - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.18 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.17 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.14 ### Patch Changes - Updated dependencies [f2a04b7e] - @smithy/util-utf8@2.0.2 ## 2.0.13 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-utf8@2.0.1 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-buffer-from@2.0.0 - @smithy/util-utf8@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 - @smithy/util-buffer-from@1.1.0 - @smithy/util-utf8@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-buffer-from@1.0.2 - @smithy/util-utf8@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-buffer-from@1.0.1 - @smithy/util-utf8@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/hash-node](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/hash-node/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/hash-node/hash-node.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { fromArrayBuffer, fromString } from "../util-buffer-from/buffer-from"; import { Hash } from "./hash-node"; const hashVectors = require("hash-test-vectors"); const hmacVectors = require("hash-test-vectors/hmac"); describe("Hash", () => { for (const supportedHash of ["md5", "sha256"]) { describe(`${supportedHash} test vectors`, () => { for (const { input, ...results } of hashVectors) { const expected = results[supportedHash]; it(`should calculate a ${supportedHash} hash of ${expected} for an input of ${input}`, async () => { const hash = new Hash(supportedHash); hash.update(fromString(input, "base64")); const { buffer } = await hash.digest(); expect(fromArrayBuffer(buffer).toString("hex")).toBe(expected); }); } for (const { key, data, ...results } of hmacVectors) { const expected = results[supportedHash]; it(`should calculate a ${supportedHash} hmac of ${expected} for an input of ${data} and a key of ${key}`, async () => { const hash = new Hash(supportedHash, fromString(key, "hex")); hash.update(fromString(data, "hex")); const { buffer } = await hash.digest(); expect(fromArrayBuffer(buffer).toString("hex")).toMatch(expected); }); } }); } it("should accept string data", async () => { const hash = new Hash("md5"); hash.update(""); const { buffer } = await hash.digest(); expect(fromArrayBuffer(buffer).toString("hex")).toBe("d41d8cd98f00b204e9800998ecf8427e"); }); it("should accept ArrayBuffer data", async () => { const hash = new Hash("md5"); hash.update(new ArrayBuffer(0)); const { buffer } = await hash.digest(); expect(fromArrayBuffer(buffer).toString("hex")).toBe("d41d8cd98f00b204e9800998ecf8427e"); }); it("should accept ArrayBufferView data", async () => { const hash = new Hash("md5"); hash.update(new Uint8Array(0)); const { buffer } = await hash.digest(); expect(fromArrayBuffer(buffer).toString("hex")).toBe("d41d8cd98f00b204e9800998ecf8427e"); }); }); ================================================ FILE: packages/core/src/submodules/serde/hash-node/hash-node.ts ================================================ import { createHash, createHmac, type Hmac, type Hash as NodeHash } from "node:crypto"; import type { Checksum, SourceData } from "@smithy/types"; import { fromArrayBuffer, fromString, type StringEncoding } from "../util-buffer-from/buffer-from"; import { toUint8Array } from "../util-utf8/toUint8Array"; /** * @internal */ export class Hash implements Checksum { private readonly algorithmIdentifier: string; private readonly secret?: SourceData; private hash!: NodeHash | Hmac; constructor(algorithmIdentifier: string, secret?: SourceData) { this.algorithmIdentifier = algorithmIdentifier; this.secret = secret; this.reset(); } update(toHash: SourceData, encoding?: "utf8" | "ascii" | "latin1"): void { this.hash.update(toUint8Array(castSourceData(toHash, encoding))); } digest(): Promise { return Promise.resolve(this.hash.digest()); } reset(): void { this.hash = this.secret ? createHmac(this.algorithmIdentifier, castSourceData(this.secret)) : createHash(this.algorithmIdentifier); } } function castSourceData(toCast: SourceData, encoding?: StringEncoding): Buffer { if (Buffer.isBuffer(toCast)) { return toCast; } if (typeof toCast === "string") { return fromString(toCast, encoding); } if (ArrayBuffer.isView(toCast)) { return fromArrayBuffer(toCast.buffer, toCast.byteOffset, toCast.byteLength); } return fromArrayBuffer(toCast); } ================================================ FILE: packages/core/src/submodules/serde/index.browser.ts ================================================ import { fromBase64 } from "./util-base64/fromBase64.browser"; import { toBase64 } from "./util-base64/toBase64.browser"; import { bindUint8ArrayBlobAdapter } from "./util-stream/blob/Uint8ArrayBlobAdapter"; import { fromUtf8 } from "./util-utf8/fromUtf8.browser"; import { toUtf8 } from "./util-utf8/toUtf8.browser"; import { bindV4 } from "./uuid/v4"; const no = Symbol.for("node-only"); export { copyDocumentWithTransform } from "./copyDocumentWithTransform"; export { dateToUtcString, parseRfc3339DateTime, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, parseEpochTimestamp, } from "./date-utils"; export { LazyJsonString, type AutomaticJsonStringConversion } from "./lazy-json"; export { logger, parseBoolean, expectBoolean, expectNumber, expectFloat32, expectInt, expectInt32, expectShort, expectByte, expectNonNull, expectObject, expectString, expectUnion, expectLong, strictParseDouble, strictParseFloat, strictParseFloat32, strictParseLong, strictParseInt, strictParseInt32, strictParseShort, strictParseByte, limitedParseDouble, handleFloat, limitedParseFloat, limitedParseFloat32, } from "./parse-utils"; export { quoteHeader } from "./quote-header"; export { _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, } from "./schema-serde-lib/schema-date-utils"; export { splitEvery } from "./split-every"; export { splitHeader } from "./split-header"; export { NumericValue, nv, type NumericType } from "./value/NumericValue"; // @smithy/util-hex-encoding export { fromHex, toHex } from "./util-hex-encoding/hex-encoding"; // @smithy/util-base64 export { toBase64, fromBase64 }; // @smithy/util-body-length-browser export { calculateBodyLength } from "./util-body-length/calculateBodyLength.browser"; // @smithy/util-utf8 export { toUint8Array } from "./util-utf8/toUint8Array.browser"; export { toUtf8, fromUtf8 }; // @smithy/util-buffer-from export { type StringEncoding } from "./util-buffer-from/buffer-from"; export const fromArrayBuffer = no; export const fromString = no; // @smithy/is-array-buffer export { isArrayBuffer } from "./is-array-buffer/is-array-buffer"; // @smithy/middleware-serde export { deserializerMiddleware } from "./middleware-serde/deserializerMiddleware"; export { deserializerMiddlewareOption, serializerMiddlewareOption, getSerdePlugin, type V1OrV2Endpoint, } from "./middleware-serde/serdePlugin"; export { serializerMiddleware } from "./middleware-serde/serializerMiddleware"; // @smithy/hash-node export const Hash = no; // @smithy/util-stream export class Uint8ArrayBlobAdapter extends bindUint8ArrayBlobAdapter(toUtf8, fromUtf8, toBase64, fromBase64) {} export { ChecksumStream, type ChecksumStreamInit } from "./util-stream/checksum/ChecksumStream.browser"; export { createChecksumStream } from "./util-stream/checksum/createChecksumStream.browser"; export { createBufferedReadable } from "./util-stream/createBufferedReadable.browser"; export { getAwsChunkedEncodingStream } from "./util-stream/getAwsChunkedEncodingStream.browser"; export { headStream } from "./util-stream/headStream.browser"; export { sdkStreamMixin } from "./util-stream/sdk-stream-mixin.browser"; export { splitStream } from "./util-stream/splitStream.browser"; export { isReadableStream, isBlob } from "./util-stream/stream-type-check"; // @smithy/uuid const _getRandomValues = (array: Uint8Array) => crypto.getRandomValues(array); export const v4 = bindV4(_getRandomValues); export const generateIdempotencyToken = v4; ================================================ FILE: packages/core/src/submodules/serde/index.native.ts ================================================ import { fromBase64 } from "./util-base64/fromBase64.browser"; import { toBase64 } from "./util-base64/toBase64.browser"; import { bindUint8ArrayBlobAdapter } from "./util-stream/blob/Uint8ArrayBlobAdapter"; import { fromUtf8 } from "./util-utf8/fromUtf8.browser"; import { toUtf8 } from "./util-utf8/toUtf8.browser"; import { bindV4 } from "./uuid/v4"; const no = Symbol.for("node-only"); export { copyDocumentWithTransform } from "./copyDocumentWithTransform"; export { dateToUtcString, parseRfc3339DateTime, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, parseEpochTimestamp, } from "./date-utils"; export { LazyJsonString, type AutomaticJsonStringConversion } from "./lazy-json"; export { logger, parseBoolean, expectBoolean, expectNumber, expectFloat32, expectInt, expectInt32, expectShort, expectByte, expectNonNull, expectObject, expectString, expectUnion, expectLong, strictParseDouble, strictParseFloat, strictParseFloat32, strictParseLong, strictParseInt, strictParseInt32, strictParseShort, strictParseByte, limitedParseDouble, handleFloat, limitedParseFloat, limitedParseFloat32, } from "./parse-utils"; export { quoteHeader } from "./quote-header"; export { _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, } from "./schema-serde-lib/schema-date-utils"; export { splitEvery } from "./split-every"; export { splitHeader } from "./split-header"; export { NumericValue, nv, type NumericType } from "./value/NumericValue"; // @smithy/util-hex-encoding export { fromHex, toHex } from "./util-hex-encoding/hex-encoding"; // @smithy/util-base64 export { fromBase64 } from "./util-base64/fromBase64.browser"; export { toBase64 } from "./util-base64/toBase64.browser"; // @smithy/util-body-length-browser export { calculateBodyLength } from "./util-body-length/calculateBodyLength.browser"; // @smithy/util-utf8 export { fromUtf8 } from "./util-utf8/fromUtf8.browser"; export { toUint8Array } from "./util-utf8/toUint8Array.browser"; export { toUtf8 } from "./util-utf8/toUtf8.browser"; // @smithy/util-buffer-from export { type StringEncoding } from "./util-buffer-from/buffer-from"; export const fromArrayBuffer = no; export const fromString = no; // @smithy/is-array-buffer export { isArrayBuffer } from "./is-array-buffer/is-array-buffer"; // @smithy/middleware-serde export { deserializerMiddleware } from "./middleware-serde/deserializerMiddleware"; export { deserializerMiddlewareOption, serializerMiddlewareOption, getSerdePlugin, type V1OrV2Endpoint, } from "./middleware-serde/serdePlugin"; export { serializerMiddleware } from "./middleware-serde/serializerMiddleware"; // @smithy/hash-node export const Hash = no; // @smithy/util-stream export class Uint8ArrayBlobAdapter extends bindUint8ArrayBlobAdapter(toUtf8, fromUtf8, toBase64, fromBase64) {} export { ChecksumStream, type ChecksumStreamInit } from "./util-stream/checksum/ChecksumStream.browser"; export { createChecksumStream } from "./util-stream/checksum/createChecksumStream.browser"; export { createBufferedReadable } from "./util-stream/createBufferedReadable.browser"; export { getAwsChunkedEncodingStream } from "./util-stream/getAwsChunkedEncodingStream.browser"; export { headStream } from "./util-stream/headStream.browser"; export { sdkStreamMixin } from "./util-stream/sdk-stream-mixin.browser"; export { splitStream } from "./util-stream/splitStream.browser"; export { isReadableStream, isBlob } from "./util-stream/stream-type-check"; // @smithy/uuid const _getRandomValues = (array: Uint8Array) => crypto.getRandomValues(array); export const v4 = bindV4(_getRandomValues); export const generateIdempotencyToken = v4; ================================================ FILE: packages/core/src/submodules/serde/index.ts ================================================ import { getRandomValues } from "node:crypto"; import { fromBase64 } from "./util-base64/fromBase64"; import { toBase64 } from "./util-base64/toBase64"; import { bindUint8ArrayBlobAdapter } from "./util-stream/blob/Uint8ArrayBlobAdapter"; import { fromUtf8 } from "./util-utf8/fromUtf8"; import { toUtf8 } from "./util-utf8/toUtf8"; import { bindV4 } from "./uuid/v4"; export { copyDocumentWithTransform } from "./copyDocumentWithTransform"; export { dateToUtcString, parseRfc3339DateTime, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, parseEpochTimestamp, } from "./date-utils"; export { LazyJsonString, type AutomaticJsonStringConversion } from "./lazy-json"; export { logger, parseBoolean, expectBoolean, expectNumber, expectFloat32, expectInt, expectInt32, expectShort, expectByte, expectNonNull, expectObject, expectString, expectUnion, expectLong, strictParseDouble, strictParseFloat, strictParseFloat32, strictParseLong, strictParseInt, strictParseInt32, strictParseShort, strictParseByte, limitedParseDouble, handleFloat, limitedParseFloat, limitedParseFloat32, } from "./parse-utils"; export { quoteHeader } from "./quote-header"; export { _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, } from "./schema-serde-lib/schema-date-utils"; export { splitEvery } from "./split-every"; export { splitHeader } from "./split-header"; export { NumericValue, nv, type NumericType } from "./value/NumericValue"; // @smithy/util-hex-encoding export { fromHex, toHex } from "./util-hex-encoding/hex-encoding"; // @smithy/util-base64 export { toBase64, fromBase64 }; // @smithy/util-body-length-browser and @smithy/util-body-length-node export { calculateBodyLength } from "./util-body-length/calculateBodyLength"; // @smithy/util-utf8 export { toUint8Array } from "./util-utf8/toUint8Array"; export { toUtf8, fromUtf8 }; // @smithy/util-buffer-from export { fromArrayBuffer, fromString, type StringEncoding } from "./util-buffer-from/buffer-from"; // @smithy/is-array-buffer export { isArrayBuffer } from "./is-array-buffer/is-array-buffer"; // @smithy/middleware-serde export { deserializerMiddleware } from "./middleware-serde/deserializerMiddleware"; export { deserializerMiddlewareOption, serializerMiddlewareOption, getSerdePlugin, type V1OrV2Endpoint, } from "./middleware-serde/serdePlugin"; export { serializerMiddleware } from "./middleware-serde/serializerMiddleware"; // @smithy/hash-node export { Hash } from "./hash-node/hash-node"; // @smithy/util-stream export class Uint8ArrayBlobAdapter extends bindUint8ArrayBlobAdapter(toUtf8, fromUtf8, toBase64, fromBase64) {} export { ChecksumStream, type ChecksumStreamInit } from "./util-stream/checksum/ChecksumStream"; export { createChecksumStream } from "./util-stream/checksum/createChecksumStream"; export { createBufferedReadable } from "./util-stream/createBufferedReadable"; export { getAwsChunkedEncodingStream } from "./util-stream/getAwsChunkedEncodingStream"; export { headStream } from "./util-stream/headStream"; export { sdkStreamMixin } from "./util-stream/sdk-stream-mixin"; export { splitStream } from "./util-stream/splitStream"; export { isReadableStream, isBlob } from "./util-stream/stream-type-check"; // @smithy/uuid const _getRandomValues = getRandomValues as (array: Uint8Array) => Uint8Array; export const v4 = bindV4(_getRandomValues); export const generateIdempotencyToken = v4; ================================================ FILE: packages/core/src/submodules/serde/is-array-buffer/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/is-array-buffer](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/is-array-buffer/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/is-array-buffer/is-array-buffer.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { isArrayBuffer } from "./is-array-buffer"; describe("isArrayBuffer", () => { const arrayBufferConstructor = ArrayBuffer; afterEach(() => { (ArrayBuffer as any) = arrayBufferConstructor; }); it("should return true for ArrayBuffer objects", () => { expect(isArrayBuffer(new ArrayBuffer(0))).toBe(true); }); it("should return false for ArrayBufferView objects", () => { const view = new Uint8Array(0); expect(isArrayBuffer(view)).toBe(false); expect(isArrayBuffer(view.buffer)).toBe(true); }); it("should return false for scalar values", () => { for (const scalar of ["string", 123.234, true, null, void 0]) { expect(isArrayBuffer(scalar)).toBe(false); } }); it("should return true for ArrayBuffers created with a different instance of the ArrayBuffer constructor", () => { const buffer = new ArrayBuffer(0); (ArrayBuffer as any) = vi.fn(() => buffer); expect(buffer).not.toBeInstanceOf(ArrayBuffer); expect(isArrayBuffer(buffer)).toBe(true); }); }); ================================================ FILE: packages/core/src/submodules/serde/is-array-buffer/is-array-buffer.ts ================================================ /** * @internal */ export const isArrayBuffer = (arg: any): arg is ArrayBuffer => (typeof ArrayBuffer === "function" && arg instanceof ArrayBuffer) || Object.prototype.toString.call(arg) === "[object ArrayBuffer]"; ================================================ FILE: packages/core/src/submodules/serde/lazy-json.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { LazyJsonString } from "./lazy-json"; describe("LazyJsonString", () => { it("should have string methods", () => { const jsonValue = new LazyJsonString('"foo"'); expect(jsonValue.length).toBe(5); expect(jsonValue.toString()).toBe('"foo"'); }); it("should deserialize json properly", () => { const jsonValue = new LazyJsonString('"foo"'); expect(jsonValue.deserializeJSON()).toBe("foo"); const wrongJsonValue = new LazyJsonString("foo"); expect(() => wrongJsonValue.deserializeJSON()).toThrow(); }); it("should get JSON string properly", () => { const jsonValue = new LazyJsonString('{"foo", "bar"}'); expect(jsonValue.toJSON()).toBe('{"foo", "bar"}'); }); it("can instantiate from LazyJsonString class", () => { const original = new LazyJsonString('"foo"'); const newOne = LazyJsonString.from(original); expect(newOne.toString()).toBe('"foo"'); }); it("can instantiate from String class", () => { const jsonValue = LazyJsonString.from(new String('"foo"')); expect(jsonValue.toString()).toBe('"foo"'); }); it("can instantiate from object", () => { const jsonValue = LazyJsonString.from({ foo: "bar" }); expect(jsonValue.toString()).toBe('{"foo":"bar"}'); }); it("passes instanceof String check", () => { const jsonValue = LazyJsonString.from({ foo: "bar" }); expect(jsonValue).toBeInstanceOf(String); }); }); ================================================ FILE: packages/core/src/submodules/serde/lazy-json.ts ================================================ /* eslint-disable @typescript-eslint/no-wrapper-object-types */ /** * A model field with this type means that you may provide a JavaScript * object in lieu of a JSON string, and it will be serialized to JSON * automatically before being sent in a request. * For responses, you will receive a "LazyJsonString", which is a boxed String object * with additional mixin methods. * To get the string value, call `.toString()`, or to get the JSON object value, * call `.deserializeJSON()` or parse it yourself. * * @public */ export type AutomaticJsonStringConversion = Parameters[0] | LazyJsonString; /** * @internal */ export interface LazyJsonString extends String { /** * @returns the JSON parsing of the string value. */ deserializeJSON(): any; /** * @returns the original string value rather than a JSON.stringified value. */ toJSON(): string; } /** * Extension of the native String class in the previous implementation * has negative global performance impact on method dispatch for strings, * and is generally discouraged. * This current implementation may look strange, but is necessary to preserve the interface and * behavior of extending the String class. * * @internal */ export const LazyJsonString = function LazyJsonString(val: string): void { const str = Object.assign(new String(val), { deserializeJSON() { return JSON.parse(String(val)); }, toString() { return String(val); }, toJSON() { return String(val); }, }); return str as never; } as any as { new (s: string): LazyJsonString; (s: string): LazyJsonString; from(s: any): LazyJsonString; /** * @deprecated use #from. */ fromObject(s: any): LazyJsonString; }; LazyJsonString.from = (object: any): LazyJsonString => { if (object && typeof object === "object" && (object instanceof LazyJsonString || "deserializeJSON" in object)) { return object as any; } else if (typeof object === "string" || Object.getPrototypeOf(object) === String.prototype) { return LazyJsonString(String(object) as string) as any; } return LazyJsonString(JSON.stringify(object)) as any; }; /** * @deprecated use #from. */ LazyJsonString.fromObject = LazyJsonString.from; ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.20 ### Patch Changes - @smithy/core@3.23.17 ## 4.2.19 ### Patch Changes - Updated dependencies [a029f0e] - @smithy/core@3.23.16 ## 4.2.18 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/protocol-http@5.3.14 ## 4.2.17 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/protocol-http@5.3.13 ## 4.2.16 ### Patch Changes - Updated dependencies [7198e09] - @smithy/core@3.23.13 ## 4.2.15 ### Patch Changes - @smithy/core@3.23.12 ## 4.2.14 ### Patch Changes - Updated dependencies [2edd638] - @smithy/core@3.23.11 ## 4.2.13 ### Patch Changes - 5340b11: apply resolved endpoint headers to final request - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 ## 4.2.12 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/protocol-http@5.3.11 ## 4.2.11 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/protocol-http@5.3.10 ## 4.2.10 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 ## 4.2.9 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/protocol-http@5.3.8 ## 4.2.8 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/protocol-http@5.3.7 ## 4.2.7 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/protocol-http@5.3.6 ## 4.2.6 ### Patch Changes - e659a06: explicit non-enumerability for error.$response ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/protocol-http@5.3.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/protocol-http@5.3.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/protocol-http@5.3.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/protocol-http@5.3.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/protocol-http@5.3.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/protocol-http@5.2.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/protocol-http@5.2.0 - @smithy/types@4.4.0 ## 4.0.9 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/protocol-http@5.1.3 ## 4.0.8 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/protocol-http@5.1.2 ## 4.0.7 ### Patch Changes - ae11e3a: add schema classes ## 4.0.6 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/protocol-http@5.1.1 ## 4.0.5 ### Patch Changes - 786dd3a: reduce usage of endpoints2.0 type adapter in public interfaces ## 4.0.4 ### Patch Changes - 103535a: add response metadata to deserializer errors ## 4.0.3 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 ## 4.0.2 ### Patch Changes - f5d0bac: handle unwritable error.message field ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/types@4.0.0 ## 3.0.11 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 ## 3.0.10 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 ## 3.0.9 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 ## 3.0.8 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 ## 3.0.7 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 ## 3.0.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 ## 3.0.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 ## 3.0.4 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/types@2.12.0 ## 2.2.1 ### Patch Changes - 32e3f6ff: use SerdeFunctions as input type and SerdeContext as resolved type for serde plugin ## 2.2.0 ### Minor Changes - 43f3e1e2: encoders allow string inputs ### Patch Changes - 49640d6c: allow deserializers to populate error response body - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/types@2.9.0 ## 2.0.16 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 ## 2.0.15 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 ## 2.0.14 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 ## 2.0.13 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 ## 2.0.5 ### Patch Changes - 1be3c4c9: Add integration tests - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-serde](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-serde/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/deserializerMiddleware.spec.ts ================================================ import { HttpResponse } from "@smithy/protocol-http"; import type { EndpointBearer, SerdeFunctions } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { deserializerMiddleware } from "./deserializerMiddleware"; describe("deserializerMiddleware", () => { const mockNext = vi.fn(); const mockDeserializer = vi.fn(); const mockOptions = { endpoint: () => Promise.resolve({ protocol: "protocol", hostname: "hostname", path: "path", }), } as EndpointBearer & SerdeFunctions; const mockArgs = { input: { inputKey: "inputValue", }, request: { method: "GET", headers: {}, }, }; const mockOutput = { $metadata: { statusCode: 200, requestId: "requestId", }, outputKey: "outputValue", }; const mockNextResponse = { response: { statusCode: 200, headers: {}, }, $metadata: { httpStatusCode: 200, requestId: undefined, extendedRequestId: undefined, cfId: undefined, }, }; const mockResponse = { response: mockNextResponse.response, output: mockOutput, }; beforeEach(() => { mockNext.mockResolvedValueOnce(mockNextResponse); mockDeserializer.mockResolvedValueOnce(mockOutput); }); afterEach(() => { vi.clearAllMocks(); }); it("calls deserializer and populates response object", async () => { await expect(deserializerMiddleware(mockOptions, mockDeserializer)(mockNext, {})(mockArgs)).resolves.toStrictEqual( mockResponse ); expect(mockNext).toHaveBeenCalledTimes(1); expect(mockNext).toHaveBeenCalledWith(mockArgs); expect(mockDeserializer).toHaveBeenCalledTimes(1); expect(mockDeserializer).toHaveBeenCalledWith(mockNextResponse.response, mockOptions); }); it("injects non-enumerable $response reference to deserializing exceptions", async () => { const exception = Object.assign(new Error("MockException"), mockNextResponse.response); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await deserializerMiddleware(mockOptions, mockDeserializer)(mockNext, {})(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e).toMatchObject(exception); expect(e.$response).toEqual(mockNextResponse.response); expect(Object.keys(e)).not.toContain("$response"); } }); it("adds a hint about $response to the message of the thrown error", async () => { const exception = Object.assign(new Error("MockException"), mockNextResponse.response, { $response: { body: "", }, $responseBodyText: "oh no", }); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await deserializerMiddleware(mockOptions, mockDeserializer)(mockNext, {})(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.message).toContain( "to see the raw response, inspect the hidden field {error}.$response on this object." ); expect(e.$response.body).toEqual("oh no"); } }); it("handles unwritable error.message", async () => { const exception = Object.assign({}, mockNextResponse.response, { $response: { body: "", }, $responseBodyText: "oh no", }); Object.defineProperty(exception, "message", { set() { throw new Error("may not call setter"); }, get() { return "MockException"; }, }); const sink = vi.fn(); mockDeserializer.mockReset(); mockDeserializer.mockRejectedValueOnce(exception); try { await deserializerMiddleware(mockOptions, mockDeserializer)(mockNext, { logger: { debug: sink, info: sink, warn: sink, error: sink, }, })(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(sink).toHaveBeenCalledWith( `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.` ); expect(e.message).toEqual("MockException"); expect(e.$response.body).toEqual("oh no"); } }); describe("metadata", () => { it("assigns metadata from the response in the event of a deserializer failure", async () => { const midware = deserializerMiddleware(mockOptions, async () => { JSON.parse(`this isn't JSON`); }); const handler = midware( async () => ({ response: new HttpResponse({ headers: { "x-namespace-requestid": "requestid", "x-namespace-id-2": "id2", "x-namespace-cf-id": "cf", }, statusCode: 503, }), }), {} ); try { await handler(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.$metadata).toEqual({ httpStatusCode: 503, requestId: "requestid", extendedRequestId: "id2", cfId: "cf", }); } expect.assertions(1); }); it("assigns any available metadata from the response in the event of a deserializer failure", async () => { const midware = deserializerMiddleware(mockOptions, async () => { JSON.parse(`this isn't JSON`); }); const handler = midware( async () => ({ response: new HttpResponse({ statusCode: 301, headers: { "x-namespace-requestid": "requestid", }, }), }), {} ); try { await handler(mockArgs); fail("DeserializerMiddleware should throw"); } catch (e) { expect(e.$metadata).toEqual({ httpStatusCode: 301, requestId: "requestid", extendedRequestId: undefined, cfId: undefined, }); } expect.assertions(1); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/deserializerMiddleware.ts ================================================ import { HttpResponse } from "@smithy/core/protocols"; import type { DeserializeHandler, DeserializeHandlerArguments, DeserializeHandlerOutput, DeserializeMiddleware, HandlerExecutionContext, MetadataBearer, ResponseDeserializer, SerdeContext, SerdeFunctions, } from "@smithy/types"; /** * @internal * @deprecated will be replaced by schemaSerdePlugin from core/schema. */ export const deserializerMiddleware = ( options: SerdeFunctions, deserializer: ResponseDeserializer ): DeserializeMiddleware => (next: DeserializeHandler, context: HandlerExecutionContext): DeserializeHandler => async (args: DeserializeHandlerArguments): Promise> => { const { response } = await next(args); try { /** * [options] is upgraded from SerdeFunctions to CommandSerdeContext, * since the generated deserializer expects CommandSerdeContext. * * This is okay because options is from the same client's resolved config, * and the deserializer doesn't need the `endpoint` field. */ const parsed = await deserializer(response, options as CommandSerdeContext); return { response, output: parsed as Output, }; } catch (error) { // For security reasons, the error response is not completely visible by default. Object.defineProperty(error, "$response", { value: response, // we need to define these properties explicitly because // the service exception class may have set the value to undefined, but populated the key. enumerable: false, writable: false, configurable: false, }); if (!("$metadata" in error)) { // only apply this to non-ServiceException. const hint = `Deserialization error: to see the raw response, inspect the hidden field {error}.$response on this object.`; try { error.message += "\n " + hint; } catch (e) { // Error with an unwritable message (strict mode getter with no setter). if (!context.logger || context.logger?.constructor?.name === "NoOpLogger") { console.warn(hint); } else { context.logger?.warn?.(hint); } } if (typeof error.$responseBodyText !== "undefined") { // if $responseBodyText was collected by the error parser, assign it to // replace the response body, because it was consumed and is now empty. if (error.$response) { error.$response.body = error.$responseBodyText; } } try { // if the deserializer failed, then $metadata may still be set // by taking information from the response. if (HttpResponse.isInstance(response)) { const { headers = {} } = response; const headerEntries = Object.entries(headers); (error as MetadataBearer).$metadata = { httpStatusCode: response.statusCode, requestId: findHeader(/^x-[\w-]+-request-?id$/, headerEntries), extendedRequestId: findHeader(/^x-[\w-]+-id-2$/, headerEntries), cfId: findHeader(/^x-[\w-]+-cf-id$/, headerEntries), }; } } catch (e) { // ignored, error object was not writable. } } throw error; } }; /** * @internal * @returns header value where key matches regex. */ const findHeader = (pattern: RegExp, headers: [string, string][]): string | undefined => { return (headers.find(([k]) => { return k.match(pattern); }) || [void 0, void 1])[1]; }; ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/middleware-serde.integ.spec.ts ================================================ import { requireRequestsFrom } from "@smithy/util-test/src"; import { describe, test as it } from "vitest"; import { Weather } from "weather"; describe("middleware-serde", () => { describe(Weather.name, () => { it("should serialize TestProtocol", async () => { const client = new Weather({ endpoint: "https://foo.bar", region: "us-west-2", credentials: { accessKeyId: "INTEG", secretAccessKey: "INTEG", }, }); requireRequestsFrom(client).toMatch({ method: "PUT", hostname: "foo.bar", body: "{}", protocol: "https:", path: "/city", }); await client.createCity({ name: "MyCity", coordinates: { latitude: 0, longitude: 0, }, }); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/serdePlugin.ts ================================================ import type { DeserializeHandlerOptions, Endpoint, MetadataBearer, MiddlewareStack, Pluggable, Provider, RequestSerializer, ResponseDeserializer, SerdeContext, SerdeFunctions, SerializeHandlerOptions, UrlParser, } from "@smithy/types"; import { deserializerMiddleware } from "./deserializerMiddleware"; import { serializerMiddleware } from "./serializerMiddleware"; /** * @deprecated will be replaced by schemaSerdePlugin from core/schema. */ export const deserializerMiddlewareOption: DeserializeHandlerOptions = { name: "deserializerMiddleware", step: "deserialize", tags: ["DESERIALIZER"], override: true, }; /** * @deprecated will be replaced by schemaSerdePlugin from core/schema. */ export const serializerMiddlewareOption: SerializeHandlerOptions = { name: "serializerMiddleware", step: "serialize", tags: ["SERIALIZER"], override: true, }; /** * Modifies the EndpointBearer to make it compatible with Endpoints 2.0 change. * * @internal * @deprecated */ export type V1OrV2Endpoint = { // for v2 urlParser?: UrlParser; // for v1 endpoint?: Provider; }; /** * @internal * @deprecated will be replaced by schemaSerdePlugin from core/schema. */ export function getSerdePlugin< InputType extends object = any, CommandSerdeContext extends SerdeContext = any, OutputType extends MetadataBearer = any, >( config: SerdeFunctions, serializer: RequestSerializer, deserializer: ResponseDeserializer ): Pluggable { return { applyToStack: (commandStack: MiddlewareStack) => { commandStack.add(deserializerMiddleware(config, deserializer), deserializerMiddlewareOption); commandStack.add(serializerMiddleware(config, serializer), serializerMiddlewareOption); }, }; } ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/serializerMiddleware.spec.ts ================================================ import type { EndpointBearer, SerdeFunctions } from "@smithy/types"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { serializerMiddleware } from "./serializerMiddleware"; describe("serializerMiddleware", () => { const mockNext = vi.fn(); const mockSerializer = vi.fn(); const mockOptions = { endpoint: () => Promise.resolve({ protocol: "protocol", hostname: "hostname", path: "path", }), } as EndpointBearer & SerdeFunctions; const mockRequest = { method: "GET", headers: {}, }; const mockResponse = { statusCode: 200, headers: {}, }; const mockOutput = { $metadata: { statusCode: 200, requestId: "requestId", }, outputKey: "outputValue", }; const mockReturn = { response: mockResponse, output: mockOutput, }; const mockArgs = { input: { inputKey: "inputValue", }, }; beforeEach(() => { mockNext.mockResolvedValueOnce(mockReturn); mockSerializer.mockResolvedValueOnce(mockRequest); }); it("calls serializer and populates request object", async () => { await expect(serializerMiddleware(mockOptions, mockSerializer)(mockNext, {})(mockArgs)).resolves.toStrictEqual( mockReturn ); expect(mockSerializer).toHaveBeenCalledTimes(1); expect(mockSerializer).toHaveBeenCalledWith(mockArgs.input, mockOptions); expect(mockNext).toHaveBeenCalledTimes(1); expect(mockNext).toHaveBeenCalledWith({ ...mockArgs, request: mockRequest }); }); }); ================================================ FILE: packages/core/src/submodules/serde/middleware-serde/serializerMiddleware.ts ================================================ import { toEndpointV1 } from "@smithy/core/endpoints"; import type { Endpoint, HandlerExecutionContext, Provider, RequestSerializer, SerdeContext, SerdeFunctions, SerializeHandler, SerializeHandlerArguments, SerializeHandlerOutput, SerializeMiddleware, } from "@smithy/types"; import type { V1OrV2Endpoint } from "./serdePlugin"; /** * @internal * @deprecated will be replaced by schemaSerdePlugin from core/schema. */ export const serializerMiddleware = ( options: SerdeFunctions, serializer: RequestSerializer ): SerializeMiddleware => (next: SerializeHandler, context: HandlerExecutionContext): SerializeHandler => async (args: SerializeHandlerArguments): Promise> => { const endpointConfig = options as V1OrV2Endpoint; const endpoint: Provider = context.endpointV2 ? async () => toEndpointV1(context.endpointV2!) : endpointConfig.endpoint!; if (!endpoint) { throw new Error("No valid endpoint provider available."); } /** * [options] is upgraded from SerdeFunctions to CommandSerdeContext, * since the generated serializer expects CommandSerdeContext. * * This is okay because options is from the same client's resolved config, * and `endpoint` has been provided here by checking two sources. */ const request = await serializer(args.input, { ...options, endpoint } as CommandSerdeContext); return next({ ...args, request, }); }; ================================================ FILE: packages/core/src/submodules/serde/parse-utils.spec.ts ================================================ import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { expectBoolean, expectByte, expectFloat32, expectInt32, expectLong, expectNonNull, expectNumber, expectObject, expectShort, expectString, expectUnion, limitedParseDouble, limitedParseFloat32, logger, parseBoolean, strictParseByte, strictParseDouble, strictParseFloat32, strictParseInt32, strictParseLong, strictParseShort, } from "./parse-utils"; logger.warn = () => {}; describe("parseBoolean", () => { it('Returns true for "true"', () => { expect(parseBoolean("true")).toEqual(true); }); it('Returns false for "false"', () => { expect(parseBoolean("false")).toEqual(false); }); describe("Throws an error on invalid input", () => { it.each([ // These are valid booleans in YAML "y", "Y", "yes", "Yes", "YES", "n", "N", "no", "No", "NO", "True", "TRUE", "False", "FALSE", "on", "On", "ON", "off", "Off", "OFF", // These would be resolve to false using Boolean 0, null, "", false, // These would resolve to true using Boolean true, "Su Lin", [], {}, ])("rejects %s", (value) => { expect(() => parseBoolean(value as any)).toThrowError(); }); }); }); describe("expectBoolean", () => { it.each([true, false])("accepts %s", (value) => { expect(expectBoolean(value)).toEqual(value); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectBoolean(value)).toEqual(undefined); }); describe("reluctantly", () => { let consoleMock: any; beforeEach(() => { consoleMock = vi.spyOn(logger, "warn"); }); afterEach(() => { consoleMock.mockRestore(); }); it.each([1, "true", "True"])("accepts %s", (value) => { expect(expectBoolean(value)).toEqual(true); expect(logger.warn).toHaveBeenCalled(); }); it.each([0, "false", "False"])("accepts %s", (value) => { expect(expectBoolean(value)).toEqual(false); expect(logger.warn).toHaveBeenCalled(); }); }); describe("rejects non-booleans", () => { it.each([1.1, Infinity, -Infinity, NaN, {}, []])("rejects %s", (value) => { expect(() => expectBoolean(value)).toThrowError(); }); }); }); describe("expectNumber", () => { describe("accepts numbers", () => { it.each([1, 1.1, Infinity, -Infinity])("accepts %s", (value) => { expect(expectNumber(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectNumber(value)).toEqual(undefined); }); describe("reluctantly", () => { let consoleMock: any; beforeEach(() => { consoleMock = vi.spyOn(logger, "warn"); }); afterEach(() => { consoleMock.mockRestore(); }); it.each(["-0", "-1.15", "-1e-5", "1", "1.1", "Infinity", "-Infinity"])("accepts string: %s", (value) => { expect(expectNumber(value)).toEqual(parseFloat(value)); }); it.each(["-0abcd", "-1.15abcd", "-1e-5abcd", "1abcd", "1.1abcd", "Infinityabcd", "-Infinityabcd"])( "accepts string: %s", (value) => { expect(expectNumber(value)).toEqual(parseFloat(value)); expect(logger.warn).toHaveBeenCalled(); } ); }); describe("rejects non-numbers", () => { it.each(["NaN", true, false, [], {}])("rejects %s", (value) => { expect(() => expectNumber(value)).toThrowError(); }); }); }); describe("expectFloat32", () => { describe("accepts numbers", () => { it.each([ 1, 1.1, Infinity, -Infinity, // Smallest positive subnormal number 2 ** -149, // Largest subnormal number 2 ** -126 * (1 - 2 ** -23), // Smallest positive normal number 2 ** -126, // Largest normal number 2 ** 127 * (2 - 2 ** -23), // Largest number less than one 1 - 2 ** -24, // Smallest number larger than one 1 + 2 ** -23, ])("accepts %s", (value) => { expect(expectNumber(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectNumber(value)).toEqual(undefined); }); describe("rejects non-numbers", () => { it.each([true, false, [], {}])("rejects %s", (value) => { expect(() => expectNumber(value)).toThrowError(); }); }); describe("rejects doubles", () => { it.each([2 ** 128, -(2 ** 128)])("rejects %s", (value) => { expect(() => expectFloat32(value)).toThrowError(); }); }); }); describe("expectLong", () => { describe("accepts 64-bit integers", () => { it.each([ 1, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, 2 ** 31 - 1, -(2 ** 31), 2 ** 15 - 1, -(2 ** 15), 127, -128, ])("accepts %s", (value) => { expect(expectLong(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectLong(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([1.1, "1", "1.1", NaN, true, [], {}])("rejects %s", (value) => { expect(() => expectLong(value)).toThrowError(); }); }); }); describe("expectInt32", () => { describe("accepts 32-bit integers", () => { it.each([1, 2 ** 31 - 1, -(2 ** 31), 2 ** 15 - 1, -(2 ** 15), 127, -128])("accepts %s", (value) => { expect(expectInt32(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectInt32(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1", "1.1", NaN, true, [], {}, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, 2 ** 31, -(2 ** 31 + 1), ])("rejects %s", (value) => { expect(() => expectInt32(value)).toThrowError(); }); }); }); describe("expectShort", () => { describe("accepts 16-bit integers", () => { it.each([1, 2 ** 15 - 1, -(2 ** 15), 127, -128])("accepts %s", (value) => { expect(expectShort(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectShort(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1", "1.1", NaN, true, [], {}, 2 ** 63 - 1, -(2 ** 63 + 1), 2 ** 31 - 1, -(2 ** 31 + 1), 2 ** 15, -(2 ** 15 + 1), ])("rejects %s", (value) => { expect(() => expectShort(value)).toThrowError(); }); }); }); describe("expectByte", () => { describe("accepts 8-bit integers", () => { it.each([1, 127, -128])("accepts %s", (value) => { expect(expectByte(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectByte(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1", "1.1", NaN, true, [], {}, Number.MAX_SAFE_INTEGER, Number.MIN_SAFE_INTEGER, 2 ** 31 - 1, -(2 ** 31 + 1), 2 ** 15 - 1, -(2 ** 15 + 1), 128, -129, ])("rejects %s", (value) => { expect(() => expectByte(value)).toThrowError(); }); }); }); describe("expectNonNull", () => { it.each([1, 1.1, "1", NaN, true, [], ["a", 123], { a: 123 }, [{ a: 123 }], "{ a : 123 }", '{"a":123}'])( "accepts %s", (value) => { expect(expectNonNull(value)).toEqual(value); } ); it.each([null, undefined])("rejects %s", (value) => { expect(() => expectNonNull(value)).toThrowError(); }); }); describe("expectObject", () => { it("accepts objects", () => { expect(expectObject({ a: 123 })).toEqual({ a: 123 }); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectObject(value)).toEqual(undefined); }); describe("rejects non-objects", () => { it.each([1, 1.1, "1", NaN, true, [], ["a", 123], [{ a: 123 }], "{ a : 123 }", '{"a":123}'])( "rejects %s", (value) => { expect(() => expectObject(value)).toThrowError(); } ); }); }); describe("expectString", () => { it("accepts strings", () => { expect(expectString("foo")).toEqual("foo"); }); it.each([null, undefined])("accepts %s", (value) => { expect(expectString(value)).toEqual(undefined); }); describe("reluctantly", () => { let consoleMock: any; beforeEach(() => { consoleMock = vi.spyOn(logger, "warn"); }); afterEach(() => { consoleMock.mockRestore(); }); it.each([1, NaN, Infinity, -Infinity, true, false])("accepts numbers or booleans: %s", (value) => { expect(expectString(value)).toEqual(String(value)); expect(logger.warn).toHaveBeenCalled(); }); }); describe("rejects non-strings", () => { it.each([[], {}])("rejects %s", (value) => { expect(() => expectString(value)).toThrowError(); }); }); }); describe("expectUnion", () => { it.each([null, undefined])("accepts %s", (value) => { expect(expectUnion(value)).toEqual(undefined); }); describe("rejects non-objects", () => { it.each([1, NaN, Infinity, -Infinity, true, false, [], "abc"])("%s", (value) => { expect(() => expectUnion(value)).toThrowError(); }); }); describe("rejects malformed unions", () => { it.each([{}, { a: null }, { a: undefined }, { a: 1, b: 2 }])("%s", (value) => { expect(() => expectUnion(value)).toThrowError(); }); }); describe("accepts unions", () => { it.each([{ a: 1 }, { a: 1, b: null }])("%s", (value) => { expect(expectUnion(value)).toEqual(value); }); }); }); describe("strictParseDouble", () => { it("accepts non-numeric floats as strings", () => { expect(strictParseDouble("Infinity")).toEqual(Infinity); expect(strictParseDouble("-Infinity")).toEqual(-Infinity); expect(strictParseDouble("NaN")).toEqual(NaN); }); describe("rejects implicit NaN", () => { it.each([ "foo", "123ABC", "ABC123", "12AB3C", "1.A", "1.1A", "1.1A1", "0xFF", "0XFF", "0b1111", "0B1111", "0777", "0o777", "0O777", "1n", "1N", "1_000", "e", "e1", ".1", ])("rejects %s", (value) => { expect(() => strictParseDouble(value)).toThrowError(); }); }); it("accepts numeric strings", () => { expect(strictParseDouble("1")).toEqual(1); expect(strictParseDouble("-1")).toEqual(-1); expect(strictParseDouble("1.1")).toEqual(1.1); expect(strictParseDouble("1e1")).toEqual(10); expect(strictParseDouble("-1e1")).toEqual(-10); expect(strictParseDouble("1e+1")).toEqual(10); expect(strictParseDouble("1e-1")).toEqual(0.1); expect(strictParseDouble("1E1")).toEqual(10); expect(strictParseDouble("1E+1")).toEqual(10); expect(strictParseDouble("1E-1")).toEqual(0.1); }); describe("accepts numbers", () => { it.each([1, 1.1, Infinity, -Infinity, NaN])("accepts %s", (value) => { expect(strictParseDouble(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(strictParseDouble(value as any)).toEqual(undefined); }); }); describe("strictParseFloat32", () => { it("accepts non-numeric floats as strings", () => { expect(strictParseFloat32("Infinity")).toEqual(Infinity); expect(strictParseFloat32("-Infinity")).toEqual(-Infinity); expect(strictParseFloat32("NaN")).toEqual(NaN); }); describe("rejects implicit NaN", () => { it.each([ "foo", "123ABC", "ABC123", "12AB3C", "1.A", "1.1A", "1.1A1", "0xFF", "0XFF", "0b1111", "0B1111", "0777", "0o777", "0O777", "1n", "1N", "1_000", "e", "e1", ".1", ])("rejects %s", (value) => { expect(() => strictParseFloat32(value)).toThrowError(); }); }); describe("rejects doubles", () => { it.each([2 ** 128, -(2 ** 128)])("rejects %s", (value) => { expect(() => strictParseFloat32(value)).toThrowError(); }); }); it("accepts numeric strings", () => { expect(strictParseFloat32("1")).toEqual(1); expect(strictParseFloat32("-1")).toEqual(-1); expect(strictParseFloat32("1.1")).toEqual(1.1); expect(strictParseFloat32("1e1")).toEqual(10); expect(strictParseFloat32("-1e1")).toEqual(-10); expect(strictParseFloat32("1e+1")).toEqual(10); expect(strictParseFloat32("1e-1")).toEqual(0.1); expect(strictParseFloat32("1E1")).toEqual(10); expect(strictParseFloat32("1E+1")).toEqual(10); expect(strictParseFloat32("1E-1")).toEqual(0.1); }); describe("accepts numbers", () => { it.each([1, 1.1, Infinity, -Infinity, NaN])("accepts %s", (value) => { expect(strictParseFloat32(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value) => { expect(strictParseFloat32(value as any)).toEqual(undefined); }); }); describe("limitedParseDouble", () => { it("accepts non-numeric floats as strings", () => { expect(limitedParseDouble("Infinity")).toEqual(Infinity); expect(limitedParseDouble("-Infinity")).toEqual(-Infinity); expect(limitedParseDouble("NaN")).toEqual(NaN); }); it("rejects implicit NaN", () => { expect(() => limitedParseDouble("foo")).toThrowError(); }); describe("rejects numeric strings", () => { it.each(["1", "1.1"])("rejects %s", (value) => { expect(() => limitedParseDouble(value)).toThrowError(); }); }); describe("accepts numbers", () => { it.each([ 1, 1.1, Infinity, -Infinity, NaN, // Smallest positive subnormal number 2 ** -1074, // Largest subnormal number 2 ** -1022 * (1 - 2 ** -52), // Smallest positive normal number 2 ** -1022, // Largest number 2 ** 1023 * (1 + (1 - 2 ** -52)), // Largest number less than one 1 - 2 ** -53, // Smallest number larger than one 1 + 2 ** -52, ])("accepts %s", (value) => { expect(limitedParseDouble(value)).toEqual(value); }); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(limitedParseDouble(value)).toEqual(undefined); }); }); describe("limitedParseFloat32", () => { it("accepts non-numeric floats as strings", () => { expect(limitedParseFloat32("Infinity")).toEqual(Infinity); expect(limitedParseFloat32("-Infinity")).toEqual(-Infinity); expect(limitedParseFloat32("NaN")).toEqual(NaN); }); it("rejects implicit NaN", () => { expect(() => limitedParseFloat32("foo")).toThrowError(); }); describe("rejects numeric strings", () => { it.each(["1", "1.1"])("rejects %s", (value) => { expect(() => limitedParseFloat32(value)).toThrowError(); }); }); describe("accepts numbers", () => { it.each([ 1, 1.1, Infinity, -Infinity, NaN, // Smallest positive subnormal number 2 ** -149, // Largest subnormal number 2 ** -126 * (1 - 2 ** -23), // Smallest positive normal number 2 ** -126, // Largest normal number 2 ** 127 * (2 - 2 ** -23), // Largest number less than one 1 - 2 ** -24, // Smallest number larger than one 1 + 2 ** -23, ])("accepts %s", (value) => { expect(limitedParseFloat32(value)).toEqual(value); }); }); describe("rejects doubles", () => { it.each([2 ** 128, -(2 ** 128)])("rejects %s", (value) => { expect(() => limitedParseFloat32(value)).toThrowError(); }); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(limitedParseFloat32(value)).toEqual(undefined); }); }); describe("strictParseLong", () => { describe("accepts integers", () => { describe("accepts 64-bit integers", () => { it.each([1, 2 ** 63 - 1, -(2 ** 63), 2 ** 31 - 1, -(2 ** 31), 2 ** 15 - 1, -(2 ** 15), 127, -128])( "accepts %s", (value) => { expect(strictParseLong(value)).toEqual(value); } ); }); expect(strictParseLong("1")).toEqual(1); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(strictParseLong(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1.1", "NaN", "Infinity", "-Infinity", NaN, Infinity, -Infinity, true, false, [], {}, "foo", "123ABC", "ABC123", "12AB3C", ])("rejects %s", (value) => { expect(() => strictParseLong(value as any)).toThrowError(); }); }); }); describe("strictParseInt32", () => { describe("accepts integers", () => { describe("accepts 32-bit integers", () => { it.each([1, 2 ** 31 - 1, -(2 ** 31), 2 ** 15 - 1, -(2 ** 15), 127, -128])("accepts %s", (value) => { expect(strictParseInt32(value)).toEqual(value); }); }); expect(strictParseInt32("1")).toEqual(1); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(strictParseInt32(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1.1", "NaN", "Infinity", "-Infinity", NaN, Infinity, -Infinity, true, false, [], {}, 2 ** 63 - 1, -(2 ** 63 + 1), 2 ** 31, -(2 ** 31 + 1), "foo", "123ABC", "ABC123", "12AB3C", ])("rejects %s", (value) => { expect(() => strictParseInt32(value as any)).toThrowError(); }); }); }); describe("strictParseShort", () => { describe("accepts integers", () => { describe("accepts 16-bit integers", () => { it.each([1, 2 ** 15 - 1, -(2 ** 15), 127, -128])("accepts %s", (value) => { expect(strictParseShort(value)).toEqual(value); }); }); expect(strictParseShort("1")).toEqual(1); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(strictParseShort(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1.1", "NaN", "Infinity", "-Infinity", NaN, Infinity, -Infinity, true, false, [], {}, 2 ** 63 - 1, -(2 ** 63 + 1), 2 ** 31 - 1, -(2 ** 31 + 1), 2 ** 15, -(2 ** 15 + 1), "foo", "123ABC", "ABC123", "12AB3C", ])("rejects %s", (value) => { expect(() => strictParseShort(value as any)).toThrowError(); }); }); }); describe("strictParseByte", () => { describe("accepts integers", () => { describe("accepts 8-bit integers", () => { it.each([1, 127, -128])("accepts %s", (value) => { expect(strictParseByte(value)).toEqual(value); }); }); expect(strictParseByte("1")).toEqual(1); }); it.each([null, undefined])("accepts %s", (value: any) => { expect(strictParseByte(value)).toEqual(undefined); }); describe("rejects non-integers", () => { it.each([ 1.1, "1.1", "NaN", "Infinity", "-Infinity", NaN, Infinity, -Infinity, true, false, [], {}, 2 ** 63 - 1, -(2 ** 63 + 1), 2 ** 31 - 1, -(2 ** 31 + 1), 2 ** 15, -(2 ** 15 + 1), 128, -129, "foo", "123ABC", "ABC123", "12AB3C", ])("rejects %s", (value) => { expect(() => strictParseByte(value as any)).toThrowError(); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/parse-utils.ts ================================================ /** * Give an input string, strictly parses a boolean value. * * @internal * @param value - The boolean string to parse. * @returns true for "true", false for "false", otherwise an error is thrown. */ export const parseBoolean = (value: string): boolean => { switch (value) { case "true": return true; case "false": return false; default: throw new Error(`Unable to parse boolean value "${value}"`); } }; /** * Asserts a value is a boolean and returns it. * Casts strings and numbers with a warning if there is evidence that they were * intended to be booleans. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be a boolean. * @returns The value if it's a boolean, undefined if it's null/undefined, */ export const expectBoolean = (value: any): boolean | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value === "number") { if (value === 0 || value === 1) { logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); } if (value === 0) { return false; } if (value === 1) { return true; } } if (typeof value === "string") { const lower = value.toLowerCase(); if (lower === "false" || lower === "true") { logger.warn(stackTraceWarning(`Expected boolean, got ${typeof value}: ${value}`)); } if (lower === "false") { return false; } if (lower === "true") { return true; } } if (typeof value === "boolean") { return value; } throw new TypeError(`Expected boolean, got ${typeof value}: ${value}`); }; /** * Asserts a value is a number and returns it. * Casts strings with a warning if the string is a parseable number. * This is to unblock slight API definition/implementation inconsistencies. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be a number. * @returns The value if it's a number, undefined if it's null/undefined, */ export const expectNumber = (value: any): number | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value === "string") { const parsed = parseFloat(value); if (!Number.isNaN(parsed)) { if (String(parsed) !== String(value)) { logger.warn(stackTraceWarning(`Expected number but observed string: ${value}`)); } return parsed; } } if (typeof value === "number") { return value; } throw new TypeError(`Expected number, got ${typeof value}: ${value}`); }; const MAX_FLOAT = Math.ceil(2 ** 127 * (2 - 2 ** -23)); /** * Asserts a value is a 32-bit float and returns it. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be a 32-bit float. * @returns The value if it's a float, undefined if it's null/undefined, */ export const expectFloat32 = (value: any): number | undefined => { const expected = expectNumber(value); if (expected !== undefined && !Number.isNaN(expected) && expected !== Infinity && expected !== -Infinity) { // IEEE-754 is an imperfect representation for floats. Consider the simple // value `0.1`. The representation in a 32-bit float would look like: // // 0 01111011 10011001100110011001101 // Actual value: 0.100000001490116119384765625 // // Note the repeating pattern of `1001` in the fraction part. The 64-bit // representation is similar: // // 0 01111111011 1001100110011001100110011001100110011001100110011010 // Actual value: 0.100000000000000005551115123126 // // So even for what we consider simple numbers, the representation differs // between the two formats. And it's non-obvious how one might look at the // 64-bit value (which is how JS represents numbers) and determine if it // can be represented reasonably in the 32-bit form. Primarily because you // can't know whether the intent was to represent `0.1` or the actual // value in memory. But even if you have both the decimal value and the // double value, that still doesn't communicate the intended precision. // // So rather than attempting to divine the intent of the caller, we instead // do some simple bounds checking to make sure the value is passingly // representable in a 32-bit float. It's not perfect, but it's good enough. // Perfect, even if possible to achieve, would likely be too costly to // be worth it. // // The maximum value of a 32-bit float. Since the 64-bit representation // could be more or less, we just round it up to the nearest whole number. // This further reduces our ability to be certain of the value, but it's // an acceptable tradeoff. // // Compare against the absolute value to simplify things. if (Math.abs(expected) > MAX_FLOAT) { throw new TypeError(`Expected 32-bit float, got ${value}`); } } return expected; }; /** * Asserts a value is an integer and returns it. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be an integer. * @returns The value if it's an integer, undefined if it's null/undefined, */ export const expectLong = (value: any): number | undefined => { if (value === null || value === undefined) { return undefined; } if (Number.isInteger(value) && !Number.isNaN(value)) { return value; } throw new TypeError(`Expected integer, got ${typeof value}: ${value}`); }; /** * @internal * * @deprecated Use expectLong */ export const expectInt = expectLong; /** * Asserts a value is a 32-bit integer and returns it. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be an integer. * @returns The value if it's an integer, undefined if it's null/undefined, */ export const expectInt32 = (value: any): number | undefined => expectSizedInt(value, 32); /** * Asserts a value is a 16-bit integer and returns it. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be an integer. * @returns The value if it's an integer, undefined if it's null/undefined, */ export const expectShort = (value: any): number | undefined => expectSizedInt(value, 16); /** * Asserts a value is an 8-bit integer and returns it. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be an integer. * @returns The value if it's an integer, undefined if it's null/undefined, */ export const expectByte = (value: any): number | undefined => expectSizedInt(value, 8); type IntSize = 32 | 16 | 8; const expectSizedInt = (value: any, size: IntSize): number | undefined => { const expected = expectLong(value); if (expected !== undefined && castInt(expected, size) !== expected) { throw new TypeError(`Expected ${size}-bit integer, got ${value}`); } return expected; }; const castInt = (value: number, size: IntSize) => { switch (size) { case 32: return Int32Array.of(value)[0]; case 16: return Int16Array.of(value)[0]; case 8: return Int8Array.of(value)[0]; } }; /** * Asserts a value is not null or undefined and returns it, or throws an error. * * @internal * @param value - A value that is expected to be defined * @param location - The location where we're expecting to find a defined object (optional) * @returns The value if it's not undefined, otherwise throws an error */ export const expectNonNull = (value: T | null | undefined, location?: string): T => { if (value === null || value === undefined) { if (location) { throw new TypeError(`Expected a non-null value for ${location}`); } throw new TypeError("Expected a non-null value"); } return value; }; /** * Asserts a value is an JSON-like object and returns it. This is expected to be used * with values parsed from JSON (arrays, objects, numbers, strings, booleans). * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be an object * @returns The value if it's an object, undefined if it's null/undefined, */ export const expectObject = (value: any): Record | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value === "object" && !Array.isArray(value)) { return value; } const receivedType = Array.isArray(value) ? "array" : typeof value; throw new TypeError(`Expected object, got ${receivedType}: ${value}`); }; /** * Asserts a value is a string and returns it. * Numbers and boolean will be cast to strings with a warning. * otherwise an error is thrown. * * @internal * @param value - A value that is expected to be a string. * @returns The value if it's a string, undefined if it's null/undefined, */ export const expectString = (value: any): string | undefined => { if (value === null || value === undefined) { return undefined; } if (typeof value === "string") { return value; } if (["boolean", "number", "bigint"].includes(typeof value)) { logger.warn(stackTraceWarning(`Expected string, got ${typeof value}: ${value}`)); return String(value); } throw new TypeError(`Expected string, got ${typeof value}: ${value}`); }; /** * Asserts a value is a JSON-like object with only one non-null/non-undefined key and * returns it. * non-undefined key. * an error is thrown. * * @internal * @param value - A value that is expected to be an object with exactly one non-null, * @returns the value if it's a union, undefined if it's null/undefined, otherwise */ export const expectUnion = (value: unknown): Record | undefined => { if (value === null || value === undefined) { return undefined; } const asObject = expectObject(value)!; const setKeys = []; for (const k in asObject) { if (asObject[k] != null) { setKeys.push(k); } } if (setKeys.length === 0) { throw new TypeError(`Unions must have exactly one non-null member. None were found.`); } if (setKeys.length > 1) { throw new TypeError(`Unions must have exactly one non-null member. Keys ${setKeys} were not null.`); } return asObject; }; /** * Parses a value into a double. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by the standard * parseFloat with one exception: NaN may only be explicitly set as the string * "NaN", any implicit Nan values will result in an error being thrown. If any * other type is provided, an exception will be thrown. * * @internal * @param value - A number or string representation of a double. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseDouble = (value: string | number): number | undefined => { if (typeof value == "string") { return expectNumber(parseNumber(value)); } return expectNumber(value); }; /** * @internal * * @deprecated Use strictParseDouble */ export const strictParseFloat = strictParseDouble; /** * Parses a value into a float. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by the standard * parseFloat with one exception: NaN may only be explicitly set as the string * "NaN", any implicit Nan values will result in an error being thrown. If any * other type is provided, an exception will be thrown. * * @internal * @param value - A number or string representation of a float. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseFloat32 = (value: string | number): number | undefined => { if (typeof value == "string") { return expectFloat32(parseNumber(value)); } return expectFloat32(value); }; // This regex matches JSON-style numbers. In short: // * The integral may start with a negative sign, but not a positive one // * No leading 0 on the integral unless it's immediately followed by a '.' // * Exponent indicated by a case-insensitive 'E' optionally followed by a // positive/negative sign and some number of digits. // It also matches both positive and negative infinity as well and explicit NaN. const NUMBER_REGEX = /(-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)|(-?Infinity)|(NaN)/g; const parseNumber = (value: string): number => { const matches = value.match(NUMBER_REGEX); if (matches === null || matches[0].length !== value.length) { throw new TypeError(`Expected real number, got implicit NaN`); } return parseFloat(value); }; /** * Asserts a value is a number and returns it. If the value is a string * representation of a non-numeric number type (NaN, Infinity, -Infinity), * the value will be parsed. Any other string value will result in an exception * being thrown. Null or undefined will be returned as undefined. Any other * type will result in an exception being thrown. * * @internal * @param value - A number or string representation of a non-numeric float. * @returns The value as a number, or undefined if it's null/undefined. */ export const limitedParseDouble = (value: string | number): number | undefined => { if (typeof value == "string") { return parseFloatString(value); } return expectNumber(value); }; /** * @internal * * @deprecated Use limitedParseDouble */ export const handleFloat = limitedParseDouble; /** * @internal * * @deprecated Use limitedParseDouble */ export const limitedParseFloat = limitedParseDouble; /** * Asserts a value is a 32-bit float and returns it. If the value is a string * representation of a non-numeric number type (NaN, Infinity, -Infinity), * the value will be parsed. Any other string value will result in an exception * being thrown. Null or undefined will be returned as undefined. Any other * type will result in an exception being thrown. * * @internal * @param value - A number or string representation of a non-numeric float. * @returns The value as a number, or undefined if it's null/undefined. */ export const limitedParseFloat32 = (value: string | number): number | undefined => { if (typeof value == "string") { return parseFloatString(value); } return expectFloat32(value); }; const parseFloatString = (value: string): number => { switch (value) { case "NaN": return NaN; case "Infinity": return Infinity; case "-Infinity": return -Infinity; default: throw new Error(`Unable to parse float value: ${value}`); } }; /** * Parses a value into an integer. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by parseFloat * and the result will be asserted to be an integer. If the parsed value is not * an integer, or the raw value is any type other than a string or number, an * exception will be thrown. * * @internal * @param value - A number or string representation of an integer. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseLong = (value: string | number): number | undefined => { if (typeof value === "string") { // parseInt can't be used here, because it will silently discard any // existing decimals. We want to instead throw an error if there are any. return expectLong(parseNumber(value)); } return expectLong(value); }; /** * @internal * * @deprecated Use strictParseLong */ export const strictParseInt = strictParseLong; /** * Parses a value into a 32-bit integer. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by parseFloat * and the result will be asserted to be an integer. If the parsed value is not * an integer, or the raw value is any type other than a string or number, an * exception will be thrown. * * @internal * @param value - A number or string representation of a 32-bit integer. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseInt32 = (value: string | number): number | undefined => { if (typeof value === "string") { // parseInt can't be used here, because it will silently discard any // existing decimals. We want to instead throw an error if there are any. return expectInt32(parseNumber(value)); } return expectInt32(value); }; /** * Parses a value into a 16-bit integer. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by parseFloat * and the result will be asserted to be an integer. If the parsed value is not * an integer, or the raw value is any type other than a string or number, an * exception will be thrown. * * @internal * @param value - A number or string representation of a 16-bit integer. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseShort = (value: string | number): number | undefined => { if (typeof value === "string") { // parseInt can't be used here, because it will silently discard any // existing decimals. We want to instead throw an error if there are any. return expectShort(parseNumber(value)); } return expectShort(value); }; /** * Parses a value into an 8-bit integer. If the value is null or undefined, undefined * will be returned. If the value is a string, it will be parsed by parseFloat * and the result will be asserted to be an integer. If the parsed value is not * an integer, or the raw value is any type other than a string or number, an * exception will be thrown. * * @internal * @param value - A number or string representation of an 8-bit integer. * @returns The value as a number, or undefined if it's null/undefined. */ export const strictParseByte = (value: string | number): number | undefined => { if (typeof value === "string") { // parseInt can't be used here, because it will silently discard any // existing decimals. We want to instead throw an error if there are any. return expectByte(parseNumber(value)); } return expectByte(value); }; /** * @internal * @param message - error message. * @returns truncated stack trace omitting this function. */ const stackTraceWarning = (message: string): string => { return String(new TypeError(message).stack || message) .split("\n") .slice(0, 5) .filter((s) => !s.includes("stackTraceWarning")) .join("\n"); }; /** * @internal */ export const logger = { warn: console.warn, }; ================================================ FILE: packages/core/src/submodules/serde/quote-header.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { quoteHeader } from "./quote-header"; describe(quoteHeader.name, () => { it("should not wrap header elements that don't include the delimiter or double quotes", () => { expect(quoteHeader("bc")).toBe("bc"); }); it("should wrap header elements that include the delimiter", () => { expect(quoteHeader("b,c")).toBe('"b,c"'); }); it("should wrap header elements that include double quotes", () => { expect(quoteHeader(`"bc"`)).toBe('"\\"bc\\""'); }); it("should wrap header elements that include the delimiter and double quotes", () => { expect(quoteHeader(`"b,c"`)).toBe('"\\"b,c\\""'); }); }); ================================================ FILE: packages/core/src/submodules/serde/quote-header.ts ================================================ /** * @public * @param part - header list element * @returns quoted string if part contains delimiter. */ export function quoteHeader(part: string) { if (part.includes(",") || part.includes('"')) { part = `"${part.replace(/"/g, '\\"')}"`; } return part; } ================================================ FILE: packages/core/src/submodules/serde/schema-serde-lib/schema-date-utils.spec.ts ================================================ import { describe, expect, it } from "vitest"; import { _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime } from "./schema-date-utils"; const millisecond = 1; const second = 1000 * millisecond; const minute = 60 * second; const hour = 60 * minute; const day = 24 * hour; const year = 365 * day; describe("_parseEpochTimestamp", () => { it("should parse numeric timestamps", () => { expect(_parseEpochTimestamp(1234567890)).toEqual(new Date(1234567890000)); expect(_parseEpochTimestamp(1234567890.123)).toEqual(new Date(1234567890123)); expect(_parseEpochTimestamp(1234567890.123456)).toEqual(new Date(1234567890123)); }); it("should parse string timestamps", () => { expect(_parseEpochTimestamp("1234567890")).toEqual(new Date(1234567890000)); expect(_parseEpochTimestamp("1234567890.123")).toEqual(new Date(1234567890123)); expect(_parseEpochTimestamp("1234567890.123456")).toEqual(new Date(1234567890123)); }); it("should parse CBOR tag timestamps", () => { expect(_parseEpochTimestamp({ tag: 1, value: 1234567890 })).toEqual(new Date(1234567890000)); expect(_parseEpochTimestamp({ tag: 1, value: 1234567890.123 })).toEqual(new Date(1234567890123)); expect(_parseEpochTimestamp({ tag: 1, value: 1234567890.123456 })).toEqual(new Date(1234567890123)); }); it("should return undefined for null/undefined", () => { expect(_parseEpochTimestamp(null)).toBeUndefined(); expect(_parseEpochTimestamp(undefined)).toBeUndefined(); }); it("should throw for invalid numbers", () => { expect(() => _parseEpochTimestamp("abc")).toThrow(); expect(() => _parseEpochTimestamp(Infinity)).toThrow(); expect(() => _parseEpochTimestamp(NaN)).toThrow(); }); }); describe("_parseRfc3339DateTimeWithOffset", () => { it("should parse UTC timestamps", () => { expect(_parseRfc3339DateTimeWithOffset("2077-12-25T00:00:00Z")).toEqual(new Date(3407616000_000)); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T12:12:12.01Z")).toEqual( new Date(3407616000_000 + 12 * hour + 12 * minute + 12 * second + 10 * millisecond) ); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T23:59:59.999Z")).toEqual( new Date(3407616000_000 + 23 * hour + 59 * minute + 59 * second + 999 * millisecond) ); }); it("should parse timestamps with positive offset", () => { expect(_parseRfc3339DateTimeWithOffset("2077-12-25T00:00:00-04:30")).toEqual(new Date(3407616000_000 + 4.5 * hour)); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T12:12:12.01-04:30")).toEqual( new Date(3407616000_000 + 12 * hour + 12 * minute + 12 * second + 10 * millisecond + 4.5 * hour) ); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T23:59:59.999-04:30")).toEqual( new Date(3407616000_000 + 23 * hour + 59 * minute + 59 * second + 999 * millisecond + 4.5 * hour) ); }); it("should parse timestamps with negative offset", () => { expect(_parseRfc3339DateTimeWithOffset("2077-12-25T00:00:00+05:00")).toEqual(new Date(3407616000_000 - 5 * hour)); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T12:12:12.01+05:00")).toEqual( new Date(3407616000_000 + 12 * hour + 12 * minute + 12 * second + 10 * millisecond - 5 * hour) ); expect(_parseRfc3339DateTimeWithOffset("2077-12-25T23:59:59.999+05:00")).toEqual( new Date(3407616000_000 + 23 * hour + 59 * minute + 59 * second + 999 * millisecond - 5 * hour) ); }); it("should parse timestamps with fractional seconds", () => { expect(_parseRfc3339DateTimeWithOffset("2023-12-25T12:00:00.123Z")).toEqual(new Date("2023-12-25T12:00:00.123Z")); }); it("should return undefined for null/undefined", () => { expect(_parseRfc3339DateTimeWithOffset(null)).toBeUndefined(); expect(_parseRfc3339DateTimeWithOffset(undefined)).toBeUndefined(); }); it("should throw for invalid formats", () => { expect(() => _parseRfc3339DateTimeWithOffset("2023-12-25")).toThrow(); expect(() => _parseRfc3339DateTimeWithOffset(123)).toThrow(); }); }); describe("_parseRfc7231DateTime", () => { it("should parse RFC7231 timestamps", () => { expect(_parseRfc7231DateTime("Mon, 31 Dec 2077 23:59:30 GMT")).toEqual(new Date(3408220800000 - 30 * second)); }); it("should parse timestamps with fractional seconds", () => { expect(_parseRfc7231DateTime("Mon, 31 Dec 2077 23:59:30.123 GMT")).toEqual( new Date(3408220800000 - 29 * second - 877 * millisecond) ); }); it("should parse RFC850 timestamps", () => { expect(_parseRfc7231DateTime("Monday, 31-Dec-77 23:59:30 GMT")).toEqual( new Date(3408220800000 - 100 * year - 25 * day - 30 * second) ); }); it("should parse asctime timestamps", () => { expect(_parseRfc7231DateTime("Mon Dec 31 23:59:30 2077")).toEqual(new Date(3408220800000 - 30 * second)); }); it("should return undefined for null/undefined", () => { expect(_parseRfc7231DateTime(null)).toBeUndefined(); expect(_parseRfc7231DateTime(undefined)).toBeUndefined(); }); it("should throw for invalid formats", () => { expect(() => _parseRfc7231DateTime("2077-12-25T08:49:37Z")).toThrow(); expect(() => _parseRfc7231DateTime(123)).toThrow(); expect(() => _parseRfc7231DateTime("Invalid, 25 Dec 2077 08:49:37 GMT")).toThrow(); }); }); // some invalid values are not validated client side // because of excessive code requirements. const invalidRfc3339DateTimes = [ "85-04-12T23:20:50.52Z", // Year must be 4 digits "985-04-12T23:20:50.52Z", // Year must be 4 digits "1985-13-12T23:20:50.52Z", // Month cannot be greater than 12 "1985-00-12T23:20:50.52Z", // Month cannot be 0 "1985-4-12T23:20:50.52Z", // Month must be 2 digits with leading zero "1985-04-32T23:20:50.52Z", // Day cannot be greater than 31 "1985-04-00T23:20:50.52Z", // Day cannot be 0 "1985-04-05T24:20:50.52Z", // Hours cannot be greater than 23 "1985-04-05T23:61:50.52Z", // Minutes cannot be greater than 59 "1985-04-05T23:20:61.52Z", // Seconds cannot be greater than 59 (except leap second) // "1985-04-31T23:20:50.52Z", // April only has 30 days // "2005-02-29T15:59:59Z", // 2005 was not a leap year, so February only had 28 days "1996-12-19T16:39:57", // Missing timezone offset "Mon, 31 Dec 1990 15:59:60 GMT", // RFC 7231 format, not RFC 3339 "Monday, 31-Dec-90 15:59:60 GMT", // RFC 7231 format, not RFC 3339 "Mon Dec 31 15:59:60 1990", // RFC 7231 format, not RFC 3339 "1985-04-12T23:20:50.52Z1985-04-12T23:20:50.52Z", // Contains multiple timestamps "1985-04-12T23:20:50.52ZA", // Contains invalid characters after timezone "A1985-04-12T23:20:50.52Z", // Contains invalid characters before timestamp ]; describe("parseRfc3339DateTime", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(_parseRfc3339DateTimeWithOffset(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { it("with fractional seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50.52Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520)) ); }); it("without fractional seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0)) ); }); it("with leap seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1990-12-31T15:59:60Z")).toEqual( new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0)) ); }); it("with leap days", () => { expect(_parseRfc3339DateTimeWithOffset("2004-02-29T15:59:59Z")).toEqual( new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0)) ); }); it("with leading zeroes", () => { expect(_parseRfc3339DateTimeWithOffset("0004-02-09T05:09:09.09Z")).toEqual(new Date(-62037600650910)); expect(_parseRfc3339DateTimeWithOffset("0004-02-09T00:00:00.00Z")).toEqual(new Date(-62037619200000)); }); }); it.each(invalidRfc3339DateTimes)("rejects %s", (value) => { expect(() => _parseRfc3339DateTimeWithOffset(value)).toThrowError(); }); }); describe("parseRfc3339DateTimeWithOffset", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(_parseRfc3339DateTimeWithOffset(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { it("with fractional seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50.52Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520)) ); }); it("without fractional seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1985-04-12T23:20:50Z")).toEqual( new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0)) ); }); it("with leap seconds", () => { expect(_parseRfc3339DateTimeWithOffset("1990-12-31T15:59:60Z")).toEqual( new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0)) ); }); it("with leap days", () => { expect(_parseRfc3339DateTimeWithOffset("2004-02-29T15:59:59Z")).toEqual( new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0)) ); }); it("with leading zeroes", () => { expect(_parseRfc3339DateTimeWithOffset("0104-02-09T05:09:09.09Z")).toEqual( new Date(Date.UTC(104, 1, 9, 5, 9, 9, 90)) ); expect(_parseRfc3339DateTimeWithOffset("0104-02-09T00:00:00.00Z")).toEqual( new Date(Date.UTC(104, 1, 9, 0, 0, 0, 0)) ); }); it("with negative offset", () => { expect(_parseRfc3339DateTimeWithOffset("2019-12-16T22:48:18-01:02")).toEqual( new Date(Date.UTC(2019, 11, 16, 23, 50, 18, 0)) ); }); it("with positive offset", () => { expect(_parseRfc3339DateTimeWithOffset("2019-12-16T22:48:18+02:04")).toEqual( new Date(Date.UTC(2019, 11, 16, 20, 44, 18, 0)) ); }); }); it.each(invalidRfc3339DateTimes)("rejects %s", (value) => { expect(() => _parseRfc3339DateTimeWithOffset(value)).toThrowError(); }); }); describe("_parseRfc7231DateTime", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(_parseRfc7231DateTime(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { describe("with fractional seconds", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 08:49:37.52 GMT"], ["rfc-850", "Sunday, 06-Nov-94 08:49:37.52 GMT"], ["asctime", "Sun Nov 6 08:49:37.52 1994"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 520))); }); }); describe("with fractional seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 8:49:37.52 GMT"], ["rfc-850", "Sunday, 06-Nov-94 8:49:37.52 GMT"], ["asctime", "Sun Nov 6 8:49:37.52 1994"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 520))); }); }); describe("without fractional seconds", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 08:49:37 GMT"], ["rfc-850", "Sunday, 06-Nov-94 08:49:37 GMT"], ["asctime", "Sun Nov 6 08:49:37 1994"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 0))); }); }); describe("without fractional seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 1994 8:49:37 GMT"], ["rfc-850", "Sunday, 06-Nov-94 8:49:37 GMT"], ["asctime", "Sun Nov 6 8:49:37 1994"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1994, 10, 6, 8, 49, 37, 0))); }); }); describe("with leap seconds", () => { it.each([ ["imf-fixdate", "Mon, 31 Dec 1990 15:59:60 GMT"], ["rfc-850", "Monday, 31-Dec-90 15:59:60 GMT"], ["asctime", "Mon Dec 31 15:59:60 1990"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1990, 11, 31, 15, 59, 60, 0))); }); }); describe("with leap seconds - single digit hour", () => { it.each([ ["imf-fixdate", "Mon, 31 Dec 1990 8:59:60 GMT"], ["rfc-850", "Monday, 31-Dec-90 8:59:60 GMT"], ["asctime", "Mon Dec 31 8:59:60 1990"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(1990, 11, 31, 8, 59, 60, 0))); }); }); describe("with leap days", () => { it.each([ ["imf-fixdate", "Sun, 29 Feb 2004 15:59:59 GMT"], ["asctime", "Sun Feb 29 15:59:59 2004"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(2004, 1, 29, 15, 59, 59, 0))); }); }); describe("with leap days - single digit hour", () => { it.each([ ["imf-fixdate", "Sun, 29 Feb 2004 8:59:59 GMT"], ["asctime", "Sun Feb 29 8:59:59 2004"], ])("in format %s", (_, value) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(2004, 1, 29, 8, 59, 59, 0))); }); }); describe("with leading zeroes", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 0104 08:09:07.02 GMT", 104], ["rfc-850", "Sunday, 06-Nov-04 08:09:07.02 GMT", 1904], ["asctime", "Sun Nov 6 08:09:07.02 0104", 104], ])("in format %s", (_, value, year) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(year, 10, 6, 8, 9, 7, 20))); }); }); describe("with all-zero components", () => { it.each([ ["imf-fixdate", "Sun, 06 Nov 0104 00:00:00.00 GMT", 104], ["rfc-850", "Sunday, 06-Nov-94 00:00:00.00 GMT", 1994], ["asctime", "Sun Nov 6 00:00:00.00 0104", 104], ])("in format %s", (_, value, year) => { expect(_parseRfc7231DateTime(value)).toEqual(new Date(Date.UTC(year, 10, 6, 0, 0, 0, 0))); }); }); }); // note: some edge cases are not handled because the amount of code needed to enforce // them client-side is excessive. We trust our services' response values. it.each([ "1985-04-12T23:20:50.52Z", // RFC 3339 format, not RFC 7231 "1985-04-12T23:20:50Z", // RFC 3339 format, not RFC 7231 "Sun, 06 Nov 0004 08:09:07.02 GMTSun, 06 Nov 0004 08:09:07.02 GMT", // Contains multiple timestamps "Sun, 06 Nov 0004 08:09:07.02 GMTA", // Contains invalid characters after GMT "ASun, 06 Nov 0004 08:09:07.02 GMT", // Contains invalid characters before timestamp "Sun, 06 Nov 94 08:49:37 GMT", // Year must be 4 digits "Sun, 06 Dov 1994 08:49:37 GMT", // Invalid month name "Mun, 06 Nov 1994 08:49:37 GMT", // Invalid day name // "Sunday, 06 Nov 1994 08:49:37 GMT", // Wrong format - uses full day name in IMF-fixdate format "Sun, 06 November 1994 08:49:37 GMT", // Wrong format - uses full month name "Sun, 06 Nov 1994 24:49:37 GMT", // Hours cannot be 24 "Sun, 06 Nov 1994 08:69:37 GMT", // Minutes cannot be > 59 "Sun, 06 Nov 1994 08:49:67 GMT", // Seconds cannot be > 60 (60 only allowed for leap second) "Sun, 06-11-1994 08:49:37 GMT", // Wrong date format - uses dashes instead of spaces "Sun, 06 11 1994 08:49:37 GMT", // Wrong format - uses numeric month instead of abbreviated name // "Sun, 31 Nov 1994 08:49:37 GMT", // Invalid date - November has 30 days // "Sun, 29 Feb 2005 15:59:59 GMT", // Invalid date - 2005 was not a leap year "Sunday, 06-Nov-04 08:09:07.02 GMTSunday, 06-Nov-04 08:09:07.02 GMT", // Contains multiple timestamps "ASunday, 06-Nov-04 08:09:07.02 GMT", // Contains invalid characters before timestamp "Sunday, 06-Nov-04 08:09:07.02 GMTA", // Contains invalid characters after GMT "Sunday, 06-Nov-1994 08:49:37 GMT", // Wrong format - uses 4 digit year in RFC 850 format "Sunday, 06-Dov-94 08:49:37 GMT", // Invalid month name "Sundae, 06-Nov-94 08:49:37 GMT", // Invalid day name // "Sun, 06-Nov-94 08:49:37 GMT", // Wrong format - uses abbreviated day name in RFC 850 format "Sunday, 06-November-94 08:49:37 GMT", // Wrong format - uses full month name "Sunday, 06-Nov-94 24:49:37 GMT", // Hours cannot be 24 "Sunday, 06-Nov-94 08:69:37 GMT", // Minutes cannot be > 59 "Sunday, 06-Nov-94 08:49:67 GMT", // Seconds cannot be > 60 (60 only allowed for leap second) "Sunday, 06 11 94 08:49:37 GMT", // Wrong format - uses spaces instead of dashes "Sunday, 06-11-1994 08:49:37 GMT", // Wrong format - uses numeric month and 4 digit year // "Sunday, 31-Nov-94 08:49:37 GMT", // Invalid date - November has 30 days // "Sunday, 29-Feb-05 15:59:59 GMT", // Invalid date - 2005 was not a leap year "Sun Nov 6 08:09:07.02 0004Sun Nov 6 08:09:07.02 0004", // Contains multiple timestamps "ASun Nov 6 08:09:07.02 0004", // Contains invalid characters before timestamp "Sun Nov 6 08:09:07.02 0004A", // Contains invalid characters after timestamp "Sun Nov 6 08:49:37 94", // Year must be 4 digits in asctime format "Sun Dov 6 08:49:37 1994", // Invalid month name "Mun Nov 6 08:49:37 1994", // Invalid day name // "Sunday Nov 6 08:49:37 1994", // Wrong format - uses full day name "Sun November 6 08:49:37 1994", // Wrong format - uses full month name "Sun Nov 6 24:49:37 1994", // Hours cannot be 24 "Sun Nov 6 08:69:37 1994", // Minutes cannot be > 59 "Sun Nov 6 08:49:67 1994", // Seconds cannot be > 60 (60 only allowed for leap second) "Sun 06-11 08:49:37 1994", // Wrong format - uses dashes in date "Sun 06 11 08:49:37 1994", // Wrong format - uses numeric month "Sun 11 6 08:49:37 1994", // Wrong format - month and day in wrong order // "Sun Nov 31 08:49:37 1994", // Invalid date - November has 30 days // "Sun Feb 29 15:59:59 2005", // Invalid date - 2005 was not a leap year "Sun Nov 6 08:49:37 1994", // Wrong format - missing space after single digit day ])("rejects %s", (value) => { expect(() => _parseRfc7231DateTime(value)).toThrowError(); }); }); describe("_parseEpochTimestamp", () => { it.each([null, undefined])("returns undefined for %s", (value) => { expect(_parseEpochTimestamp(value)).toBeUndefined(); }); describe("parses properly formatted dates", () => { describe("with fractional seconds", () => { it.each(["482196050.52", 482196050.52])("parses %s", (value) => { expect(_parseEpochTimestamp(value)).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 520))); }); }); describe("without fractional seconds", () => { it.each(["482196050", 482196050, 482196050.0])("parses %s", (value) => { expect(_parseEpochTimestamp(value)).toEqual(new Date(Date.UTC(1985, 3, 12, 23, 20, 50, 0))); }); }); }); it.each([ "1985-04-12T23:20:50.52Z", "1985-04-12T23:20:50Z", "Mon, 31 Dec 1990 15:59:60 GMT", "Monday, 31-Dec-90 15:59:60 GMT", "Mon Dec 31 15:59:60 1990", "NaN", NaN, "Infinity", Infinity, "0x42", ])("rejects %s", (value) => { expect(() => _parseEpochTimestamp(value)).toThrowError(); }); }); ================================================ FILE: packages/core/src/submodules/serde/schema-serde-lib/schema-date-utils.ts ================================================ const ddd = `(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)(?:[ne|u?r]?s?day)?`; const mmm = `(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)`; const time = `(\\d?\\d):(\\d{2}):(\\d{2})(?:\\.(\\d+))?`; const date = `(\\d?\\d)`; const year = `(\\d{4})`; const RFC3339_WITH_OFFSET = new RegExp( /^(\d{4})-(\d\d)-(\d\d)[tT](\d\d):(\d\d):(\d\d)(\.(\d+))?(([-+]\d\d:\d\d)|[zZ])$/ ); const IMF_FIXDATE = new RegExp(`^${ddd}, ${date} ${mmm} ${year} ${time} GMT$`); const RFC_850_DATE = new RegExp(`^${ddd}, ${date}-${mmm}-(\\d\\d) ${time} GMT$`); const ASC_TIME = new RegExp(`^${ddd} ${mmm} ( [1-9]|\\d\\d) ${time} ${year}$`); const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a number or a parseable string. * Input strings must be an integer or floating point number. Fractional seconds are supported. * * @internal * @param value - the value to parse * @returns a Date or undefined */ export const _parseEpochTimestamp = (value: unknown): Date | undefined => { if (value == null) { return void 0; } let num: number = NaN; if (typeof value === "number") { num = value; } else if (typeof value === "string") { if (!/^-?\d*\.?\d+$/.test(value)) { throw new TypeError(`parseEpochTimestamp - numeric string invalid.`); } num = Number.parseFloat(value); } else if (typeof value === "object" && (value as { tag: number; value: number }).tag === 1) { // timestamp is a CBOR tag type. num = (value as { tag: number; value: number }).value; } if (isNaN(num) || Math.abs(num) === Infinity) { throw new TypeError("Epoch timestamps must be valid finite numbers."); } return new Date(Math.round(num * 1000)); }; /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a string that can be parsed * as an RFC 3339 date. * Input strings must conform to RFC3339 section 5.6, and can have a UTC * offset. Fractional precision is supported. * * @internal * @see {@link https://xml2rfc.tools.ietf.org/public/rfc/html/rfc3339.html#anchor14} * @param value - the value to parse * @returns a Date or undefined */ export const _parseRfc3339DateTimeWithOffset = (value: unknown): Date | undefined => { if (value == null) { return void 0; } if (typeof value !== "string") { throw new TypeError("RFC3339 timestamps must be strings"); } const matches = RFC3339_WITH_OFFSET.exec(value); if (!matches) { throw new TypeError(`Invalid RFC3339 timestamp format ${value}`); } const [, yearStr, monthStr, dayStr, hours, minutes, seconds, , ms, offsetStr] = matches; range(monthStr, 1, 12); range(dayStr, 1, 31); range(hours, 0, 23); range(minutes, 0, 59); range(seconds, 0, 60); // leap second const date = new Date( Date.UTC( Number(yearStr), Number(monthStr) - 1, Number(dayStr), Number(hours), Number(minutes), Number(seconds), Number(ms) ? Math.round(parseFloat(`0.${ms}`) * 1000) : 0 ) ); date.setUTCFullYear(Number(yearStr)); if (offsetStr.toUpperCase() != "Z") { const [, sign, offsetH, offsetM] = /([+-])(\d\d):(\d\d)/.exec(offsetStr) || [void 0, "+", 0, 0]; const scalar = sign === "-" ? 1 : -1; date.setTime(date.getTime() + scalar * (Number(offsetH) * 60 * 60 * 1000 + Number(offsetM) * 60 * 1000)); } return date; }; /** * Parses a value into a Date. Returns undefined if the input is null or * undefined, throws an error if the input is not a string that can be parsed * as an RFC 7231 date. * Input strings must conform to RFC7231 section 7.1.1.1. Fractional seconds are supported. * RFC 850 and unix asctime formats are also accepted. * todo: practically speaking, are RFC 850 and asctime even used anymore? * todo: can we remove those parts? * * @internal * @see {@link https://datatracker.ietf.org/doc/html/rfc7231.html#section-7.1.1.1} * @param value - the value to parse. * @returns a Date or undefined. */ export const _parseRfc7231DateTime = (value: unknown): Date | undefined => { if (value == null) { return void 0; } if (typeof value !== "string") { throw new TypeError("RFC7231 timestamps must be strings."); } let day!: string; let month!: string; let year!: string; let hour!: string; let minute!: string; let second!: string; let fraction!: string; let matches: string[] | null; if ((matches = IMF_FIXDATE.exec(value))) { // "Mon, 25 Dec 2077 23:59:59 GMT" [, day, month, year, hour, minute, second, fraction] = matches; } else if ((matches = RFC_850_DATE.exec(value))) { // "Monday, 25-Dec-77 23:59:59 GMT" [, day, month, year, hour, minute, second, fraction] = matches; year = (Number(year) + 1900).toString(); } else if ((matches = ASC_TIME.exec(value))) { // "Mon Dec 25 23:59:59 2077" [, month, day, hour, minute, second, fraction, year] = matches; } if (year && second) { const timestamp = Date.UTC( Number(year), months.indexOf(month), Number(day), Number(hour), Number(minute), Number(second), fraction ? Math.round(parseFloat(`0.${fraction}`) * 1000) : 0 ); range(day, 1, 31); range(hour, 0, 23); range(minute, 0, 59); range(second, 0, 60); // leap second const date = new Date(timestamp); date.setUTCFullYear(Number(year)); return date; } throw new TypeError(`Invalid RFC7231 date-time value ${value}.`); }; /** * @internal */ function range(v: number | string, min: number, max: number): void { const _v = Number(v); if (_v < min || _v > max) { throw new Error(`Value ${_v} out of range [${min}, ${max}]`); } } ================================================ FILE: packages/core/src/submodules/serde/split-every.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { splitEvery } from "./split-every"; describe("splitEvery", () => { const m1 = "foo"; const m2 = "foo, bar"; const m3 = "foo, bar, baz"; const m4 = "foo, bar, baz, qux"; const m5 = "foo, bar, baz, qux, coo"; const m6 = "foo, bar, baz, qux, coo, tan"; const delim = ", "; it("Errors on <= 0", () => { expect(() => { splitEvery(m2, delim, -1); }).toThrow("Invalid number of delimiters"); expect(() => { splitEvery(m2, delim, 0); }).toThrow("Invalid number of delimiters"); }); it("Errors on non-integer", () => { expect(() => { splitEvery(m2, delim, 1.3); }).toThrow("Invalid number of delimiters"); expect(() => { splitEvery(m2, delim, 4.9); }).toThrow("Invalid number of delimiters"); }); it("Handles splitting on 1", () => { const count = 1; expect(splitEvery(m1, delim, count)).toMatchObject(m1.split(delim)); expect(splitEvery(m2, delim, count)).toMatchObject(m2.split(delim)); expect(splitEvery(m3, delim, count)).toMatchObject(m3.split(delim)); expect(splitEvery(m4, delim, count)).toMatchObject(m4.split(delim)); expect(splitEvery(m5, delim, count)).toMatchObject(m5.split(delim)); expect(splitEvery(m6, delim, count)).toMatchObject(m6.split(delim)); }); it("Handles splitting on 2", () => { const count = 2; expect(splitEvery(m1, delim, count)).toMatchObject(["foo"]); expect(splitEvery(m2, delim, count)).toMatchObject(["foo, bar"]); expect(splitEvery(m3, delim, count)).toMatchObject(["foo, bar", "baz"]); expect(splitEvery(m4, delim, count)).toMatchObject(["foo, bar", "baz, qux"]); expect(splitEvery(m5, delim, count)).toMatchObject(["foo, bar", "baz, qux", "coo"]); expect(splitEvery(m6, delim, count)).toMatchObject(["foo, bar", "baz, qux", "coo, tan"]); }); it("Handles splitting on 3", () => { const count = 3; expect(splitEvery(m1, delim, count)).toMatchObject(["foo"]); expect(splitEvery(m2, delim, count)).toMatchObject(["foo, bar"]); expect(splitEvery(m3, delim, count)).toMatchObject(["foo, bar, baz"]); expect(splitEvery(m4, delim, count)).toMatchObject(["foo, bar, baz", "qux"]); expect(splitEvery(m5, delim, count)).toMatchObject(["foo, bar, baz", "qux, coo"]); expect(splitEvery(m6, delim, count)).toMatchObject(["foo, bar, baz", "qux, coo, tan"]); }); }); ================================================ FILE: packages/core/src/submodules/serde/split-every.ts ================================================ /** * Given an input string, splits based on the delimiter after a given * number of delimiters has been encountered. * * @internal * @param value - The input string to split. * @param delimiter - The delimiter to split on. * @param numDelimiters - The number of delimiters to have encountered to split. */ export function splitEvery(value: string, delimiter: string, numDelimiters: number): Array { // Fail if we don't have a clear number to split on. if (numDelimiters <= 0 || !Number.isInteger(numDelimiters)) { throw new Error("Invalid number of delimiters (" + numDelimiters + ") for splitEvery."); } const segments = value.split(delimiter); // Short circuit extra logic for the simple case. if (numDelimiters === 1) { return segments; } const compoundSegments: Array = []; let currentSegment = ""; for (let i = 0; i < segments.length; i++) { if (currentSegment === "") { // Start a new segment. currentSegment = segments[i]; } else { // Compound the current segment with the delimiter. currentSegment += delimiter + segments[i]; } if ((i + 1) % numDelimiters === 0) { // We encountered the right number of delimiters, so add the entry. compoundSegments.push(currentSegment); // And reset the current segment. currentSegment = ""; } } // Handle any leftover segment portion. if (currentSegment !== "") { compoundSegments.push(currentSegment); } return compoundSegments; } ================================================ FILE: packages/core/src/submodules/serde/split-header.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { splitHeader } from "./split-header"; describe(splitHeader.name, () => { it("should split a string by commas and trim only the comma delimited outer values", () => { expect(splitHeader("abc")).toEqual(["abc"]); expect(splitHeader("a,b,c")).toEqual(["a", "b", "c"]); expect(splitHeader("a, b, c")).toEqual(["a", "b", "c"]); expect(splitHeader("a , b , c")).toEqual(["a", "b", "c"]); expect(splitHeader(`a , b , " c "`)).toEqual(["a", "b", " c "]); expect(splitHeader(` a , , b`)).toEqual(["a", "", "b"]); expect(splitHeader(`,,`)).toEqual(["", "", ""]); expect(splitHeader(` , , `)).toEqual(["", "", ""]); }); it("should split a string by commas that are not in quotes, and remove outer quotes", () => { expect(splitHeader('"b,c", "\\"def\\"", a')).toEqual(["b,c", '"def"', "a"]); expect(splitHeader('"a,b,c", ""def"", "a,b ,c"')).toEqual(["a,b,c", '"def"', "a,b ,c"]); expect(splitHeader(`""`)).toEqual([``]); expect(splitHeader(``)).toEqual([``]); expect(splitHeader(`\\"`)).toEqual([`"`]); expect(splitHeader(`"`)).toEqual([`"`]); }); }); ================================================ FILE: packages/core/src/submodules/serde/split-header.ts ================================================ /** * @param value - header string value. * @returns value split by commas that aren't in quotes. */ export const splitHeader = (value: string): string[] => { const z = value.length; const values = []; let withinQuotes = false; let prevChar = undefined; let anchor = 0; for (let i = 0; i < z; ++i) { const char = value[i]; switch (char) { case `"`: if (prevChar !== "\\") { withinQuotes = !withinQuotes; } break; case ",": if (!withinQuotes) { values.push(value.slice(anchor, i)); anchor = i + 1; } break; default: } prevChar = char; } values.push(value.slice(anchor)); return values.map((v) => { v = v.trim(); const z = v.length; if (z < 2) { return v; } if (v[0] === `"` && v[z - 1] === `"`) { v = v.slice(1, z - 1); } return v.replace(/\\"/g, '"'); }); }; ================================================ FILE: packages/core/src/submodules/serde/util-base64/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.3.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-buffer-from@4.2.2 - @smithy/util-utf8@4.2.2 ## 4.3.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/util-buffer-from@4.2.1 - @smithy/util-utf8@4.2.1 ## 4.3.0 ### Minor Changes - 813c9a5: refactoring to reduce code size ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/util-buffer-from@4.2.0 - @smithy/util-utf8@4.2.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - @smithy/util-buffer-from@4.1.0 - @smithy/util-utf8@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-buffer-from@4.0.0 - @smithy/util-utf8@4.0.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [671aa704] - @smithy/util-buffer-from@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - @smithy/util-buffer-from@2.2.0 - @smithy/util-utf8@2.3.0 ## 2.2.1 ### Patch Changes - 8e8f3513: allow arrays to stand in for Uint8Array in toBase64 ## 2.2.0 ### Minor Changes - 43f3e1e2: encoders allow string inputs ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/util-buffer-from@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-buffer-from@2.1.0 ## 2.0.1 ### Patch Changes - 5598a033: update bundler replacement directives in package.json ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-buffer-from@2.0.0 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/util-buffer-from@1.1.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-buffer-from@1.0.2 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-buffer-from@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-base64](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-base64/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-base64/__mocks__/testCases.json ================================================ [ ["double padded", "3q2+7w==", [222, 173, 190, 239]], ["single padded", "3q2+7/o=", [222, 173, 190, 239, 250]], ["unpadded", "3q2+7/rO", [222, 173, 190, 239, 250, 206]], ["AAAA", "AAAA", [0, 0, 0]], ["AAAB", "AAAB", [0, 0, 1]], ["AAH/", "AAH/", [0, 1, -1]], ["AQEB", "AQEB", [1, 1, 1]], ["ALcX", "ALcX", [0, -73, 23]] ] ================================================ FILE: packages/core/src/submodules/serde/util-base64/constants-for-browser.ts ================================================ const chars = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`; export const alphabetByEncoding: Record = Object.entries(chars).reduce( (acc, [i, c]) => { acc[c] = Number(i); return acc; }, {} as Record ); export const alphabetByValue: Array = chars.split(""); export const bitsPerLetter = 6; export const bitsPerByte = 8; export const maxLetterValue = 0b111111; ================================================ FILE: packages/core/src/submodules/serde/util-base64/fromBase64.browser.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import testCases from "./__mocks__/testCases.json"; import { fromBase64 } from "./fromBase64.browser"; describe(fromBase64.name, () => { it.each(testCases as Array<[string, string, number[]]>)("%s", (desc, encoded, decoded) => { expect(fromBase64(encoded)).toEqual(new Uint8Array(decoded)); }); it("should throw when given a number", () => { expect(() => fromBase64(0xdeadbeefface as any)).toThrow(); }); describe("should reject invalid base64 strings", () => { it.each(["Rg", "Rg=", "[][]", "-_=="])("rejects '%s'", (value) => { expect(() => fromBase64(value)).toThrowError(); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-base64/fromBase64.browser.ts ================================================ import { alphabetByEncoding, bitsPerByte, bitsPerLetter } from "./constants-for-browser"; /** * Converts a base-64 encoded string to a Uint8Array of bytes. * * @param input The base-64 encoded string * * @see https://tools.ietf.org/html/rfc4648#section-4 */ export const fromBase64 = (input: string): Uint8Array => { let totalByteLength = (input.length / 4) * 3; if (input.slice(-2) === "==") { totalByteLength -= 2; } else if (input.slice(-1) === "=") { totalByteLength--; } const out = new ArrayBuffer(totalByteLength); const dataView = new DataView(out); for (let i = 0; i < input.length; i += 4) { let bits = 0; let bitLength = 0; for (let j = i, limit = i + 3; j <= limit; j++) { if (input[j] !== "=") { // If we don't check for this, we'll end up using undefined in a bitwise // operation, in which it will be treated as 0. if (!(input[j] in alphabetByEncoding)) { throw new TypeError(`Invalid character ${input[j]} in base64 string.`); } bits |= alphabetByEncoding[input[j]] << ((limit - j) * bitsPerLetter); bitLength += bitsPerLetter; } else { bits >>= bitsPerLetter; } } const chunkOffset = (i / 4) * 3; bits >>= bitLength % bitsPerByte; const byteLength = Math.floor(bitLength / bitsPerByte); for (let k = 0; k < byteLength; k++) { const offset = (byteLength - k - 1) * bitsPerByte; dataView.setUint8(chunkOffset + k, (bits & (255 << offset)) >> offset); } } return new Uint8Array(out); }; ================================================ FILE: packages/core/src/submodules/serde/util-base64/fromBase64.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import testCases from "./__mocks__/testCases.json"; import { fromBase64 } from "./fromBase64"; describe(fromBase64.name, () => { it.each(testCases as Array<[string, string, number[]]>)("%s", (desc, encoded, decoded) => { expect(fromBase64(encoded)).toEqual(new Uint8Array(decoded)); }); it("should throw when given a number", () => { expect(() => fromBase64(0xdeadbeefface as any)).toThrow(); }); describe("should reject invalid base64 strings", () => { it.each(["Rg", "Rg=", "[][]", "-_=="])("rejects '%s'", (value) => { expect(() => fromBase64(value)).toThrowError(); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-base64/fromBase64.ts ================================================ import { fromString } from "../util-buffer-from/buffer-from"; const BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/; /** * Converts a base-64 encoded string to a Uint8Array of bytes using Node.JS's * `buffer` module. * * @param input The base-64 encoded string */ export const fromBase64 = (input: string): Uint8Array => { // Node's buffer module allows padding to be omitted, but we want to enforce // it. So here we ensure that the input represents a number of bits divisible // by 8. Each character represents 6 bits, so after reducing the fraction we // end up mulitplying by 3/4 and checking for a remainder. if ((input.length * 3) % 4 !== 0) { throw new TypeError(`Incorrect padding on base64 string.`); } // Node will just ignore invalid characters, so we need to make sure they're // properly rejected. if (!BASE64_REGEX.exec(input)) { throw new TypeError(`Invalid base64 string.`); } const buffer = fromString(input, "base64"); return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); }; ================================================ FILE: packages/core/src/submodules/serde/util-base64/toBase64.browser.spec.ts ================================================ import type { Encoder } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import testCases from "./__mocks__/testCases.json"; import { fromBase64 } from "./fromBase64.browser"; import { toBase64 } from "./toBase64.browser"; describe(toBase64.name, () => { it.each(testCases as Array<[string, string, number[]]>)("%s", (desc, encoded, decoded) => { expect(toBase64(new Uint8Array(decoded))).toEqual(encoded); }); it("also converts strings", () => { expect(toBase64("hello")).toEqual("aGVsbG8="); }); it("throws on non-string non-Uint8Array", () => { expect(() => (toBase64 as Encoder)(new Date())).toThrow(); expect(() => (toBase64 as Encoder)({})).toThrow(); }); it("allows array to stand in for Uint8Array", () => { expect(() => (toBase64 as Encoder)([])).not.toThrow(); const helloUtf8Array = fromBase64("aGVsbG8="); expect(toBase64([...helloUtf8Array] as unknown as Uint8Array)).toEqual("aGVsbG8="); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-base64/toBase64.browser.ts ================================================ import { fromUtf8 } from "../util-utf8/fromUtf8.browser"; import { alphabetByValue, bitsPerByte, bitsPerLetter, maxLetterValue } from "./constants-for-browser"; /** * Converts a Uint8Array of binary data or a utf-8 string to a base-64 encoded string. * * @param _input - the binary data or string to encode. * @returns base64 string. * * @see https://tools.ietf.org/html/rfc4648#section-4 */ export function toBase64(_input: Uint8Array | string): string { let input: Uint8Array; if (typeof _input === "string") { input = fromUtf8(_input); } else { input = _input as Uint8Array; } const isArrayLike = typeof input === "object" && typeof input.length === "number"; const isUint8Array = typeof input === "object" && typeof (input as Uint8Array).byteOffset === "number" && typeof (input as Uint8Array).byteLength === "number"; if (!isArrayLike && !isUint8Array) { throw new Error("@smithy/util-base64: toBase64 encoder function only accepts string | Uint8Array."); } let str = ""; for (let i = 0; i < input.length; i += 3) { let bits = 0; let bitLength = 0; for (let j = i, limit = Math.min(i + 3, input.length); j < limit; j++) { bits |= input[j] << ((limit - j - 1) * bitsPerByte); bitLength += bitsPerByte; } const bitClusterCount = Math.ceil(bitLength / bitsPerLetter); bits <<= bitClusterCount * bitsPerLetter - bitLength; for (let k = 1; k <= bitClusterCount; k++) { const offset = (bitClusterCount - k) * bitsPerLetter; str += alphabetByValue[(bits & (maxLetterValue << offset)) >> offset]; } str += "==".slice(0, 4 - bitClusterCount); } return str; } ================================================ FILE: packages/core/src/submodules/serde/util-base64/toBase64.spec.ts ================================================ import type { Encoder } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import testCases from "./__mocks__/testCases.json"; import { toBase64 } from "./toBase64"; describe(toBase64.name, () => { it.each(testCases as Array<[string, string, number[]]>)("%s", (desc, encoded, decoded) => { expect(toBase64(new Uint8Array(decoded))).toEqual(encoded); }); it("should throw when given a number", () => { expect(() => toBase64(0xdeadbeefface as any)).toThrow(); }); it("also converts strings", () => { expect(toBase64("hello")).toEqual("aGVsbG8="); }); it("throws on non-string non-Uint8Array", () => { expect(() => (toBase64 as Encoder)(new Date())).toThrow(); expect(() => (toBase64 as Encoder)({})).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-base64/toBase64.ts ================================================ import { fromArrayBuffer } from "../util-buffer-from/buffer-from"; import { fromUtf8 } from "../util-utf8/fromUtf8"; /** * Converts a Uint8Array of binary data or a utf-8 string to a base-64 encoded string using * Node.JS's `buffer` module. * * @param _input - the binary data or string to encode. * @returns base64 string. */ export const toBase64 = (_input: Uint8Array | string): string => { let input: Uint8Array; if (typeof _input === "string") { input = fromUtf8(_input); } else { input = _input as Uint8Array; } if (typeof input !== "object" || typeof input.byteOffset !== "number" || typeof input.byteLength !== "number") { throw new Error("@smithy/util-base64: toBase64 encoder function only accepts string | Uint8Array."); } return fromArrayBuffer(input.buffer, input.byteOffset, input.byteLength).toString("base64"); }; ================================================ FILE: packages/core/src/submodules/serde/util-body-length/CHANGELOG.util-body-length-browser.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.1 ### Patch Changes - 599e95a8: Use TextEncoder to calculate body length on browsers (where available) ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-body-length-browser](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-body-length-browser/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-body-length/CHANGELOG.util-body-length-node.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.3 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.2 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.1 ### Patch Changes - 300177f: restrict fs calls to fs.ReadStream instances ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.2.2 ### Patch Changes - 511206e5: reduce buffer copies ## 2.2.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.2.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.1.0 ### Minor Changes - 4571d59c: calculateBodyLength for Readable stream with range ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-body-length-node](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-body-length-node/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-body-length/calculateBodyLength.browser.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { calculateBodyLength } from "./calculateBodyLength.browser"; describe(calculateBodyLength.name, () => { describe("should handle string input", () => { it.each([ { desc: "basic", input: "foo", output: 3 }, { desc: "emoji", input: "foo 🥺", output: 8 }, { desc: "multi-byte characters", input: "2。", output: 4 }, ])("%s", ({ input, output }) => { expect(calculateBodyLength(input)).toEqual(output); }); }); describe("should handle input with byteLength", () => { const sizes = [1, 256, 65536]; describe("ArrayBuffer", () => { it.each(sizes)("size: %s", (size) => { expect(calculateBodyLength(new ArrayBuffer(size))).toEqual(size); }); }); describe("TypedArray", () => { it.each(sizes)("size: %s", (size) => { expect(calculateBodyLength(new Uint8Array(size))).toEqual(size); }); }); }); it("should handle File object", () => { // Mock File Object https://developer.mozilla.org/en-US/docs/Web/API/File/File#example const lastModifiedDate = new Date(); const mockFileObject = { lastModified: lastModifiedDate.getTime(), lastModifiedDate, name: "foo.txt", size: 3, type: "text/plain", webkitRelativePath: "", }; expect(calculateBodyLength(mockFileObject)).toEqual(mockFileObject.size); }); describe("throws error if Body Length computation fails", () => { it.each([true, 1, {}, []])("%s", (body) => { expect(() => { expect(calculateBodyLength(body)); }).toThrowError(`Body Length computation failed for ${body}`); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-body-length/calculateBodyLength.browser.ts ================================================ const TEXT_ENCODER = typeof TextEncoder == "function" ? new TextEncoder() : null; /** * @internal */ export const calculateBodyLength = (body: any): number | undefined => { if (typeof body === "string") { if (TEXT_ENCODER) { return TEXT_ENCODER.encode(body).byteLength; } let len = body.length; for (let i = len - 1; i >= 0; i--) { const code = body.charCodeAt(i); if (code > 0x7f && code <= 0x7ff) len++; else if (code > 0x7ff && code <= 0xffff) len += 2; if (code >= 0xdc00 && code <= 0xdfff) i--; //trail surrogate } return len; } else if (typeof body.byteLength === "number") { // handles Uint8Array, ArrayBuffer, Buffer, and ArrayBufferView return body.byteLength; } else if (typeof body.size === "number") { // handles browser File object return body.size; } throw new Error(`Body Length computation failed for ${body}`); }; ================================================ FILE: packages/core/src/submodules/serde/util-body-length/calculateBodyLength.spec.ts ================================================ import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { calculateBodyLength } from "./calculateBodyLength"; describe(calculateBodyLength.name, () => { const arrayBuffer = new ArrayBuffer(1); const typedArray = new Uint8Array(1); const view = new DataView(arrayBuffer); afterEach(() => { vi.clearAllMocks(); }); it.each([ [0, null], [0, undefined], ])("should return %s for %s", (output, input) => { expect(calculateBodyLength(input)).toEqual(output); }); it("should handle string inputs", () => { expect(calculateBodyLength("foo")).toEqual(3); }); it("should handle string inputs with multi-byte characters", () => { expect(calculateBodyLength("2。")).toEqual(4); }); it("should handle inputs with byteLengths", () => { expect(calculateBodyLength(arrayBuffer)).toEqual(1); }); it("should handle TypedArray inputs", () => { expect(calculateBodyLength(typedArray)).toEqual(1); }); it("should handle DataView inputs", () => { expect(calculateBodyLength(view)).toEqual(1); }); it("should handle a Readable from a file", async () => { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "test1-")); const filePath = path.join(tmpDir, "foo"); fs.writeFileSync(filePath, "foo"); const handle = fs.openSync(filePath, "r"); const readStream = fs.createReadStream(filePath, { fd: handle }); expect(calculateBodyLength(readStream)).toEqual(3); readStream.destroy(); fs.unlinkSync(filePath); fs.rmdirSync(tmpDir); }); it("should handle Readable with start end from a file", async () => { const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "test2-")); const filePath = path.join(tmpDir, "foo"); fs.writeFileSync(filePath, "foo"); const handle = fs.openSync(filePath, "r"); const readStream = fs.createReadStream(filePath, { fd: handle, start: 1, end: 1 }); expect(calculateBodyLength(readStream)).toEqual(1); readStream.destroy(); fs.unlinkSync(filePath); fs.rmdirSync(tmpDir); }); describe("fs.ReadStream", () => { const fileSize = fs.lstatSync(__filename).size; describe("should handle stream created using fs.createReadStream", () => { it("when path is a string", () => { const fsReadStream = fs.createReadStream(__filename); expect(calculateBodyLength(fsReadStream)).toEqual(fileSize); fsReadStream.close(); }); it("when path is a Buffer", () => { const fsReadStream = fs.createReadStream(Buffer.from(__filename)); expect(calculateBodyLength(fsReadStream)).toEqual(fileSize); fsReadStream.close(); }); }); it("should handle stream created using fd.createReadStream", async () => { const fd = await fs.promises.open(__filename, "r"); const fdReadStream = fd.createReadStream(); expect(calculateBodyLength(fdReadStream)).toEqual(fileSize); fdReadStream.close(); }); }); it.each([true, 1, {}, []])("throws error if Body Length computation fails for: %s", (body) => { expect(() => { expect(calculateBodyLength(body)); }).toThrowError(`Body Length computation failed for ${body}`); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-body-length/calculateBodyLength.ts ================================================ import { ReadStream, fstatSync, lstatSync } from "node:fs"; /** * @internal */ type HasFileDescriptor = { fd: number; }; /** * @internal */ export const calculateBodyLength = (body: any): number | undefined => { if (!body) { return 0; } if (typeof body === "string") { return Buffer.byteLength(body); } else if (typeof body.byteLength === "number") { // handles Uint8Array, ArrayBuffer, Buffer, and ArrayBufferView return body.byteLength; } else if (typeof body.size === "number") { return body.size; } else if (typeof body.start === "number" && typeof body.end === "number") { return body.end + 1 - body.start; } else if (body instanceof ReadStream) { // the previous use case where start and end are numbers is also potentially a ReadStream. if (body.path != null) { return lstatSync(body.path).size; } else if (typeof (body as ReadStream & HasFileDescriptor).fd === "number") { return fstatSync((body as ReadStream & HasFileDescriptor).fd).size; } } throw new Error(`Body Length computation failed for ${body}`); }; ================================================ FILE: packages/core/src/submodules/serde/util-buffer-from/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/is-array-buffer@4.2.2 ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/is-array-buffer@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/is-array-buffer@4.2.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - @smithy/is-array-buffer@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/is-array-buffer@4.0.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [671aa704] - @smithy/is-array-buffer@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - @smithy/is-array-buffer@2.2.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/is-array-buffer@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/is-array-buffer@2.1.0 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/is-array-buffer@2.0.0 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/is-array-buffer@1.1.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/is-array-buffer@1.0.2 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/is-array-buffer@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-buffer-from](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-buffer-from/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-buffer-from/buffer-from.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { fromArrayBuffer, fromString } from "./buffer-from"; describe("fromArrayBuffer", () => { it("throws if argument is not an ArrayBuffer", () => { const input = 255; // @ts-expect-error is not assignable to parameter of type 'ArrayBuffer' expect(() => fromArrayBuffer(input)).toThrow( new TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof input} (${input})`) ); }); it("returns a Buffer from ArrayBuffer with one arg", () => { const buffer = new ArrayBuffer(16); const result = fromArrayBuffer(buffer); expect(result).toBeInstanceOf(Buffer); expect(result.byteLength).toBe(16); }); it("returns a Buffer from ArrayBuffer with offset", () => { const buffer = new ArrayBuffer(16); const offset = 4; const result = fromArrayBuffer(buffer, offset); expect(result).toBeInstanceOf(Buffer); expect(result.byteLength).toBe(12); }); it("returns a Buffer from ArrayBuffer with offset and length", () => { const buffer = new ArrayBuffer(16); const result = fromArrayBuffer(buffer, 4, 8); expect(result).toBeInstanceOf(Buffer); expect(result.byteLength).toBe(8); }); it("shares memory with the source ArrayBuffer", () => { const buffer = new ArrayBuffer(4); const view = new Uint8Array(buffer); view[0] = 42; const result = fromArrayBuffer(buffer); expect(result[0]).toBe(42); }); }); describe("fromString", () => { it("throws if argument is not a string", () => { const input = 255; // @ts-expect-error is not assignable to parameter of type 'string' expect(() => fromString(input)).toThrow( new TypeError(`The "input" argument must be of type string. Received type ${typeof input} (${input})`) ); }); it("returns a Buffer from string without encoding", () => { const result = fromString("hello"); expect(result).toBeInstanceOf(Buffer); expect(result.toString("utf8")).toBe("hello"); }); it("returns a Buffer from string with encoding", () => { const result = fromString("68656c6c6f", "hex"); expect(result).toBeInstanceOf(Buffer); expect(result.toString("utf8")).toBe("hello"); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-buffer-from/buffer-from.ts ================================================ import { isArrayBuffer } from "../is-array-buffer/is-array-buffer"; /** * @internal */ export const fromArrayBuffer = (input: ArrayBuffer, offset = 0, length: number = input.byteLength - offset): Buffer => { if (!isArrayBuffer(input)) { throw new TypeError(`The "input" argument must be ArrayBuffer. Received type ${typeof input} (${input})`); } return Buffer.from(input, offset, length); }; /** * @internal */ export type StringEncoding = "ascii" | "utf8" | "utf16le" | "ucs2" | "base64" | "latin1" | "binary" | "hex"; /** * @internal */ export const fromString = (input: string, encoding?: StringEncoding): Buffer => { if (typeof input !== "string") { throw new TypeError(`The "input" argument must be of type string. Received type ${typeof input} (${input})`); } return encoding ? Buffer.from(input, encoding) : Buffer.from(input); }; ================================================ FILE: packages/core/src/submodules/serde/util-hex-encoding/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-hex-encoding](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-hex-encoding/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-hex-encoding/hex-encoding.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { fromHex, toHex } from "./hex-encoding"; const encoded = "dead" + "beef" + "cafe" + "babe" + "face"; const bytes = new Uint8Array([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce]); describe("fromHex", () => { it("should decode hexadecimal strings to binary", () => { expect(fromHex(encoded)).toEqual(bytes); }); it("should throw if the string is not an even number of code units", () => { expect(() => fromHex(encoded + "a")).toThrow(); }); it("should throw if an unexpected sequence is encountered", () => { expect(() => fromHex("xy")).toThrow(); }); it("should decode hexadecimal strings regardless of casing", () => { expect(fromHex(encoded.toLowerCase())).toEqual(bytes); expect(fromHex(encoded.toUpperCase())).toEqual(bytes); }); }); describe("toHex", () => { it("should encode bytes as hexadecimal", () => { expect(toHex(bytes)).toBe(encoded); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-hex-encoding/hex-encoding.ts ================================================ const SHORT_TO_HEX: { [key: number]: string } = {}; const HEX_TO_SHORT: Record = {}; for (let i = 0; i < 256; i++) { let encodedByte = i.toString(16).toLowerCase(); if (encodedByte.length === 1) { encodedByte = `0${encodedByte}`; } SHORT_TO_HEX[i] = encodedByte; HEX_TO_SHORT[encodedByte] = i; } /** * Converts a hexadecimal encoded string to a Uint8Array of bytes. * * @param encoded The hexadecimal encoded string */ export function fromHex(encoded: string): Uint8Array { if (encoded.length % 2 !== 0) { throw new Error("Hex encoded strings must have an even number length"); } const out = new Uint8Array(encoded.length / 2); for (let i = 0; i < encoded.length; i += 2) { const encodedByte = encoded.slice(i, i + 2).toLowerCase(); if (encodedByte in HEX_TO_SHORT) { out[i / 2] = HEX_TO_SHORT[encodedByte]; } else { throw new Error(`Cannot decode unrecognized sequence ${encodedByte} as hexadecimal`); } } return out; } /** * Converts a Uint8Array of binary data to a hexadecimal encoded string. * * @param bytes The binary data to encode */ export function toHex(bytes: Uint8Array): string { let out = ""; for (let i = 0; i < bytes.byteLength; i++) { out += SHORT_TO_HEX[bytes[i]]; } return out; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/ByteArrayCollector.ts ================================================ /** * Aggregates byteArrays on demand. * @internal */ export class ByteArrayCollector { public byteLength = 0; private byteArrays = [] as Uint8Array[]; public constructor(public readonly allocByteArray: (size: number) => Uint8Array) {} public push(byteArray: Uint8Array) { this.byteArrays.push(byteArray); this.byteLength += byteArray.byteLength; } public flush(): Uint8Array { if (this.byteArrays.length === 1) { const bytes = this.byteArrays[0]; this.reset(); return bytes; } const aggregation = this.allocByteArray(this.byteLength); let cursor = 0; for (let i = 0; i < this.byteArrays.length; ++i) { const bytes = this.byteArrays[i]; aggregation.set(bytes, cursor); cursor += bytes.byteLength; } this.reset(); return aggregation; } private reset() { this.byteArrays = []; this.byteLength = 0; } } ================================================ FILE: packages/core/src/submodules/serde/util-stream/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.5.25 ### Patch Changes - Updated dependencies [769ed47] - @smithy/node-http-handler@4.6.1 ## 4.5.24 ### Patch Changes - Updated dependencies [60d13c8] - @smithy/node-http-handler@4.6.0 ## 4.5.23 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/node-http-handler@4.5.3 - @smithy/types@4.14.1 - @smithy/fetch-http-handler@5.3.17 ## 4.5.22 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/fetch-http-handler@5.3.16 - @smithy/node-http-handler@4.5.2 ## 4.5.21 ### Patch Changes - Updated dependencies [fac1a34] - @smithy/node-http-handler@4.5.1 ## 4.5.20 ### Patch Changes - Updated dependencies [4e7fa38] - @smithy/node-http-handler@4.5.0 ## 4.5.19 ### Patch Changes - Updated dependencies [dab22f1] - @smithy/node-http-handler@4.4.16 - @smithy/fetch-http-handler@5.3.15 ## 4.5.18 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/fetch-http-handler@5.3.14 - @smithy/node-http-handler@4.4.15 ## 4.5.17 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/fetch-http-handler@5.3.13 - @smithy/node-http-handler@4.4.14 - @smithy/util-hex-encoding@4.2.2 - @smithy/util-buffer-from@4.2.2 - @smithy/util-base64@4.3.2 - @smithy/util-utf8@4.2.2 ## 4.5.16 ### Patch Changes - Updated dependencies [9bf9ae2] - @smithy/node-http-handler@4.4.13 - @smithy/fetch-http-handler@5.3.12 ## 4.5.15 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/fetch-http-handler@5.3.11 - @smithy/node-http-handler@4.4.12 ## 4.5.14 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/fetch-http-handler@5.3.10 - @smithy/node-http-handler@4.4.11 - @smithy/types@4.12.1 - @smithy/util-base64@4.3.1 - @smithy/util-buffer-from@4.2.1 - @smithy/util-hex-encoding@4.2.1 - @smithy/util-utf8@4.2.1 ## 4.5.13 ### Patch Changes - ffe1843: Handle backpressure in ChecksumStream by deferring write callbacks when downstream buffer is full, resuming when \_read is called. ## 4.5.12 ### Patch Changes - Updated dependencies [f6f0de9] - @smithy/node-http-handler@4.4.10 ## 4.5.11 ### Patch Changes - Updated dependencies [3ee4e66] - @smithy/node-http-handler@4.4.9 ## 4.5.10 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/fetch-http-handler@5.3.9 - @smithy/node-http-handler@4.4.8 ## 4.5.9 ### Patch Changes - 87a5f20: correct chunked encoding output for 0-length streams ## 4.5.8 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/fetch-http-handler@5.3.8 - @smithy/node-http-handler@4.4.7 ## 4.5.7 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/fetch-http-handler@5.3.7 - @smithy/node-http-handler@4.4.6 ## 4.5.6 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/fetch-http-handler@5.3.6 - @smithy/node-http-handler@4.4.5 ## 4.5.5 ### Patch Changes - Updated dependencies [6da0ab3] - Updated dependencies [df00095] - @smithy/types@4.8.1 - @smithy/node-http-handler@4.4.4 - @smithy/fetch-http-handler@5.3.5 ## 4.5.4 ### Patch Changes - Updated dependencies [344d06a] - @smithy/node-http-handler@4.4.3 ## 4.5.3 ### Patch Changes - 7e359e2: remove and ban circular imports - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/fetch-http-handler@5.3.4 - @smithy/node-http-handler@4.4.2 ## 4.5.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/fetch-http-handler@5.3.3 - @smithy/node-http-handler@4.4.1 ## 4.5.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/node-http-handler@4.4.0 - @smithy/types@4.7.0 - @smithy/fetch-http-handler@5.3.2 ## 4.5.0 ### Minor Changes - 813c9a5: refactoring to reduce code size ### Patch Changes - Updated dependencies [813c9a5] - @smithy/util-base64@4.3.0 - @smithy/fetch-http-handler@5.3.1 ## 4.4.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/fetch-http-handler@5.3.0 - @smithy/node-http-handler@4.3.0 - @smithy/types@4.6.0 - @smithy/util-base64@4.2.0 - @smithy/util-buffer-from@4.2.0 - @smithy/util-hex-encoding@4.2.0 - @smithy/util-utf8@4.2.0 ## 4.3.2 ### Patch Changes - f8793be: prevent compilation from inserting Uint8Array type parameter ## 4.3.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/fetch-http-handler@5.2.1 - @smithy/node-http-handler@4.2.1 ## 4.3.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/fetch-http-handler@5.2.0 - @smithy/node-http-handler@4.2.0 - @smithy/util-hex-encoding@4.1.0 - @smithy/util-buffer-from@4.1.0 - @smithy/util-base64@4.1.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 4.2.4 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/fetch-http-handler@5.1.1 - @smithy/node-http-handler@4.1.1 ## 4.2.3 ### Patch Changes - Updated dependencies [c4e923a] - @smithy/fetch-http-handler@5.1.0 - @smithy/node-http-handler@4.1.0 ## 4.2.2 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/fetch-http-handler@5.0.4 - @smithy/node-http-handler@4.0.6 ## 4.2.1 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/fetch-http-handler@5.0.3 - @smithy/node-http-handler@4.0.5 ## 4.2.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/fetch-http-handler@5.0.2 - @smithy/node-http-handler@4.0.4 ## 4.1.2 ### Patch Changes - Updated dependencies [54d2416] - Updated dependencies [fba050c] - @smithy/node-http-handler@4.0.3 ## 4.1.1 ### Patch Changes - efedb20: handle case of empty upstream ## 4.1.0 ### Minor Changes - d1d1f72: utility for buffering stream chunks ## 4.0.2 ### Patch Changes - Updated dependencies [fbd06eb] - @smithy/node-http-handler@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/fetch-http-handler@5.0.1 - @smithy/node-http-handler@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/fetch-http-handler@5.0.0 - @smithy/node-http-handler@4.0.0 - @smithy/util-buffer-from@4.0.0 - @smithy/util-base64@4.0.0 - @smithy/util-utf8@4.0.0 - @smithy/types@4.0.0 - @smithy/util-hex-encoding@4.0.0 ## 3.3.4 ### Patch Changes - Updated dependencies [1dd6ace] - @smithy/fetch-http-handler@4.1.3 ## 3.3.3 ### Patch Changes - Updated dependencies [5e73108] - @smithy/node-http-handler@3.3.3 ## 3.3.2 ### Patch Changes - Updated dependencies [b52b4e8] - Updated dependencies [f4e1a45] - Updated dependencies [a257792] - @smithy/types@3.7.2 - @smithy/node-http-handler@3.3.2 - @smithy/fetch-http-handler@4.1.2 ## 3.3.1 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/fetch-http-handler@4.1.1 - @smithy/node-http-handler@3.3.1 ## 3.3.0 ### Minor Changes - cd1929b: vitest compatibility ### Patch Changes - c8d257b: allow Blob in node.js splitStream - Updated dependencies [cd1929b] - @smithy/fetch-http-handler@4.1.0 - @smithy/node-http-handler@3.3.0 - @smithy/types@3.7.0 ## 3.2.1 ### Patch Changes - ccdd49f: add bundler metadata for ChecksumStream file ## 3.2.0 ### Minor Changes - f4e0bd9: create checksum stream adapter ### Patch Changes - Updated dependencies [c257049] - Updated dependencies [84bec05] - @smithy/fetch-http-handler@4.0.0 - @smithy/types@3.6.0 - @smithy/node-http-handler@3.2.5 ## 3.1.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/fetch-http-handler@3.2.9 - @smithy/node-http-handler@3.2.4 ## 3.1.8 ### Patch Changes - Updated dependencies [0d5ab1d] - @smithy/fetch-http-handler@3.2.8 ## 3.1.7 ### Patch Changes - Updated dependencies [08fbedf] - @smithy/node-http-handler@3.2.3 ## 3.1.6 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/fetch-http-handler@3.2.7 - @smithy/node-http-handler@3.2.2 ## 3.1.5 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/fetch-http-handler@3.2.6 - @smithy/types@3.4.1 - @smithy/node-http-handler@3.2.1 ## 3.1.4 ### Patch Changes - Updated dependencies [c86a02c] - Updated dependencies [5510e83] - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/node-http-handler@3.2.0 - @smithy/types@3.4.0 - @smithy/fetch-http-handler@3.2.5 ## 3.1.3 ### Patch Changes - Updated dependencies [3ea4789] - @smithy/fetch-http-handler@3.2.4 ## 3.1.2 ### Patch Changes - @smithy/fetch-http-handler@3.2.3 - @smithy/node-http-handler@3.1.4 ## 3.1.1 ### Patch Changes - 1cfe243: avoid compilation of global ReadableStream with type parameter ## 3.1.0 ### Minor Changes - 7cd258f: add splitStream and headStream utilities ### Patch Changes - @smithy/fetch-http-handler@3.2.2 - @smithy/node-http-handler@3.1.3 ## 3.0.6 ### Patch Changes - Updated dependencies [f31cc5f] - @smithy/fetch-http-handler@3.2.1 - @smithy/node-http-handler@3.1.2 ## 3.0.5 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/fetch-http-handler@3.2.0 - @smithy/types@3.3.0 - @smithy/node-http-handler@3.1.1 ## 3.0.4 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/node-http-handler@3.1.0 - @smithy/types@3.2.0 - @smithy/fetch-http-handler@3.1.0 ## 3.0.3 ### Patch Changes - Updated dependencies [fedce37] - @smithy/fetch-http-handler@3.0.3 ## 3.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/fetch-http-handler@3.0.2 - @smithy/node-http-handler@3.0.1 ## 3.0.1 ### Patch Changes - Updated dependencies [cc9fa00e] - @smithy/fetch-http-handler@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Minor Changes - 3500f341: handle web streams in streamCollector and sdkStreamMixin ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [e76e736b] - Updated dependencies [3500f341] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/fetch-http-handler@3.0.0 - @smithy/node-http-handler@3.0.0 - @smithy/util-hex-encoding@3.0.0 - @smithy/util-buffer-from@3.0.0 - @smithy/util-base64@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/fetch-http-handler@2.5.0 - @smithy/node-http-handler@2.5.0 - @smithy/util-hex-encoding@2.2.0 - @smithy/util-buffer-from@2.2.0 - @smithy/util-base64@2.3.0 - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.5 ### Patch Changes - Updated dependencies [8e8f3513] - Updated dependencies [511206e5] - @smithy/util-base64@2.2.1 - @smithy/node-http-handler@2.4.3 - @smithy/fetch-http-handler@2.4.5 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-base64@2.2.0 - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 - @smithy/fetch-http-handler@2.4.4 - @smithy/node-http-handler@2.4.2 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/fetch-http-handler@2.4.3 - @smithy/node-http-handler@2.4.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/node-http-handler@2.4.0 - @smithy/types@2.10.0 - @smithy/fetch-http-handler@2.4.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/fetch-http-handler@2.4.1 - @smithy/node-http-handler@2.3.1 - @smithy/types@2.9.1 - @smithy/util-base64@2.1.1 - @smithy/util-buffer-from@2.1.1 - @smithy/util-hex-encoding@2.1.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/fetch-http-handler@2.4.0 - @smithy/node-http-handler@2.3.0 - @smithy/util-hex-encoding@2.1.0 - @smithy/util-buffer-from@2.1.0 - @smithy/util-base64@2.1.0 - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.24 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/fetch-http-handler@2.3.2 - @smithy/node-http-handler@2.2.2 ## 2.0.23 ### Patch Changes - Updated dependencies [e2e3f7d5] - @smithy/fetch-http-handler@2.3.1 - @smithy/node-http-handler@2.2.1 ## 2.0.22 ### Patch Changes - Updated dependencies [340634a5] - @smithy/fetch-http-handler@2.3.0 - @smithy/node-http-handler@2.2.0 - @smithy/types@2.7.0 ## 2.0.21 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/fetch-http-handler@2.2.7 - @smithy/node-http-handler@2.1.10 ## 2.0.20 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/fetch-http-handler@2.2.6 - @smithy/node-http-handler@2.1.9 ## 2.0.19 ### Patch Changes - Updated dependencies [f2a04b7e] - @smithy/util-utf8@2.0.2 ## 2.0.18 ### Patch Changes - 5598a033: update bundler replacement directives in package.json - Updated dependencies [5598a033] - @smithy/util-base64@2.0.1 - @smithy/util-utf8@2.0.1 - @smithy/fetch-http-handler@2.2.5 ## 2.0.17 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/fetch-http-handler@2.2.4 - @smithy/node-http-handler@2.1.8 ## 2.0.16 ### Patch Changes - Updated dependencies [34b7f7b6] - @smithy/fetch-http-handler@2.2.3 ## 2.0.15 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/fetch-http-handler@2.2.2 - @smithy/node-http-handler@2.1.7 ## 2.0.14 ### Patch Changes - Updated dependencies [b411ffd1] - @smithy/fetch-http-handler@2.2.1 ## 2.0.13 ### Patch Changes - Updated dependencies [4528c37d] - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/fetch-http-handler@2.2.0 - @smithy/types@2.3.4 - @smithy/node-http-handler@2.1.6 ## 2.0.12 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/fetch-http-handler@2.1.5 - @smithy/node-http-handler@2.1.5 ## 2.0.11 ### Patch Changes - 99fc0b4c: util-stream api extraction added - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/fetch-http-handler@2.1.4 - @smithy/node-http-handler@2.1.4 ## 2.0.10 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/fetch-http-handler@2.1.3 - @smithy/node-http-handler@2.1.3 ## 2.0.9 ### Patch Changes - d491b770: Add `HttpHandler` implementation for `util-stream.integ.spec.ts` ## 2.0.8 ### Patch Changes - @smithy/fetch-http-handler@2.1.2 - @smithy/node-http-handler@2.1.2 ## 2.0.7 ### Patch Changes - @smithy/fetch-http-handler@2.1.1 - @smithy/node-http-handler@2.1.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/fetch-http-handler@2.1.0 - @smithy/node-http-handler@2.1.0 ## 2.0.5 ### Patch Changes - 1be3c4c9: Add integration tests - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/fetch-http-handler@2.0.5 - @smithy/node-http-handler@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/fetch-http-handler@2.0.4 - @smithy/node-http-handler@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/fetch-http-handler@2.0.3 - @smithy/node-http-handler@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/fetch-http-handler@2.0.2 - @smithy/node-http-handler@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/fetch-http-handler@2.0.1 - @smithy/node-http-handler@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/fetch-http-handler@2.0.0 - @smithy/node-http-handler@2.0.0 - @smithy/util-base64@2.0.0 - @smithy/util-buffer-from@2.0.0 - @smithy/util-hex-encoding@2.0.0 - @smithy/util-utf8@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/fetch-http-handler@1.1.0 - @smithy/node-http-handler@1.1.0 - @smithy/types@1.2.0 - @smithy/util-base64@1.1.0 - @smithy/util-buffer-from@1.1.0 - @smithy/util-hex-encoding@1.1.0 - @smithy/util-utf8@1.1.0 ## 1.0.3 ### Patch Changes - 99d00e98: Bump webpack to 5.76.0 - Updated dependencies [99d00e98] - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/fetch-http-handler@1.0.3 - @smithy/types@2.0.0 - @smithy/node-http-handler@1.0.4 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/fetch-http-handler@1.0.2 - @smithy/node-http-handler@1.0.3 - @smithy/util-hex-encoding@1.0.2 - @smithy/util-buffer-from@1.0.2 - @smithy/util-base64@1.0.2 - @smithy/util-utf8@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - Updated dependencies [e051b157] - @smithy/node-http-handler@1.0.2 ## 1.0.0 ### Patch Changes - Migrate util-stream, add collect-body-stream All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-stream](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-stream/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-stream/blob/Uint8ArrayBlobAdapter.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { Uint8ArrayBlobAdapter } from "../../index"; describe(Uint8ArrayBlobAdapter.name, () => { it("extends Uint8Array", () => { const blobby = Uint8ArrayBlobAdapter.mutate(new Uint8Array(5)); blobby[-1] = 8; blobby[0] = 8; blobby[1] = -1; blobby[3] = 256; blobby[4] = 8; blobby[5] = 8; // cannot use unallocated index left expect(blobby[-1]).toEqual(undefined); expect(blobby[0]).toEqual(8); // downward overflow expect(blobby[1]).toEqual(255); // upward overflow expect(blobby[3]).toEqual(0); expect(blobby[4]).toEqual(8); // cannot use unallocated index right expect(blobby[5]).toEqual(undefined); expect(blobby.length).toEqual(5); }); it("should transform to string synchronously", () => { const blob = Uint8ArrayBlobAdapter.fromString("test-123"); expect(blob.transformToString()).toEqual("test-123"); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/blob/Uint8ArrayBlobAdapter.ts ================================================ import type { Decoder, Encoder } from "@smithy/types"; /** * Adapter for conversions of the native Uint8Array type. * @public */ export interface IUint8ArrayBlobAdapter extends Uint8Array { /** * @param encoding - default 'utf-8'. * @returns the blob as string. */ transformToString(encoding?: string): string; } export interface Uint8ArrayBlobAdapterConstructor { new (...args: any): IUint8ArrayBlobAdapter; fromString(source: string, encoding?: string): IUint8ArrayBlobAdapter; mutate(source: Uint8Array): IUint8ArrayBlobAdapter; } export function bindUint8ArrayBlobAdapter( toUtf8: Encoder, fromUtf8: Decoder, toBase64: Encoder, fromBase64: Decoder ): Uint8ArrayBlobAdapterConstructor { return class Uint8ArrayBlobAdapter extends Uint8Array { /** * @param source - such as a string or Stream. * @param encoding - utf-8 or base64. * @returns a new Uint8ArrayBlobAdapter extending Uint8Array. */ public static fromString(source: string, encoding = "utf-8"): Uint8ArrayBlobAdapter { if (typeof source === "string") { if (encoding === "base64") { return Uint8ArrayBlobAdapter.mutate(fromBase64(source)); } return Uint8ArrayBlobAdapter.mutate(fromUtf8(source)); } throw new Error(`Unsupported conversion from ${typeof source} to Uint8ArrayBlobAdapter.`); } /** * @param source - Uint8Array to be mutated. * @returns the same Uint8Array but with prototype switched to Uint8ArrayBlobAdapter. */ public static mutate(source: Uint8Array): Uint8ArrayBlobAdapter { Object.setPrototypeOf(source, Uint8ArrayBlobAdapter.prototype); return source as Uint8ArrayBlobAdapter; } public transformToString(encoding = "utf-8"): string { if (encoding === "base64") { return toBase64(this); } return toUtf8(this); } }; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/ChecksumStream.browser.ts ================================================ import type { Checksum, Encoder } from "@smithy/types"; /** * @internal */ export interface ChecksumStreamInit { /** * Base64 value of the expected checksum. */ expectedChecksum: string; /** * For error messaging, the location from which the checksum value was read. */ checksumSourceLocation: string; /** * The checksum calculator. */ checksum: Checksum; /** * The stream to be checked. */ source: ReadableStream; /** * Optional base 64 encoder if calling from a request context. */ base64Encoder?: Encoder; } const ReadableStreamRef = typeof ReadableStream === "function" ? ReadableStream : function (): void {}; /** * This stub exists so that the readable returned by createChecksumStream * identifies as "ChecksumStream" in alignment with the Node.js * implementation. * * @extends ReadableStream */ export class ChecksumStream extends (ReadableStreamRef as any) {} ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/ChecksumStream.ts ================================================ import { Duplex, type Readable } from "node:stream"; import type { Checksum, Encoder } from "@smithy/types"; import { toBase64 } from "../../util-base64/toBase64"; /** * @internal */ export interface ChecksumStreamInit { /** * Base64 value of the expected checksum. */ expectedChecksum: string; /** * For error messaging, the location from which the checksum value was read. */ checksumSourceLocation: string; /** * The checksum calculator. */ checksum: Checksum; /** * The stream to be checked. */ source: T; /** * Optional base 64 encoder if calling from a request context. */ base64Encoder?: Encoder; } /** * Wrapper for throwing checksum errors for streams without * buffering the stream. * * @internal */ export class ChecksumStream extends Duplex { private expectedChecksum: string; private checksumSourceLocation: string; private checksum: Checksum; private source?: Readable; private base64Encoder: Encoder; private pendingCallback: ((err?: Error) => void) | null = null; public constructor({ expectedChecksum, checksum, source, checksumSourceLocation, base64Encoder, }: ChecksumStreamInit) { super(); if (typeof (source as Readable).pipe === "function") { this.source = source as Readable; } else { throw new Error( `@smithy/util-stream: unsupported source type ${source?.constructor?.name ?? source} in ChecksumStream.` ); } this.base64Encoder = base64Encoder ?? toBase64; this.expectedChecksum = expectedChecksum; this.checksum = checksum; this.checksumSourceLocation = checksumSourceLocation; // connect this stream to the end of the source stream. this.source.pipe(this); } /** * Do not call this directly. * @internal */ public _read( // eslint-disable-next-line @typescript-eslint/no-unused-vars size: number ): void { if (this.pendingCallback) { const callback = this.pendingCallback; this.pendingCallback = null; callback(); } } /** * When the upstream source flows data to this stream, * calculate a step update of the checksum. * Do not call this directly. * @internal */ public _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void): void { try { this.checksum.update(chunk); const canPushMore = this.push(chunk); if (!canPushMore) { this.pendingCallback = callback; return; } } catch (e: unknown) { return callback(e as Error); } return callback(); } /** * When the upstream source finishes, perform the checksum comparison. * Do not call this directly. * @internal */ public async _final(callback: (err?: Error) => void): Promise { try { const digest: Uint8Array = await this.checksum.digest(); const received = this.base64Encoder(digest); if (this.expectedChecksum !== received) { return callback( new Error( `Checksum mismatch: expected "${this.expectedChecksum}" but received "${received}"` + ` in response header "${this.checksumSourceLocation}".` ) ); } } catch (e: unknown) { return callback(e as Error); } this.push(null); return callback(); } } ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/createChecksumStream.browser.spec.ts ================================================ import type { Checksum } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { toBase64 } from "../../util-base64/toBase64"; import { toUtf8 } from "../../util-utf8/toUtf8"; import { headStream } from "../headStream.browser"; import { ChecksumStream as ChecksumStreamWeb } from "./ChecksumStream.browser"; import { createChecksumStream } from "./createChecksumStream.browser"; (typeof ReadableStream === "function" && process.version >= "v18" ? describe : describe.skip)( "Checksum streams", () => { /** * Hash "algorithm" that appends all data together. */ class Appender implements Checksum { public hash = ""; async digest(): Promise { return Buffer.from(this.hash); } reset(): void { throw new Error("Function not implemented."); } update(chunk: Uint8Array): void { this.hash += toUtf8(chunk); } } const canonicalData = new Uint8Array("abcdefghijklmnopqrstuvwxyz".split("").map((_) => _.charCodeAt(0))); const canonicalUtf8 = toUtf8(canonicalData); const canonicalBase64 = toBase64(canonicalUtf8); describe(createChecksumStream.name + " webstreams API", () => { if (typeof ReadableStream !== "function") { // test not applicable to Node.js 16. return; } const makeStream = () => { return new ReadableStream({ start(controller) { canonicalData.forEach((byte) => { controller.enqueue(new Uint8Array([byte])); }); controller.close(); }, }); }; it("should extend a ReadableStream", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: canonicalBase64, checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); expect(checksumStream).toBeInstanceOf(ReadableStream); expect(checksumStream).toBeInstanceOf(ChecksumStreamWeb); const collected = toUtf8(await headStream(checksumStream, Infinity)); expect(collected).toEqual(canonicalUtf8); expect(stream.locked).toEqual(true); // expectation is that it is resolved. expect(await checksumStream.getReader().closed); }); it("should throw during stream read if the checksum does not match", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: "different-expected-checksum", checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); try { toUtf8(await headStream(checksumStream, Infinity)); throw new Error("stream was read successfully"); } catch (e: unknown) { expect(String(e)).toEqual( `Error: Checksum mismatch: expected "different-expected-checksum" but` + ` received "${canonicalBase64}"` + ` in response header "my-header".` ); } }); }); } ); ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/createChecksumStream.browser.ts ================================================ import { toBase64 } from "../../util-base64/toBase64.browser"; import { isReadableStream } from "../stream-type-check"; import { ChecksumStream, type ChecksumStreamInit } from "./ChecksumStream.browser"; /** * Alias prevents compiler from turning * ReadableStream into ReadableStream, which is incompatible * with the NodeJS.ReadableStream global type. * @internal */ export type ReadableStreamType = ReadableStream; /** * This is a local copy of * https://developer.mozilla.org/en-US/docs/Web/API/TransformStreamDefaultController * in case users do not have this type. */ interface TransformStreamDefaultController { enqueue(chunk: any): void; error(error: unknown): void; terminate(): void; } /** * Creates a stream adapter for throwing checksum errors for streams without * buffering the stream. * @internal */ export const createChecksumStream = ({ expectedChecksum, checksum, source, checksumSourceLocation, base64Encoder, }: ChecksumStreamInit): ReadableStreamType => { if (!isReadableStream(source)) { throw new Error( `@smithy/util-stream: unsupported source type ${(source as any)?.constructor?.name ?? source} in ChecksumStream.` ); } const encoder = base64Encoder ?? toBase64; if (typeof TransformStream !== "function") { throw new Error( "@smithy/util-stream: unable to instantiate ChecksumStream because API unavailable: ReadableStream/TransformStream." ); } const transform = new TransformStream({ start() {}, async transform(chunk: any, controller: TransformStreamDefaultController) { /** * When the upstream source flows data to this stream, * calculate a step update of the checksum. */ checksum.update(chunk); controller.enqueue(chunk); }, async flush(controller: TransformStreamDefaultController) { const digest: Uint8Array = await checksum.digest(); const received = encoder(digest); if (expectedChecksum !== received) { const error = new Error( `Checksum mismatch: expected "${expectedChecksum}" but received "${received}"` + ` in response header "${checksumSourceLocation}".` ); controller.error(error); } else { controller.terminate(); } }, }); source.pipeThrough(transform); const readable = transform.readable; Object.setPrototypeOf(readable, ChecksumStream.prototype); return readable; }; ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/createChecksumStream.spec.ts ================================================ import { Readable } from "node:stream"; import type { Checksum } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { toBase64 } from "../../util-base64/toBase64"; import { toUtf8 } from "../../util-utf8/toUtf8"; import { headStream } from "../headStream"; import { ChecksumStream } from "./ChecksumStream"; import { ChecksumStream as ChecksumStreamWeb } from "./ChecksumStream.browser"; import { createChecksumStream } from "./createChecksumStream"; describe("Checksum streams", () => { /** * Hash "algorithm" that appends all data together. */ class Appender implements Checksum { public hash = ""; async digest(): Promise { return Buffer.from(this.hash); } reset(): void { throw new Error("Function not implemented."); } update(chunk: Uint8Array): void { this.hash += toUtf8(chunk); } } const canonicalData = new Uint8Array("abcdefghijklmnopqrstuvwxyz".split("").map((_) => _.charCodeAt(0))); const canonicalUtf8 = toUtf8(canonicalData); const canonicalBase64 = toBase64(canonicalUtf8); describe(createChecksumStream.name, () => { const makeStream = () => { return Readable.from(Buffer.from(canonicalData.buffer, 0, 26)); }; it("should extend a Readable stream", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: canonicalBase64, checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); expect(checksumStream).toBeInstanceOf(Readable); expect(checksumStream).toBeInstanceOf(ChecksumStream); const collected = toUtf8(await headStream(checksumStream, Infinity)); expect(collected).toEqual(canonicalUtf8); expect(stream.readableEnded).toEqual(true); expect(checksumStream.readableEnded).toEqual(true); }); it("should throw during stream read if the checksum does not match", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: "different-expected-checksum", checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); try { toUtf8(await headStream(checksumStream, Infinity)); throw new Error("stream was read successfully"); } catch (e: unknown) { expect(String(e)).toEqual( `Error: Checksum mismatch: expected "different-expected-checksum" but` + ` received "${canonicalBase64}"` + ` in response header "my-header".` ); } }); it("should handle backpressure", async () => { // for Node.js 22+ increased default highwater mark. Readable.setDefaultHighWaterMark(false, 16_384); let originalStreamBuffered = 0; const stream = Readable.from( { async *[Symbol.asyncIterator]() { for (let i = 0; i < 100; ++i) { const chunk = new Uint8Array(16_384); originalStreamBuffered += chunk.byteLength; yield chunk; } }, }, { highWaterMark: 1, } ); const checksumStream = createChecksumStream({ expectedChecksum: toBase64(new Uint8Array()), checksum: { async digest() { return new Uint8Array(); }, update: () => {}, reset: () => {}, }, checksumSourceLocation: "my-header", source: stream, }); const ait = checksumStream[Symbol.asyncIterator](); const c1 = await ait.next(); expect(c1.done).toBe(false); expect(c1.value.byteLength).toEqual(16_384); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * 2); await new Promise((r) => setTimeout(r, 200)); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * 3); const c2 = await ait.next(); expect(c2.done).toBe(false); expect(c2.value.byteLength).toEqual(16_384); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * 4); await new Promise((r) => setTimeout(r, 200)); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * 4); await new Promise((r) => setTimeout(r, 200)); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * 4); // the stream yields at the rate at which we read it. let i = 5; while (true) { const { done } = await ait.next(); await new Promise((r) => setTimeout(r, 5)); expect(originalStreamBuffered).toBeLessThanOrEqual(16_384 * i++); if (done) { break; } } expect(originalStreamBuffered).toEqual(16_384 * 100); }); }); describe(createChecksumStream.name + " webstreams API", () => { if (typeof ReadableStream !== "function") { it.skip("Skipped when ReadableStream is not globally available.", () => {}); // test not applicable to Node.js 16. return; } const makeStream = () => { return new ReadableStream({ start(controller) { canonicalData.forEach((byte) => { controller.enqueue(new Uint8Array([byte])); }); controller.close(); }, }); }; it("should extend a ReadableStream", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: canonicalBase64, checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); expect(checksumStream).toBeInstanceOf(ReadableStream); expect(checksumStream).toBeInstanceOf(ChecksumStreamWeb); const collected = toUtf8(await headStream(checksumStream, Infinity)); expect(collected).toEqual(canonicalUtf8); expect(stream.locked).toEqual(true); // expectation is that it is resolved. expect(await checksumStream.getReader().closed); }); it("should throw during stream read if the checksum does not match", async () => { const stream = makeStream(); const checksumStream = createChecksumStream({ expectedChecksum: "different-expected-checksum", checksum: new Appender(), checksumSourceLocation: "my-header", source: stream, }); try { toUtf8(await headStream(checksumStream, Infinity)); throw new Error("stream was read successfully"); } catch (e: unknown) { expect(String(e)).toEqual( `Error: Checksum mismatch: expected "different-expected-checksum" but` + ` received "${canonicalBase64}"` + ` in response header "my-header".` ); } }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/checksum/createChecksumStream.ts ================================================ import type { Readable } from "node:stream"; import { isReadableStream } from "../stream-type-check"; import { ChecksumStream, type ChecksumStreamInit } from "./ChecksumStream"; import { createChecksumStream as createChecksumStreamWeb, type ReadableStreamType, } from "./createChecksumStream.browser"; /** * Creates a stream mirroring the input stream's interface, but * performs checksumming when reading to the end of the stream. * @internal */ export function createChecksumStream(init: ChecksumStreamInit): ReadableStreamType; /** * @internal */ export function createChecksumStream(init: ChecksumStreamInit): Readable; /** * @internal */ export function createChecksumStream( init: ChecksumStreamInit ): Readable | ReadableStreamType { if (typeof ReadableStream === "function" && isReadableStream(init.source)) { return createChecksumStreamWeb(init as ChecksumStreamInit); } return new ChecksumStream(init as ChecksumStreamInit); } ================================================ FILE: packages/core/src/submodules/serde/util-stream/createBufferedReadable.browser.spec.ts ================================================ import { Readable } from "node:stream"; import { describe, expect, test as it, vi } from "vitest"; import { createBufferedReadableStream } from "./createBufferedReadable.browser"; import { headStream } from "./headStream"; describe("Buffered ReadableStream", () => { function stringStream(size: number, chunkSize: number) { async function* generate() { while (size > 0) { yield "a".repeat(chunkSize); size -= chunkSize; } } return Readable.toWeb(Readable.from(generate())); } function byteStream(size: number, chunkSize: number) { async function* generate() { while (size > 0) { yield new Uint8Array(chunkSize); size -= chunkSize; } } return Readable.toWeb(Readable.from(generate())); } function patternedByteStream(size: number, chunkSize: number) { let n = 0; const data = Array(size); for (let i = 0; i < size; ++i) { data[i] = n++ % 255; } let dataCursor = 0; async function* generate() { while (size > 0) { const z = Math.min(size, chunkSize); const bytes = new Uint8Array(data.slice(dataCursor, dataCursor + z)); size -= z; dataCursor += z; yield bytes; } } return { stream: Readable.toWeb(Readable.from(size === 0 ? Buffer.from("") : generate())) as unknown as ReadableStream, array: new Uint8Array(data), }; } const logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error() {}, }; it("should join upstream chunks if they are too small (stringStream)", async () => { let upstreamChunkCount = 0; let downstreamChunkCount = 0; const upstream = stringStream(1024, 8); const upstreamReader = upstream.getReader(); const midstream = new ReadableStream({ async pull(controller) { const { value, done } = await upstreamReader.read(); if (done) { controller.close(); } else { expect(value.length).toBe(8); upstreamChunkCount += 1; controller.enqueue(value); } }, }); const downstream = createBufferedReadableStream(midstream, 64); const reader = downstream.getReader(); while (true) { const { done, value } = await reader.read(); if (done) { break; } else { downstreamChunkCount += 1; expect(value.length).toBe(64); } } expect(upstreamChunkCount).toEqual(128); expect(downstreamChunkCount).toEqual(16); }); it("should join upstream chunks if they are too small (byteStream)", async () => { let upstreamChunkCount = 0; let downstreamChunkCount = 0; const upstream = byteStream(1031, 7); const upstreamReader = upstream.getReader(); const midstream = new ReadableStream({ async pull(controller) { const { value, done } = await upstreamReader.read(); if (done) { controller.close(); } else { expect(value.length).toBe(7); upstreamChunkCount += 1; controller.enqueue(value); } }, }); const downstream = createBufferedReadableStream(midstream, 49, logger); const downstreamReader = downstream.getReader(); while (true) { const { done, value } = await downstreamReader.read(); if (done) { break; } else { downstreamChunkCount += 1; if (value.byteLength > 7) { expect(value.byteLength).toBe(49); } } } expect(upstreamChunkCount).toEqual(148); expect(downstreamChunkCount).toEqual(22); expect(logger.warn).toHaveBeenCalled(); }); const dataSizes = [0, 10, 101, 1_001, 10_001, 100_001]; const chunkSizes = [1, 8, 16, 32, 64, 128, 1024, 8 * 1024, 64 * 1024, 1024 * 1024]; const bufferSizes = [0, 1024, 8 * 1024, 32 * 1024, 64 * 1024, 1024 * 1024]; for (const dataSize of dataSizes) { for (const chunkSize of chunkSizes) { for (const bufferSize of bufferSizes) { it(`should maintain data integrity for data=${dataSize} chunk=${chunkSize} min-buffer=${bufferSize}`, async () => { const { stream, array } = patternedByteStream(dataSize, chunkSize); const bufferedStream = createBufferedReadableStream(stream, bufferSize); const collected = await headStream(bufferedStream, Infinity); expect(collected).toEqual(array); }); } } } }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/createBufferedReadable.browser.ts ================================================ import type { Logger } from "@smithy/types"; import { ByteArrayCollector } from "./ByteArrayCollector"; export type BufferStore = [string, ByteArrayCollector, ByteArrayCollector?]; export type BufferUnion = string | Uint8Array; export type Modes = 0 | 1 | 2; /** * the minimum size is met, except for the last chunk. * * @internal * @param upstream - any ReadableStream. * @param size - byte or character length minimum. Buffering occurs when a chunk fails to meet this value. * @param logger - for emitting warnings when buffering occurs. * @returns another stream of the same data, but buffers chunks until */ export function createBufferedReadableStream(upstream: ReadableStream, size: number, logger?: Logger): ReadableStream { const reader = upstream.getReader(); let streamBufferingLoggedWarning = false; let bytesSeen = 0; const buffers = ["", new ByteArrayCollector((size) => new Uint8Array(size))] as BufferStore; let mode: Modes | -1 = -1; const pull = async (controller: { enqueue(chunk: any): void; close(): void }) => { const { value, done } = await reader.read(); const chunk = value; if (done) { if (mode !== -1) { const remainder = flush(buffers, mode); if (sizeOf(remainder) > 0) { controller.enqueue(remainder); } } controller.close(); } else { const chunkMode = modeOf(chunk, false); if (mode !== chunkMode) { if (mode >= 0) { controller.enqueue(flush(buffers, mode)); } mode = chunkMode; } if (mode === -1) { controller.enqueue(chunk); return; } const chunkSize = sizeOf(chunk); bytesSeen += chunkSize; const bufferSize = sizeOf(buffers[mode]); if (chunkSize >= size && bufferSize === 0) { // skip writing to the intermediate buffer // because the upstream chunk is already large enough. controller.enqueue(chunk); } else { // buffer and potentially flush the data downstream. const newSize = merge(buffers, mode, chunk); if (!streamBufferingLoggedWarning && bytesSeen > size * 2) { streamBufferingLoggedWarning = true; logger?.warn( `@smithy/util-stream - stream chunk size ${chunkSize} is below threshold of ${size}, automatically buffering.` ); } if (newSize >= size) { controller.enqueue(flush(buffers, mode)); } else { // repeat the pull because a call to pull must enqueue // something but this call did not enqueue anything. await pull(controller); } } } }; return new ReadableStream({ pull, }); } /** * Replaces R/RS polymorphic implementation in environments with only ReadableStream. * @internal */ export const createBufferedReadable = createBufferedReadableStream; /** * @internal * @param buffers * @param mode * @param chunk * @returns the new buffer size after merging the chunk with its appropriate buffer. */ export function merge(buffers: BufferStore, mode: Modes, chunk: string | Uint8Array): number { switch (mode) { case 0: buffers[0] += chunk; return sizeOf(buffers[0]); case 1: case 2: buffers[mode]!.push(chunk as Uint8Array); return sizeOf(buffers[mode]); } } /** * @internal * @param buffers * @param mode * @returns the buffer matching the mode. */ export function flush(buffers: BufferStore, mode: Modes | -1): BufferUnion { switch (mode) { case 0: const s = buffers[0]; buffers[0] = ""; return s; case 1: case 2: return buffers[mode]!.flush(); } throw new Error(`@smithy/util-stream - invalid index ${mode} given to flush()`); } /** * @internal * @param chunk * @returns size of the chunk in bytes or characters. */ export function sizeOf(chunk?: { byteLength?: number; length?: number }): number { return (chunk as Uint8Array)?.byteLength ?? chunk?.length ?? 0; } /** * @internal * @param chunk - from upstream Readable. * @param allowBuffer - allow mode 2 (Buffer), otherwise Buffer will return mode 1. * @returns type index of the chunk. */ export function modeOf(chunk: BufferUnion, allowBuffer = true): Modes | -1 { if (allowBuffer && typeof Buffer !== "undefined" && chunk instanceof Buffer) { return 2; } if (chunk instanceof Uint8Array) { return 1; } if (typeof chunk === "string") { return 0; } return -1; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/createBufferedReadable.spec.ts ================================================ import { Readable } from "node:stream"; import { describe, expect, test as it, vi } from "vitest"; import { createBufferedReadable } from "./createBufferedReadable"; import { headStream } from "./headStream"; describe("Buffered Readable stream", () => { function stringStream(size: number, chunkSize: number) { async function* generate() { while (size > 0) { yield "a".repeat(chunkSize); size -= chunkSize; } } return Readable.from(generate()); } function byteStream(size: number, chunkSize: number) { async function* generate() { while (size > 0) { yield Buffer.from(new Uint8Array(chunkSize)); size -= chunkSize; } } return Readable.from(generate()); } function patternedByteStream(size: number, chunkSize: number) { let n = 0; const data = Array(size); for (let i = 0; i < size; ++i) { data[i] = n++ % 255; } let dataCursor = 0; async function* generate() { while (size > 0) { const z = Math.min(size, chunkSize); const bytes = new Uint8Array(data.slice(dataCursor, dataCursor + z)); size -= z; dataCursor += z; yield bytes; } } return { stream: Readable.from(size === 0 ? Buffer.from("") : generate()), array: new Uint8Array(data), }; } const logger = { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error() {}, }; const KB = 1024; const dataSizes = [0, 10, 101, 1_001, 10_001, 100_001]; const chunkSizes = [1, 8, 16, 32, 64, 128, 1024, 8 * 1024, 64 * 1024, 1024 * 1024]; const bufferSizes = [0, 1024, 8 * 1024, 32 * 1024, 64 * 1024, 1024 * 1024]; for (const dataSize of dataSizes) { for (const chunkSize of chunkSizes) { for (const bufferSize of bufferSizes) { it(`should maintain data integrity for data=${dataSize} chunk=${chunkSize} min-buffer=${bufferSize}`, async () => { const { stream, array } = patternedByteStream(dataSize, chunkSize); const bufferedStream = createBufferedReadable(stream, bufferSize); const collected = await headStream(bufferedStream, Infinity); expect(collected).toEqual(array); }); } } } for (const [dataSize, chunkSize, bufferSize] of [ [10 * KB, 1 * KB, 0 * KB], [10 * KB, 1 * KB, 1 * KB], [10 * KB, 1 * KB, 2.1 * KB], [10 * KB, 1 * KB, 4 * KB], [10 * KB, 2 * KB, 1 * KB], ]) { it(`should maintain data integrity for data=${dataSize} chunk=${chunkSize} min-buffer=${bufferSize}`, async () => { const { stream, array } = patternedByteStream(dataSize, chunkSize); const bufferedStream = createBufferedReadable(stream, bufferSize); const collected = await headStream(bufferedStream, Infinity); expect(collected).toEqual(array); }); } it("should join upstream chunks if they are too small (stringStream)", async () => { const upstream = stringStream(1024, 8); const downstream = createBufferedReadable(upstream, 64); let upstreamChunkCount = 0; upstream.on("data", () => { upstreamChunkCount += 1; }); let downstreamChunkCount = 0; downstream.on("data", () => { downstreamChunkCount += 1; }); await headStream(downstream, Infinity); expect(upstreamChunkCount).toEqual(128); expect(downstreamChunkCount).toEqual(16); }); it("should join upstream chunks if they are too small (byteStream)", async () => { const upstream = byteStream(1031, 7); const downstream = createBufferedReadable(upstream, 49, logger); let upstreamChunkCount = 0; upstream.on("data", () => { upstreamChunkCount += 1; }); let downstreamChunkCount = 0; downstream.on("data", () => { downstreamChunkCount += 1; }); await headStream(downstream, Infinity); expect(Math.ceil(1031 / 7)).toBe(148); expect(Math.ceil(1031 / 49)).toBe(22); expect(upstreamChunkCount).toEqual(148); expect(downstreamChunkCount).toEqual(22); expect(logger.warn).toHaveBeenCalled(); }); }, 30_000); ================================================ FILE: packages/core/src/submodules/serde/util-stream/createBufferedReadable.ts ================================================ import { Readable } from "node:stream"; import type { Logger } from "@smithy/types"; import { ByteArrayCollector } from "./ByteArrayCollector"; import { createBufferedReadableStream, flush, merge, modeOf, sizeOf, type BufferStore, type Modes, } from "./createBufferedReadable.browser"; import { isReadableStream } from "./stream-type-check"; /** * the minimum size is met, except for the last chunk. * * @internal * @param upstream - any Readable or ReadableStream. * @param size - byte or character length minimum. Buffering occurs when a chunk fails to meet this value. * @param logger - for emitting warnings when buffering occurs. * @returns another stream of the same data and stream class, but buffers chunks until */ export function createBufferedReadable(upstream: Readable, size: number, logger?: Logger): Readable; /** * @internal */ export function createBufferedReadable(upstream: ReadableStream, size: number, logger?: Logger): ReadableStream; /** * @internal */ export function createBufferedReadable( upstream: Readable | ReadableStream, size: number, logger?: Logger ): Readable | ReadableStream { if (isReadableStream(upstream)) { return createBufferedReadableStream(upstream, size, logger); } const downstream = new Readable({ read() {} }); let streamBufferingLoggedWarning = false; let bytesSeen = 0; const buffers = [ "", new ByteArrayCollector((size) => new Uint8Array(size)), new ByteArrayCollector((size) => Buffer.from(new Uint8Array(size))), ] as BufferStore; let mode: Modes | -1 = -1; upstream.on("data", (chunk) => { const chunkMode = modeOf(chunk, true); if (mode !== chunkMode) { if (mode >= 0) { downstream.push(flush(buffers, mode)); } mode = chunkMode; } if (mode === -1) { downstream.push(chunk); return; } const chunkSize = sizeOf(chunk); bytesSeen += chunkSize; const bufferSize = sizeOf(buffers[mode]); if (chunkSize >= size && bufferSize === 0) { // skip writing to the intermediate buffer // because the upstream chunk is already large enough. downstream.push(chunk); } else { // buffer and potentially flush the data downstream. const newSize = merge(buffers, mode, chunk); if (!streamBufferingLoggedWarning && bytesSeen > size * 2) { streamBufferingLoggedWarning = true; logger?.warn( `@smithy/util-stream - stream chunk size ${chunkSize} is below threshold of ${size}, automatically buffering.` ); } if (newSize >= size) { downstream.push(flush(buffers, mode)); } } }); upstream.on("end", () => { if (mode !== -1) { const remainder = flush(buffers, mode); if (sizeOf(remainder) > 0) { downstream.push(remainder); } } downstream.push(null); }); return downstream; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/getAwsChunkedEncodingStream.browser.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { getAwsChunkedEncodingStream as getAwsChunkedEncodingStreamRs } from "./getAwsChunkedEncodingStream"; import { getAwsChunkedEncodingStream } from "./getAwsChunkedEncodingStream.browser"; describe(getAwsChunkedEncodingStream.name, () => { const mockChecksum = "mockChecksum"; const mockRawChecksum = Buffer.from(mockChecksum); const mockStreamChunks = ["Hello", "World"]; const mockBodyLength = 5; const mockBase64Encoder = () => mockChecksum; const mockBodyLengthChecker = () => mockBodyLength; const mockChecksumAlgorithmFn = () => {}; const mockChecksumLocationName = "mockChecksumLocationName"; const mockStreamHasher = () => mockRawChecksum; const mockOptions: any = { base64Encoder: mockBase64Encoder, bodyLengthChecker: mockBodyLengthChecker, checksumAlgorithmFn: mockChecksumAlgorithmFn, checksumLocationName: mockChecksumLocationName, streamHasher: mockStreamHasher, }; const getMockReadableStream = () => { return new ReadableStream({ start(controller) { for (const chunk of mockStreamChunks) { controller.enqueue(chunk); } controller.close(); }, }); }; const validateStream = async (readableStream: ReadableStream, expectedBuffer: string) => { let buffer = ""; const reader = readableStream.getReader(); while (true) { const { done, value } = await reader.read(); if (done) { break; } buffer += value; } reader.releaseLock(); expect(buffer).toEqual(expectedBuffer); }; describe("skips checksum computation", () => { const expectedBuffer = `5\r Hello\r 5\r World\r 0\r `; it("if none of the required options are passed", async () => { const readableStream = getMockReadableStream(); const awsChunkedBody = getAwsChunkedEncodingStream(readableStream, { bodyLengthChecker: mockBodyLengthChecker, }); await validateStream(awsChunkedBody, expectedBuffer); }); ["base64Encoder", "checksumAlgorithmFn", "checksumLocationName", "streamHasher"].forEach((optionToRemove) => { it(`if option '${optionToRemove} is not passed`, async () => { const readableStream = getMockReadableStream(); const awsChunkedBody = getAwsChunkedEncodingStream(readableStream, { ...mockOptions, [optionToRemove]: undefined, }); await validateStream(awsChunkedBody, expectedBuffer); }); }); }); it("computes checksum and adds it to the end event", async () => { const readableStream = getMockReadableStream(); const awsChunkedBody = getAwsChunkedEncodingStream(readableStream, mockOptions); const expectedBuffer = `5\r Hello\r 5\r World\r 0\r ${mockChecksumLocationName}:${mockChecksum}\r \r `; await validateStream(awsChunkedBody, expectedBuffer); }); it("redirects from Readable to ReadableStream implementation", async () => { const readableStream = getMockReadableStream(); const awsChunkedBody = getAwsChunkedEncodingStreamRs(readableStream, mockOptions); const expectedBuffer = `5\r Hello\r 5\r World\r 0\r ${mockChecksumLocationName}:${mockChecksum}\r \r `; await validateStream(awsChunkedBody, expectedBuffer); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/getAwsChunkedEncodingStream.browser.ts ================================================ import type { GetAwsChunkedEncodingStream, GetAwsChunkedEncodingStreamOptions } from "@smithy/types"; /** * @internal */ export const getAwsChunkedEncodingStream: GetAwsChunkedEncodingStream = ( readableStream: ReadableStream, options: GetAwsChunkedEncodingStreamOptions ) => { const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options; const checksumRequired = base64Encoder !== undefined && bodyLengthChecker !== undefined && checksumAlgorithmFn !== undefined && checksumLocationName !== undefined && streamHasher !== undefined; const digest = checksumRequired ? streamHasher!(checksumAlgorithmFn!, readableStream) : undefined; // ToDo: Validate the ReadableStream and getReader() is accessible before calling. // ReactNative doesn't support ReadableStream. They might not be available in older browsers, or some polyfills. const reader = readableStream.getReader(); return new ReadableStream({ async pull(controller) { const { value, done } = await reader.read(); if (done) { controller.enqueue(`0\r\n`); if (checksumRequired) { const checksum = base64Encoder!(await digest!); controller.enqueue(`${checksumLocationName}:${checksum}\r\n`); controller.enqueue(`\r\n`); } controller.close(); } else { controller.enqueue(`${(bodyLengthChecker(value) || 0).toString(16)}\r\n${value}\r\n`); } }, }); }; ================================================ FILE: packages/core/src/submodules/serde/util-stream/getAwsChunkedEncodingStream.spec.ts ================================================ import { Readable } from "node:stream"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getAwsChunkedEncodingStream } from "./getAwsChunkedEncodingStream"; describe(getAwsChunkedEncodingStream.name, () => { const mockBase64Encoder = vi.fn(); const mockBodyLengthChecker = vi.fn(); const mockChecksumAlgorithmFn = vi.fn(); const mockChecksumLocationName = "mockChecksumLocationName"; const mockStreamHasher = vi.fn(); const mockOptions = { base64Encoder: mockBase64Encoder, bodyLengthChecker: mockBodyLengthChecker, checksumAlgorithmFn: mockChecksumAlgorithmFn, checksumLocationName: mockChecksumLocationName, streamHasher: mockStreamHasher, }; const mockChecksum = "mockChecksum"; const mockRawChecksum = Buffer.from(mockChecksum); const mockStreamChunks = ["Hello", "World"]; const mockBodyLength = 5; const getMockReadableStream = () => { const readableStream = new Readable(); mockStreamChunks.forEach((chunk) => { readableStream.push(chunk); }); readableStream.push(null); return readableStream; }; beforeEach(() => { mockStreamHasher.mockResolvedValue(mockRawChecksum); mockBase64Encoder.mockReturnValue(mockChecksum); }); describe("mock stream", () => { beforeEach(() => { mockBodyLengthChecker.mockReturnValue(mockBodyLength); }); afterEach(() => { expect(mockBodyLengthChecker).toHaveBeenCalledTimes(mockStreamChunks.length); mockStreamChunks.forEach((chunk, index) => { expect(mockBodyLengthChecker).toHaveBeenNthCalledWith(index + 1, Buffer.from(chunk)); }); vi.clearAllMocks(); }); describe("skips checksum computation", () => { const validateStreamWithoutChecksum = async (awsChunkedEncodingStream: Readable) => { let buffer = ""; let resolve: Function; const promise = new Promise((r) => (resolve = r)); awsChunkedEncodingStream.on("data", (data) => { buffer += data.toString(); }); awsChunkedEncodingStream.on("end", () => { expect(mockStreamHasher).not.toHaveBeenCalled(); expect(mockBase64Encoder).not.toHaveBeenCalled(); expect(buffer).toEqual(`5\r Hello\r 5\r World\r 0\r `); resolve(); }); await promise; }; it("if none of the required options are passed", async () => { const readableStream = getMockReadableStream(); const awsChunkedEncodingStream = getAwsChunkedEncodingStream(readableStream, { bodyLengthChecker: mockBodyLengthChecker, }); await validateStreamWithoutChecksum(awsChunkedEncodingStream); }); ["base64Encoder", "checksumAlgorithmFn", "checksumLocationName", "streamHasher"].forEach((optionToRemove) => { it(`if option '${optionToRemove}' is not passed`, async () => { const readableStream = getMockReadableStream(); const awsChunkedEncodingStream = getAwsChunkedEncodingStream(readableStream, { ...mockOptions, [optionToRemove]: undefined, }); await validateStreamWithoutChecksum(awsChunkedEncodingStream); }); }); }); it("computes checksum and adds it to the end event", async () => { const readableStream = getMockReadableStream(); const awsChunkedEncodingStream = getAwsChunkedEncodingStream(readableStream, mockOptions); let resolve: Function; const promise = new Promise((r) => (resolve = r)); let buffer = ""; awsChunkedEncodingStream.on("data", (data) => { buffer += data.toString(); }); awsChunkedEncodingStream.on("end", () => { expect(mockStreamHasher).toHaveBeenCalledWith(mockChecksumAlgorithmFn, readableStream); expect(mockBase64Encoder).toHaveBeenCalledWith(mockRawChecksum); expect(buffer).toStrictEqual(`5\r Hello\r 5\r World\r 0\r mockChecksumLocationName:mockChecksum\r \r `); resolve(); }); await promise; }); }); it("does not emit chunks of zero length", async () => { const readableStream = Readable.from({ async *[Symbol.asyncIterator]() { yield ""; yield ""; yield ""; yield ""; }, }); const awsChunkedEncodingStream = getAwsChunkedEncodingStream(readableStream, { ...mockOptions, bodyLengthChecker: () => 0, }); let resolve: Function; const promise = new Promise((r) => (resolve = r)); let buffer = ""; awsChunkedEncodingStream.on("data", (data) => { buffer += data.toString(); }); awsChunkedEncodingStream.on("end", () => { expect(mockStreamHasher).toHaveBeenCalledWith(mockChecksumAlgorithmFn, readableStream); expect(mockBase64Encoder).toHaveBeenCalledWith(mockRawChecksum); expect(buffer).toStrictEqual(`0\r mockChecksumLocationName:mockChecksum\r \r `); resolve(); }); await promise; }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/getAwsChunkedEncodingStream.ts ================================================ import { Readable } from "node:stream"; import type { GetAwsChunkedEncodingStreamOptions } from "@smithy/types"; import { getAwsChunkedEncodingStream as getAwsChunkedEncodingStreamBrowser } from "./getAwsChunkedEncodingStream.browser"; import { isReadableStream } from "./stream-type-check"; /** * @internal */ export function getAwsChunkedEncodingStream(stream: Readable, options: GetAwsChunkedEncodingStreamOptions): Readable; /** * @internal */ export function getAwsChunkedEncodingStream( stream: ReadableStream, options: GetAwsChunkedEncodingStreamOptions ): ReadableStream; /** * @internal */ export function getAwsChunkedEncodingStream( stream: Readable | ReadableStream, options: GetAwsChunkedEncodingStreamOptions ): Readable | ReadableStream { const readable = stream as Readable; const readableStream = stream as ReadableStream; if (isReadableStream(readableStream)) { return getAwsChunkedEncodingStreamBrowser(readableStream, options); } const { base64Encoder, bodyLengthChecker, checksumAlgorithmFn, checksumLocationName, streamHasher } = options; const checksumRequired = base64Encoder !== undefined && checksumAlgorithmFn !== undefined && checksumLocationName !== undefined && streamHasher !== undefined; const digest = checksumRequired ? streamHasher!(checksumAlgorithmFn!, readable) : undefined; const awsChunkedEncodingStream = new Readable({ read: () => {}, }); readable.on("data", (data) => { const length = bodyLengthChecker(data) || 0; if (length === 0) { return; } awsChunkedEncodingStream.push(`${length.toString(16)}\r\n`); awsChunkedEncodingStream.push(data); awsChunkedEncodingStream.push("\r\n"); }); readable.on("end", async () => { awsChunkedEncodingStream.push(`0\r\n`); if (checksumRequired) { const checksum = base64Encoder!(await digest!); awsChunkedEncodingStream.push(`${checksumLocationName}:${checksum}\r\n`); awsChunkedEncodingStream.push(`\r\n`); } awsChunkedEncodingStream.push(null); }); return awsChunkedEncodingStream; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/headStream.browser.ts ================================================ /** * Caution: the input stream must be destroyed separately, this function does not do so. * @internal * @param stream * @param bytes - read head bytes from the stream and discard the rest of it. */ export async function headStream(stream: ReadableStream, bytes: number): Promise { let byteLengthCounter = 0; const chunks = []; const reader = stream.getReader(); let isDone = false; while (!isDone) { const { done, value } = await reader.read(); if (value) { chunks.push(value); byteLengthCounter += value?.byteLength ?? 0; } if (byteLengthCounter >= bytes) { break; } isDone = done; } reader.releaseLock(); const collected = new Uint8Array(Math.min(bytes, byteLengthCounter)); let offset = 0; for (const chunk of chunks) { if (chunk.byteLength > collected.byteLength - offset) { collected.set(chunk.subarray(0, collected.byteLength - offset), offset); break; } else { collected.set(chunk, offset); } offset += chunk.length; } return collected; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/headStream.spec.ts ================================================ import { Readable } from "node:stream"; import { describe, expect, test as it } from "vitest"; import { headStream } from "./headStream"; import { headStream as headWebStream } from "./headStream.browser"; import { splitStream } from "./splitStream"; import { splitStream as splitWebStream } from "./splitStream.browser"; const CHUNK_SIZE = 4; const a32 = "abcd".repeat(32_000 / CHUNK_SIZE); const a16 = "abcd".repeat(16_000 / CHUNK_SIZE); const a8 = "abcd".repeat(8); const a4 = "abcd".repeat(4); const a2 = "abcd".repeat(2); const a1 = "abcd".repeat(1); describe(headStream.name, () => { it("should collect the head of a Node.js stream", async () => { const data = Buffer.from(a32); const myStream = Readable.from(data); const head = await headStream(myStream, 16_000); expect(Buffer.from(head).toString()).toEqual(a16); }); it("should collect the head of a web stream", async () => { if (typeof ReadableStream !== "undefined") { const buffer = Buffer.from(a32); const data = Array.from(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)); const myStream = new ReadableStream({ start(controller) { for (const inputChunk of data) { controller.enqueue(new Uint8Array([inputChunk])); } controller.close(); }, }); const head = await headWebStream(myStream, 16_000); expect(Buffer.from(head).toString()).toEqual(a16); } }); }); describe("splitStream and headStream integration", () => { it("should split and head streams for Node.js", async () => { const data = Buffer.from(a32); const myStream = Readable.from(data); const [a, _1] = await splitStream(myStream); const [b, _2] = await splitStream(_1); const [c, _3] = await splitStream(_2); const [d, _4] = await splitStream(_3); const [e, f] = await splitStream(_4); const byteArr1 = await headStream(a, Infinity); const byteArr2 = await headStream(b, 16_000); const byteArr3 = await headStream(c, 8 * CHUNK_SIZE); const byteArr4 = await headStream(d, 4 * CHUNK_SIZE); const byteArr5 = await headStream(e, 2 * CHUNK_SIZE); const byteArr6 = await headStream(f, CHUNK_SIZE); await Promise.all([a, b, c, d, e, f].map((stream) => stream.destroy())); expect(Buffer.from(byteArr1).toString()).toEqual(a32); expect(Buffer.from(byteArr2).toString()).toEqual(a16); expect(Buffer.from(byteArr3).toString()).toEqual(a8); expect(Buffer.from(byteArr4).toString()).toEqual(a4); expect(Buffer.from(byteArr5).toString()).toEqual(a2); expect(Buffer.from(byteArr6).toString()).toEqual(a1); }); it("should split and head streams for web streams API", async () => { if (typeof ReadableStream !== "undefined") { const buffer = Buffer.from(a8); const data = Array.from(new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength)); const myStream = new ReadableStream({ start(controller) { for (let i = 0; i < data.length; i += CHUNK_SIZE) { controller.enqueue(new Uint8Array(data.slice(i, i + CHUNK_SIZE))); } controller.close(); }, }); const [a, _1] = await splitWebStream(myStream); const [b, _2] = await splitWebStream(_1); const [c, _3] = await splitWebStream(_2); const [d, e] = await splitWebStream(_3); const byteArr1 = await headWebStream(a, Infinity); const byteArr2 = await headWebStream(b, 8 * CHUNK_SIZE); const byteArr3 = await headWebStream(c, 4 * CHUNK_SIZE); const byteArr4 = await headWebStream(d, 2 * CHUNK_SIZE); const byteArr5 = await headWebStream(e, CHUNK_SIZE); await Promise.all([a, b, c, d, e].map((stream) => stream.cancel())); expect(Buffer.from(byteArr1).toString()).toEqual(a8); expect(Buffer.from(byteArr2).toString()).toEqual(a8); expect(Buffer.from(byteArr3).toString()).toEqual(a4); expect(Buffer.from(byteArr4).toString()).toEqual(a2); expect(Buffer.from(byteArr5).toString()).toEqual(a1); } }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/headStream.ts ================================================ import { Writable, type Readable } from "node:stream"; import { headStream as headWebStream } from "./headStream.browser"; import { isReadableStream } from "./stream-type-check"; /** * Caution: the input stream must be destroyed separately, this function does not do so. * * @internal * @param stream - to be read. * @param bytes - read head bytes from the stream and discard the rest of it. */ export const headStream = (stream: Readable | ReadableStream, bytes: number): Promise => { if (isReadableStream(stream)) { return headWebStream(stream, bytes); } return new Promise((resolve, reject) => { const collector = new Collector(); collector.limit = bytes; stream.pipe(collector); stream.on("error", (err) => { collector.end(); reject(err); }); collector.on("error", reject); collector.on("finish", function (this: Collector) { const bytes = new Uint8Array(Buffer.concat(this.buffers)); resolve(bytes); }); }); }; class Collector extends Writable { public readonly buffers: Buffer[] = []; public limit = Infinity; private bytesBuffered = 0; _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void) { this.buffers.push(chunk); this.bytesBuffered += chunk.byteLength ?? 0; if (this.bytesBuffered >= this.limit) { const excess = this.bytesBuffered - this.limit; const tailBuffer = this.buffers[this.buffers.length - 1]; this.buffers[this.buffers.length - 1] = tailBuffer.subarray(0, tailBuffer.byteLength - excess); this.emit("finish"); } callback(); } } ================================================ FILE: packages/core/src/submodules/serde/util-stream/sdk-stream-mixin.browser.spec.ts ================================================ import type { SdkStreamMixin } from "@smithy/types"; import { afterEach, beforeAll, beforeEach, describe, expect, test as it, vi } from "vitest"; import { toBase64 } from "../util-base64/toBase64.browser"; import { toHex } from "../util-hex-encoding/hex-encoding"; import { toUtf8 } from "../util-utf8/toUtf8.browser"; import { sdkStreamMixin } from "./sdk-stream-mixin.browser"; import { streamCollector } from "./stream-collector.browser"; vi.mock("./stream-collector.browser"); vi.mock("../util-base64/toBase64.browser"); vi.mock("../util-hex-encoding/hex-encoding"); vi.mock("../util-utf8/toUtf8.browser"); const mockStreamCollectorReturn = Uint8Array.from([117, 112, 113]); vi.mocked(streamCollector).mockReturnValue(Promise.resolve(mockStreamCollectorReturn)); describe(sdkStreamMixin.name, () => { const expectAllTransformsToFail = async (sdkStream: SdkStreamMixin) => { const transformMethods: Array = [ "transformToByteArray", "transformToString", "transformToWebStream", ]; for (const method of transformMethods) { try { await sdkStream[method](); fail(new Error("expect subsequent transform to fail")); } catch (error) { expect(error.message).toContain("The stream has already been transformed"); } } }; let originalReadableStreamCtr = global.ReadableStream; const mockReadableStream = vi.fn(); class ReadableStream { constructor() { mockReadableStream(); } } let payloadStream: ReadableStream; beforeAll(() => { global.ReadableStream = ReadableStream as any; }); beforeEach(() => { originalReadableStreamCtr = global.ReadableStream; vi.clearAllMocks(); payloadStream = new ReadableStream(); }); afterEach(() => { global.ReadableStream = originalReadableStreamCtr; }); it("should throw if input stream is not a Blob or Web Stream instance", () => { const originalBlobCtr = global.Blob; // @ts-expect-error global.Blob = undefined; // @ts-expect-error global.ReadableStream = undefined; try { sdkStreamMixin({}); fail("expect unexpected stream to fail"); } catch (e) { expect(e.message).toContain("Unexpected stream implementation"); global.Blob = originalBlobCtr; } }); describe("transformToByteArray", () => { it("should transform binary stream to byte array", async () => { const sdkStream = sdkStreamMixin(payloadStream); const byteArray = await sdkStream.transformToByteArray(); expect(vi.mocked(streamCollector)).toBeCalledWith(payloadStream); expect(byteArray).toEqual(mockStreamCollectorReturn); }); it("should fail any subsequent transform calls", async () => { const sdkStream = sdkStreamMixin(payloadStream); await sdkStream.transformToByteArray(); await expectAllTransformsToFail(sdkStream); }); }); describe("transformToString", () => { let originalTextDecoder = global.TextDecoder; const mockDecode = vi.fn(); global.TextDecoder = vi.fn().mockImplementation(function () { return { decode: mockDecode }; }); beforeEach(() => { originalTextDecoder = global.TextDecoder; vi.clearAllMocks(); }); afterEach(() => { global.TextDecoder = originalTextDecoder; }); it.each([ [undefined, toUtf8], ["utf8", toUtf8], ["utf-8", toUtf8], ["base64", toBase64], ["hex", toHex], ])("should transform to string with %s encoding", async (encoding, encodingFn) => { const mockEncodedStringValue = `a string with ${encoding} encoding`; vi.mocked(encodingFn).mockReturnValueOnce(mockEncodedStringValue); const sdkStream = sdkStreamMixin(payloadStream); const str = await sdkStream.transformToString(encoding); expect(streamCollector).toBeCalled(); expect(encodingFn).toBeCalledWith(mockStreamCollectorReturn); expect(str).toEqual(mockEncodedStringValue); }); it("should use TexDecoder to handle other encodings", async () => { const utfLabel = "windows-1251"; mockDecode.mockReturnValue(`a string with ${utfLabel} encoding`); const sdkStream = sdkStreamMixin(payloadStream); const str = await sdkStream.transformToString(utfLabel); expect(global.TextDecoder).toBeCalledWith(utfLabel); expect(str).toEqual(`a string with ${utfLabel} encoding`); }); it("should throw if TextDecoder is not available", async () => { // @ts-expect-error global.TextDecoder = null; const utfLabel = "windows-1251"; const sdkStream = sdkStreamMixin(payloadStream); try { await sdkStream.transformToString(utfLabel); fail("expect transformToString to throw when TextDecoder is not available"); } catch (error) { expect(error.message).toContain("TextDecoder is not available"); } }); it("should fail any subsequent transform calls", async () => { const sdkStream = sdkStreamMixin(payloadStream); await sdkStream.transformToString(); await expectAllTransformsToFail(sdkStream); }); }); describe("transformToWebStream with ReadableStream payload", () => { it("should return the payload if it is Web Stream instance", () => { const payloadStream = new ReadableStream(); const sdkStream = sdkStreamMixin(payloadStream as any); const transformed = sdkStream.transformToWebStream(); expect(transformed).toBe(payloadStream); }); it("should fail any subsequent transform calls", async () => { const payloadStream = new ReadableStream(); const sdkStream = sdkStreamMixin(payloadStream as any); sdkStream.transformToWebStream(); await expectAllTransformsToFail(sdkStream); }); }); describe("transformToWebStream with Blob payload", () => { let originalBlobCtr = global.Blob; const mockBlob = vi.fn(); const mockBlobStream = vi.fn(); class Blob { constructor() { mockBlob(); } stream() { return mockBlobStream(); } } global.Blob = Blob as any; beforeEach(() => { // @ts-expect-error global.ReadableStream = undefined; originalBlobCtr = global.Blob; vi.clearAllMocks(); }); afterEach(() => { global.Blob = originalBlobCtr; }); it("should transform blob to web stream with Blob.stream()", () => { mockBlobStream.mockReturnValue("transformed"); const payloadStream = new Blob(); const sdkStream = sdkStreamMixin(payloadStream as any); const transformed = sdkStream.transformToWebStream(); expect(transformed).toBe("transformed"); expect(mockBlobStream).toBeCalled(); }); it("should fail if Blob.stream() is not available", async () => { class Blob { constructor() { mockBlob(); } } global.Blob = Blob as any; const payloadStream = new Blob(); const sdkStream = sdkStreamMixin(payloadStream as any); try { sdkStream.transformToWebStream(); fail("expect to fail"); } catch (e) { expect(e.message).toContain("Please make sure the Blob.stream() is polyfilled"); } }); it("should fail any subsequent transform calls", async () => { const payloadStream = new Blob(); const sdkStream = sdkStreamMixin(payloadStream as any); sdkStream.transformToWebStream(); await expectAllTransformsToFail(sdkStream); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/sdk-stream-mixin.browser.ts ================================================ import type { SdkStream, SdkStreamMixin } from "@smithy/types"; import { toBase64 } from "../util-base64/toBase64.browser"; import { toHex } from "../util-hex-encoding/hex-encoding"; import { toUtf8 } from "../util-utf8/toUtf8.browser"; import { streamCollector } from "./stream-collector.browser"; import { isReadableStream } from "./stream-type-check"; const ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = "The stream has already been transformed."; /** * The stream handling utility functions for browsers and React Native * * @internal */ export const sdkStreamMixin = (stream: unknown): SdkStream => { if (!isBlobInstance(stream) && !isReadableStream(stream)) { //@ts-ignore const name = stream?.__proto__?.constructor?.name || stream; throw new Error(`Unexpected stream implementation, expect Blob or ReadableStream, got ${name}`); } let transformed = false; const transformToByteArray = async () => { if (transformed) { throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED); } transformed = true; return await streamCollector(stream); }; const blobToWebStream = (blob: Blob) => { if (typeof blob.stream !== "function") { throw new Error( "Cannot transform payload Blob to web stream. Please make sure the Blob.stream() is polyfilled.\n" + "If you are using React Native, this API is not yet supported, see: https://react-native.canny.io/feature-requests/p/fetch-streaming-body" ); } return blob.stream(); }; return Object.assign(stream, { transformToByteArray: transformToByteArray, transformToString: async (encoding?: string) => { const buf = await transformToByteArray(); if (encoding === "base64") { return toBase64(buf); } else if (encoding === "hex") { return toHex(buf); } else if (encoding === undefined || encoding === "utf8" || encoding === "utf-8") { // toUtf8() itself will use TextDecoder and fallback to pure JS implementation. return toUtf8(buf); } else if (typeof TextDecoder === "function") { return new TextDecoder(encoding).decode(buf); } else { throw new Error("TextDecoder is not available, please make sure polyfill is provided."); } }, transformToWebStream: () => { if (transformed) { throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED); } transformed = true; if (isBlobInstance(stream)) { // ReadableStream is undefined in React Native return blobToWebStream(stream); } else if (isReadableStream(stream)) { return stream; } else { throw new Error(`Cannot transform payload to web stream, got ${stream}`); } }, }); }; const isBlobInstance = (stream: unknown): stream is Blob => typeof Blob === "function" && stream instanceof Blob; ================================================ FILE: packages/core/src/submodules/serde/util-stream/sdk-stream-mixin.spec.ts ================================================ import { PassThrough, Readable, type Writable } from "node:stream"; import type { SdkStreamMixin } from "@smithy/types"; import { afterAll, beforeAll, beforeEach, describe, expect, test as it, vi } from "vitest"; import { fromArrayBuffer } from "../util-buffer-from/buffer-from"; import { sdkStreamMixin } from "./sdk-stream-mixin"; vi.mock("../util-buffer-from/buffer-from"); describe(sdkStreamMixin.name, () => { const writeDataToStream = (stream: Writable, data: Array): Promise => new Promise((resolve, reject) => { data.forEach((chunk) => { stream.write(chunk, (err) => { if (err) reject(err); }); }); stream.end(resolve); }); const byteArrayFromBuffer = (buf: Buffer) => new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); let passThrough: PassThrough; const expectAllTransformsToFail = async (sdkStream: SdkStreamMixin) => { const transformMethods: Array = [ "transformToByteArray", "transformToString", "transformToWebStream", ]; for (const method of transformMethods) { try { await sdkStream[method](); fail(new Error("expect subsequent transform to fail")); } catch (error) { expect(error.message).toContain("The stream has already been transformed"); } } }; beforeEach(() => { passThrough = new PassThrough(); }); it("should attempt to use the ReadableStream version if the input is not a Readable", async () => { if (typeof ReadableStream !== "undefined") { // ReadableStream is global only as of Node.js 18. const sdkStream = sdkStreamMixin( new ReadableStream({ start(controller) { controller.enqueue(Buffer.from("abcd")); controller.close(); }, }) ); expect(await sdkStream.transformToByteArray()).toEqual(new Uint8Array([97, 98, 99, 100])); } }); it("should throw if unexpected stream implementation is supplied", () => { try { const payload = {}; sdkStreamMixin(payload); fail("should throw when unexpected stream is supplied"); } catch (error) { expect(error.message).toContain("Unexpected stream implementation"); } }); describe("transformToByteArray", () => { it("should transform binary stream to byte array", async () => { const mockData = [Buffer.from("foo"), Buffer.from("bar"), Buffer.from("buzz")]; const expected = byteArrayFromBuffer(Buffer.from("foobarbuzz")); const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, mockData); expect(await sdkStream.transformToByteArray()).toEqual(expected); }); it("should fail any subsequent transform calls", async () => { const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("abc")]); expect(await sdkStream.transformToByteArray()).toEqual(byteArrayFromBuffer(Buffer.from("abc"))); await expectAllTransformsToFail(sdkStream); }); }); describe("transformToString", () => { const toStringMock = vi.fn(); beforeAll(() => { vi.resetAllMocks(); }); it("should transform the stream to string with utf-8 encoding by default", async () => { vi.mocked(fromArrayBuffer).mockImplementation( ((await vi.importActual("@smithy/core/serde")) as any).fromArrayBuffer ); const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("foo")]); const transformed = await sdkStream.transformToString(); expect(transformed).toEqual("foo"); }); it.each([undefined, "utf-8", "ascii", "base64", "latin1", "binary"])( "should transform the stream to string with %s encoding", async (encoding) => { vi.mocked(fromArrayBuffer).mockReturnValue({ toString: toStringMock } as any); const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("foo")]); await sdkStream.transformToString(encoding); expect(toStringMock).toBeCalledWith(encoding); } ); it.each(["ibm866", "iso-8859-2", "koi8-r", "macintosh", "windows-874", "gbk", "gb18030", "euc-jp"])( "should transform the stream to string with TextDecoder config %s", async (encoding) => { vi.spyOn(global, "TextDecoder").mockImplementation( () => ({ decode: vi.fn(), }) as any ); vi.mocked(fromArrayBuffer).mockReturnValue({ toString: toStringMock } as any); const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("foo")]); await sdkStream.transformToString(encoding as BufferEncoding); expect(TextDecoder).toBeCalledWith(encoding); } ); it("should fail any subsequent transform calls", async () => { const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("foo")]); await sdkStream.transformToString(); await expectAllTransformsToFail(sdkStream); }); }); describe("transformToWebStream", () => { it("should throw if any event listener is attached on the underlying stream", async () => { passThrough.on("data", console.log); const sdkStream = sdkStreamMixin(passThrough); try { sdkStream.transformToWebStream(); fail(new Error("expect web stream transformation to fail")); } catch (error) { expect(error.message).toContain("The stream has been consumed by other callbacks"); } }); describe("when Readable.toWeb() is not supported", () => { const originalToWebImpl = Readable.toWeb; beforeAll(() => { // @ts-expect-error Readable.toWeb = undefined; }); afterAll(() => { Readable.toWeb = originalToWebImpl; }); it("should throw", async () => { const sdkStream = sdkStreamMixin(passThrough); try { sdkStream.transformToWebStream(); fail(new Error("expect web stream transformation to fail")); } catch (error) { expect(error.message).toContain("Readable.toWeb() is not supported"); } }); }); describe("when Readable.toWeb() is supported", () => { const originalToWebImpl = Readable.toWeb; beforeAll(() => { Readable.toWeb = vi.fn().mockReturnValue("A web stream"); }); afterAll(() => { Readable.toWeb = originalToWebImpl; }); it("should transform Node stream to web stream", async () => { const sdkStream = sdkStreamMixin(passThrough); sdkStream.transformToWebStream(); expect(Readable.toWeb).toBeCalled(); }); it("should fail any subsequent transform calls", async () => { const sdkStream = sdkStreamMixin(passThrough); await writeDataToStream(passThrough, [Buffer.from("foo")]); await sdkStream.transformToWebStream(); await expectAllTransformsToFail(sdkStream); }); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/sdk-stream-mixin.ts ================================================ import { Readable } from "node:stream"; import type { SdkStream, SdkStreamMixin } from "@smithy/types"; import { fromArrayBuffer } from "../util-buffer-from/buffer-from"; import { sdkStreamMixin as sdkStreamMixinReadableStream } from "./sdk-stream-mixin.browser"; import { streamCollector } from "./stream-collector"; const ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = "The stream has already been transformed."; /** * The function that mixes in the utility functions to help consuming runtime-specific payload stream. * * @internal */ export const sdkStreamMixin = (stream: unknown): SdkStream | SdkStream => { if (!(stream instanceof Readable)) { try { /** * If the stream is not node:stream::Readable, it may be a web stream within Node.js. */ return sdkStreamMixinReadableStream(stream); } catch (e: unknown) { // @ts-ignore const name = stream?.__proto__?.constructor?.name || stream; throw new Error(`Unexpected stream implementation, expect Stream.Readable instance, got ${name}`); } } let transformed = false; const transformToByteArray = async () => { if (transformed) { throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED); } transformed = true; return await streamCollector(stream); }; return Object.assign(stream, { transformToByteArray, transformToString: async (encoding?: string) => { const buf = await transformToByteArray(); if (encoding === undefined || Buffer.isEncoding(encoding)) { return fromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding as BufferEncoding); } else { const decoder = new TextDecoder(encoding); return decoder.decode(buf); } }, transformToWebStream: () => { if (transformed) { throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED); } if (stream.readableFlowing !== null) { // Prevent side effect of consuming webstream. throw new Error("The stream has been consumed by other callbacks."); } if (typeof Readable.toWeb !== "function") { throw new Error("Readable.toWeb() is not supported. Please ensure a polyfill is available."); } transformed = true; return Readable.toWeb(stream) as ReadableStream; }, }); }; ================================================ FILE: packages/core/src/submodules/serde/util-stream/splitStream.browser.ts ================================================ /** * @param stream * @returns stream split into two identical streams. */ export async function splitStream(stream: ReadableStream | Blob): Promise<[ReadableStream, ReadableStream]> { if (typeof (stream as Blob).stream === "function") { stream = (stream as Blob).stream(); } const readableStream = stream as ReadableStream; return readableStream.tee(); } ================================================ FILE: packages/core/src/submodules/serde/util-stream/splitStream.spec.ts ================================================ import { Readable } from "node:stream"; import { streamCollector as webStreamCollector } from "@smithy/fetch-http-handler"; import { streamCollector } from "@smithy/node-http-handler"; import { describe, expect, test as it } from "vitest"; import { splitStream } from "./splitStream"; import { splitStream as splitWebStream } from "./splitStream.browser"; describe(splitStream.name, () => { it("should split a node:Readable stream", async () => { const data = Buffer.from("abcd"); const myStream = Readable.from(data); const [a, b] = await splitStream(myStream); const buffer1 = await streamCollector(a); const buffer2 = await streamCollector(b); expect(buffer1).toEqual(new Uint8Array([97, 98, 99, 100])); expect(buffer1).toEqual(buffer2); }); it("should split a web:ReadableStream stream", async () => { if (typeof ReadableStream !== "undefined") { const inputChunks = [97, 98, 99, 100]; const myStream = new ReadableStream({ start(controller) { for (const inputChunk of inputChunks) { controller.enqueue(new Uint8Array([inputChunk])); } controller.close(); }, }); const [a, b] = await splitWebStream(myStream); const bytes1 = await webStreamCollector(a); const bytes2 = await webStreamCollector(b); expect(bytes1).toEqual(new Uint8Array([97, 98, 99, 100])); expect(bytes1).toEqual(bytes2); } }); it("should split a web:Blob", async () => { if (typeof Blob !== "undefined") { const inputChunks = [97, 98, 99, 100]; const myBlob = new Blob([new Uint8Array(inputChunks)]); const [a, b] = await splitWebStream(myBlob); const bytes1 = await webStreamCollector(a); const bytes2 = await webStreamCollector(b); expect(bytes1).toEqual(new Uint8Array([97, 98, 99, 100])); expect(bytes1).toEqual(bytes2); } }); }); ================================================ FILE: packages/core/src/submodules/serde/util-stream/splitStream.ts ================================================ import { PassThrough, type Readable } from "node:stream"; import { splitStream as splitWebStream } from "./splitStream.browser"; import { isBlob, isReadableStream } from "./stream-type-check"; /** * @internal * @param stream - to be split. * @returns stream split into two identical streams. */ export async function splitStream(stream: Readable): Promise<[Readable, Readable]>; /** * @internal */ export async function splitStream(stream: ReadableStream): Promise<[ReadableStream, ReadableStream]>; /** * @internal */ export async function splitStream( stream: Readable | ReadableStream ): Promise<[Readable | ReadableStream, Readable | ReadableStream]> { if (isReadableStream(stream) || isBlob(stream)) { return splitWebStream(stream); } const stream1 = new PassThrough(); const stream2 = new PassThrough(); stream.pipe(stream1); stream.pipe(stream2); return [stream1, stream2]; } ================================================ FILE: packages/core/src/submodules/serde/util-stream/stream-collector.browser.ts ================================================ import { fromBase64 } from "../util-base64/fromBase64.browser"; /** * Inlined from @smithy/fetch-http-handler streamCollector. * * @internal */ export const streamCollector = async (stream: Blob | ReadableStream): Promise => { if ((typeof Blob === "function" && stream instanceof Blob) || stream.constructor?.name === "Blob") { if (Blob.prototype.arrayBuffer !== undefined) { return new Uint8Array(await (stream as Blob).arrayBuffer()); } return collectBlob(stream as Blob); } return collectStream(stream as ReadableStream); }; async function collectBlob(blob: Blob): Promise { const base64 = await readToBase64(blob); const arrayBuffer = fromBase64(base64); return new Uint8Array(arrayBuffer); } async function collectStream(stream: ReadableStream): Promise { const chunks = []; const reader = stream.getReader(); let isDone = false; let length = 0; while (!isDone) { const { done, value } = await reader.read(); if (value) { chunks.push(value); length += value.length; } isDone = done; } const collected = new Uint8Array(length); let offset = 0; for (const chunk of chunks) { collected.set(chunk, offset); offset += chunk.length; } return collected; } function readToBase64(blob: Blob): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => { if (reader.readyState !== 2) { return reject(new Error("Reader aborted too early")); } const result = (reader.result ?? "") as string; const commaIndex = result.indexOf(","); const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length; resolve(result.substring(dataOffset)); }; reader.onabort = () => reject(new Error("Read aborted")); reader.onerror = () => reject(reader.error); reader.readAsDataURL(blob); }); } ================================================ FILE: packages/core/src/submodules/serde/util-stream/stream-collector.ts ================================================ import { Writable, type Readable } from "node:stream"; import type { ReadableStream as IReadableStream } from "node:stream/web"; /** * Inlined from @smithy/node-http-handler streamCollector. * * @internal */ class Collector extends Writable { public readonly bufferedBytes: Buffer[] = []; _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void) { this.bufferedBytes.push(chunk); callback(); } } const isReadableStreamInstance = (stream: unknown): stream is IReadableStream => typeof ReadableStream === "function" && stream instanceof ReadableStream; async function collectReadableStream(stream: IReadableStream): Promise { const chunks = []; const reader = stream.getReader(); let isDone = false; let length = 0; while (!isDone) { const { done, value } = await reader.read(); if (value) { chunks.push(value); length += value.length; } isDone = done; } const collected = new Uint8Array(length); let offset = 0; for (const chunk of chunks) { collected.set(chunk, offset); offset += chunk.length; } return collected; } export const streamCollector = (stream: Readable | IReadableStream): Promise => { if (isReadableStreamInstance(stream)) { return collectReadableStream(stream); } return new Promise((resolve, reject) => { const collector = new Collector(); stream.pipe(collector); stream.on("error", (err) => { collector.end(); reject(err); }); collector.on("error", reject); collector.on("finish", function (this: Collector) { const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes)); resolve(bytes); }); }); }; ================================================ FILE: packages/core/src/submodules/serde/util-stream/stream-type-check.ts ================================================ /** * Alias prevents compiler from turning * ReadableStream into ReadableStream, which is incompatible * with the NodeJS.ReadableStream global type. * * @internal */ type ReadableStreamType = ReadableStream; /** * @internal */ export const isReadableStream = (stream: unknown): stream is ReadableStreamType => typeof ReadableStream === "function" && (stream?.constructor?.name === ReadableStream.name || stream instanceof ReadableStream); /** * @internal */ export const isBlob = (blob: unknown): blob is Blob => { return typeof Blob === "function" && (blob?.constructor?.name === Blob.name || blob instanceof Blob); }; ================================================ FILE: packages/core/src/submodules/serde/util-stream/util-stream.integ.spec.ts ================================================ import { Readable } from "node:stream"; import { HttpResponse, type HttpHandler } from "@smithy/protocol-http"; import type { HttpRequest as IHttpRequest } from "@smithy/types"; import { requireRequestsFrom } from "@smithy/util-test/src"; import { describe, expect, test as it } from "vitest"; import { Weather } from "weather"; import { Uint8ArrayBlobAdapter } from "../index"; import { fromUtf8 } from "../util-utf8/fromUtf8"; describe("util-stream", () => { describe(Weather.name, () => { it("should be uniform between string and Uint8Array payloads", async () => { const client = new Weather({ endpoint: "https://foo.bar", region: "us-west-2", credentials: { accessKeyId: "INTEG", secretAccessKey: "INTEG", }, }); requireRequestsFrom(client).toMatch({ method: "POST", hostname: "foo.bar", query: {}, headers: { "content-type": "application/octet-stream", "content-length": "17", }, body(raw) { expect(raw.toString("utf-8")).toEqual('{"hello":"world"}'); }, protocol: "https:", path: "/invoke", }); // string await client.invoke({ payload: JSON.stringify({ hello: "world", }), }); // Uint8Array await client.invoke({ payload: Buffer.from( JSON.stringify({ hello: "world", }) ), }); }); }); describe("blob helper integration", () => { const client = new Weather({ endpoint: "https://foo.bar", region: "us-west-2", credentials: { accessKeyId: "INTEG", secretAccessKey: "INTEG", }, }); requireRequestsFrom(client).toMatch({ method: "POST", hostname: "foo.bar", query: {}, headers: { "content-type": "application/octet-stream", }, protocol: "https:", path: "/invoke", }); client.config.requestHandler = new (class implements HttpHandler { async handle(request: IHttpRequest) { return { response: new HttpResponse({ statusCode: 200, body: typeof request.body === "string" ? fromUtf8(request.body) : Uint8Array.from(request.body), }), }; } updateHttpClientConfig() {} httpHandlerConfigs(): Record { return {}; } })(); it("should allow string as payload blob and allow conversion of output payload blob to string", async () => { const payload = JSON.stringify({ hello: "world" }); const invoke = await client.invoke({ payload: payload }); expect(JSON.parse(invoke?.payload?.transformToString() ?? "{}")).toEqual({ hello: "world" }); }); it("should allow Uint8Array as payload blob", async () => { const payload = Uint8ArrayBlobAdapter.fromString(JSON.stringify({ hello: "world" })); const invoke = await client.invoke({ payload: payload }); expect(JSON.parse(invoke?.payload?.transformToString() ?? "{}")).toEqual({ hello: "world" }); }); it("should allow buffer as payload blob", async () => { // note: Buffer extends Uint8Array const payload = Buffer.from(Uint8ArrayBlobAdapter.fromString(JSON.stringify({ hello: "world" }))); const invoke = await client.invoke({ payload: payload }); expect(JSON.parse(invoke?.payload?.transformToString() ?? "{}")).toEqual({ hello: "world" }); }); it("should allow stream as payload blob but not be able to sign it", async () => { const payload = Readable.from(Buffer.from(Uint8ArrayBlobAdapter.fromString(JSON.stringify({ hello: "world" }))), { encoding: "utf-8", }); expect(JSON.parse(await streamToString(payload))).toEqual({ hello: "world" }); await client.invoke({ payload: payload }).catch((e) => { expect(e.toString()).toContain("InvalidSignatureException"); }); expect.hasAssertions(); }); }); function streamToString(stream: Readable): Promise { const chunks: any[] = []; return new Promise((resolve, reject) => { stream.on("data", (chunk) => chunks.push(Buffer.from(chunk))); stream.on("error", (err) => reject(err)); stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8"))); }); } }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-buffer-from@4.2.2 ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/util-buffer-from@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/util-buffer-from@4.2.0 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - Updated dependencies [64cda93] - @smithy/util-buffer-from@4.1.0 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-buffer-from@4.0.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [671aa704] - @smithy/util-buffer-from@3.0.0 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - @smithy/util-buffer-from@2.2.0 ## 2.2.0 ### Minor Changes - 43f3e1e2: encoders allow string inputs ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/util-buffer-from@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/util-buffer-from@2.1.0 ## 2.0.2 ### Patch Changes - f2a04b7e: Use Node.js implementations in react-native ## 2.0.1 ### Patch Changes - 5598a033: update bundler replacement directives in package.json ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/util-buffer-from@2.0.0 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/util-buffer-from@1.1.0 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/util-buffer-from@1.0.2 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/util-buffer-from@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/util-utf8](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/util-utf8/CHANGELOG.md) for additional history. ================================================ FILE: packages/core/src/submodules/serde/util-utf8/fromUtf8.browser.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { fromUtf8 } from "./fromUtf8.browser"; declare const global: any; describe("fromUtf8", () => { it("should use the Encoding API", () => { const expected = new Uint8Array(0); const encode = vi.fn().mockReturnValue(expected); (global as any).TextEncoder = vi.fn(() => ({ encode })); expect(fromUtf8("ABC")).toBe(expected); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/fromUtf8.browser.ts ================================================ export const fromUtf8 = (input: string): Uint8Array => new TextEncoder().encode(input); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/fromUtf8.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { fromUtf8 } from "./fromUtf8"; const utf8StringsToByteArrays: Record = { ABC: new Uint8Array(["A".charCodeAt(0), "B".charCodeAt(0), "C".charCodeAt(0)]), "🐎👱❤": new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]), "☃💩": new Uint8Array([226, 152, 131, 240, 159, 146, 169]), "The rain in Spain falls mainly on the plain.": new Uint8Array([ 84, 104, 101, 32, 114, 97, 105, 110, 32, 105, 110, 32, 83, 112, 97, 105, 110, 32, 102, 97, 108, 108, 115, 32, 109, 97, 105, 110, 108, 121, 32, 111, 110, 32, 116, 104, 101, 32, 112, 108, 97, 105, 110, 46, ]), "دست‌نوشته‌ها نمی‌سوزند": new Uint8Array([ 216, 175, 216, 179, 216, 170, 226, 128, 140, 217, 134, 217, 136, 216, 180, 216, 170, 217, 135, 226, 128, 140, 217, 135, 216, 167, 32, 217, 134, 217, 133, 219, 140, 226, 128, 140, 216, 179, 217, 136, 216, 178, 217, 134, 216, 175, ]), "Рукописи не горят": new Uint8Array([ 208, 160, 209, 131, 208, 186, 208, 190, 208, 191, 208, 184, 209, 129, 208, 184, 32, 208, 189, 208, 181, 32, 208, 179, 208, 190, 209, 128, 209, 143, 209, 130, ]), }; describe("fromUtf8", () => { for (const string of Object.keys(utf8StringsToByteArrays)) { it(`should UTF-8 decode "${string}" to the correct value`, () => { expect(fromUtf8(string)).toEqual(utf8StringsToByteArrays[string]); }); } it("should throw when given a number", () => { expect(() => fromUtf8(255 as any)).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/fromUtf8.ts ================================================ import { fromString } from "../util-buffer-from/buffer-from"; export const fromUtf8 = (input: string): Uint8Array => { const buf = fromString(input, "utf8"); return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength / Uint8Array.BYTES_PER_ELEMENT); }; ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUint8Array.browser.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { toUint8Array } from "./toUint8Array.browser"; describe("toUint8Array", () => { it(`should convert string to Uint8Array`, () => { const expected = new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]); expect(toUint8Array("🐎👱❤")).toStrictEqual(expected); }); it(`should convert buffer to Uint8Array`, () => { const expected = new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]); const buffer = Buffer.from(expected); expect(toUint8Array(buffer)).toStrictEqual(expected); }); it(`should convert ArrayBuffer to Uint8Array`, () => { const input = new Uint32Array([240]); const expected = new Uint8Array([240, 0, 0, 0]); expect(toUint8Array(input)).toStrictEqual(expected); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUint8Array.browser.ts ================================================ import { fromUtf8 } from "./fromUtf8.browser"; /** * @internal */ export const toUint8Array = (data: string | ArrayBuffer | ArrayBufferView): Uint8Array => { if (typeof data === "string") { return fromUtf8(data); } if (ArrayBuffer.isView(data)) { return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT); } return new Uint8Array(data); }; ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUint8Array.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { toUint8Array } from "./toUint8Array"; describe("toUint8Array", () => { it(`should convert string to Uint8Array`, () => { const expected = new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]); expect(toUint8Array("🐎👱❤")).toStrictEqual(expected); }); it(`should convert buffer to Uint8Array`, () => { const expected = new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]); const buffer = Buffer.from(expected); expect(toUint8Array(buffer)).toStrictEqual(expected); }); it(`should convert ArrayBuffer to Uint8Array`, () => { const input = new Uint32Array([240]); const expected = new Uint8Array([240, 0, 0, 0]); expect(toUint8Array(input)).toStrictEqual(expected); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUint8Array.ts ================================================ import { fromUtf8 } from "./fromUtf8"; export const toUint8Array = (data: string | ArrayBuffer | ArrayBufferView): Uint8Array => { if (typeof data === "string") { return fromUtf8(data); } if (ArrayBuffer.isView(data)) { return new Uint8Array(data.buffer, data.byteOffset, data.byteLength / Uint8Array.BYTES_PER_ELEMENT); } return new Uint8Array(data); }; ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUtf8.browser.spec.ts ================================================ import type { Encoder } from "@smithy/types"; import { describe, expect, test as it, vi } from "vitest"; import { toUtf8 } from "./toUtf8.browser"; declare const global: any; describe("toUtf8", () => { it("should use the Encoding API", () => { const expected = "ABC"; const decode = vi.fn().mockReturnValue(expected); (global as any).TextDecoder = vi.fn(() => ({ decode })); expect(toUtf8(new Uint8Array(0))).toBe(expected); }); it("passes through strings", () => { expect(toUtf8("hello")).toEqual("hello"); }); it("throws on non-string non-Uint8Array", () => { expect(() => (toUtf8 as Encoder)(new Date())).toThrow(); expect(() => (toUtf8 as Encoder)({})).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUtf8.browser.ts ================================================ /** * * This does not convert non-utf8 strings to utf8, it only passes through strings if * a string is received instead of a Uint8Array. * */ export const toUtf8 = (input: Uint8Array | string): string => { if (typeof input === "string") { return input; } if (typeof input !== "object" || typeof input.byteOffset !== "number" || typeof input.byteLength !== "number") { throw new Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array."); } return new TextDecoder("utf-8").decode(input); }; ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUtf8.spec.ts ================================================ import type { Encoder } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { toUtf8 } from "./toUtf8"; const utf8StringsToByteArrays: Record = { ABC: new Uint8Array(["A".charCodeAt(0), "B".charCodeAt(0), "C".charCodeAt(0)]), "🐎👱❤": new Uint8Array([240, 159, 144, 142, 240, 159, 145, 177, 226, 157, 164]), "☃💩": new Uint8Array([226, 152, 131, 240, 159, 146, 169]), "The rain in Spain falls mainly on the plain.": new Uint8Array([ 84, 104, 101, 32, 114, 97, 105, 110, 32, 105, 110, 32, 83, 112, 97, 105, 110, 32, 102, 97, 108, 108, 115, 32, 109, 97, 105, 110, 108, 121, 32, 111, 110, 32, 116, 104, 101, 32, 112, 108, 97, 105, 110, 46, ]), "دست‌نوشته‌ها نمی‌سوزند": new Uint8Array([ 216, 175, 216, 179, 216, 170, 226, 128, 140, 217, 134, 217, 136, 216, 180, 216, 170, 217, 135, 226, 128, 140, 217, 135, 216, 167, 32, 217, 134, 217, 133, 219, 140, 226, 128, 140, 216, 179, 217, 136, 216, 178, 217, 134, 216, 175, ]), "Рукописи не горят": new Uint8Array([ 208, 160, 209, 131, 208, 186, 208, 190, 208, 191, 208, 184, 209, 129, 208, 184, 32, 208, 189, 208, 181, 32, 208, 179, 208, 190, 209, 128, 209, 143, 209, 130, ]), }; describe("toUtf8", () => { for (const string of Object.keys(utf8StringsToByteArrays)) { it(`should derive "${string}" from the UTF-8 decoded bytes`, () => { expect(toUtf8(utf8StringsToByteArrays[string])).toBe(string); }); } it("should throw when given a number", () => { expect(() => toUtf8(255 as any)).toThrow(); }); it("passes through strings", () => { expect(toUtf8("hello")).toEqual("hello"); }); it("throws on non-string non-Uint8Array", () => { expect(() => (toUtf8 as Encoder)(new Date())).toThrow(); expect(() => (toUtf8 as Encoder)({})).toThrow(); }); }); ================================================ FILE: packages/core/src/submodules/serde/util-utf8/toUtf8.ts ================================================ import { fromArrayBuffer } from "../util-buffer-from/buffer-from"; /** * * This does not convert non-utf8 strings to utf8, it only passes through strings if * a string is received instead of a Uint8Array. * */ export const toUtf8 = (input: Uint8Array | string): string => { if (typeof input === "string") { return input; } if (typeof input !== "object" || typeof input.byteOffset !== "number" || typeof input.byteLength !== "number") { throw new Error("@smithy/util-utf8: toUtf8 encoder function only accepts string | Uint8Array."); } return fromArrayBuffer(input.buffer, input.byteOffset, input.byteLength).toString("utf8"); }; ================================================ FILE: packages/core/src/submodules/serde/uuid/CHANGELOG.md ================================================ # Change Log This is a past changelog, the package has been consolidated into `@smithy/core/serde`. ## 1.1.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 1.1.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 1.1.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 1.0.0 ### Major Changes - 9489059: Add polyfill for uuid v4 with preference for native implementations ================================================ FILE: packages/core/src/submodules/serde/uuid/v4.spec.ts ================================================ import { getRandomValues } from "node:crypto"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { bindV4 } from "./v4"; const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; describe("v4", () => { afterEach(() => { vi.restoreAllMocks(); }); it("should call native crypto.randomUUID when available", () => { const mockUUID = "mocked-uuid-value"; vi.stubGlobal("crypto", { randomUUID: vi.fn(() => mockUUID), getRandomValues }); const v4 = bindV4(getRandomValues as (array: Uint8Array) => Uint8Array); const uuid = v4(); expect(crypto.randomUUID).toHaveBeenCalled(); expect(uuid).toBe(mockUUID); }); describe("when native randomUUID is not available", () => { it("falls back to getRandomValues", () => { vi.stubGlobal("crypto", { getRandomValues }); const mockGetRandomValues = vi.fn((array: Uint8Array) => { getRandomValues(array); return array; }); const v4 = bindV4(mockGetRandomValues); const uuid = v4(); expect(mockGetRandomValues).toHaveBeenCalledWith(expect.any(Uint8Array)); expect(uuid).toMatch(UUID_REGEX); }); it("each generation is unique and matches regex", () => { vi.stubGlobal("crypto", { getRandomValues }); const v4 = bindV4(getRandomValues as (array: Uint8Array) => Uint8Array); const uuids = new Set(); const iterations = 10_000; for (let i = 0; i < iterations; i++) { const uuid = v4(); expect(uuid).toMatch(UUID_REGEX); uuids.add(uuid); } expect(uuids.size).toBe(iterations); }); }); }); ================================================ FILE: packages/core/src/submodules/serde/uuid/v4.ts ================================================ const decimalToHex = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, "0")); /** * @internal */ export type GetRandomValues = (array: Uint8Array) => Uint8Array; /** * Creates a RFC4122 version 4 UUID generator. * * Uses the native crypto.randomUUID() if available, otherwise falls back * to a manual implementation using the provided getRandomValues function. * * The fallback implementation: * - Generates 16 random bytes using getRandomValues() * - Sets the version bits to indicate version 4 * - Sets the variant bits to indicate RFC4122 * - Formats the bytes as a UUID string with dashes * * @param getRandomValues - platform-specific random byte source. * @returns A function that generates version 4 UUID strings * in the format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx * where x is any hexadecimal digit and y is one of 8, 9, a, or b. * * @internal */ export function bindV4(getRandomValues: GetRandomValues) { if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") { return () => crypto.randomUUID(); } return (): string => { const rnds = new Uint8Array(16); getRandomValues(rnds); // Set version (4) and variant (RFC4122) rnds[6] = (rnds[6] & 0x0f) | 0x40; // version 4 rnds[8] = (rnds[8] & 0x3f) | 0x80; // variant return ( decimalToHex[rnds[0]] + decimalToHex[rnds[1]] + decimalToHex[rnds[2]] + decimalToHex[rnds[3]] + "-" + decimalToHex[rnds[4]] + decimalToHex[rnds[5]] + "-" + decimalToHex[rnds[6]] + decimalToHex[rnds[7]] + "-" + decimalToHex[rnds[8]] + decimalToHex[rnds[9]] + "-" + decimalToHex[rnds[10]] + decimalToHex[rnds[11]] + decimalToHex[rnds[12]] + decimalToHex[rnds[13]] + decimalToHex[rnds[14]] + decimalToHex[rnds[15]] ); }; } ================================================ FILE: packages/core/src/submodules/serde/value/NumericValue.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { NumericValue, nv } from "./NumericValue"; describe(NumericValue.name, () => { it("holds a string representation of a numeric value", () => { const num = nv("1.0"); expect(num).toBeInstanceOf(NumericValue); expect(num.string).toEqual("1.0"); expect(num.type).toEqual("bigDecimal"); }); it("allows only numeric digits and at most one decimal point", () => { expect(() => nv("a")).toThrow(); expect(() => nv("1.0.1")).toThrow(); expect(() => nv("-10.1")).not.toThrow(); expect(() => nv("-.101")).not.toThrow(); }); it("has a custom instanceof check", () => { const isInstance = [ nv("0"), nv("-0.00"), new NumericValue("0", "bigDecimal"), new NumericValue("-0.00", "bigDecimal"), { string: "-.123", type: "bigDecimal", }, (() => { const x = {}; Object.setPrototypeOf(x, NumericValue.prototype); return x; })(), (() => { function F() {} F.prototype = Object.create(NumericValue.prototype); // @ts-ignore return new F(); })(), (() => { return new (class extends NumericValue {})("0", "bigDecimal"); })(), ] as unknown[]; const isNotInstance = [ BigInt(0), "-0.00", { string: "abcd", type: "bigDecimal", }, (() => { const x = {}; Object.setPrototypeOf(x, NumericValue); return x; })(), ] as unknown[]; for (const instance of isInstance) { expect(instance).toBeInstanceOf(NumericValue); } for (const instance of isNotInstance) { expect(instance).not.toBeInstanceOf(NumericValue); } }); }); ================================================ FILE: packages/core/src/submodules/serde/value/NumericValue.ts ================================================ /** * Types which may be represented by {@link NumericValue}. * * There is currently only one option, because BigInteger and Long should * use JS BigInt directly, and all other numeric types can be contained in JS Number. * * @public */ export type NumericType = "bigDecimal"; /** * @internal */ const format = /^-?\d*(\.\d+)?$/; /** * Serialization container for Smithy simple types that do not have a * direct JavaScript runtime representation. * * This container does not perform numeric mathematical operations. * It is a container for discerning a value's true type. * * It allows storage of numeric types not representable in JS without * making a decision on what numeric library to use. * * @public */ export class NumericValue { public constructor( public readonly string: string, public readonly type: NumericType ) { if (!format.test(string)) { throw new Error( `@smithy/core/serde - NumericValue must only contain [0-9], at most one decimal point ".", and an optional negation prefix "-".` ); } } public toString() { return this.string; } public static [Symbol.hasInstance](object: unknown) { if (!object || typeof object !== "object") { return false; } const _nv = object as NumericValue; return NumericValue.prototype.isPrototypeOf(object) || (_nv.type === "bigDecimal" && format.test(_nv.string)); } } /** * Serde shortcut. * @internal */ export function nv(input: string | unknown): NumericValue { return new NumericValue(String(input), "bigDecimal"); } ================================================ FILE: packages/core/src/util-identity-and-auth/DefaultIdentityProviderConfig.ts ================================================ import type { HttpAuthSchemeId, Identity, IdentityProvider, IdentityProviderConfig } from "@smithy/types"; /** * Default implementation of IdentityProviderConfig * @internal */ export class DefaultIdentityProviderConfig implements IdentityProviderConfig { private authSchemes: Map> = new Map(); /** * Creates an IdentityProviderConfig with a record of scheme IDs to identity providers. * * @param config scheme IDs and identity providers to configure */ constructor(config: Record | undefined>) { for (const key in config) { const value = config[key]; if (value !== undefined) { this.authSchemes.set(key, value); } } } public getIdentityProvider(schemeId: HttpAuthSchemeId): IdentityProvider | undefined { return this.authSchemes.get(schemeId); } } ================================================ FILE: packages/core/src/util-identity-and-auth/httpAuthSchemes/httpApiKeyAuth.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { HttpApiKeyAuthLocation, type ApiKeyIdentity, type HttpSigner, type HttpRequest as IHttpRequest, } from "@smithy/types"; /** * @internal */ export class HttpApiKeyAuthSigner implements HttpSigner { public async sign( httpRequest: HttpRequest, identity: ApiKeyIdentity, signingProperties: Record ): Promise { if (!signingProperties) { throw new Error( "request could not be signed with `apiKey` since the `name` and `in` signer properties are missing" ); } if (!signingProperties.name) { throw new Error("request could not be signed with `apiKey` since the `name` signer property is missing"); } if (!signingProperties.in) { throw new Error("request could not be signed with `apiKey` since the `in` signer property is missing"); } if (!identity.apiKey) { throw new Error("request could not be signed with `apiKey` since the `apiKey` is not defined"); } const clonedRequest = HttpRequest.clone(httpRequest); if (signingProperties.in === HttpApiKeyAuthLocation.QUERY) { clonedRequest.query[signingProperties.name] = identity.apiKey; } else if (signingProperties.in === HttpApiKeyAuthLocation.HEADER) { clonedRequest.headers[signingProperties.name] = signingProperties.scheme ? `${signingProperties.scheme} ${identity.apiKey}` : identity.apiKey; } else { throw new Error( "request can only be signed with `apiKey` locations `query` or `header`, " + "but found: `" + signingProperties.in + "`" ); } return clonedRequest; } } ================================================ FILE: packages/core/src/util-identity-and-auth/httpAuthSchemes/httpBearerAuth.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { HttpRequest } from "@smithy/core/protocols"; import type { HttpSigner, HttpRequest as IHttpRequest, TokenIdentity } from "@smithy/types"; /** * @internal */ export class HttpBearerAuthSigner implements HttpSigner { public async sign( httpRequest: HttpRequest, identity: TokenIdentity, signingProperties: Record ): Promise { const clonedRequest = HttpRequest.clone(httpRequest); if (!identity.token) { throw new Error("request could not be signed with `token` since the `token` is not defined"); } clonedRequest.headers["Authorization"] = `Bearer ${identity.token}`; return clonedRequest; } } ================================================ FILE: packages/core/src/util-identity-and-auth/httpAuthSchemes/index.ts ================================================ export * from "./httpApiKeyAuth"; export * from "./httpBearerAuth"; export * from "./noAuth"; ================================================ FILE: packages/core/src/util-identity-and-auth/httpAuthSchemes/noAuth.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { HttpRequest, HttpSigner, Identity } from "@smithy/types"; /** * Signer for the synthetic @smithy.api#noAuth auth scheme. * @internal */ export class NoAuthSigner implements HttpSigner { async sign( httpRequest: HttpRequest, identity: Identity, signingProperties: Record ): Promise { return httpRequest; } } ================================================ FILE: packages/core/src/util-identity-and-auth/index.ts ================================================ export * from "./DefaultIdentityProviderConfig"; export * from "./httpAuthSchemes"; export * from "./memoizeIdentityProvider"; ================================================ FILE: packages/core/src/util-identity-and-auth/memoizeIdentityProvider.ts ================================================ import type { Identity, IdentityProvider } from "@smithy/types"; /** * @internal */ export const createIsIdentityExpiredFunction = (expirationMs: number) => function isIdentityExpired(identity: Identity) { return doesIdentityRequireRefresh(identity) && identity.expiration!.getTime() - Date.now() < expirationMs; }; /** * This may need to be configurable in the future, but for now it is defaulted to 5min. * * @internal */ export const EXPIRATION_MS = 300_000; /** * @internal */ export const isIdentityExpired = createIsIdentityExpiredFunction(EXPIRATION_MS); /** * @internal */ export const doesIdentityRequireRefresh = (identity: Identity) => identity.expiration !== undefined; /** * @internal */ export interface MemoizedIdentityProvider { (options?: Record & { forceRefresh?: boolean }): Promise; } /** * @internal */ export const memoizeIdentityProvider = ( provider: IdentityT | IdentityProvider | undefined, isExpired: (resolved: Identity) => boolean, requiresRefresh: (resolved: Identity) => boolean ): MemoizedIdentityProvider | undefined => { if (provider === undefined) { return undefined; } const normalizedProvider: IdentityProvider = typeof provider !== "function" ? async () => Promise.resolve(provider) : provider; let resolved: IdentityT; let pending: Promise | undefined; let hasResult: boolean; let isConstant = false; // Wrapper over supplied provider with side effect to handle concurrent invocation. const coalesceProvider: MemoizedIdentityProvider = async (options) => { if (!pending) { pending = normalizedProvider(options); } try { resolved = await pending; hasResult = true; isConstant = false; } finally { pending = undefined; } return resolved; }; if (isExpired === undefined) { // This is a static memoization; no need to incorporate refreshing unless using forceRefresh; return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(options); } return resolved; }; } return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(options); } if (isConstant) { return resolved; } if (!requiresRefresh(resolved)) { isConstant = true; return resolved; } if (isExpired(resolved)) { await coalesceProvider(options); return resolved; } return resolved; }; }; ================================================ FILE: packages/core/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src", "paths": { "@smithy/core/checksum": ["./src/submodules/checksum/index.ts"], "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], "@smithy/core/client": ["./src/submodules/client/index.ts"], "@smithy/core/config": ["./src/submodules/config/index.ts"], "@smithy/core/endpoints": ["./src/submodules/endpoints/index.ts"], "@smithy/core/event-streams": ["./src/submodules/event-streams/index.ts"], "@smithy/core/retry": ["./src/submodules/retry/index.ts"], "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], "@smithy/core/schema": ["./src/submodules/schema/index.ts"], "@smithy/core/serde": ["./src/submodules/serde/index.ts"] } }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/core/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src", "paths": { "@smithy/core/checksum": ["./src/submodules/checksum/index.ts"], "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], "@smithy/core/config": ["./src/submodules/config/index.ts"], "@smithy/core/client": ["./src/submodules/client/index.ts"], "@smithy/core/retry": ["./src/submodules/retry/index.ts"], "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], "@smithy/core/serde": ["./src/submodules/serde/index.ts"], "@smithy/core/schema": ["./src/submodules/schema/index.ts"], "@smithy/core/event-streams": ["./src/submodules/event-streams/index.ts"], "@smithy/core/endpoints": ["./src/submodules/endpoints/index.ts"] } }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/core/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src", "paths": { "@smithy/core/checksum": ["./src/submodules/checksum/index.ts"], "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], "@smithy/core/config": ["./src/submodules/config/index.ts"], "@smithy/core/client": ["./src/submodules/client/index.ts"], "@smithy/core/retry": ["./src/submodules/retry/index.ts"], "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], "@smithy/core/serde": ["./src/submodules/serde/index.ts"], "@smithy/core/schema": ["./src/submodules/schema/index.ts"], "@smithy/core/event-streams": ["./src/submodules/event-streams/index.ts"], "@smithy/core/endpoints": ["./src/submodules/endpoints/index.ts"] } }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/core/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{e2e,browser}.spec.ts"], include: ["**/*.integ.spec.ts"], environment: "node", hideSkippedTests: true, }, }); ================================================ FILE: packages/core/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", hideSkippedTests: true, }, }); ================================================ FILE: packages/credential-provider-imds/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/credential-provider-imds/CHANGELOG.md ================================================ # Change Log ## 4.3.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 4.2.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/node-config-provider@4.3.14 - @smithy/property-provider@4.2.14 - @smithy/url-parser@4.2.14 ## 4.2.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/node-config-provider@4.3.13 - @smithy/property-provider@4.2.13 - @smithy/url-parser@4.2.13 ## 4.2.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/node-config-provider@4.3.12 - @smithy/property-provider@4.2.12 - @smithy/url-parser@4.2.12 ## 4.2.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/node-config-provider@4.3.11 - @smithy/property-provider@4.2.11 - @smithy/url-parser@4.2.11 ## 4.2.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/node-config-provider@4.3.10 - @smithy/property-provider@4.2.10 - @smithy/url-parser@4.2.10 ## 4.2.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/node-config-provider@4.3.9 - @smithy/property-provider@4.2.9 - @smithy/types@4.12.1 - @smithy/url-parser@4.2.9 ## 4.2.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/node-config-provider@4.3.8 - @smithy/property-provider@4.2.8 - @smithy/url-parser@4.2.8 ## 4.2.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/node-config-provider@4.3.7 - @smithy/property-provider@4.2.7 - @smithy/url-parser@4.2.7 ## 4.2.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/node-config-provider@4.3.6 - @smithy/property-provider@4.2.6 - @smithy/url-parser@4.2.6 ## 4.2.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/node-config-provider@4.3.5 - @smithy/property-provider@4.2.5 - @smithy/url-parser@4.2.5 ## 4.2.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/node-config-provider@4.3.4 - @smithy/property-provider@4.2.4 - @smithy/url-parser@4.2.4 ## 4.2.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/node-config-provider@4.3.3 - @smithy/property-provider@4.2.3 - @smithy/url-parser@4.2.3 ## 4.2.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/node-config-provider@4.3.2 - @smithy/property-provider@4.2.2 - @smithy/url-parser@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/node-config-provider@4.3.1 - @smithy/property-provider@4.2.1 - @smithy/url-parser@4.2.1 ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/node-config-provider@4.3.0 - @smithy/property-provider@4.2.0 - @smithy/types@4.6.0 - @smithy/url-parser@4.2.0 ## 4.1.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 ## 4.1.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/node-config-provider@4.2.1 - @smithy/property-provider@4.1.1 - @smithy/url-parser@4.1.1 ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/node-config-provider@4.2.0 - @smithy/property-provider@4.1.0 - @smithy/url-parser@4.1.0 - @smithy/types@4.4.0 ## 4.0.7 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/node-config-provider@4.1.4 - @smithy/property-provider@4.0.5 - @smithy/url-parser@4.0.5 ## 4.0.6 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/node-config-provider@4.1.3 - @smithy/property-provider@4.0.4 - @smithy/url-parser@4.0.4 ## 4.0.5 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/node-config-provider@4.1.2 - @smithy/property-provider@4.0.3 - @smithy/url-parser@4.0.3 ## 4.0.4 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 ## 4.0.3 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 ## 4.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/types@4.2.0 - @smithy/node-config-provider@4.0.2 - @smithy/property-provider@4.0.2 - @smithy/url-parser@4.0.2 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/node-config-provider@4.0.1 - @smithy/property-provider@4.0.1 - @smithy/url-parser@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/node-config-provider@4.0.0 - @smithy/property-provider@4.0.0 - @smithy/types@4.0.0 - @smithy/url-parser@4.0.0 ## 3.2.8 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/node-config-provider@3.1.12 - @smithy/property-provider@3.1.11 - @smithy/url-parser@3.0.11 ## 3.2.7 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/node-config-provider@3.1.11 - @smithy/property-provider@3.1.10 - @smithy/url-parser@3.0.10 ## 3.2.6 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/node-config-provider@3.1.10 - @smithy/property-provider@3.1.9 - @smithy/url-parser@3.0.9 ## 3.2.5 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/node-config-provider@3.1.9 - @smithy/property-provider@3.1.8 - @smithy/url-parser@3.0.8 ## 3.2.4 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/node-config-provider@3.1.8 - @smithy/property-provider@3.1.7 - @smithy/url-parser@3.0.7 ## 3.2.3 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/node-config-provider@3.1.7 - @smithy/property-provider@3.1.6 - @smithy/url-parser@3.0.6 ## 3.2.2 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/node-config-provider@3.1.6 - @smithy/property-provider@3.1.5 - @smithy/url-parser@3.0.5 ## 3.2.1 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/node-config-provider@3.1.5 - @smithy/property-provider@3.1.4 - @smithy/url-parser@3.0.4 ## 3.2.0 ### Minor Changes - 3d72b04: sources accountId from IMDS ## 3.1.4 ### Patch Changes - @smithy/node-config-provider@3.1.4 ## 3.1.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/node-config-provider@3.1.3 - @smithy/property-provider@3.1.3 - @smithy/url-parser@3.0.3 ## 3.1.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/node-config-provider@3.1.2 - @smithy/property-provider@3.1.2 - @smithy/url-parser@3.0.2 ## 3.1.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/node-config-provider@3.1.1 - @smithy/property-provider@3.1.1 - @smithy/url-parser@3.0.1 ## 3.1.0 ### Minor Changes - 1cdd3be0: new logging-compatible signature for CredentialsProviderError ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/node-config-provider@3.1.0 - @smithy/property-provider@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/property-provider@3.0.0 - @smithy/url-parser@3.0.0 ## 2.3.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/node-config-provider@2.3.0 - @smithy/property-provider@2.2.0 - @smithy/url-parser@2.2.0 - @smithy/types@2.12.0 ## 2.2.6 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 - @smithy/property-provider@2.1.4 - @smithy/url-parser@2.1.4 ## 2.2.5 ### Patch Changes - eea7af7d: fix: credential expiration extension log message - e136eb93: exporting Endpoint from credential-provider-imds to use for JSv3 EC2 IMDS utils ## 2.2.4 ### Patch Changes - @smithy/node-config-provider@2.2.4 ## 2.2.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/node-config-provider@2.2.3 - @smithy/property-provider@2.1.3 - @smithy/url-parser@2.1.3 ## 2.2.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/node-config-provider@2.2.2 - @smithy/property-provider@2.1.2 - @smithy/url-parser@2.1.2 ## 2.2.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/node-config-provider@2.2.1 - @smithy/property-provider@2.1.1 - @smithy/types@2.9.1 - @smithy/url-parser@2.1.1 ## 2.2.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/node-config-provider@2.2.0 - @smithy/property-provider@2.1.0 - @smithy/url-parser@2.1.0 - @smithy/types@2.9.0 ## 2.1.5 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/node-config-provider@2.1.9 - @smithy/property-provider@2.0.17 - @smithy/url-parser@2.0.16 ## 2.1.4 ### Patch Changes - @smithy/node-config-provider@2.1.8 ## 2.1.3 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/node-config-provider@2.1.7 - @smithy/property-provider@2.0.16 - @smithy/url-parser@2.0.15 ## 2.1.2 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/node-config-provider@2.1.6 - @smithy/property-provider@2.0.15 - @smithy/url-parser@2.0.14 ## 2.1.1 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/node-config-provider@2.1.5 - @smithy/property-provider@2.0.14 - @smithy/url-parser@2.0.13 ## 2.1.0 ### Minor Changes - 4693031d: Add IMDSv1 toggle. ### Patch Changes - @smithy/node-config-provider@2.1.4 ## 2.0.18 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/node-config-provider@2.1.3 - @smithy/property-provider@2.0.13 - @smithy/url-parser@2.0.12 ## 2.0.17 ### Patch Changes - @smithy/node-config-provider@2.1.2 ## 2.0.16 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/node-config-provider@2.1.1 - @smithy/property-provider@2.0.12 - @smithy/url-parser@2.0.11 ## 2.0.15 ### Patch Changes - Updated dependencies [7b568c39] - @smithy/node-config-provider@2.1.0 ## 2.0.14 ### Patch Changes - @smithy/node-config-provider@2.0.14 ## 2.0.13 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/node-config-provider@2.0.13 - @smithy/property-provider@2.0.11 - @smithy/url-parser@2.0.10 ## 2.0.12 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/node-config-provider@2.0.12 - @smithy/property-provider@2.0.10 - @smithy/url-parser@2.0.9 ## 2.0.11 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/node-config-provider@2.0.11 - @smithy/property-provider@2.0.9 - @smithy/url-parser@2.0.8 ## 2.0.10 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/node-config-provider@2.0.10 - @smithy/property-provider@2.0.8 - @smithy/url-parser@2.0.7 ## 2.0.9 ### Patch Changes - @smithy/node-config-provider@2.0.9 ## 2.0.8 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/node-config-provider@2.0.8 - @smithy/property-provider@2.0.7 - @smithy/url-parser@2.0.6 ## 2.0.7 ### Patch Changes - @smithy/node-config-provider@2.0.7 ## 2.0.6 ### Patch Changes - Updated dependencies [a7598a5d] - @smithy/property-provider@2.0.6 - @smithy/node-config-provider@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/node-config-provider@2.0.5 - @smithy/property-provider@2.0.5 - @smithy/url-parser@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/node-config-provider@2.0.4 - @smithy/property-provider@2.0.4 - @smithy/url-parser@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/node-config-provider@2.0.3 - @smithy/property-provider@2.0.3 - @smithy/url-parser@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/node-config-provider@2.0.2 - @smithy/property-provider@2.0.2 - @smithy/url-parser@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/node-config-provider@2.0.1 - @smithy/property-provider@2.0.1 - @smithy/url-parser@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/node-config-provider@2.0.0 - @smithy/property-provider@2.0.0 - @smithy/url-parser@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/node-config-provider@1.1.0 - @smithy/property-provider@1.2.0 - @smithy/types@1.2.0 - @smithy/url-parser@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [4ad43c6a] - Updated dependencies [d90a45b5] - Updated dependencies [5f7bcc79] - @smithy/types@2.0.0 - @smithy/property-provider@1.1.0 - @smithy/node-config-provider@1.0.3 - @smithy/url-parser@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/node-config-provider@1.0.2 - @smithy/property-provider@1.0.2 - @smithy/url-parser@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/node-config-provider@1.0.1 - @smithy/property-provider@1.0.1 - @smithy/url-parser@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/credential-provider-imds](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/credential-provider-imds/CHANGELOG.md) for additional history. ================================================ FILE: packages/credential-provider-imds/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/credential-provider-imds/README.md ================================================ # @smithy/credential-provider-imds [![NPM version](https://img.shields.io/npm/v/@smithy/credential-provider-imds/latest.svg)](https://www.npmjs.com/package/@smithy/credential-provider-imds) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/credential-provider-imds.svg)](https://www.npmjs.com/package/@smithy/credential-provider-imds) ### :warning: Internal API :warning: > This is an internal package. > That means this is used as a dependency for other, public packages, but > should not be taken directly as a dependency in your application's `package.json`. > If you are updating the version of this package, for example to bring in a > bug-fix, you should do so by updating your application lockfile with > e.g. `npm up @scope/package` or equivalent command in another > package manager, rather than taking a direct dependency. --- Please use [@smithy/credential-providers](https://www.npmjs.com/package/@smithy/credential-providers) instead. ================================================ FILE: packages/credential-provider-imds/package.json ================================================ { "name": "@smithy/credential-provider-imds", "version": "4.3.3", "description": "AWS credential provider that sources credentials from the EC2 instance metadata service and ECS container metadata service", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline credential-provider-imds", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:watch": "yarn g:vitest watch" }, "keywords": [ "aws", "credentials" ], "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/credential-provider-imds", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/credential-provider-imds" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/credential-provider-imds/src/config/Endpoint.ts ================================================ /** * @internal */ export enum Endpoint { IPv4 = "http://169.254.169.254", IPv6 = "http://[fd00:ec2::254]", } ================================================ FILE: packages/credential-provider-imds/src/config/EndpointConfigOptions.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { CONFIG_ENDPOINT_NAME, ENDPOINT_CONFIG_OPTIONS, ENV_ENDPOINT_NAME } from "./EndpointConfigOptions"; describe("ENDPOINT_CONFIG_OPTIONS", () => { describe("environmentVariableSelector", () => { const { environmentVariableSelector } = ENDPOINT_CONFIG_OPTIONS; it.each([undefined, "mockEndpoint"])(`when env[${ENV_ENDPOINT_NAME}]: %s`, (mockEndpoint) => { expect(environmentVariableSelector({ [ENV_ENDPOINT_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); describe("configFileSelector", () => { const { configFileSelector } = ENDPOINT_CONFIG_OPTIONS; it.each([undefined, "mockEndpoint"])(`when env[${CONFIG_ENDPOINT_NAME}]: %s`, (mockEndpoint) => { expect(configFileSelector({ [CONFIG_ENDPOINT_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); it("default returns undefined", () => { const { default: defaultKey } = ENDPOINT_CONFIG_OPTIONS; expect(defaultKey).toBe(undefined); }); }); ================================================ FILE: packages/credential-provider-imds/src/config/EndpointConfigOptions.ts ================================================ import type { LoadedConfigSelectors } from "@smithy/core/config"; /** * @internal */ export const ENV_ENDPOINT_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT"; /** * @internal */ export const CONFIG_ENDPOINT_NAME = "ec2_metadata_service_endpoint"; /** * @internal */ export const ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => env[ENV_ENDPOINT_NAME], configFileSelector: (profile) => profile[CONFIG_ENDPOINT_NAME], default: undefined, }; ================================================ FILE: packages/credential-provider-imds/src/config/EndpointMode.ts ================================================ /** * @internal */ export enum EndpointMode { IPv4 = "IPv4", IPv6 = "IPv6", } ================================================ FILE: packages/credential-provider-imds/src/config/EndpointModeConfigOptions.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { EndpointMode } from "./EndpointMode"; import { CONFIG_ENDPOINT_MODE_NAME, ENDPOINT_MODE_CONFIG_OPTIONS, ENV_ENDPOINT_MODE_NAME, } from "./EndpointModeConfigOptions"; describe("ENDPOINT_MODE_CONFIG_OPTIONS", () => { describe("environmentVariableSelector", () => { const { environmentVariableSelector } = ENDPOINT_MODE_CONFIG_OPTIONS; it.each([undefined, "mockEndpointMode"])(`when env[${ENV_ENDPOINT_MODE_NAME}]: %s`, (mockEndpoint) => { expect(environmentVariableSelector({ [ENV_ENDPOINT_MODE_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); describe("configFileSelector", () => { const { configFileSelector } = ENDPOINT_MODE_CONFIG_OPTIONS; it.each([undefined, "mockEndpointMode"])(`when env[${CONFIG_ENDPOINT_MODE_NAME}]: %s`, (mockEndpoint) => { expect(configFileSelector({ [CONFIG_ENDPOINT_MODE_NAME]: mockEndpoint })).toBe(mockEndpoint); }); }); it(`default returns ${EndpointMode.IPv4}`, () => { const { default: defaultKey } = ENDPOINT_MODE_CONFIG_OPTIONS; expect(defaultKey).toBe(EndpointMode.IPv4); }); }); ================================================ FILE: packages/credential-provider-imds/src/config/EndpointModeConfigOptions.ts ================================================ import type { LoadedConfigSelectors } from "@smithy/core/config"; import { EndpointMode } from "./EndpointMode"; /** * @internal */ export const ENV_ENDPOINT_MODE_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE"; /** * @internal */ export const CONFIG_ENDPOINT_MODE_NAME = "ec2_metadata_service_endpoint_mode"; /** * @internal */ export const ENDPOINT_MODE_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => env[ENV_ENDPOINT_MODE_NAME], configFileSelector: (profile) => profile[CONFIG_ENDPOINT_MODE_NAME], default: EndpointMode.IPv4, }; ================================================ FILE: packages/credential-provider-imds/src/error/InstanceMetadataV1FallbackError.ts ================================================ import { CredentialsProviderError } from "@smithy/core/config"; /** * A specific sub-case of CredentialsProviderError, when the IMDSv1 fallback * has been attempted but shut off by SDK configuration. * * @public */ export class InstanceMetadataV1FallbackError extends CredentialsProviderError { public name = "InstanceMetadataV1FallbackError"; constructor( message: string, public readonly tryNextLink: boolean = true ) { super(message, tryNextLink); Object.setPrototypeOf(this, InstanceMetadataV1FallbackError.prototype); } } ================================================ FILE: packages/credential-provider-imds/src/fromContainerMetadata.spec.ts ================================================ import { afterAll, beforeEach, describe, expect, test as it, vi } from "vitest"; import { ENV_CMDS_AUTH_TOKEN, ENV_CMDS_FULL_URI, ENV_CMDS_RELATIVE_URI, fromContainerMetadata, } from "./fromContainerMetadata"; import { fromImdsCredentials, type ImdsCredentials } from "./remoteProvider/ImdsCredentials"; import { httpRequest } from "./remoteProvider/httpRequest"; const mockHttpRequest = httpRequest; vi.mock("./remoteProvider/httpRequest"); const relativeUri = process.env[ENV_CMDS_RELATIVE_URI]; const fullUri = process.env[ENV_CMDS_FULL_URI]; const authToken = process.env[ENV_CMDS_AUTH_TOKEN]; beforeEach(() => { mockHttpRequest.mockReset(); delete process.env[ENV_CMDS_RELATIVE_URI]; delete process.env[ENV_CMDS_FULL_URI]; delete process.env[ENV_CMDS_AUTH_TOKEN]; }); afterAll(() => { process.env[ENV_CMDS_RELATIVE_URI] = relativeUri; process.env[ENV_CMDS_FULL_URI] = fullUri; process.env[ENV_CMDS_AUTH_TOKEN] = authToken; }); describe("fromContainerMetadata", () => { const creds: ImdsCredentials = Object.freeze({ AccessKeyId: "foo", SecretAccessKey: "bar", Token: "baz", Expiration: new Date().toISOString(), }); it("should reject the promise with a terminal error if the container credentials environment variable is not set", async () => { await fromContainerMetadata()().then( () => { throw new Error("The promise should have been rejected"); }, (err) => { expect((err as any).tryNextLink).toBeFalsy(); } ); }); it(`should inject an authorization header containing the contents of the ${ENV_CMDS_AUTH_TOKEN} environment variable if defined`, async () => { const token = "Basic abcd"; process.env[ENV_CMDS_FULL_URI] = "http://localhost:8080/path"; process.env[ENV_CMDS_AUTH_TOKEN] = token; mockHttpRequest.mockReturnValue(Promise.resolve(JSON.stringify(creds))); await fromContainerMetadata()(); expect(mockHttpRequest.mock.calls.length).toBe(1); const [options = {}] = mockHttpRequest.mock.calls[0]; expect(options.headers).toMatchObject({ Authorization: token, }); }); describe(ENV_CMDS_RELATIVE_URI, () => { beforeEach(() => { process.env[ENV_CMDS_RELATIVE_URI] = "/relative/uri"; }); it("should resolve credentials by fetching them from the container metadata service", async () => { mockHttpRequest.mockReturnValue(Promise.resolve(JSON.stringify(creds))); expect(await fromContainerMetadata()()).toEqual(fromImdsCredentials(creds)); }); it("should retry the fetching operation up to maxRetries times", async () => { const maxRetries = 5; for (let i = 0; i < maxRetries - 1; i++) { mockHttpRequest.mockReturnValueOnce(Promise.reject("No!")); } mockHttpRequest.mockReturnValueOnce(Promise.resolve(JSON.stringify(creds))); expect(await fromContainerMetadata({ maxRetries })()).toEqual(fromImdsCredentials(creds)); expect(mockHttpRequest.mock.calls.length).toEqual(maxRetries); }); it("should retry responses that receive invalid response values", async () => { for (const key of Object.keys(creds)) { const invalidCreds: any = { ...creds }; delete invalidCreds[key]; mockHttpRequest.mockReturnValueOnce(Promise.resolve(JSON.stringify(invalidCreds))); } mockHttpRequest.mockReturnValueOnce(Promise.resolve(JSON.stringify(creds))); await fromContainerMetadata({ maxRetries: 100 })(); expect(mockHttpRequest.mock.calls.length).toEqual(Object.keys(creds).length + 1); }); it("should pass relevant configuration to httpRequest", async () => { const timeout = Math.ceil(Math.random() * 1000); mockHttpRequest.mockReturnValue(Promise.resolve(JSON.stringify(creds))); await fromContainerMetadata({ timeout })(); expect(mockHttpRequest.mock.calls.length).toEqual(1); expect(mockHttpRequest.mock.calls[0][0]).toEqual({ hostname: "169.254.170.2", path: process.env[ENV_CMDS_RELATIVE_URI], timeout, }); }); }); describe(ENV_CMDS_FULL_URI, () => { it("should pass relevant configuration to httpRequest", async () => { process.env[ENV_CMDS_FULL_URI] = "http://localhost:8080/path"; const timeout = Math.ceil(Math.random() * 1000); mockHttpRequest.mockReturnValue(Promise.resolve(JSON.stringify(creds))); await fromContainerMetadata({ timeout })(); expect(mockHttpRequest.mock.calls.length).toEqual(1); const { protocol, hostname, path, port, timeout: actualTimeout } = mockHttpRequest.mock.calls[0][0]; expect(protocol).toBe("http:"); expect(hostname).toBe("localhost"); expect(path).toBe("/path"); expect(port).toBe(8080); expect(actualTimeout).toBe(timeout); }); it(`should prefer ${ENV_CMDS_RELATIVE_URI} to ${ENV_CMDS_FULL_URI}`, async () => { process.env[ENV_CMDS_RELATIVE_URI] = "foo"; process.env[ENV_CMDS_FULL_URI] = "http://localhost:8080/path"; const timeout = Math.ceil(Math.random() * 1000); mockHttpRequest.mockReturnValue(Promise.resolve(JSON.stringify(creds))); await fromContainerMetadata({ timeout })(); expect(mockHttpRequest.mock.calls.length).toEqual(1); expect(mockHttpRequest.mock.calls[0][0]).toEqual({ hostname: "169.254.170.2", path: "foo", timeout, }); }); it("should reject the promise with a terminal error if a unexpected protocol is specified", async () => { process.env[ENV_CMDS_FULL_URI] = "wss://localhost:8080/path"; await fromContainerMetadata()().then( () => { throw new Error("The promise should have been rejected"); }, (err) => { expect((err as any).tryNextLink).toBeFalsy(); } ); }); it("should reject the promise with a terminal error if a unexpected hostname is specified", async () => { process.env[ENV_CMDS_FULL_URI] = "https://bucket.s3.amazonaws.com/key"; await fromContainerMetadata()().then( () => { throw new Error("The promise should have been rejected"); }, (err) => { expect((err as any).tryNextLink).toBeFalsy(); } ); }); }); }); ================================================ FILE: packages/credential-provider-imds/src/fromContainerMetadata.ts ================================================ import type { RequestOptions } from "node:http"; import { parse } from "node:url"; import { CredentialsProviderError } from "@smithy/core/config"; import type { AwsCredentialIdentityProvider, Logger } from "@smithy/types"; import { fromImdsCredentials, isImdsCredentials } from "./remoteProvider/ImdsCredentials"; import { providerConfigFromInit, type RemoteProviderInit } from "./remoteProvider/RemoteProviderInit"; import { httpRequest } from "./remoteProvider/httpRequest"; import { retry } from "./remoteProvider/retry"; /** * @internal */ export const ENV_CMDS_FULL_URI = "AWS_CONTAINER_CREDENTIALS_FULL_URI"; /** * @internal */ export const ENV_CMDS_RELATIVE_URI = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"; /** * @internal */ export const ENV_CMDS_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN"; /** * Creates a credential provider that will source credentials from the ECS * Container Metadata Service * * @internal */ export const fromContainerMetadata = (init: RemoteProviderInit = {}): AwsCredentialIdentityProvider => { const { timeout, maxRetries } = providerConfigFromInit(init); return () => retry(async () => { const requestOptions = await getCmdsUri({ logger: init.logger }); const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions)); if (!isImdsCredentials(credsResponse)) { throw new CredentialsProviderError("Invalid response received from instance metadata service.", { logger: init.logger, }); } return fromImdsCredentials(credsResponse); }, maxRetries); }; const requestFromEcsImds = async (timeout: number, options: RequestOptions): Promise => { if (process.env[ENV_CMDS_AUTH_TOKEN]) { options.headers = { ...options.headers, Authorization: process.env[ENV_CMDS_AUTH_TOKEN], }; } const buffer = await httpRequest({ ...options, timeout, }); return buffer.toString(); }; const CMDS_IP = "169.254.170.2"; const GREENGRASS_HOSTS = { localhost: true, "127.0.0.1": true, }; const GREENGRASS_PROTOCOLS = { "http:": true, "https:": true, }; const getCmdsUri = async ({ logger }: { logger?: Logger }): Promise => { if (process.env[ENV_CMDS_RELATIVE_URI]) { return { hostname: CMDS_IP, path: process.env[ENV_CMDS_RELATIVE_URI], }; } if (process.env[ENV_CMDS_FULL_URI]) { const parsed = parse(process.env[ENV_CMDS_FULL_URI]!); if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) { throw new CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, { tryNextLink: false, logger, }); } if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) { throw new CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, { tryNextLink: false, logger, }); } return { ...parsed, port: parsed.port ? parseInt(parsed.port, 10) : undefined, }; } throw new CredentialsProviderError( "The container metadata credential provider cannot be used unless" + ` the ${ENV_CMDS_RELATIVE_URI} or ${ENV_CMDS_FULL_URI} environment` + " variable is set", { tryNextLink: false, logger, } ); }; ================================================ FILE: packages/credential-provider-imds/src/fromInstanceMetadata.spec.ts ================================================ import { CredentialsProviderError } from "@smithy/core/config"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { InstanceMetadataV1FallbackError } from "./error/InstanceMetadataV1FallbackError"; import { fromInstanceMetadata } from "./fromInstanceMetadata"; import { fromImdsCredentials, isImdsCredentials } from "./remoteProvider/ImdsCredentials"; import { providerConfigFromInit } from "./remoteProvider/RemoteProviderInit"; import { httpRequest } from "./remoteProvider/httpRequest"; import { retry } from "./remoteProvider/retry"; import { getInstanceMetadataEndpoint } from "./utils/getInstanceMetadataEndpoint"; import { staticStabilityProvider } from "./utils/staticStabilityProvider"; vi.mock("./remoteProvider/httpRequest"); vi.mock("./remoteProvider/ImdsCredentials"); vi.mock("./remoteProvider/retry"); vi.mock("./remoteProvider/RemoteProviderInit"); vi.mock("./utils/getInstanceMetadataEndpoint"); vi.mock("./utils/staticStabilityProvider"); describe("fromInstanceMetadata", () => { const hostname = "127.0.0.1"; const mockTimeout = 1000; const mockMaxRetries = 3; const mockToken = "fooToken"; const mockProfile = "fooProfile"; const mockTokenRequestOptions = { hostname, path: "/latest/api/token", method: "PUT", headers: { "x-aws-ec2-metadata-token-ttl-seconds": "21600", }, timeout: mockTimeout, }; const mockProfileRequestOptions = { hostname, path: "/latest/meta-data/iam/security-credentials/", timeout: mockTimeout, headers: { "x-aws-ec2-metadata-token": mockToken, }, }; const ONE_HOUR_IN_FUTURE = new Date(Date.now() + 60 * 60 * 1000); const mockImdsCreds = Object.freeze({ AccessKeyId: "foo", SecretAccessKey: "bar", Token: "baz", Expiration: ONE_HOUR_IN_FUTURE.toISOString(), }); const mockCreds = Object.freeze({ accessKeyId: mockImdsCreds.AccessKeyId, secretAccessKey: mockImdsCreds.SecretAccessKey, sessionToken: mockImdsCreds.Token, expiration: new Date(mockImdsCreds.Expiration), }); beforeEach(() => { vi.mocked(staticStabilityProvider).mockImplementation((input) => input); vi.mocked(getInstanceMetadataEndpoint).mockResolvedValue({ hostname } as any); (isImdsCredentials as unknown as any).mockReturnValue(true); vi.mocked(providerConfigFromInit).mockReturnValue({ timeout: mockTimeout, maxRetries: mockMaxRetries, }); }); afterEach(() => { vi.resetAllMocks(); }); it("gets token and profile name to fetch credentials", async () => { vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); await expect(fromInstanceMetadata()()).resolves.toEqual(mockCreds); expect(httpRequest).toHaveBeenCalledTimes(3); expect(httpRequest).toHaveBeenNthCalledWith(1, mockTokenRequestOptions); expect(httpRequest).toHaveBeenNthCalledWith(2, mockProfileRequestOptions); expect(httpRequest).toHaveBeenNthCalledWith(3, { ...mockProfileRequestOptions, path: `${mockProfileRequestOptions.path}${mockProfile}`, }); }); it("trims profile returned name from IMDS", async () => { vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce((" " + mockProfile + " ") as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); await expect(fromInstanceMetadata()()).resolves.toEqual(mockCreds); expect(httpRequest).toHaveBeenNthCalledWith(3, { ...mockProfileRequestOptions, path: `${mockProfileRequestOptions.path}${mockProfile}`, }); }); it("passes {} to providerConfigFromInit if init not defined", async () => { vi.mocked(retry).mockResolvedValueOnce(mockProfile).mockResolvedValueOnce(mockCreds); await expect(fromInstanceMetadata()()).resolves.toEqual(mockCreds); expect(providerConfigFromInit).toHaveBeenCalledTimes(1); expect(providerConfigFromInit).toHaveBeenCalledWith({}); }); it("passes init to providerConfigFromInit", async () => { vi.mocked(retry).mockResolvedValueOnce(mockProfile).mockResolvedValueOnce(mockCreds); const init = { maxRetries: 5, timeout: 1213 }; await expect(fromInstanceMetadata(init)()).resolves.toEqual(mockCreds); expect(providerConfigFromInit).toHaveBeenCalledTimes(1); expect(providerConfigFromInit).toHaveBeenCalledWith(init); }); it("passes maxRetries returned from providerConfigFromInit to retry", async () => { vi.mocked(retry).mockResolvedValueOnce(mockProfile).mockResolvedValueOnce(mockCreds); await expect(fromInstanceMetadata()()).resolves.toEqual(mockCreds); expect(retry).toHaveBeenCalledTimes(2); expect(vi.mocked(retry).mock.calls[0][1]).toBe(mockMaxRetries); expect(vi.mocked(retry).mock.calls[1][1]).toBe(mockMaxRetries); }); it("throws CredentialsProviderError if credentials returned are incorrect", async () => { vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); (isImdsCredentials as unknown as any).mockReturnValueOnce(false); await expect(fromInstanceMetadata()()).rejects.toEqual( new CredentialsProviderError("Invalid response received from instance metadata service.") ); expect(retry).toHaveBeenCalledTimes(2); expect(httpRequest).toHaveBeenCalledTimes(3); expect(isImdsCredentials).toHaveBeenCalledTimes(1); expect(isImdsCredentials).toHaveBeenCalledWith(mockImdsCreds); expect(fromImdsCredentials).not.toHaveBeenCalled(); }); it("throws Error if httpRequest for profile fails", async () => { const mockError = new Error("profile not found"); vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockRejectedValueOnce(mockError); vi.mocked(retry).mockImplementation((fn: any) => fn()); await expect(fromInstanceMetadata()()).rejects.toEqual(mockError); expect(retry).toHaveBeenCalledTimes(1); expect(httpRequest).toHaveBeenCalledTimes(2); }); it("throws Error if httpRequest for credentials fails", async () => { const mockError = new Error("creds not found"); vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockRejectedValueOnce(mockError); vi.mocked(retry).mockImplementation((fn: any) => fn()); await expect(fromInstanceMetadata()()).rejects.toEqual(mockError); expect(retry).toHaveBeenCalledTimes(2); expect(httpRequest).toHaveBeenCalledTimes(3); expect(fromImdsCredentials).not.toHaveBeenCalled(); }); it("throws SyntaxError if httpRequest returns unparseable creds", async () => { vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce("." as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); await expect(fromInstanceMetadata()()).rejects.toThrow("Unexpected token"); expect(retry).toHaveBeenCalledTimes(2); expect(httpRequest).toHaveBeenCalledTimes(3); expect(fromImdsCredentials).not.toHaveBeenCalled(); }); it("throws error if metadata token errors with statusCode 400", async () => { const tokenError = Object.assign(new Error("token not found"), { statusCode: 400, }); vi.mocked(httpRequest).mockRejectedValueOnce(tokenError); await expect(fromInstanceMetadata()()).rejects.toEqual(tokenError); }); it("should call staticStabilityProvider with the credential loader", async () => { vi.mocked(httpRequest) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); await fromInstanceMetadata()(); expect(vi.mocked(staticStabilityProvider)).toBeCalledTimes(1); }); describe("disables fetching of token", () => { beforeEach(() => { vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); }); it("when token fetch returns with TimeoutError", async () => { const tokenError = new Error("TimeoutError"); vi.mocked(httpRequest) .mockRejectedValueOnce(tokenError) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); const fromInstanceMetadataFunc = fromInstanceMetadata(); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); }); [403, 404, 405].forEach((statusCode) => { it(`when token fetch errors with statusCode ${statusCode}`, async () => { const tokenError = Object.assign(new Error(), { statusCode }); vi.mocked(httpRequest) .mockRejectedValueOnce(tokenError) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); const fromInstanceMetadataFunc = fromInstanceMetadata(); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); }); }); }); it("uses insecure data flow once, if error is not TimeoutError", async () => { const tokenError = new Error("Error"); vi.mocked(httpRequest) .mockRejectedValueOnce(tokenError) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); const fromInstanceMetadataFunc = fromInstanceMetadata(); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); }); it("uses insecure data flow once, if error statusCode is not 400, 403, 404, 405", async () => { const tokenError = Object.assign(new Error("Error"), { statusCode: 406 }); vi.mocked(httpRequest) .mockRejectedValueOnce(tokenError) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any) .mockResolvedValueOnce(mockToken as any) .mockResolvedValueOnce(mockProfile as any) .mockResolvedValueOnce(JSON.stringify(mockImdsCreds) as any); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); const fromInstanceMetadataFunc = fromInstanceMetadata(); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); await expect(fromInstanceMetadataFunc()).resolves.toEqual(mockCreds); }); it("allows blocking imdsv1 fallback", async () => { const tokenError = Object.assign(new Error("Error"), { statusCode: 406 }); vi.mocked(httpRequest).mockRejectedValueOnce(tokenError); vi.mocked(retry).mockImplementation((fn: any) => fn()); vi.mocked(fromImdsCredentials).mockReturnValue(mockCreds); const fromInstanceMetadataFunc = fromInstanceMetadata({ ec2MetadataV1Disabled: true, }); await expect(() => fromInstanceMetadataFunc()).rejects.toBeInstanceOf(InstanceMetadataV1FallbackError); }); }); ================================================ FILE: packages/credential-provider-imds/src/fromInstanceMetadata.ts ================================================ import type { RequestOptions } from "node:http"; import { CredentialsProviderError, loadConfig } from "@smithy/core/config"; import type { AwsCredentialIdentity, Provider } from "@smithy/types"; import { InstanceMetadataV1FallbackError } from "./error/InstanceMetadataV1FallbackError"; import { fromImdsCredentials, isImdsCredentials } from "./remoteProvider/ImdsCredentials"; import { providerConfigFromInit, type RemoteProviderInit } from "./remoteProvider/RemoteProviderInit"; import { httpRequest } from "./remoteProvider/httpRequest"; import { retry } from "./remoteProvider/retry"; import type { InstanceMetadataCredentials } from "./types"; import { getInstanceMetadataEndpoint } from "./utils/getInstanceMetadataEndpoint"; import { staticStabilityProvider } from "./utils/staticStabilityProvider"; const IMDS_PATH = "/latest/meta-data/iam/security-credentials/"; const IMDS_TOKEN_PATH = "/latest/api/token"; const AWS_EC2_METADATA_V1_DISABLED = "AWS_EC2_METADATA_V1_DISABLED"; const PROFILE_AWS_EC2_METADATA_V1_DISABLED = "ec2_metadata_v1_disabled"; const X_AWS_EC2_METADATA_TOKEN = "x-aws-ec2-metadata-token"; /** * Creates a credential provider that will source credentials from the EC2 * Instance Metadata Service * * @internal */ export const fromInstanceMetadata = (init: RemoteProviderInit = {}): Provider => staticStabilityProvider(getInstanceMetadataProvider(init), { logger: init.logger }); /** * @internal */ const getInstanceMetadataProvider = (init: RemoteProviderInit = {}) => { // when set to true, metadata service will not fetch token let disableFetchToken = false; const { logger, profile } = init; const { timeout, maxRetries } = providerConfigFromInit(init); const getCredentials = async (maxRetries: number, options: RequestOptions) => { const isImdsV1Fallback = disableFetchToken || options.headers?.[X_AWS_EC2_METADATA_TOKEN] == null; if (isImdsV1Fallback) { let fallbackBlockedFromProfile = false; let fallbackBlockedFromProcessEnv = false; const configValue = await loadConfig( { environmentVariableSelector: (env) => { const envValue = env[AWS_EC2_METADATA_V1_DISABLED]; fallbackBlockedFromProcessEnv = !!envValue && envValue !== "false"; if (envValue === undefined) { throw new CredentialsProviderError( `${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`, { logger: init.logger } ); } return fallbackBlockedFromProcessEnv; }, configFileSelector: (profile) => { const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED]; fallbackBlockedFromProfile = !!profileValue && profileValue !== "false"; return fallbackBlockedFromProfile; }, default: false, }, { profile, } )(); if (init.ec2MetadataV1Disabled || configValue) { const causes: string[] = []; if (init.ec2MetadataV1Disabled) causes.push("credential provider initialization (runtime option ec2MetadataV1Disabled)"); if (fallbackBlockedFromProfile) causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`); if (fallbackBlockedFromProcessEnv) causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`); throw new InstanceMetadataV1FallbackError( `AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join( ", " )}].` ); } } const imdsProfile = ( await retry(async () => { let profile: string; try { profile = await getProfile(options); } catch (err) { if (err.statusCode === 401) { disableFetchToken = false; } throw err; } return profile; }, maxRetries) ).trim(); return retry(async () => { let creds: AwsCredentialIdentity; try { creds = await getCredentialsFromProfile(imdsProfile, options, init); } catch (err) { if (err.statusCode === 401) { disableFetchToken = false; } throw err; } return creds; }, maxRetries); }; return async () => { const endpoint = await getInstanceMetadataEndpoint(); if (disableFetchToken) { logger?.debug("AWS SDK Instance Metadata", "using v1 fallback (no token fetch)"); return getCredentials(maxRetries, { ...endpoint, timeout }); } else { let token: string; try { token = (await getMetadataToken({ ...endpoint, timeout })).toString(); } catch (error) { if (error?.statusCode === 400) { throw Object.assign(error, { message: "EC2 Metadata token request returned error", }); } else if (error.message === "TimeoutError" || [403, 404, 405].includes(error.statusCode)) { disableFetchToken = true; } logger?.debug("AWS SDK Instance Metadata", "using v1 fallback (initial)"); return getCredentials(maxRetries, { ...endpoint, timeout }); } return getCredentials(maxRetries, { ...endpoint, headers: { [X_AWS_EC2_METADATA_TOKEN]: token, }, timeout, }); } }; }; const getMetadataToken = async (options: RequestOptions) => httpRequest({ ...options, path: IMDS_TOKEN_PATH, method: "PUT", headers: { "x-aws-ec2-metadata-token-ttl-seconds": "21600", }, }); const getProfile = async (options: RequestOptions) => (await httpRequest({ ...options, path: IMDS_PATH })).toString(); const getCredentialsFromProfile = async (profile: string, options: RequestOptions, init: RemoteProviderInit) => { const credentialsResponse = JSON.parse( ( await httpRequest({ ...options, path: IMDS_PATH + profile, }) ).toString() ); if (!isImdsCredentials(credentialsResponse)) { throw new CredentialsProviderError("Invalid response received from instance metadata service.", { logger: init.logger, }); } return fromImdsCredentials(credentialsResponse); }; ================================================ FILE: packages/credential-provider-imds/src/index.ts ================================================ /** * @internal */ export * from "./fromContainerMetadata"; /** * @internal */ export * from "./fromInstanceMetadata"; /** * @internal */ export * from "./remoteProvider/RemoteProviderInit"; /** * @internal */ export * from "./types"; /** * @internal */ export { httpRequest } from "./remoteProvider/httpRequest"; /** * @internal */ export { getInstanceMetadataEndpoint } from "./utils/getInstanceMetadataEndpoint"; /** * @internal */ export { Endpoint } from "./config/Endpoint"; ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/ImdsCredentials.spec.ts ================================================ import type { AwsCredentialIdentity } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { fromImdsCredentials, isImdsCredentials, type ImdsCredentials } from "./ImdsCredentials"; const creds: ImdsCredentials = Object.freeze({ AccessKeyId: "foo", SecretAccessKey: "bar", Token: "baz", Expiration: new Date().toISOString(), AccountId: "123456789012", }); describe("isImdsCredentials", () => { it("should accept valid ImdsCredentials objects", () => { expect(isImdsCredentials(creds)).toBe(true); const { AccountId, ...credsWithoutAccountId } = creds; expect(AccountId).toBe("123456789012"); expect(isImdsCredentials(credsWithoutAccountId)).toBe(true); }); it("should reject credentials without an AccessKeyId", () => { expect(isImdsCredentials({ ...creds, AccessKeyId: void 0 })).toBe(false); }); it("should reject credentials without a SecretAccessKey", () => { expect(isImdsCredentials({ ...creds, SecretAccessKey: void 0 })).toBe(false); }); it("should reject credentials without a Token", () => { expect(isImdsCredentials({ ...creds, Token: void 0 })).toBe(false); }); it("should reject credentials without an Expiration", () => { expect(isImdsCredentials({ ...creds, Expiration: void 0 })).toBe(false); }); it("should reject scalar values", () => { for (const scalar of ["string", 1, true, null, void 0]) { expect(isImdsCredentials(scalar)).toBe(false); } }); }); describe("fromImdsCredentials", () => { it("should convert IMDS credentials to a credentials object", () => { const converted: AwsCredentialIdentity = fromImdsCredentials(creds); expect(converted.accessKeyId).toEqual(creds.AccessKeyId); expect(converted.secretAccessKey).toEqual(creds.SecretAccessKey); expect(converted.sessionToken).toEqual(creds.Token); expect(converted.expiration).toEqual(new Date(creds.Expiration)); expect(converted.accountId).toEqual(creds.AccountId); }); it("should convert IMDS credentials to a credentials object without accountId when it's not provided", () => { const credsWithoutAccountId: ImdsCredentials = { AccessKeyId: "foo", SecretAccessKey: "bar", Token: "baz", Expiration: new Date().toISOString(), // AccountId is omitted }; const converted: AwsCredentialIdentity = fromImdsCredentials(credsWithoutAccountId); expect(converted.accessKeyId).toEqual(credsWithoutAccountId.AccessKeyId); expect(converted.secretAccessKey).toEqual(credsWithoutAccountId.SecretAccessKey); expect(converted.sessionToken).toEqual(credsWithoutAccountId.Token); expect(converted.expiration).toEqual(new Date(credsWithoutAccountId.Expiration)); expect(converted.accountId).toBeUndefined(); // Verify accountId is undefined }); }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/ImdsCredentials.ts ================================================ import type { AwsCredentialIdentity } from "@smithy/types"; /** * @internal */ export interface ImdsCredentials { AccessKeyId: string; SecretAccessKey: string; Token: string; Expiration: string; AccountId?: string; } /** * @internal */ export const isImdsCredentials = (arg: any): arg is ImdsCredentials => Boolean(arg) && typeof arg === "object" && typeof arg.AccessKeyId === "string" && typeof arg.SecretAccessKey === "string" && typeof arg.Token === "string" && typeof arg.Expiration === "string"; /** * @internal */ export const fromImdsCredentials = (creds: ImdsCredentials): AwsCredentialIdentity => ({ accessKeyId: creds.AccessKeyId, secretAccessKey: creds.SecretAccessKey, sessionToken: creds.Token, expiration: new Date(creds.Expiration), ...(creds.AccountId && { accountId: creds.AccountId }), }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/RemoteProviderInit.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { DEFAULT_MAX_RETRIES, DEFAULT_TIMEOUT, providerConfigFromInit } from "./RemoteProviderInit"; describe("providerConfigFromInit", () => { it("should populate default values for retries and timeouts", () => { expect(providerConfigFromInit({})).toEqual({ timeout: DEFAULT_TIMEOUT, maxRetries: DEFAULT_MAX_RETRIES, }); }); it("should pass through timeout and retries overrides", () => { const timeout = 123456789; const maxRetries = 987654321; expect(providerConfigFromInit({ timeout, maxRetries })).toEqual({ timeout, maxRetries, }); }); }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/RemoteProviderInit.ts ================================================ import type { Logger } from "@smithy/types"; /** * @internal */ export const DEFAULT_TIMEOUT = 1000; // The default in AWS SDK for Python and CLI (botocore) is no retry or one attempt // https://github.com/boto/botocore/blob/646c61a7065933e75bab545b785e6098bc94c081/botocore/utils.py#L273 /** * @internal */ export const DEFAULT_MAX_RETRIES = 0; /** * @public */ export interface RemoteProviderConfig { /** * The connection timeout (in milliseconds) */ timeout: number; /** * The maximum number of times the HTTP connection should be retried */ maxRetries: number; } /** * @public */ export interface RemoteProviderInit extends Partial { logger?: Logger; /** * Only used in the IMDS credential provider. */ ec2MetadataV1Disabled?: boolean; /** * AWS_PROFILE. */ profile?: string; } /** * @internal */ export const providerConfigFromInit = ({ maxRetries = DEFAULT_MAX_RETRIES, timeout = DEFAULT_TIMEOUT, }: RemoteProviderInit): RemoteProviderConfig => ({ maxRetries, timeout }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts ================================================ import EventEmitter from "node:events"; import { request } from "node:http"; import { ProviderError } from "@smithy/core/config"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { httpRequest } from "./httpRequest"; vi.mock("http", async () => { const actual: any = vi.importActual("http"); const pkg = { ...actual, request: vi.fn(), }; return { ...pkg, default: pkg, }; }); describe("httpRequest", () => { const hostname = "localhost"; const path = "/"; afterEach(() => { vi.clearAllMocks(); }); function mockResponse({ expectedResponse, statusCode = 200 }: any) { return vi.mocked(request).mockImplementationOnce((() => { const request = Object.assign(new EventEmitter(), { destroy: vi.fn(), end: vi.fn(), }); const response = new EventEmitter() as any; response.statusCode = statusCode; setTimeout(() => { request.emit("response", response); setTimeout(() => { response.emit("data", Buffer.from(expectedResponse)); response.emit("end"); }, 50); }, 50); return request; }) as any); } describe("returns response", () => { it("defaults to method GET", async () => { const expectedResponse = "expectedResponse"; mockResponse({ expectedResponse }); const response = await httpRequest({ hostname, path }); expect(response.toString()).toStrictEqual(expectedResponse); }); it("uses method passed in options", async () => { const method = "POST"; const expectedResponse = "expectedResponse"; mockResponse({ expectedResponse }); const response = await httpRequest({ hostname, path, method }); expect(response.toString()).toStrictEqual(expectedResponse); }); it("works with IPv6 hostname with encapsulated brackets", async () => { const expectedResponse = "expectedResponse"; const encapsulatedIPv6Hostname = "[::1]"; mockResponse({ expectedResponse }); const response = await httpRequest({ hostname: encapsulatedIPv6Hostname, path }); expect(response.toString()).toStrictEqual(expectedResponse); }); }); describe("throws error", () => { const errorOnStatusCode = async (statusCode: number) => { it(`statusCode: ${statusCode}`, async () => { mockResponse({ statusCode, expectedResponse: "continue", }); await expect(httpRequest({ hostname, path })).rejects.toStrictEqual( Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode }) ); }); }; it("when request throws error", async () => { vi.mocked(request).mockImplementationOnce((() => { const request = Object.assign(new EventEmitter(), { destroy: vi.fn(), end: vi.fn(), }); setTimeout(() => { request.emit("error"); }, 50); return request; }) as any); await expect(httpRequest({ hostname, path })).rejects.toStrictEqual( new ProviderError("Unable to connect to instance metadata service") ); }); describe("when request returns with statusCode < 200", () => { [100, 101, 103].forEach(errorOnStatusCode); }); describe("when request returns with statusCode >= 300", () => { [300, 400, 500].forEach(errorOnStatusCode); }); }); it("timeout", async () => { const timeout = 1000; vi.mocked(request).mockImplementationOnce((() => { const request = Object.assign(new EventEmitter(), { destroy: vi.fn(), end: vi.fn(), }); const response = new EventEmitter() as any; response.statusCode = 200; setTimeout(() => { request.emit("timeout"); }, 50); return request; }) as any); await expect(httpRequest({ hostname, path, timeout })).rejects.toStrictEqual( new ProviderError("TimeoutError from instance metadata service") ); }); }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/httpRequest.ts ================================================ import { request, type IncomingMessage, type RequestOptions } from "node:http"; import { ProviderError } from "@smithy/core/config"; /** * @internal */ export function httpRequest(options: RequestOptions): Promise { return new Promise((resolve, reject) => { const req = request({ method: "GET", ...options, // Node.js http module doesn't accept hostname with square brackets // Refs: https://github.com/nodejs/node/issues/39738 hostname: options.hostname?.replace(/^\[(.+)\]$/, "$1"), }); req.on("error", (err) => { reject(Object.assign(new ProviderError("Unable to connect to instance metadata service"), err)); req.destroy(); }); req.on("timeout", () => { reject(new ProviderError("TimeoutError from instance metadata service")); req.destroy(); }); req.on("response", (res: IncomingMessage) => { const { statusCode = 400 } = res; if (statusCode < 200 || 300 <= statusCode) { reject( Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode }) ); req.destroy(); } const chunks: Array = []; res.on("data", (chunk) => { chunks.push(chunk as Buffer); }); res.on("end", () => { resolve(Buffer.concat(chunks)); req.destroy(); }); }); req.end(); }); } ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/index.ts ================================================ /** * @internal */ export * from "./ImdsCredentials"; /** * @internal */ export * from "./RemoteProviderInit"; ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/retry.spec.ts ================================================ import { afterEach, describe, expect, test as it, vi } from "vitest"; import { retry } from "./retry"; describe("retry", () => { const successMsg = "Success"; const errorMsg = "Expected failure"; const retries = 10; const retryable = vi.fn().mockRejectedValue(errorMsg); afterEach(() => { vi.clearAllMocks(); }); it("should retry a function the specified number of times", async () => { await expect(retry(retryable, retries)).rejects.toStrictEqual(errorMsg); expect(retryable).toHaveBeenCalledTimes(retries + 1); }); it("should not retry if successful", async () => { retryable.mockResolvedValueOnce(successMsg); await expect(retry(retryable, retries)).resolves.toStrictEqual(successMsg); expect(retryable).toHaveBeenCalledTimes(1); }); it("should stop retrying after the first successful invocation", async () => { const successfulInvocationIndex = 3; for (let i = 1; i < successfulInvocationIndex; i++) { retryable.mockRejectedValueOnce(errorMsg); } retryable.mockResolvedValueOnce(successMsg); await expect(retry(retryable, retries)).resolves.toStrictEqual(successMsg); expect(retryable).toHaveBeenCalledTimes(successfulInvocationIndex); }); }); ================================================ FILE: packages/credential-provider-imds/src/remoteProvider/retry.ts ================================================ /** * @internal */ export interface RetryableProvider { (): Promise; } /** * @internal */ export const retry = (toRetry: RetryableProvider, maxRetries: number): Promise => { let promise = toRetry(); for (let i = 0; i < maxRetries; i++) { promise = promise.catch(toRetry); } return promise; }; ================================================ FILE: packages/credential-provider-imds/src/types.ts ================================================ import type { AwsCredentialIdentity } from "@smithy/types"; /** * @internal */ export interface InstanceMetadataCredentials extends AwsCredentialIdentity { readonly originalExpiration?: Date; } ================================================ FILE: packages/credential-provider-imds/src/utils/getExtendedInstanceMetadataCredentials.spec.ts ================================================ import type { Logger } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getExtendedInstanceMetadataCredentials } from "./getExtendedInstanceMetadataCredentials"; describe("getExtendedInstanceMetadataCredentials()", () => { let nowMock: any; const staticSecret = { accessKeyId: "key", secretAccessKey: "secret", }; const logger: Logger = { warn: vi.fn(), } as any; beforeEach(() => { vi.spyOn(global.Math, "random"); nowMock = vi.spyOn(Date, "now").mockReturnValueOnce(new Date("2022-02-22T00:00:00Z").getTime()); }); afterEach(() => { nowMock.mockRestore(); }); it("should extend the expiration random time(5~10 mins) from now", () => { const anyDate: Date = "any date" as unknown as Date; (Math.random as any).mockReturnValue(0.5); expect(getExtendedInstanceMetadataCredentials({ ...staticSecret, expiration: anyDate }, logger)).toEqual({ ...staticSecret, originalExpiration: anyDate, expiration: new Date("2022-02-22T00:07:30Z"), }); expect(Math.random).toBeCalledTimes(1); }); it("should print warning message when extending the credentials", () => { const anyDate: Date = "any date" as unknown as Date; getExtendedInstanceMetadataCredentials({ ...staticSecret, expiration: anyDate }, logger); expect(logger.warn).toBeCalledWith(expect.stringContaining("Attempting credential expiration extension")); }); }); ================================================ FILE: packages/credential-provider-imds/src/utils/getExtendedInstanceMetadataCredentials.ts ================================================ import type { Logger } from "@smithy/types"; import type { InstanceMetadataCredentials } from "../types"; const STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60; const STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60; const STATIC_STABILITY_DOC_URL = "https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html"; /** * @internal */ export const getExtendedInstanceMetadataCredentials = ( credentials: InstanceMetadataCredentials, logger: Logger ): InstanceMetadataCredentials => { const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS + Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS); const newExpiration = new Date(Date.now() + refreshInterval * 1000); logger.warn( "Attempting credential expiration extension due to a credential service availability issue. A refresh of these " + `credentials will be attempted after ${new Date(newExpiration)}.\nFor more information, please visit: ` + STATIC_STABILITY_DOC_URL ); const originalExpiration = credentials.originalExpiration ?? credentials.expiration; return { ...credentials, ...(originalExpiration ? { originalExpiration } : {}), expiration: newExpiration, }; }; ================================================ FILE: packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.spec.ts ================================================ import { loadConfig } from "@smithy/core/config"; import { parseUrl } from "@smithy/core/protocols"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { Endpoint } from "../config/Endpoint"; import { ENDPOINT_CONFIG_OPTIONS } from "../config/EndpointConfigOptions"; import { EndpointMode } from "../config/EndpointMode"; import { ENDPOINT_MODE_CONFIG_OPTIONS } from "../config/EndpointModeConfigOptions"; import { getInstanceMetadataEndpoint } from "./getInstanceMetadataEndpoint"; vi.mock("@smithy/core/config"); vi.mock("@smithy/core/protocols"); describe(getInstanceMetadataEndpoint.name, () => { let mockURL: string; const mockEndpoint = { protocol: "http:", hostname: "localhost", port: 80, path: "" }; beforeEach(() => { vi.mocked(parseUrl).mockReturnValue(mockEndpoint); }); afterEach(() => { vi.clearAllMocks(); }); describe("when endpoint is defined", () => { afterEach(() => { expect(loadConfig).toHaveBeenCalledTimes(1); expect(loadConfig).toHaveBeenCalledWith(ENDPOINT_CONFIG_OPTIONS); expect(parseUrl).toHaveBeenCalledTimes(1); expect(parseUrl).toHaveBeenCalledWith(mockURL); }); it("throws error when endpoint is invalid", () => { mockURL = "invalid_endpoint"; const mockError = new Error(`Invalid endpoint: ${mockURL}`); vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(mockURL)); vi.mocked(parseUrl).mockImplementation(() => { throw mockError; }); return expect(getInstanceMetadataEndpoint()).rejects.toThrow(mockError); }); describe("returns host when endpoint is valid", () => { const mockProtocol = "http:"; const mockHostname = "127.0.0.1"; it("with port", async () => { const mockPort = 80; mockURL = `${mockProtocol}://${mockHostname}:${mockPort}`; vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(mockURL)); expect(await getInstanceMetadataEndpoint()).toStrictEqual(mockEndpoint); }); it("without port", async () => { mockURL = `${mockProtocol}://${mockHostname}`; vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(mockURL)); expect(await getInstanceMetadataEndpoint()).toStrictEqual(mockEndpoint); }); }); }); describe("when endpoint is not defined", () => { beforeEach(() => { vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(undefined)); }); afterEach(() => { expect(loadConfig).toHaveBeenCalledTimes(2); expect(loadConfig).toHaveBeenNthCalledWith(1, ENDPOINT_CONFIG_OPTIONS); expect(loadConfig).toHaveBeenNthCalledWith(2, ENDPOINT_MODE_CONFIG_OPTIONS); }); it.each([ [Endpoint.IPv4, EndpointMode.IPv4], [Endpoint.IPv6, EndpointMode.IPv6], ])("returns %s when endpointMode=%s", async (endpoint, endpointMode) => { vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(endpointMode)); expect(await getInstanceMetadataEndpoint()).toEqual(mockEndpoint); expect(parseUrl).toHaveBeenCalledTimes(1); expect(parseUrl).toHaveBeenCalledWith(endpoint); }); it(`throws Error when endpointMode is unsupported`, () => { const unsupportedEndpointMode = "unsupportedEndpointMode"; vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.resolve(unsupportedEndpointMode)); return expect(getInstanceMetadataEndpoint()).rejects.toThrowError( `Unsupported endpoint mode: ${unsupportedEndpointMode}.` + ` Select from ${Object.values(EndpointMode)}` ); }); it(`rethrows Error when reading endpointMode throws error`, () => { const error = new Error("error"); vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.reject(error)); return expect(getInstanceMetadataEndpoint()).rejects.toThrow(error); }); }); describe("when reading endpoint throws error", () => { it("rethrows error", () => { const error = new Error("error"); vi.mocked(loadConfig).mockReturnValueOnce(() => Promise.reject(error)); expect(getInstanceMetadataEndpoint()).rejects.toThrow(error); expect(loadConfig).toHaveBeenCalledTimes(1); expect(loadConfig).toHaveBeenCalledWith(ENDPOINT_CONFIG_OPTIONS); }); }); }); ================================================ FILE: packages/credential-provider-imds/src/utils/getInstanceMetadataEndpoint.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { loadConfig } from "@smithy/core/config"; import { parseUrl } from "@smithy/core/protocols"; import type { Endpoint } from "@smithy/types"; import { Endpoint as InstanceMetadataEndpoint } from "../config/Endpoint"; import { CONFIG_ENDPOINT_NAME, ENDPOINT_CONFIG_OPTIONS, ENV_ENDPOINT_NAME } from "../config/EndpointConfigOptions"; import { EndpointMode } from "../config/EndpointMode"; import { CONFIG_ENDPOINT_MODE_NAME, ENDPOINT_MODE_CONFIG_OPTIONS, ENV_ENDPOINT_MODE_NAME, } from "../config/EndpointModeConfigOptions"; /** * Returns the host to use for instance metadata service call. * * The host is read from endpoint which can be set either in * {@link ENV_ENDPOINT_NAME} environment variable or {@link CONFIG_ENDPOINT_NAME} * configuration property. * * If endpoint is not set, then endpoint mode is read either from * {@link ENV_ENDPOINT_MODE_NAME} environment variable or {@link CONFIG_ENDPOINT_MODE_NAME} * configuration property. If endpoint mode is not set, then default endpoint mode * {@link EndpointMode.IPv4} is used. * * If endpoint mode is set to {@link EndpointMode.IPv4}, then the host is {@link Endpoint.IPv4}. * If endpoint mode is set to {@link EndpointMode.IPv6}, then the host is {@link Endpoint.IPv6}. * * @returns Host to use for instance metadata service call. * * @internal */ export const getInstanceMetadataEndpoint = async (): Promise => parseUrl((await getFromEndpointConfig()) || (await getFromEndpointModeConfig())); const getFromEndpointConfig = async (): Promise => loadConfig(ENDPOINT_CONFIG_OPTIONS)(); const getFromEndpointModeConfig = async (): Promise => { const endpointMode = await loadConfig(ENDPOINT_MODE_CONFIG_OPTIONS)(); switch (endpointMode) { case EndpointMode.IPv4: return InstanceMetadataEndpoint.IPv4; case EndpointMode.IPv6: return InstanceMetadataEndpoint.IPv6; default: throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode)}`); } }; ================================================ FILE: packages/credential-provider-imds/src/utils/staticStabilityProvider.spec.ts ================================================ import type { Logger } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { getExtendedInstanceMetadataCredentials } from "./getExtendedInstanceMetadataCredentials"; import { staticStabilityProvider } from "./staticStabilityProvider"; vi.mock("./getExtendedInstanceMetadataCredentials"); describe("staticStabilityProvider", () => { const ONE_HOUR_IN_FUTURE = new Date(Date.now() + 60 * 60 * 1000); const mockCreds = { accessKeyId: "key", secretAccessKey: "secret", sessionToken: "settion", expiration: ONE_HOUR_IN_FUTURE, }; beforeEach(() => { vi.mocked(getExtendedInstanceMetadataCredentials).mockImplementation( (() => { let extensionCount = 0; return (input) => { extensionCount++; return { ...input, expiration: `Extending expiration count: ${extensionCount}`, } as any; }; })() ); vi.spyOn(global.console, "warn").mockImplementation(() => {}); }); afterEach(() => { vi.resetAllMocks(); }); it("should refresh credentials if provider is functional", async () => { const provider = vi.fn(); const stableProvider = staticStabilityProvider(provider); const repeat = 3; for (let i = 0; i < repeat; i++) { const newCreds = { ...mockCreds, accessKeyId: String(i + 1) }; provider.mockReset().mockResolvedValue(newCreds); expect(await stableProvider()).toEqual(newCreds); } }); it("should throw if cannot load credentials at 1st load", async () => { const provider = vi.fn().mockRejectedValue("Error"); try { await staticStabilityProvider(provider)(); fail("This provider should throw"); } catch (e) { expect(getExtendedInstanceMetadataCredentials).not.toBeCalled(); expect(provider).toBeCalledTimes(1); expect(e).toEqual("Error"); } }); it("should extend expired credentials if refresh fails", async () => { const provider = vi.fn().mockResolvedValueOnce(mockCreds).mockRejectedValue("Error"); const stableProvider = staticStabilityProvider(provider); expect(await stableProvider()).toEqual(mockCreds); const repeat = 3; for (let i = 0; i < repeat; i++) { const newCreds = await stableProvider(); expect(newCreds).toMatchObject({ ...mockCreds, expiration: expect.stringContaining(`count: ${i + 1}`) }); expect(console.warn).toHaveBeenLastCalledWith( expect.stringContaining("Credential renew failed:"), expect.anything() ); } expect(getExtendedInstanceMetadataCredentials).toBeCalledTimes(repeat); expect(console.warn).toBeCalledTimes(repeat); }); it("should extend expired credentials if loaded expired credentials", async () => { const ONE_HOUR_AGO = new Date(Date.now() - 60 * 60 * 1000); const provider = vi.fn().mockResolvedValue({ ...mockCreds, expiration: ONE_HOUR_AGO }); const stableProvider = staticStabilityProvider(provider); const repeat = 3; for (let i = 0; i < repeat; i++) { const newCreds = await stableProvider(); expect(newCreds).toMatchObject({ ...mockCreds, expiration: expect.stringContaining(`count: ${i + 1}`) }); } expect(getExtendedInstanceMetadataCredentials).toBeCalledTimes(repeat); expect(console.warn).not.toBeCalled(); }); it("should allow custom logger to print warning messages", async () => { const provider = vi.fn().mockResolvedValueOnce(mockCreds).mockRejectedValue("Error"); const logger = { warn: vi.fn() } as unknown as Logger; const stableProvider = staticStabilityProvider(provider, { logger }); expect(await stableProvider()).toEqual(mockCreds); // load initial creds await stableProvider(); expect(logger.warn).toBeCalledTimes(1); expect(console.warn).toBeCalledTimes(0); }); }); ================================================ FILE: packages/credential-provider-imds/src/utils/staticStabilityProvider.ts ================================================ import type { Logger, Provider } from "@smithy/types"; import type { InstanceMetadataCredentials } from "../types"; import { getExtendedInstanceMetadataCredentials } from "./getExtendedInstanceMetadataCredentials"; /** * IMDS credential supports static stability feature. When used, the expiration * of recently issued credentials is extended. The server side allows using * the recently expired credentials. This mitigates impact when clients using * refreshable credentials are unable to retrieve updates. * * @internal * @param provider Credential provider * @returns A credential provider that supports static stability */ export const staticStabilityProvider = ( provider: Provider, options: { logger?: Logger; } = {} ): Provider => { // Unlike normal SDK logger message, the key extension message must be transparent to users. // When customer doesn't supply a custom logger, we need to log the warnings to console. const logger = options?.logger || console; let pastCredentials: InstanceMetadataCredentials; return async () => { let credentials: InstanceMetadataCredentials; try { credentials = await provider(); if (credentials.expiration && credentials.expiration.getTime() < Date.now()) { credentials = getExtendedInstanceMetadataCredentials(credentials, logger); } } catch (e) { if (pastCredentials) { logger.warn("Credential renew failed: ", e); credentials = getExtendedInstanceMetadataCredentials(pastCredentials, logger); } else { throw e; } } pastCredentials = credentials; return credentials; }; }; ================================================ FILE: packages/credential-provider-imds/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/credential-provider-imds/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/credential-provider-imds/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/credential-provider-imds/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/eventstream-codec/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/eventstream-codec/CHANGELOG.md ================================================ # @smithy/eventstream-codec ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde - cad44fc: consolidate core/event-streams ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/eventstream-codec/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/eventstream-codec/package.json ================================================ { "name": "@smithy/eventstream-codec", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "premove": "4.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/eventstream-codec", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/eventstream-codec" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/eventstream-codec/scripts/buildTestVectorsFixture.js ================================================ const { Buffer } = require("buffer"); const { readdirSync, readFileSync, writeFileSync } = require("fs"); const { dirname, join } = require("path"); const HEADER_TYPES = ["boolean", "byte", "short", "integer", "long", "binary", "string", "timestamp", "uuid"]; const vectorsDir = join(dirname(__dirname), "test_vectors"); let vectors = "\n"; for (const dirName of ["positive", "negative"]) { const encodedVectorsDir = join(vectorsDir, "encoded", dirName); const decodedVectorsDir = join(vectorsDir, "decoded", dirName); for (const vectorName of readdirSync(encodedVectorsDir)) { vectors += ` ${vectorName}: { expectation: '${dirName === "positive" ? "success" : "failure"}', encoded: Uint8Array.from([${readFileSync(join(encodedVectorsDir, vectorName)) .map((byte) => byte.toString(10)) .join(", ")}]), `; if (dirName === "positive") { const decoded = JSON.parse(readFileSync(join(decodedVectorsDir, vectorName))); const headers = decoded.headers .map( (declaration) => ` '${declaration.name}': { type: '${HEADER_TYPES[declaration.type]}', value: ${headerValue(declaration.type, declaration.value)}, },` ) .join("\n"); vectors += ` decoded: { headers: { ${headers} }, body: ${writeBuffer(Buffer.from(decoded.payload, "base64"))}, }, `; } vectors += " },\n"; } } writeFileSync( join(dirname(__dirname), "src", "TestVectors.fixture.ts"), `import { TestVectors } from './vectorTypes.fixture'; import { Int64 } from './Int64'; export const vectors: TestVectors = {${vectors}}; ` ); function headerValue(type, vectorRepresentation) { switch (type) { case 0: return "true"; case 1: return "false"; case 5: return `Int64.fromNumber(${vectorRepresentation})`; case 6: return writeBuffer(Buffer.from(vectorRepresentation, "base64")); case 7: return `'${Buffer.from(vectorRepresentation, "base64").toString()}'`; case 8: return `new Date(${vectorRepresentation})`; case 9: const hex = Buffer.from(vectorRepresentation, "base64").toString("hex"); return `'${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}'`; default: return vectorRepresentation; } } function writeBuffer(buffer) { return `Uint8Array.from([${buffer.map((byte) => byte.toString(10)).join(", ")}])`; } ================================================ FILE: packages/eventstream-codec/src/index.ts ================================================ /** @deprecated Use @smithy/core/event-streams instead. */ export { EventStreamCodec, HeaderMarshaller, Int64, MessageDecoderStream, MessageEncoderStream, SmithyMessageDecoderStream, SmithyMessageEncoderStream, } from "@smithy/core/event-streams"; export type { BinaryHeaderValue, BooleanHeaderValue, ByteHeaderValue, IntegerHeaderValue, LongHeaderValue, Message, MessageDecoderStreamOptions, MessageEncoderStreamOptions, MessageHeaders, MessageHeaderValue, ShortHeaderValue, SmithyMessageDecoderStreamOptions, SmithyMessageEncoderStreamOptions, StringHeaderValue, TimestampHeaderValue, UuidHeaderValue, } from "@smithy/core/event-streams"; ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/negative/corrupted_header_len ================================================ Prelude checksum mismatch ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/negative/corrupted_headers ================================================ Message checksum mismatch ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/negative/corrupted_length ================================================ Prelude checksum mismatch ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/negative/corrupted_payload ================================================ Message checksum mismatch ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/positive/all_headers ================================================ { "total_length": 204, "headers_length": 175, "prelude_crc": 263087306, "headers": [ { "name": "event-type", "type": 4, "value": 40972 }, { "name": "content-type", "type": 7, "value": "YXBwbGljYXRpb24vanNvbg==" }, { "name": "bool false", "type": 1, "value": false }, { "name": "bool true", "type": 0, "value": true }, { "name": "byte", "type": 2, "value": -49 }, { "name": "byte buf", "type": 6, "value": "SSdtIGEgbGl0dGxlIHRlYXBvdCE=" }, { "name": "timestamp", "type": 8, "value": 8675309 }, { "name": "int16", "type": 3, "value": 42 }, { "name": "int64", "type": 5, "value": 42424242 }, { "name": "uuid", "type": 9, "value": "AQIDBAUGBwgJCgsMDQ4PEA==" } ], "payload": "eydmb28nOidiYXInfQ==", "message_crc": -1415188212 } ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/positive/empty_message ================================================ { "total_length": 16, "headers_length": 0, "prelude_crc": 96618731, "headers": [ ], "payload": "", "message_crc": 2107164927 } ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/positive/int32_header ================================================ { "total_length": 45, "headers_length": 16, "prelude_crc": 1103373496, "headers": [ { "name": "event-type", "type": 4, "value": 40972 } ], "payload": "eydmb28nOidiYXInfQ==", "message_crc": 921993376 } ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/positive/payload_no_headers ================================================ { "total_length": 29, "headers_length": 0, "prelude_crc": -44921766, "headers": [ ], "payload": "eydmb28nOidiYXInfQ==", "message_crc": -1016776394 } ================================================ FILE: packages/eventstream-codec/test_vectors/decoded/positive/payload_one_str_header ================================================ { "total_length": 61, "headers_length": 32, "prelude_crc": 134054806, "headers": [ { "name": "content-type", "type": 7, "value": "YXBwbGljYXRpb24vanNvbg==" } ], "payload": "eydmb28nOidiYXInfQ==", "message_crc": -1919153999 } ================================================ FILE: packages/eventstream-codec/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-codec/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-codec/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-browser/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/eventstream-serde-browser/CHANGELOG.md ================================================ # @smithy/eventstream-serde-browser ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - cad44fc: consolidate core/event-streams ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/eventstream-serde-browser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/eventstream-serde-browser/package.json ================================================ { "name": "@smithy/eventstream-serde-browser", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "premove": "4.0.0" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/eventstream-serde-browser", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/eventstream-serde-browser" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/eventstream-serde-browser/src/index.ts ================================================ import { readableStreamToIterable } from "@smithy/core/event-streams"; /** @deprecated Use @smithy/core/event-streams instead. */ export { EventStreamMarshaller, eventStreamSerdeProvider, iterableToReadableStream } from "@smithy/core/event-streams"; export type { EventStreamMarshallerOptions } from "@smithy/core/event-streams"; /** * @deprecated capitalization typo. */ export const readableStreamtoIterable = readableStreamToIterable; ================================================ FILE: packages/eventstream-serde-browser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-browser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["DOM"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-browser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-config-resolver/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/eventstream-serde-config-resolver/CHANGELOG.md ================================================ # @smithy/eventstream-serde-config-resolver ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - cad44fc: consolidate core/event-streams ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/eventstream-serde-config-resolver/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/eventstream-serde-config-resolver/package.json ================================================ { "name": "@smithy/eventstream-serde-config-resolver", "version": "4.4.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "premove": "4.0.0" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/eventstream-serde-config-resolver", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/eventstream-serde-config-resolver" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/eventstream-serde-config-resolver/src/index.ts ================================================ /** @deprecated Use @smithy/core/event-streams instead. */ export { resolveEventStreamSerdeConfig } from "@smithy/core/event-streams"; export type { EventStreamSerdeInputConfig, EventStreamSerdeResolvedConfig } from "@smithy/core/event-streams"; ================================================ FILE: packages/eventstream-serde-config-resolver/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-config-resolver/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-config-resolver/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-node/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/eventstream-serde-node/CHANGELOG.md ================================================ # @smithy/eventstream-serde-node ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - cad44fc: consolidate core/event-streams ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/eventstream-serde-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/eventstream-serde-node/package.json ================================================ { "name": "@smithy/eventstream-serde-node", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "premove": "4.0.0" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/eventstream-serde-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/eventstream-serde-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/eventstream-serde-node/src/index.ts ================================================ /** @deprecated Use @smithy/core/event-streams instead. */ export { EventStreamMarshaller, eventStreamSerdeProvider } from "@smithy/core/event-streams"; export type { EventStreamMarshallerOptions } from "@smithy/core/event-streams"; ================================================ FILE: packages/eventstream-serde-node/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-node/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-node/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-universal/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/eventstream-serde-universal/CHANGELOG.md ================================================ # @smithy/eventstream-serde-universal ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde - cad44fc: consolidate core/event-streams ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/eventstream-serde-universal/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/eventstream-serde-universal/package.json ================================================ { "name": "@smithy/eventstream-serde-universal", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "premove": "4.0.0" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/eventstream-serde-universal", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/eventstream-serde-universal" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/eventstream-serde-universal/src/index.ts ================================================ /** @deprecated Use @smithy/core/event-streams instead. */ export { UniversalEventStreamMarshaller as EventStreamMarshaller, universalEventStreamSerdeProvider as eventStreamSerdeProvider, } from "@smithy/core/event-streams"; export type { UniversalEventStreamMarshallerOptions as EventStreamMarshallerOptions } from "@smithy/core/event-streams"; ================================================ FILE: packages/eventstream-serde-universal/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-universal/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/eventstream-serde-universal/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/experimental-identity-and-auth/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/experimental-identity-and-auth/CHANGELOG.md ================================================ # Change Log ## 0.6.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 - @smithy/signature-v4@5.4.3 - @smithy/middleware-retry@4.6.3 ## 0.6.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 - @smithy/middleware-retry@4.6.2 - @smithy/signature-v4@5.4.2 ## 0.6.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 - @smithy/middleware-retry@4.6.1 - @smithy/signature-v4@5.4.1 ## 0.6.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 - @smithy/middleware-retry@4.6.0 - @smithy/signature-v4@5.4.0 ## 0.5.54 ### Patch Changes - @smithy/middleware-retry@4.5.7 ## 0.5.53 ### Patch Changes - @smithy/middleware-retry@4.5.6 ## 0.5.52 ### Patch Changes - @smithy/middleware-retry@4.5.5 - @smithy/middleware-endpoint@4.4.32 - @smithy/middleware-serde@4.2.20 ## 0.5.51 ### Patch Changes - @smithy/middleware-endpoint@4.4.31 - @smithy/middleware-retry@4.5.4 - @smithy/middleware-serde@4.2.19 ## 0.5.50 ### Patch Changes - @smithy/middleware-retry@4.5.3 ## 0.5.49 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/signature-v4@5.3.14 - @smithy/middleware-retry@4.5.2 - @smithy/middleware-endpoint@4.4.30 - @smithy/middleware-serde@4.2.18 - @smithy/protocol-http@5.3.14 - @smithy/util-middleware@4.2.14 ## 0.5.48 ### Patch Changes - @smithy/middleware-retry@4.5.1 ## 0.5.47 ### Patch Changes - Updated dependencies [cffd868] - @smithy/middleware-retry@4.5.0 - @smithy/types@4.14.0 - @smithy/middleware-endpoint@4.4.29 - @smithy/middleware-serde@4.2.17 - @smithy/protocol-http@5.3.13 - @smithy/signature-v4@5.3.13 - @smithy/util-middleware@4.2.13 ## 0.5.46 ### Patch Changes - @smithy/middleware-retry@4.4.46 ## 0.5.45 ### Patch Changes - @smithy/middleware-endpoint@4.4.28 - @smithy/middleware-serde@4.2.16 - @smithy/middleware-retry@4.4.45 ## 0.5.44 ### Patch Changes - Updated dependencies [b1f0dba] - @smithy/middleware-endpoint@4.4.27 - @smithy/middleware-retry@4.4.44 ## 0.5.43 ### Patch Changes - @smithy/middleware-endpoint@4.4.26 - @smithy/middleware-serde@4.2.15 - @smithy/middleware-retry@4.4.43 ## 0.5.42 ### Patch Changes - @smithy/middleware-endpoint@4.4.25 - @smithy/middleware-serde@4.2.14 - @smithy/middleware-retry@4.4.42 ## 0.5.41 ### Patch Changes - Updated dependencies [5340b11] - Updated dependencies [dfc743d] - @smithy/types@4.13.1 - @smithy/middleware-endpoint@4.4.24 - @smithy/middleware-serde@4.2.13 - @smithy/middleware-retry@4.4.41 - @smithy/protocol-http@5.3.12 - @smithy/signature-v4@5.3.12 - @smithy/util-middleware@4.2.12 ## 0.5.40 ### Patch Changes - @smithy/middleware-endpoint@4.4.23 - @smithy/middleware-retry@4.4.40 ## 0.5.39 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/middleware-endpoint@4.4.22 - @smithy/middleware-retry@4.4.39 - @smithy/middleware-serde@4.2.12 - @smithy/util-middleware@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/signature-v4@5.3.11 ## 0.5.38 ### Patch Changes - @smithy/middleware-endpoint@4.4.21 - @smithy/middleware-retry@4.4.38 ## 0.5.37 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/middleware-retry@4.4.37 - @smithy/middleware-endpoint@4.4.20 - @smithy/middleware-serde@4.2.11 - @smithy/protocol-http@5.3.10 - @smithy/signature-v4@5.3.10 - @smithy/util-middleware@4.2.10 ## 0.5.36 ### Patch Changes - @smithy/middleware-endpoint@4.4.19 - @smithy/middleware-retry@4.4.36 ## 0.5.35 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/middleware-endpoint@4.4.18 - @smithy/middleware-retry@4.4.35 - @smithy/middleware-serde@4.2.10 - @smithy/protocol-http@5.3.9 - @smithy/signature-v4@5.3.9 - @smithy/types@4.12.1 - @smithy/util-middleware@4.2.9 ## 0.5.34 ### Patch Changes - @smithy/middleware-endpoint@4.4.17 - @smithy/middleware-retry@4.4.34 ## 0.5.33 ### Patch Changes - @smithy/middleware-endpoint@4.4.16 - @smithy/middleware-retry@4.4.33 ## 0.5.32 ### Patch Changes - @smithy/middleware-endpoint@4.4.15 - @smithy/middleware-retry@4.4.32 ## 0.5.31 ### Patch Changes - @smithy/middleware-endpoint@4.4.14 - @smithy/middleware-retry@4.4.31 ## 0.5.30 ### Patch Changes - @smithy/middleware-endpoint@4.4.13 - @smithy/middleware-retry@4.4.30 ## 0.5.29 ### Patch Changes - @smithy/middleware-endpoint@4.4.12 - @smithy/middleware-retry@4.4.29 ## 0.5.28 ### Patch Changes - @smithy/middleware-retry@4.4.28 ## 0.5.27 ### Patch Changes - @smithy/middleware-endpoint@4.4.11 - @smithy/middleware-retry@4.4.27 ## 0.5.26 ### Patch Changes - @smithy/middleware-endpoint@4.4.10 - @smithy/middleware-retry@4.4.26 ## 0.5.25 ### Patch Changes - @smithy/middleware-endpoint@4.4.9 - @smithy/middleware-retry@4.4.25 ## 0.5.24 ### Patch Changes - @smithy/middleware-endpoint@4.4.8 - @smithy/middleware-retry@4.4.24 ## 0.5.23 ### Patch Changes - @smithy/middleware-endpoint@4.4.7 - @smithy/middleware-retry@4.4.23 ## 0.5.22 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/middleware-endpoint@4.4.6 - @smithy/middleware-retry@4.4.22 - @smithy/middleware-serde@4.2.9 - @smithy/protocol-http@5.3.8 - @smithy/signature-v4@5.3.8 - @smithy/util-middleware@4.2.8 ## 0.5.21 ### Patch Changes - @smithy/middleware-endpoint@4.4.5 - @smithy/middleware-retry@4.4.21 ## 0.5.20 ### Patch Changes - @smithy/middleware-endpoint@4.4.4 - @smithy/middleware-retry@4.4.20 ## 0.5.19 ### Patch Changes - @smithy/middleware-endpoint@4.4.3 - @smithy/middleware-retry@4.4.19 ## 0.5.18 ### Patch Changes - @smithy/middleware-endpoint@4.4.2 - @smithy/middleware-retry@4.4.18 ## 0.5.17 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/middleware-endpoint@4.4.1 - @smithy/middleware-retry@4.4.17 - @smithy/middleware-serde@4.2.8 - @smithy/protocol-http@5.3.7 - @smithy/signature-v4@5.3.7 - @smithy/util-middleware@4.2.7 ## 0.5.16 ### Patch Changes - Updated dependencies [76d7994] - @smithy/middleware-endpoint@4.4.0 - @smithy/middleware-retry@4.4.16 ## 0.5.15 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/middleware-retry@4.4.15 - @smithy/middleware-endpoint@4.3.15 - @smithy/middleware-serde@4.2.7 - @smithy/protocol-http@5.3.6 - @smithy/signature-v4@5.3.6 - @smithy/util-middleware@4.2.6 ## 0.5.14 ### Patch Changes - @smithy/middleware-endpoint@4.3.14 - @smithy/middleware-retry@4.4.14 ## 0.5.13 ### Patch Changes - @smithy/middleware-endpoint@4.3.13 - @smithy/middleware-retry@4.4.13 ## 0.5.12 ### Patch Changes - @smithy/middleware-endpoint@4.3.12 - @smithy/middleware-retry@4.4.12 ## 0.5.11 ### Patch Changes - Updated dependencies [e659a06] - @smithy/middleware-serde@4.2.6 - @smithy/middleware-endpoint@4.3.11 - @smithy/middleware-retry@4.4.11 ## 0.5.10 ### Patch Changes - @smithy/middleware-endpoint@4.3.10 - @smithy/middleware-retry@4.4.10 ## 0.5.9 ### Patch Changes - @smithy/middleware-endpoint@4.3.9 - @smithy/middleware-retry@4.4.9 ## 0.5.8 ### Patch Changes - @smithy/middleware-endpoint@4.3.8 - @smithy/middleware-retry@4.4.8 ## 0.5.7 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/middleware-endpoint@4.3.7 - @smithy/middleware-retry@4.4.7 - @smithy/middleware-serde@4.2.5 - @smithy/protocol-http@5.3.5 - @smithy/signature-v4@5.3.5 - @smithy/util-middleware@4.2.5 ## 0.5.6 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/middleware-endpoint@4.3.6 - @smithy/middleware-retry@4.4.6 - @smithy/middleware-serde@4.2.4 - @smithy/protocol-http@5.3.4 - @smithy/signature-v4@5.3.4 - @smithy/util-middleware@4.2.4 ## 0.5.5 ### Patch Changes - @smithy/middleware-endpoint@4.3.5 - @smithy/middleware-retry@4.4.5 ## 0.5.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/middleware-retry@4.4.4 - @smithy/middleware-endpoint@4.3.4 - @smithy/middleware-serde@4.2.3 - @smithy/protocol-http@5.3.3 - @smithy/signature-v4@5.3.3 - @smithy/util-middleware@4.2.3 ## 0.5.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/middleware-endpoint@4.3.3 - @smithy/middleware-retry@4.4.3 - @smithy/middleware-serde@4.2.2 - @smithy/protocol-http@5.3.2 - @smithy/signature-v4@5.3.2 - @smithy/util-middleware@4.2.2 ## 0.5.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/middleware-endpoint@4.3.2 - @smithy/middleware-retry@4.4.2 - @smithy/middleware-serde@4.2.1 - @smithy/protocol-http@5.3.1 - @smithy/signature-v4@5.3.1 - @smithy/util-middleware@4.2.1 ## 0.5.1 ### Patch Changes - @smithy/middleware-endpoint@4.3.1 - @smithy/middleware-retry@4.4.1 ## 0.5.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/middleware-endpoint@4.3.0 - @smithy/middleware-retry@4.4.0 - @smithy/middleware-serde@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/signature-v4@5.3.0 - @smithy/types@4.6.0 - @smithy/util-middleware@4.2.0 ## 0.4.6 ### Patch Changes - @smithy/middleware-endpoint@4.2.5 - @smithy/middleware-retry@4.3.1 ## 0.4.5 ### Patch Changes - Updated dependencies [97fe0d8] - @smithy/middleware-retry@4.3.0 - @smithy/middleware-endpoint@4.2.4 ## 0.4.4 ### Patch Changes - @smithy/middleware-endpoint@4.2.3 - @smithy/middleware-retry@4.2.4 ## 0.4.3 ### Patch Changes - @smithy/middleware-retry@4.2.3 ## 0.4.2 ### Patch Changes - @smithy/middleware-endpoint@4.2.2 - @smithy/middleware-retry@4.2.2 ## 0.4.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/middleware-endpoint@4.2.1 - @smithy/middleware-retry@4.2.1 - @smithy/middleware-serde@4.1.1 - @smithy/protocol-http@5.2.1 - @smithy/signature-v4@5.2.1 - @smithy/util-middleware@4.1.1 ## 0.4.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/middleware-endpoint@4.2.0 - @smithy/middleware-retry@4.2.0 - @smithy/middleware-serde@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/signature-v4@5.2.0 - @smithy/types@4.4.0 ## 0.3.68 ### Patch Changes - @smithy/middleware-endpoint@4.1.21 - @smithy/middleware-retry@4.1.22 ## 0.3.67 ### Patch Changes - @smithy/middleware-endpoint@4.1.20 - @smithy/middleware-retry@4.1.21 ## 0.3.66 ### Patch Changes - @smithy/middleware-endpoint@4.1.19 - @smithy/middleware-retry@4.1.20 ## 0.3.65 ### Patch Changes - Updated dependencies [fd00602] - Updated dependencies [64e033f] - @smithy/middleware-retry@4.1.19 - @smithy/types@4.3.2 - @smithy/middleware-endpoint@4.1.18 - @smithy/middleware-serde@4.0.9 - @smithy/protocol-http@5.1.3 - @smithy/signature-v4@5.1.3 - @smithy/util-middleware@4.0.5 ## 0.3.64 ### Patch Changes - @smithy/middleware-endpoint@4.1.17 - @smithy/middleware-retry@4.1.18 ## 0.3.63 ### Patch Changes - @smithy/middleware-endpoint@4.1.16 - @smithy/middleware-retry@4.1.17 ## 0.3.62 ### Patch Changes - Updated dependencies [bccb1b9] - @smithy/middleware-endpoint@4.1.15 - @smithy/middleware-retry@4.1.16 ## 0.3.61 ### Patch Changes - Updated dependencies [3ecb1f4] - @smithy/middleware-endpoint@4.1.14 - @smithy/middleware-retry@4.1.15 ## 0.3.60 ### Patch Changes - @smithy/middleware-endpoint@4.1.13 - @smithy/middleware-retry@4.1.14 ## 0.3.59 ### Patch Changes - Updated dependencies [22a286e] - @smithy/middleware-endpoint@4.1.12 - @smithy/middleware-retry@4.1.13 ## 0.3.58 ### Patch Changes - @smithy/middleware-endpoint@4.1.11 - @smithy/middleware-retry@4.1.12 ## 0.3.57 ### Patch Changes - @smithy/middleware-endpoint@4.1.10 - @smithy/middleware-retry@4.1.11 ## 0.3.56 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/middleware-endpoint@4.1.9 - @smithy/middleware-retry@4.1.10 - @smithy/middleware-serde@4.0.8 - @smithy/protocol-http@5.1.2 - @smithy/signature-v4@5.1.2 - @smithy/util-middleware@4.0.4 ## 0.3.55 ### Patch Changes - Updated dependencies [ae11e3a] - @smithy/middleware-serde@4.0.7 - @smithy/middleware-endpoint@4.1.8 - @smithy/middleware-retry@4.1.9 ## 0.3.54 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/middleware-endpoint@4.1.7 - @smithy/middleware-retry@4.1.8 - @smithy/middleware-serde@4.0.6 - @smithy/protocol-http@5.1.1 - @smithy/signature-v4@5.1.1 - @smithy/util-middleware@4.0.3 ## 0.3.53 ### Patch Changes - Updated dependencies [786dd3a] - @smithy/middleware-endpoint@4.1.6 - @smithy/middleware-serde@4.0.5 - @smithy/middleware-retry@4.1.7 ## 0.3.52 ### Patch Changes - Updated dependencies [103535a] - @smithy/middleware-serde@4.0.4 - @smithy/middleware-endpoint@4.1.5 - @smithy/middleware-retry@4.1.6 ## 0.3.51 ### Patch Changes - @smithy/middleware-endpoint@4.1.4 - @smithy/middleware-retry@4.1.5 ## 0.3.50 ### Patch Changes - @smithy/middleware-endpoint@4.1.3 - @smithy/middleware-retry@4.1.4 ## 0.3.49 ### Patch Changes - @smithy/middleware-endpoint@4.1.2 - @smithy/middleware-retry@4.1.3 ## 0.3.48 ### Patch Changes - @smithy/middleware-retry@4.1.2 ## 0.3.47 ### Patch Changes - @smithy/middleware-endpoint@4.1.1 - @smithy/middleware-retry@4.1.1 ## 0.3.46 ### Patch Changes - Updated dependencies [e2a8b41] - @smithy/signature-v4@5.1.0 ## 0.3.45 ### Patch Changes - Updated dependencies [e917e61] - @smithy/middleware-endpoint@4.1.0 - @smithy/middleware-retry@4.1.0 - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 - @smithy/signature-v4@5.0.2 - @smithy/middleware-serde@4.0.3 - @smithy/util-middleware@4.0.2 ## 0.3.44 ### Patch Changes - @smithy/middleware-endpoint@4.0.6 - @smithy/middleware-retry@4.0.7 ## 0.3.43 ### Patch Changes - @smithy/middleware-endpoint@4.0.5 - @smithy/middleware-retry@4.0.6 ## 0.3.42 ### Patch Changes - @smithy/middleware-endpoint@4.0.4 - @smithy/middleware-retry@4.0.5 ## 0.3.41 ### Patch Changes - Updated dependencies [f5d0bac] - @smithy/middleware-serde@4.0.2 - @smithy/middleware-endpoint@4.0.3 - @smithy/middleware-retry@4.0.4 ## 0.3.40 ### Patch Changes - @smithy/middleware-endpoint@4.0.2 - @smithy/middleware-retry@4.0.3 ## 0.3.39 ### Patch Changes - @smithy/middleware-retry@4.0.2 ## 0.3.38 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/middleware-endpoint@4.0.1 - @smithy/middleware-retry@4.0.1 - @smithy/middleware-serde@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/signature-v4@5.0.1 - @smithy/util-middleware@4.0.1 ## 0.3.37 ### Patch Changes - 20d99be: major version bump for dropping node16 support - Updated dependencies [20d99be] - @smithy/middleware-endpoint@4.0.0 - @smithy/middleware-retry@4.0.0 - @smithy/util-middleware@4.0.0 - @smithy/signature-v4@5.0.0 - @smithy/middleware-serde@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 ## 0.3.36 ### Patch Changes - @smithy/middleware-retry@3.0.34 - @smithy/middleware-endpoint@3.2.8 ## 0.3.35 ### Patch Changes - @smithy/middleware-retry@3.0.33 ## 0.3.34 ### Patch Changes - @smithy/middleware-endpoint@3.2.7 - @smithy/middleware-retry@3.0.32 ## 0.3.33 ### Patch Changes - Updated dependencies [e27d42d] - @smithy/middleware-endpoint@3.2.6 - @smithy/middleware-retry@3.0.31 ## 0.3.32 ### Patch Changes - @smithy/middleware-retry@3.0.30 ## 0.3.31 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/middleware-retry@3.0.29 - @smithy/middleware-endpoint@3.2.5 - @smithy/middleware-serde@3.0.11 - @smithy/protocol-http@4.1.8 - @smithy/signature-v4@4.2.4 - @smithy/util-middleware@3.0.11 ## 0.3.30 ### Patch Changes - @smithy/middleware-endpoint@3.2.4 - @smithy/middleware-retry@3.0.28 ## 0.3.29 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/middleware-endpoint@3.2.3 - @smithy/middleware-retry@3.0.27 - @smithy/middleware-serde@3.0.10 - @smithy/protocol-http@4.1.7 - @smithy/signature-v4@4.2.3 - @smithy/util-middleware@3.0.10 ## 0.3.28 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/middleware-endpoint@3.2.2 - @smithy/middleware-retry@3.0.26 - @smithy/middleware-serde@3.0.9 - @smithy/protocol-http@4.1.6 - @smithy/signature-v4@4.2.2 - @smithy/util-middleware@3.0.9 ## 0.3.27 ### Patch Changes - @smithy/middleware-endpoint@3.2.1 - @smithy/middleware-retry@3.0.25 ## 0.3.26 ### Patch Changes - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/middleware-endpoint@3.2.0 - @smithy/middleware-retry@3.0.24 - @smithy/middleware-serde@3.0.8 - @smithy/protocol-http@4.1.5 - @smithy/signature-v4@4.2.1 - @smithy/util-middleware@3.0.8 ## 0.3.25 ### Patch Changes - @smithy/middleware-retry@3.0.23 ## 0.3.24 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/signature-v4@4.2.0 - @smithy/types@3.5.0 - @smithy/middleware-endpoint@3.1.4 - @smithy/middleware-retry@3.0.22 - @smithy/middleware-serde@3.0.7 - @smithy/protocol-http@4.1.4 - @smithy/util-middleware@3.0.7 ## 0.3.23 ### Patch Changes - @smithy/middleware-retry@3.0.21 ## 0.3.22 ### Patch Changes - Updated dependencies [806cc7f] - @smithy/signature-v4@4.1.4 - @smithy/middleware-retry@3.0.20 ## 0.3.21 ### Patch Changes - @smithy/middleware-retry@3.0.19 ## 0.3.20 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/middleware-endpoint@3.1.3 - @smithy/middleware-retry@3.0.18 - @smithy/middleware-serde@3.0.6 - @smithy/protocol-http@4.1.3 - @smithy/signature-v4@4.1.3 - @smithy/util-middleware@3.0.6 ## 0.3.19 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/middleware-endpoint@3.1.2 - @smithy/middleware-retry@3.0.17 - @smithy/middleware-serde@3.0.5 - @smithy/protocol-http@4.1.2 - @smithy/signature-v4@4.1.2 - @smithy/util-middleware@3.0.5 ## 0.3.18 ### Patch Changes - Updated dependencies [c8c53ae] - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/middleware-endpoint@3.1.1 - @smithy/types@3.4.0 - @smithy/middleware-retry@3.0.16 - @smithy/middleware-serde@3.0.4 - @smithy/protocol-http@4.1.1 - @smithy/signature-v4@4.1.1 - @smithy/util-middleware@3.0.4 ## 0.3.17 ### Patch Changes - @smithy/middleware-retry@3.0.15 ## 0.3.16 ### Patch Changes - @smithy/middleware-retry@3.0.14 ## 0.3.15 ### Patch Changes - a40e1e9: set identity&auth SRA active by default ## 0.3.14 ### Patch Changes - @smithy/middleware-retry@3.0.13 ## 0.3.13 ### Patch Changes - 86862ea: switch to static HttpRequest clone method - Updated dependencies [4a40961] - Updated dependencies [86862ea] - @smithy/middleware-endpoint@3.1.0 - @smithy/protocol-http@4.1.0 - @smithy/signature-v4@4.1.0 - @smithy/middleware-retry@3.0.12 - @smithy/middleware-serde@3.0.3 ## 0.3.12 ### Patch Changes - @smithy/middleware-retry@3.0.11 ## 0.3.11 ### Patch Changes - Updated dependencies [796567d] - Updated dependencies [ae8bf5c] - @smithy/protocol-http@4.0.4 - @smithy/signature-v4@4.0.0 - @smithy/middleware-retry@3.0.10 - @smithy/middleware-serde@3.0.3 ## 0.3.10 ### Patch Changes - @smithy/middleware-endpoint@3.0.5 - @smithy/middleware-retry@3.0.9 ## 0.3.9 ### Patch Changes - @smithy/middleware-retry@3.0.8 ## 0.3.8 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/middleware-endpoint@3.0.4 - @smithy/middleware-retry@3.0.7 - @smithy/middleware-serde@3.0.3 - @smithy/protocol-http@4.0.3 - @smithy/signature-v4@3.1.2 - @smithy/util-middleware@3.0.3 ## 0.3.7 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/middleware-endpoint@3.0.3 - @smithy/middleware-retry@3.0.6 - @smithy/middleware-serde@3.0.2 - @smithy/protocol-http@4.0.2 - @smithy/signature-v4@3.1.1 - @smithy/util-middleware@3.0.2 ## 0.3.6 ### Patch Changes - @smithy/middleware-retry@3.0.5 ## 0.3.5 ### Patch Changes - Updated dependencies [3c23a83b] - @smithy/signature-v4@3.1.0 ## 0.3.4 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/middleware-endpoint@3.0.2 - @smithy/middleware-retry@3.0.4 - @smithy/middleware-serde@3.0.1 - @smithy/protocol-http@4.0.1 - @smithy/signature-v4@3.0.1 - @smithy/util-middleware@3.0.1 ## 0.3.3 ### Patch Changes - @smithy/middleware-retry@3.0.3 ## 0.3.2 ### Patch Changes - @smithy/middleware-endpoint@3.0.1 - @smithy/middleware-retry@3.0.2 ## 0.3.1 ### Patch Changes - @smithy/middleware-retry@3.0.1 ## 0.3.0 ### Minor Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/middleware-endpoint@3.0.0 - @smithy/middleware-retry@3.0.0 - @smithy/middleware-serde@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/protocol-http@4.0.0 - @smithy/signature-v4@3.0.0 ## 0.2.3 ### Patch Changes - Updated dependencies [2e090d70] - @smithy/signature-v4@2.3.0 ## 0.2.2 ### Patch Changes - Updated dependencies [9961e59d] - Updated dependencies [cc54b8d1] - @smithy/signature-v4@2.2.1 - @smithy/middleware-endpoint@2.5.1 - @smithy/middleware-retry@2.3.1 ## 0.2.1 ### Patch Changes - Updated dependencies [e03a10ac] - @smithy/middleware-retry@2.3.0 ## 0.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/middleware-endpoint@2.5.0 - @smithy/middleware-retry@2.2.0 - @smithy/middleware-serde@2.3.0 - @smithy/util-middleware@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/signature-v4@2.2.0 - @smithy/types@2.12.0 ## 0.1.7 ### Patch Changes - @smithy/middleware-retry@2.1.7 ## 0.1.6 ### Patch Changes - Updated dependencies [32e3f6ff] - @smithy/middleware-serde@2.2.1 - @smithy/middleware-endpoint@2.4.6 - @smithy/middleware-retry@2.1.6 ## 0.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - Updated dependencies [49640d6c] - @smithy/middleware-serde@2.2.0 - @smithy/types@2.11.0 - @smithy/middleware-endpoint@2.4.5 - @smithy/signature-v4@2.1.4 - @smithy/middleware-retry@2.1.5 - @smithy/protocol-http@3.2.2 - @smithy/util-middleware@2.1.4 ## 0.1.4 ### Patch Changes - @smithy/middleware-endpoint@2.4.4 - @smithy/middleware-retry@2.1.4 ## 0.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/middleware-retry@2.1.3 - @smithy/types@2.10.1 - @smithy/middleware-endpoint@2.4.3 - @smithy/middleware-serde@2.1.3 - @smithy/protocol-http@3.2.1 - @smithy/signature-v4@2.1.3 - @smithy/util-middleware@2.1.3 ## 0.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/middleware-endpoint@2.4.2 - @smithy/middleware-retry@2.1.2 - @smithy/middleware-serde@2.1.2 - @smithy/signature-v4@2.1.2 - @smithy/util-middleware@2.1.2 ## 0.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/middleware-endpoint@2.4.1 - @smithy/middleware-retry@2.1.1 - @smithy/middleware-serde@2.1.1 - @smithy/protocol-http@3.1.1 - @smithy/signature-v4@2.1.1 - @smithy/types@2.9.1 - @smithy/util-middleware@2.1.1 ## 0.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/middleware-endpoint@2.4.0 - @smithy/middleware-retry@2.1.0 - @smithy/middleware-serde@2.1.0 - @smithy/util-middleware@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/signature-v4@2.1.0 - @smithy/types@2.9.0 ## 0.0.31 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/middleware-endpoint@2.3.0 - @smithy/types@2.8.0 - @smithy/middleware-retry@2.0.26 - @smithy/middleware-serde@2.0.16 - @smithy/protocol-http@3.0.12 - @smithy/signature-v4@2.0.19 - @smithy/util-middleware@2.0.9 ## 0.0.30 ### Patch Changes - 164f3bbd: add missing dependency declarations - @smithy/middleware-retry@2.0.25 ## 0.0.29 ### Patch Changes - Updated dependencies [7a8023b2] - @smithy/signature-v4@2.0.18 ## 0.0.28 ### Patch Changes - @smithy/middleware-endpoint@2.2.3 - @smithy/middleware-retry@2.0.24 ## 0.0.27 ### Patch Changes - @smithy/middleware-retry@2.0.23 ## 0.0.26 ### Patch Changes - Updated dependencies [44f78bd9] - Updated dependencies [340634a5] - Updated dependencies [3ba4bd93] - @smithy/middleware-retry@2.0.22 - @smithy/types@2.7.0 - @smithy/signature-v4@2.0.17 - @smithy/middleware-endpoint@2.2.2 - @smithy/middleware-serde@2.0.15 - @smithy/protocol-http@3.0.11 ## 0.0.25 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/middleware-endpoint@2.2.1 - @smithy/middleware-retry@2.0.21 - @smithy/middleware-serde@2.0.14 - @smithy/protocol-http@3.0.10 - @smithy/signature-v4@2.0.16 ## 0.0.24 ### Patch Changes - 8044a814: feat(experimentalIdentityAndAuth): move `experimentalIdentityAndAuth` types and interfaces to `@smithy/types` and `@smithy/core` - Updated dependencies [8044a814] - Updated dependencies [9e0a5a74] - @smithy/middleware-endpoint@2.2.0 - @smithy/types@2.5.0 - @smithy/middleware-retry@2.0.20 - @smithy/middleware-serde@2.0.13 - @smithy/protocol-http@3.0.9 - @smithy/signature-v4@2.0.15 ## 0.0.23 ### Patch Changes - @smithy/signature-v4@2.0.14 ## 0.0.22 ### Patch Changes - Updated dependencies [5598a033] - @smithy/middleware-endpoint@2.1.5 - @smithy/signature-v4@2.0.13 ## 0.0.21 ### Patch Changes - e92dbafc: Fix typo in `HttpAuthScheme` not enabled message in `httpAuthSchemeMiddleware`. - @smithy/middleware-endpoint@2.1.4 - @smithy/middleware-retry@2.0.19 ## 0.0.20 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/middleware-endpoint@2.1.3 - @smithy/middleware-retry@2.0.18 - @smithy/middleware-serde@2.0.12 - @smithy/protocol-http@3.0.8 - @smithy/signature-v4@2.0.12 ## 0.0.19 ### Patch Changes - @smithy/middleware-endpoint@2.1.2 - @smithy/middleware-retry@2.0.17 ## 0.0.18 ### Patch Changes - 49f75b47: Add `@httpBearerAuth` integration tests. - 56bdadd4: Add strict check for `token` in `HttpBearerAuthSigner`. - 940aad53: Add `@httpApiKeyAuth` integration tests. - 3d5da269: Add strict check for `apiKey` in `HttpApiKeyAuthSigner`. - Updated dependencies [afaa68af] - @smithy/middleware-endpoint@2.1.1 ## 0.0.17 ### Patch Changes - e5ee17ad: Move `@smithy/util-test` to `devDependencies`. ## 0.0.16 ### Patch Changes - a0957ef1: Fix test script to use `jest`. - 58824d85: Remove generic parameter defaults. - 6c53a93b: Add different `httpAuthSchemeMiddleware` plugins depending on `@endpointRuleSet` - c8c9de77: Await `signer.sign()` in `httpSigningMiddleware` - d4df615a: Remove extra `# Change Log from `HttpApiKeyAuthSigner` - f38771a3: Scaffold integration tests. ## 0.0.15 ### Patch Changes - Updated dependencies [f64c4c2d] - @smithy/middleware-endpoint@2.1.0 ## 0.0.14 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/middleware-endpoint@2.0.11 - @smithy/middleware-retry@2.0.16 - @smithy/protocol-http@3.0.7 - @smithy/signature-v4@2.0.11 ## 0.0.13 ### Patch Changes - @smithy/middleware-retry@2.0.15 ## 0.0.12 ### Patch Changes - @smithy/middleware-retry@2.0.14 ## 0.0.11 ### Patch Changes - 890feeb1: Add aliases for `httpSigningMiddleware` ## 0.0.10 ### Patch Changes - 2503655d: Add `createEndpointRuleSetHttpAuthSchemeParametersProvider()` to generically create `HttpAuthSchemeParametersProvider`s for `@smithy.rules#endpointRuleSet` - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/middleware-endpoint@2.0.10 - @smithy/middleware-retry@2.0.13 - @smithy/protocol-http@3.0.6 - @smithy/signature-v4@2.0.10 ## 0.0.9 ### Patch Changes - 76e2ef3c: Allow `DefaultIdentityProviderConfig` to accept `undefined` in the constructor - 76e2ef3c: Add `httpAuthSchemeMiddleware` to select an auth scheme - 76e2ef3c: Add `memoizeIdentityProvider()` - c346d597: Add `createEndpointRuleSetHttpAuthSchemeProvider()` to generically create `HttpAuthSchemeProvider`s for `@smithy.rules#endpointRuleSet` ## 0.0.8 ### Patch Changes - 85448cbc: Update `HttpAuthSchemeParametersProvider` to take in `input` - 51b014c8: Add `httpSigningMiddleware` to sign a request based on a selected auth scheme - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/middleware-retry@2.0.12 - @smithy/protocol-http@3.0.5 - @smithy/signature-v4@2.0.9 ## 0.0.7 ### Patch Changes - 36d56a1d: Add additional `HttpAuthScheme` interfaces for auth scheme resolution - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/protocol-http@3.0.4 - @smithy/signature-v4@2.0.8 ## 0.0.6 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/protocol-http@3.0.3 - @smithy/signature-v4@2.0.7 ## 0.0.5 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 - @smithy/signature-v4@2.0.6 ## 0.0.4 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 - @smithy/signature-v4@2.0.6 ## 0.0.3 ### Patch Changes - c6251b7a: INTERNAL USE ONLY: Update `HttpAuthScheme` and `IdentityProviderConfig` interfaces - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 - @smithy/signature-v4@2.0.6 ## 0.0.2 ### Patch Changes - 019109d6: INTERNAL USE ONLY: Add `@aws.auth#sigv4` interfaces and classes - bae9b5de: INTERNAL USE ONLY: Add `@httpApiKeyAuth` interfaces and classes - 2fc7e78e: INTERNAL USE ONLY: Add `@httpBearerAuth` interfaces and classes ## 0.0.1 ### Patch Changes - 632e7d76: INTERNAL USE ONLY: Add experimental package for `experimentalIdentityAndAuth` types and implementations. All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ================================================ FILE: packages/experimental-identity-and-auth/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/experimental-identity-and-auth/README.md ================================================ # @smithy/experimental-identity-and-auth [![NPM version](https://img.shields.io/npm/v/@smithy/experimental-identity-and-auth/latest.svg)](https://www.npmjs.com/package/@smithy/experimental-identity-and-auth) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/experimental-identity-and-auth.svg)](https://www.npmjs.com/package/@smithy/experimental-identity-and-auth) ## Usage **WARNING: This package should NOT be consumed directly in any way.** This package is experimental for the development of `experimentalIdentityAndAuth`. See [experimental features](https://github.com/smithy-lang/smithy-typescript/blob/main/CONTRIBUTING.md#experimental-features) for more information. ================================================ FILE: packages/experimental-identity-and-auth/package.json ================================================ { "name": "@smithy/experimental-identity-and-auth", "version": "0.6.3", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline experimental-identity-and-auth", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run --passWithNoTests", "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts", "test:watch": "yarn g:vitest watch --passWithNoTests" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/middleware-retry": "workspace:^", "@smithy/signature-v4": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/experimental-identity-and-auth", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/experimental-identity-and-auth" }, "devDependencies": { "@smithy/util-test": "workspace:^", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/experimental-identity-and-auth/src/HttpAuthScheme.ts ================================================ import type { HandlerExecutionContext, Identity, IdentityProvider } from "@smithy/types"; import type { HttpSigner } from "./HttpSigner"; import type { IdentityProviderConfig } from "./IdentityProviderConfig"; /** * ID for {@link HttpAuthScheme} * @internal */ export type HttpAuthSchemeId = string; /** * Interface that defines an HttpAuthScheme * @internal */ export interface HttpAuthScheme { /** * ID for an HttpAuthScheme, typically the absolute shape ID of a Smithy auth trait. */ schemeId: HttpAuthSchemeId; /** * Gets the IdentityProvider corresponding to an HttpAuthScheme. */ identityProvider(config: IdentityProviderConfig): IdentityProvider | undefined; /** * HttpSigner corresponding to an HttpAuthScheme. */ signer: HttpSigner; } /** * Interface that defines the identity and signing properties when selecting * an HttpAuthScheme. * @internal */ export interface HttpAuthOption { schemeId: HttpAuthSchemeId; identityProperties?: Record; signingProperties?: Record; propertiesExtractor?: ( config: TConfig, context: TContext ) => { identityProperties?: Record; signingProperties?: Record; }; } /** * @internal */ export interface SelectedHttpAuthScheme { httpAuthOption: HttpAuthOption; identity: Identity; signer: HttpSigner; } ================================================ FILE: packages/experimental-identity-and-auth/src/HttpAuthSchemeProvider.ts ================================================ import type { HandlerExecutionContext } from "@smithy/types"; import type { HttpAuthOption } from "./HttpAuthScheme"; /** * @internal */ export interface HttpAuthSchemeParameters { operation?: string; } /** * @internal */ export interface HttpAuthSchemeProvider { (authParameters: TParameters): HttpAuthOption[]; } /** * @internal */ export interface HttpAuthSchemeParametersProvider< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { (config: TConfig, context: TContext, input: TInput): Promise; } ================================================ FILE: packages/experimental-identity-and-auth/src/HttpSigner.ts ================================================ import type { HttpRequest, Identity } from "@smithy/types"; /** * Interface to sign identity and signing properties. * @internal */ export interface HttpSigner { /** * Signs an HttpRequest with an identity and signing properties. * @param httpRequest request to sign * @param identity identity to sing the request with * @param signingProperties property bag for signing * @returns signed request in a promise */ sign(httpRequest: HttpRequest, identity: Identity, signingProperties: Record): Promise; } ================================================ FILE: packages/experimental-identity-and-auth/src/IdentityProviderConfig.ts ================================================ import type { Identity, IdentityProvider } from "@smithy/types"; import type { HttpAuthSchemeId } from "./HttpAuthScheme"; /** * Interface to get an IdentityProvider for a specified HttpAuthScheme * @internal */ export interface IdentityProviderConfig { /** * Get the IdentityProvider for a specified HttpAuthScheme. * @param schemeId schemeId of the HttpAuthScheme * @returns IdentityProvider or undefined if HttpAuthScheme is not found */ getIdentityProvider(schemeId: HttpAuthSchemeId): IdentityProvider | undefined; } /** * Default implementation of IdentityProviderConfig * @internal */ export class DefaultIdentityProviderConfig implements IdentityProviderConfig { private authSchemes: Map> = new Map(); /** * Creates an IdentityProviderConfig with a record of scheme IDs to identity providers. * * @param config scheme IDs and identity providers to configure */ constructor(config: Record | undefined>) { for (const [key, value] of Object.entries(config)) { if (value !== undefined) { this.authSchemes.set(key, value); } } } public getIdentityProvider(schemeId: HttpAuthSchemeId): IdentityProvider | undefined { return this.authSchemes.get(schemeId); } } ================================================ FILE: packages/experimental-identity-and-auth/src/SigV4Signer.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { SignatureV4 } from "@smithy/signature-v4"; import type { AwsCredentialIdentity, HttpRequest as IHttpRequest } from "@smithy/types"; import type { HttpSigner } from "./HttpSigner"; /** * @internal */ export class SigV4Signer implements HttpSigner { async sign( httpRequest: HttpRequest, identity: AwsCredentialIdentity, signingProperties: Record ): Promise { const clonedRequest = HttpRequest.clone(httpRequest); const signer = new SignatureV4({ applyChecksum: signingProperties.applyChecksum !== undefined ? signingProperties.applyChecksum : true, credentials: identity, region: signingProperties.region, service: signingProperties.name, sha256: signingProperties.sha256, uriEscapePath: signingProperties.uriEscapePath !== undefined ? signingProperties.uriEscapePath : true, }); return signer.sign(clonedRequest, { signingDate: new Date(), signableHeaders: signingProperties.signableHeaders, unsignableHeaders: signingProperties.unsignableHeaders, signingRegion: signingProperties.signingRegion, signingService: signingProperties.signingService, }); } } ================================================ FILE: packages/experimental-identity-and-auth/src/apiKeyIdentity.ts ================================================ import type { Identity, IdentityProvider } from "@smithy/types"; /** * @internal */ export interface ApiKeyIdentity extends Identity { readonly apiKey: string; } /** * @internal */ export type ApiKeyIdentityProvider = IdentityProvider; ================================================ FILE: packages/experimental-identity-and-auth/src/endpointRuleSet.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import { resolveParams, type EndpointParameterInstructions } from "@smithy/core/endpoints"; import type { EndpointParameters, EndpointV2, HandlerExecutionContext, Logger } from "@smithy/types"; import type { HttpAuthOption } from "./HttpAuthScheme"; import type { HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, HttpAuthSchemeProvider, } from "./HttpAuthSchemeProvider"; /** * @internal */ export interface EndpointRuleSetHttpAuthSchemeProvider< EndpointParametersT extends EndpointParameters, HttpAuthSchemeParametersT extends HttpAuthSchemeParameters, > extends HttpAuthSchemeProvider {} /** * @internal */ export interface DefaultEndpointResolver { (params: EndpointParametersT, context?: { logger?: Logger }): EndpointV2; } /** * @internal */ export const createEndpointRuleSetHttpAuthSchemeProvider = < EndpointParametersT extends EndpointParameters, HttpAuthSchemeParametersT extends HttpAuthSchemeParameters, >( defaultEndpointResolver: DefaultEndpointResolver, defaultHttpAuthSchemeResolver: HttpAuthSchemeProvider ): EndpointRuleSetHttpAuthSchemeProvider => { const endpointRuleSetHttpAuthSchemeProvider: EndpointRuleSetHttpAuthSchemeProvider< EndpointParametersT, HttpAuthSchemeParametersT > = (authParameters) => { const endpoint: EndpointV2 = defaultEndpointResolver(authParameters); const authSchemes = endpoint.properties?.authSchemes; if (!authSchemes) { return defaultHttpAuthSchemeResolver(authParameters); } const options: HttpAuthOption[] = []; for (const scheme of authSchemes) { const { name: resolvedName, properties = {}, ...rest } = scheme; const name = resolvedName.toLowerCase(); if (resolvedName !== name) { console.warn(`HttpAuthScheme has been normalized with lowercasing: \`${resolvedName}\` to \`${name}\``); } let schemeId; if (name === "sigv4") { schemeId = "aws.auth#sigv4"; } else if (name === "sigv4a") { schemeId = "aws.auth#sigv4a"; } else { throw new Error(`Unknown HttpAuthScheme found in \`@smithy.rules#endpointRuleSet\`: \`${name}\``); } options.push({ schemeId, signingProperties: { ...rest, ...properties, }, }); } return options; }; return endpointRuleSetHttpAuthSchemeProvider; }; /** * @internal */ export interface EndpointRuleSetSmithyContext { endpointRuleSet?: { getEndpointParameterInstructions?: () => EndpointParameterInstructions; }; } /** * @internal */ export interface EndpointRuleSetHttpAuthSchemeParametersProvider< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters & EndpointParameters, TInput extends object, > extends HttpAuthSchemeParametersProvider {} /** * @internal */ export const createEndpointRuleSetHttpAuthSchemeParametersProvider = < TConfig extends object, TContext extends HandlerExecutionContext, THttpAuthSchemeParameters extends HttpAuthSchemeParameters, TEndpointParameters extends EndpointParameters, TParameters extends THttpAuthSchemeParameters & TEndpointParameters, TInput extends object, >( defaultHttpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider< TConfig, TContext, THttpAuthSchemeParameters, TInput > ): EndpointRuleSetHttpAuthSchemeParametersProvider< TConfig, TContext, THttpAuthSchemeParameters & TEndpointParameters, TInput > => async (config: TConfig, context: TContext, input: TInput): Promise => { if (!input) { throw new Error(`Could not find \`input\` for \`defaultEndpointRuleSetHttpAuthSchemeParametersProvider\``); } const defaultParameters = await defaultHttpAuthSchemeParametersProvider(config, context, input); const instructionsFn = (getSmithyContext(context) as EndpointRuleSetSmithyContext)?.endpointRuleSet ?.getEndpointParameterInstructions; if (!instructionsFn) { throw new Error(`getEndpointParameterInstructions() is not defined on \`${context.commandName!}\``); } const endpointParameters = await resolveParams( input as Record, { getEndpointParameterInstructions: instructionsFn! }, config as Record ); return Object.assign(defaultParameters, endpointParameters) as TParameters; }; ================================================ FILE: packages/experimental-identity-and-auth/src/httpApiKeyAuth.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { HttpRequest as IHttpRequest } from "@smithy/types"; import type { HttpSigner } from "./HttpSigner"; import type { ApiKeyIdentity } from "./apiKeyIdentity"; /** * @internal */ export enum HttpApiKeyAuthLocation { HEADER = "header", QUERY = "query", } /** * @internal */ export class HttpApiKeyAuthSigner implements HttpSigner { public async sign( httpRequest: HttpRequest, identity: ApiKeyIdentity, signingProperties: Record ): Promise { if (!signingProperties) { throw new Error( "request could not be signed with `apiKey` since the `name` and `in` signer properties are missing" ); } if (!signingProperties.name) { throw new Error("request could not be signed with `apiKey` since the `name` signer property is missing"); } if (!signingProperties.in) { throw new Error("request could not be signed with `apiKey` since the `in` signer property is missing"); } if (!identity.apiKey) { throw new Error("request could not be signed with `apiKey` since the `apiKey` is not defined"); } const clonedRequest = HttpRequest.clone(httpRequest); if (signingProperties.in === HttpApiKeyAuthLocation.QUERY) { clonedRequest.query[signingProperties.name] = identity.apiKey; } else if (signingProperties.in === HttpApiKeyAuthLocation.HEADER) { clonedRequest.headers[signingProperties.name] = signingProperties.scheme ? `${signingProperties.scheme} ${identity.apiKey}` : identity.apiKey; } else { throw new Error( "request can only be signed with `apiKey` locations `query` or `header`, " + "but found: `" + signingProperties.in + "`" ); } return clonedRequest; } } ================================================ FILE: packages/experimental-identity-and-auth/src/httpBearerAuth.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { HttpRequest } from "@smithy/core/protocols"; import type { HttpRequest as IHttpRequest } from "@smithy/types"; import type { HttpSigner } from "./HttpSigner"; import type { TokenIdentity } from "./tokenIdentity"; /** * @internal */ export class HttpBearerAuthSigner implements HttpSigner { public async sign( httpRequest: HttpRequest, identity: TokenIdentity, signingProperties: Record ): Promise { const clonedRequest = HttpRequest.clone(httpRequest); if (!identity.token) { throw new Error("request could not be signed with `token` since the `token` is not defined"); } clonedRequest.headers["Authorization"] = `Bearer ${identity.token}`; return clonedRequest; } } ================================================ FILE: packages/experimental-identity-and-auth/src/index.ts ================================================ export * from "./HttpAuthScheme"; export * from "./HttpAuthSchemeProvider"; export * from "./HttpSigner"; export * from "./IdentityProviderConfig"; export * from "./SigV4Signer"; export * from "./apiKeyIdentity"; export * from "./endpointRuleSet"; export * from "./httpApiKeyAuth"; export * from "./httpBearerAuth"; export * from "./memoizeIdentityProvider"; export * from "./middleware-http-auth-scheme"; export * from "./middleware-http-signing"; export * from "./noAuth"; export * from "./tokenIdentity"; ================================================ FILE: packages/experimental-identity-and-auth/src/integration/httpApiKeyAuth.integ.spec.ts ================================================ import { HttpApiKeyAuthServiceClient, OnlyHttpApiKeyAuthCommand, OnlyHttpApiKeyAuthOptionalCommand, SameAsServiceCommand, } from "@smithy/identity-and-auth-http-api-key-auth-service"; import { describe, expect, test as it } from "vitest"; import { requireRequestsFrom } from "../../../../private/util-test/src/index"; describe("@httpApiKeyAuth integration tests", () => { // Match `HttpApiKeyAuthService` `@httpApiKeyAuth` trait const MOCK_API_KEY_NAME = "Authorization"; const MOCK_API_KEY_SCHEME = "ApiKey"; const MOCK_API_KEY = "APIKEY_123"; // Arbitrary mock endpoint (`requireRequestsFrom()` intercepts network requests) const MOCK_ENDPOINT = "https://foo.bar"; describe("Operation requires `@httpApiKeyAuth`", () => { it("Request is thrown when `apiKey` is not configured", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpApiKeyAuthCommand({}))).rejects.toThrow( "HttpAuthScheme `smithy.api#httpApiKeyAuth` did not have an IdentityProvider configured." ); }); it("Request is thrown when `apiKey` is configured incorrectly", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpApiKeyAuthCommand({}))).rejects.toThrow( "request could not be signed with `apiKey` since the `apiKey` is not defined" ); }); it("Request is thrown given configured `apiKey` identity provider throws", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpApiKeyAuthCommand({}))).rejects.toThrow( "IdentityProvider throws this error" ); }); it("Request is signed given configured `apiKey` identity provider", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => ({ apiKey: MOCK_API_KEY, }), }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new OnlyHttpApiKeyAuthCommand({})); }); it("Request is signed given configured `apiKey` identity", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: { apiKey: MOCK_API_KEY, }, }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new OnlyHttpApiKeyAuthCommand({})); }); }); describe("Operation has `@httpApiKeyAuth` and `@optionalAuth`", () => { it("Request is NOT thrown and NOT signed when `apiKey` is not configured", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: (value) => expect(value).toBeUndefined(), }, }); await client.send(new OnlyHttpApiKeyAuthOptionalCommand({})); }); it("Request is thrown when `apiKey` is configured incorrectly", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpApiKeyAuthOptionalCommand({}))).rejects.toThrow( "request could not be signed with `apiKey` since the `apiKey` is not defined" ); }); it("Request is thrown given configured `apiKey` identity provider throws", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpApiKeyAuthOptionalCommand({}))).rejects.toThrow( "IdentityProvider throws this error" ); }); it("Request is signed given configured `apiKey` identity provider", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => ({ apiKey: MOCK_API_KEY, }), }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new OnlyHttpApiKeyAuthOptionalCommand({})); }); it("Request is signed given configured `apiKey` identity", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: { apiKey: MOCK_API_KEY, }, }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new OnlyHttpApiKeyAuthOptionalCommand({})); }); }); describe("Service has `@httpApiKeyAuth`", () => { it("Request is thrown when `apiKey` is not configured", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow( "HttpAuthScheme `smithy.api#httpApiKeyAuth` did not have an IdentityProvider configured." ); }); it("Request is thrown when `apiKey` is configured incorrectly", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow( "request could not be signed with `apiKey` since the `apiKey` is not defined" ); }); it("Request is thrown given configured `apiKey` identity provider throws", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow("IdentityProvider throws this error"); }); it("Request is signed given configured `apiKey` identity provider", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: async () => ({ apiKey: MOCK_API_KEY, }), }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new SameAsServiceCommand({})); }); it("Request is signed given configured `apiKey` identity", async () => { const client = new HttpApiKeyAuthServiceClient({ endpoint: MOCK_ENDPOINT, apiKey: { apiKey: MOCK_API_KEY, }, }); requireRequestsFrom(client).toMatch({ headers: { [MOCK_API_KEY_NAME]: `${MOCK_API_KEY_SCHEME} ${MOCK_API_KEY}`, }, }); await client.send(new SameAsServiceCommand({})); }); }); }); ================================================ FILE: packages/experimental-identity-and-auth/src/integration/httpBearerAuth.integ.spec.ts ================================================ import { HttpBearerAuthServiceClient, OnlyHttpBearerAuthCommand, OnlyHttpBearerAuthOptionalCommand, SameAsServiceCommand, } from "@smithy/identity-and-auth-http-bearer-auth-service"; import { describe, expect, test as it } from "vitest"; import { requireRequestsFrom } from "../../../../private/util-test/src/index"; describe("@httpBearerAuth integration tests", () => { // Arbitrary mock token const MOCK_TOKEN = "TOKEN_123"; // Arbitrary mock endpoint (`requireRequestsFrom()` intercepts network requests) const MOCK_ENDPOINT = "https://foo.bar"; describe("Operation requires `@httpBearerAuth`", () => { it("Request is thrown when `token` is not configured", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpBearerAuthCommand({}))).rejects.toThrow( "HttpAuthScheme `smithy.api#httpBearerAuth` did not have an IdentityProvider configured." ); }); it("Request is thrown when `token` is configured incorrectly", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpBearerAuthCommand({}))).rejects.toThrow( "request could not be signed with `token` since the `token` is not defined" ); }); it("Request is thrown given configured `token` identity provider throws", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpBearerAuthCommand({}))).rejects.toThrow( "IdentityProvider throws this error" ); }); it("Request is signed given configured `token` identity provider", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => ({ token: MOCK_TOKEN, }), }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new OnlyHttpBearerAuthCommand({})); }); it("Request is signed given configured `token` identity", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: { token: MOCK_TOKEN, }, }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new OnlyHttpBearerAuthCommand({})); }); }); describe("Operation has `@httpBearerAuth` and `@optionalAuth`", () => { it("Request is NOT thrown and NOT signed when `token` is not configured", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({ headers: { Authorization: (value) => expect(value).toBeUndefined(), }, }); await client.send(new OnlyHttpBearerAuthOptionalCommand({})); }); it("Request is thrown when `token` is configured incorrectly", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpBearerAuthOptionalCommand({}))).rejects.toThrow( "request could not be signed with `token` since the `token` is not defined" ); }); it("Request is thrown given configured `token` identity provider throws", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new OnlyHttpBearerAuthOptionalCommand({}))).rejects.toThrow( "IdentityProvider throws this error" ); }); it("Request is signed given configured `token` identity provider", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => ({ token: MOCK_TOKEN, }), }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new OnlyHttpBearerAuthOptionalCommand({})); }); it("Request is signed given configured `token` identity", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: { token: MOCK_TOKEN, }, }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new OnlyHttpBearerAuthOptionalCommand({})); }); }); describe("Service has `@httpBearerAuth`", () => { it("Request is thrown when `token` is not configured", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow( "HttpAuthScheme `smithy.api#httpBearerAuth` did not have an IdentityProvider configured." ); }); it("Request is thrown when `token` is configured incorrectly", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: {} as any, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow( "request could not be signed with `token` since the `token` is not defined" ); }); it("Request is thrown given configured `token` identity provider throws", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => { throw new Error("IdentityProvider throws this error"); }, }); requireRequestsFrom(client).toMatch({}); await expect(client.send(new SameAsServiceCommand({}))).rejects.toThrow("IdentityProvider throws this error"); }); it("Request is signed given configured `token` identity provider", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: async () => ({ token: MOCK_TOKEN, }), }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new SameAsServiceCommand({})); }); it("Request is signed given configured `token` identity", async () => { const client = new HttpBearerAuthServiceClient({ endpoint: MOCK_ENDPOINT, token: { token: MOCK_TOKEN, }, }); requireRequestsFrom(client).toMatch({ headers: { Authorization: `Bearer ${MOCK_TOKEN}`, }, }); await client.send(new SameAsServiceCommand({})); }); }); }); ================================================ FILE: packages/experimental-identity-and-auth/src/memoizeIdentityProvider.ts ================================================ import type { Identity, IdentityProvider } from "@smithy/types"; /** * @internal */ export const createIsIdentityExpiredFunction = (expirationMs: number) => function isIdentityExpired(identity: Identity) { return doesIdentityRequireRefresh(identity) && identity.expiration!.getTime() - Date.now() < expirationMs; }; /** * This may need to be configurable in the future, but for now it is defaulted to 5min. * * @internal */ export const EXPIRATION_MS = 300_000; /** * @internal */ export const isIdentityExpired = createIsIdentityExpiredFunction(EXPIRATION_MS); /** * @internal */ export const doesIdentityRequireRefresh = (identity: Identity) => identity.expiration !== undefined; /** * @internal */ export interface MemoizedIdentityProvider { (options?: Record & { forceRefresh?: boolean }): Promise; } /** * @internal */ export const memoizeIdentityProvider = ( provider: IdentityT | IdentityProvider | undefined, isExpired: (resolved: Identity) => boolean, requiresRefresh: (resolved: Identity) => boolean ): MemoizedIdentityProvider | undefined => { if (provider === undefined) { return undefined; } const normalizedProvider: IdentityProvider = typeof provider !== "function" ? async () => Promise.resolve(provider) : provider; let resolved: IdentityT; let pending: Promise | undefined; let hasResult: boolean; let isConstant = false; // Wrapper over supplied provider with side effect to handle concurrent invocation. const coalesceProvider: MemoizedIdentityProvider = async (options) => { if (!pending) { pending = normalizedProvider(options); } try { resolved = await pending; hasResult = true; isConstant = false; } finally { pending = undefined; } return resolved; }; if (isExpired === undefined) { // This is a static memoization; no need to incorporate refreshing unless using forceRefresh; return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(options); } return resolved; }; } return async (options) => { if (!hasResult || options?.forceRefresh) { resolved = await coalesceProvider(options); } if (isConstant) { return resolved; } if (!requiresRefresh(resolved)) { isConstant = true; return resolved; } if (isExpired(resolved)) { await coalesceProvider(options); return resolved; } return resolved; }; }; ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-auth-scheme/getHttpAuthSchemeEndpointRuleSetPlugin.ts ================================================ import { endpointMiddlewareOptions } from "@smithy/core/endpoints"; import type { HandlerExecutionContext, Pluggable, RelativeMiddlewareOptions, SerializeHandlerOptions, } from "@smithy/types"; import type { HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider } from "../HttpAuthSchemeProvider"; import type { IdentityProviderConfig } from "../IdentityProviderConfig"; import { httpAuthSchemeMiddleware, type PreviouslyResolved } from "./httpAuthSchemeMiddleware"; /** * @internal */ export const httpAuthSchemeEndpointRuleSetMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = { step: "serialize", tags: ["HTTP_AUTH_SCHEME"], name: "httpAuthSchemeMiddleware", override: true, relation: "before", toMiddleware: endpointMiddlewareOptions.name!, }; /** * @internal */ interface HttpAuthSchemeEndpointRuleSetPluginOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ export const getHttpAuthSchemeEndpointRuleSetPlugin = < TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, >( config: TConfig & PreviouslyResolved, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }: HttpAuthSchemeEndpointRuleSetPluginOptions ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( httpAuthSchemeMiddleware(config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }), httpAuthSchemeEndpointRuleSetMiddlewareOptions ); }, }); ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-auth-scheme/getHttpAuthSchemePlugin.ts ================================================ import { serializerMiddlewareOption } from "@smithy/core/serde"; import type { HandlerExecutionContext, Pluggable, RelativeMiddlewareOptions, SerializeHandlerOptions, } from "@smithy/types"; import type { HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider } from "../HttpAuthSchemeProvider"; import type { IdentityProviderConfig } from "../IdentityProviderConfig"; import { httpAuthSchemeMiddleware, type PreviouslyResolved } from "./httpAuthSchemeMiddleware"; /** * @internal */ export const httpAuthSchemeMiddlewareOptions: SerializeHandlerOptions & RelativeMiddlewareOptions = { step: "serialize", tags: ["HTTP_AUTH_SCHEME"], name: "httpAuthSchemeMiddleware", override: true, relation: "before", toMiddleware: serializerMiddlewareOption.name!, }; /** * @internal */ interface HttpAuthSchemePluginOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ export const getHttpAuthSchemePlugin = < TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, >( config: TConfig & PreviouslyResolved, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }: HttpAuthSchemePluginOptions ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( httpAuthSchemeMiddleware(config, { httpAuthSchemeParametersProvider, identityProviderConfigProvider, }), httpAuthSchemeMiddlewareOptions ); }, }); ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-auth-scheme/httpAuthSchemeMiddleware.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import type { HandlerExecutionContext, SMITHY_CONTEXT_KEY, SerializeHandler, SerializeHandlerArguments, SerializeHandlerOutput, SerializeMiddleware, } from "@smithy/types"; import type { HttpAuthScheme, HttpAuthSchemeId, SelectedHttpAuthScheme } from "../HttpAuthScheme"; import type { HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, HttpAuthSchemeProvider, } from "../HttpAuthSchemeProvider"; import type { IdentityProviderConfig } from "../IdentityProviderConfig"; /** * @internal */ export interface PreviouslyResolved { httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: HttpAuthSchemeProvider; } /** * @internal */ interface HttpAuthSchemeMiddlewareOptions< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { httpAuthSchemeParametersProvider: HttpAuthSchemeParametersProvider; identityProviderConfigProvider: (config: TConfig) => Promise; } /** * @internal */ interface HttpAuthSchemeMiddlewareSmithyContext extends Record { selectedHttpAuthScheme?: SelectedHttpAuthScheme; } /** * @internal */ interface HttpAuthSchemeMiddlewareHandlerExecutionContext extends HandlerExecutionContext { [SMITHY_CONTEXT_KEY]?: HttpAuthSchemeMiddlewareSmithyContext; } /** * Later HttpAuthSchemes with the same HttpAuthSchemeId will overwrite previous ones. * * @internal */ function convertHttpAuthSchemesToMap(httpAuthSchemes: HttpAuthScheme[]): Map { const map = new Map(); for (const scheme of httpAuthSchemes) { map.set(scheme.schemeId, scheme); } return map; } /** * @internal */ export const httpAuthSchemeMiddleware = < TInput extends object, Output extends object, TConfig extends object, TContext extends HttpAuthSchemeMiddlewareHandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, >( config: TConfig & PreviouslyResolved, mwOptions: HttpAuthSchemeMiddlewareOptions ): SerializeMiddleware => ( next: SerializeHandler, context: HttpAuthSchemeMiddlewareHandlerExecutionContext ): SerializeHandler => async (args: SerializeHandlerArguments): Promise> => { const options = config.httpAuthSchemeProvider( await mwOptions.httpAuthSchemeParametersProvider(config, context as TContext, args.input) ); const authSchemes = convertHttpAuthSchemesToMap(config.httpAuthSchemes); const smithyContext: HttpAuthSchemeMiddlewareSmithyContext = getSmithyContext(context); const failureReasons = []; for (const option of options) { const scheme = authSchemes.get(option.schemeId); if (!scheme) { failureReasons.push(`HttpAuthScheme \`${option.schemeId}\` was not enabled for this service.`); continue; } const identityProvider = scheme.identityProvider(await mwOptions.identityProviderConfigProvider(config)); if (!identityProvider) { failureReasons.push(`HttpAuthScheme \`${option.schemeId}\` did not have an IdentityProvider configured.`); continue; } const { identityProperties = {}, signingProperties = {} } = option.propertiesExtractor?.(config, context) || {}; option.identityProperties = Object.assign(option.identityProperties || {}, identityProperties); option.signingProperties = Object.assign(option.signingProperties || {}, signingProperties); smithyContext.selectedHttpAuthScheme = { httpAuthOption: option, identity: await identityProvider(option.identityProperties), signer: scheme.signer, }; break; } if (!smithyContext.selectedHttpAuthScheme) { throw new Error(failureReasons.join("\n")); } return next(args); }; ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-auth-scheme/index.ts ================================================ export * from "./httpAuthSchemeMiddleware"; export * from "./getHttpAuthSchemeEndpointRuleSetPlugin"; export * from "./getHttpAuthSchemePlugin"; ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-signing/getHttpSigningMiddleware.ts ================================================ import { retryMiddlewareOptions } from "@smithy/core/retry"; import type { FinalizeRequestHandlerOptions, Pluggable, RelativeMiddlewareOptions } from "@smithy/types"; import { httpSigningMiddleware } from "./httpSigningMiddleware"; /** * @internal */ export const httpSigningMiddlewareOptions: FinalizeRequestHandlerOptions & RelativeMiddlewareOptions = { step: "finalizeRequest", tags: ["HTTP_SIGNING"], name: "httpSigningMiddleware", aliases: ["apiKeyMiddleware", "tokenMiddleware", "awsAuthMiddleware"], override: true, relation: "after", toMiddleware: retryMiddlewareOptions.name!, }; /** * @internal */ export const getHttpSigningPlugin = ( config: object ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo(httpSigningMiddleware(config), httpSigningMiddlewareOptions); }, }); ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-signing/httpSigningMiddleware.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import { getSmithyContext } from "@smithy/core/client"; import { HttpRequest } from "@smithy/core/protocols"; import type { FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, FinalizeRequestMiddleware, HandlerExecutionContext, SMITHY_CONTEXT_KEY, } from "@smithy/types"; import type { SelectedHttpAuthScheme } from "../HttpAuthScheme"; /** * @internal */ interface HttpSigningMiddlewareSmithyContext extends Record { selectedHttpAuthScheme?: SelectedHttpAuthScheme; } /** * @internal */ interface HttpSigningMiddlewareHandlerExecutionContext extends HandlerExecutionContext { [SMITHY_CONTEXT_KEY]?: HttpSigningMiddlewareSmithyContext; } /** * @internal */ export const httpSigningMiddleware = (config: object): FinalizeRequestMiddleware => ( next: FinalizeHandler, context: HttpSigningMiddlewareHandlerExecutionContext ): FinalizeHandler => async (args: FinalizeHandlerArguments): Promise> => { if (!HttpRequest.isInstance(args.request)) { return next(args); } const smithyContext: HttpSigningMiddlewareSmithyContext = getSmithyContext(context); const scheme = smithyContext.selectedHttpAuthScheme; if (!scheme) { throw new Error(`No HttpAuthScheme was selected: unable to sign request`); } const { httpAuthOption: { signingProperties }, identity, signer, } = scheme; return next({ ...args, request: await signer.sign(args.request, identity, signingProperties || {}), }); }; ================================================ FILE: packages/experimental-identity-and-auth/src/middleware-http-signing/index.ts ================================================ export * from "./httpSigningMiddleware"; export * from "./getHttpSigningMiddleware"; ================================================ FILE: packages/experimental-identity-and-auth/src/noAuth.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { HttpRequest, Identity } from "@smithy/types"; import type { HttpSigner } from "./HttpSigner"; /** * Signer for the synthetic @smithy.api#noAuth auth scheme. * @internal */ export class NoAuthSigner implements HttpSigner { async sign( httpRequest: HttpRequest, identity: Identity, signingProperties: Record ): Promise { return httpRequest; } } ================================================ FILE: packages/experimental-identity-and-auth/src/tokenIdentity.ts ================================================ import type { Identity, IdentityProvider } from "@smithy/types"; /** * @internal */ export interface TokenIdentity extends Identity { /** * The literal token string */ readonly token: string; } /** * @internal */ export type TokenIdentityProvider = IdentityProvider; ================================================ FILE: packages/experimental-identity-and-auth/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/experimental-identity-and-auth/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/experimental-identity-and-auth/tsconfig.test.json ================================================ { "compilerOptions": { "baseUrl": ".", "rootDir": "src", "noEmit": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"], "exclude": [] } ================================================ FILE: packages/experimental-identity-and-auth/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/experimental-identity-and-auth/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/experimental-identity-and-auth/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/fetch-http-handler/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/fetch-http-handler/CHANGELOG.md ================================================ # Change Log ## 5.4.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 5.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 5.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 5.4.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 5.3.17 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/protocol-http@5.3.14 - @smithy/querystring-builder@4.2.14 ## 5.3.16 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 - @smithy/querystring-builder@4.2.13 ## 5.3.15 ### Patch Changes - dab22f1: fix: do not return caller's Error directly from buildAbortError Always create a new mutable Error when the abort reason is an Error, preserving the original via `.cause`. Fixes TypeError when retry middleware tries to set `$metadata` on a frozen/sealed abort reason. ## 5.3.14 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 - @smithy/querystring-builder@4.2.12 ## 5.3.13 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/querystring-builder@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/util-base64@4.3.2 ## 5.3.12 ### Patch Changes - 9bf9ae2: fix: reject aborted requests with AbortSignal.reason instead of a generic Error ## 5.3.11 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/protocol-http@5.3.10 - @smithy/querystring-builder@4.2.10 ## 5.3.10 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/protocol-http@5.3.9 - @smithy/querystring-builder@4.2.9 - @smithy/types@4.12.1 - @smithy/util-base64@4.3.1 ## 5.3.9 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/protocol-http@5.3.8 - @smithy/querystring-builder@4.2.8 ## 5.3.8 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/protocol-http@5.3.7 - @smithy/querystring-builder@4.2.7 ## 5.3.7 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/protocol-http@5.3.6 - @smithy/querystring-builder@4.2.6 ## 5.3.6 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/protocol-http@5.3.5 - @smithy/querystring-builder@4.2.5 ## 5.3.5 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/protocol-http@5.3.4 - @smithy/querystring-builder@4.2.4 ## 5.3.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/protocol-http@5.3.3 - @smithy/querystring-builder@4.2.3 ## 5.3.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/protocol-http@5.3.2 - @smithy/querystring-builder@4.2.2 ## 5.3.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/protocol-http@5.3.1 - @smithy/querystring-builder@4.2.1 ## 5.3.1 ### Patch Changes - Updated dependencies [813c9a5] - @smithy/util-base64@4.3.0 ## 5.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/protocol-http@5.3.0 - @smithy/querystring-builder@4.2.0 - @smithy/types@4.6.0 - @smithy/util-base64@4.2.0 ## 5.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/protocol-http@5.2.1 - @smithy/querystring-builder@4.1.1 ## 5.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/querystring-builder@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/util-base64@4.1.0 - @smithy/types@4.4.0 ## 5.1.1 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/protocol-http@5.1.3 - @smithy/querystring-builder@4.0.5 ## 5.1.0 ### Minor Changes - c4e923a: per-request timeouts support ## 5.0.4 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/protocol-http@5.1.2 - @smithy/querystring-builder@4.0.4 ## 5.0.3 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/protocol-http@5.1.1 - @smithy/querystring-builder@4.0.3 ## 5.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 - @smithy/querystring-builder@4.0.2 ## 5.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/protocol-http@5.0.1 - @smithy/querystring-builder@4.0.1 ## 5.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-base64@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/querystring-builder@4.0.0 - @smithy/types@4.0.0 ## 4.1.3 ### Patch Changes - 1dd6ace: Add polyfill to collect Blob in react-native environments ## 4.1.2 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/protocol-http@4.1.8 - @smithy/querystring-builder@3.0.11 ## 4.1.1 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/protocol-http@4.1.7 - @smithy/querystring-builder@3.0.10 ## 4.1.0 ### Minor Changes - cd1929b: vitest compatibility ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/protocol-http@4.1.6 - @smithy/querystring-builder@3.0.9 ## 4.0.0 ### Major Changes - c257049: replace FileReader with Blob.arrayBuffer() where possible ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/protocol-http@4.1.5 - @smithy/querystring-builder@3.0.8 ## 3.2.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/protocol-http@4.1.4 - @smithy/querystring-builder@3.0.7 ## 3.2.8 ### Patch Changes - 0d5ab1d: Omit setting cache setting on request init when using default value ## 3.2.7 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/protocol-http@4.1.3 - @smithy/querystring-builder@3.0.6 ## 3.2.6 ### Patch Changes - cf9257e: add requestInit options to fetch - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/protocol-http@4.1.2 - @smithy/querystring-builder@3.0.5 ## 3.2.5 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/protocol-http@4.1.1 - @smithy/querystring-builder@3.0.4 ## 3.2.4 ### Patch Changes - 3ea4789: Initialize removeSignalEventListener as an empty function ## 3.2.3 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 3.2.2 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 3.2.1 ### Patch Changes - f31cc5f: remove abort signal event listeners after request completion ## 3.2.0 ### Minor Changes - 4784fb9: Adding support for setting the fetch API credentials mode ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/protocol-http@4.0.3 - @smithy/querystring-builder@3.0.3 ## 3.1.0 ### Minor Changes - c2a5595: use platform AbortController|AbortSignal implementations ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/protocol-http@4.0.2 - @smithy/querystring-builder@3.0.2 ## 3.0.3 ### Patch Changes - fedce37: move keepAliveSupport check to FetchHttpHandler constructor ## 3.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/protocol-http@4.0.1 - @smithy/querystring-builder@3.0.1 ## 3.0.1 ### Patch Changes - cc9fa00e: set duplex on fetch options ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - e76e736b: improve stream collection speed - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/querystring-builder@3.0.0 - @smithy/protocol-http@4.0.0 - @smithy/util-base64@3.0.0 ## 2.5.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/querystring-builder@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/util-base64@2.3.0 - @smithy/types@2.12.0 ## 2.4.5 ### Patch Changes - Updated dependencies [8e8f3513] - @smithy/util-base64@2.2.1 ## 2.4.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-base64@2.2.0 - @smithy/types@2.11.0 - @smithy/protocol-http@3.2.2 - @smithy/querystring-builder@2.1.4 ## 2.4.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/protocol-http@3.2.1 - @smithy/querystring-builder@2.1.3 ## 2.4.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/querystring-builder@2.1.2 ## 2.4.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/protocol-http@3.1.1 - @smithy/querystring-builder@2.1.1 - @smithy/types@2.9.1 - @smithy/util-base64@2.1.1 ## 2.4.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/querystring-builder@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/util-base64@2.1.0 - @smithy/types@2.9.0 ## 2.3.2 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/protocol-http@3.0.12 - @smithy/querystring-builder@2.0.16 ## 2.3.1 ### Patch Changes - e2e3f7d5: align ctor and static creation signatures for http handlers ## 2.3.0 ### Minor Changes - 340634a5: move default fetch and http handler ctor types to the types package ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/protocol-http@3.0.11 - @smithy/querystring-builder@2.0.15 ## 2.2.7 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/protocol-http@3.0.10 - @smithy/querystring-builder@2.0.14 ## 2.2.6 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/protocol-http@3.0.9 - @smithy/querystring-builder@2.0.13 ## 2.2.5 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-base64@2.0.1 ## 2.2.4 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/protocol-http@3.0.8 - @smithy/querystring-builder@2.0.12 ## 2.2.3 ### Patch Changes - 34b7f7b6: set keepalive default to false in fetch handler ## 2.2.2 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/protocol-http@3.0.7 - @smithy/querystring-builder@2.0.11 ## 2.2.1 ### Patch Changes - b411ffd1: use valid dummy URL ## 2.2.0 ### Minor Changes - 4528c37d: add fetch http handler keepAlive option ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/protocol-http@3.0.6 - @smithy/querystring-builder@2.0.10 ## 2.1.5 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/protocol-http@3.0.5 - @smithy/querystring-builder@2.0.9 ## 2.1.4 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/protocol-http@3.0.4 - @smithy/querystring-builder@2.0.8 ## 2.1.3 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/protocol-http@3.0.3 - @smithy/querystring-builder@2.0.7 ## 2.1.2 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 2.1.1 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 2.1.0 ### Minor Changes - a03026e3: Add http client component to runtime extension ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 - @smithy/querystring-builder@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/protocol-http@2.0.5 - @smithy/querystring-builder@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/protocol-http@2.0.4 - @smithy/querystring-builder@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/protocol-http@2.0.3 - @smithy/querystring-builder@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/protocol-http@2.0.2 - @smithy/querystring-builder@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/protocol-http@2.0.1 - @smithy/querystring-builder@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/protocol-http@2.0.0 - @smithy/querystring-builder@2.0.0 - @smithy/util-base64@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/protocol-http@1.2.0 - @smithy/querystring-builder@1.1.0 - @smithy/types@1.2.0 - @smithy/util-base64@1.1.0 ## 1.0.3 ### Patch Changes - 99d00e98: Bump webpack to 5.76.0 - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/protocol-http@1.1.2 - @smithy/querystring-builder@1.0.3 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/querystring-builder@1.0.2 - @smithy/protocol-http@1.1.1 - @smithy/util-base64@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/querystring-builder@1.0.1 - @smithy/util-base64@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/fetch-http-handler](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/fetch-http-handler/CHANGELOG.md) for additional history. ================================================ FILE: packages/fetch-http-handler/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/fetch-http-handler/README.md ================================================ # @smithy/fetch-http-handler [![NPM version](https://img.shields.io/npm/v/@smithy/fetch-http-handler/latest.svg)](https://www.npmjs.com/package/@smithy/fetch-http-handler) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/fetch-http-handler.svg)](https://www.npmjs.com/package/@smithy/fetch-http-handler) This is the default `requestHandler` used for browser applications. Since Node.js introduced experimental Web Streams API in v16.5.0 and made it stable in v21.0.0, you can consider using `fetch-http-handler` in Node.js, although it's not recommended. For the Node.js default `requestHandler` implementation, see instead [`@smithy/node-http-handler`](https://www.npmjs.com/package/@smithy/node-http-handler). ================================================ FILE: packages/fetch-http-handler/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/fetch-http-handler/package.json ================================================ { "name": "@smithy/fetch-http-handler", "version": "5.4.3", "description": "Provides a way to make requests", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline fetch-http-handler", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run && yarn test:browser", "test:browser": "yarn g:vitest run -c vitest.config.browser.mts", "test:browser:watch": "yarn g:vitest watch -c vitest.config.browser.mts", "test:watch": "yarn g:vitest watch" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@smithy/abort-controller": "workspace:^", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/fetch-http-handler", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/fetch-http-handler" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/fetch-http-handler/src/create-request.ts ================================================ import type { AdditionalRequestParameters } from "./fetch-http-handler"; /** * For mocking/interception. * * @internal */ export function createRequest(url: string, requestOptions?: RequestInit & AdditionalRequestParameters) { return new Request(url, requestOptions); } ================================================ FILE: packages/fetch-http-handler/src/fetch-http-handler.browser.spec.ts ================================================ import { HttpRequest } from "@smithy/protocol-http"; import type { QueryParameterBag } from "@smithy/types"; import { afterEach, beforeAll, describe, expect, test as it, vi } from "vitest"; import { createRequest } from "./create-request"; import { FetchHttpHandler, keepAliveSupport } from "./fetch-http-handler"; vi.mock("./create-request", async () => { return { createRequest: vi.fn().mockImplementation((_url, options) => { const url = new URL(_url); return { protocol: url.protocol, hostname: url.hostname, ...options, } as any; }), }; }); vi.spyOn(global, "fetch").mockImplementation((async () => { return { headers: { entries() { return []; }, }, async blob() { return undefined; }, }; }) as any); (typeof Blob === "function" ? describe : describe.skip)(FetchHttpHandler.name, () => { interface MockHttpRequestOptions { method?: string; body?: any; query?: QueryParameterBag; fragment?: string; username?: string; password?: string; } const getMockHttpRequest = (options: MockHttpRequestOptions): HttpRequest => new HttpRequest({ hostname: "localhost", protocol: "http", ...options }); describe("fetch", () => { beforeAll(() => { keepAliveSupport.supported = true; }); afterEach(() => { vi.clearAllMocks(); }); it("sends basic fetch request", async () => { const fetchHttpHandler = new FetchHttpHandler(); const mockHttpRequest = getMockHttpRequest({}); await fetchHttpHandler.handle(mockHttpRequest); const expectedUrl = `${mockHttpRequest.protocol}//${mockHttpRequest.hostname}/`; const requestArgs = vi.mocked(createRequest).mock.calls[0]; expect(requestArgs[0]).toEqual(expectedUrl); expect(requestArgs[1]!.method).toEqual(mockHttpRequest.method); expect(requestArgs[1]!.keepalive).toEqual(false); }); for (const method of ["GET", "HEAD"]) { it(`sets body to undefined when method: '${method}'`, async () => { const fetchHttpHandler = new FetchHttpHandler(); const mockHttpRequest = getMockHttpRequest({ method, body: "test" }); await fetchHttpHandler.handle(mockHttpRequest); const requestArgs = vi.mocked(createRequest).mock.calls[0]; expect(requestArgs[1]!.method).toEqual(mockHttpRequest.method); expect(requestArgs[1]!.body).toEqual(undefined); }); } it(`sets keepalive to true if explicitly requested`, async () => { const fetchHttpHandler = new FetchHttpHandler({ keepAlive: true }); const mockHttpRequest = getMockHttpRequest({}); await fetchHttpHandler.handle(mockHttpRequest); const requestArgs = vi.mocked(createRequest).mock.calls[0]; expect(requestArgs[1]!.keepalive).toEqual(true); }); it(`builds querystring if provided`, async () => { const fetchHttpHandler = new FetchHttpHandler(); const query = { foo: "bar" }; const fragment = "test"; const mockHttpRequest = getMockHttpRequest({ query, fragment }); await fetchHttpHandler.handle(mockHttpRequest); const expectedUrl = `${mockHttpRequest.protocol}//${mockHttpRequest.hostname}/?${Object.entries(query) .map(([key, val]) => `${key}=${val}`) .join("&")}#${fragment}`; const requestArgs = vi.mocked(createRequest).mock.calls[0]; expect(requestArgs[0]).toEqual(expectedUrl); }); it(`sets auth if username/password are provided`, async () => { const fetchHttpHandler = new FetchHttpHandler(); const username = "foo"; const password = "bar"; const mockHttpRequest = getMockHttpRequest({ username, password }); await fetchHttpHandler.handle(mockHttpRequest).catch((error) => { expect(String(error)).toContain( "TypeError: Request cannot be constructed from a URL that includes credentials" ); }); const mockAuth = `${mockHttpRequest.username}:${mockHttpRequest.password}`; const expectedUrl = `${mockHttpRequest.protocol}//${mockAuth}@${mockHttpRequest.hostname}/`; const requestArgs = vi.mocked(createRequest).mock.calls[0]; expect(requestArgs[0]).toEqual(expectedUrl); }); }); }); ================================================ FILE: packages/fetch-http-handler/src/fetch-http-handler.spec.ts ================================================ import { AbortController } from "@smithy/abort-controller"; import { HttpRequest } from "@smithy/protocol-http"; import { afterAll, afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { FetchHttpHandler, keepAliveSupport } from "./fetch-http-handler"; import { requestTimeout } from "./request-timeout"; const mockRequest = vi.fn(); let timeoutSpy: any; (global as any).Request = mockRequest; (global as any).Headers = vi.fn(); const globalFetch = global.fetch; (typeof Blob === "function" ? describe : describe.skip)(FetchHttpHandler.name, () => { beforeEach(() => { (global as any).AbortController = void 0; vi.clearAllMocks(); }); afterEach(() => { vi.clearAllTimers(); if (timeoutSpy) { timeoutSpy.mockRestore(); } }); afterAll(() => { global.fetch = globalFetch; }); it("makes requests using fetch", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob(["FOO"])), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); const response = await fetchHttpHandler.handle({} as any, {}); expect(mockFetch.mock.calls.length).toBe(1); expect(await blobToText(response.response.body)).toBe("FOO"); }); it("put HttpClientConfig", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob(["FOO"])), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); fetchHttpHandler.updateHttpClientConfig("requestTimeout", 200); await fetchHttpHandler.handle({} as any, {}); expect(fetchHttpHandler.httpHandlerConfigs().requestTimeout).toBe(200); }); it("update HttpClientConfig", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob(["FOO"])), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ requestTimeout: 200 }); fetchHttpHandler.updateHttpClientConfig("requestTimeout", 300); await fetchHttpHandler.handle({} as any, {}); expect(fetchHttpHandler.httpHandlerConfigs().requestTimeout).toBe(300); }); it("httpHandlerConfigs returns empty object if handle is not called", async () => { const fetchHttpHandler = new FetchHttpHandler(); fetchHttpHandler.updateHttpClientConfig("requestTimeout", 300); expect(fetchHttpHandler.httpHandlerConfigs()).toEqual({}); }); it("defaults to response.blob for response.body = null", async () => { const mockResponse = { body: null, headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob(["FOO"])), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); const response = await fetchHttpHandler.handle({} as any, {}); expect(mockFetch.mock.calls.length).toBe(1); expect(await blobToText(response.response.body)).toBe("FOO"); }); it("properly constructs url", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const httpRequest = new HttpRequest({ headers: {}, hostname: "foo.amazonaws.com", method: "GET", path: "/test", query: { bar: "baz" }, username: "username", password: "password", fragment: "fragment", protocol: "https:", port: 443, }); const fetchHttpHandler = new FetchHttpHandler(); await fetchHttpHandler.handle(httpRequest, {}); expect(mockFetch.mock.calls.length).toBe(1); const requestCall = mockRequest.mock.calls[0]; expect(requestCall[0]).toBe("https://username:password@foo.amazonaws.com:443/test?bar=baz#fragment"); }); it("will omit body if method is GET", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([]) }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const httpRequest = new HttpRequest({ headers: {}, hostname: "foo.amazonaws.com", method: "GET", path: "/", body: "will be omitted", }); const fetchHttpHandler = new FetchHttpHandler(); await fetchHttpHandler.handle(httpRequest, {}); expect(mockFetch.mock.calls.length).toBe(1); const requestCall = mockRequest.mock.calls[0]; expect(requestCall[1].body).toBeUndefined(); }); it("will omit body if method is HEAD", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([]) }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const httpRequest = new HttpRequest({ headers: {}, hostname: "foo.amazonaws.com", method: "HEAD", path: "/", body: "will be omitted", }); const fetchHttpHandler = new FetchHttpHandler(); await fetchHttpHandler.handle(httpRequest, {}); expect(mockFetch.mock.calls.length).toBe(1); const requestCall = mockRequest.mock.calls[0]; expect(requestCall[1].body).toBeUndefined(); }); it("will not make request if already aborted", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); await expect( fetchHttpHandler.handle({} as any, { abortSignal: { aborted: true, onabort: null, }, }) ).rejects.toHaveProperty("name", "AbortError"); expect(mockFetch.mock.calls.length).toBe(0); }); it("rejects with a mutable error when abort reason is a frozen Error", async () => { const mockFetch = vi.fn(); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); const frozenReason = Object.freeze(new Error("frozen")); try { await fetchHttpHandler.handle({} as any, { abortSignal: { aborted: true, reason: frozenReason, onabort: null, }, }); expect.unreachable("should have thrown"); } catch (e: any) { expect(e.name).toBe("AbortError"); expect(e.cause).toBe(frozenReason); expect(() => { e.$metadata = {}; }).not.toThrow(); } }); it("will pass abortSignal to fetch if supported", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; (global as any).AbortController = vi.fn(); const fetchHttpHandler = new FetchHttpHandler(); await fetchHttpHandler.handle({} as any, { abortSignal: { aborted: false, onabort: null, }, }); expect(mockRequest.mock.calls[0][1]).toHaveProperty("signal"); expect(mockFetch.mock.calls.length).toBe(1); }); it("will pass timeout to request timeout", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; timeoutSpy = vi.spyOn({ requestTimeout }, "requestTimeout"); const fetchHttpHandler = new FetchHttpHandler({ requestTimeout: 500, }); await fetchHttpHandler.handle({} as any, {}); expect(mockFetch.mock.calls.length).toBe(1); }); it("will pass timeout from a provider to request timeout", async () => { const mockResponse = { headers: { entries: () => [], }, blob: async () => new Blob(), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; timeoutSpy = vi.spyOn({ requestTimeout }, "requestTimeout"); const fetchHttpHandler = new FetchHttpHandler(async () => ({ requestTimeout: 500, })); await fetchHttpHandler.handle({} as any, {}); expect(mockFetch.mock.calls.length).toBe(1); }); describe("per-request requestTimeout", () => { it("should use per-request timeout over handler config timeout", async () => { const mockFetch = vi.fn(() => new Promise(() => {})); // never resolve (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ requestTimeout: 5000 }); const start = Date.now(); await expect(fetchHttpHandler.handle({} as any, { requestTimeout: 50 })).rejects.toHaveProperty( "name", "TimeoutError" ); const elapsed = Date.now() - start; expect(elapsed).toBeLessThan(100); // should timeout quickly }); it("should fall back to handler config timeout when per-request timeout not provided", async () => { const mockFetch = vi.fn(() => new Promise(() => {})); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ requestTimeout: 50 }); const start = Date.now(); await expect(fetchHttpHandler.handle({} as any, {})).rejects.toHaveProperty("name", "TimeoutError"); const elapsed = Date.now() - start; expect(elapsed).toBeLessThan(100); }); }); it("will throw timeout error it timeout finishes before request", async () => { const mockFetch = vi.fn(() => { return new Promise(() => {}); }); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ requestTimeout: 5, }); await expect(fetchHttpHandler.handle({} as any, {})).rejects.toHaveProperty("name", "TimeoutError"); expect(mockFetch.mock.calls.length).toBe(1); }); it("can be aborted before fetch completes", async () => { const abortController = new AbortController(); const mockFetch = vi.fn(() => { return new Promise(() => {}); }); (global as any).fetch = mockFetch; setTimeout(() => { abortController.abort(); }, 100); const fetchHttpHandler = new FetchHttpHandler(); await expect( fetchHttpHandler.handle({} as any, { abortSignal: abortController.signal, }) ).rejects.toHaveProperty("name", "AbortError"); // ensure that fetch's built-in mechanism isn't being used expect(mockRequest.mock.calls[0][1]).not.toHaveProperty("signal"); }); it("creates correct HTTPResponse object", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([["foo", "bar"]]), }, blob: vi.fn().mockResolvedValue(new Blob(["FOO"])), status: 200, statusText: "foo", }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); const { response } = await fetchHttpHandler.handle({} as any, {}); expect(mockFetch.mock.calls.length).toBe(1); expect(response.headers).toStrictEqual({ foo: "bar" }); expect(response.reason).toBe("foo"); expect(response.statusCode).toBe(200); expect(await blobToText(response.body)).toBe("FOO"); }); it.each(["include", "omit", "same-origin"])( "will pass credentials mode '%s' from a provider to a request", async (credentialsMode) => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([]) }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const httpRequest = new HttpRequest({ headers: {}, hostname: "foo.amazonaws.com", method: "GET", path: "/", body: "will be omitted", }); const fetchHttpHandler = new FetchHttpHandler(); fetchHttpHandler.updateHttpClientConfig("credentials", credentialsMode as RequestCredentials); await fetchHttpHandler.handle(httpRequest, {}); expect(mockFetch.mock.calls.length).toBe(1); const requestCall = mockRequest.mock.calls[0]; expect(requestCall[1].credentials).toBe(credentialsMode); } ); describe("#destroy", () => { it("should be callable and return nothing", () => { const httpHandler = new FetchHttpHandler(); expect(httpHandler.destroy()).toBeUndefined(); }); }); describe("keepalive", () => { it("will pass keepalive as false by default to request if supported", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler(); keepAliveSupport.supported = true; await fetchHttpHandler.handle({} as any, {}); expect(mockRequest.mock.calls[0][1].keepalive).toBe(false); }); it("will pass keepalive to request if supported", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ keepAlive: true }); keepAliveSupport.supported = true; await fetchHttpHandler.handle({} as any, {}); expect(mockRequest.mock.calls[0][1].keepalive).toBe(true); }); it("will not have keepalive property in request if not supported", async () => { const mockResponse = { headers: { entries: vi.fn().mockReturnValue([ ["foo", "bar"], ["bizz", "bazz"], ]), }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; mockRequest.mockImplementation(() => null); const fetchHttpHandler = new FetchHttpHandler({ keepAlive: false }); keepAliveSupport.supported = false; await fetchHttpHandler.handle({} as any, {}); expect(mockRequest.mock.calls[0][1]).not.toHaveProperty("keepalive"); }); }); describe("custom requestInit", () => { it("should allow setting cache requestInit", async () => { const mockResponse = { headers: { entries() { return []; }, }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ cache: "no-store", }); await fetchHttpHandler.handle({} as any, {}); expect(mockRequest.mock.calls[0][1].cache).toBe("no-store"); }); it("should allow setting custom requestInit", async () => { const mockResponse = { headers: { entries() { return []; }, }, blob: vi.fn().mockResolvedValue(new Blob()), }; const mockFetch = vi.fn().mockResolvedValue(mockResponse); (global as any).fetch = mockFetch; const fetchHttpHandler = new FetchHttpHandler({ requestInit(req) { return { referrer: "me", cache: "reload", headers: { a: "a", b: req.headers.b, }, }; }, }); await fetchHttpHandler.handle( { headers: { b: "b", }, } as any, {} ); expect(mockRequest.mock.calls[0][1]).toEqual({ referrer: "me", cache: "reload", headers: { a: "a", b: "b", }, }); }); }); // The Blob implementation does not implement Blob.text, so we deal with it here. async function blobToText(blob: Blob): Promise { return blob.text(); } }); ================================================ FILE: packages/fetch-http-handler/src/fetch-http-handler.ts ================================================ import { HttpResponse, buildQueryString, type HttpHandler, type HttpRequest } from "@smithy/core/protocols"; import type { FetchHttpHandlerOptions, HeaderBag, HttpHandlerOptions, Provider } from "@smithy/types"; import { createRequest } from "./create-request"; import { requestTimeout as requestTimeoutFn } from "./request-timeout"; declare let AbortController: any; /** * @public */ export { FetchHttpHandlerOptions }; /** * Detection of keepalive support. Can be overridden for testing. * * @internal */ export const keepAliveSupport = { supported: undefined as undefined | boolean, }; /** * @internal */ export type AdditionalRequestParameters = { // This is required in Node.js when Request has a body, and does nothing in the browser. // Duplex: half means the request is fully transmitted before attempting to process the response. // As of writing this is the only accepted value in https://fetch.spec.whatwg.org/. duplex?: "half"; }; /** * HttpHandler implementation using browsers' `fetch` global function. * * @public */ export class FetchHttpHandler implements HttpHandler { private config?: FetchHttpHandlerOptions; private configProvider: Promise; /** * @returns the input if it is an HttpHandler of any class, * or instantiates a new instance of this handler. */ public static create( instanceOrOptions?: HttpHandler | FetchHttpHandlerOptions | Provider ) { if (typeof (instanceOrOptions as any)?.handle === "function") { // is already an instance of HttpHandler. return instanceOrOptions as HttpHandler; } // input is ctor options or undefined. return new FetchHttpHandler(instanceOrOptions as FetchHttpHandlerOptions); } constructor(options?: FetchHttpHandlerOptions | Provider) { if (typeof options === "function") { this.configProvider = options().then((opts) => opts || {}); } else { this.config = options ?? {}; this.configProvider = Promise.resolve(this.config); } if (keepAliveSupport.supported === undefined) { keepAliveSupport.supported = Boolean( typeof Request !== "undefined" && "keepalive" in createRequest("https://[::1]") ); } } destroy(): void { // Do nothing. TLS and HTTP/2 connection pooling is handled by the browser. } async handle( request: HttpRequest, { abortSignal, requestTimeout }: HttpHandlerOptions = {} ): Promise<{ response: HttpResponse }> { if (!this.config) { this.config = await this.configProvider; } const requestTimeoutInMs = requestTimeout ?? this.config!.requestTimeout; const keepAlive = this.config!.keepAlive === true; const credentials = this.config!.credentials as RequestInit["credentials"]; // if the request was already aborted, prevent doing extra work if (abortSignal?.aborted) { const abortError = buildAbortError(abortSignal); return Promise.reject(abortError); } let path = request.path; const queryString = buildQueryString(request.query || {}); if (queryString) { path += `?${queryString}`; } if (request.fragment) { path += `#${request.fragment}`; } let auth = ""; if (request.username != null || request.password != null) { const username = request.username ?? ""; const password = request.password ?? ""; auth = `${username}:${password}@`; } const { port, method } = request; const url = `${request.protocol}//${auth}${request.hostname}${port ? `:${port}` : ""}${path}`; // Request constructor doesn't allow GET/HEAD request with body // ref: https://github.com/whatwg/fetch/issues/551 const body = method === "GET" || method === "HEAD" ? undefined : request.body; const requestOptions: RequestInit & AdditionalRequestParameters = { body, headers: new Headers(request.headers), method: method, credentials, }; // cache property is not supported in workerd runtime // TODO: can we feature detect support for cache and not set this property when not supported? if (this.config?.cache) { requestOptions.cache = this.config.cache; } if (body) { requestOptions.duplex = "half"; } // some browsers support abort signal if (typeof AbortController !== "undefined") { requestOptions.signal = abortSignal as AbortSignal; } // some browsers support keepalive if (keepAliveSupport.supported) { requestOptions.keepalive = keepAlive; } if (typeof this.config.requestInit === "function") { Object.assign(requestOptions, this.config.requestInit(request)); } let removeSignalEventListener = () => {}; const fetchRequest = createRequest(url, requestOptions); const raceOfPromises = [ fetch(fetchRequest).then((response) => { const fetchHeaders: any = response.headers; const transformedHeaders: HeaderBag = {}; for (const pair of >fetchHeaders.entries()) { transformedHeaders[pair[0]] = pair[1]; } // Check for undefined as well as null. const hasReadableStream = response.body != undefined; // Return the response with buffered body if (!hasReadableStream) { return response.blob().then((body) => ({ response: new HttpResponse({ headers: transformedHeaders, reason: response.statusText, statusCode: response.status, body, }), })); } // Return the response with streaming body return { response: new HttpResponse({ headers: transformedHeaders, reason: response.statusText, statusCode: response.status, body: response.body, }), }; }), requestTimeoutFn(requestTimeoutInMs), ]; if (abortSignal) { raceOfPromises.push( new Promise((resolve, reject) => { const onAbort = () => { const abortError = buildAbortError(abortSignal); reject(abortError); }; if (typeof (abortSignal as AbortSignal).addEventListener === "function") { // preferred. const signal = abortSignal as AbortSignal; signal.addEventListener("abort", onAbort, { once: true }); removeSignalEventListener = () => signal.removeEventListener("abort", onAbort); } else { // backwards compatibility abortSignal.onabort = onAbort; } }) ); } return Promise.race(raceOfPromises).finally(removeSignalEventListener); } updateHttpClientConfig(key: keyof FetchHttpHandlerOptions, value: FetchHttpHandlerOptions[typeof key]): void { this.config = undefined; this.configProvider = this.configProvider.then((config) => { (config as Record)[key] = value; return config; }); } httpHandlerConfigs(): FetchHttpHandlerOptions { return this.config ?? {}; } } /** * Builds an abort error, using the AbortSignal's reason if available. */ function buildAbortError(abortSignal?: unknown): Error { const reason = abortSignal && typeof abortSignal === "object" && "reason" in abortSignal ? (abortSignal as { reason?: unknown }).reason : undefined; if (reason) { if (reason instanceof Error) { const abortError = new Error("Request aborted"); abortError.name = "AbortError"; (abortError as { cause?: unknown }).cause = reason; return abortError; } const abortError = new Error(String(reason)); abortError.name = "AbortError"; return abortError; } const abortError = new Error("Request aborted"); abortError.name = "AbortError"; return abortError; } ================================================ FILE: packages/fetch-http-handler/src/index.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { FetchHttpHandler } from "./index"; describe("index", () => { it("exports FetchHttpHandler", () => { expect(typeof FetchHttpHandler).toBe("function"); }); }); ================================================ FILE: packages/fetch-http-handler/src/index.ts ================================================ export * from "./fetch-http-handler"; export * from "./stream-collector"; ================================================ FILE: packages/fetch-http-handler/src/request-timeout.ts ================================================ export function requestTimeout(timeoutInMs = 0): Promise { return new Promise((resolve, reject) => { if (timeoutInMs) { setTimeout(() => { const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`); timeoutError.name = "TimeoutError"; reject(timeoutError); }, timeoutInMs); } }); } ================================================ FILE: packages/fetch-http-handler/src/stream-collector.browser.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { streamCollector } from "./stream-collector"; describe("streamCollector", () => { it("returns a Uint8Array from a blob", async () => { const expected = Uint8Array.from([102, 111, 111]); const dataPromise = new Response(expected.buffer).blob().then((blob) => streamCollector(blob)); await dataPromise.then((data: any) => { expect(data).toEqual(expected); }); }); it("returns a Uint8Array from a ReadableStream", async () => { const expected = Uint8Array.from([102, 111, 111]); const dataPromise = streamCollector(new Response(expected.buffer).body); await dataPromise.then((data: any) => { expect(data).toEqual(expected); }); }); it("returns a Uint8Array when stream is empty", async () => { const expected = new Uint8Array(0); const dataPromise = streamCollector(new Response(expected.buffer).body); await dataPromise.then((data: any) => { expect(data).toEqual(expected); }); }); it("returns a Uint8Array when blob is empty", async () => { const expected = new Uint8Array(0); const dataPromise = new Response(expected.buffer).blob().then((blob) => streamCollector(blob)); await dataPromise.then((data: any) => { expect(data).toEqual(expected); }); }); }); ================================================ FILE: packages/fetch-http-handler/src/stream-collector.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { streamCollector } from "./stream-collector"; describe("streamCollector", () => { const blobAvailable = typeof Blob === "function"; const readableStreamAvailable = typeof ReadableStream === "function"; (blobAvailable ? it : it.skip)("collects Blob into bytearray", async () => { const blobby = new Blob([new Uint8Array([1, 2]), new Uint8Array([3, 4])]); const collected = await streamCollector(blobby); expect(collected).toEqual(new Uint8Array([1, 2, 3, 4])); }); (readableStreamAvailable ? it : it.skip)("collects ReadableStream into bytearray", async () => { const stream = new ReadableStream({ start(controller) { controller.enqueue(new Uint8Array([1, 2])); controller.enqueue(new Uint8Array([3, 4])); controller.close(); }, }); const collected = await streamCollector(stream); expect(collected).toEqual(new Uint8Array([1, 2, 3, 4])); }); }); ================================================ FILE: packages/fetch-http-handler/src/stream-collector.ts ================================================ import { fromBase64 } from "@smithy/core/serde"; import type { StreamCollector } from "@smithy/types"; export const streamCollector: StreamCollector = async (stream: Blob | ReadableStream): Promise => { if ((typeof Blob === "function" && stream instanceof Blob) || stream.constructor?.name === "Blob") { if (Blob.prototype.arrayBuffer !== undefined) { return new Uint8Array(await (stream as Blob).arrayBuffer()); } return collectBlob(stream as Blob); } return collectStream(stream as ReadableStream); }; async function collectBlob(blob: Blob): Promise { const base64 = await readToBase64(blob); const arrayBuffer = fromBase64(base64); return new Uint8Array(arrayBuffer); } async function collectStream(stream: ReadableStream): Promise { const chunks = []; const reader = stream.getReader(); let isDone = false; let length = 0; while (!isDone) { const { done, value } = await reader.read(); if (value) { chunks.push(value); length += value.length; } isDone = done; } const collected = new Uint8Array(length); let offset = 0; for (const chunk of chunks) { collected.set(chunk, offset); offset += chunk.length; } return collected; } function readToBase64(blob: Blob): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onloadend = () => { // reference: https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL // response from readAsDataURL is always prepended with "data:*/*;base64," if (reader.readyState !== 2) { return reject(new Error("Reader aborted too early")); } const result = (reader.result ?? "") as string; // Response can include only 'data:' for empty blob, return empty string in this case. // Otherwise, return the string after ',' const commaIndex = result.indexOf(","); const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length; resolve(result.substring(dataOffset)); }; reader.onabort = () => reject(new Error("Read aborted")); reader.onerror = () => reject(reader.error); // reader.readAsArrayBuffer is not always available reader.readAsDataURL(blob); }); } ================================================ FILE: packages/fetch-http-handler/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/fetch-http-handler/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/fetch-http-handler/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/fetch-http-handler/vitest.config.browser.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e}.spec.ts"], include: ["**/*.spec.ts"], environment: "happy-dom", }, }); ================================================ FILE: packages/fetch-http-handler/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/hash-blob-browser/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/hash-blob-browser/CHANGELOG.md ================================================ # @smithy/hash-blob-browser ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/hash-blob-browser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/hash-blob-browser/package.json ================================================ { "name": "@smithy/hash-blob-browser", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/hash-blob-browser", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/hash-blob-browser" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/hash-blob-browser/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { blobHasher } from "@smithy/core/checksum"; ================================================ FILE: packages/hash-blob-browser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/hash-blob-browser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/hash-blob-browser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/hash-node/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/hash-node/CHANGELOG.md ================================================ # @smithy/hash-node ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/hash-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/hash-node/package.json ================================================ { "name": "@smithy/hash-node", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/hash-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/hash-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/hash-node/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { Hash } from "@smithy/core/serde"; ================================================ FILE: packages/hash-node/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/hash-node/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/hash-node/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/hash-stream-node/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/hash-stream-node/CHANGELOG.md ================================================ # @smithy/hash-stream-node ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/hash-stream-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/hash-stream-node/package.json ================================================ { "name": "@smithy/hash-stream-node", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/hash-stream-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/hash-stream-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/hash-stream-node/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { fileStreamHasher, readableStreamHasher } from "@smithy/core/checksum"; ================================================ FILE: packages/hash-stream-node/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/hash-stream-node/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/hash-stream-node/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/invalid-dependency/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/invalid-dependency/CHANGELOG.md ================================================ # @smithy/invalid-dependency ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/invalid-dependency/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/invalid-dependency/package.json ================================================ { "name": "@smithy/invalid-dependency", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/invalid-dependency", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/invalid-dependency" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/invalid-dependency/src/index.ts ================================================ /** @deprecated Use @smithy/core/client instead. */ export { invalidFunction, invalidProvider } from "@smithy/core/client"; ================================================ FILE: packages/invalid-dependency/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/invalid-dependency/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/invalid-dependency/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/is-array-buffer/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/is-array-buffer/CHANGELOG.md ================================================ # @smithy/is-array-buffer ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/is-array-buffer/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/is-array-buffer/package.json ================================================ { "name": "@smithy/is-array-buffer", "version": "4.3.3", "description": "Provides a function for detecting if an argument is an ArrayBuffer", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/is-array-buffer", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/is-array-buffer" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/is-array-buffer/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { isArrayBuffer } from "@smithy/core/serde"; ================================================ FILE: packages/is-array-buffer/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/is-array-buffer/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/is-array-buffer/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/md5-js/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/md5-js/CHANGELOG.md ================================================ # @smithy/md5-js ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - ee92b6b: move core/serde checksum components to core/checksum - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/md5-js/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/md5-js/package.json ================================================ { "name": "@smithy/md5-js", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/md5-js", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/md5-js" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/md5-js/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { Md5 } from "@smithy/core/checksum"; ================================================ FILE: packages/md5-js/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "include": ["src/"], "extends": "../../tsconfig.cjs.json" } ================================================ FILE: packages/md5-js/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "include": ["src/"], "extends": "../../tsconfig.es.json" } ================================================ FILE: packages/md5-js/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-apply-body-checksum/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/middleware-apply-body-checksum/CHANGELOG.md ================================================ # Change Log ## 4.4.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 4.3.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/protocol-http@5.3.14 ## 4.3.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 ## 4.3.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 ## 4.3.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/is-array-buffer@4.2.2 - @smithy/protocol-http@5.3.11 ## 4.3.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/protocol-http@5.3.10 ## 4.3.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/is-array-buffer@4.2.1 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 ## 4.3.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/protocol-http@5.3.8 ## 4.3.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/protocol-http@5.3.7 ## 4.3.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/protocol-http@5.3.6 ## 4.3.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/protocol-http@5.3.5 ## 4.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/protocol-http@5.3.4 ## 4.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/protocol-http@5.3.3 ## 4.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/protocol-http@5.3.2 ## 4.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/protocol-http@5.3.1 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/is-array-buffer@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/protocol-http@5.2.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/is-array-buffer@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/types@4.4.0 ## 4.1.3 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/protocol-http@5.1.3 ## 4.1.2 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/protocol-http@5.1.2 ## 4.1.1 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/protocol-http@5.1.1 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/protocol-http@5.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/is-array-buffer@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 ## 3.0.13 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/protocol-http@4.1.8 ## 3.0.12 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/protocol-http@4.1.7 ## 3.0.11 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/protocol-http@4.1.6 ## 3.0.10 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/protocol-http@4.1.5 ## 3.0.9 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/protocol-http@4.1.4 ## 3.0.8 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/protocol-http@4.1.3 ## 3.0.7 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/protocol-http@4.1.2 ## 3.0.6 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/protocol-http@4.1.1 ## 3.0.5 ### Patch Changes - 9624938: Fix request copying with `HttpRequest.clone()`. - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 3.0.4 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 3.0.3 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/protocol-http@4.0.3 ## 3.0.2 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/protocol-http@4.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/protocol-http@4.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/is-array-buffer@3.0.0 - @smithy/protocol-http@4.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/is-array-buffer@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/protocol-http@3.2.2 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/protocol-http@3.2.1 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/is-array-buffer@2.1.1 - @smithy/protocol-http@3.1.1 - @smithy/types@2.9.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/is-array-buffer@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/types@2.9.0 ## 2.0.18 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/protocol-http@3.0.12 ## 2.0.17 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/protocol-http@3.0.11 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/protocol-http@3.0.10 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/protocol-http@3.0.9 ## 2.0.14 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/protocol-http@3.0.8 ## 2.0.13 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/protocol-http@3.0.7 ## 2.0.12 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/protocol-http@3.0.6 ## 2.0.11 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/protocol-http@3.0.5 ## 2.0.10 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/protocol-http@3.0.4 ## 2.0.9 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/protocol-http@3.0.3 ## 2.0.8 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 2.0.7 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 ## 2.0.5 ### Patch Changes - 1be3c4c9: Add integration tests - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/protocol-http@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/protocol-http@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/protocol-http@2.0.3 ## 2.0.2 ### Patch Changes - 3e1ab589: add release tag public to client init interface components - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/protocol-http@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/protocol-http@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/is-array-buffer@2.0.0 - @smithy/protocol-http@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/is-array-buffer@1.1.0 - @smithy/protocol-http@1.2.0 - @smithy/types@1.2.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/protocol-http@1.1.2 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/is-array-buffer@1.0.2 - @smithy/protocol-http@1.1.1 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/is-array-buffer@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/middleware-apply-body-checksum](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/middleware-apply-body-checksum/CHANGELOG.md) for additional history. ================================================ FILE: packages/middleware-apply-body-checksum/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-apply-body-checksum/README.md ================================================ # @smithy/middleware-apply-body-checksum [![NPM version](https://img.shields.io/npm/v/@smithy/middleware-apply-body-checksum/latest.svg)](https://www.npmjs.com/package/@smithy/middleware-apply-body-checksum) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/middleware-apply-body-checksum.svg)](https://www.npmjs.com/package/@smithy/middleware-apply-body-checksum) ### :warning: Internal API :warning: > This is an internal package. > That means this is used as a dependency for other, public packages, but > should not be taken directly as a dependency in your application's `package.json`. > If you are updating the version of this package, for example to bring in a > bug-fix, you should do so by updating your application lockfile with > e.g. `npm up @scope/package` or equivalent command in another > package manager, rather than taking a direct dependency. --- This package provides AWS SDK for JavaScript middleware that applies a checksum of the request body as a header. ================================================ FILE: packages/middleware-apply-body-checksum/package.json ================================================ { "name": "@smithy/middleware-apply-body-checksum", "version": "4.4.3", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline middleware-apply-body-checksum", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts", "test:watch": "yarn g:vitest watch" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-apply-body-checksum", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-apply-body-checksum" }, "devDependencies": { "@smithy/util-test": "workspace:^", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-apply-body-checksum/src/applyMd5BodyChecksumMiddleware.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { ChecksumConstructor } from "@smithy/types"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { applyMd5BodyChecksumMiddleware } from "./applyMd5BodyChecksumMiddleware"; describe("applyMd5BodyChecksumMiddleware", () => { const mockEncoder = vi.fn().mockReturnValue("encoded"); const mockHashUpdate = vi.fn(); const mockHashDigest = vi.fn().mockReturnValue(new Uint8Array(0)); const mockHashReset = vi.fn(); const MockHash: ChecksumConstructor = class {} as any; MockHash.prototype.update = mockHashUpdate; MockHash.prototype.digest = mockHashDigest; MockHash.prototype.reset = mockHashReset; const next = vi.fn(); class ExoticStream {} beforeEach(() => { mockEncoder.mockClear(); mockHashUpdate.mockClear(); mockHashDigest.mockClear(); mockHashReset.mockClear(); next.mockClear(); }); for (const body of ["body", new ArrayBuffer(10), new Uint8Array(10), void 0]) { it("should calculate the body hash, encode the result, and set the encoded hash to content-md5 header", async () => { const handler = applyMd5BodyChecksumMiddleware({ md5: MockHash, base64Encoder: mockEncoder, // eslint-disable-next-line @typescript-eslint/no-unused-vars streamHasher: async (stream: ExoticStream) => new Uint8Array(5), })(next, {} as any); await handler({ input: {}, request: new HttpRequest({ body: body, }), }); expect(next.mock.calls.length).toBe(1); const { request } = next.mock.calls[0][0]; expect(request.headers["content-md5"]).toBe("encoded"); expect(mockHashUpdate.mock.calls).toEqual([[body || ""]]); }); it("should do nothing if a case-insenitive match for the desired header has already been set", async () => { const handler = applyMd5BodyChecksumMiddleware({ md5: MockHash, base64Encoder: mockEncoder, // eslint-disable-next-line @typescript-eslint/no-unused-vars streamHasher: async (stream: ExoticStream) => new Uint8Array(5), })(next, {} as any); await handler({ input: {}, request: new HttpRequest({ body: body, headers: { "CoNtEnT-Md5": "foo", }, }), }); expect(next.mock.calls.length).toBe(1); const { request } = next.mock.calls[0][0]; expect(request.headers["CoNtEnT-Md5"]).toBe("foo"); expect(request.headers["content-md5"]).toBe(undefined); expect(mockHashUpdate.mock.calls.length).toBe(0); expect(mockHashDigest.mock.calls.length).toBe(0); expect(mockEncoder.mock.calls.length).toBe(0); }); it("should clone the request when applying the checksum", async () => { const handler = applyMd5BodyChecksumMiddleware({ md5: MockHash, base64Encoder: mockEncoder, // eslint-disable-next-line @typescript-eslint/no-unused-vars streamHasher: async (stream: ExoticStream) => new Uint8Array(5), })(next, {} as any); await handler({ input: {}, request: new HttpRequest({ body: body, }), }); expect(next.mock.calls.length).toBe(1); const { request } = next.mock.calls[0][0]; // Assert that non-enumerable properties like the method `clone()` are preserved. expect(request.clone).toBeDefined(); }); } it("should use the supplied stream hasher to calculate the hash of a streaming body", async () => { const handler = applyMd5BodyChecksumMiddleware({ md5: MockHash, base64Encoder: mockEncoder, // eslint-disable-next-line @typescript-eslint/no-unused-vars streamHasher: async (stream: ExoticStream) => new Uint8Array(5), })(next, {} as any); await handler({ input: {}, request: new HttpRequest({ body: new ExoticStream(), }), }); expect(next.mock.calls.length).toBe(1); const { request } = next.mock.calls[0][0]; expect(request.body).toStrictEqual(new ExoticStream()); expect(request.headers["content-md5"]).toBe("encoded"); expect(mockHashDigest.mock.calls.length).toBe(0); expect(mockEncoder.mock.calls.length).toBe(1); expect(mockEncoder.mock.calls).toEqual([[new Uint8Array(5)]]); }); }); ================================================ FILE: packages/middleware-apply-body-checksum/src/applyMd5BodyChecksumMiddleware.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { isArrayBuffer } from "@smithy/core/serde"; import type { BuildHandler, BuildHandlerArguments, BuildHandlerOptions, BuildHandlerOutput, BuildMiddleware, HeaderBag, MetadataBearer, Pluggable, } from "@smithy/types"; import type { Md5BodyChecksumResolvedConfig } from "./md5Configuration"; export const applyMd5BodyChecksumMiddleware = (options: Md5BodyChecksumResolvedConfig): BuildMiddleware => (next: BuildHandler): BuildHandler => async (args: BuildHandlerArguments): Promise> => { const { request } = args; if (HttpRequest.isInstance(request)) { const { body, headers } = request; if (!hasHeader("content-md5", headers)) { let digest: Promise; if (body === undefined || typeof body === "string" || ArrayBuffer.isView(body) || isArrayBuffer(body)) { const hash = new options.md5(); hash.update(body || ""); digest = hash.digest(); } else { digest = options.streamHasher(options.md5, body); } const cloned = HttpRequest.clone(request); cloned.headers = { ...headers, "content-md5": options.base64Encoder(await digest), }; return next({ ...args, request: cloned, }); } } return next(args); }; export const applyMd5BodyChecksumMiddlewareOptions: BuildHandlerOptions = { name: "applyMd5BodyChecksumMiddleware", step: "build", tags: ["SET_CONTENT_MD5", "BODY_CHECKSUM"], override: true, }; export const getApplyMd5BodyChecksumPlugin = (config: Md5BodyChecksumResolvedConfig): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(applyMd5BodyChecksumMiddleware(config), applyMd5BodyChecksumMiddlewareOptions); }, }); const hasHeader = (soughtHeader: string, headers: HeaderBag): boolean => { soughtHeader = soughtHeader.toLowerCase(); for (const headerName of Object.keys(headers)) { if (soughtHeader === headerName.toLowerCase()) { return true; } } return false; }; ================================================ FILE: packages/middleware-apply-body-checksum/src/index.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { applyMd5BodyChecksumMiddleware, resolveMd5BodyChecksumConfig } from "./index"; describe("middleware-apply-body-checksum package exports", () => { it("maintains object custody", () => { const input = { md5: vi.fn(), base64Encoder: vi.fn(), streamHasher: vi.fn(), }; expect(resolveMd5BodyChecksumConfig(input)).toBe(input); }); it("applyMd5BodyChecksumMiddleware", () => { expect(typeof applyMd5BodyChecksumMiddleware).toBe("function"); }); }); ================================================ FILE: packages/middleware-apply-body-checksum/src/index.ts ================================================ export * from "./applyMd5BodyChecksumMiddleware"; export * from "./md5Configuration"; ================================================ FILE: packages/middleware-apply-body-checksum/src/md5Configuration.ts ================================================ import type { ChecksumConstructor, Encoder, HashConstructor, StreamHasher } from "@smithy/types"; /** * @public */ export interface Md5BodyChecksumInputConfig {} interface PreviouslyResolved { md5: ChecksumConstructor | HashConstructor; base64Encoder: Encoder; streamHasher: StreamHasher; } export interface Md5BodyChecksumResolvedConfig { /** * A constructor for a class implementing the @smithy/types.Hash interface that computes MD5 hashes. * @internal */ md5: ChecksumConstructor | HashConstructor; /** * The function that will be used to convert binary data to a base64-encoded string. * @internal */ base64Encoder: Encoder; /** * A function that, given a hash constructor and a stream, calculates the hash of the streamed value. * @internal */ streamHasher: StreamHasher; } export const resolveMd5BodyChecksumConfig = ( input: T & PreviouslyResolved & Md5BodyChecksumInputConfig ): T & Md5BodyChecksumResolvedConfig => input; ================================================ FILE: packages/middleware-apply-body-checksum/src/middleware-apply-body-checksum.integ.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { Weather } from "weather"; import { requireRequestsFrom } from "../../../private/util-test/src/index"; describe("middleware-apply-body-checksum", () => { describe(Weather.name, () => { it("should add body-checksum", async () => { const client = new Weather({ endpoint: "https://foo.bar", region: "us-west-2", credentials: { accessKeyId: "INTEG", secretAccessKey: "INTEG", }, }); requireRequestsFrom(client).toMatch({ headers: { "content-md5": /^.{22}(==)?$/i, }, }); await client.getCity({ cityId: "my-city", }); expect.assertions(1); }); }); }); ================================================ FILE: packages/middleware-apply-body-checksum/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-apply-body-checksum/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-apply-body-checksum/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-apply-body-checksum/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/middleware-apply-body-checksum/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/middleware-compression/CHANGELOG.md ================================================ # Change Log ## 4.4.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 4.3.46 ### Patch Changes - @smithy/core@3.23.17 ## 4.3.45 ### Patch Changes - Updated dependencies [a029f0e] - @smithy/core@3.23.16 ## 4.3.44 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/node-config-provider@4.3.14 - @smithy/protocol-http@5.3.14 - @smithy/util-middleware@4.2.14 ## 4.3.43 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/node-config-provider@4.3.13 - @smithy/protocol-http@5.3.13 - @smithy/util-middleware@4.2.13 ## 4.3.42 ### Patch Changes - Updated dependencies [7198e09] - @smithy/core@3.23.13 ## 4.3.41 ### Patch Changes - @smithy/core@3.23.12 ## 4.3.40 ### Patch Changes - Updated dependencies [2edd638] - @smithy/core@3.23.11 ## 4.3.39 ### Patch Changes - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/node-config-provider@4.3.12 - @smithy/protocol-http@5.3.12 - @smithy/util-middleware@4.2.12 ## 4.3.38 ### Patch Changes - Updated dependencies [6ef5430] - Updated dependencies [6ef5430] - @smithy/core@3.23.9 ## 4.3.37 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/node-config-provider@4.3.11 - @smithy/util-config-provider@4.2.2 - @smithy/is-array-buffer@4.2.2 - @smithy/util-middleware@4.2.11 - @smithy/protocol-http@5.3.11 - @smithy/util-utf8@4.2.2 - @smithy/core@3.23.8 ## 4.3.36 ### Patch Changes - Updated dependencies [11569eb] - @smithy/core@3.23.7 ## 4.3.35 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/core@3.23.6 - @smithy/node-config-provider@4.3.10 - @smithy/protocol-http@5.3.10 - @smithy/util-middleware@4.2.10 ## 4.3.34 ### Patch Changes - Updated dependencies [026b177] - Updated dependencies [cde9f09] - @smithy/core@3.23.5 ## 4.3.33 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/core@3.23.4 - @smithy/is-array-buffer@4.2.1 - @smithy/node-config-provider@4.3.9 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 - @smithy/util-config-provider@4.2.1 - @smithy/util-middleware@4.2.9 - @smithy/util-utf8@4.2.1 ## 4.3.32 ### Patch Changes - @smithy/core@3.23.3 ## 4.3.31 ### Patch Changes - Updated dependencies [c5db01c] - @smithy/core@3.23.2 ## 4.3.30 ### Patch Changes - Updated dependencies [6f96c01] - @smithy/core@3.23.1 ## 4.3.29 ### Patch Changes - Updated dependencies [4f05c6a] - @smithy/core@3.23.0 ## 4.3.28 ### Patch Changes - @smithy/core@3.22.1 ## 4.3.27 ### Patch Changes - Updated dependencies [472bf01] - @smithy/core@3.22.0 ## 4.3.26 ### Patch Changes - Updated dependencies [fa0e0c4] - @smithy/core@3.21.1 ## 4.3.25 ### Patch Changes - Updated dependencies [c2a6f46] - @smithy/core@3.21.0 ## 4.3.24 ### Patch Changes - Updated dependencies [96cc077] - @smithy/core@3.20.8 ## 4.3.23 ### Patch Changes - Updated dependencies [ae6ef2e] - @smithy/core@3.20.7 ## 4.3.22 ### Patch Changes - Updated dependencies [862c942] - @smithy/core@3.20.6 ## 4.3.21 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/core@3.20.5 - @smithy/node-config-provider@4.3.8 - @smithy/protocol-http@5.3.8 - @smithy/util-middleware@4.2.8 ## 4.3.20 ### Patch Changes - @smithy/core@3.20.4 ## 4.3.19 ### Patch Changes - Updated dependencies [681d6c4] - @smithy/core@3.20.3 ## 4.3.18 ### Patch Changes - Updated dependencies [dd55f1f] - @smithy/core@3.20.2 ## 4.3.17 ### Patch Changes - Updated dependencies [aa954bc] - @smithy/core@3.20.1 ## 4.3.16 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/core@3.20.0 - @smithy/node-config-provider@4.3.7 - @smithy/protocol-http@5.3.7 - @smithy/util-middleware@4.2.7 ## 4.3.15 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/core@3.19.0 - @smithy/node-config-provider@4.3.6 - @smithy/protocol-http@5.3.6 - @smithy/util-middleware@4.2.6 ## 4.3.14 ### Patch Changes - Updated dependencies [541a18f] - @smithy/core@3.18.7 ## 4.3.13 ### Patch Changes - Updated dependencies [1d6db03] - @smithy/core@3.18.6 ## 4.3.12 ### Patch Changes - Updated dependencies [77c149f] - @smithy/core@3.18.5 ## 4.3.11 ### Patch Changes - Updated dependencies [e659a06] - @smithy/core@3.18.4 ## 4.3.10 ### Patch Changes - Updated dependencies [5bcd041] - @smithy/core@3.18.3 ## 4.3.9 ### Patch Changes - Updated dependencies [c8b148c] - @smithy/core@3.18.2 ## 4.3.8 ### Patch Changes - Updated dependencies [0976f42] - @smithy/core@3.18.1 ## 4.3.7 ### Patch Changes - Updated dependencies [3926fd7] - Updated dependencies [e77f705] - @smithy/types@4.9.0 - @smithy/core@3.18.0 - @smithy/node-config-provider@4.3.5 - @smithy/protocol-http@5.3.5 - @smithy/util-middleware@4.2.5 ## 4.3.6 ### Patch Changes - Updated dependencies [6da0ab3] - Updated dependencies [df00095] - @smithy/types@4.8.1 - @smithy/core@3.17.2 - @smithy/node-config-provider@4.3.4 - @smithy/protocol-http@5.3.4 - @smithy/util-middleware@4.2.4 ## 4.3.5 ### Patch Changes - @smithy/core@3.17.1 ## 4.3.4 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/core@3.17.0 - @smithy/node-config-provider@4.3.3 - @smithy/protocol-http@5.3.3 - @smithy/util-middleware@4.2.3 ## 4.3.3 ### Patch Changes - Updated dependencies [052d261] - @smithy/core@3.16.1 - @smithy/types@4.7.1 - @smithy/node-config-provider@4.3.2 - @smithy/protocol-http@5.3.2 - @smithy/util-middleware@4.2.2 ## 4.3.2 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - Updated dependencies [8a2873c] - @smithy/types@4.7.0 - @smithy/core@3.16.0 - @smithy/node-config-provider@4.3.1 - @smithy/protocol-http@5.3.1 - @smithy/util-middleware@4.2.1 ## 4.3.1 ### Patch Changes - Updated dependencies [813c9a5] - @smithy/core@3.15.0 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/core@3.14.0 - @smithy/is-array-buffer@4.2.0 - @smithy/node-config-provider@4.3.0 - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 - @smithy/util-config-provider@4.2.0 - @smithy/util-middleware@4.2.0 - @smithy/util-utf8@4.2.0 ## 4.2.5 ### Patch Changes - Updated dependencies [59e9952] - @smithy/core@3.13.0 ## 4.2.4 ### Patch Changes - Updated dependencies [97fe0d8] - Updated dependencies [3eb73f3] - @smithy/core@3.12.0 ## 4.2.3 ### Patch Changes - Updated dependencies [f8793be] - @smithy/core@3.11.1 ## 4.2.2 ### Patch Changes - @smithy/node-config-provider@4.2.2 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/core@3.11.0 - @smithy/node-config-provider@4.2.1 - @smithy/protocol-http@5.2.1 - @smithy/util-middleware@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/node-config-provider@4.2.0 - @smithy/util-config-provider@4.1.0 - @smithy/is-array-buffer@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 - @smithy/core@3.10.0 ## 4.1.19 ### Patch Changes - Updated dependencies [06ac1f6] - @smithy/core@3.9.2 ## 4.1.18 ### Patch Changes - Updated dependencies [29fad01] - @smithy/core@3.9.1 ## 4.1.17 ### Patch Changes - Updated dependencies [ab4f33f] - Updated dependencies [d79dc91] - @smithy/core@3.9.0 ## 4.1.16 ### Patch Changes - Updated dependencies [fd00602] - Updated dependencies [64e033f] - @smithy/core@3.8.0 - @smithy/types@4.3.2 - @smithy/node-config-provider@4.1.4 - @smithy/protocol-http@5.1.3 - @smithy/util-middleware@4.0.5 ## 4.1.15 ### Patch Changes - Updated dependencies [f4dcba0] - @smithy/core@3.7.2 ## 4.1.14 ### Patch Changes - Updated dependencies [312801c] - Updated dependencies [bb7975e] - @smithy/core@3.7.1 ## 4.1.13 ### Patch Changes - Updated dependencies [d105c97] - @smithy/core@3.7.0 ## 4.1.12 ### Patch Changes - Updated dependencies [10a0534] - @smithy/core@3.6.0 ## 4.1.11 ### Patch Changes - Updated dependencies [4a31774] - @smithy/core@3.5.3 ## 4.1.10 ### Patch Changes - Updated dependencies [4642e7e] - Updated dependencies [147ceed] - Updated dependencies [ae8f1f4] - @smithy/core@3.5.2 ## 4.1.9 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/core@3.5.1 - @smithy/node-config-provider@4.1.3 - @smithy/protocol-http@5.1.2 - @smithy/util-middleware@4.0.4 ## 4.1.8 ### Patch Changes - Updated dependencies [ae11e3a] - Updated dependencies [23812a9] - @smithy/core@3.5.0 ## 4.1.7 ### Patch Changes - Updated dependencies [0547fab] - Updated dependencies [efb27ee] - Updated dependencies [06b0ce8] - @smithy/types@4.3.0 - @smithy/core@3.4.0 - @smithy/node-config-provider@4.1.2 - @smithy/protocol-http@5.1.1 - @smithy/util-middleware@4.0.3 ## 4.1.6 ### Patch Changes - @smithy/core@3.3.3 ## 4.1.5 ### Patch Changes - @smithy/core@3.3.2 ## 4.1.4 ### Patch Changes - Updated dependencies [9f8d075] - @smithy/node-config-provider@4.1.1 ## 4.1.3 ### Patch Changes - Updated dependencies [acefcf5] - Updated dependencies [9ff783b] - @smithy/node-config-provider@4.1.0 ## 4.1.2 ### Patch Changes - Updated dependencies [40ffcd5] - @smithy/core@3.3.1 ## 4.1.1 ### Patch Changes - Updated dependencies [5896264] - @smithy/core@3.3.0 ## 4.1.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ### Patch Changes - Updated dependencies [02ef79c] - Updated dependencies [e917e61] - @smithy/core@3.2.0 - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 - @smithy/node-config-provider@4.0.2 - @smithy/util-middleware@4.0.2 ## 4.0.6 ### Patch Changes - @smithy/core@3.1.5 ## 4.0.5 ### Patch Changes - @smithy/core@3.1.4 ## 4.0.4 ### Patch Changes - @smithy/core@3.1.3 ## 4.0.3 ### Patch Changes - @smithy/core@3.1.2 ## 4.0.2 ### Patch Changes - @smithy/core@3.1.1 ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/core@3.1.0 - @smithy/node-config-provider@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/util-middleware@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/node-config-provider@4.0.0 - @smithy/util-config-provider@4.0.0 - @smithy/util-middleware@4.0.0 - @smithy/util-utf8@4.0.0 - @smithy/core@3.0.0 - @smithy/is-array-buffer@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 ## 3.1.7 ### Patch Changes - @smithy/core@2.5.7 ## 3.1.6 ### Patch Changes - @smithy/core@2.5.6 ## 3.1.5 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/core@2.5.5 - @smithy/node-config-provider@3.1.12 - @smithy/protocol-http@4.1.8 - @smithy/util-middleware@3.0.11 ## 3.1.4 ### Patch Changes - Updated dependencies [9c40f7b] - @smithy/core@2.5.4 ## 3.1.3 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/core@2.5.3 - @smithy/node-config-provider@3.1.11 - @smithy/protocol-http@4.1.7 - @smithy/util-middleware@3.0.10 ## 3.1.2 ### Patch Changes - Updated dependencies [c6ef519] - Updated dependencies [cd1929b] - @smithy/core@2.5.2 - @smithy/types@3.7.0 - @smithy/node-config-provider@3.1.10 - @smithy/protocol-http@4.1.6 - @smithy/util-middleware@3.0.9 ## 3.1.1 ### Patch Changes - @smithy/core@2.5.1 ## 3.1.0 ### Minor Changes - d07b0ab: feature detection for custom endpoint and gzip ### Patch Changes - d07b0ab: reorganize smithy/core to be upstream of smithy/smithy-client - Updated dependencies [84bec05] - Updated dependencies [d07b0ab] - Updated dependencies [d07b0ab] - @smithy/types@3.6.0 - @smithy/core@2.5.0 - @smithy/node-config-provider@3.1.9 - @smithy/protocol-http@4.1.5 - @smithy/util-middleware@3.0.8 ## 3.0.12 ### Patch Changes - 75e0125: comma spacing ## 3.0.11 ### Patch Changes - dfb0664: use lowercase headers - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/node-config-provider@3.1.8 - @smithy/protocol-http@4.1.4 - @smithy/util-middleware@3.0.7 ## 3.0.10 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/node-config-provider@3.1.7 - @smithy/protocol-http@4.1.3 - @smithy/util-middleware@3.0.6 ## 3.0.9 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/node-config-provider@3.1.6 - @smithy/protocol-http@4.1.2 - @smithy/util-middleware@3.0.5 ## 3.0.8 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/node-config-provider@3.1.5 - @smithy/protocol-http@4.1.1 - @smithy/util-middleware@3.0.4 ## 3.0.7 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 3.0.6 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 3.0.5 ### Patch Changes - @smithy/node-config-provider@3.1.4 ## 3.0.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/node-config-provider@3.1.3 - @smithy/protocol-http@4.0.3 - @smithy/util-middleware@3.0.3 ## 3.0.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/node-config-provider@3.1.2 - @smithy/protocol-http@4.0.2 - @smithy/util-middleware@3.0.2 ## 3.0.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/node-config-provider@3.1.1 - @smithy/protocol-http@4.0.1 - @smithy/util-middleware@3.0.1 ## 3.0.1 ### Patch Changes - Updated dependencies [1cdd3be0] - @smithy/node-config-provider@3.1.0 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/node-config-provider@3.0.0 - @smithy/util-config-provider@3.0.0 - @smithy/is-array-buffer@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/protocol-http@4.0.0 - @smithy/util-utf8@3.0.0 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/node-config-provider@2.3.0 - @smithy/util-config-provider@2.3.0 - @smithy/is-array-buffer@2.2.0 - @smithy/util-middleware@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.5 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 - @smithy/node-config-provider@2.2.5 - @smithy/protocol-http@3.2.2 - @smithy/util-middleware@2.1.4 ## 2.1.4 ### Patch Changes - @smithy/node-config-provider@2.2.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/node-config-provider@2.2.3 - @smithy/protocol-http@3.2.1 - @smithy/util-middleware@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/node-config-provider@2.2.2 - @smithy/util-middleware@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/is-array-buffer@2.1.1 - @smithy/node-config-provider@2.2.1 - @smithy/protocol-http@3.1.1 - @smithy/types@2.9.1 - @smithy/util-config-provider@2.2.1 - @smithy/util-middleware@2.1.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/node-config-provider@2.2.0 - @smithy/util-config-provider@2.2.0 - @smithy/is-array-buffer@2.1.0 - @smithy/util-middleware@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.2 ### Patch Changes - f48de633: Make CompressionInputConfig properties optional ## 2.0.1 ### Patch Changes - e21ed11d: Accept Provider in CompressionInputConfig ## 2.0.0 ### Major Changes - 35d6b218: Add middleware and plugin for request compression All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. ================================================ FILE: packages/middleware-compression/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-compression/README.md ================================================ # @smithy/middleware-compression [![NPM version](https://img.shields.io/npm/v/@smithy/middleware-token/latest.svg)](https://www.npmjs.com/package/@smithy/middleware-compression) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/middleware-token.svg)](https://www.npmjs.com/package/@smithy/middleware-compression) ### :warning: Internal API :warning: > This is an internal package. > That means this is used as a dependency for other, public packages, but > should not be taken directly as a dependency in your application's `package.json`. > If you are updating the version of this package, for example to bring in a > bug-fix, you should do so by updating your application lockfile with > e.g. `npm up @scope/package` or equivalent command in another > package manager, rather than taking a direct dependency. ---- ================================================ FILE: packages/middleware-compression/package.json ================================================ { "name": "@smithy/middleware-compression", "version": "4.4.3", "description": "Middleware and Plugin for request compression.", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline middleware-compression", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:watch": "yarn g:vitest watch" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "fflate": "0.8.1", "tslib": "^2.6.2" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "web-streams-polyfill": "3.2.1" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "keywords": [ "middleware", "compression", "gzip" ], "license": "Apache-2.0", "sideEffects": false, "browser": { "./dist-es/compressStream": "./dist-es/compressStream.browser", "./dist-es/compressString": "./dist-es/compressString.browser" }, "react-native": { "./dist-es/compressStream": "./dist-es/compressStream.browser", "./dist-cjs/compressStream": "./dist-cjs/compressStream.browser", "./dist-es/compressString": "./dist-es/compressString.browser", "./dist-cjs/compressString": "./dist-cjs/compressString.browser" }, "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-compression", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-compression" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-compression/src/NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS.spec.ts ================================================ import { SelectorType, booleanSelector } from "@smithy/core/config"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { DEFAULT_DISABLE_REQUEST_COMPRESSION, NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS, NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME, NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME, } from "./NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS"; vi.mock("@smithy/core/config"); describe("NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS", () => { afterEach(() => { vi.clearAllMocks(); }); const test = (func: Function, obj: Record, key: string, type: SelectorType) => { it.each([true, false, undefined])("returns %s", (output) => { vi.mocked(booleanSelector).mockReturnValueOnce(output); expect(func(obj)).toEqual(output); expect(booleanSelector).toBeCalledWith(obj, key, type); }); it("throws error", () => { const mockError = new Error("error"); vi.mocked(booleanSelector).mockImplementationOnce(() => { throw mockError; }); expect(() => { func(obj); }).toThrow(mockError); }); }; describe("calls booleanSelector for environmentVariableSelector", () => { const env: { [NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME]: any } = {} as any; const { environmentVariableSelector } = NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS; test(environmentVariableSelector, env, NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME, SelectorType.ENV); }); describe("calls booleanSelector for configFileSelector", () => { const profileContent: { [NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME]: any } = {} as any; const { configFileSelector } = NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS; test(configFileSelector, profileContent, NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME, SelectorType.CONFIG); }); it(`returns ${DEFAULT_DISABLE_REQUEST_COMPRESSION} for default`, () => { const { default: defaultValue } = NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS; expect(defaultValue).toEqual(DEFAULT_DISABLE_REQUEST_COMPRESSION); }); }); ================================================ FILE: packages/middleware-compression/src/NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS.ts ================================================ import { SelectorType, booleanSelector, type LoadedConfigSelectors } from "@smithy/core/config"; /** * @internal */ export const NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME = "AWS_DISABLE_REQUEST_COMPRESSION"; /** * @internal */ export const NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME = "disable_request_compression"; /** * @internal */ export const DEFAULT_DISABLE_REQUEST_COMPRESSION = false; /** * @internal */ export const NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => booleanSelector(env, NODE_DISABLE_REQUEST_COMPRESSION_ENV_NAME, SelectorType.ENV), configFileSelector: (profile) => booleanSelector(profile, NODE_DISABLE_REQUEST_COMPRESSION_INI_NAME, SelectorType.CONFIG), default: DEFAULT_DISABLE_REQUEST_COMPRESSION, }; ================================================ FILE: packages/middleware-compression/src/NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS.spec.ts ================================================ import { SelectorType, numberSelector } from "@smithy/core/config"; import { afterEach, describe, expect, test as it, vi } from "vitest"; import { DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME, } from "./NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS"; vi.mock("@smithy/core/config"); describe("NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS", () => { afterEach(() => { vi.clearAllMocks(); }); const test = (func: Function, obj: Record, key: string, type: SelectorType) => { it.each([0, 1, undefined])("returns %s", (output) => { vi.mocked(numberSelector).mockReturnValueOnce(output); expect(func(obj)).toEqual(output); expect(numberSelector).toBeCalledWith(obj, key, type); }); it("throws error", () => { const mockError = new Error("error"); vi.mocked(numberSelector).mockImplementationOnce(() => { throw mockError; }); expect(() => { func(obj); }).toThrow(mockError); }); }; describe("calls numberSelector for environmentVariableSelector", () => { const env: { [NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME]: any } = {} as any; const { environmentVariableSelector } = NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS; test(environmentVariableSelector, env, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME, SelectorType.ENV); }); describe("calls numberSelector for configFileSelector", () => { const profileContent: { [NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME]: any } = {} as any; const { configFileSelector } = NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS; test(configFileSelector, profileContent, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME, SelectorType.CONFIG); }); it(`returns ${DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES} for default`, () => { const { default: defaultValue } = NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS; expect(defaultValue).toEqual(DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES); }); }); ================================================ FILE: packages/middleware-compression/src/NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS.ts ================================================ import { SelectorType, numberSelector, type LoadedConfigSelectors } from "@smithy/core/config"; /** * @internal */ export const NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME = "AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES"; /** * @internal */ export const NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME = "request_min_compression_size_bytes"; /** * @internal */ export const DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES = 10240; /** * @internal */ export const NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env: NodeJS.ProcessEnv) => numberSelector(env, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_ENV_NAME, SelectorType.ENV), configFileSelector: (profile) => numberSelector(profile, NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_INI_NAME, SelectorType.CONFIG), default: DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES, }; ================================================ FILE: packages/middleware-compression/src/compressStream.browser.spec.ts ================================================ import { AsyncGzip } from "fflate"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { ReadableStream } from "web-streams-polyfill"; import { compressStream } from "./compressStream.browser"; vi.mock("fflate"); describe(compressStream.name, () => { const compressionSuffix = "compressed"; const compressionSeparator = "."; const asyncGzip = { ondata: vi.fn(), push: vi.fn().mockImplementation((chunk, final) => { const data = typeof chunk === "string" ? [chunk, compressionSuffix].join(compressionSeparator) : null; asyncGzip.ondata(undefined, data, final); }), terminate() {}, }; beforeEach(() => { vi.mocked(AsyncGzip).mockImplementation(() => asyncGzip); }); afterEach(() => { vi.resetAllMocks(); }); it("compresses a stream", async () => { const inputChunks = ["hello", "world"]; const inputStream = new ReadableStream({ start(controller) { for (const inputChunk of inputChunks) { controller.enqueue(inputChunk); } controller.close(); }, }); const compressionStream = await compressStream(inputStream); const reader = compressionStream.getReader(); for (const inputChunk of inputChunks) { const { value, done } = await reader.read(); expect(value).toEqual([inputChunk, compressionSuffix].join(compressionSeparator)); expect(done).toEqual(false); } // Mock for last push. const { value, done } = await reader.read(); expect(value).toEqual(null); expect(done).toEqual(false); // Mock for stream ending. const { value: valueFinal, done: doneFinal } = await reader.read(); expect(valueFinal).toEqual(undefined); expect(doneFinal).toEqual(true); }); it("should throw an error if compression fails", async () => { const compressionErrorMsg = "compression error message"; const compressionError = new Error(compressionErrorMsg); vi.mocked(AsyncGzip).mockImplementationOnce(() => { throw compressionError; }); const inputStream = new ReadableStream({ start(controller) { controller.close(); }, }); await expect(compressStream(inputStream)).rejects.toThrow(compressionError); }); }); ================================================ FILE: packages/middleware-compression/src/compressStream.browser.ts ================================================ import { AsyncGzip } from "fflate"; export const compressStream = async (body: ReadableStream): Promise => { let endCallback: () => void; const asyncGzip = new AsyncGzip(); // Replace with Compression Streams API once supported in all browsers. // https://developer.mozilla.org/en-US/docs/Web/API/Compression_Streams_API const compressionStream = new TransformStream({ start(controller) { asyncGzip.ondata = (err, data, final) => { if (err) { controller.error(err); } else { controller.enqueue(data); if (final) { if (endCallback) endCallback(); else controller.terminate(); } } }; }, transform(chunk) { asyncGzip.push(chunk); }, flush() { return new Promise((resolve) => { endCallback = resolve; asyncGzip.push(new Uint8Array(0), true); }); }, }); return body.pipeThrough(compressionStream); }; ================================================ FILE: packages/middleware-compression/src/compressStream.spec.ts ================================================ import { Readable } from "node:stream"; import { createGzip } from "node:zlib"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { compressStream } from "./compressStream"; vi.mock("zlib"); describe(compressStream.name, () => { const getGenerator = (chunks: string[]) => async function* generator() { for (const chunk of chunks) { yield chunk; } }; const testInputStream = Readable.from(getGenerator(["input"])()); const mockGzipFn = vi.fn(); const testOutputStream = Readable.from(getGenerator(["input", "gzipped"])()); beforeEach(() => { vi.mocked(createGzip).mockReturnValue(mockGzipFn as any); testInputStream.pipe = vi.fn().mockReturnValue(testOutputStream); }); afterEach(() => { vi.clearAllMocks(); }); it("should compress a readable stream using gzip", async () => { const outputStream = await compressStream(testInputStream); expect(outputStream).toBeInstanceOf(Readable); expect(outputStream).toBe(testOutputStream); expect(testInputStream.pipe).toHaveBeenCalledTimes(1); expect(testInputStream.pipe).toHaveBeenCalledWith(mockGzipFn); expect(createGzip).toHaveBeenCalledTimes(1); }); it("should throw an error if compression fails", async () => { const compressionErrorMsg = "compression error message"; const compressionError = new Error(compressionErrorMsg); vi.mocked(createGzip).mockImplementationOnce(() => { throw compressionError; }); await expect(compressStream(testInputStream)).rejects.toThrow(compressionError); expect(createGzip).toHaveBeenCalledTimes(1); expect(testInputStream.pipe).not.toHaveBeenCalled(); }); }); ================================================ FILE: packages/middleware-compression/src/compressStream.ts ================================================ import type { Readable } from "node:stream"; import { createGzip } from "node:zlib"; export const compressStream = async (body: Readable): Promise => body.pipe(createGzip()); ================================================ FILE: packages/middleware-compression/src/compressString.browser.spec.ts ================================================ import { toUint8Array } from "@smithy/core/serde"; import { gzip } from "fflate"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { compressString } from "./compressString.browser"; vi.mock("@smithy/core/serde"); vi.mock("fflate"); describe(compressString.name, () => { const testData = "test"; const compressionSuffix = "compressed"; const compressionSeparator = "."; beforeEach(() => { vi.mocked(toUint8Array).mockImplementation((data) => data as any); }); afterEach(() => { vi.clearAllMocks(); }); it("should compress data with gzip", async () => { vi.mocked(gzip).mockImplementation(((data: any, callback: any) => { callback(null, [data, compressionSuffix].join(compressionSeparator)); }) as any); const receivedOutput = await compressString(testData); const expectedOutput = [testData, compressionSuffix].join(compressionSeparator); expect(receivedOutput).toEqual(expectedOutput); expect(gzip).toHaveBeenCalledTimes(1); expect(gzip).toHaveBeenCalledWith(testData, expect.any(Function)); expect(toUint8Array).toHaveBeenCalledTimes(1); expect(toUint8Array).toHaveBeenCalledWith(testData); }); it("should throw an error if compression fails", async () => { const compressionErrorMsg = "compression error message"; const compressionError = new Error(compressionErrorMsg); vi.mocked(gzip).mockImplementation(((data: any, callback: any) => { callback(compressionError); }) as any); await expect(compressString(testData)).rejects.toThrow( new Error("Failure during compression: " + compressionErrorMsg) ); expect(gzip).toHaveBeenCalledTimes(1); expect(gzip).toHaveBeenCalledWith(testData, expect.any(Function)); expect(toUint8Array).toHaveBeenCalledTimes(1); expect(toUint8Array).toHaveBeenCalledWith(testData); }); }); ================================================ FILE: packages/middleware-compression/src/compressString.browser.ts ================================================ import { toUint8Array } from "@smithy/core/serde"; import { gzip } from "fflate"; export const compressString = async (body: any): Promise => new Promise((resolve, reject) => { gzip(toUint8Array(body || ""), (err, data) => { if (err) { reject(new Error("Failure during compression: " + err.message)); } else { resolve(data); } }); }); ================================================ FILE: packages/middleware-compression/src/compressString.spec.ts ================================================ import { gzip } from "node:zlib"; import { toUint8Array } from "@smithy/core/serde"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { compressString } from "./compressString"; const compressionSuffix = "compressed"; const compressionSeparator = "."; vi.mock("@smithy/core/serde"); vi.mock("util", () => ({ promisify: vi.fn().mockImplementation((fn) => fn) })); vi.mock("zlib", () => ({ gzip: vi.fn().mockImplementation((data) => [data, compressionSuffix].join(compressionSeparator)), })); describe(compressString.name, () => { const testData = "test"; beforeEach(() => { vi.mocked(toUint8Array).mockImplementation((data: any) => data); }); afterEach(() => { vi.clearAllMocks(); }); it("should compress data with gzip", async () => { const receivedOutput = await compressString(testData); const expectedOutput = [testData, compressionSuffix].join(compressionSeparator); expect(receivedOutput).toEqual(expectedOutput); expect(gzip).toHaveBeenCalledTimes(1); expect(gzip).toHaveBeenCalledWith(testData); expect(toUint8Array).toHaveBeenCalledTimes(2); expect(toUint8Array).toHaveBeenNthCalledWith(1, testData); expect(toUint8Array).toHaveBeenNthCalledWith(2, expectedOutput); }); it("should throw an error if compression fails", async () => { const compressionErrorMsg = "compression error message"; const compressionError = new Error(compressionErrorMsg); (gzip as unknown as any).mockImplementationOnce(() => { throw compressionError; }); await expect(compressString(testData)).rejects.toThrow( new Error("Failure during compression: " + compressionErrorMsg) ); expect(gzip).toHaveBeenCalledTimes(1); expect(gzip).toHaveBeenCalledWith(testData); expect(toUint8Array).toHaveBeenCalledTimes(1); expect(toUint8Array).toHaveBeenCalledWith(testData); }); }); ================================================ FILE: packages/middleware-compression/src/compressString.ts ================================================ import { promisify } from "node:util"; import { gzip } from "node:zlib"; import { toUint8Array } from "@smithy/core/serde"; const gzipAsync = promisify(gzip); export const compressString = async (body: any): Promise => { // Only gzip shall be supported initial release. try { const compressedBuffer = await gzipAsync(toUint8Array(body || "")); return toUint8Array(compressedBuffer); } catch (err) { throw new Error("Failure during compression: " + err.message); } }; ================================================ FILE: packages/middleware-compression/src/compressionMiddleware.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { compressStream } from "./compressStream"; import { compressString } from "./compressString"; import { compressionMiddleware } from "./compressionMiddleware"; import { CompressionAlgorithm } from "./constants"; import { isStreaming } from "./isStreaming"; vi.mock("@smithy/core/protocols"); vi.mock("./compressString"); vi.mock("./compressStream"); vi.mock("./isStreaming"); describe(compressionMiddleware.name, () => { const mockBody = "body"; const mockConfig = { bodyLengthChecker: vi.fn().mockReturnValue(mockBody.length), disableRequestCompression: async () => false, requestMinCompressionSizeBytes: async () => 0, }; const mockMiddlewareConfig = { encodings: [CompressionAlgorithm.GZIP], }; const mockNext = vi.fn(); const mockContext = {}; const mockArgs = { request: { headers: {}, body: mockBody } }; afterEach(() => { vi.clearAllMocks(); }); it("skips compression if it's not an HttpRequest", async () => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValue(false); await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith(mockArgs); }); describe("HttpRequest", () => { beforeEach(() => { const { isInstance } = HttpRequest; (isInstance as unknown as any).mockReturnValue(true); vi.mocked(isStreaming).mockReturnValue(false); }); it("skips compression if disabled", async () => { await compressionMiddleware({ ...mockConfig, disableRequestCompression: async () => true }, mockMiddlewareConfig)( mockNext, mockContext )({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith(mockArgs); }); it("skips compression if encodings are not provided", async () => { await compressionMiddleware(mockConfig, { encodings: [] })(mockNext, mockContext)({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith(mockArgs); }); it("skips compression if encodings are not supported", async () => { await compressionMiddleware(mockConfig, { encodings: ["brotli"] })(mockNext, mockContext)({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith(mockArgs); }); describe("streaming", () => { beforeEach(() => { vi.mocked(isStreaming).mockReturnValue(true); }); it("throws error if streaming blob requires length", async () => { await expect( compressionMiddleware(mockConfig, { ...mockMiddlewareConfig, streamRequiresLength: true })( mockNext, mockContext )({ ...mockArgs } as any) ).rejects.toThrow("Compression is not supported for streaming blobs that require a length."); expect(isStreaming).toHaveBeenCalledTimes(1); expect(isStreaming).toHaveBeenCalledWith(mockBody); expect(mockNext).not.toHaveBeenCalled(); }); it("compresses streaming blob", async () => { const mockCompressedStream = "compressed-stream" as any; vi.mocked(compressStream).mockResolvedValueOnce(mockCompressedStream); await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs } as any); expect(isStreaming).toHaveBeenCalledTimes(1); expect(isStreaming).toHaveBeenCalledWith(mockBody); expect(mockNext).toHaveBeenCalledWith({ ...mockArgs, request: { ...mockArgs.request, body: mockCompressedStream, headers: { ...mockArgs.request.headers, "content-encoding": "gzip", }, }, }); expect(compressStream).toHaveBeenCalledTimes(1); expect(compressStream).toHaveBeenCalledWith(mockBody); }); }); describe("not streaming", () => { it("skips compression if body is smaller than min size", async () => { await compressionMiddleware( { ...mockConfig, requestMinCompressionSizeBytes: async () => mockBody.length + 1 }, mockMiddlewareConfig )( mockNext, mockContext )({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith(mockArgs); }); it("compresses body", async () => { const mockCompressedBody = "compressed-body" as any; vi.mocked(compressString).mockResolvedValueOnce(mockCompressedBody); await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs } as any); expect(mockNext).toHaveBeenCalledWith({ ...mockArgs, request: { ...mockArgs.request, body: mockCompressedBody, headers: { ...mockArgs.request.headers, "content-encoding": "gzip", }, }, }); expect(compressString).toHaveBeenCalledTimes(1); expect(compressString).toHaveBeenCalledWith(mockBody); }); it("appends algorithm to existing Content-Encoding header", async () => { const mockCompressedBody = "compressed-body" as any; vi.mocked(compressString).mockResolvedValueOnce(mockCompressedBody); const mockExistingContentEncoding = "deflate"; await compressionMiddleware(mockConfig, mockMiddlewareConfig)(mockNext, mockContext)({ ...mockArgs, request: { ...mockArgs.request, headers: { "content-encoding": mockExistingContentEncoding, }, }, } as any); expect(mockNext).toHaveBeenCalledWith({ ...mockArgs, request: { ...mockArgs.request, body: mockCompressedBody, headers: { ...mockArgs.request.headers, "content-encoding": [mockExistingContentEncoding, "gzip"].join(", "), }, }, }); expect(compressString).toHaveBeenCalledTimes(1); expect(compressString).toHaveBeenCalledWith(mockBody); }); }); }); }); ================================================ FILE: packages/middleware-compression/src/compressionMiddleware.ts ================================================ import { setFeature } from "@smithy/core"; import { HttpRequest } from "@smithy/core/protocols"; import type { AbsoluteLocation, BuildHandler, BuildHandlerArguments, BuildHandlerOptions, BuildHandlerOutput, BuildMiddleware, HandlerExecutionContext, MetadataBearer, } from "@smithy/types"; import { compressStream } from "./compressStream"; import { compressString } from "./compressString"; import type { CompressionPreviouslyResolved, CompressionResolvedConfig } from "./configurations"; import { CLIENT_SUPPORTED_ALGORITHMS, type CompressionAlgorithm } from "./constants"; import { isStreaming } from "./isStreaming"; /** * @internal */ export interface CompressionMiddlewareConfig { /** * Defines the priority-ordered list of compression algorithms supported by the service operation. */ encodings: string[]; /** * Indicates that the streaming blob MUST be finite and have a known size when sending data from a client to a server. * Populated if smithy requiresLength is set https://smithy.io/2.0/spec/streaming.html#requireslength-trait */ streamRequiresLength?: boolean; } /** * @internal */ export const compressionMiddleware = ( config: CompressionResolvedConfig & CompressionPreviouslyResolved, middlewareConfig: CompressionMiddlewareConfig ): BuildMiddleware => ( next: BuildHandler, context: HandlerExecutionContext ): BuildHandler => async (args: BuildHandlerArguments): Promise> => { if (!HttpRequest.isInstance(args.request)) { return next(args); } const disableRequestCompression = await config.disableRequestCompression(); if (disableRequestCompression) { return next(args); } const { request } = args; const { body, headers } = request; const { encodings, streamRequiresLength } = middlewareConfig; let updatedBody = body; let updatedHeaders = headers; for (const algorithm of encodings) { if (CLIENT_SUPPORTED_ALGORITHMS.includes(algorithm as CompressionAlgorithm)) { let isRequestCompressed = false; if (isStreaming(body)) { if (!streamRequiresLength) { updatedBody = await compressStream(body); isRequestCompressed = true; } else { // Invalid case. We should never get here. throw new Error("Compression is not supported for streaming blobs that require a length."); } } else { const bodyLength = config.bodyLengthChecker(body); const requestMinCompressionSizeBytes = await config.requestMinCompressionSizeBytes(); if (bodyLength && bodyLength >= requestMinCompressionSizeBytes) { updatedBody = await compressString(body); isRequestCompressed = true; } } if (isRequestCompressed) { // Either append to the header if it already exists, else set it if (headers["content-encoding"]) { updatedHeaders = { ...headers, "content-encoding": `${headers["content-encoding"]}, ${algorithm}`, }; } else { updatedHeaders = { ...headers, "content-encoding": algorithm }; } if (updatedHeaders["content-encoding"].includes("gzip")) { setFeature(context, "GZIP_REQUEST_COMPRESSION", "L"); } // We've matched on one supported algorithm in the // priority-ordered list, so we're finished. break; } } } return next({ ...args, request: { ...request, body: updatedBody, headers: updatedHeaders, }, }); }; export const compressionMiddlewareOptions: BuildHandlerOptions & AbsoluteLocation = { name: "compressionMiddleware", step: "build", tags: ["REQUEST_BODY_COMPRESSION", "GZIP"], override: true, priority: "high", }; ================================================ FILE: packages/middleware-compression/src/configurations.ts ================================================ import type { BodyLengthCalculator, Provider } from "@smithy/types"; /** * @public */ export interface CompressionInputConfig { /** * Whether to disable request compression. */ disableRequestCompression?: boolean | Provider; /** * The minimum size in bytes that a request body should be to trigger compression. * The value must be a non-negative integer value between 0 and 10485760 bytes inclusive. */ requestMinCompressionSizeBytes?: number | Provider; } /** * @internal */ export interface CompressionPreviouslyResolved { /** * A function that can calculate the length of a body. */ bodyLengthChecker: BodyLengthCalculator; } /** * @internal */ export interface CompressionResolvedConfig { /** * Resolved value for input config {@link CompressionInputConfig.disableRequestCompression} */ disableRequestCompression: Provider; /** * Resolved value for input config {@link CompressionInputConfig.requestMinCompressionSizeBytes} */ requestMinCompressionSizeBytes: Provider; } ================================================ FILE: packages/middleware-compression/src/constants.ts ================================================ /** * Compression Algorithms supported by the SDK. */ export enum CompressionAlgorithm { GZIP = "gzip", } export const CLIENT_SUPPORTED_ALGORITHMS: CompressionAlgorithm[] = [CompressionAlgorithm.GZIP]; ================================================ FILE: packages/middleware-compression/src/getCompressionPlugin.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { compressionMiddleware, compressionMiddlewareOptions } from "./compressionMiddleware"; import { getCompressionPlugin } from "./getCompressionPlugin"; vi.mock("./compressionMiddleware"); describe(getCompressionPlugin.name, () => { const config = { bodyLengthChecker: vi.fn(), disableRequestCompression: async () => false, requestMinCompressionSizeBytes: async () => 0, }; const middlewareConfig = { encodings: [] }; it("applyToStack adds compressionMiddleware", () => { const middlewareReturn = {} as any; vi.mocked(compressionMiddleware).mockReturnValueOnce(middlewareReturn); const plugin = getCompressionPlugin(config, middlewareConfig); const commandStack = { add: vi.fn() }; // @ts-ignore plugin.applyToStack(commandStack); expect(commandStack.add).toHaveBeenCalledWith(middlewareReturn, compressionMiddlewareOptions); expect(compressionMiddleware).toHaveBeenCalled(); expect(compressionMiddleware).toHaveBeenCalledWith(config, middlewareConfig); }); }); ================================================ FILE: packages/middleware-compression/src/getCompressionPlugin.ts ================================================ import type { Pluggable } from "@smithy/types"; import { compressionMiddleware, compressionMiddlewareOptions, type CompressionMiddlewareConfig, } from "./compressionMiddleware"; import type { CompressionPreviouslyResolved, CompressionResolvedConfig } from "./configurations"; /** * @internal */ export const getCompressionPlugin = ( config: CompressionResolvedConfig & CompressionPreviouslyResolved, middlewareConfig: CompressionMiddlewareConfig ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.add(compressionMiddleware(config, middlewareConfig), compressionMiddlewareOptions); }, }); ================================================ FILE: packages/middleware-compression/src/index.ts ================================================ export * from "./NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS"; export * from "./NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS"; export * from "./compressionMiddleware"; export * from "./configurations"; export * from "./getCompressionPlugin"; export * from "./resolveCompressionConfig"; ================================================ FILE: packages/middleware-compression/src/isStreaming.spec.ts ================================================ import { isArrayBuffer } from "@smithy/core/serde"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { isStreaming } from "./isStreaming"; vi.mock("@smithy/core/serde"); describe(isStreaming.name, () => { beforeEach(() => { (isArrayBuffer as unknown as any).mockReturnValue(true); }); afterEach(() => { vi.clearAllMocks(); }); it("returns true when body is a stream", () => { (isArrayBuffer as unknown as any).mockReturnValue(false); // Mocking {} as a stream const mockStream = {}; expect(isStreaming(mockStream)).toBe(true); expect(isArrayBuffer).toHaveBeenCalledTimes(1); expect(isArrayBuffer).toHaveBeenCalledWith(mockStream); }); describe("returns false when body is", () => { it.each([undefined, "str"])("special case: %s", (val) => { expect(isStreaming(val)).toBe(false); expect(isArrayBuffer).not.toHaveBeenCalled(); }); it.each([null, true, 1])("primitive data type: %s", (val) => { expect(isStreaming(val)).toBe(false); expect(isArrayBuffer).toHaveBeenCalledTimes(1); expect(isArrayBuffer).toHaveBeenCalledWith(val); }); const buffer = new ArrayBuffer(4); const arr = [...Array(4).keys()]; const addPointOne = (num: number) => num + 0.1; it.each([ Buffer.from(buffer), new DataView(buffer), new Int8Array(arr), new Uint8Array(arr), new Uint8ClampedArray(arr), new Int16Array(arr), new Uint16Array(arr), new Int32Array(arr), new Uint32Array(arr), new Float32Array(arr.map(addPointOne)), new Float64Array(arr.map(addPointOne)), new BigInt64Array(arr.map(BigInt)), new BigUint64Array(arr.map(BigInt)), ])("ArrayBuffer View: %s", (arrayBufferView) => { expect(isStreaming(arrayBufferView)).toBe(false); expect(isArrayBuffer).not.toHaveBeenCalled(); }); }); }); ================================================ FILE: packages/middleware-compression/src/isStreaming.ts ================================================ import { isArrayBuffer } from "@smithy/core/serde"; /** * Returns true if the given value is a streaming response. */ export const isStreaming = (body: unknown) => body !== undefined && typeof body !== "string" && !ArrayBuffer.isView(body) && !isArrayBuffer(body); ================================================ FILE: packages/middleware-compression/src/resolveCompressionConfig.spec.ts ================================================ import { describe, expect, test as it, vi } from "vitest"; import { resolveCompressionConfig } from "./resolveCompressionConfig"; describe(resolveCompressionConfig.name, () => { const mockConfig = { bodyLengthChecker: vi.fn(), disableRequestCompression: false, requestMinCompressionSizeBytes: 0, }; it("maintains object custody", () => { const input = { disableRequestCompression: false, requestMinCompressionSizeBytes: 10_000, }; expect(resolveCompressionConfig(input)).toBe(input); }); it("should throw an error if requestMinCompressionSizeBytes is less than 0", async () => { const requestMinCompressionSizeBytes = -1; const resolvedConfig = resolveCompressionConfig({ ...mockConfig, requestMinCompressionSizeBytes }); await expect(resolvedConfig.requestMinCompressionSizeBytes()).rejects.toThrow( new RangeError( "The value for requestMinCompressionSizeBytes must be between 0 and 10485760 inclusive. " + `The provided value ${requestMinCompressionSizeBytes} is outside this range."` ) ); }); it("should throw an error if requestMinCompressionSizeBytes is greater than 10485760", async () => { const requestMinCompressionSizeBytes = 10485761; const resolvedConfig = resolveCompressionConfig({ ...mockConfig, requestMinCompressionSizeBytes }); await expect(resolvedConfig.requestMinCompressionSizeBytes()).rejects.toThrow( new RangeError( "The value for requestMinCompressionSizeBytes must be between 0 and 10485760 inclusive. " + `The provided value ${requestMinCompressionSizeBytes} is outside this range."` ) ); }); it.each([0, 10240, 10485760])( "returns requestMinCompressionSizeBytes value %s", async (requestMinCompressionSizeBytes) => { const inputConfig = { ...mockConfig, requestMinCompressionSizeBytes }; const resolvedConfig = resolveCompressionConfig(inputConfig); await expect(resolvedConfig.requestMinCompressionSizeBytes()).resolves.toEqual(requestMinCompressionSizeBytes); } ); it.each([false, true])("returns disableRequestCompression value %s", async (disableRequestCompression) => { const inputConfig = { ...mockConfig, disableRequestCompression }; const resolvedConfig = resolveCompressionConfig(inputConfig); await expect(resolvedConfig.disableRequestCompression()).resolves.toEqual(disableRequestCompression); }); }); ================================================ FILE: packages/middleware-compression/src/resolveCompressionConfig.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import type { CompressionInputConfig, CompressionResolvedConfig } from "./configurations"; /** * @internal */ export const resolveCompressionConfig = ( input: T & Required ): T & CompressionResolvedConfig => { const { disableRequestCompression, requestMinCompressionSizeBytes: _requestMinCompressionSizeBytes } = input; return Object.assign(input, { disableRequestCompression: normalizeProvider(disableRequestCompression), requestMinCompressionSizeBytes: async () => { const requestMinCompressionSizeBytes = await normalizeProvider(_requestMinCompressionSizeBytes)(); // The requestMinCompressionSizeBytes should be less than the upper limit for API Gateway // https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-openapi-minimum-compression-size.html if (requestMinCompressionSizeBytes < 0 || requestMinCompressionSizeBytes > 10485760) { throw new RangeError( "The value for requestMinCompressionSizeBytes must be between 0 and 10485760 inclusive. " + `The provided value ${requestMinCompressionSizeBytes} is outside this range."` ); } return requestMinCompressionSizeBytes; }, }); }; ================================================ FILE: packages/middleware-compression/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-compression/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-compression/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-compression/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/middleware-content-length/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/middleware-content-length/CHANGELOG.md ================================================ # @smithy/middleware-content-length ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/middleware-content-length/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-content-length/package.json ================================================ { "name": "@smithy/middleware-content-length", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-content-length", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-content-length" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-content-length/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { contentLengthMiddleware, contentLengthMiddlewareOptions, getContentLengthPlugin, } from "@smithy/core/protocols"; ================================================ FILE: packages/middleware-content-length/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-content-length/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-content-length/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-endpoint/CHANGELOG.md ================================================ # @smithy/middleware-endpoint ## 4.5.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.5.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.5.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.5.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - 9194e9f: consolidate into core/endpoints - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/middleware-endpoint/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-endpoint/package.json ================================================ { "name": "@smithy/middleware-endpoint", "version": "4.5.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-endpoint", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-endpoint" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-endpoint/src/index.ts ================================================ /** @deprecated Use @smithy/core/endpoints instead. */ export { getEndpointFromInstructions, resolveParams, toEndpointV1, endpointMiddleware, endpointMiddlewareOptions, getEndpointPlugin, resolveEndpointConfig, resolveEndpointRequiredConfig, } from "@smithy/core/endpoints"; export type { EndpointInputConfig, EndpointResolvedConfig, EndpointRequiredInputConfig, EndpointRequiredResolvedConfig, EndpointParameterInstructions, EndpointParameterInstructionsSupplier, BuiltInParamInstruction, ClientContextParamInstruction, ContextParamInstruction, OperationContextParamInstruction, StaticContextParamInstruction, } from "@smithy/core/endpoints"; ================================================ FILE: packages/middleware-endpoint/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-endpoint/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-endpoint/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-retry/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/middleware-retry/CHANGELOG.md ================================================ # @smithy/middleware-retry ## 4.6.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.6.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.6.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.6.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/middleware-retry/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-retry/package.json ================================================ { "name": "@smithy/middleware-retry", "version": "4.6.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-retry", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-retry" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-retry/src/index.ts ================================================ /** @deprecated Use @smithy/core/retry instead. */ export { DeprecatedAdaptiveRetryStrategy as AdaptiveRetryStrategy, DeprecatedStandardRetryStrategy as StandardRetryStrategy, CONFIG_MAX_ATTEMPTS, CONFIG_RETRY_MODE, ENV_MAX_ATTEMPTS, ENV_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, defaultDelayDecider, defaultRetryDecider, getOmitRetryHeadersPlugin, getRetryAfterHint, getRetryPlugin, omitRetryHeadersMiddleware, omitRetryHeadersMiddlewareOptions, resolveRetryConfig, retryMiddleware, retryMiddlewareOptions, } from "@smithy/core/retry"; export type { DeprecatedAdaptiveRetryStrategyOptions as AdaptiveRetryStrategyOptions, DeprecatedStandardRetryStrategyOptions as StandardRetryStrategyOptions, RetryInputConfig, RetryResolvedConfig, PreviouslyResolved, } from "@smithy/core/retry"; ================================================ FILE: packages/middleware-retry/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "noUnusedLocals": true, "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-retry/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "noUnusedLocals": true, "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-retry/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-serde/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/middleware-serde/CHANGELOG.md ================================================ # @smithy/middleware-serde ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/middleware-serde/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-serde/package.json ================================================ { "name": "@smithy/middleware-serde", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-serde", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-serde" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-serde/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { deserializerMiddleware, deserializerMiddlewareOption, serializerMiddlewareOption, type V1OrV2Endpoint, getSerdePlugin, serializerMiddleware, } from "@smithy/core/serde"; ================================================ FILE: packages/middleware-serde/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-serde/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-serde/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/middleware-stack/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/middleware-stack/CHANGELOG.md ================================================ # @smithy/middleware-stack ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/middleware-stack/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/middleware-stack/package.json ================================================ { "name": "@smithy/middleware-stack", "version": "4.3.3", "description": "Provides a means for composing multiple middleware functions into a single handler", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "email": "", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/middleware-stack", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/middleware-stack" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/middleware-stack/src/index.ts ================================================ /** @deprecated Use @smithy/core/client instead. */ export { constructStack } from "@smithy/core/client"; ================================================ FILE: packages/middleware-stack/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/middleware-stack/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/middleware-stack/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/node-config-provider/CHANGELOG.md ================================================ # @smithy/node-config-provider ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/node-config-provider/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/node-config-provider/package.json ================================================ { "name": "@smithy/node-config-provider", "version": "4.4.3", "description": "Load config default values from ini config files and environmental variable", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "email": "", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/node-config-provider", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/node-config-provider" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/node-config-provider/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { loadConfig, type LocalConfigOptions, type LoadedConfigSelectors, type NodeSharedConfigInit as SharedConfigInit, } from "@smithy/core/config"; export type { EnvOptions, GetterFromEnv } from "@smithy/core/config"; ================================================ FILE: packages/node-config-provider/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/node-config-provider/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/node-config-provider/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/node-http-handler/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/node-http-handler/CHANGELOG.md ================================================ # Change Log ## 4.7.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 4.7.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.7.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.7.0 ### Minor Changes - 9194e9f: consolidate into core/endpoints ### Patch Changes - da4e89e: Avoid array allocation in header transform - 5329323: Remove empty object allocation in hot paths - 09093fb: Support passing options through to Node's http2.connect - 75603d4: Replace timeouts array with individual variables - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 4.6.1 ### Patch Changes - 769ed47: update http2 session closure to prefer session.close() on goaway rather than immediately invoking session.destroy() ## 4.6.0 ### Minor Changes - 60d13c8: adds ref-counting logic for http2 sessions in the client connection pool. ## 4.5.3 ### Patch Changes - 131fce4: add eventStream indicator signal for NodeHttp2ConnectionManager so it does not reuse connections for event streams - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/protocol-http@5.3.14 - @smithy/querystring-builder@4.2.14 ## 4.5.2 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 - @smithy/querystring-builder@4.2.13 ## 4.5.1 ### Patch Changes - fac1a34: Move `@smithy/abort-controller` to devDeps ## 4.5.0 ### Minor Changes - 4e7fa38: defer loading of node:http module ## 4.4.16 ### Patch Changes - dab22f1: fix: do not return caller's Error directly from buildAbortError Always create a new mutable Error when the abort reason is an Error, preserving the original via `.cause`. Fixes TypeError when retry middleware tries to set `$metadata` on a frozen/sealed abort reason. ## 4.4.15 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/abort-controller@4.2.12 - @smithy/protocol-http@5.3.12 - @smithy/querystring-builder@4.2.12 ## 4.4.14 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/querystring-builder@4.2.11 - @smithy/abort-controller@4.2.11 - @smithy/protocol-http@5.3.11 ## 4.4.13 ### Patch Changes - 9bf9ae2: fix: reject aborted requests with AbortSignal.reason instead of a generic Error ## 4.4.12 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/abort-controller@4.2.10 - @smithy/protocol-http@5.3.10 - @smithy/querystring-builder@4.2.10 ## 4.4.11 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/abort-controller@4.2.9 - @smithy/protocol-http@5.3.9 - @smithy/querystring-builder@4.2.9 - @smithy/types@4.12.1 ## 4.4.10 ### Patch Changes - f6f0de9: write request.end() with no arg if empty buffer ## 4.4.9 ### Patch Changes - 3ee4e66: Use configured logger when provided. ## 4.4.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/abort-controller@4.2.8 - @smithy/protocol-http@5.3.8 - @smithy/querystring-builder@4.2.8 ## 4.4.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/abort-controller@4.2.7 - @smithy/protocol-http@5.3.7 - @smithy/querystring-builder@4.2.7 ## 4.4.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/abort-controller@4.2.6 - @smithy/protocol-http@5.3.6 - @smithy/querystring-builder@4.2.6 ## 4.4.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/abort-controller@4.2.5 - @smithy/protocol-http@5.3.5 - @smithy/querystring-builder@4.2.5 ## 4.4.4 ### Patch Changes - df00095: skip body write delay when http Agent is externally owned - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/abort-controller@4.2.4 - @smithy/protocol-http@5.3.4 - @smithy/querystring-builder@4.2.4 ## 4.4.3 ### Patch Changes - 344d06a: shfit http1 calls with expect 100-continue header to isolated http Agents ## 4.4.2 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/abort-controller@4.2.3 - @smithy/protocol-http@5.3.3 - @smithy/querystring-builder@4.2.3 ## 4.4.1 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/abort-controller@4.2.2 - @smithy/protocol-http@5.3.2 - @smithy/querystring-builder@4.2.2 ## 4.4.0 ### Minor Changes - 761d89c: undeprecate socketTimeout for node:https requests ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/abort-controller@4.2.1 - @smithy/protocol-http@5.3.1 - @smithy/querystring-builder@4.2.1 ## 4.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/abort-controller@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/querystring-builder@4.2.0 - @smithy/types@4.6.0 ## 4.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/abort-controller@4.1.1 - @smithy/protocol-http@5.2.1 - @smithy/querystring-builder@4.1.1 ## 4.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/querystring-builder@4.1.0 - @smithy/abort-controller@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/types@4.4.0 ## 4.1.1 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/abort-controller@4.0.5 - @smithy/protocol-http@5.1.3 - @smithy/querystring-builder@4.0.5 ## 4.1.0 ### Minor Changes - c4e923a: per-request timeouts support ## 4.0.6 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/abort-controller@4.0.4 - @smithy/protocol-http@5.1.2 - @smithy/querystring-builder@4.0.4 ## 4.0.5 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/abort-controller@4.0.3 - @smithy/protocol-http@5.1.1 - @smithy/querystring-builder@4.0.3 ## 4.0.4 ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 - @smithy/abort-controller@4.0.2 - @smithy/querystring-builder@4.0.2 ## 4.0.3 ### Patch Changes - 54d2416: Fix constructor socketAcquisitionWarningTimeout does not work - fba050c: Clear obsolete timeout handlers from socket. ## 4.0.2 ### Patch Changes - fbd06eb: fix sending request when 100 Continue response takes more than 1 second ## 4.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/abort-controller@4.0.1 - @smithy/protocol-http@5.0.1 - @smithy/querystring-builder@4.0.1 ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/abort-controller@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/querystring-builder@4.0.0 - @smithy/types@4.0.0 ## 3.3.3 ### Patch Changes - 5e73108: fix delayed calling of setTimeout on requests ## 3.3.2 ### Patch Changes - f4e1a45: skip sending body without waiting for a timeout on response, if "expect" request header with "100-continue" is provided - a257792: Added context binding to the setTimeout and clearTimeout functions - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/abort-controller@3.1.9 - @smithy/protocol-http@4.1.8 - @smithy/querystring-builder@3.0.11 ## 3.3.1 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/abort-controller@3.1.8 - @smithy/protocol-http@4.1.7 - @smithy/querystring-builder@3.0.10 ## 3.3.0 ### Minor Changes - cd1929b: vitest compatibility ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/abort-controller@3.1.7 - @smithy/protocol-http@4.1.6 - @smithy/querystring-builder@3.0.9 ## 3.2.5 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/abort-controller@3.1.6 - @smithy/protocol-http@4.1.5 - @smithy/querystring-builder@3.0.8 ## 3.2.4 ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/abort-controller@3.1.5 - @smithy/protocol-http@4.1.4 - @smithy/querystring-builder@3.0.7 ## 3.2.3 ### Patch Changes - 08fbedf: remove brackets from hostname ## 3.2.2 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/abort-controller@3.1.4 - @smithy/protocol-http@4.1.3 - @smithy/querystring-builder@3.0.6 ## 3.2.1 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/abort-controller@3.1.3 - @smithy/protocol-http@4.1.2 - @smithy/querystring-builder@3.0.5 ## 3.2.0 ### Minor Changes - c86a02c: defer socket event listeners for node:http ### Patch Changes - 5510e83: call socket operations if socket is present in deferred listeners - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/abort-controller@3.1.2 - @smithy/protocol-http@4.1.1 - @smithy/querystring-builder@3.0.4 ## 3.1.4 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 3.1.3 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 3.1.2 ### Patch Changes - f31cc5f: remove abort signal event listeners after request completion ## 3.1.1 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/abort-controller@3.1.1 - @smithy/protocol-http@4.0.3 - @smithy/querystring-builder@3.0.3 ## 3.1.0 ### Minor Changes - c16e014: add logger option to node-http-handler parameters, clear socket usage check timeout on error - c2a5595: use platform AbortController|AbortSignal implementations ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/abort-controller@3.1.0 - @smithy/protocol-http@4.0.2 - @smithy/querystring-builder@3.0.2 ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/abort-controller@3.0.1 - @smithy/protocol-http@4.0.1 - @smithy/querystring-builder@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Minor Changes - 3500f341: handle web streams in streamCollector and sdkStreamMixin ### Patch Changes - e76e736b: improve stream collection speed - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/querystring-builder@3.0.0 - @smithy/abort-controller@3.0.0 - @smithy/protocol-http@4.0.0 ## 2.5.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/querystring-builder@2.2.0 - @smithy/abort-controller@2.2.0 - @smithy/protocol-http@3.3.0 - @smithy/types@2.12.0 ## 2.4.3 ### Patch Changes - 511206e5: reduce buffer copies ## 2.4.2 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/abort-controller@2.1.4 - @smithy/protocol-http@3.2.2 - @smithy/querystring-builder@2.1.4 ## 2.4.1 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/abort-controller@2.1.3 - @smithy/protocol-http@3.2.1 - @smithy/querystring-builder@2.1.3 ## 2.4.0 ### Minor Changes - d70a00ac: allow ctor args in lieu of Agent instances in node-http-handler ctor - 1e23f967: add socket exhaustion checked warning to node-http-handler ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 - @smithy/abort-controller@2.1.2 - @smithy/querystring-builder@2.1.2 ## 2.3.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/abort-controller@2.1.1 - @smithy/protocol-http@3.1.1 - @smithy/querystring-builder@2.1.1 - @smithy/types@2.9.1 ## 2.3.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/querystring-builder@2.1.0 - @smithy/abort-controller@2.1.0 - @smithy/protocol-http@3.1.0 - @smithy/types@2.9.0 ## 2.2.2 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/abort-controller@2.0.16 - @smithy/protocol-http@3.0.12 - @smithy/querystring-builder@2.0.16 ## 2.2.1 ### Patch Changes - e2e3f7d5: align ctor and static creation signatures for http handlers ## 2.2.0 ### Minor Changes - 340634a5: move default fetch and http handler ctor types to the types package ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/abort-controller@2.0.15 - @smithy/protocol-http@3.0.11 - @smithy/querystring-builder@2.0.15 ## 2.1.10 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/abort-controller@2.0.14 - @smithy/protocol-http@3.0.10 - @smithy/querystring-builder@2.0.14 ## 2.1.9 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/abort-controller@2.0.13 - @smithy/protocol-http@3.0.9 - @smithy/querystring-builder@2.0.13 ## 2.1.8 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/abort-controller@2.0.12 - @smithy/protocol-http@3.0.8 - @smithy/querystring-builder@2.0.12 ## 2.1.7 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/abort-controller@2.0.11 - @smithy/protocol-http@3.0.7 - @smithy/querystring-builder@2.0.11 ## 2.1.6 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/abort-controller@2.0.10 - @smithy/protocol-http@3.0.6 - @smithy/querystring-builder@2.0.10 ## 2.1.5 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/abort-controller@2.0.9 - @smithy/protocol-http@3.0.5 - @smithy/querystring-builder@2.0.9 ## 2.1.4 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/abort-controller@2.0.8 - @smithy/protocol-http@3.0.4 - @smithy/querystring-builder@2.0.8 ## 2.1.3 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/abort-controller@2.0.7 - @smithy/protocol-http@3.0.3 - @smithy/querystring-builder@2.0.7 ## 2.1.2 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 2.1.1 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 2.1.0 ### Minor Changes - a03026e3: Add http client component to runtime extension ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 - @smithy/abort-controller@2.0.6 - @smithy/querystring-builder@2.0.6 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/abort-controller@2.0.5 - @smithy/protocol-http@2.0.5 - @smithy/querystring-builder@2.0.5 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/abort-controller@2.0.4 - @smithy/protocol-http@2.0.4 - @smithy/querystring-builder@2.0.4 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/abort-controller@2.0.3 - @smithy/protocol-http@2.0.3 - @smithy/querystring-builder@2.0.3 ## 2.0.2 ### Patch Changes - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/abort-controller@2.0.2 - @smithy/protocol-http@2.0.2 - @smithy/querystring-builder@2.0.2 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/abort-controller@2.0.1 - @smithy/protocol-http@2.0.1 - @smithy/querystring-builder@2.0.1 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/abort-controller@2.0.0 - @smithy/protocol-http@2.0.0 - @smithy/querystring-builder@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/abort-controller@1.1.0 - @smithy/protocol-http@1.2.0 - @smithy/querystring-builder@1.1.0 - @smithy/types@1.2.0 ## 1.0.4 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/abort-controller@1.0.3 - @smithy/protocol-http@1.1.2 - @smithy/querystring-builder@1.0.3 ## 1.0.3 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/querystring-builder@1.0.2 - @smithy/abort-controller@1.0.2 - @smithy/protocol-http@1.1.1 - @smithy/types@1.1.1 ## 1.0.2 ### Patch Changes - e051b157: Rejoin main promise when error is thrown in writeRequestBody ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/querystring-builder@1.0.1 - @smithy/abort-controller@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/node-http-handler](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/node-http-handler/CHANGELOG.md) for additional history. ================================================ FILE: packages/node-http-handler/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/node-http-handler/README.md ================================================ # @smithy/node-http-handler [![NPM version](https://img.shields.io/npm/v/@smithy/node-http-handler/latest.svg)](https://www.npmjs.com/package/@smithy/node-http-handler) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/node-http-handler.svg)](https://www.npmjs.com/package/@smithy/node-http-handler) This package implements the default `requestHandler` for Node.js using `node:http`, `node:https`, and `node:http2`. For an example on how `requestHandler`s are used by Smithy generated SDK clients, refer to the [AWS SDK for JavaScript (v3) supplemental docs](https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/CLIENTS.md#request-handler-requesthandler). ================================================ FILE: packages/node-http-handler/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/node-http-handler/fixtures/test-server-cert.pem ================================================ -----BEGIN CERTIFICATE----- MIIEWjCCAkICCQDK848c0wG7ajANBgkqhkiG9w0BAQsFADBvMQswCQYDVQQGEwJV UzETMBEGA1UECAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTElMCMGA1UE CgwcTWVzc2FnZSBWYWxpZGF0b3IgVW5pdCBUZXN0czESMBAGA1UEAwwJbG9jYWxo b3N0MB4XDTE3MDYyMzAxMTQzOFoXDTIzMDEzMTAxMTQzOFowbzELMAkGA1UEBhMC VVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxJTAjBgNV BAoMHE1lc3NhZ2UgVmFsaWRhdG9yIFVuaXQgVGVzdHMxEjAQBgNVBAMMCWxvY2Fs aG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANknobw2ZghFY9yE Ork5dSlW2giIk2Sb/0GajCXNc1ajVkn1R5e5WNLYWALFRyHmtvWFj6Rut9pQ4WOk OKYsaWvNlB89CuvKDOZAF02BiTJuXsb5+jHIhg2uuEKS/bEZG27FFZZMLAIeMpdN Ro+02gKH1DXp6xa3nHkwR00b+0traTwyvvJQsaKHmEHClKwom1i8A60l2Ctm+K2I io7uLafVX7Xufmqhgxyn+ZSPe/iYgqSrh68gc/OkPuaakMEx72pfqK1wAZz5NWSn 6MFi/mfXmvbL7hfCwThABAQ1I2codGyq7Ax1mMeC/bYYGAIPRoUbsx0jkjzO64gw NBs+WJECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAJkb1qMVICfH0cx+loEm8H4vp v2gt2iinFprYbKuzsYIysc8fVrz7Fcs2mG3Co0uXzddNAzd1ZwPO5vWyU7nu8J0L LSx2u7prAl4Jflr/kwlFt2f/ParTBgdoVSM4sI2VgL/B89fKcC3C24lEU5dPsntg cbBhlhDtOpn0BVhEuVVXFMMmqthkrzZjRrsZZ8uwR8tbJWXh6peMPCD/86NFrWgK givJOrWmraE6MbIo1AUEj7wTK7+viXmzKkYpAj/pJI2Duy4Xbx4t+ry2//rByc4G rJpsHnQmN7zM+AvMClQyyg+F0BXRBr71cbrbCko59MxWwHdT7+Z7y0fc9sKhVuQO RkJ2p4+0ll1JLE39i6Q/cGBr65MqeSx6Feo6rlQbW8qD7YLZrFHmxHKHD1kLx9h1 agfawgi2B++qHFdMe5sxZ2cSneWmFIiwTMWbdKIVmhPx+tuYh+QyQScyoFCoy3c4 WpKWjjg+wfwDgf41rfvlO0xyG1VZ1bVKSRkiQjdXZ+/4DFrNeKFDpiexSio7dgJZ JR+wzPSFzGDlSv96gf+cKNgJA1Yw5r2Y3zGN65tFpMm4qLDR6R6ajy8IRMcCqGUq BxAexvuxslcc0pj3e9vUWkp3Ky5u+xNQ1EiS6VMbWEcJYjNInEAlTdS+V5uiCDh3 aLzuR8HtZN016piziIU= -----END CERTIFICATE----- ================================================ FILE: packages/node-http-handler/fixtures/test-server-key.pem ================================================ -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA2SehvDZmCEVj3IQ6uTl1KVbaCIiTZJv/QZqMJc1zVqNWSfVH l7lY0thYAsVHIea29YWPpG632lDhY6Q4pixpa82UHz0K68oM5kAXTYGJMm5exvn6 MciGDa64QpL9sRkbbsUVlkwsAh4yl01Gj7TaAofUNenrFreceTBHTRv7S2tpPDK+ 8lCxooeYQcKUrCibWLwDrSXYK2b4rYiKju4tp9Vfte5+aqGDHKf5lI97+JiCpKuH ryBz86Q+5pqQwTHval+orXABnPk1ZKfowWL+Z9ea9svuF8LBOEAEBDUjZyh0bKrs DHWYx4L9thgYAg9GhRuzHSOSPM7riDA0Gz5YkQIDAQABAoIBAQDPmUjQgvzmOVgv j6YIP3rXa3WDpPWrwEq1sAb9eL0j/YDXsYqg7QuSfksdUvYe3c7ZR7c8DrDrIFlp Ba02h8y8x8ssVhIjuoS8dlcQvJ6pvMQU2xQqFba6S+dRle68KPGF4xoxFl8YI0Bg Tvr/FXk55Bqm9BrQG/aWEOaJPA/wV1tq4d/Sv+pLJozM7ejzl0/QRV1p2dnvKwvO kO48G/Y+k8DXnwIR5qcGhAZP7wxb2cvzWEQwuBDNKedCNAInjjakXJt4bH+vYAE6 RXlzZnQC2LRMKomlCIcaJeINlhlCX/HJPYQrz8Zav6WTAYvolHqW9HRBqp0mG7iZ O6NmLvOVAoGBAO6CHnsHKUo2rlf5E68u8HlbxPJcToOt+APLymvJOcjGnrgLKo01 KqMMyUVVXyGfpYcN2Bxvk92BTQ71xt4FzqaNn+Ag/NRtHi/ecYnPrH3X+Dd0WRd/ VFX4cGdqd0JXNOMLhKPsk+qO9h9lAoBiDMM2B6pyN4P8mLs3VXU1QrG/AoGBAOkU nIWzWTMqShkv6CmE2dBkeZaDq3vsgdvGYkaluhJ4nKoMM2GCPtcVmSpKna5GNcsx rAkxSbnz+WEUGJ+XQxP2bsZsfUbSsBqYOYSqqGVJaBsIXR4s+iB27l/XAKDuPsYr eYH7HbDf6afxEz5Bbf2E8ZvEZQ0M+UrPRB75IOmvAoGBAL5G2IJWCD7IuPY+I9IS pI5tBAZGVez/kWmV33t2Ib9nlaBGaEAXNli2Dqxdm3N7pdbE2LB244RHb26L7Yeb Im4FdpKcPphKJVcTI4lKQNZ0wfWbwKfaUTH07dfTPCmU4QBxY/RS/P6X5wrMzt4V WxExvZPhYyDNGBvj3S2QvBCJAoGBAIZmKjM2TbMhKYUIiNiYEHkH1syhtBpLMD4o ULboDTllbwDm9CG/1rhzbdRjHjVFqvM1+zt5vkeJlT0TN3ee40D5krq8CCj0iDNt n40OUvfEslEUK42g5cIekimVcnlZp7zhiLkYsfAxzSvX6P62/9N1+1OUlahG2OD4 TxGFGiNlAoGAE6S7R3GJyBUrgEd7ViOFGYkArmZnYgEvGgZ8IuS17BXFZdENdzjz b78WsPgxyRSMttKnmcDEErdtfVNyS2tFNSfTRpHHFxM8x2Ot/mw0krUSpXzMGc1s i6TltbVl1gSrhE1P8Kpuw4farJaP8M6P5UMU/HpPCO38EmnvKvxdTgA= -----END RSA PRIVATE KEY----- ================================================ FILE: packages/node-http-handler/package.json ================================================ { "name": "@smithy/node-http-handler", "version": "4.7.3", "description": "Provides a way to make requests", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline node-http-handler", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:watch": "yarn g:vitest watch" }, "author": { "name": "AWS SDK for JavaScript Team", "email": "", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@smithy/abort-controller": "workspace:^", "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/node-http-handler", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/node-http-handler" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/node-http-handler/src/build-abort-error.ts ================================================ /** * Builds an abort error, using the AbortSignal's reason if available. * * @param abortSignal - Optional AbortSignal that may contain a reason. * @returns A new Error with name "AbortError". If the signal has a reason that's * already an Error, the reason is set as `cause`. Otherwise creates a * new Error with the reason as the message, or "Request aborted" if no * reason. */ export function buildAbortError(abortSignal?: unknown): Error { const reason = abortSignal && typeof abortSignal === "object" && "reason" in abortSignal ? (abortSignal as { reason?: unknown }).reason : undefined; if (reason) { if (reason instanceof Error) { const abortError = new Error("Request aborted"); abortError.name = "AbortError"; (abortError as { cause?: unknown }).cause = reason; return abortError; } const abortError = new Error(String(reason)); abortError.name = "AbortError"; return abortError; } const abortError = new Error("Request aborted"); abortError.name = "AbortError"; return abortError; } ================================================ FILE: packages/node-http-handler/src/constants.ts ================================================ /** * Node.js system error codes that indicate timeout. * @deprecated use NODEJS_TIMEOUT_ERROR_CODES from @smithy/service-error-classification/constants */ export const NODEJS_TIMEOUT_ERROR_CODES = ["ECONNRESET", "EPIPE", "ETIMEDOUT"]; ================================================ FILE: packages/node-http-handler/src/get-transformed-headers.ts ================================================ import type { IncomingHttpHeaders } from "node:http2"; import type { HeaderBag } from "@smithy/types"; const getTransformedHeaders = (headers: IncomingHttpHeaders) => { const transformedHeaders: HeaderBag = {}; for (const name in headers) { const headerValues = headers[name]; transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(",") : headerValues; } return transformedHeaders; }; export { getTransformedHeaders }; ================================================ FILE: packages/node-http-handler/src/http2/ClientHttp2SessionRef.spec.ts ================================================ import type { ClientHttp2Session } from "node:http2"; import { describe, expect, test as it, vi } from "vitest"; import { ClientHttp2SessionRef } from "./ClientHttp2SessionRef"; const createMockSession = (destroyed = false) => { const session = { ref: vi.fn(), unref: vi.fn(), destroy: vi.fn(() => { (session as any).destroyed = true; }), destroyed, } as unknown as ClientHttp2Session; return session; }; describe(ClientHttp2SessionRef.name, () => { it("calls unref on the session at the start of object lifecycle", () => { const session = createMockSession(); new ClientHttp2SessionRef(session); expect(session.unref).toHaveBeenCalledTimes(1); }); it("retain() calls ref on the session", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); ref.retain(); expect(session.ref).toHaveBeenCalledTimes(1); }); it("retain() throws if session is destroyed", () => { const session = createMockSession(true); const ref = new ClientHttp2SessionRef(session); expect(() => ref.retain()).toThrow("cannot acquire reference to destroyed session"); }); it("deref() returns the session without ref-counting", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); expect(ref.deref()).toBe(session); expect(session.ref).not.toHaveBeenCalled(); }); it("free() calls unref when refcount reaches zero", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); ref.retain(); // 1 from constructor expect(session.unref).toHaveBeenCalledTimes(1); ref.free(); // 1 from constructor + 1 from free reaching zero expect(session.unref).toHaveBeenCalledTimes(2); }); it("free() does not call unref when refcount is still positive", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); ref.retain(); ref.retain(); ref.free(); // refcount 2 -> 1 // only constructor unref expect(session.unref).toHaveBeenCalledTimes(1); }); it("free() throws when refcount goes below zero", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); expect(() => ref.free()).toThrow("refcount at zero, cannot decrement"); }); it("free() is a no-op on destroyed session", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); ref.retain(); ref.destroy(); // should not throw ref.free(); }); it("destroy() destroys the session and resets refcount", () => { const session = createMockSession(); const ref = new ClientHttp2SessionRef(session); ref.retain(); ref.destroy(); expect(session.destroy).toHaveBeenCalledTimes(1); }); it("destroy() is safe to call on already-destroyed session", () => { const session = createMockSession(true); const ref = new ClientHttp2SessionRef(session); ref.destroy(); expect(session.destroy).not.toHaveBeenCalled(); }); }); ================================================ FILE: packages/node-http-handler/src/http2/ClientHttp2SessionRef.ts ================================================ import type { ClientHttp2Session } from "node:http2"; const ids = new Uint16Array(1); /** * Shared access ref counter for ClientHttp2Session, where owners are * in-flight requests. * * @internal * @since 4.6.0 */ export class ClientHttp2SessionRef { // debug information public readonly id = ids[0]++; /** * Total calls to retain for this session. */ public total = 0; /** * Max ref count observed. */ public max = 0; private readonly session: ClientHttp2Session; private refs = 0; public constructor(session: ClientHttp2Session) { // The session starts in unref state. // The start of the request (call to retain) will bring it into ref state. session.unref(); this.session = session; } /** * Signal that the session is entering a request span and has an additional owning request. * This must be called when beginning a request using the session. */ public retain(): void { if (this.session.destroyed) { throw new Error("@smithy/node-http-handler - cannot acquire reference to destroyed session."); } this.refs += 1; this.total += 1; this.max = Math.max(this.refs, this.max); this.session.ref(); } /** * Release reference to session, to be called when it exits request span, indicating one fewer owning request. * When reaching zero, the session is unref'd. * This must be called when concluding a request using the session. */ public free(): void { if (this.session.destroyed) { return; } this.refs -= 1; if (this.refs === 0) { this.session.unref(); } if (this.refs < 0) { throw new Error("@smithy/node-http-handler - ClientHttp2Session refcount at zero, cannot decrement."); } } /** * Access the session (don't call ref/unref on it). */ public deref(): ClientHttp2Session { return this.session; } /** * Allow open refs to free on their own. */ public close(): void { if (!this.session.closed) { this.session.close(); } } public destroy(): void { this.refs = 0; if (!this.session.destroyed) { this.session.destroy(); } } /** * @returns the current number of active references (in-flight requests). */ public useCount(): number { return this.refs; } } ================================================ FILE: packages/node-http-handler/src/index.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { NodeHttpHandler } from "./index"; describe("index", () => { it("exports NodeHttpHandler", () => { expect(typeof NodeHttpHandler).toBe("function"); }); }); ================================================ FILE: packages/node-http-handler/src/index.ts ================================================ export * from "./node-http-handler"; export * from "./node-http2-handler"; export * from "./stream-collector"; ================================================ FILE: packages/node-http-handler/src/node-http-handler.mock-server.spec.ts ================================================ import http, { request as hRequest, type Server as HttpServer } from "node:http"; import https, { request as hsRequest, type Server as HttpsServer } from "node:https"; import type { AddressInfo } from "node:net"; import { AbortController as AbortControllerPolyfill } from "@smithy/abort-controller"; import { HttpRequest } from "@smithy/core/protocols"; import { afterAll, afterEach, beforeAll, describe, expect, test as it, vi } from "vitest"; import { NodeHttpHandler } from "./node-http-handler"; import { ReadFromBuffers } from "./readable.mock"; import { createContinueResponseFunction, createMirrorResponseFunction, createMockHttpServer, createMockHttpsServer, createResponseFunction, getResponseBody, } from "./server.mock"; vi.mock("http", async () => { const actual = (await vi.importActual("http")) as any; const pkg = { ...actual, request: vi.fn().mockImplementation(actual.request), }; return { ...pkg, default: pkg, }; }); vi.mock("https", async () => { const actual = (await vi.importActual("https")) as any; const pkg = { ...actual, request: vi.fn().mockImplementation(actual.request), }; return { ...pkg, default: pkg, }; }); describe("http", () => { let mockHttpServer: HttpServer; beforeAll(() => { mockHttpServer = createMockHttpServer().listen(54321); }); afterEach(() => { mockHttpServer.removeAllListeners("request"); mockHttpServer.removeAllListeners("checkContinue"); }); afterAll(() => { mockHttpServer.close(); }); it("has metadata", () => { const nodeHttpHandler = new NodeHttpHandler(); expect(nodeHttpHandler.metadata.handlerProtocol).toContain("http/1.1"); }); it("can send http requests", async () => { const mockResponse = { statusCode: 200, reason: "OK", headers: {}, body: "test", }; mockHttpServer.addListener("request", createResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler(); const { response } = await nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: {}, }), {} ); expect(response.statusCode).toEqual(mockResponse.statusCode); expect(response.reason).toEqual(mockResponse.reason); expect(response.headers).toBeDefined(); expect(response.headers).toMatchObject(mockResponse.headers); expect(response.body).toBeDefined(); }); [ { name: "buffer", body: Buffer.from("Buffering🚀") }, { name: "uint8Array", body: Uint8Array.from(Buffer.from("uint8Array 🚀")) }, { name: "string", body: Buffer.from("string-test 🚀") }, { name: "uint8Array subarray", body: Uint8Array.from(Buffer.from("test")).subarray(1, 3) }, { name: "buffer subarray", body: Buffer.from("test").subarray(1, 3) }, ].forEach(({ body, name }) => { it(`can send requests with bodies ${name}`, async () => { const mockResponse = { statusCode: 200, headers: {}, }; mockHttpServer.addListener("request", createMirrorResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler(); const { response } = await nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "PUT", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: {}, body, }), {} ); expect(response.statusCode).toEqual(mockResponse.statusCode); expect(response.headers).toBeDefined(); expect(response.headers).toMatchObject(mockResponse.headers); const responseBody = await getResponseBody(response); expect(responseBody).toEqual(Buffer.from(body).toString()); }); }); it("can handle expect 100-continue", async () => { const body = Buffer.from("test"); const mockResponse = { statusCode: 200, headers: {}, }; mockHttpServer.addListener("checkContinue", createContinueResponseFunction(mockResponse)); let endSpy: any; let continueWasTriggered = false; const spy = vi.mocked(hRequest).mockImplementationOnce(() => { const calls = spy.mock.calls; const currentIndex = calls.length - 1; const request = http.request(calls[currentIndex][0], calls[currentIndex][1]); request.on("continue", () => { continueWasTriggered = true; }); endSpy = vi.spyOn(request, "end"); return request; }); const nodeHttpHandler = new NodeHttpHandler(); const { response } = await nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "PUT", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: { Expect: "100-continue", }, body, }), {} ); expect(response.statusCode).toEqual(mockResponse.statusCode); expect(response.headers).toBeDefined(); expect(response.headers).toMatchObject(mockResponse.headers); expect(endSpy!.mock.calls.length).toBe(1); expect(endSpy!.mock.calls[0][0]).toStrictEqual(body); expect(continueWasTriggered).toBe(true); }); it("can send requests with streaming bodies", async () => { const body = new ReadFromBuffers({ buffers: [Buffer.from("t"), Buffer.from("e"), Buffer.from("s"), Buffer.from("t")], }); const inputBodySpy = vi.spyOn(body, "pipe"); const mockResponse = { statusCode: 200, headers: {}, }; mockHttpServer.addListener("request", createResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler(); const { response } = await nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "PUT", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: {}, body, }), {} ); expect(response.statusCode).toEqual(mockResponse.statusCode); expect(response.headers).toBeDefined(); expect(response.headers).toMatchObject(mockResponse.headers); expect(inputBodySpy.mock.calls.length).toBeTruthy(); }); it("can send requests with Uint8Array bodies", async () => { const body = Buffer.from([0, 1, 2, 3]); const mockResponse = { statusCode: 200, headers: {}, }; mockHttpServer.addListener("request", createResponseFunction(mockResponse)); let endSpy: any; const spy = vi.mocked(hRequest).mockImplementationOnce(() => { const calls = spy.mock.calls; const currentIndex = calls.length - 1; const request = http.request(calls[currentIndex][0], calls[currentIndex][1]); endSpy = vi.spyOn(request, "end"); return request; }); const nodeHttpHandler = new NodeHttpHandler(); const { response } = await nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "PUT", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: {}, body, }), {} ); expect(response.statusCode).toEqual(mockResponse.statusCode); expect(response.headers).toBeDefined(); expect(response.headers).toMatchObject(mockResponse.headers); expect(endSpy!.mock.calls.length).toBe(1); expect(endSpy!.mock.calls[0][0]).toStrictEqual(body); }); }); describe("https", () => { const mockHttpsServer: HttpsServer = createMockHttpsServer().listen(54322); afterEach(() => { mockHttpsServer.removeAllListeners("request"); mockHttpsServer.removeAllListeners("checkContinue"); }); afterAll(() => { mockHttpsServer.close(); }); it("rejects if the request encounters an error", async () => { const mockResponse = { statusCode: 200, headers: {}, body: "test", }; mockHttpsServer.addListener("request", createResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler(); await expect( nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpsServer.address() as AddressInfo).port, protocol: "fake:", // trigger a request error path: "/", headers: {}, }), {} ) ).rejects.toHaveProperty("message"); }); it("will not make request if already aborted", async () => { const mockResponse = { statusCode: 200, headers: {}, body: "test", }; mockHttpsServer.addListener("request", createResponseFunction(mockResponse)); const spy = vi.mocked(hsRequest).mockImplementationOnce(() => { const calls = spy.mock.calls; const currentIndex = calls.length - 1; return https.request(calls[currentIndex][0], calls[currentIndex][1]); }); // clear data held from previous tests spy.mockClear(); const nodeHttpHandler = new NodeHttpHandler(); await expect( nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpsServer.address() as AddressInfo).port, protocol: "https:", path: "/", headers: {}, }), { abortSignal: { aborted: true, onabort: null, }, } ) ).rejects.toHaveProperty("name", "AbortError"); expect(spy.mock.calls.length).toBe(0); }); it(`won't throw uncatchable error in writeRequestBody`, async () => { const nodeHttpHandler = new NodeHttpHandler(); await expect( nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpsServer.address() as AddressInfo).port, protocol: "https:", path: "/", headers: {}, body: {}, }) ) ).rejects.toHaveProperty("name", "TypeError"); }); it.each([ { AbortController, label: "native" }, { AbortController: AbortControllerPolyfill, label: "polyfill" }, ])("will destroy the request when aborted ($label)", async ({ AbortController }) => { const mockResponse = { statusCode: 200, headers: {}, body: "test", }; mockHttpsServer.addListener("request", createResponseFunction(mockResponse)); let httpRequest: http.ClientRequest; let reqDestroySpy: any; const spy = vi.mocked(hsRequest).mockImplementationOnce(() => { const calls = spy.mock.calls; const currentIndex = calls.length - 1; httpRequest = https.request(calls[currentIndex][0], calls[currentIndex][1]); reqDestroySpy = vi.spyOn(httpRequest, "destroy"); return httpRequest; }); const nodeHttpHandler = new NodeHttpHandler(); const abortController = new AbortController(); setTimeout(() => { abortController.abort(); }, 0); await expect( nodeHttpHandler.handle( new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpsServer.address() as AddressInfo).port, protocol: "https:", path: "/", headers: {}, }), { abortSignal: abortController.signal, } ) ).rejects.toHaveProperty("name", "AbortError"); expect(reqDestroySpy.mock.calls.length).toBe(1); }); }); describe("configs", () => { const mockResponse = { statusCode: 200, statusText: "OK", headers: {}, body: "test", }; let mockHttpServer: HttpServer; let request: HttpRequest; beforeAll(() => { mockHttpServer = createMockHttpServer().listen(54320); request = new HttpRequest({ hostname: "localhost", method: "GET", port: (mockHttpServer.address() as AddressInfo).port, protocol: "http:", path: "/", headers: {}, }); }); afterEach(() => { mockHttpServer.removeAllListeners("request"); mockHttpServer.removeAllListeners("checkContinue"); }); afterAll(() => { mockHttpServer.close(); }); it("put HttpClientConfig", async () => { mockHttpServer.addListener("request", createResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler(); const requestTimeout = 200; nodeHttpHandler.updateHttpClientConfig("requestTimeout", requestTimeout); await nodeHttpHandler.handle(request, {}); expect(nodeHttpHandler.httpHandlerConfigs().requestTimeout).toEqual(requestTimeout); }); it("update existing HttpClientConfig", async () => { mockHttpServer.addListener("request", createResponseFunction(mockResponse)); const nodeHttpHandler = new NodeHttpHandler({ requestTimeout: 200 }); const requestTimeout = 300; nodeHttpHandler.updateHttpClientConfig("requestTimeout", requestTimeout); await nodeHttpHandler.handle(request, {}); expect(nodeHttpHandler.httpHandlerConfigs().requestTimeout).toEqual(requestTimeout); }); it("httpHandlerConfigs returns empty object if handle is not called", async () => { const nodeHttpHandler = new NodeHttpHandler(); expect(nodeHttpHandler.httpHandlerConfigs()).toEqual({}); }); }); ================================================ FILE: packages/node-http-handler/src/node-http-handler.spec.ts ================================================ import http, { request as hRequest } from "node:http"; import https, { request as hsRequest } from "node:https"; import { HttpRequest } from "@smithy/core/protocols"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { NodeHttpHandler } from "./node-http-handler"; import * as setConnectionTimeoutModule from "./set-connection-timeout"; import * as setRequestTimeoutModule from "./set-request-timeout"; import * as setSocketTimeoutModule from "./set-socket-timeout"; import { timing } from "./timing"; vi.mock("node:http", async () => { const actual = (await vi.importActual("node:http")) as any; const pkg = { ...actual, request: vi.fn().mockImplementation((_options, cb) => { cb({ statusCode: 200, body: "body", headers: {}, protocol: "http:", }); return new actual.ClientRequest({ ..._options, protocol: "http:" }); }), }; return { ...pkg, default: pkg, }; }); vi.mock("node:https", async () => { const actual = (await vi.importActual("node:https")) as any; const http = (await vi.importActual("node:http")) as any; const pkg = { ...actual, request: vi.fn().mockImplementation((_options, cb) => { cb({ statusCode: 200, body: "body", headers: {}, protocol: "https:", }); return new http.ClientRequest({ ..._options, protocol: "https:" }); }), }; return { ...pkg, default: pkg, }; }); describe("NodeHttpHandler", () => { describe("constructor and #handle", () => { const randomMaxSocket = Math.round(Math.random() * 50) + 1; const randomSocketAcquisitionWarningTimeout = Math.round(Math.random() * 10000) + 1; const randomConnectionTimeout = Math.round(Math.random() * 10000) + 1; const randomSocketTimeout = Math.round(Math.random() * 10000) + 1; const randomRequestTimeout = Math.round(Math.random() * 10000) + 1; beforeEach(() => {}); afterEach(() => { vi.clearAllMocks(); }); describe("constructor", () => { it("allows https.Agent and http.Agent ctor args in place of actual instances", async () => { const nodeHttpHandler = new NodeHttpHandler({ httpAgent: { maxSockets: 37 }, httpsAgent: { maxSockets: 39, keepAlive: false }, }); await nodeHttpHandler.handle({} as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.maxSockets).toEqual(37); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.keepAlive).toEqual(true); expect((nodeHttpHandler as any).config.httpsAgent.maxSockets).toEqual(39); expect((nodeHttpHandler as any).config.httpsAgent.keepAlive).toEqual(false); }); it.each([ ["empty", undefined], ["a provider", async () => {}], ])("sets keepAlive=true by default when input is %s", async (_, option) => { const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.keepAlive).toEqual(true); }); it.each([ ["empty", undefined], ["a provider", async () => {}], ])("sets maxSockets=50 by default when input is %s", async (_, option) => { const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.maxSockets).toEqual(50); }); it.each([ ["an options hash", { socketAcquisitionWarningTimeout: randomSocketAcquisitionWarningTimeout }], [ "a provider", async () => ({ socketAcquisitionWarningTimeout: randomSocketAcquisitionWarningTimeout, }), ], ])("sets socketAcquisitionWarningTimeout correctly when input is %s", async (_, option) => { vi.spyOn(timing, "setTimeout"); const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(timing.setTimeout).mock.calls[0][1]).toBe(randomSocketAcquisitionWarningTimeout); }); it.each([ ["an options hash", { connectionTimeout: randomConnectionTimeout }], [ "a provider", async () => ({ connectionTimeout: randomConnectionTimeout, }), ], ])("sets connectionTimeout correctly when input is %s", async (_, option) => { vi.spyOn(setConnectionTimeoutModule, "setConnectionTimeout"); const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(setConnectionTimeoutModule.setConnectionTimeout).mock.calls[0][2]).toBe( randomConnectionTimeout ); }); it.each([ ["an options hash", { requestTimeout: randomRequestTimeout }], [ "a provider", async () => ({ requestTimeout: randomRequestTimeout, }), ], ])("sets requestTimeout correctly when input is %s", async (_, option) => { vi.spyOn(setRequestTimeoutModule, "setRequestTimeout"); const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(setRequestTimeoutModule.setRequestTimeout).mock.calls[0][2]).toBe(randomRequestTimeout); }); it.each([ ["an options hash", { socketTimeout: randomSocketTimeout }], [ "a provider", async () => ({ socketTimeout: randomSocketTimeout, }), ], ])("sets socketTimeout correctly when input is %s", async (_, option) => { vi.spyOn(setSocketTimeoutModule, "setSocketTimeout"); const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({} as any); expect(vi.mocked(setSocketTimeoutModule.setSocketTimeout).mock.calls[0][2]).toBe(randomSocketTimeout); }); it.each([ ["an options hash", { httpAgent: new http.Agent({ keepAlive: false, maxSockets: randomMaxSocket }) }], [ "a provider", async () => ({ httpAgent: new http.Agent({ keepAlive: false, maxSockets: randomMaxSocket }), }), ], ])("sets httpAgent when input is %s", async (_, option) => { const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({ protocol: "http:", headers: {}, method: "GET", hostname: "localhost" } as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.keepAlive).toEqual(false); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent.maxSockets).toEqual(randomMaxSocket); }); it.each([ ["an option hash", { httpsAgent: new https.Agent({ keepAlive: true, maxSockets: randomMaxSocket }) }], [ "a provider", async () => ({ httpsAgent: new https.Agent({ keepAlive: true, maxSockets: randomMaxSocket }), }), ], ])("sets httpsAgent when input is %s", async (_, option) => { const nodeHttpHandler = new NodeHttpHandler(option); await nodeHttpHandler.handle({ protocol: "https:" } as any); expect(vi.mocked(hsRequest as any).mock.calls[0][0]?.agent.keepAlive).toEqual(true); expect(vi.mocked(hsRequest as any).mock.calls[0][0]?.agent.maxSockets).toEqual(randomMaxSocket); }); }); describe("#handle", () => { it("should only generate a single config when the config provider is async and it is not ready yet", async () => { let providerInvokedCount = 0; let providerResolvedCount = 0; const slowConfigProvider = async () => { providerInvokedCount += 1; await new Promise((r) => setTimeout(r, 15)); providerResolvedCount += 1; return { connectionTimeout: 12345, socketTimeout: 12345, httpAgent: void 0, httpsAgent: void 0, }; }; const nodeHttpHandler = new NodeHttpHandler(slowConfigProvider); const promises = Promise.all( Array.from({ length: 10 }).map(() => nodeHttpHandler.handle({ protocol: "https:", hostname: "localhost", port: 54321, path: "/", } as unknown as HttpRequest) ) ); expect(providerInvokedCount).toBe(1); expect(providerResolvedCount).toBe(0); await promises; expect(providerInvokedCount).toBe(1); expect(providerResolvedCount).toBe(1); }); it("sends requests to the right url", async () => { const nodeHttpHandler = new NodeHttpHandler({}); const httpRequest = { protocol: "http:", username: "username", password: "password", hostname: "host", port: 1234, path: "/some/path", query: { some: "query", }, fragment: "fragment", }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.auth).toEqual("username:password"); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.host).toEqual("host"); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.port).toEqual(1234); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.path).toEqual("/some/path?some=query#fragment"); }); it("removes brackets from hostname", async () => { const nodeHttpHandler = new NodeHttpHandler({}); const httpRequest = { protocol: "http:", username: "username", password: "password", hostname: "[host]", port: 1234, path: "/some/path", query: { some: "query", }, fragment: "fragment", }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.host).toEqual("host"); }); describe("per-request requestTimeout", () => { it("should use per-request timeout over handler config timeout", async () => { const testTimeout = async (handlerTimeout: number, requestTimeout?: number) => { const handler = new NodeHttpHandler({ requestTimeout: handlerTimeout }); await handler.handle( new HttpRequest({ protocol: "http:", username: "username", password: "password", hostname: "host", port: 1234, path: "/some/path", query: { some: "query", }, fragment: "fragment", }), { requestTimeout, } ); expect(timing.setTimeout).toHaveBeenCalledWith(expect.any(Function), requestTimeout ?? handlerTimeout); }; await testTimeout(5123.1, 125.1); await testTimeout(264.1, undefined); await testTimeout(234.1); expect.assertions(3); }); }); describe("expect 100-continue", () => { it("creates a new http(s) Agent if the request has expect: 100-continue header and agents are NodeHttpHandler-owned", async () => { const nodeHttpHandler = new NodeHttpHandler({ httpAgent: { maxSockets: 25, }, httpsAgent: { maxSockets: 25, }, }); { const httpRequest = { protocol: "http:", hostname: "[host]", path: "/some/path", headers: { expect: "100-continue", }, }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent).not.toBe( (nodeHttpHandler as any).config.httpAgent ); } { const httpRequest = { protocol: "http:", hostname: "[host]", path: "/some/path", headers: {}, }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[1][0]?.agent).toBe((nodeHttpHandler as any).config.httpAgent); } }); it("does not create a new Agent if configured Agent is caller-owned (e.g. proxy), but instead skips the writeBody delay", async () => { const nodeHttpHandler = new NodeHttpHandler({ httpAgent: new http.Agent(), }); { const httpRequest = { protocol: "http:", hostname: "[host]", path: "/some/path", headers: { expect: "100-continue", }, }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[0][0]?.agent).toBe((nodeHttpHandler as any).config.httpAgent); } { const httpRequest = { protocol: "http:", hostname: "[host]", path: "/some/path", headers: {}, }; await nodeHttpHandler.handle(httpRequest as any); expect(vi.mocked(hRequest as any).mock.calls[1][0]?.agent).toBe((nodeHttpHandler as any).config.httpAgent); } }); }); }); }); describe("create", () => { const randomRequestTimeout = Math.round(Math.random() * 10000) + 1; it.each([ ["existing handler instance", new NodeHttpHandler()], [ "custom HttpHandler object", { handle: vi.fn(), } as any, ], ])("returns the input handler when passed %s", (_, handler) => { const result = NodeHttpHandler.create(handler); expect(result).toBe(handler); }); it.each([ ["undefined", undefined], ["an empty options hash", {}], ["empty provider", async () => undefined], ])("creates new handler instance when input is %s", async (_, input) => { const result = NodeHttpHandler.create(input); expect(result).toBeInstanceOf(NodeHttpHandler); }); it.each([ ["an options hash", { requestTimeout: randomRequestTimeout }], ["a provider", async () => ({ requestTimeout: randomRequestTimeout })], ])("creates new handler instance with config when input is %s", async (_, input) => { const result = NodeHttpHandler.create(input); expect(result).toBeInstanceOf(NodeHttpHandler); // Verify configuration by calling handle await result.handle({} as any); expect(result.httpHandlerConfigs().requestTimeout).toBe(randomRequestTimeout); }); }); describe("#destroy", () => { it("should be callable and return nothing", () => { const nodeHttpHandler = new NodeHttpHandler(); expect(nodeHttpHandler.destroy()).toBeUndefined(); }); }); describe("abort signal handling", () => { it("rejects with AbortSignal.reason when signal is already aborted with a custom reason", async () => { const nodeHttpHandler = new NodeHttpHandler(); const customReason = new Error("custom abort reason"); customReason.name = "CustomAbortError"; const abortController = new AbortController(); abortController.abort(customReason); try { await nodeHttpHandler.handle({ protocol: "http:", hostname: "host", path: "/", headers: {} } as any, { abortSignal: abortController.signal as any, }); expect.unreachable("should have thrown"); } catch (e: any) { expect(e.message).toBe("Request aborted"); expect(e.name).toBe("AbortError"); expect(e.cause).toBe(customReason); } }); it("rejects with default AbortError when signal has no reason", async () => { const nodeHttpHandler = new NodeHttpHandler(); const signal = { aborted: true, onabort: null, }; await expect( nodeHttpHandler.handle({ protocol: "http:", hostname: "host", path: "/", headers: {} } as any, { abortSignal: signal as any, }) ).rejects.toThrow("Request aborted"); }); it("rejects with a mutable error when reason is a frozen Error", async () => { const nodeHttpHandler = new NodeHttpHandler(); const frozenReason = Object.freeze(new Error("frozen")); const abortController = new AbortController(); abortController.abort(frozenReason); try { await nodeHttpHandler.handle({ protocol: "http:", hostname: "host", path: "/", headers: {} } as any, { abortSignal: abortController.signal as any, }); expect.unreachable("should have thrown"); } catch (e: any) { expect(e.name).toBe("AbortError"); expect(e.cause).toBe(frozenReason); // The returned error must be mutable so retry middleware can set $metadata. expect(() => { e.$metadata = {}; }).not.toThrow(); } }); it("rejects with string reason wrapped in an Error", async () => { const nodeHttpHandler = new NodeHttpHandler(); const abortController = new AbortController(); abortController.abort("string reason"); try { await nodeHttpHandler.handle({ protocol: "http:", hostname: "host", path: "/", headers: {} } as any, { abortSignal: abortController.signal as any, }); expect.unreachable("should have thrown"); } catch (e: any) { expect(e.message).toBe("string reason"); expect(e.name).toBe("AbortError"); } }); }); describe("checkSocketUsage", () => { beforeEach(() => { vi.spyOn(console, "warn").mockImplementation(vi.fn() as any); }); afterEach(() => { vi.resetAllMocks(); }); it("warns when socket exhaustion is detected", async () => { const lastTimestamp = Date.now() - 30_000; const warningTimestamp = NodeHttpHandler.checkSocketUsage( { maxSockets: 2, sockets: { addr: [], addr2: [null], addr3: [null, null], // this is not checked because an earlier addr causes the warning to be emitted. addr4: Array.from({ length: 400 }), }, requests: { addr: Array.from({ length: 0 }), addr2: Array.from({ length: 3 }), addr3: Array.from({ length: 4 }), // this is not checked because an earlier addr causes the warning to be emitted. addr4: Array.from({ length: 800 }), }, } as any, lastTimestamp ); expect(warningTimestamp).toBeGreaterThan(lastTimestamp); expect(console.warn).toHaveBeenCalledWith( `@smithy/node-http-handler:WARN - socket usage at capacity=2 and 4 additional requests are enqueued. See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.` ); }); }); }); ================================================ FILE: packages/node-http-handler/src/node-http-handler.ts ================================================ import type { Agent as hAgentType, request as hRequestType } from "node:http"; import { Agent as hsAgent, request as hsRequest, type RequestOptions } from "node:https"; import { HttpResponse, buildQueryString, type HttpHandler, type HttpRequest } from "@smithy/core/protocols"; import type { HttpHandlerOptions, Logger, NodeHttpHandlerOptions, Provider } from "@smithy/types"; import { buildAbortError } from "./build-abort-error"; import { NODEJS_TIMEOUT_ERROR_CODES } from "./constants"; import { getTransformedHeaders } from "./get-transformed-headers"; import { setConnectionTimeout } from "./set-connection-timeout"; import { setRequestTimeout } from "./set-request-timeout"; import { setSocketKeepAlive } from "./set-socket-keep-alive"; import { setSocketTimeout } from "./set-socket-timeout"; import { timing } from "./timing"; import { writeRequestBody } from "./write-request-body"; export { NodeHttpHandlerOptions }; interface ResolvedNodeHttpHandlerConfig extends Omit { httpAgentProvider: () => Promise; httpAgent?: hAgentType; httpsAgent: hsAgent; } /** * A default of 0 means no timeout. * * @public */ export const DEFAULT_REQUEST_TIMEOUT = 0; let hAgent: { new (...args: any): hAgentType } | undefined = undefined; let hRequest: typeof hRequestType | undefined = undefined; /** * A request handler that uses the Node.js http and https modules. * * @public */ export class NodeHttpHandler implements HttpHandler { private config?: ResolvedNodeHttpHandlerConfig; private configProvider: Promise; private socketWarningTimestamp = 0; private externalAgent = false; // Node http handler is hard-coded to http/1.1: https://github.com/nodejs/node/blob/ff5664b83b89c55e4ab5d5f60068fb457f1f5872/lib/_http_server.js#L286 public readonly metadata = { handlerProtocol: "http/1.1" }; /** * @returns the input if it is an HttpHandler of any class, * or instantiates a new instance of this handler. */ public static create( instanceOrOptions?: HttpHandler | NodeHttpHandlerOptions | Provider ) { if (typeof (instanceOrOptions as any)?.handle === "function") { // is already an instance of HttpHandler. return instanceOrOptions as HttpHandler; } // input is ctor options or undefined. return new NodeHttpHandler(instanceOrOptions as NodeHttpHandlerOptions); } /** * @internal * * @param agent - http(s) agent in use by the NodeHttpHandler instance. * @param socketWarningTimestamp - last socket usage check timestamp. * @param logger - channel for the warning. * @returns timestamp of last emitted warning. */ public static checkSocketUsage( agent: hAgentType | hsAgent, socketWarningTimestamp: number, logger: Logger = console ): number { // note, maxSockets is per origin. const { sockets, requests, maxSockets } = agent; if (typeof maxSockets !== "number" || maxSockets === Infinity) { return socketWarningTimestamp; } const interval = 15_000; if (Date.now() - interval < socketWarningTimestamp) { return socketWarningTimestamp; } if (sockets && requests) { for (const origin in sockets) { const socketsInUse = sockets[origin]?.length ?? 0; const requestsEnqueued = requests[origin]?.length ?? 0; /** * Running at maximum socket usage can be intentional and normal. * That is why this warning emits at a delay which can be seen * at the call site's setTimeout wrapper. The warning will be cancelled * if the request finishes in a reasonable amount of time regardless * of socket saturation. * * Additionally, when the warning is emitted, there is an interval * lockout. */ if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) { logger?.warn?.( `@smithy/node-http-handler:WARN - socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued. See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.` ); return Date.now(); } } } return socketWarningTimestamp; } constructor(options?: NodeHttpHandlerOptions | Provider) { this.configProvider = new Promise((resolve, reject) => { if (typeof options === "function") { options() .then((_options) => { resolve(this.resolveDefaultConfig(_options)); }) .catch(reject); } else { resolve(this.resolveDefaultConfig(options)); } }); } public destroy(): void { this.config?.httpAgent?.destroy(); this.config?.httpsAgent?.destroy(); } public async handle( request: HttpRequest, { abortSignal, requestTimeout }: HttpHandlerOptions = {} ): Promise<{ response: HttpResponse }> { if (!this.config) { this.config = await this.configProvider; } const config = this.config!; // determine which http(s) client to use const isSSL = request.protocol === "https:"; if (!isSSL && !this.config.httpAgent) { this.config.httpAgent = await this.config.httpAgentProvider(); } return new Promise((_resolve, _reject) => { let writeRequestBodyPromise: Promise | undefined = undefined; // Individual timeout handles for this request, cleared upon completion. // Using individual variables avoids array allocation and forEach on the hot path. type TimeoutId = number | NodeJS.Timeout; let socketWarningTimeoutId: TimeoutId = -1; let connectionTimeoutId: TimeoutId = -1; let requestTimeoutId: TimeoutId = -1; let socketTimeoutId: TimeoutId = -1; let keepAliveTimeoutId: TimeoutId = -1; const clearTimeouts = () => { timing.clearTimeout(socketWarningTimeoutId); timing.clearTimeout(connectionTimeoutId); timing.clearTimeout(requestTimeoutId); timing.clearTimeout(socketTimeoutId); timing.clearTimeout(keepAliveTimeoutId); }; const resolve = async (arg: { response: HttpResponse }) => { await writeRequestBodyPromise; clearTimeouts(); _resolve(arg); }; const reject = async (arg: unknown) => { await writeRequestBodyPromise; clearTimeouts(); _reject(arg); }; // if the request was already aborted, prevent doing extra work if (abortSignal?.aborted) { const abortError = buildAbortError(abortSignal); reject(abortError); return; } const headers = request.headers; const expectContinue = headers ? (headers.Expect ?? headers.expect) === "100-continue" : false; let agent = isSSL ? config.httpsAgent : config.httpAgent; if (expectContinue && !this.externalAgent) { // Because awaiting 100-continue desynchronizes the request and request body transmission, // such requests must be offloaded to a separate Agent instance. // Additional logic will exist on the client using this handler to determine whether to add the header at all. agent = new (isSSL ? hsAgent : hAgent!)({ keepAlive: false, // This is an explicit value matching the default (Infinity). // This should allow the connection to close cleanly after making the single request. maxSockets: Infinity, }); } // If the request is taking a long time, check socket usage and potentially warn. // This warning will be cancelled if the request resolves. socketWarningTimeoutId = timing.setTimeout( () => { this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage( agent!, this.socketWarningTimestamp, config.logger ); }, config.socketAcquisitionWarningTimeout ?? (config.requestTimeout ?? 2000) + (config.connectionTimeout ?? 1000) ); const queryString = request.query ? buildQueryString(request.query) : ""; let auth = undefined; if (request.username != null || request.password != null) { const username = request.username ?? ""; const password = request.password ?? ""; auth = `${username}:${password}`; } let path = request.path; if (queryString) { path += `?${queryString}`; } if (request.fragment) { path += `#${request.fragment}`; } let hostname = request.hostname ?? ""; if (hostname[0] === "[" && hostname.endsWith("]")) { hostname = request.hostname.slice(1, -1); } else { hostname = request.hostname; } const nodeHttpsOptions: RequestOptions = { headers: request.headers, host: hostname, method: request.method, path, port: request.port, agent, auth, }; // create the http request const requestFunc = isSSL ? hsRequest : hRequest!; const req = requestFunc(nodeHttpsOptions, (res) => { const httpResponse = new HttpResponse({ statusCode: res.statusCode || -1, reason: res.statusMessage, headers: getTransformedHeaders(res.headers), body: res, }); resolve({ response: httpResponse }); }); req.on("error", (err: Error) => { if (NODEJS_TIMEOUT_ERROR_CODES.includes((err as any).code)) { reject(Object.assign(err, { name: "TimeoutError" })); } else { reject(err); } }); // wire-up abort logic if (abortSignal) { const onAbort = () => { // ensure request is destroyed req.destroy(); const abortError = buildAbortError(abortSignal); reject(abortError); }; if (typeof (abortSignal as AbortSignal).addEventListener === "function") { // preferred. const signal = abortSignal as AbortSignal; signal.addEventListener("abort", onAbort, { once: true }); req.once("close", () => signal.removeEventListener("abort", onAbort)); } else { // backwards compatibility abortSignal.onabort = onAbort; } } // Defer registration of socket event listeners if the connection and request timeouts // are longer than a few seconds. This avoids slowing down faster operations. const effectiveRequestTimeout = requestTimeout ?? config.requestTimeout; connectionTimeoutId = setConnectionTimeout(req, reject, config.connectionTimeout); requestTimeoutId = setRequestTimeout( req, reject, effectiveRequestTimeout, config.throwOnRequestTimeout, config.logger ?? console ); socketTimeoutId = setSocketTimeout(req, reject, config.socketTimeout); // Workaround for bug report in Node.js https://github.com/nodejs/node/issues/47137 const httpAgent = nodeHttpsOptions.agent; if (typeof httpAgent === "object" && "keepAlive" in httpAgent) { keepAliveTimeoutId = setSocketKeepAlive(req, { // @ts-expect-error keepAlive is not public on httpAgent. keepAlive: (httpAgent as hAgent).keepAlive, // @ts-expect-error keepAliveMsecs is not public on httpAgent. keepAliveMsecs: (httpAgent as hAgent).keepAliveMsecs, }); } writeRequestBodyPromise = writeRequestBody(req, request, effectiveRequestTimeout, this.externalAgent).catch( (e) => { clearTimeouts(); return _reject(e); } ); }); } public updateHttpClientConfig(key: keyof NodeHttpHandlerOptions, value: NodeHttpHandlerOptions[typeof key]): void { this.config = undefined; this.configProvider = this.configProvider.then((config) => { return { ...config, [key]: value, }; }); } public httpHandlerConfigs(): NodeHttpHandlerOptions { return this.config ?? {}; } private resolveDefaultConfig(options?: NodeHttpHandlerOptions | void): ResolvedNodeHttpHandlerConfig { const { requestTimeout, connectionTimeout, socketTimeout, socketAcquisitionWarningTimeout, httpAgent, httpsAgent, throwOnRequestTimeout, logger, } = options || {}; const keepAlive = true; const maxSockets = 50; return { connectionTimeout, requestTimeout, socketTimeout, socketAcquisitionWarningTimeout, throwOnRequestTimeout, httpAgentProvider: async () => { const { Agent, request } = await import("node:http"); hRequest = request; hAgent = Agent; if (httpAgent instanceof hAgent || typeof (httpAgent as hAgentType)?.destroy === "function") { this.externalAgent = true; return httpAgent as hAgentType; } return new hAgent({ keepAlive, maxSockets, ...httpAgent }); }, httpsAgent: (() => { if (httpsAgent instanceof hsAgent || typeof (httpsAgent as hsAgent)?.destroy === "function") { this.externalAgent = true; return httpsAgent as hsAgent; } return new hsAgent({ keepAlive, maxSockets, ...httpsAgent }); })(), logger, }; } } ================================================ FILE: packages/node-http-handler/src/node-http2-connection-manager.ts ================================================ import http2, { type ClientHttp2Session, type ClientSessionOptions, type SecureClientSessionOptions } from "node:http2"; import type { ConnectConfiguration, ConnectionManager, ConnectionManagerConfiguration, RequestContext, } from "@smithy/types"; import { ClientHttp2SessionRef } from "./http2/ClientHttp2SessionRef"; import { NodeHttp2ConnectionPool } from "./node-http2-connection-pool"; /** * This class previously implemented the ConnectionManager interface, * but this class isn't exported from this package, except as a private property of NodeHttp2Handler. * * @since 4.6.0 * @internal */ export class NodeHttp2ConnectionManager implements ConnectionManager { private config: ConnectionManagerConfiguration; private connectOptions?: Partial; private readonly connectionPools: Map = new Map(); constructor(config: ConnectionManagerConfiguration) { this.config = config; if (this.config.maxConcurrency && this.config.maxConcurrency <= 0) { throw new RangeError("maxConcurrency must be greater than zero."); } } /** * Acquire a session for making a request. */ public lease(requestContext: RequestContext, connectionConfiguration: ConnectConfiguration): ClientHttp2SessionRef { const url = this.getUrlString(requestContext); const pool = this.getPool(url); if (!this.config.disableConcurrency && !connectionConfiguration.isEventStream) { const available = pool.poll(); if (available) { available.retain(); return available; } } const ref = new ClientHttp2SessionRef(this.connect(url)); const session = ref.deref(); if (this.config.maxConcurrency) { session.settings({ maxConcurrentStreams: this.config.maxConcurrency }, (err) => { if (err) { throw new Error( "Fail to set maxConcurrentStreams to " + this.config.maxConcurrency + "when creating new session for " + requestContext.destination.toString() ); } }); } const graceful = () => { this.removeFromPoolAndClose(url, ref); }; const ensureDestroyed = () => { this.removeFromPoolAndCheckedDestroy(url, ref); }; session.on("goaway", graceful); session.on("error", ensureDestroyed); session.on("frameError", ensureDestroyed); session.on("close", ensureDestroyed); if (connectionConfiguration.requestTimeout) { session.setTimeout(connectionConfiguration.requestTimeout, ensureDestroyed); } pool.offerLast(ref); ref.retain(); return ref; } /** * Signal that a request using this session has completed. * * The session remains in its pool for reuse. * This method is not called for isolated sessions. */ public release(_requestContext: RequestContext, ref: ClientHttp2SessionRef): void { ref.free(); } /** * Create an isolated session that isn't part of the connection pools. * For use in event-streams or when concurrency is turned off. */ public createIsolatedSession( requestContext: RequestContext, connectionConfiguration: ConnectConfiguration ): ClientHttp2SessionRef { const url = this.getUrlString(requestContext); const ref = new ClientHttp2SessionRef(this.connect(url)); const session = ref.deref(); session.settings({ maxConcurrentStreams: 1 }); const ensureDestroyed = () => { ref.destroy(); }; // note: there is no goaway handler for an isolated session. // the session is already closing after receiving "goaway" and // there is no pool from which to remove it. session.on("error", ensureDestroyed); session.on("frameError", ensureDestroyed); session.on("close", ensureDestroyed); if (connectionConfiguration.requestTimeout) { session.setTimeout(connectionConfiguration.requestTimeout, ensureDestroyed); } ref.retain(); return ref; } public destroy(): void { for (const [url, connectionPool] of this.connectionPools) { // copy pool array to avoid potential synchronous mutation from // call to session.destroy(). for (const session of [...connectionPool]) { session.destroy(); } this.connectionPools.delete(url); } } public setMaxConcurrentStreams(maxConcurrentStreams: number) { if (maxConcurrentStreams && maxConcurrentStreams <= 0) { throw new RangeError("maxConcurrentStreams must be greater than zero."); } this.config.maxConcurrency = maxConcurrentStreams; for (const pool of this.connectionPools.values()) { pool.setMaxConcurrency(maxConcurrentStreams); } } public setDisableConcurrentStreams(disableConcurrentStreams: boolean) { this.config.disableConcurrency = disableConcurrentStreams; } public setNodeHttp2ConnectOptions( nodeHttp2ConnectOptions: Partial ) { this.connectOptions = nodeHttp2ConnectOptions; } /** * @internal * @returns a snapshot of the state of all connection pools and their sessions. */ public debug() { const pools: Record = {}; for (const [url, pool] of this.connectionPools) { const sessions = []; for (const ref of pool) { sessions.push({ id: ref.id, active: ref.useCount(), maxConcurrent: ref.max, totalRequests: ref.total, }); } pools[url] = { sessions }; } return pools; } private removeFromPoolAndClose(authority: string, ref: ClientHttp2SessionRef): void { this.connectionPools.get(authority)?.remove(ref); // no-op when this function is called as a "goaway" reaction, // but in case the method is called from another path, this is a defensive closure // because we lose the reference to the session. ref.close(); } private removeFromPoolAndCheckedDestroy(authority: string, ref: ClientHttp2SessionRef): void { this.connectionPools.get(authority)?.remove(ref); ref.destroy(); } private getPool(url: string): NodeHttp2ConnectionPool { if (!this.connectionPools.has(url)) { const pool = new NodeHttp2ConnectionPool(); if (this.config.maxConcurrency) { pool.setMaxConcurrency(this.config.maxConcurrency); } this.connectionPools.set(url, pool); } return this.connectionPools.get(url)!; } private getUrlString(request: RequestContext): string { return request.destination.toString(); } private connect(url: string): ClientHttp2Session { return this.connectOptions === undefined ? http2.connect(url) : http2.connect(url, this.connectOptions); } } ================================================ FILE: packages/node-http-handler/src/node-http2-connection-pool.ts ================================================ import type { ClientHttp2Session } from "node:http2"; import type { ConnectionPool } from "@smithy/types"; import { ClientHttp2SessionRef } from "./http2/ClientHttp2SessionRef"; /** * These are keyed by URL, therefore all sessions within this class' state * are for the same URL. * * Sessions remain in the pool for their entire lifetime (until destroyed or * removed). The pool tracks capacity via each session's ref count. * * Interface implementation changed from ConnectionPool. * @since 4.6.0 * @internal */ export class NodeHttp2ConnectionPool implements ConnectionPool { private readonly sessions: ClientHttp2SessionRef[] = []; private maxConcurrency = 0; constructor(sessions?: ClientHttp2Session[]) { this.sessions = (sessions ?? []).map((session: ClientHttp2Session) => new ClientHttp2SessionRef(session)); } /** * Find a session with available capacity (refs < maxConcurrency). * Returns undefined if all sessions are at capacity or the pool is empty. */ public poll(): ClientHttp2SessionRef | undefined { let cleanup = false; for (const session of this.sessions) { if (session.deref().destroyed) { cleanup = true; continue; } if (!this.maxConcurrency || session.useCount() < this.maxConcurrency) { return session; } } if (cleanup) { for (const session of this.sessions) { if (session.deref().destroyed) { this.remove(session); } } } } /** * Add a session to the pool. */ public offerLast(ref: ClientHttp2SessionRef): void { this.sessions.push(ref); } public remove(ref: ClientHttp2SessionRef): void { const ix = this.sessions.indexOf(ref); if (ix > -1) { this.sessions.splice(ix, 1); } } public [Symbol.iterator]() { return this.sessions[Symbol.iterator](); } public setMaxConcurrency(maxConcurrency: number): void { this.maxConcurrency = maxConcurrency; } /** * This is unused, but part of the interface. * @deprecated */ public destroy(ref: ClientHttp2SessionRef): void { this.remove(ref); ref.destroy(); } } ================================================ FILE: packages/node-http-handler/src/node-http2-handler.spec.ts ================================================ import { rejects } from "node:assert"; import http2, { constants, type ClientHttp2Session, type ClientHttp2Stream, type Http2Server, type Http2Session, type Http2Stream, } from "node:http2"; import { Duplex } from "node:stream"; import { promisify } from "node:util"; import { AbortController as AbortControllerPolyfill } from "@smithy/abort-controller"; import { HttpRequest, type HttpResponse } from "@smithy/core/protocols"; import type { Mutable } from "@smithy/types"; import getPort, { portNumbers } from "get-port"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import type { ClientHttp2SessionRef } from "./http2/ClientHttp2SessionRef"; import type { NodeHttp2ConnectionManager } from "./node-http2-connection-manager"; import { NodeHttp2ConnectionPool } from "./node-http2-connection-pool"; import { NodeHttp2Handler, type NodeHttp2HandlerOptions } from "./node-http2-handler"; import { createMockHttp2Server, createResponseFunction, createResponseFunctionWithDelay } from "./server.mock"; import { timing } from "./timing"; const getConnectionManager = (handler: NodeHttp2Handler) => (handler as any).connectionManager as NodeHttp2ConnectionManager; const getConnectionPools = (handler: NodeHttp2Handler) => (getConnectionManager(handler) as any).connectionPools as Map; const getSessions = (handler: NodeHttp2Handler, authority: string) => (getConnectionPools(handler).get(authority) as any).sessions as ClientHttp2SessionRef[]; const getFirstSession = (handler: NodeHttp2Handler, authority: string) => getSessions(handler, authority)[0]; describe(NodeHttp2Handler.name, () => { let nodeH2Handler: NodeHttp2Handler; const protocol = "http:"; const hostname = "localhost"; let port1: number = 0; let port2: number = 0; let port3: number = 0; let port4: number = 0; let mockH2Server: any = undefined; const mockH2Servers: Record = {}; let authority: string; const getMockReqOptions = () => ({ protocol, hostname, port: port1, method: "GET", path: "/", headers: {}, }); const mockResponse = { statusCode: 200, headers: {}, body: "test", }; beforeEach(async () => { for (let i = 0; i < 4; ++i) { const port = await getPort({ port: portNumbers(45_341, 50_000) }); mockH2Servers[port] = createMockHttp2Server().listen(port); } [port1, port2, port3, port4] = Object.keys(mockH2Servers).map(Number); authority = `${protocol}//${hostname}:${port1}/`; mockH2Server = mockH2Servers[port1]; mockH2Server.on("request", createResponseFunction(mockResponse)); }); afterEach(() => { mockH2Server.removeAllListeners("request"); vi.clearAllMocks(); for (const p in mockH2Servers) { mockH2Servers[p].removeAllListeners("request"); mockH2Servers[p].close(); } Object.keys(mockH2Servers).forEach((key) => { delete mockH2Servers[key]; }); }); describe.each([ ["undefined", undefined], ["empty object", {}], ["undefined provider", async () => void 0], ["empty object provider", async () => ({})], ])("without options in constructor parameter of %s", (_, option) => { let createdSessions!: ClientHttp2Session[]; const connectReal = http2.connect; let connectSpy!: typeof http2.connect; beforeEach(() => { createdSessions = []; connectSpy = vi.spyOn(http2, "connect").mockImplementation((...args: any[]) => { const session = connectReal(args[0], args[1]); vi.spyOn(session, "ref"); vi.spyOn(session, "unref"); vi.spyOn(session, "settings"); createdSessions.push(session); return session; }) as any; nodeH2Handler = new NodeHttp2Handler(option); }); const closeConnection = async (response: HttpResponse) => { const responseBody = response.body as ClientHttp2Stream; const closePromise = new Promise((resolve) => responseBody.once("close", resolve)); responseBody.destroy(); await closePromise; }; // Keeping node alive while request is open. // With ref-counting: constructor calls unref once, each get() calls ref once. const expectSessionCreatedAndReferred = (session: ClientHttp2Session, requestCount = 1) => { expect(session.ref).toHaveBeenCalledTimes(requestCount); expect(session.unref).toHaveBeenCalledTimes(1); // initial unref in constructor }; // No longer keeping node alive. // With ref-counting: constructor calls unref once, each get() calls ref once, // free() calls unref when refcount reaches zero. const expectSessionCreatedAndUnreffed = (session: ClientHttp2Session, requestCount = 1) => { expect(session.ref).toHaveBeenCalledTimes(requestCount); // 1 (constructor) + 1 (final free reaching zero) expect(session.unref).toHaveBeenCalledTimes(2); }; // Session was destroyed (e.g. goaway/error), free() is a no-op on destroyed sessions. const expectSessionCreatedAndDestroyed = (session: ClientHttp2Session, requestCount = 1) => { expect(session.ref).toHaveBeenCalledTimes(requestCount); expect(session.unref).toHaveBeenCalledTimes(1); // only constructor unref }; afterEach(() => { nodeH2Handler.destroy(); }); it("has metadata", () => { expect(nodeH2Handler.metadata.handlerProtocol).toContain("h2"); }); describe("number calls to http2.connect", () => { it("is zero on initialization", () => { expect(connectSpy).not.toHaveBeenCalled(); }); it("is one when request is made", async () => { // Make single request. const { response } = await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledTimes(1); expect(connectSpy).toHaveBeenCalledWith(authority); expectSessionCreatedAndReferred(createdSessions[0]); await closeConnection(response); expectSessionCreatedAndUnreffed(createdSessions[0]); }); it("is one if multiple requests are made on same URL", async () => { const connectSpy = vi.spyOn(http2, "connect"); // Make two requests. const { response: response1 } = await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const { response: response2 } = await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledTimes(1); expect(connectSpy).toHaveBeenCalledWith(authority); expectSessionCreatedAndReferred(createdSessions[0], 2); await closeConnection(response1); await closeConnection(response2); expectSessionCreatedAndUnreffed(createdSessions[0], 2); }); it("is many if requests are made on different URLs", async () => { const connectSpy = vi.spyOn(http2, "connect"); // Make first request on default URL. const { response: response1 } = await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const mockH2Server2 = mockH2Servers[port2]; mockH2Server2.on("request", createResponseFunction(mockResponse)); // Make second request on URL with port2. const { response: response2 } = await nodeH2Handler.handle( new HttpRequest({ ...getMockReqOptions(), port: port2 }), {} ); const authorityPrefix = `${protocol}//${hostname}`; expect(connectSpy).toHaveBeenCalledTimes(2); expect(connectSpy).toHaveBeenNthCalledWith(1, `${authorityPrefix}:${port1}/`); expect(connectSpy).toHaveBeenNthCalledWith(2, `${authorityPrefix}:${port2}/`); mockH2Server2.close(); expectSessionCreatedAndReferred(createdSessions[0]); expectSessionCreatedAndReferred(createdSessions[1]); await closeConnection(response1); await closeConnection(response2); expectSessionCreatedAndUnreffed(createdSessions[0]); expectSessionCreatedAndUnreffed(createdSessions[1]); }); }); describe("errors", () => { const UNEXPECTEDLY_CLOSED_REGEX = /closed|destroy|cancel|did not get a response|failed/i; it("handles goaway frames", async () => { const mockH2Server3 = mockH2Servers[port3]; let establishedConnections = 0; let numRequests = 0; let shouldSendGoAway = true; mockH2Server3.on("stream", (request: Http2Stream) => { // transmit goaway frame without shutting down the connection // to simulate an unlikely error mode. numRequests += 1; if (shouldSendGoAway) { request.session!.goaway(constants.NGHTTP2_PROTOCOL_ERROR); } }); mockH2Server3.on("connection", () => { establishedConnections += 1; }); const req = new HttpRequest({ ...getMockReqOptions(), port: port3 }); expect(establishedConnections).toBe(0); expect(numRequests).toBe(0); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to goaway frame" ); expect(establishedConnections).toBe(1); expect(numRequests).toBe(1); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to goaway frame" ); expect(establishedConnections).toBe(2); expect(numRequests).toBe(2); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to goaway frame" ); expect(establishedConnections).toBe(3); expect(numRequests).toBe(3); // Not keeping node alive expect(createdSessions).toHaveLength(3); expectSessionCreatedAndDestroyed(createdSessions[0]); expectSessionCreatedAndDestroyed(createdSessions[1]); expectSessionCreatedAndDestroyed(createdSessions[2]); // should be able to recover from goaway after reconnecting to a server // that doesn't send goaway, and reuse the TCP connection (Http2Session) shouldSendGoAway = false; mockH2Server3.on("request", createResponseFunction(mockResponse)); const result = await nodeH2Handler.handle(req, {}); const resultReader = result.response.body; // Keeping node alive expect(createdSessions).toHaveLength(4); expectSessionCreatedAndReferred(createdSessions[3]); // ...and validate that the mocked response is received const responseBody = await new Promise((resolve) => { const buffers: any[] = []; resultReader.on("data", (chunk: any) => buffers.push(chunk)); resultReader.on("close", () => { resolve(Buffer.concat(buffers).toString("utf8")); }); }); expect(responseBody).toBe("test"); expect(establishedConnections).toBe(4); expect(numRequests).toBe(4); mockH2Server3.close(); // Not keeping node alive expect(createdSessions).toHaveLength(4); expectSessionCreatedAndUnreffed(createdSessions[3]); }); it("handles servers calling connections destroy", async () => { const port = port2; const mockH2Server4 = mockH2Servers[port]; let establishedConnections = 0; let numRequests = 0; mockH2Server4.on("stream", (request: Http2Stream) => { numRequests += 1; (request.session as any)!.destroy(); }); mockH2Server4.on("connection", () => { establishedConnections += 1; }); const req = new HttpRequest({ ...getMockReqOptions(), port }); expect(establishedConnections).toBe(0); expect(numRequests).toBe(0); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to destroyed connection" ); expect(establishedConnections).toBe(1); expect(numRequests).toBe(1); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to destroyed connection" ); expect(establishedConnections).toBe(2); expect(numRequests).toBe(2); await rejects( nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX, "should be rejected promptly due to destroyed connection" ); expect(establishedConnections).toBe(3); expect(numRequests).toBe(3); mockH2Server4.close(); // Not keeping node alive expect(createdSessions).toHaveLength(3); expectSessionCreatedAndDestroyed(createdSessions[0]); expectSessionCreatedAndDestroyed(createdSessions[1]); expectSessionCreatedAndDestroyed(createdSessions[2]); }); it("handles servers calling connections close", async () => { const port = port3; const mockH2Server4 = mockH2Servers[port]; mockH2Server4.on("stream", (request: Http2Stream) => { // Server gracefully closes the session (sends GOAWAY with NO_ERROR) // and resets the stream so it completes. request.close(); (request.session as any)!.close(); }); const req = new HttpRequest({ ...getMockReqOptions(), port }); // Each request should be rejected because the server closes // without sending a response. Subsequent requests may fail // client-side (frameError on closed session) before reaching // the server. await rejects(nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX); await rejects(nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX); await rejects(nodeH2Handler.handle(req, {}), UNEXPECTEDLY_CLOSED_REGEX); mockH2Server4.close(); }); }); describe("destroy", () => { it("destroys session and clears connectionPools", async () => { await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const sessionRef = getFirstSession(nodeH2Handler, authority); const session: ClientHttp2Session = sessionRef.deref(); expect(getConnectionPools(nodeH2Handler).size).toBe(1); expect(session.destroyed).toBe(false); nodeH2Handler.destroy(); expect(getConnectionPools(nodeH2Handler).size).toBe(0); expect(session.destroyed).toBe(true); }); }); describe("abortSignal", () => { it("will not create session if request already aborted", async () => { expect(getConnectionPools(nodeH2Handler).size).toBe(0); await expect( nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), { abortSignal: { aborted: true, onabort: null, }, }) ).rejects.toHaveProperty("name", "AbortError"); expect(getConnectionPools(nodeH2Handler).size).toBe(0); }); it("will not create request on session if request already aborted", async () => { // Create a session by sending a request. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const session: ClientHttp2Session = getFirstSession(nodeH2Handler, authority).deref(); const requestSpy = vi.spyOn(session, "request"); await expect( nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), { abortSignal: { aborted: true, onabort: null, }, }) ).rejects.toHaveProperty("name", "AbortError"); expect(requestSpy.mock.calls.length).toBe(0); }); it.each([ { AbortController, label: "native" }, { AbortController: AbortControllerPolyfill, label: "polyfill" }, ])("will close request on session when aborted ($label)", async ({ AbortController }) => { const abortController = new AbortController(); mockH2Server.removeAllListeners("request"); mockH2Server.on("request", () => { abortController.abort(); return createResponseFunction(mockResponse); }); await expect( nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), { abortSignal: abortController.signal, }) ).rejects.toHaveProperty("name", "AbortError"); }); }); }); describe("requestTimeout", () => { const requestTimeout = 200; describe("does not throw error when request not timed out", () => { it.each([ ["static object", { requestTimeout }], ["object provider", async () => ({ requestTimeout })], ])("disableConcurrentStreams: false (default) in constructor parameter of %s", async (_, options) => { mockH2Server.removeAllListeners("request"); mockH2Server.on("request", createResponseFunctionWithDelay(mockResponse, requestTimeout - 100)); nodeH2Handler = new NodeHttp2Handler(options); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); }); it.each([ ["static object", { requestTimeout, disableConcurrentStreams: true }], ["object provider", async () => ({ requestTimeout, disableConcurrentStreams: true })], ])("disableConcurrentStreams: true in constructor parameter of %s", async (_, options) => { mockH2Server.removeAllListeners("request"); mockH2Server.on("request", createResponseFunctionWithDelay(mockResponse, requestTimeout - 100)); nodeH2Handler = new NodeHttp2Handler(options); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); }); }); describe("throws timeoutError on requestTimeout", () => { it.each([ ["static object", { requestTimeout }], ["object provider", async () => ({ requestTimeout })], ])("disableConcurrentStreams: false (default) in constructor parameter of %s", async (_, options) => { mockH2Server.removeAllListeners("request"); mockH2Server.on("request", createResponseFunctionWithDelay(mockResponse, requestTimeout + 100)); nodeH2Handler = new NodeHttp2Handler(options); await rejects(nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}), { name: "TimeoutError", message: `Stream timed out because of no activity for ${requestTimeout} ms`, }); }); it.each([ ["object provider", async () => ({ requestTimeout })], ["static object", { requestTimeout }], ])("disableConcurrentStreams: true in constructor parameter of %s", async () => { mockH2Server.removeAllListeners("request"); mockH2Server.on("request", createResponseFunctionWithDelay(mockResponse, requestTimeout + 100)); nodeH2Handler = new NodeHttp2Handler({ requestTimeout, disableConcurrentStreams: true }); await rejects(nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}), { name: "TimeoutError", message: `Stream timed out because of no activity for ${requestTimeout} ms`, }); }); }); }); describe("sessionTimeout", () => { const sessionTimeout = 200; describe("destroys sessions on sessionTimeout", () => { it.each([ ["object provider", async () => ({ sessionTimeout })], ["static object", { sessionTimeout }], ])("disableConcurrentStreams: false (default) in constructor parameter of %s", async (_, options) => { nodeH2Handler = new NodeHttp2Handler(options); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), { requestTimeout: sessionTimeout }); const session: ClientHttp2Session = getFirstSession(nodeH2Handler, authority).deref(); expect(session.destroyed).toBe(false); expect(getSessions(nodeH2Handler, authority).length).toStrictEqual(1); await promisify(setTimeout)(sessionTimeout + 100); expect(session.destroyed).toBe(true); expect(getSessions(nodeH2Handler, authority).length).toStrictEqual(0); }); it.each([ ["object provider", async () => ({ sessionTimeout, disableConcurrentStreams: true })], ["static object", { sessionTimeout, disableConcurrentStreams: true }], ])("disableConcurrentStreams: true in constructor parameter of %s", async (_, options) => { let session: any; nodeH2Handler = new NodeHttp2Handler(options); const connectReal = http2.connect; vi.spyOn(http2, "connect").mockImplementation((...args: any[]) => { session = connectReal(args[0], args[1]); return session; }); mockH2Server.removeAllListeners("request"); mockH2Server.on("request", (request: any, response: any) => { createResponseFunction(mockResponse)(request, response); }); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(session?.destroyed).toBe(false); await promisify(setTimeout)(sessionTimeout + 100); expect(session?.destroyed).toBe(true); }); }); }); describe("maxConcurrency", () => { it.each([ ["static object", {}], ["static object", { maxConcurrentStreams: 0 }], ["static object", { maxConcurrentStreams: 1 }], ["static object", { maxConcurrentStreams: 2 }], ["static object", { maxConcurrentStreams: 3 }], ])("verify session settings' maxConcurrentStreams", async (_, options: NodeHttp2HandlerOptions) => { nodeH2Handler = new NodeHttp2Handler(options); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const session = getFirstSession(nodeH2Handler, authority).deref(); if (options.maxConcurrentStreams) { expect(session.localSettings.maxConcurrentStreams).toBe(options.maxConcurrentStreams); } else { expect(session.localSettings.maxConcurrentStreams).toBe(4294967295); } }); it("verify error thrown when maxConcurrentStreams is negative", async () => { let error: Error | undefined = undefined; try { nodeH2Handler = new NodeHttp2Handler({ maxConcurrentStreams: -1 }); const options = getMockReqOptions(); await nodeH2Handler.handle(new HttpRequest(options), {}); } catch (e) { error = e; } expect(error).toBeDefined(); expect(error!.message).toEqual("maxConcurrentStreams must be greater than zero."); }); }); it("will throw reasonable error when connection aborted abnormally", async () => { nodeH2Handler = new NodeHttp2Handler(); // Create a session by sending a request. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const session: ClientHttp2Session = getFirstSession(nodeH2Handler, authority).deref(); const fakeStream = new Duplex() as ClientHttp2Stream; const fakeRstCode = 1; // @ts-ignore: fake result code (fakeStream as Mutable).rstCode = fakeRstCode; vi.spyOn(session, "request").mockImplementation(() => fakeStream); getConnectionPools(nodeH2Handler).set(authority, new NodeHttp2ConnectionPool([session])); // Delay response so that onabort is called earlier timing.setTimeout(() => { fakeStream.emit("aborted"); }, 0); await expect(nodeH2Handler.handle(new HttpRequest({ ...getMockReqOptions() }), {})).rejects.toHaveProperty( "message", `HTTP/2 stream is abnormally aborted in mid-communication with result code ${fakeRstCode}.` ); }); it("will throw reasonable error when frameError is thrown", async () => { nodeH2Handler = new NodeHttp2Handler(); // Create a session by sending a request. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const session: ClientHttp2Session = getFirstSession(nodeH2Handler, authority).deref(); const fakeStream = new Duplex() as ClientHttp2Stream; vi.spyOn(session, "request").mockImplementation(() => fakeStream); getConnectionPools(nodeH2Handler).set(authority, new NodeHttp2ConnectionPool([session])); // Delay response so that onabort is called earlier timing.setTimeout(() => { fakeStream.emit("frameError", "TYPE", "CODE", "ID"); }, 0); await expect(nodeH2Handler.handle(new HttpRequest({ ...getMockReqOptions() }), {})).rejects.toHaveProperty( "message", `Frame type id TYPE in stream id ID has failed with code CODE.` ); }); describe("per-request requestTimeout", () => { it("should use per-request timeout over handler config timeout", async () => { const nodeH2Handler = new NodeHttp2Handler({ requestTimeout: 5000 }); const mockH2Server = mockH2Servers[port1]; mockH2Server.removeAllListeners("request"); mockH2Server.on("request", () => { // don't respond - let it timeout }); const mockRequest = new HttpRequest(getMockReqOptions()); const start = Date.now(); await expect(nodeH2Handler.handle(mockRequest, { requestTimeout: 100 })).rejects.toHaveProperty( "name", "TimeoutError" ); const elapsed = Date.now() - start; expect(elapsed).toBeLessThan(200); }); it("should fall back to handler config timeout when per-request timeout not provided", async () => { const nodeH2Handler = new NodeHttp2Handler({ requestTimeout: 100 }); const mockH2Server = mockH2Servers[port1]; mockH2Server.removeAllListeners("request"); mockH2Server.on("request", () => {}); const mockRequest = new HttpRequest(getMockReqOptions()); const start = Date.now(); await expect(nodeH2Handler.handle(mockRequest, {})).rejects.toHaveProperty("name", "TimeoutError"); const elapsed = Date.now() - start; expect(elapsed).toBeLessThan(200); }); }); describe.each([ ["object provider", async () => ({ disableConcurrentStreams: true })], ["static object", { disableConcurrentStreams: true }], ])("disableConcurrentStreams in constructor parameter of %s", (_, options) => { beforeEach(() => { nodeH2Handler = new NodeHttp2Handler(options); }); describe("number calls to http2.connect", () => { it("is zero on initialization", () => { const connectSpy = vi.spyOn(http2, "connect"); expect(connectSpy).not.toHaveBeenCalled(); }); it("is one when request is made", async () => { const connectSpy = vi.spyOn(http2, "connect"); // Make single request. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledTimes(1); expect(connectSpy).toHaveBeenCalledWith(authority); }); it("is many if multiple requests are made on same URL", async () => { const connectSpy = vi.spyOn(http2, "connect"); // Make two requests. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledTimes(2); expect(connectSpy).toHaveBeenNthCalledWith(1, authority); expect(connectSpy).toHaveBeenNthCalledWith(2, authority); }); it("is many if requests are made on different URLs", async () => { const connectSpy = vi.spyOn(http2, "connect"); // Make first request on default URL. await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); const mockH2Server2 = mockH2Servers[port2]; mockH2Server2.on("request", createResponseFunction(mockResponse)); // Make second request on URL with port2. await nodeH2Handler.handle(new HttpRequest({ ...getMockReqOptions(), port: port2 }), {}); const authorityPrefix = `${protocol}//${hostname}`; expect(connectSpy).toHaveBeenCalledTimes(2); expect(connectSpy).toHaveBeenNthCalledWith(1, `${authorityPrefix}:${port1}/`); expect(connectSpy).toHaveBeenNthCalledWith(2, `${authorityPrefix}:${port2}/`); mockH2Server2.close(); }); }); describe("destroy", () => { it("destroys session and empties connectionPools", async () => { const connectReal = http2.connect; let createdSession: ClientHttp2Session | undefined; vi.spyOn(http2, "connect").mockImplementation((...args: any[]) => { const session = connectReal(args[0], args[1]); createdSession = session; return session; }); await nodeH2Handler.handle(new HttpRequest(getMockReqOptions()), {}); // Isolated sessions (disableConcurrentStreams) are not in the pool. expect(createdSession).toBeDefined(); expect(createdSession!.destroyed).toBe(false); nodeH2Handler.destroy(); // Pool should be empty (isolated sessions were never added). expect(getConnectionPools(nodeH2Handler).size).toBe(0); }); }); }); describe("server", () => { let server: Http2Server; beforeEach(async () => { const port = await getPort({ port: portNumbers(45_321, 50_000) }); server = createMockHttp2Server().listen(port); }); afterEach(() => { server.close(); }); it("sends the request to the correct url", async () => { server.on("request", (request, response) => { expect(request.url).toBe("http://foo:bar@localhost/foo/bar?foo=bar#foo"); response.statusCode = 200; }); const handler = new NodeHttp2Handler({}); await handler.handle({ ...getMockReqOptions(), username: "foo", password: "bar", path: "/foo/bar", query: { foo: "bar" }, fragment: "foo", } as any); handler.destroy(); }); it("put HttpClientConfig", async () => { server.on("request", (request, response) => { expect(request.url).toBe("http://foo:bar@localhost/"); response.statusCode = 200; }); const handler = new NodeHttp2Handler({}); const requestTimeout = 200; handler.updateHttpClientConfig("requestTimeout", requestTimeout); await handler.handle({ ...getMockReqOptions(), username: "foo", password: "bar", path: "/", } as any); handler.destroy(); expect(handler.httpHandlerConfigs().requestTimeout).toEqual(requestTimeout); }); it("update existing HttpClientConfig", async () => { server.on("request", (request, response) => { expect(request.url).toBe("http://foo:bar@localhost/"); response.statusCode = 200; }); const handler = new NodeHttp2Handler({ requestTimeout: 200 }); const requestTimeout = 300; handler.updateHttpClientConfig("requestTimeout", requestTimeout); await handler.handle({ ...getMockReqOptions(), username: "foo", password: "bar", path: "/", } as any); handler.destroy(); expect(handler.httpHandlerConfigs().requestTimeout).toEqual(requestTimeout); }); }); it("httpHandlerConfigs returns empty object if handle is not called", async () => { const nodeHttpHandler = new NodeHttp2Handler(); expect(nodeHttpHandler.httpHandlerConfigs()).toEqual({}); }); describe("ref-counting for http2 sessions", () => { let createdSessions: ClientHttp2Session[]; const connectReal = http2.connect; beforeEach(() => { createdSessions = []; vi.spyOn(http2, "connect").mockImplementation((...args: any[]) => { const session = connectReal(args[0], args[1]); vi.spyOn(session, "ref"); vi.spyOn(session, "unref"); createdSessions.push(session); return session; }); }); it("acquires ref on request start and releases on stream close", async () => { const handler = new NodeHttp2Handler(); const { response } = await handler.handle(new HttpRequest(getMockReqOptions()), {}); const session = createdSessions[0]; // constructor unref + get() ref = session is ref'd (keeping node alive) expect(session.unref).toHaveBeenCalledTimes(1); expect(session.ref).toHaveBeenCalledTimes(1); // close the response stream to trigger req "close" -> ref.free() const body = response.body as ClientHttp2Stream; const closePromise = new Promise((resolve) => body.once("close", resolve)); body.destroy(); await closePromise; // free() reached zero -> unref called again expect(session.unref).toHaveBeenCalledTimes(2); handler.destroy(); }); it("maintains positive refcount across concurrent requests on same session", async () => { const handler = new NodeHttp2Handler(); const { response: r1 } = await handler.handle(new HttpRequest(getMockReqOptions()), {}); const { response: r2 } = await handler.handle(new HttpRequest(getMockReqOptions()), {}); const session = createdSessions[0]; // 1 session, 2 get() calls expect(createdSessions).toHaveLength(1); expect(session.ref).toHaveBeenCalledTimes(2); // only constructor unref so far (refcount is 2, not zero) expect(session.unref).toHaveBeenCalledTimes(1); // close first stream — refcount drops to 1, no unref const body1 = r1.body as ClientHttp2Stream; const close1 = new Promise((resolve) => body1.once("close", resolve)); body1.destroy(); await close1; expect(session.unref).toHaveBeenCalledTimes(1); // still 1 // close second stream — refcount drops to 0, unref called const body2 = r2.body as ClientHttp2Stream; const close2 = new Promise((resolve) => body2.once("close", resolve)); body2.destroy(); await close2; expect(session.unref).toHaveBeenCalledTimes(2); handler.destroy(); }); it("opens additional sessions when maxConcurrentStreams is reached", async () => { const maxConcurrentStreams = 3; const totalRequests = 10; const handler = new NodeHttp2Handler({ maxConcurrentStreams }); // Fire all requests concurrently. const responses = await Promise.all( Array.from({ length: totalRequests }, () => handler.handle(new HttpRequest(getMockReqOptions()), {})) ); // 10 requests at concurrency 3 = ceil(10/3) = 4 sessions. expect(createdSessions).toHaveLength(4); const pools = getConnectionManager(handler).debug(); const sessions = pools[authority].sessions; const inFlightCounts = sessions.map((s: any) => s.active).sort(); expect(inFlightCounts).toEqual([1, 3, 3, 3]); // Close all streams. for (const { response } of responses) { const body = response.body as ClientHttp2Stream; const close = new Promise((resolve) => body.once("close", resolve)); body.destroy(); await close; } const poolsAfter = getConnectionManager(handler).debug(); for (const s of poolsAfter[authority].sessions) { expect(s.active).toBe(0); } handler.destroy(); }); }); describe("nodeHttp2ConnectOptions", () => { it("passes nodeHttp2ConnectOptions to http2.connect", async () => { const handler = new NodeHttp2Handler({ nodeHttp2ConnectOptions: { maxSessionMemory: 64 } }); const connectSpy = vi.spyOn(http2, "connect"); await handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledWith(authority, { maxSessionMemory: 64 }); handler.destroy(); }); it("passes nodeHttp2ConnectOptions to http2.connect for isolated sessions", async () => { const handler = new NodeHttp2Handler({ disableConcurrentStreams: true, nodeHttp2ConnectOptions: { maxSessionMemory: 64 }, }); const connectSpy = vi.spyOn(http2, "connect"); await handler.handle(new HttpRequest(getMockReqOptions()), {}); expect(connectSpy).toHaveBeenCalledWith(authority, { maxSessionMemory: 64 }); handler.destroy(); }); }); }); ================================================ FILE: packages/node-http-handler/src/node-http2-handler.ts ================================================ import { constants, type ClientSessionOptions, type SecureClientSessionOptions } from "node:http2"; import { HttpResponse, buildQueryString, type HttpHandler, type HttpRequest } from "@smithy/core/protocols"; import type { HttpHandlerOptions, Provider, RequestContext } from "@smithy/types"; import { buildAbortError } from "./build-abort-error"; import { getTransformedHeaders } from "./get-transformed-headers"; import { NodeHttp2ConnectionManager } from "./node-http2-connection-manager"; import { writeRequestBody } from "./write-request-body"; /** * Represents the http2 options that can be passed to a node http2 client. * @public */ export interface NodeHttp2HandlerOptions { /** * The maximum time in milliseconds that a stream may remain idle before it * is closed. */ requestTimeout?: number; /** * The maximum time in milliseconds that a session or socket may remain idle * before it is closed. * https://nodejs.org/docs/latest-v12.x/api/http2.html#http2_http2session_and_sockets */ sessionTimeout?: number; /** * Disables processing concurrent streams on a ClientHttp2Session instance. When set * to true, a new session instance is created for each request to a URL. * **Default:** false. * https://nodejs.org/api/http2.html#http2_class_clienthttp2session */ disableConcurrentStreams?: boolean; /** * Maximum number of concurrent Http2Stream instances per ClientHttp2Session. Each session * may have up to 2^31-1 Http2Stream instances over its lifetime. * This value must be greater than or equal to 0. * https://nodejs.org/api/http2.html#class-http2stream */ maxConcurrentStreams?: number; /** * A set of raw options that will be passed to http2.connect. * https://nodejs.org/api/http2.html#http2connectauthority-options-listener */ nodeHttp2ConnectOptions?: Partial; } /** * This is derived from the smithyContext object. This signals to the NodeHttp2Handler specifically * that the connection pool should not be used to acquire a connection. The event stream should * have its own new connection. * * This does not apply to WebSocket event streams, since there is no pooling. * * @internal */ type EventStreamSignal = { isEventStream?: boolean; }; /** * A request handler using the node:http2 package. * @public */ export class NodeHttp2Handler implements HttpHandler { private config?: NodeHttp2HandlerOptions; private configProvider: Promise; public readonly metadata = { handlerProtocol: "h2" }; private readonly connectionManager: NodeHttp2ConnectionManager = new NodeHttp2ConnectionManager({}); /** * @returns the input if it is an HttpHandler of any class, * or instantiates a new instance of this handler. */ public static create( instanceOrOptions?: HttpHandler | NodeHttp2HandlerOptions | Provider ) { if (typeof (instanceOrOptions as any)?.handle === "function") { // is already an instance of HttpHandler. return instanceOrOptions as HttpHandler; } // input is ctor options or undefined. return new NodeHttp2Handler(instanceOrOptions as NodeHttp2HandlerOptions); } constructor(options?: NodeHttp2HandlerOptions | Provider) { this.configProvider = new Promise((resolve, reject) => { if (typeof options === "function") { options() .then((opts) => { resolve(opts || {}); }) .catch(reject); } else { resolve(options || {}); } }); } public destroy(): void { this.connectionManager.destroy(); } public async handle( request: HttpRequest, { abortSignal, requestTimeout, isEventStream }: HttpHandlerOptions & EventStreamSignal = {} ): Promise<{ response: HttpResponse }> { if (!this.config) { this.config = await this.configProvider; const { disableConcurrentStreams, maxConcurrentStreams, nodeHttp2ConnectOptions } = this.config; this.connectionManager.setDisableConcurrentStreams(disableConcurrentStreams ?? false); if (maxConcurrentStreams) { this.connectionManager.setMaxConcurrentStreams(maxConcurrentStreams); } if (nodeHttp2ConnectOptions) { this.connectionManager.setNodeHttp2ConnectOptions(nodeHttp2ConnectOptions); } } const { requestTimeout: configRequestTimeout, disableConcurrentStreams } = this.config; const useIsolatedSession = disableConcurrentStreams || isEventStream; const effectiveRequestTimeout = requestTimeout ?? configRequestTimeout; return new Promise((_resolve, _reject) => { // It's redundant to track fulfilled because promises use the first resolution/rejection // but avoids generating unnecessary stack traces in the "close" event handler. let fulfilled = false; let writeRequestBodyPromise: Promise | undefined = undefined; const resolve = async (arg: { response: HttpResponse }) => { await writeRequestBodyPromise; _resolve(arg); }; const reject = async (arg: unknown) => { await writeRequestBodyPromise; _reject(arg); }; // if the request was already aborted, prevent doing extra work if (abortSignal?.aborted) { fulfilled = true; const abortError = buildAbortError(abortSignal); reject(abortError); return; } const { hostname, method, port, protocol, query } = request; let auth = ""; if (request.username != null || request.password != null) { const username = request.username ?? ""; const password = request.password ?? ""; auth = `${username}:${password}@`; } const authority = `${protocol}//${auth}${hostname}${port ? `:${port}` : ""}`; const requestContext = { destination: new URL(authority) } as RequestContext; const connectConfig = { requestTimeout: this.config?.sessionTimeout, isEventStream, }; const ref = useIsolatedSession ? this.connectionManager.createIsolatedSession(requestContext, connectConfig) : this.connectionManager.lease(requestContext, connectConfig); const session = ref.deref(); const rejectWithDestroy = (err: Error) => { if (useIsolatedSession) { ref.destroy(); } fulfilled = true; reject(err); }; const queryString = query ? buildQueryString(query) : ""; let path = request.path; if (queryString) { path += `?${queryString}`; } if (request.fragment) { path += `#${request.fragment}`; } // create the http2 request const clientHttp2Stream = session.request({ ...request.headers, [constants.HTTP2_HEADER_PATH]: path, [constants.HTTP2_HEADER_METHOD]: method, }); if (effectiveRequestTimeout) { clientHttp2Stream.setTimeout(effectiveRequestTimeout, () => { clientHttp2Stream.close(); const timeoutError = new Error(`Stream timed out because of no activity for ${effectiveRequestTimeout} ms`); timeoutError.name = "TimeoutError"; rejectWithDestroy(timeoutError); }); } if (abortSignal) { const onAbort = () => { clientHttp2Stream.close(); const abortError = buildAbortError(abortSignal); rejectWithDestroy(abortError); }; if (typeof (abortSignal as AbortSignal).addEventListener === "function") { // preferred. const signal = abortSignal as AbortSignal; signal.addEventListener("abort", onAbort, { once: true }); clientHttp2Stream.once("close", () => signal.removeEventListener("abort", onAbort)); } else { // backwards compatibility abortSignal.onabort = onAbort; } } // Set up handlers for errors clientHttp2Stream.on("frameError", (type: number, code: number, id: number) => { rejectWithDestroy(new Error(`Frame type id ${type} in stream id ${id} has failed with code ${code}.`)); }); clientHttp2Stream.on("error", rejectWithDestroy); clientHttp2Stream.on("aborted", () => { rejectWithDestroy( new Error( `HTTP/2 stream is abnormally aborted in mid-communication with result code ${clientHttp2Stream.rstCode}.` ) ); }); clientHttp2Stream.on("response", (headers) => { const httpResponse = new HttpResponse({ statusCode: headers[":status"] ?? -1, headers: getTransformedHeaders(headers), body: clientHttp2Stream, }); fulfilled = true; resolve({ response: httpResponse }); if (useIsolatedSession) { // Gracefully closes the Http2Session, allowing any existing streams to complete // on their own and preventing new Http2Stream instances from being created. session.close(); } }); // The HTTP/2 error code used when closing the stream can be retrieved using the // http2stream.rstCode property. If the code is any value other than NGHTTP2_NO_ERROR (0), // an 'error' event will have also been emitted. clientHttp2Stream.on("close", () => { if (useIsolatedSession) { ref.destroy(); } else { this.connectionManager.release(requestContext, ref); } if (!fulfilled) { rejectWithDestroy(new Error("Unexpected error: http2 request did not get a response")); } }); writeRequestBodyPromise = writeRequestBody(clientHttp2Stream, request, effectiveRequestTimeout); }); } public updateHttpClientConfig(key: keyof NodeHttp2HandlerOptions, value: NodeHttp2HandlerOptions[typeof key]): void { this.config = undefined; this.configProvider = this.configProvider.then((config) => { return { ...config, [key]: value, }; }); } public httpHandlerConfigs(): NodeHttp2HandlerOptions { return this.config ?? {}; } } ================================================ FILE: packages/node-http-handler/src/readable.mock.ts ================================================ import { Readable, type ReadableOptions } from "node:stream"; export interface ReadFromBuffersOptions extends ReadableOptions { buffers: Buffer[]; errorAfter?: number; } export class ReadFromBuffers extends Readable { private buffersToRead: Buffer[]; private numBuffersRead = 0; private errorAfter: number; constructor(options: ReadFromBuffersOptions) { super(options); this.buffersToRead = options.buffers; this.errorAfter = typeof options.errorAfter === "number" ? options.errorAfter : -1; } _read() { if (this.errorAfter !== -1 && this.errorAfter === this.numBuffersRead) { this.emit("error", new Error("Mock Error")); return; } if (this.numBuffersRead >= this.buffersToRead.length) { return this.push(null); } return this.push(this.buffersToRead[this.numBuffersRead++]); } } ================================================ FILE: packages/node-http-handler/src/server.mock.ts ================================================ import { readFileSync } from "node:fs"; import { createServer as createHttp2Server, type Http2Server } from "node:http2"; import { createServer as createHttpServer, type Server as HttpServer, type IncomingMessage, type ServerResponse, } from "node:http"; import { createServer as createHttpsServer, type Server as HttpsServer } from "node:https"; import { join } from "node:path"; import { Readable } from "node:stream"; import type { HeaderBag, HttpResponse, NodeJsRuntimeBlobTypes } from "@smithy/types"; import { timing } from "./timing"; const fixturesDir = join(__dirname, "..", "fixtures"); const setResponseHeaders = (response: ServerResponse, headers: HeaderBag) => { for (const [key, value] of Object.entries(headers)) { response.setHeader(key, value); } }; const setResponseBody = (response: ServerResponse, body: string | NodeJsRuntimeBlobTypes) => { if (body instanceof Readable) { body.pipe(response); } else { response.end(body); } }; export const createResponseFunction = (httpResp: HttpResponse) => (request: IncomingMessage, response: ServerResponse) => { response.statusCode = httpResp.statusCode; if (httpResp.reason) { response.statusMessage = httpResp.reason; } setResponseHeaders(response, httpResp.headers); setResponseBody(response, httpResp.body); }; export const createResponseFunctionWithDelay = (httpResp: HttpResponse, delay: number) => (request: IncomingMessage, response: ServerResponse) => { response.statusCode = httpResp.statusCode; if (httpResp.reason) { response.statusMessage = httpResp.reason; } setResponseHeaders(response, httpResp.headers); timing.setTimeout(() => setResponseBody(response, httpResp.body), delay); }; export const createContinueResponseFunction = (httpResp: HttpResponse) => (request: IncomingMessage, response: ServerResponse) => { response.writeContinue(); timing.setTimeout(() => { createResponseFunction(httpResp)(request, response); }, 100); }; export const createMockHttpsServer = (): HttpsServer => { const server = createHttpsServer({ key: readFileSync(join(fixturesDir, "test-server-key.pem")), cert: readFileSync(join(fixturesDir, "test-server-cert.pem")), }); return server; }; export const createMockHttpServer = (): HttpServer => { const server = createHttpServer(); return server; }; export const createMockHttp2Server = (): Http2Server => { const server = createHttp2Server(); return server; }; export const createMirrorResponseFunction = (httpResp: HttpResponse) => (request: IncomingMessage, response: ServerResponse) => { const bufs: Buffer[] = []; request.on("data", (chunk) => { bufs.push(chunk); }); request.on("end", () => { response.statusCode = httpResp.statusCode; setResponseHeaders(response, httpResp.headers); setResponseBody(response, Buffer.concat(bufs)); }); request.on("error", (err) => { response.statusCode = 500; setResponseHeaders(response, httpResp.headers); setResponseBody(response, err.message); }); }; export const getResponseBody = (response: HttpResponse) => { return new Promise((resolve, reject) => { const bufs: Buffer[] = []; response.body.on("data", function (d: Buffer) { bufs.push(d); }); response.body.on("end", function () { resolve(Buffer.concat(bufs).toString()); }); response.body.on("error", (err: Error) => { reject(err); }); }); }; ================================================ FILE: packages/node-http-handler/src/set-connection-timeout.spec.ts ================================================ import EventEmitter from "node:events"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { setConnectionTimeout } from "./set-connection-timeout"; import { timing } from "./timing"; describe("setConnectionTimeout", () => { const reject = vi.fn(); const clientRequest: any = { on: vi.fn(), destroy: vi.fn(), }; vi.spyOn(timing, "setTimeout").mockImplementation(((fn: Function, ms: number) => { return setTimeout(fn, ms); }) as any); vi.spyOn(timing, "clearTimeout").mockImplementation(((timer: any) => { return clearTimeout(timer); }) as any); beforeEach(() => { vi.clearAllMocks(); }); it("will not attach listeners if timeout is 0", () => { setConnectionTimeout(clientRequest, reject, 0); expect(clientRequest.on).not.toHaveBeenCalled(); }); it("will not attach listeners if timeout is not provided", () => { setConnectionTimeout(clientRequest, reject); expect(clientRequest.on).not.toHaveBeenCalled(); }); describe("when timeout is provided", () => { const timeoutInMs = 100; const mockSocket = { connecting: true, on: vi.fn(), }; beforeEach(() => { vi.useFakeTimers(); vi.clearAllMocks(); }); afterEach(() => { vi.advanceTimersByTime(10000); vi.useRealTimers(); }); it("attaches listener", () => { setConnectionTimeout(clientRequest, reject, timeoutInMs); expect(clientRequest.on).toHaveBeenCalledTimes(1); expect(clientRequest.on).toHaveBeenCalledWith("socket", expect.any(Function)); }); it("doesn't set timeout if socket is already connected", () => { setConnectionTimeout(clientRequest, reject, timeoutInMs); expect(mockSocket.on).not.toHaveBeenCalled(); expect(timing.setTimeout).toHaveBeenCalled(); expect(reject).not.toHaveBeenCalled(); }); it("rejects and aborts request if socket isn't connected by timeout", async () => { setConnectionTimeout(clientRequest, reject, timeoutInMs); clientRequest.on.mock.calls[0][1](mockSocket); expect(timing.setTimeout).toHaveBeenCalledTimes(1); expect(timing.setTimeout).toHaveBeenCalledWith(expect.any(Function), timeoutInMs); expect(mockSocket.on).toHaveBeenCalledTimes(1); expect(mockSocket.on).toHaveBeenCalledWith("connect", expect.any(Function)); expect(clientRequest.destroy).not.toHaveBeenCalled(); expect(reject).not.toHaveBeenCalled(); // Fast-forward until timer has been executed. vi.advanceTimersByTime(timeoutInMs); expect(clientRequest.destroy).toHaveBeenCalledTimes(1); expect(reject).toHaveBeenCalledTimes(1); expect(reject).toHaveBeenCalledWith( Object.assign( new Error( `@smithy/node-http-handler - the request socket did not establish a connection with the server within the configured timeout of ${timeoutInMs} ms.` ), { name: "TimeoutError", } ) ); }); it("calls socket operations directly if socket is available", async () => { setConnectionTimeout(clientRequest, reject, timeoutInMs); const request = { on: vi.fn(), socket: { on: vi.fn(), connecting: true, }, destroy() {}, } as any; setConnectionTimeout(request, () => {}, 1); vi.runAllTimers(); expect(request.socket.on).toHaveBeenCalled(); expect(request.on).not.toHaveBeenCalled(); }); it("clears timeout if socket gets connected", () => { const socket = new EventEmitter() as any; socket.connecting = true; setConnectionTimeout( { ...clientRequest, socket, }, reject, timeoutInMs ); expect(clientRequest.destroy).not.toHaveBeenCalled(); expect(reject).not.toHaveBeenCalled(); expect(timing.clearTimeout).not.toHaveBeenCalled(); // Fast-forward for half the amount of time and call connect callback to clear timer. vi.advanceTimersByTime(timeoutInMs / 2); socket.emit("connect"); expect(timing.clearTimeout).toHaveBeenCalled(); // Fast-forward until timer has been executed. vi.runAllTimers(); expect(clientRequest.destroy).not.toHaveBeenCalled(); expect(reject).not.toHaveBeenCalled(); }); }); }); ================================================ FILE: packages/node-http-handler/src/set-connection-timeout.ts ================================================ import type { ClientRequest } from "node:http"; import { timing } from "./timing"; const DEFER_EVENT_LISTENER_TIME = 1000; export const setConnectionTimeout = ( request: ClientRequest, reject: (err: Error) => void, timeoutInMs = 0 ): NodeJS.Timeout | number => { if (!timeoutInMs) { return -1; } const registerTimeout = (offset: number) => { // Throw a connecting timeout error unless a connection is made within time. const timeoutId = timing.setTimeout(() => { request.destroy(); reject( Object.assign( new Error( `@smithy/node-http-handler - the request socket did not establish a connection with the server within the configured timeout of ${timeoutInMs} ms.` ), { name: "TimeoutError", } ) ); }, timeoutInMs - offset); const doWithSocket = (socket: typeof request.socket) => { if (socket?.connecting) { socket.on("connect", () => { timing.clearTimeout(timeoutId); }); } else { timing.clearTimeout(timeoutId); } }; if (request.socket) { doWithSocket(request.socket); } else { request.on("socket", doWithSocket); } }; if (timeoutInMs < 2000) { registerTimeout(0); return 0; } return timing.setTimeout(registerTimeout.bind(null, DEFER_EVENT_LISTENER_TIME), DEFER_EVENT_LISTENER_TIME); }; ================================================ FILE: packages/node-http-handler/src/set-request-timeout.spec.ts ================================================ import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { setRequestTimeout } from "./set-request-timeout"; describe("setRequestTimeout", () => { const reject = vi.fn(); const clientRequest: any = { destroy: vi.fn(), }; beforeEach(() => { vi.clearAllMocks(); }); it("returns -1 if no timeout is given", () => { { const id = setRequestTimeout(clientRequest, reject, 0); expect(id).toEqual(-1); } { const id = setRequestTimeout(clientRequest, reject, undefined); expect(id).toEqual(-1); } }); describe("when timeout is provided", () => { it("rejects after the timeout", async () => { setRequestTimeout(clientRequest, reject, 1, true); await new Promise((r) => setTimeout(r, 2)); expect(reject).toHaveBeenCalledWith( Object.assign( new Error( `@smithy/node-http-handler - [ERROR] a request has exceeded the configured ${1} ms requestTimeout.` ), { name: "TimeoutError", code: "ETIMEDOUT", } ) ); expect(clientRequest.destroy).toHaveBeenCalled(); }); it("logs a warning", async () => { const logger = { ...console, warn: vi.fn(), }; setRequestTimeout(clientRequest, reject, 1, false, logger); await new Promise((r) => setTimeout(r, 2)); expect(logger.warn).toHaveBeenCalledWith( `@smithy/node-http-handler - [WARN] a request has exceeded the configured ${1} ms requestTimeout.` + ` Init client requestHandler with throwOnRequestTimeout=true to turn this into an error.` ); expect(clientRequest.destroy).not.toHaveBeenCalled(); }); }); }); ================================================ FILE: packages/node-http-handler/src/set-request-timeout.ts ================================================ import type { ClientRequest } from "node:http"; import type { Logger } from "@smithy/types"; import { timing } from "./timing"; /** * @internal */ export const setRequestTimeout = ( req: ClientRequest, reject: (err: Error) => void, timeoutInMs = 0, throwOnRequestTimeout?: boolean, logger?: Logger ) => { if (timeoutInMs) { return timing.setTimeout(() => { let msg = `@smithy/node-http-handler - [${ throwOnRequestTimeout ? "ERROR" : "WARN" }] a request has exceeded the configured ${timeoutInMs} ms requestTimeout.`; if (throwOnRequestTimeout) { const error = Object.assign(new Error(msg), { name: "TimeoutError", code: "ETIMEDOUT", }); req.destroy(error); reject(error); } else { msg += ` Init client requestHandler with throwOnRequestTimeout=true to turn this into an error.`; logger?.warn?.(msg); } }, timeoutInMs); } return -1; }; ================================================ FILE: packages/node-http-handler/src/set-socket-keep-alive.spec.ts ================================================ import { EventEmitter } from "node:events"; import type { ClientRequest } from "node:http"; import { Socket } from "node:net"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { setSocketKeepAlive } from "./set-socket-keep-alive"; describe("setSocketKeepAlive", () => { let request: ClientRequest; let socket: Socket; beforeEach(() => { request = new EventEmitter() as ClientRequest; socket = new Socket(); }); it("should set keepAlive to true", () => { setSocketKeepAlive(request, { keepAlive: true }, 0); const setKeepAliveSpy = vi.spyOn(socket, "setKeepAlive"); request.emit("socket", socket); expect(setKeepAliveSpy).toHaveBeenCalled(); expect(setKeepAliveSpy).toHaveBeenCalledWith(true, 0); }); it("should set keepAlive to true with custom initialDelay", () => { const initialDelay = 5 * 1000; setSocketKeepAlive(request, { keepAlive: true, keepAliveMsecs: initialDelay }, 0); const setKeepAliveSpy = vi.spyOn(socket, "setKeepAlive"); request.emit("socket", socket); expect(setKeepAliveSpy).toHaveBeenCalled(); expect(setKeepAliveSpy).toHaveBeenCalledWith(true, initialDelay); }); it("should not set keepAlive at all when keepAlive is false", () => { setSocketKeepAlive(request, { keepAlive: false }, 0); const setKeepAliveSpy = vi.spyOn(socket, "setKeepAlive"); request.emit("socket", socket); expect(setKeepAliveSpy).not.toHaveBeenCalled(); }); it("calls socket operations directly if socket is available", async () => { const request = { on: vi.fn(), socket: { setKeepAlive: vi.fn(), }, } as any; setSocketKeepAlive(request, { keepAlive: true, keepAliveMsecs: 1000 }, 0); expect(request.socket.setKeepAlive).toHaveBeenCalled(); expect(request.on).not.toHaveBeenCalled(); }); }); ================================================ FILE: packages/node-http-handler/src/set-socket-keep-alive.ts ================================================ import type { ClientRequest } from "node:http"; import { timing } from "./timing"; const DEFER_EVENT_LISTENER_TIME = 3000; export interface SocketKeepAliveOptions { keepAlive: boolean; keepAliveMsecs?: number; } export const setSocketKeepAlive = ( request: ClientRequest, { keepAlive, keepAliveMsecs }: SocketKeepAliveOptions, deferTimeMs = DEFER_EVENT_LISTENER_TIME ): NodeJS.Timeout | number => { if (keepAlive !== true) { return -1; } const registerListener = () => { if (request.socket) { request.socket.setKeepAlive(keepAlive, keepAliveMsecs || 0); } else { request.on("socket", (socket) => { socket.setKeepAlive(keepAlive, keepAliveMsecs || 0); }); } }; if (deferTimeMs === 0) { registerListener(); return 0; } return timing.setTimeout(registerListener, deferTimeMs); }; ================================================ FILE: packages/node-http-handler/src/set-socket-timeout.spec.ts ================================================ import { afterAll, beforeEach, describe, expect, test as it, vi } from "vitest"; import { setSocketTimeout } from "./set-socket-timeout"; import { timing } from "./timing"; describe("setSocketTimeout", () => { const clientRequest: any = { destroy: vi.fn(), setTimeout: vi.fn(), }; vi.spyOn(timing, "setTimeout").mockImplementation(((fn: Function, ms: number) => { return setTimeout(fn, ms); }) as any); vi.spyOn(timing, "clearTimeout").mockImplementation(((timer: any) => { return clearTimeout(timer); }) as any); beforeEach(() => { vi.clearAllMocks(); vi.useFakeTimers(); }); afterAll(() => { vi.clearAllMocks(); vi.useRealTimers(); }); it(`sets the request's timeout if provided`, () => { setSocketTimeout(clientRequest, vi.fn(), 100); expect(clientRequest.setTimeout).toHaveBeenCalledTimes(1); expect(clientRequest.setTimeout).toHaveBeenLastCalledWith(100, expect.any(Function)); }); it(`sets the request's timeout to 0 if not provided`, async () => { setSocketTimeout(clientRequest, vi.fn()); vi.runAllTimers(); expect(clientRequest.setTimeout).toHaveBeenCalledTimes(1); expect(clientRequest.setTimeout).toHaveBeenLastCalledWith(0, expect.any(Function)); }); describe("event listener registration deferral", () => { const clientRequestWithSocket: any = { destroy: vi.fn(), setTimeout: vi.fn(), socket: { setTimeout: vi.fn(), }, on: vi.fn(), }; it("calls setTimeout on the socket if it is available after deferral", async () => { const eventListenerMinimumTimeoutToDefer = 6000; const deferralTimeout = 3000; const expectedDeferredSocketTimeout = eventListenerMinimumTimeoutToDefer - deferralTimeout; setSocketTimeout(clientRequestWithSocket, vi.fn(), eventListenerMinimumTimeoutToDefer); vi.runAllTimers(); expect(clientRequestWithSocket.socket.setTimeout).toHaveBeenCalledTimes(1); expect(clientRequestWithSocket.socket.setTimeout).toHaveBeenLastCalledWith( expectedDeferredSocketTimeout, expect.any(Function) ); expect(clientRequestWithSocket.on).toHaveBeenCalledTimes(1); expect(clientRequestWithSocket.on).toHaveBeenLastCalledWith("close", expect.any(Function)); }); }); it(`destroys the request on timeout`, () => { setSocketTimeout(clientRequest, vi.fn(), 1); expect(clientRequest.destroy).not.toHaveBeenCalled(); // call setTimeout callback clientRequest.setTimeout.mock.calls[0][1](); expect(clientRequest.destroy).toHaveBeenCalledTimes(1); }); it(`rejects on timeout with a TimeoutError`, () => { const reject = vi.fn(); const timeoutInMs = 100; setSocketTimeout(clientRequest, reject, timeoutInMs); expect(reject).not.toHaveBeenCalled(); // call setTimeout callback clientRequest.setTimeout.mock.calls[0][1](); expect(reject).toHaveBeenCalledTimes(1); expect(reject).toHaveBeenCalledWith( Object.assign( new Error( `@smithy/node-http-handler - the request socket timed out after ${timeoutInMs} ms of inactivity (configured by client requestHandler).` ), { name: "TimeoutError" } ) ); }); }); ================================================ FILE: packages/node-http-handler/src/set-socket-timeout.ts ================================================ import type { ClientRequest } from "node:http"; import { timing } from "./timing"; const DEFER_EVENT_LISTENER_TIME = 3000; export const setSocketTimeout = ( request: ClientRequest, reject: (err: Error) => void, timeoutInMs = 0 ): NodeJS.Timeout | number => { const registerTimeout = (offset: number) => { const timeout = timeoutInMs - offset; const onTimeout = () => { request.destroy(); reject( Object.assign( new Error( `@smithy/node-http-handler - the request socket timed out after ${timeoutInMs} ms of inactivity (configured by client requestHandler).` ), { name: "TimeoutError" } ) ); }; if (request.socket) { request.socket.setTimeout(timeout, onTimeout); request.on("close", () => request.socket?.removeListener("timeout", onTimeout)); } else { request.setTimeout(timeout, onTimeout); } }; if (0 < timeoutInMs && timeoutInMs < 6000) { registerTimeout(0); return 0; } return timing.setTimeout( registerTimeout.bind(null, timeoutInMs === 0 ? 0 : DEFER_EVENT_LISTENER_TIME), DEFER_EVENT_LISTENER_TIME ); }; ================================================ FILE: packages/node-http-handler/src/stream-collector/collector.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { Collector } from "./collector"; describe("Collector", () => { const writePromise = (collector: Collector, chunk: any, encoding: BufferEncoding = "utf-8"): Promise => { return new Promise((resolve, reject) => { collector.write(chunk, encoding, (err) => { if (err) { reject(err); } else { resolve(); } }); }); }; const listOfBuffers: Buffer[] = [Buffer.from("foo"), Buffer.from("bar"), Buffer.from("buzz")]; it("stores a collection of buffers internally", async () => { const collector = new Collector(); await writePromise(collector, listOfBuffers[0]); await writePromise(collector, listOfBuffers[1]); await writePromise(collector, listOfBuffers[2]); collector.end(); expect(collector.bufferedBytes.length).toBe(3); expect(collector.bufferedBytes[0]).toBe(listOfBuffers[0]); expect(collector.bufferedBytes[1]).toBe(listOfBuffers[1]); expect(collector.bufferedBytes[2]).toBe(listOfBuffers[2]); }); }); ================================================ FILE: packages/node-http-handler/src/stream-collector/collector.ts ================================================ import { Writable } from "node:stream"; export class Collector extends Writable { public readonly bufferedBytes: Buffer[] = []; _write(chunk: Buffer, encoding: string, callback: (err?: Error) => void) { this.bufferedBytes.push(chunk); callback(); } } ================================================ FILE: packages/node-http-handler/src/stream-collector/index.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { streamCollector } from "./index"; import { ReadFromBuffers } from "./readable.mock"; describe("streamCollector", () => { it("returns a Uint8Array containing all data from a stream", async () => { const mockData = [Buffer.from("foo"), Buffer.from("bar"), Buffer.from("buzz")]; const mockReadStream = new ReadFromBuffers({ buffers: mockData, }); const expected = new Uint8Array([102, 111, 111, 98, 97, 114, 98, 117, 122, 122]); const collectedData = await streamCollector(mockReadStream); expect(collectedData).toEqual(expected); }); it("accepts ReadableStream if the global web stream implementation exists in Node.js", async () => { if (typeof ReadableStream === "function") { const data = await streamCollector( new ReadableStream({ start(controller) { controller.enqueue(Buffer.from("abcd")); controller.close(); }, }) ); expect(Buffer.from(data)).toEqual(Buffer.from("abcd")); } }); it("will propagate errors from the stream", async () => { // stream should emit an error right away const mockReadStream = new ReadFromBuffers({ buffers: [], errorAfter: 0, }); try { await streamCollector(mockReadStream); } catch (err) { expect(err).toBeDefined(); } }); }); ================================================ FILE: packages/node-http-handler/src/stream-collector/index.ts ================================================ import type { Readable } from "node:stream"; import type { ReadableStream as IReadableStream } from "node:stream/web"; import type { StreamCollector } from "@smithy/types"; import { Collector } from "./collector"; /** * Converts a stream to a byte array. * * @internal */ export const streamCollector: StreamCollector = (stream: Readable | IReadableStream): Promise => { if (isReadableStreamInstance(stream)) { // Web stream API in Node.js return collectReadableStream(stream); } return new Promise((resolve, reject) => { const collector = new Collector(); stream.pipe(collector); stream.on("error", (err) => { // if the source errors, the destination stream needs to manually end collector.end(); reject(err); }); collector.on("error", reject); collector.on("finish", function (this: Collector) { const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes)); resolve(bytes); }); }); }; /** * Note: the global.ReadableStream object is marked experimental, and was added in v18.0.0 of Node.js. * The importable version was added in v16.5.0. We only test for the global version so as not to * enforce an import on a Node.js version that may not have it, and import * only the type from stream/web. */ const isReadableStreamInstance = (stream: unknown): stream is IReadableStream => typeof ReadableStream === "function" && stream instanceof ReadableStream; async function collectReadableStream(stream: IReadableStream): Promise { const chunks = []; const reader = stream.getReader(); let isDone = false; let length = 0; while (!isDone) { const { done, value } = await reader.read(); if (value) { chunks.push(value); length += value.length; } isDone = done; } const collected = new Uint8Array(length); let offset = 0; for (const chunk of chunks) { collected.set(chunk, offset); offset += chunk.length; } return collected; } ================================================ FILE: packages/node-http-handler/src/stream-collector/readable.mock.ts ================================================ import { Readable, type ReadableOptions } from "node:stream"; export interface ReadFromBuffersOptions extends ReadableOptions { buffers: Buffer[]; errorAfter?: number; } export class ReadFromBuffers extends Readable { private buffersToRead: Buffer[]; private numBuffersRead = 0; private errorAfter: number; constructor(options: ReadFromBuffersOptions) { super(options); this.buffersToRead = options.buffers; this.errorAfter = typeof options.errorAfter === "number" ? options.errorAfter : -1; } // eslint-disable-next-line @typescript-eslint/no-unused-vars _read(size: number) { if (this.errorAfter !== -1 && this.errorAfter === this.numBuffersRead) { this.emit("error", new Error("Mock Error")); return; } if (this.numBuffersRead >= this.buffersToRead.length) { return this.push(null); } return this.push(this.buffersToRead[this.numBuffersRead++]); } } ================================================ FILE: packages/node-http-handler/src/timing.ts ================================================ /** * For test spies. * * @internal */ export const timing = { setTimeout: (cb: (...ignored: any[]) => void | unknown, ms?: number) => setTimeout(cb, ms), clearTimeout: (timeoutId: string | number | undefined | unknown) => clearTimeout(timeoutId as Parameters[0]), }; ================================================ FILE: packages/node-http-handler/src/write-request-body.spec.ts ================================================ import EventEmitter from "node:events"; import { afterEach, beforeEach, describe, expect, test as it, vi } from "vitest"; import { writeRequestBody } from "./write-request-body"; describe(writeRequestBody.name, () => { it("should wait for the continue event if request has expect=100-continue", async () => { const httpRequest = Object.assign(new EventEmitter(), { end: vi.fn(), }) as any; const request = { headers: { expect: "100-continue", }, body: Buffer.from("abcd"), method: "GET", hostname: "", protocol: "https:", path: "/", }; setTimeout(async () => { httpRequest.emit("continue", {}); }, 200); const promise = writeRequestBody(httpRequest, request); expect(httpRequest.end).not.toHaveBeenCalled(); await promise; expect(httpRequest.end).toHaveBeenCalled(); }); it("should not wait for the continue event if request has expect=100-continue but agent is external", async () => { const httpRequest = Object.assign(new EventEmitter(), { end: vi.fn(), }) as any; const request = { headers: { expect: "100-continue", }, body: Buffer.from("abcd"), method: "GET", hostname: "", protocol: "https:", path: "/", }; const id = setTimeout(async () => { httpRequest.emit("continue", {}); }, 200); const promise = writeRequestBody(httpRequest, request, 6000, true); expect(httpRequest.end).toHaveBeenCalled(); await promise; clearTimeout(id); }); it( "should not send the body if the request is expect=100-continue" + "but a response is received before the continue event", async () => { const httpRequest = Object.assign(new EventEmitter(), { end: vi.fn(), }) as any; const request = { headers: { expect: "100-continue", }, body: { pipe: vi.fn(), }, method: "GET", hostname: "", protocol: "https:", path: "/", }; setTimeout(() => { httpRequest.emit("response", {}); }, 25); await writeRequestBody(httpRequest, request); expect(request.body.pipe).not.toHaveBeenCalled(); expect(httpRequest.end).not.toHaveBeenCalled(); } ); describe("with fake timers", () => { beforeEach(() => { vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); }); it("should send the body if the 100 Continue response is not received before the timeout", async () => { const httpRequest = Object.assign(new EventEmitter(), { end: vi.fn(), }) as any; const request = { headers: { expect: "100-continue", }, body: Buffer.from("abcd"), method: "GET", hostname: "", protocol: "https:", path: "/", }; const promise = writeRequestBody(httpRequest, request, 12_000); expect(httpRequest.end).not.toHaveBeenCalled(); vi.advanceTimersByTime(13000); await promise; expect(httpRequest.end).toHaveBeenCalled(); }); }); }); ================================================ FILE: packages/node-http-handler/src/write-request-body.ts ================================================ import type { ClientHttp2Stream } from "node:http2"; import type { ClientRequest } from "node:http"; import { Readable } from "node:stream"; import type { HttpRequest } from "@smithy/types"; import { timing } from "./timing"; const MIN_WAIT_TIME = 6_000; /** * This resolves when writeBody has been called. * * @param httpRequest - opened Node.js request. * @param request - container with the request body. * @param maxContinueTimeoutMs - time to wait for the continue event. * @param externalAgent - whether agent is owned by caller code. */ export async function writeRequestBody( httpRequest: ClientRequest | ClientHttp2Stream, request: HttpRequest, maxContinueTimeoutMs = MIN_WAIT_TIME, externalAgent = false ): Promise { const headers = request.headers; const expect = headers ? headers.Expect || headers.expect : undefined; let timeoutId = -1; let sendBody = true; if (!externalAgent && expect === "100-continue") { sendBody = await Promise.race([ new Promise((resolve) => { // If this resolves first (wins the race), it means that at least MIN_WAIT_TIME ms // elapsed and no continue, response, or error has happened. // The high default timeout is to give the server ample time to respond. // This is an unusual situation, and indicates the server may not be S3 actual // and did not correctly implement 100-continue event handling. // Strictly speaking, we should perhaps keep waiting up to the request timeout // and then throw an error, but we resolve true to allow the server to deal // with the request body. timeoutId = Number(timing.setTimeout(() => resolve(true), Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); }), new Promise((resolve) => { httpRequest.on("continue", () => { timing.clearTimeout(timeoutId); resolve(true); }); httpRequest.on("response", () => { // if this handler is called, then response is // already received and there is no point in // sending body or waiting timing.clearTimeout(timeoutId); resolve(false); }); httpRequest.on("error", () => { timing.clearTimeout(timeoutId); // this handler does not reject with the error // because there is already an error listener // on the request in node-http-handler // and node-http2-handler. resolve(false); }); }), ]); } if (sendBody) { writeBody(httpRequest, request.body); } } function writeBody( httpRequest: ClientRequest | ClientHttp2Stream, body?: string | ArrayBuffer | ArrayBufferView | Readable | Uint8Array ) { if (body instanceof Readable) { // pipe automatically handles end body.pipe(httpRequest); return; } if (body) { const isBuffer = Buffer.isBuffer(body); const isString = typeof body === "string"; if (isBuffer || isString) { // https://github.com/aws/aws-sdk-js-v3/issues/6426 // describes why we don't send an empty Buffer. if (isBuffer && body.byteLength === 0) { httpRequest.end(); } else { httpRequest.end(body); } return; } const uint8 = body as Uint8Array; if ( typeof uint8 === "object" && uint8.buffer && typeof uint8.byteOffset === "number" && typeof uint8.byteLength === "number" ) { // this avoids copying the array. httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength)); return; } httpRequest.end(Buffer.from(body as ArrayBuffer)); return; } httpRequest.end(); } ================================================ FILE: packages/node-http-handler/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/node-http-handler/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/node-http-handler/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/node-http-handler/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/property-provider/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/property-provider/CHANGELOG.md ================================================ # @smithy/property-provider ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/property-provider/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/property-provider/package.json ================================================ { "name": "@smithy/property-provider", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/property-provider", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/property-provider" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/property-provider/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { ProviderError, CredentialsProviderError, TokenProviderError, chain, fromValue as fromStatic, memoize, } from "@smithy/core/config"; export type { ProviderErrorOptionsType } from "@smithy/core/config"; ================================================ FILE: packages/property-provider/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/property-provider/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/property-provider/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/protocol-http/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/protocol-http/CHANGELOG.md ================================================ # @smithy/protocol-http ## 5.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 5.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 5.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 5.4.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/protocol-http/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/protocol-http/package.json ================================================ { "name": "@smithy/protocol-http", "version": "5.4.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/protocol-http", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/protocol-http" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/protocol-http/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { Field, Fields, HttpRequest, HttpResponse, isValidHostname, getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig, } from "@smithy/core/protocols"; export type { FieldsOptions, HttpHandler, HttpHandlerUserInput, IHttpRequest, HttpHandlerExtensionConfiguration, HttpHandlerExtensionConfigType, FieldOptions, FieldPosition, HeaderBag, HttpMessage, HttpHandlerOptions, } from "@smithy/core/protocols"; ================================================ FILE: packages/protocol-http/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/protocol-http/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/protocol-http/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/querystring-builder/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/querystring-builder/CHANGELOG.md ================================================ # @smithy/querystring-builder ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 4f30af1: consolidation for core/protocols ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/querystring-builder/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/querystring-builder/package.json ================================================ { "name": "@smithy/querystring-builder", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/querystring-builder", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/querystring-builder" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/querystring-builder/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { buildQueryString } from "@smithy/core/protocols"; ================================================ FILE: packages/querystring-builder/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/querystring-builder/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/querystring-builder/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/querystring-parser/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/querystring-parser/CHANGELOG.md ================================================ # @smithy/querystring-parser ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/querystring-parser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/querystring-parser/package.json ================================================ { "name": "@smithy/querystring-parser", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/querystring-parser", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/querystring-parser" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/querystring-parser/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { parseQueryString } from "@smithy/core/protocols"; ================================================ FILE: packages/querystring-parser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/querystring-parser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/querystring-parser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/service-client-documentation-generator/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/service-client-documentation-generator/CHANGELOG.md ================================================ # Change Log ## 4.2.2 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' ## 4.2.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.2.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.1.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/service-client-documentation-generator](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/service-client-documentation-generator/CHANGELOG.md) for additional history. ================================================ FILE: packages/service-client-documentation-generator/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/service-client-documentation-generator/README.md ================================================ # @smithy/client-documentation-generator [![NPM version](https://img.shields.io/npm/v/@smithy/client-documentation-generator/latest.svg)](https://www.npmjs.com/package/@smithy/client-documentation-generator) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/client-documentation-generator.svg)](https://www.npmjs.com/package/@smithy/client-documentation-generator) ### :warning: Internal API :warning: > This is an internal package. > That means this is used as a dependency for other, public packages, but > should not be taken directly as a dependency in your application's `package.json`. > If you are updating the version of this package, for example to bring in a > bug-fix, you should do so by updating your application lockfile with > e.g. `npm up @scope/package` or equivalent command in another > package manager, rather than taking a direct dependency. --- ================================================ FILE: packages/service-client-documentation-generator/package.json ================================================ { "name": "@smithy/service-client-documentation-generator", "version": "4.2.2", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline service-client-documentation-generator", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "exit 0" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "keywords": [ "typedocplugin" ], "dependencies": { "tslib": "^2.6.2", "typedoc": "0.23.23" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0" }, "typedoc": { "entryPoint": "src/index.ts" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/client-documentation-generator", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/client-documentation-generator" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/service-client-documentation-generator/src/index.ts ================================================ import { ParameterType, type Application } from "typedoc"; import { SdkClientTocPlugin } from "./sdk-client-toc-plugin"; /** * @internal */ export function load(app: Application) { app.options.addDeclaration({ name: "defaultGroup", help: "Default group to place categories as children", defaultValue: "SDK", type: ParameterType.String, }); new SdkClientTocPlugin(app.options, app.logger, app.renderer); } ================================================ FILE: packages/service-client-documentation-generator/src/sdk-client-toc-plugin.ts ================================================ import { dirname } from "node:path"; import type { Context, DeclarationReflection, Logger, Options, ProjectReflection, ReferenceType, Renderer, } from "typedoc"; import { BindOption, ContainerReflection, Converter, ReflectionCategory, ReflectionFlag, ReflectionGroup, ReflectionKind, } from "typedoc"; import { isClientModel } from "./utils"; /** * Group the ToC for easier observability. * * @internal */ export class SdkClientTocPlugin { private clientDir?: string; @BindOption("defaultGroup") readonly defaultGroup: string; @BindOption("defaultCategory") readonly defaultCategory: string; constructor( public readonly options: Options, public readonly logger: Logger, private readonly renderer: Renderer ) { this.renderer.application.converter.on(Converter.EVENT_END, this.changeLinksToLowerCase); this.renderer.application.converter.on(Converter.EVENT_RESOLVE_END, this.onEndResolve); } private changeLinksToLowerCase = (context: Context) => { Object.keys(context.project.reflections).forEach((reflectionName) => { context.project.reflections[reflectionName]._alias = context.project.reflections[reflectionName] .getAlias() .toLowerCase(); }); }; private onEndResolve = (context: Context) => { if (!this.clientDir) this.clientDir = this.loadClientDir(context.project); for (const model of Object.values(context.project.reflections)) { const isEffectiveParent = (model instanceof ContainerReflection && model.children?.length) || model.isProject(); if (!isEffectiveParent || model.kindOf(ReflectionKind.SomeModule)) { return; } if (!model.groups) { model.groups = []; } let group = model.groups.find((value) => value.title === this.defaultGroup); if (!group) { group = new ReflectionGroup(this.defaultGroup); model.groups.push(group); } group.categories = this.defineCategories(group, model.children); const modulesIndex = model.groups.findIndex((value) => value.title === "Modules"); // Removing `Modules` group from array if (modulesIndex >= 0) { model.groups.splice(modulesIndex, 1); } } }; // Confirm declaration comes from the same folder as the client class private belongsToClientPackage(model: DeclarationReflection): boolean { return this.clientDir && model.sources?.[0].fullFileName.indexOf(this.clientDir) === 0; } private isClient(model: DeclarationReflection): boolean { const { extendedTypes = [] } = model; return ( model.kindOf(ReflectionKind.Class) && model.getFullName() !== "Client" && // Exclude the Smithy Client class. (model.name.endsWith("Client") /* Modular client like S3Client */ || extendedTypes.filter((reference) => (reference as ReferenceType).name === `${model.name}Client`).length > 0) && /* Filter out other client classes that not sourced from the same directory as current client. e.g. STS, SSO */ this.belongsToClientPackage(model) ); } private isCommand(model: DeclarationReflection): boolean { return ( model.kindOf(ReflectionKind.Class) && model.name.endsWith("Command") && // model.children?.some((child) => child.name === "resolveMiddleware") && this.belongsToClientPackage(model) ); } private isPaginator(model: DeclarationReflection): boolean { return ( model.name.startsWith("paginate") && model.kindOf(ReflectionKind.Function) && this.belongsToClientPackage(model) ); } private isInputOrOutput(model: DeclarationReflection): boolean { return ( model.kindOf(ReflectionKind.Interface) && (model.name.endsWith("CommandInput") || model.name.endsWith("CommandOutput")) && this.belongsToClientPackage(model) ); } private isWaiter(model: DeclarationReflection): boolean { return ( model.name.startsWith("waitFor") && model.kindOf(ReflectionKind.Function) && this.belongsToClientPackage(model) ); } /** * Define navigation categories in Client, Commands, Paginators and Waiters sections. It will update the * supplied categories array. * * @param group The parent group where the categories will be placed under. * @param reflections The reflections that should be categorized. */ private defineCategories(group: ReflectionGroup, reflections: DeclarationReflection[]): ReflectionCategory[] { const categories = group.categories || []; if (this.isCategorized(categories)) return group.categories; const clients = new ReflectionCategory("Clients"); const commands = new ReflectionCategory("Commands"); const paginators = new ReflectionCategory("Paginators"); const waiters = new ReflectionCategory("Waiters"); reflections.forEach((reflection: DeclarationReflection) => { if (reflection.kindOf(ReflectionKind.SomeModule)) { return; } if (this.isClient(reflection)) { clients.children.push(reflection); reflection.flags.setFlag(ReflectionFlag.Public, false); } else if (this.isCommand(reflection)) { commands.children.push(reflection); reflection.flags.setFlag(ReflectionFlag.Protected, true); } else if (this.isPaginator(reflection)) { paginators.children.push(reflection); reflection.flags.setFlag(ReflectionFlag.Protected, true); } else if (this.isInputOrOutput(reflection)) { commands.children.push(reflection); reflection.flags.setFlag(ReflectionFlag.Protected, true); } else if (this.isWaiter(reflection)) { waiters.children.push(reflection); reflection.flags.setFlag(ReflectionFlag.Protected, true); } }); // Group commands and input/output interface of each command. commands.children.sort((childA, childB) => childA.name.localeCompare(childB.name)); categories.push(...[clients, commands, paginators, waiters]); return categories; } private isCategorized(categories: ReflectionCategory[]): boolean { const childrenNames = categories.map((child) => child.title); return ( childrenNames.includes("Clients") && childrenNames.includes("Commands") && childrenNames.includes("Paginators") && childrenNames.includes("Waiters") ); } private loadClientDir(project: ProjectReflection) { const children = Object.values(project.reflections).filter(isClientModel); const fullFileName = children.find((child) => child.sources[0].fileName.endsWith("Client.ts")).sources[0] .fullFileName; return dirname(dirname(fullFileName)); } } ================================================ FILE: packages/service-client-documentation-generator/src/utils.ts ================================================ import { sep } from "node:path"; import type { Reflection } from "typedoc"; /** * @internal */ export const isClientModel = (model: Reflection | undefined) => model?.sources?.[0]?.fullFileName.includes(`${sep}clients${sep}`); ================================================ FILE: packages/service-client-documentation-generator/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "experimentalDecorators": true, "outDir": "dist-cjs", "pretty": true, "rootDir": "src", "strict": false }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/service-client-documentation-generator/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "experimentalDecorators": true, "lib": [], "outDir": "dist-es", "pretty": true, "rootDir": "src", "strict": false }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/service-client-documentation-generator/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "experimentalDecorators": true, "rootDir": "src", "strict": false }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/service-error-classification/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/service-error-classification/CHANGELOG.md ================================================ # @smithy/service-error-classification ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/service-error-classification/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/service-error-classification/package.json ================================================ { "name": "@smithy/service-error-classification", "version": "4.4.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/service-error-classification", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/service-error-classification" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" } } ================================================ FILE: packages/service-error-classification/src/index.ts ================================================ /** @deprecated Use @smithy/core/retry instead. */ export { isRetryableByTrait, isClockSkewError, isClockSkewCorrectedError, isBrowserNetworkError, isThrottlingError, isTransientError, isServerError, isNodeJsHttp2TransientError, } from "@smithy/core/retry"; ================================================ FILE: packages/service-error-classification/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "noUnusedLocals": true, "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/service-error-classification/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "noUnusedLocals": true, "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/service-error-classification/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/shared-ini-file-loader/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/shared-ini-file-loader/CHANGELOG.md ================================================ # @smithy/shared-ini-file-loader ## 4.5.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.5.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.5.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.5.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/shared-ini-file-loader/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/shared-ini-file-loader/package.json ================================================ { "name": "@smithy/shared-ini-file-loader", "version": "4.5.3", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/shared-ini-file-loader", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/shared-ini-file-loader" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/shared-ini-file-loader/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { getHomeDir, ENV_PROFILE, DEFAULT_PROFILE, getProfileName, getSSOTokenFilepath, getSSOTokenFromFile, CONFIG_PREFIX_SEPARATOR, loadSharedConfigFiles, loadSsoSessionData, parseKnownFiles, externalDataInterceptor, readFile, } from "@smithy/core/config"; export type { SSOToken, SharedConfigInit, SsoSessionInit, SourceProfileInit, Profile, ParsedIniData, SharedConfigFiles, ReadFileOptions, } from "@smithy/core/config"; ================================================ FILE: packages/shared-ini-file-loader/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/shared-ini-file-loader/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/shared-ini-file-loader/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4/.gitignore ================================================ /node_modules/ /build/ /dist/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/signature-v4/CHANGELOG.md ================================================ # Change Log ## 5.4.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 5.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 5.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 5.4.0 ### Minor Changes - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 5.3.14 ### Patch Changes - 52b4789: allow snapshot of credentials for event-stream signing - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/protocol-http@5.3.14 - @smithy/util-middleware@4.2.14 ## 5.3.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/protocol-http@5.3.13 - @smithy/util-middleware@4.2.13 ## 5.3.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/protocol-http@5.3.12 - @smithy/util-middleware@4.2.12 ## 5.3.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-hex-encoding@4.2.2 - @smithy/is-array-buffer@4.2.2 - @smithy/util-middleware@4.2.11 - @smithy/util-uri-escape@4.2.2 - @smithy/protocol-http@5.3.11 - @smithy/util-utf8@4.2.2 ## 5.3.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/protocol-http@5.3.10 - @smithy/util-middleware@4.2.10 ## 5.3.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/is-array-buffer@4.2.1 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 - @smithy/util-hex-encoding@4.2.1 - @smithy/util-middleware@4.2.9 - @smithy/util-uri-escape@4.2.1 - @smithy/util-utf8@4.2.1 ## 5.3.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/protocol-http@5.3.8 - @smithy/util-middleware@4.2.8 ## 5.3.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/protocol-http@5.3.7 - @smithy/util-middleware@4.2.7 ## 5.3.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/protocol-http@5.3.6 - @smithy/util-middleware@4.2.6 ## 5.3.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/protocol-http@5.3.5 - @smithy/util-middleware@4.2.5 ## 5.3.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/protocol-http@5.3.4 - @smithy/util-middleware@4.2.4 ## 5.3.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/protocol-http@5.3.3 - @smithy/util-middleware@4.2.3 ## 5.3.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/protocol-http@5.3.2 - @smithy/util-middleware@4.2.2 ## 5.3.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/protocol-http@5.3.1 - @smithy/util-middleware@4.2.1 ## 5.3.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/is-array-buffer@4.2.0 - @smithy/protocol-http@5.3.0 - @smithy/types@4.6.0 - @smithy/util-hex-encoding@4.2.0 - @smithy/util-middleware@4.2.0 - @smithy/util-uri-escape@4.2.0 - @smithy/util-utf8@4.2.0 ## 5.2.1 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/protocol-http@5.2.1 - @smithy/util-middleware@4.1.1 ## 5.2.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-hex-encoding@4.1.0 - @smithy/is-array-buffer@4.1.0 - @smithy/util-middleware@4.1.0 - @smithy/util-uri-escape@4.1.0 - @smithy/protocol-http@5.2.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 5.1.3 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/protocol-http@5.1.3 - @smithy/util-middleware@4.0.5 ## 5.1.2 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/protocol-http@5.1.2 - @smithy/util-middleware@4.0.4 ## 5.1.1 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/protocol-http@5.1.1 - @smithy/util-middleware@4.0.3 ## 5.1.0 ### Minor Changes - e2a8b41: Adding Signature V4a implementation ## 5.0.2 ### Patch Changes - Updated dependencies [e917e61] - @smithy/protocol-http@5.1.0 - @smithy/types@4.2.0 - @smithy/util-middleware@4.0.2 ## 5.0.1 ### Patch Changes - Updated dependencies [2aff9df] - Updated dependencies [000b2ae] - @smithy/types@4.1.0 - @smithy/protocol-http@5.0.1 - @smithy/util-middleware@4.0.1 ## 5.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ### Patch Changes - Updated dependencies [20d99be] - @smithy/util-middleware@4.0.0 - @smithy/util-utf8@4.0.0 - @smithy/is-array-buffer@4.0.0 - @smithy/protocol-http@5.0.0 - @smithy/types@4.0.0 - @smithy/util-hex-encoding@4.0.0 - @smithy/util-uri-escape@4.0.0 ## 4.2.4 ### Patch Changes - Updated dependencies [b52b4e8] - @smithy/types@3.7.2 - @smithy/protocol-http@4.1.8 - @smithy/util-middleware@3.0.11 ## 4.2.3 ### Patch Changes - Updated dependencies [fcd5ca8] - @smithy/types@3.7.1 - @smithy/protocol-http@4.1.7 - @smithy/util-middleware@3.0.10 ## 4.2.2 ### Patch Changes - Updated dependencies [cd1929b] - @smithy/types@3.7.0 - @smithy/protocol-http@4.1.6 - @smithy/util-middleware@3.0.9 ## 4.2.1 ### Patch Changes - Updated dependencies [84bec05] - @smithy/types@3.6.0 - @smithy/protocol-http@4.1.5 - @smithy/util-middleware@3.0.8 ## 4.2.0 ### Minor Changes - a4c1285: configurable hoisted headers ### Patch Changes - Updated dependencies [a4c1285] - @smithy/types@3.5.0 - @smithy/protocol-http@4.1.4 - @smithy/util-middleware@3.0.7 ## 4.1.4 ### Patch Changes - 806cc7f: fix: sort query parameter keys after encoding ## 4.1.3 ### Patch Changes - Updated dependencies [e7b438b] - @smithy/types@3.4.2 - @smithy/protocol-http@4.1.3 - @smithy/util-middleware@3.0.6 ## 4.1.2 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/protocol-http@4.1.2 - @smithy/util-middleware@3.0.5 ## 4.1.1 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/protocol-http@4.1.1 - @smithy/util-middleware@3.0.4 ## 4.1.0 ### Minor Changes - 86862ea: switch to static HttpRequest clone method ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 4.0.0 ### Major Changes - ae8bf5c: Make sha256 required parameter for SigV4 constructor ## 3.1.2 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/util-middleware@3.0.3 ## 3.1.1 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/util-middleware@3.0.2 ## 3.1.0 ### Minor Changes - 3c23a83b: update versions of @aws-crypto/\* packages ## 3.0.1 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/util-middleware@3.0.1 ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/util-hex-encoding@3.0.0 - @smithy/is-array-buffer@3.0.0 - @smithy/util-middleware@3.0.0 - @smithy/util-uri-escape@3.0.0 - @smithy/util-utf8@3.0.0 ## 2.3.0 ### Minor Changes - 2e090d70: Escape non-standard characters in URI paths according to RFC 3986 ## 2.2.1 ### Patch Changes - 9961e59d: internalize header format function from eventstream-codec into signature-v4 ## 2.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/eventstream-codec@2.2.0 - @smithy/util-hex-encoding@2.2.0 - @smithy/is-array-buffer@2.2.0 - @smithy/util-middleware@2.2.0 - @smithy/util-uri-escape@2.2.0 - @smithy/util-utf8@2.3.0 - @smithy/types@2.12.0 ## 2.1.4 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/util-utf8@2.2.0 - @smithy/types@2.11.0 - @smithy/eventstream-codec@2.1.4 - @smithy/util-middleware@2.1.4 ## 2.1.3 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/eventstream-codec@2.1.3 - @smithy/util-middleware@2.1.3 ## 2.1.2 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - @smithy/types@2.10.0 - @smithy/eventstream-codec@2.1.2 - @smithy/util-middleware@2.1.2 ## 2.1.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/eventstream-codec@2.1.1 - @smithy/is-array-buffer@2.1.1 - @smithy/types@2.9.1 - @smithy/util-hex-encoding@2.1.1 - @smithy/util-middleware@2.1.1 - @smithy/util-uri-escape@2.1.1 - @smithy/util-utf8@2.1.1 ## 2.1.0 ### Minor Changes - 9939f823: bundle dist-cjs index ### Patch Changes - Updated dependencies [9939f823] - @smithy/eventstream-codec@2.1.0 - @smithy/util-hex-encoding@2.1.0 - @smithy/is-array-buffer@2.1.0 - @smithy/util-middleware@2.1.0 - @smithy/util-uri-escape@2.1.0 - @smithy/util-utf8@2.1.0 - @smithy/types@2.9.0 ## 2.0.19 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/eventstream-codec@2.0.16 - @smithy/util-middleware@2.0.9 ## 2.0.18 ### Patch Changes - 7a8023b2: fix readme brackets ## 2.0.17 ### Patch Changes - 3ba4bd93: add readme content for signature-v4 - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/eventstream-codec@2.0.15 - @smithy/util-middleware@2.0.8 ## 2.0.16 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/eventstream-codec@2.0.14 - @smithy/util-middleware@2.0.7 ## 2.0.15 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/eventstream-codec@2.0.13 - @smithy/util-middleware@2.0.6 ## 2.0.14 ### Patch Changes - Updated dependencies [f2a04b7e] - @smithy/util-utf8@2.0.2 - @smithy/eventstream-codec@2.0.12 ## 2.0.13 ### Patch Changes - Updated dependencies [5598a033] - @smithy/util-utf8@2.0.1 - @smithy/eventstream-codec@2.0.12 ## 2.0.12 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/eventstream-codec@2.0.12 - @smithy/util-middleware@2.0.5 ## 2.0.11 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/eventstream-codec@2.0.11 - @smithy/util-middleware@2.0.4 ## 2.0.10 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/eventstream-codec@2.0.10 - @smithy/util-middleware@2.0.3 ## 2.0.9 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/eventstream-codec@2.0.9 - @smithy/util-middleware@2.0.2 ## 2.0.8 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [e6ea6bd5] - Updated dependencies [c0b17a13] - Updated dependencies [5b6fa539] - @smithy/types@2.3.2 - @smithy/util-middleware@2.0.1 - @smithy/eventstream-codec@2.0.8 ## 2.0.7 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/eventstream-codec@2.0.7 - @smithy/util-middleware@2.0.0 ## 2.0.6 ### Patch Changes - Updated dependencies [88bcec3d] - @smithy/types@2.3.0 - @smithy/eventstream-codec@2.0.6 - @smithy/util-middleware@2.0.0 ## 2.0.5 ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/eventstream-codec@2.0.5 - @smithy/util-middleware@2.0.0 ## 2.0.4 ### Patch Changes - Updated dependencies [381e03c4] - @smithy/types@2.2.1 - @smithy/eventstream-codec@2.0.4 - @smithy/util-middleware@2.0.0 ## 2.0.3 ### Patch Changes - Updated dependencies [f6cb949d] - @smithy/types@2.2.0 - @smithy/eventstream-codec@2.0.3 - @smithy/util-middleware@2.0.0 ## 2.0.2 ### Patch Changes - bb5beab2: fix: multiple value parameters query string signature - Updated dependencies [59548ba9] - Updated dependencies [3e1ab589] - @smithy/types@2.1.0 - @smithy/eventstream-codec@2.0.2 - @smithy/util-middleware@2.0.0 ## 2.0.1 ### Patch Changes - Updated dependencies [1b951769] - @smithy/types@2.0.2 - @smithy/eventstream-codec@2.0.1 - @smithy/util-middleware@2.0.0 ## 2.0.0 ### Major Changes - 9d53bc76: update to 2.x major versions ### Patch Changes - Updated dependencies [9d53bc76] - @smithy/eventstream-codec@2.0.0 - @smithy/is-array-buffer@2.0.0 - @smithy/util-hex-encoding@2.0.0 - @smithy/util-middleware@2.0.0 - @smithy/util-uri-escape@2.0.0 - @smithy/util-utf8@2.0.0 - @smithy/types@2.0.1 ## 1.1.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ### Patch Changes - Updated dependencies [e3cbb3cc] - @smithy/eventstream-codec@1.1.0 - @smithy/is-array-buffer@1.1.0 - @smithy/types@1.2.0 - @smithy/util-hex-encoding@1.1.0 - @smithy/util-middleware@1.1.0 - @smithy/util-uri-escape@1.1.0 - @smithy/util-utf8@1.1.0 ## 1.0.3 ### Patch Changes - Updated dependencies [8cd89c75] - Updated dependencies [d90a45b5] - @smithy/types@2.0.0 - @smithy/eventstream-codec@1.0.3 - @smithy/util-middleware@1.0.2 ## 1.0.2 ### Patch Changes - 6e312329: restore downlevel types - Updated dependencies [6e312329] - @smithy/eventstream-codec@1.0.2 - @smithy/util-hex-encoding@1.0.2 - @smithy/is-array-buffer@1.0.2 - @smithy/util-middleware@1.0.2 - @smithy/util-uri-escape@1.0.2 - @smithy/util-utf8@1.0.2 - @smithy/types@1.1.1 ## 1.0.1 ### Patch Changes - 2c57033f: Set correct publishConfig directory - Updated dependencies [2c57033f] - @smithy/eventstream-codec@1.0.1 - @smithy/util-hex-encoding@1.0.1 - @smithy/is-array-buffer@1.0.1 - @smithy/util-middleware@1.0.1 - @smithy/util-uri-escape@1.0.1 - @smithy/util-utf8@1.0.1 All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/signature-v4](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/signature-v4/CHANGELOG.md) for additional history. ================================================ FILE: packages/signature-v4/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/signature-v4/README.md ================================================ # @smithy/signature-v4 [![NPM version](https://img.shields.io/npm/v/@smithy/signature-v4/latest.svg)](https://www.npmjs.com/package/@smithy/signature-v4) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/signature-v4.svg)](https://www.npmjs.com/package/@smithy/signature-v4) This package contains an implementation of the [AWS Signature Version 4](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) authentication scheme. It is internal to Smithy-TypeScript generated clients, and not generally intended for standalone usage outside this context. For custom usage, inspect the interface of the SignatureV4 class. ================================================ FILE: packages/signature-v4/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/signature-v4/package.json ================================================ { "name": "@smithy/signature-v4", "version": "5.4.3", "description": "A standalone implementation of the AWS Signature V4 request signing algorithm", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline signature-v4", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:watch": "yarn g:vitest watch" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@aws-crypto/sha256-js": "5.2.0", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/signature-v4", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/signature-v4" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/signature-v4/src/HeaderFormatter.spec.ts ================================================ import type { MessageHeaders } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { HeaderFormatter, Int64 } from "./HeaderFormatter"; /** * TODO: this test duplicates a test in HeaderMarshaller in eventstream-codec. * TODO: when submodules are implemented this should be reunified/deduped. */ describe("HeaderFormatter", () => { const marshaller = new HeaderFormatter(); const name = [0x04, 0xf0, 0x9f, 0xa6, 0x84]; const testCases: Array<[string, Uint8Array, MessageHeaders]> = [ [ "boolean true headers", Uint8Array.from([...name, 0]), { "🦄": { type: "boolean", value: true, }, }, ], [ "boolean false headers", Uint8Array.from([...name, 1]), { "🦄": { type: "boolean", value: false, }, }, ], [ "byte headers", Uint8Array.from([...name, 2, 0x7f]), { "🦄": { type: "byte", value: 127, }, }, ], [ "short headers", Uint8Array.from([...name, 3, 0x7f, 0xff]), { "🦄": { type: "short", value: 32767, }, }, ], [ "integer headers", Uint8Array.from([...name, 4, 0x7f, 0xff, 0xff, 0xff]), { "🦄": { type: "integer", value: 2147483647, }, }, ], [ "long headers", Uint8Array.from([...name, 5, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), { "🦄": { type: "long", value: new Int64(Uint8Array.from([0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])), }, }, ], [ "binary headers", Uint8Array.from([...name, 6, 0x00, 0x08, 0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe]), { "🦄": { type: "binary", value: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe, 0xba, 0xbe]), }, }, ], [ "string headers", Uint8Array.from([ ...name, 7, 0x00, 0x2e, 0xd8, 0xaf, 0xd8, 0xb3, 0xd8, 0xaa, 0xe2, 0x80, 0x8c, 0xd9, 0x86, 0xd9, 0x88, 0xd8, 0xb4, 0xd8, 0xaa, 0xd9, 0x87, 0xe2, 0x80, 0x8c, 0xd9, 0x87, 0xd8, 0xa7, 0x20, 0xd9, 0x86, 0xd9, 0x85, 0xdb, 0x8c, 0xe2, 0x80, 0x8c, 0xd8, 0xb3, 0xd9, 0x88, 0xd8, 0xb2, 0xd9, 0x86, 0xd8, 0xaf, ]), { "🦄": { type: "string", value: "دست‌نوشته‌ها نمی‌سوزند", }, }, ], [ "timestamp headers", Uint8Array.from([...name, 8, 0x00, 0x00, 0x01, 0x61, 0x97, 0x16, 0xac, 0xc2]), { "🦄": { type: "timestamp", value: new Date(1518658301122), }, }, ], [ "UUID headers", Uint8Array.from([ ...name, 9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]), { "🦄": { type: "uuid", value: "ffffffff-ffff-ffff-ffff-ffffffffffff", }, }, ], [ "a sequence of headers", Uint8Array.from([ 0x04, 0xf0, 0x9f, 0xa6, 0x84, 0x06, 0x00, 0x04, 0xde, 0xad, 0xbe, 0xef, 0x04, 0xf0, 0x9f, 0x8f, 0x87, 0x00, 0x04, 0xf0, 0x9f, 0x90, 0x8e, 0x07, 0x00, 0x07, 0xe2, 0x98, 0x83, 0xf0, 0x9f, 0x92, 0xa9, 0x04, 0xf0, 0x9f, 0x90, 0xb4, 0x01, ]), { "🦄": { type: "binary", value: Uint8Array.from([0xde, 0xad, 0xbe, 0xef]), }, "🏇": { type: "boolean", value: true, }, "🐎": { type: "string", value: "☃💩", }, "🐴": { type: "boolean", value: false, }, }, ], ]; describe("#format", () => { for (const [description, encoded, decoded] of testCases) { it(`should format ${description}`, () => { expect(marshaller.format(decoded)).toEqual(encoded); }); } it("should throw if it receives an invalid UUID", () => { expect(() => marshaller.format({ uuid: { type: "uuid", value: "foo", }, }) ).toThrowError("Invalid UUID received"); }); }); }); ================================================ FILE: packages/signature-v4/src/HeaderFormatter.ts ================================================ import { fromHex, fromUtf8, toHex } from "@smithy/core/serde"; import type { Int64 as IInt64, MessageHeaderValue, MessageHeaders } from "@smithy/types"; /** * TODO: duplicated from @smithy/eventstream-codec to break large dependency. * TODO: This should be moved to its own deduped submodule in @smithy/core when submodules are implemented. * * @internal */ export class HeaderFormatter { public format(headers: MessageHeaders): Uint8Array { const chunks: Array = []; for (const headerName of Object.keys(headers)) { const bytes = fromUtf8(headerName); chunks.push(Uint8Array.from([bytes.byteLength]), bytes, this.formatHeaderValue(headers[headerName])); } const out = new Uint8Array(chunks.reduce((carry, bytes) => carry + bytes.byteLength, 0)); let position = 0; for (const chunk of chunks) { out.set(chunk, position); position += chunk.byteLength; } return out; } private formatHeaderValue(header: MessageHeaderValue): Uint8Array { switch (header.type) { case "boolean": return Uint8Array.from([header.value ? HEADER_VALUE_TYPE.boolTrue : HEADER_VALUE_TYPE.boolFalse]); case "byte": return Uint8Array.from([HEADER_VALUE_TYPE.byte, header.value]); case "short": const shortView = new DataView(new ArrayBuffer(3)); shortView.setUint8(0, HEADER_VALUE_TYPE.short); shortView.setInt16(1, header.value, false); return new Uint8Array(shortView.buffer); case "integer": const intView = new DataView(new ArrayBuffer(5)); intView.setUint8(0, HEADER_VALUE_TYPE.integer); intView.setInt32(1, header.value, false); return new Uint8Array(intView.buffer); case "long": const longBytes = new Uint8Array(9); longBytes[0] = HEADER_VALUE_TYPE.long; longBytes.set(header.value.bytes, 1); return longBytes; case "binary": const binView = new DataView(new ArrayBuffer(3 + header.value.byteLength)); binView.setUint8(0, HEADER_VALUE_TYPE.byteArray); binView.setUint16(1, header.value.byteLength, false); const binBytes = new Uint8Array(binView.buffer); binBytes.set(header.value, 3); return binBytes; case "string": const utf8Bytes = fromUtf8(header.value); const strView = new DataView(new ArrayBuffer(3 + utf8Bytes.byteLength)); strView.setUint8(0, HEADER_VALUE_TYPE.string); strView.setUint16(1, utf8Bytes.byteLength, false); const strBytes = new Uint8Array(strView.buffer); strBytes.set(utf8Bytes, 3); return strBytes; case "timestamp": const tsBytes = new Uint8Array(9); tsBytes[0] = HEADER_VALUE_TYPE.timestamp; tsBytes.set(Int64.fromNumber(header.value.valueOf()).bytes, 1); return tsBytes; case "uuid": if (!UUID_PATTERN.test(header.value)) { throw new Error(`Invalid UUID received: ${header.value}`); } const uuidBytes = new Uint8Array(17); uuidBytes[0] = HEADER_VALUE_TYPE.uuid; uuidBytes.set(fromHex(header.value.replace(/\-/g, "")), 1); return uuidBytes; } } } const enum HEADER_VALUE_TYPE { boolTrue = 0, boolFalse, byte, short, integer, long, byteArray, string, timestamp, uuid, } const UUID_PATTERN = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/; /** * TODO: duplicated from @smithy/eventstream-codec to break large dependency. * TODO: This should be moved to its own deduped submodule in @smithy/core when submodules are implemented. */ export class Int64 implements IInt64 { constructor(readonly bytes: Uint8Array) { if (bytes.byteLength !== 8) { throw new Error("Int64 buffers must be exactly 8 bytes"); } } static fromNumber(number: number): Int64 { // eslint-disable-next-line @typescript-eslint/no-loss-of-precision if (number > 9_223_372_036_854_775_807 || number < -9_223_372_036_854_775_808) { throw new Error(`${number} is too large (or, if negative, too small) to represent as an Int64`); } const bytes = new Uint8Array(8); for (let i = 7, remaining = Math.abs(Math.round(number)); i > -1 && remaining > 0; i--, remaining /= 256) { bytes[i] = remaining; } if (number < 0) { negate(bytes); } return new Int64(bytes); } /** * Called implicitly by infix arithmetic operators. */ valueOf(): number { const bytes = this.bytes.slice(0); const negative = bytes[0] & 0b10000000; if (negative) { negate(bytes); } return parseInt(toHex(bytes), 16) * (negative ? -1 : 1); } toString() { return String(this.valueOf()); } } function negate(bytes: Uint8Array): void { for (let i = 0; i < 8; i++) { bytes[i] ^= 0xff; } for (let i = 7; i > -1; i--) { bytes[i]++; if (bytes[i] !== 0) break; } } ================================================ FILE: packages/signature-v4/src/SignatureV4.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import { HttpRequest } from "@smithy/core/protocols"; import type { AwsCredentialIdentity, SignableMessage, TimestampHeaderValue } from "@smithy/types"; import { afterEach, beforeEach, describe, expect, test as it, vi, type MockInstance } from "vitest"; import { SignatureV4 } from "./SignatureV4"; import { ALGORITHM_IDENTIFIER, ALGORITHM_QUERY_PARAM, AMZ_DATE_HEADER, AMZ_DATE_QUERY_PARAM, AUTH_HEADER, CREDENTIAL_QUERY_PARAM, EXPIRES_QUERY_PARAM, HOST_HEADER, SIGNATURE_QUERY_PARAM, SIGNED_HEADERS_QUERY_PARAM, TOKEN_HEADER, TOKEN_QUERY_PARAM, UNSIGNED_PAYLOAD, } from "./constants"; import { iso8601 } from "./utilDate"; import Spy = jasmine.Spy; const signerInit = { service: "foo", region: "us-bar-1", sha256: Sha256, credentials: { accessKeyId: "foo", secretAccessKey: "bar", }, }; const signer = new SignatureV4(signerInit); const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { host: "foo.us-bar-1.amazonaws.com", }, hostname: "foo.us-bar-1.amazonaws.com", }); const credentials: AwsCredentialIdentity = { accessKeyId: "foo", secretAccessKey: "bar", }; describe("SignatureV4", () => { describe("#presignRequest", () => { const presigningOptions = { expiresIn: 1800, signingDate: new Date("2000-01-01T00:00:00.000Z"), }; it("should throw on invalid credential", async () => { const signer = new SignatureV4({ ...signerInit, credentials: {} as any }); try { await signer.presign(minimalRequest, presigningOptions); fail("This test is expected to fail"); } catch (e) { expect(e.message).toBe("Resolved credential object is not valid"); } }); it("should sign requests without bodies", async () => { const { query } = await signer.presign(minimalRequest, presigningOptions); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "46f0091f3e84cbd4552a184f43830a4f8b42fd18ceaefcdc2c225be1efd9e00e", }); }); it("should sign request without hoisting some headers", async () => { const { query, headers } = await signer.presign( { ...minimalRequest, headers: { ...minimalRequest.headers, "x-amz-not-hoisted": "test", }, }, { ...presigningOptions, unhoistableHeaders: new Set(["x-amz-not-hoisted"]) } ); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: `${HOST_HEADER};x-amz-not-hoisted`, [SIGNATURE_QUERY_PARAM]: "3c3ef586754b111e9528009710b797a07457d6a671058ba89041a06bab45f585", }); expect(headers).toMatchObject({ "x-amz-not-hoisted": "test", }); }); it("should support overriding region and service in the signer instance", async () => { const signer = new SignatureV4({ ...signerInit, service: "qux", region: "us-foo-1", }); const { query } = await signer.presign(minimalRequest, { ...presigningOptions, signingService: signerInit.service, signingRegion: signerInit.region, }); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "46f0091f3e84cbd4552a184f43830a4f8b42fd18ceaefcdc2c225be1efd9e00e", }); }); it("should default expires to 3600 seconds if not explicitly passed", async () => { const { query } = await signer.presign(minimalRequest); expect(query).toMatchObject({ [EXPIRES_QUERY_PARAM]: "3600", }); }); it("should sign requests with string bodies", async () => { const { query } = await signer.presign( new HttpRequest({ ...minimalRequest, body: "It was the best of times, it was the worst of times", }), presigningOptions ); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "3a7fc2cef9cab09384d0ef7a69bab0d942996846422bd041da5e52cae82612c3", }); }); it("should sign requests with binary bodies", async () => { const { query } = await signer.presign( new HttpRequest({ ...minimalRequest, body: new Uint8Array([0xde, 0xad, 0xbe, 0xef]), }), presigningOptions ); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "bd1427cfdc9a3b0a55609b0114d1dab4dfebca81a9496d6c47dedf65a3ec3bcb", }); }); it("should sign requests with streaming (unsigned) bodies", async () => { /** * An environment specific stream that the signer knows nothing about. */ class ExoticStream {} const { query } = await signer.presign( new HttpRequest({ ...minimalRequest, body: new ExoticStream() as any, }), presigningOptions ); expect(query).toEqual({ [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "457d44313f7b225c3523ddfc0ca161dfd010269b98c837a7a6f1b26ceb87ae4c", }); }); it(`should set and sign the ${TOKEN_QUERY_PARAM} query parameter if the credentials have a session token`, async () => { const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: { ...credentials, sessionToken: "baz", }, }); const { query } = await signer.presign(minimalRequest, presigningOptions); expect(query).toEqual({ [TOKEN_QUERY_PARAM]: "baz", [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "1b57912615b8e7ae78790ba713193d34baa793d6be2a1b18370dd27dce2d05a7", }); }); it("should use the precalculated payload checksum if provided", async () => { const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials, }); const { query } = await signer.presign( new HttpRequest({ ...minimalRequest, body: new Uint8Array([0xde, 0xad, 0xbe, 0xef]), headers: { ...minimalRequest.headers, "X-Amz-Content-Sha256": "UNSIGNED-PAYLOAD", }, }), presigningOptions ); expect(query).toEqual({ "X-Amz-Content-Sha256": "UNSIGNED-PAYLOAD", [ALGORITHM_QUERY_PARAM]: ALGORITHM_IDENTIFIER, [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", [AMZ_DATE_QUERY_PARAM]: "20000101T000000Z", [EXPIRES_QUERY_PARAM]: presigningOptions.expiresIn.toString(), [SIGNED_HEADERS_QUERY_PARAM]: HOST_HEADER, [SIGNATURE_QUERY_PARAM]: "04ccc7891757c0ca3811d0e018e4655919ef11fa7b956fe9b782f273cec2374f", }); }); it("should allow specifying custom unsignable headers", async () => { const headers = { host: "foo.us-bar-1.amazonaws.com", foo: "bar", "user-agent": "baz", }; const { headers: headersAsSigned, query } = await signer.presign( new HttpRequest({ ...minimalRequest, headers, }), { ...presigningOptions, unsignableHeaders: new Set(["foo"]), } ); expect((query as any)[SIGNED_HEADERS_QUERY_PARAM]).toBe("host"); expect(headersAsSigned).toEqual(headers); }); it("should return a rejected promise if the expiresIn is more than one week in the future", async () => { await expect( signer.presign(minimalRequest, { ...presigningOptions, expiresIn: 7 * 24 * 60 * 60 + 1, }) ).rejects.toMatch(/less than one week in the future/); }); it("should support presigning with asynchronously resolved credentials", async () => { const credsProvider = () => Promise.resolve({ accessKeyId: "foo", secretAccessKey: "bar", }); const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: credsProvider, }); const { query } = await signer.presign(minimalRequest, presigningOptions); expect(query).toMatchObject({ [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", }); }); it("should support presigning with an asynchronously resolved region", async () => { const regionProvider = () => Promise.resolve("us-bar-1"); const signer = new SignatureV4({ service: "foo", region: regionProvider, sha256: Sha256, credentials: { accessKeyId: "foo", secretAccessKey: "bar", }, }); const { query } = await signer.presign(minimalRequest, presigningOptions); expect(query).toMatchObject({ [CREDENTIAL_QUERY_PARAM]: "foo/20000101/us-bar-1/foo/aws4_request", }); }); describe("URI encoding paths", () => { const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/foo%3Dbar", headers: { host: "foo.us-bar-1.amazonaws.com", }, hostname: "foo.us-bar-1.amazonaws.com", }); it("should URI-encode the path by default", async () => { const { query = {} } = await signer.presign(minimalRequest, presigningOptions); expect(query[SIGNATURE_QUERY_PARAM]).toBe("6267d8b6f44d165d2b9f4d2c2b45fd6971de0962820243669bf685818c9c7849"); }); it("should normalize relative path by default", async () => { const { query = {} } = await signer.presign( { ...minimalRequest, path: "/abc/../foo%3Dbar" }, presigningOptions ); expect(query[SIGNATURE_QUERY_PARAM]).toBe("6267d8b6f44d165d2b9f4d2c2b45fd6971de0962820243669bf685818c9c7849"); }); it("should normalize path with consecutive slashes by default", async () => { const { query = {} } = await signer.presign({ ...minimalRequest, path: "//foo%3Dbar" }, presigningOptions); expect(query[SIGNATURE_QUERY_PARAM]).toBe("6267d8b6f44d165d2b9f4d2c2b45fd6971de0962820243669bf685818c9c7849"); }); it("should not URI-encode the path if URI path escaping was disabled on the signer", async () => { // Setting `uriEscapePath` to `false` creates an // S3-compatible signer. The expected signature included // below was calculated using the // `Aws\Signature\S3SignatureV4` class from the AWS SDK for // PHP const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: { accessKeyId: "foo", secretAccessKey: "bar", }, uriEscapePath: false, }); const { query = {} } = await signer.presign( new HttpRequest({ ...minimalRequest, path: "/foo/bar/baz", headers: { ...minimalRequest.headers, "X-Amz-Content-Sha256": "UNSIGNED-PAYLOAD", }, }), presigningOptions ); expect(query[SIGNATURE_QUERY_PARAM]).toBe("d1a68eff5d8d5be581f20c7793a67a6cd2e561a5b818055b21ad064139eb83b1"); }); }); }); describe("#sign (request)", () => { it("should throw on invalid credential", async () => { const signer = new SignatureV4({ ...signerInit, credentials: {} as any }); try { await signer.sign(minimalRequest); fail("This test is expected to fail"); } catch (e) { expect(e.message).toBe("Resolved credential object is not valid"); } }); it("should sign requests without bodies", async () => { const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=1e3b24fcfd7655c0c245d99ba7b6b5ca6174eab903ebfbda09ce457af062ad30" ); }); it("should support overriding region and service in the signer instance", async () => { const signer = new SignatureV4({ ...signerInit, service: "qux", region: "us-foo-1", }); const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), signingService: signerInit.service, signingRegion: signerInit.region, }); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=1e3b24fcfd7655c0c245d99ba7b6b5ca6174eab903ebfbda09ce457af062ad30" ); }); it("should sign requests without host header", async () => { const request = HttpRequest.clone(minimalRequest); delete request.headers[HOST_HEADER]; const { headers } = await signer.sign(request, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=x-amz-content-sha256;x-amz-date, Signature=36cfca5cdb2c8d094f100663925d408a9608908ffc10b83133e5b25829ef7f5f" ); }); it("should sign requests with string bodies", async () => { const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, body: "It was the best of times, it was the worst of times", }), { signingDate: new Date("2000-01-01T00:00:00.000Z") } ); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=cf22a0befff359388f136b158f0b1b43db7b18d2ca65ce4112bc88a16815c4b6" ); }); it("should sign requests with binary bodies", async () => { const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, body: new Uint8Array([0xde, 0xad, 0xbe, 0xef]), }), { signingDate: new Date("2000-01-01T00:00:00.000Z") } ); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=89f092f52faedb8a6be1890b2a511b88e7998389d62bd7d72915e2f4ee271a64" ); }); it("should sign requests with streaming (unsigned) bodies", async () => { /** * An environment specific stream that the signer knows nothing about. */ class ExoticStream {} const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, body: new ExoticStream() as any, headers: { ...minimalRequest.headers, "X-Amz-Content-Sha256": "UNSIGNED-PAYLOAD", }, }), { signingDate: new Date("2000-01-01T00:00:00.000Z") } ); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=2d17bf1aa1624819549626389790503937599b27a998286e0e190b897b1467dd" ); expect(headers["X-Amz-Content-Sha256"]).toBe(UNSIGNED_PAYLOAD); }); it("should sign requests with unsigned bodies when so directed", async () => { const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, body: "It was the best of times, it was the worst of times", headers: { ...minimalRequest.headers, "X-Amz-Content-Sha256": "UNSIGNED-PAYLOAD", }, }), { signingDate: new Date("2000-01-01T00:00:00.000Z") } ); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=2d17bf1aa1624819549626389790503937599b27a998286e0e190b897b1467dd" ); expect(headers["X-Amz-Content-Sha256"]).toBe(UNSIGNED_PAYLOAD); }); it(`should set the ${AMZ_DATE_HEADER}`, async () => { const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AMZ_DATE_HEADER]).toBe("20000101T000000Z"); }); it(`should set and sign the ${TOKEN_HEADER} header if the credentials have a session token`, async () => { const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: { ...credentials, sessionToken: "baz", }, }); const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token, Signature=4fd09a8cf3b28a62a9c6c424f03ababcd703528578bc6ec9184fc585f18c3fbb" ); }); it("should allow specifying custom unsignable headers", async () => { const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, headers: { host: "foo.us-bar-1.amazonaws.com", foo: "bar", "user-agent": "baz", }, }), { signingDate: new Date("2000-01-01T00:00:00.000Z"), unsignableHeaders: new Set(["foo"]), } ); expect(headers[AUTH_HEADER]).toMatch( /^AWS4-HMAC-SHA256 Credential=foo\/20000101\/us-bar-1\/foo\/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=/ ); }); it("should allow specifying custom signable headers to override custom and always unsignable ones", async () => { const { headers } = await signer.sign( { ...minimalRequest, headers: { host: "foo.us-bar-1.amazonaws.com", foo: "bar", "user-agent": "baz", }, }, { signingDate: new Date("2000-01-01T00:00:00.000Z"), unsignableHeaders: new Set(["foo"]), signableHeaders: new Set(["foo", "user-agent"]), } ); expect(headers[AUTH_HEADER]).toMatch( /^AWS4-HMAC-SHA256 Credential=foo\/20000101\/us-bar-1\/foo\/aws4_request, SignedHeaders=foo;host;user-agent;x-amz-content-sha256;x-amz-date, Signature=/ ); }); it("should support signing with asynchronously resolved credentials", async () => { const credsProvider = () => Promise.resolve({ accessKeyId: "foo", secretAccessKey: "bar", }); const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: credsProvider, }); const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AUTH_HEADER]).toMatch(/^AWS4-HMAC-SHA256 Credential=foo\/20000101\/us-bar-1\/foo\/aws4_request/); }); it("should support presigning with an asynchronously resolved region", async () => { const regionProvider = () => Promise.resolve("us-bar-1"); const signer = new SignatureV4({ service: "foo", region: regionProvider, sha256: Sha256, credentials: { accessKeyId: "foo", secretAccessKey: "bar", }, }); const { headers } = await signer.sign(minimalRequest, { signingDate: new Date("2000-01-01T00:00:00.000Z"), }); expect(headers[AUTH_HEADER]).toMatch(/^AWS4-HMAC-SHA256 Credential=foo\/20000101\/us-bar-1\/foo\/aws4_request/); }); describe("URI encoding paths", () => { const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/foo%3Dbar", headers: { host: "foo.us-bar-1.amazonaws.com", }, hostname: "foo.us-bar-1.amazonaws.com", }); const signingOptions = { signingDate: new Date("2000-01-01T00:00:00.000Z"), }; it("should URI-encode the path by default", async () => { const { headers } = await signer.sign(minimalRequest, signingOptions); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=fb4948cab44a9c47ce3b1a2489d01ec939fea9e79eccdb4593c11a94f207e075" ); }); it("should normalize relative path by default", async () => { const { headers } = await signer.sign({ ...minimalRequest, path: "/abc/../foo%3Dbar" }, signingOptions); expect(headers[AUTH_HEADER]).toEqual( expect.stringContaining("Signature=fb4948cab44a9c47ce3b1a2489d01ec939fea9e79eccdb4593c11a94f207e075") ); }); it("should normalize path with consecutive slashes by default", async () => { const { headers } = await signer.sign({ ...minimalRequest, path: "//foo%3Dbar" }, signingOptions); expect(headers[AUTH_HEADER]).toEqual( expect.stringContaining("Signature=fb4948cab44a9c47ce3b1a2489d01ec939fea9e79eccdb4593c11a94f207e075") ); }); it("should normalize path with non-standard characters by default", async () => { const { headers } = await signer.sign({ ...minimalRequest, path: "/foo/!'()*" }, signingOptions); expect(headers[AUTH_HEADER]).toEqual( expect.stringContaining("Signature=698b237cc68fe34535e57f374fa81f63219314b5a877742f889f6222c9ecab7b") ); }); it("should not URI-encode the path if URI path escaping was disabled on the signer", async () => { // Setting `uriEscapePath` to `false` creates an // S3-compatible signer. The expected authorization header // included below was calculated using the // `Aws\Signature\S3SignatureV4` class from the AWS SDK for // PHP const signer = new SignatureV4({ service: "foo", region: "us-bar-1", sha256: Sha256, credentials: { accessKeyId: "foo", secretAccessKey: "bar", }, uriEscapePath: false, }); const { headers } = await signer.sign( new HttpRequest({ ...minimalRequest, headers: { ...minimalRequest.headers, "X-Amz-Content-Sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", }, }), { signingDate: new Date("2000-01-01T00:00:00.000Z"), } ); expect(headers[AUTH_HEADER]).toBe( "AWS4-HMAC-SHA256 Credential=foo/20000101/us-bar-1/foo/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=0d859e5a74374efc2c9f14ba9352df14c68e411a1f44bd639fdd024e5f7b7ef1" ); }); }); }); describe("#sign (string)", () => { const signerInit = { service: "s3", region: "us-east-1", credentials: { accessKeyId: "AKIAIOSFODNN7EXAMPLE", secretAccessKey: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", }, sha256: Sha256, }; it("should throw on invalid credential", async () => { const signer = new SignatureV4({ ...signerInit, credentials: {} as any }); try { await signer.sign("STRING_TO_SIGN"); fail("This test is expected to fail"); } catch (e) { expect(e.message).toBe("Resolved credential object is not valid"); } }); it("should produce signatures matching known outputs", async () => { // Example copied from https://github.com/aws/aws-sdk-php/blob/3.42.0/tests/S3/PostObjectV4Test.php#L37 const signer = new SignatureV4(signerInit); const signingDate = new Date("2015-12-29T00:00:00Z"); const stringToSign = "eyJleHBpcmF0aW9uIjoiMjAxNS0xMi0yOVQwMTowMDowMFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJzaWd2NGV4YW1wbGVidWNrZXQifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXJcL3VzZXIxXC8iXSx7ImFjbCI6InB1YmxpYy1yZWFkIn0seyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6XC9cL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tXC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sWyJzdGFydHMtd2l0aCIsIiRDb250ZW50LVR5cGUiLCJpbWFnZVwvIl0seyJ4LWFtei1tZXRhLXV1aWQiOiIxNDM2NTEyMzY1MTI3NCJ9LHsieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI6IkFFUzI1NiJ9LFsic3RhcnRzLXdpdGgiLCIkeC1hbXotbWV0YS10YWciLCIiXSx7IlgtQW16LURhdGUiOiIyMDE1MTIyOVQwMDAwWiJ9LHsiWC1BbXotQ3JlZGVudGlhbCI6IkFLSUFJT1NGT0ROTjdFWEFNUExFXC8yMDE1MTIyOVwvdXMtZWFzdC0xXC9zM1wvYXdzNF9yZXF1ZXN0In0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In1dfQ=="; expect(await signer.sign(stringToSign, { signingDate })).toBe( "683963a1575bb197c642490ac60f3f08cda08233cd3a163ad31b554e9327a3ff" ); }); it("should support overriding region and service in the signer instance", async () => { const signer = new SignatureV4({ ...signerInit, service: "qux", region: "us-foo-1", }); const signingDate = new Date("2015-12-29T00:00:00Z"); const stringToSign = "eyJleHBpcmF0aW9uIjoiMjAxNS0xMi0yOVQwMTowMDowMFoiLCJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJzaWd2NGV4YW1wbGVidWNrZXQifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsInVzZXJcL3VzZXIxXC8iXSx7ImFjbCI6InB1YmxpYy1yZWFkIn0seyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6Imh0dHA6XC9cL3NpZ3Y0ZXhhbXBsZWJ1Y2tldC5zMy5hbWF6b25hd3MuY29tXC9zdWNjZXNzZnVsX3VwbG9hZC5odG1sIn0sWyJzdGFydHMtd2l0aCIsIiRDb250ZW50LVR5cGUiLCJpbWFnZVwvIl0seyJ4LWFtei1tZXRhLXV1aWQiOiIxNDM2NTEyMzY1MTI3NCJ9LHsieC1hbXotc2VydmVyLXNpZGUtZW5jcnlwdGlvbiI6IkFFUzI1NiJ9LFsic3RhcnRzLXdpdGgiLCIkeC1hbXotbWV0YS10YWciLCIiXSx7IlgtQW16LURhdGUiOiIyMDE1MTIyOVQwMDAwWiJ9LHsiWC1BbXotQ3JlZGVudGlhbCI6IkFLSUFJT1NGT0ROTjdFWEFNUExFXC8yMDE1MTIyOVwvdXMtZWFzdC0xXC9zM1wvYXdzNF9yZXF1ZXN0In0seyJYLUFtei1BbGdvcml0aG0iOiJBV1M0LUhNQUMtU0hBMjU2In1dfQ=="; expect( await signer.sign(stringToSign, { signingDate, signingRegion: signerInit.region, signingService: signerInit.service, }) ).toBe("683963a1575bb197c642490ac60f3f08cda08233cd3a163ad31b554e9327a3ff"); }); }); describe("#sign (event)", () => { //adopt to Ruby SDK: https://github.com/aws/aws-sdk-ruby/blob/3c47c05aa77bdbb7b803a3ff932b3a89c32276ac/gems/aws-sigv4/spec/signer_spec.rb#L274 const signerInit = { service: "SERVICE", region: "REGION", credentials: { accessKeyId: "akid", secretAccessKey: "secret", }, sha256: Sha256, }; it("should throw on invalid credential", async () => { const signer = new SignatureV4({ ...signerInit, credentials: {} as any }); try { await signer.sign( { headers: Uint8Array.from([5, 58, 100, 97, 116, 101, 8, 0, 0, 1, 103, 247, 125, 87, 112]), payload: "foo" as any, }, { signingDate: new Date(1369353600000), priorSignature: "", } ); fail("This test is expected to fail"); } catch (e) { expect(e.message).toBe("Resolved credential object is not valid"); } }); it("support event signing", async () => { const signer = new SignatureV4(signerInit); const eventSignature = await signer.sign( { headers: Uint8Array.from([5, 58, 100, 97, 116, 101, 8, 0, 0, 1, 103, 247, 125, 87, 112]), payload: "foo" as any, }, { signingDate: new Date(1369353600000), priorSignature: "", } ); expect(eventSignature).toEqual("204bb5e2713e95354680e9522986d3ac0304aeafd33397f39e6540ca51ffe226"); }); it("should support overriding region and service in the signer instance", async () => { const signer = new SignatureV4({ ...signerInit, service: "qux", // region: "us-foo-1", }); const eventSignature = await signer.sign( { headers: Uint8Array.from([5, 58, 100, 97, 116, 101, 8, 0, 0, 1, 103, 247, 125, 87, 112]), payload: "foo" as any, }, { signingDate: new Date(1369353600000), priorSignature: "", // signingRegion: signerInit.region, signingService: signerInit.service, } ); expect(eventSignature).toEqual("204bb5e2713e95354680e9522986d3ac0304aeafd33397f39e6540ca51ffe226"); }); it("should use eventStreamCredentials when provided instead of credential provider", async () => { const credentialProvider = vi.fn().mockRejectedValue(new Error("should not be called")); const signer = new SignatureV4({ ...signerInit, credentials: credentialProvider, }); const eventSignature = await signer.sign( { headers: Uint8Array.from([5, 58, 100, 97, 116, 101, 8, 0, 0, 1, 103, 247, 125, 87, 112]), payload: "foo" as any, }, { signingDate: new Date(1369353600000), priorSignature: "", eventStreamCredentials: { accessKeyId: "akid", secretAccessKey: "secret", }, } ); expect(credentialProvider).not.toHaveBeenCalled(); expect(eventSignature).toEqual("204bb5e2713e95354680e9522986d3ac0304aeafd33397f39e6540ca51ffe226"); }); it("should produce different signature when eventStreamCredentials differ from signer credentials", async () => { const signer = new SignatureV4(signerInit); const differentCreds = { accessKeyId: "other-akid", secretAccessKey: "other-secret", }; const event = { headers: Uint8Array.from([5, 58, 100, 97, 116, 101, 8, 0, 0, 1, 103, 247, 125, 87, 112]), payload: "foo" as any, }; const opts = { signingDate: new Date(1369353600000), priorSignature: "", }; const signatureWithDefault = await signer.sign(event, opts); const signatureWithOverride = await signer.sign(event, { ...opts, eventStreamCredentials: differentCreds, }); expect(signatureWithDefault).not.toEqual(signatureWithOverride); }); }); describe("#sign (message)", () => { const signerInit = { service: "SERVICE", region: "REGION", credentials: { accessKeyId: "akid", secretAccessKey: "secret", }, sha256: Sha256, }; it("support message signing", async () => { const signer = new SignatureV4(signerInit); const headers = { ":date": { type: "timestamp", value: new Date("2018-12-29T01:04:06.000Z"), } as TimestampHeaderValue, }; const signedMessage = await signer.sign( { message: { headers, body: "foo" as any, }, priorSignature: "", } as SignableMessage, { signingDate: new Date(1369353600000), } ); expect(signedMessage.signature).toEqual("204bb5e2713e95354680e9522986d3ac0304aeafd33397f39e6540ca51ffe226"); expect(signedMessage.message.body).toEqual("foo"); expect(signedMessage.message.headers).toEqual(headers); }); it("should use eventStreamCredentials when provided instead of credential provider", async () => { const credentialProvider = vi.fn().mockRejectedValue(new Error("should not be called")); const signer = new SignatureV4({ ...signerInit, credentials: credentialProvider, }); const signedMessage = await signer.sign( { message: { headers: { ":date": { type: "timestamp", value: new Date("2018-12-29T01:04:06.000Z"), } as TimestampHeaderValue, }, body: "foo" as any, }, priorSignature: "", } as SignableMessage, { signingDate: new Date(1369353600000), eventStreamCredentials: { accessKeyId: "akid", secretAccessKey: "secret", }, } ); expect(credentialProvider).not.toHaveBeenCalled(); expect(signedMessage.signature).toEqual("204bb5e2713e95354680e9522986d3ac0304aeafd33397f39e6540ca51ffe226"); }); }); describe("ambient Date usage", () => { let dateSpy: MockInstance; const mockDate = new Date(); beforeEach(() => { dateSpy = vi.spyOn(global, "Date").mockImplementation(() => mockDate as any); }); afterEach(() => { expect(dateSpy).toHaveBeenCalledTimes(1); vi.clearAllMocks(); }); it("should use the current date for presigning if no signing date was supplied", async () => { const { query } = await signer.presign(minimalRequest); expect((query as any)[AMZ_DATE_QUERY_PARAM]).toBe(iso8601(mockDate).replace(/[\-:]/g, "")); }); it("should use the current date for signing if no signing date supplied", async () => { const { headers } = await signer.sign(minimalRequest); expect(headers[AMZ_DATE_HEADER]).toBe(iso8601(mockDate).replace(/[\-:]/g, "")); }); }); }); ================================================ FILE: packages/signature-v4/src/SignatureV4.ts ================================================ import { toHex, toUint8Array } from "@smithy/core/serde"; import type { AwsCredentialIdentity, EventSigner, EventSigningArguments, FormattedEvent, HttpRequest, MessageSigner, MessageSigningArguments, RequestPresigner, RequestPresigningArguments, RequestSigner, RequestSigningArguments, SignableMessage, SignedMessage, SigningArguments, StringSigner, } from "@smithy/types"; import { HeaderFormatter } from "./HeaderFormatter"; import { SignatureV4Base, type SignatureV4CryptoInit, type SignatureV4Init } from "./SignatureV4Base"; import { ALGORITHM_IDENTIFIER, ALGORITHM_QUERY_PARAM, AMZ_DATE_HEADER, AMZ_DATE_QUERY_PARAM, AUTH_HEADER, CREDENTIAL_QUERY_PARAM, EVENT_ALGORITHM_IDENTIFIER, EXPIRES_QUERY_PARAM, MAX_PRESIGNED_TTL, SHA256_HEADER, SIGNATURE_QUERY_PARAM, SIGNED_HEADERS_QUERY_PARAM, TOKEN_HEADER, TOKEN_QUERY_PARAM, } from "./constants"; import { createScope, getSigningKey } from "./credentialDerivation"; import { getCanonicalHeaders } from "./getCanonicalHeaders"; import { getPayloadHash } from "./getPayloadHash"; import { hasHeader } from "./headerUtil"; import { moveHeadersToQuery } from "./moveHeadersToQuery"; import { prepareRequest } from "./prepareRequest"; /** * @public */ export class SignatureV4 extends SignatureV4Base implements RequestPresigner, RequestSigner, StringSigner, EventSigner, MessageSigner { private readonly headerFormatter = new HeaderFormatter(); constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }: SignatureV4Init & SignatureV4CryptoInit) { super({ applyChecksum, credentials, region, service, sha256, uriEscapePath, }); } public async presign(originalRequest: HttpRequest, options: RequestPresigningArguments = {}): Promise { const { signingDate = new Date(), expiresIn = 3600, unsignableHeaders, unhoistableHeaders, signableHeaders, hoistableHeaders, signingRegion, signingService, } = options; const credentials = await this.credentialProvider(); this.validateResolvedCredentials(credentials); const region = signingRegion ?? (await this.regionProvider()); const { longDate, shortDate } = this.formatDate(signingDate); if (expiresIn > MAX_PRESIGNED_TTL) { return Promise.reject( "Signature version 4 presigned URLs" + " must have an expiration date less than one week in" + " the future" ); } const scope = createScope(shortDate, region, signingService ?? this.service); const request = moveHeadersToQuery(prepareRequest(originalRequest), { unhoistableHeaders, hoistableHeaders }); if (credentials.sessionToken) { request.query[TOKEN_QUERY_PARAM] = credentials.sessionToken; } request.query[ALGORITHM_QUERY_PARAM] = ALGORITHM_IDENTIFIER; request.query[CREDENTIAL_QUERY_PARAM] = `${credentials.accessKeyId}/${scope}`; request.query[AMZ_DATE_QUERY_PARAM] = longDate; request.query[EXPIRES_QUERY_PARAM] = expiresIn.toString(10); const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders); request.query[SIGNED_HEADERS_QUERY_PARAM] = this.getCanonicalHeaderList(canonicalHeaders); request.query[SIGNATURE_QUERY_PARAM] = await this.getSignature( longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, await getPayloadHash(originalRequest, this.sha256)) ); return request; } public async sign(stringToSign: string, options?: SigningArguments): Promise; public async sign(event: FormattedEvent, options: EventSigningArguments): Promise; public async sign(event: SignableMessage, options: MessageSigningArguments): Promise; public async sign(requestToSign: HttpRequest, options?: RequestSigningArguments): Promise; public async sign(toSign: any, options: any): Promise { if (typeof toSign === "string") { return this.signString(toSign, options); } else if (toSign.headers && toSign.payload) { return this.signEvent(toSign, options); } else if (toSign.message) { return this.signMessage(toSign, options); } else { return this.signRequest(toSign, options); } } private async signEvent( { headers, payload }: FormattedEvent, { signingDate = new Date(), priorSignature, signingRegion, signingService, eventStreamCredentials, }: EventSigningArguments ): Promise { const region = signingRegion ?? (await this.regionProvider()); const { shortDate, longDate } = this.formatDate(signingDate); const scope = createScope(shortDate, region, signingService ?? this.service); const hashedPayload = await getPayloadHash({ headers: {}, body: payload } as any, this.sha256); const hash = new this.sha256(); hash.update(headers); const hashedHeaders = toHex(await hash.digest()); const stringToSign = [ EVENT_ALGORITHM_IDENTIFIER, longDate, scope, priorSignature, hashedHeaders, hashedPayload, ].join("\n"); return this.signString(stringToSign, { signingDate, signingRegion: region, signingService, eventStreamCredentials, }); } async signMessage( signableMessage: SignableMessage, { signingDate = new Date(), signingRegion, signingService, eventStreamCredentials }: MessageSigningArguments ): Promise { const promise = this.signEvent( { headers: this.headerFormatter.format(signableMessage.message.headers), payload: signableMessage.message.body, }, { signingDate, signingRegion, signingService, priorSignature: signableMessage.priorSignature, eventStreamCredentials, } ); return promise.then((signature) => { return { message: signableMessage.message, signature }; }); } private async signString( stringToSign: string, { signingDate = new Date(), signingRegion, signingService, eventStreamCredentials, }: SigningArguments & Partial = {} ): Promise { const credentials = eventStreamCredentials ?? (await this.credentialProvider()); this.validateResolvedCredentials(credentials); const region = signingRegion ?? (await this.regionProvider()); const { shortDate } = this.formatDate(signingDate); const hash = new this.sha256(await this.getSigningKey(credentials, region, shortDate, signingService)); hash.update(toUint8Array(stringToSign)); return toHex(await hash.digest()); } private async signRequest( requestToSign: HttpRequest, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, }: RequestSigningArguments = {} ): Promise { const credentials = await this.credentialProvider(); this.validateResolvedCredentials(credentials); const region = signingRegion ?? (await this.regionProvider()); const request = prepareRequest(requestToSign); const { longDate, shortDate } = this.formatDate(signingDate); const scope = createScope(shortDate, region, signingService ?? this.service); request.headers[AMZ_DATE_HEADER] = longDate; if (credentials.sessionToken) { request.headers[TOKEN_HEADER] = credentials.sessionToken; } const payloadHash = await getPayloadHash(request, this.sha256); if (!hasHeader(SHA256_HEADER, request.headers) && this.applyChecksum) { request.headers[SHA256_HEADER] = payloadHash; } const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders); const signature = await this.getSignature( longDate, scope, this.getSigningKey(credentials, region, shortDate, signingService), this.createCanonicalRequest(request, canonicalHeaders, payloadHash) ); request.headers[AUTH_HEADER] = `${ALGORITHM_IDENTIFIER} ` + `Credential=${credentials.accessKeyId}/${scope}, ` + `SignedHeaders=${this.getCanonicalHeaderList(canonicalHeaders)}, ` + `Signature=${signature}`; return request; } private async getSignature( longDate: string, credentialScope: string, keyPromise: Promise, canonicalRequest: string ): Promise { const stringToSign = await this.createStringToSign( longDate, credentialScope, canonicalRequest, ALGORITHM_IDENTIFIER ); const hash = new this.sha256(await keyPromise); hash.update(toUint8Array(stringToSign)); return toHex(await hash.digest()); } private getSigningKey( credentials: AwsCredentialIdentity, region: string, shortDate: string, service?: string ): Promise { return getSigningKey(this.sha256, credentials, shortDate, region, service || this.service); } } ================================================ FILE: packages/signature-v4/src/SignatureV4Base.ts ================================================ import { normalizeProvider } from "@smithy/core/client"; import { escapeUri } from "@smithy/core/protocols"; import { toHex, toUint8Array } from "@smithy/core/serde"; import type { AwsCredentialIdentity, ChecksumConstructor, DateInput, HashConstructor, HeaderBag, HttpRequest, Provider, } from "@smithy/types"; import { getCanonicalQuery } from "./getCanonicalQuery"; import { iso8601 } from "./utilDate"; /** * @public */ export interface SignatureV4Init { /** * The service signing name. */ service: string; /** * The region name or a function that returns a promise that will be * resolved with the region name. */ region: string | Provider; /** * The credentials with which the request should be signed or a function * that returns a promise that will be resolved with credentials. */ credentials: AwsCredentialIdentity | Provider; /** * A constructor function for a hash object that will calculate SHA-256 HMAC * checksums. */ sha256?: ChecksumConstructor | HashConstructor; /** * Whether to uri-escape the request URI path as part of computing the * canonical request string. This is required for every AWS service, except * Amazon S3, as of late 2017. * * @default [true] */ uriEscapePath?: boolean; /** * Whether to calculate a checksum of the request body and include it as * either a request header (when signing) or as a query string parameter * (when presigning). This is required for AWS Glacier and Amazon S3 and optional for * every other AWS service as of late 2017. * * @default [true] */ applyChecksum?: boolean; } /** * @public */ export interface SignatureV4CryptoInit { sha256: ChecksumConstructor | HashConstructor; } /** * @internal */ export abstract class SignatureV4Base { protected readonly service: string; protected readonly regionProvider: Provider; protected readonly credentialProvider: Provider; protected readonly sha256: ChecksumConstructor | HashConstructor; private readonly uriEscapePath: boolean; protected readonly applyChecksum: boolean; protected constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }: SignatureV4Init & SignatureV4CryptoInit) { this.service = service; this.sha256 = sha256; this.uriEscapePath = uriEscapePath; // default to true if applyChecksum isn't set this.applyChecksum = typeof applyChecksum === "boolean" ? applyChecksum : true; this.regionProvider = normalizeProvider(region); this.credentialProvider = normalizeProvider(credentials); } protected createCanonicalRequest(request: HttpRequest, canonicalHeaders: HeaderBag, payloadHash: string): string { const sortedHeaders = Object.keys(canonicalHeaders).sort(); return `${request.method} ${this.getCanonicalPath(request)} ${getCanonicalQuery(request)} ${sortedHeaders.map((name) => `${name}:${canonicalHeaders[name]}`).join("\n")} ${sortedHeaders.join(";")} ${payloadHash}`; } protected async createStringToSign( longDate: string, credentialScope: string, canonicalRequest: string, algorithmIdentifier: string ): Promise { const hash = new this.sha256(); hash.update(toUint8Array(canonicalRequest)); const hashedRequest = await hash.digest(); return `${algorithmIdentifier} ${longDate} ${credentialScope} ${toHex(hashedRequest)}`; } private getCanonicalPath({ path }: HttpRequest): string { if (this.uriEscapePath) { // Non-S3 services, we normalize the path and then double URI encode it. // Ref: "Remove Dot Segments" https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 const normalizedPathSegments = []; for (const pathSegment of path.split("/")) { if (pathSegment?.length === 0) continue; if (pathSegment === ".") continue; if (pathSegment === "..") { normalizedPathSegments.pop(); } else { normalizedPathSegments.push(pathSegment); } } // Joining by single slashes to remove consecutive slashes. const normalizedPath = `${path?.startsWith("/") ? "/" : ""}${normalizedPathSegments.join("/")}${ normalizedPathSegments.length > 0 && path?.endsWith("/") ? "/" : "" }`; // Double encode and replace non-standard characters !'()* according to RFC 3986 const doubleEncoded = escapeUri(normalizedPath); return doubleEncoded.replace(/%2F/g, "/"); } // For S3, we shouldn't normalize the path. For example, object name // my-object//example//photo.user should not be normalized to // my-object/example/photo.user return path; } protected validateResolvedCredentials(credentials: unknown) { if ( typeof credentials !== "object" || // @ts-expect-error: Property 'accessKeyId' does not exist on type 'object'.ts(2339) typeof credentials.accessKeyId !== "string" || // @ts-expect-error: Property 'secretAccessKey' does not exist on type 'object'.ts(2339) typeof credentials.secretAccessKey !== "string" ) { throw new Error("Resolved credential object is not valid"); } } protected formatDate(now: DateInput): { longDate: string; shortDate: string } { const longDate = iso8601(now).replace(/[\-:]/g, ""); return { longDate, shortDate: longDate.slice(0, 8), }; } protected getCanonicalHeaderList(headers: object): string { return Object.keys(headers).sort().join(";"); } } ================================================ FILE: packages/signature-v4/src/constants.ts ================================================ export const ALGORITHM_QUERY_PARAM = "X-Amz-Algorithm"; export const CREDENTIAL_QUERY_PARAM = "X-Amz-Credential"; export const AMZ_DATE_QUERY_PARAM = "X-Amz-Date"; export const SIGNED_HEADERS_QUERY_PARAM = "X-Amz-SignedHeaders"; export const EXPIRES_QUERY_PARAM = "X-Amz-Expires"; export const SIGNATURE_QUERY_PARAM = "X-Amz-Signature"; export const TOKEN_QUERY_PARAM = "X-Amz-Security-Token"; export const REGION_SET_PARAM = "X-Amz-Region-Set"; export const AUTH_HEADER = "authorization"; export const AMZ_DATE_HEADER = AMZ_DATE_QUERY_PARAM.toLowerCase(); export const DATE_HEADER = "date"; export const GENERATED_HEADERS = [AUTH_HEADER, AMZ_DATE_HEADER, DATE_HEADER]; export const SIGNATURE_HEADER = SIGNATURE_QUERY_PARAM.toLowerCase(); export const SHA256_HEADER = "x-amz-content-sha256"; export const TOKEN_HEADER = TOKEN_QUERY_PARAM.toLowerCase(); export const HOST_HEADER = "host"; export const ALWAYS_UNSIGNABLE_HEADERS = { authorization: true, "cache-control": true, connection: true, expect: true, from: true, "keep-alive": true, "max-forwards": true, pragma: true, referer: true, te: true, trailer: true, "transfer-encoding": true, upgrade: true, "user-agent": true, "x-amzn-trace-id": true, }; export const PROXY_HEADER_PATTERN = /^proxy-/; export const SEC_HEADER_PATTERN = /^sec-/; export const UNSIGNABLE_PATTERNS = [/^proxy-/i, /^sec-/i]; export const ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256"; export const ALGORITHM_IDENTIFIER_V4A = "AWS4-ECDSA-P256-SHA256"; export const EVENT_ALGORITHM_IDENTIFIER = "AWS4-HMAC-SHA256-PAYLOAD"; export const UNSIGNED_PAYLOAD = "UNSIGNED-PAYLOAD"; export const MAX_CACHE_SIZE = 50; export const KEY_TYPE_IDENTIFIER = "aws4_request"; export const MAX_PRESIGNED_TTL = 60 * 60 * 24 * 7; ================================================ FILE: packages/signature-v4/src/credentialDerivation.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import { toHex } from "@smithy/core/serde"; import type { AwsCredentialIdentity } from "@smithy/types"; import { beforeEach, describe, expect, test as it, vi } from "vitest"; import { clearCredentialCache, createScope, getSigningKey } from "./credentialDerivation"; describe("createScope", () => { it("should create a scoped identifier for the credentials used", () => { expect(createScope("date", "region", "service")).toBe("date/region/service/aws4_request"); }); }); describe("getSigningKey", () => { beforeEach(clearCredentialCache); const credentials: AwsCredentialIdentity = { accessKeyId: "foo", secretAccessKey: "bar", }; const shortDate = "19700101"; const region = "us-foo-1"; const service = "bar"; it( "should return a buffer containing a signing key derived from the" + " provided credentials, date, region, and service", () => { return expect(getSigningKey(Sha256, credentials, shortDate, region, service).then(toHex)).resolves.toBe( "b7c34d23320b5cd909500c889eac033a33c93f5a4bf67f71988a58f299e62e0a" ); } ); it("should trap errors encountered while hashing", () => { return expect( getSigningKey( vi.fn(() => { throw new Error("PANIC"); }), credentials, shortDate, region, service ) ).rejects.toMatchObject(new Error("PANIC")); }); describe("caching", () => { it("should return the same signing key when called with the same date, region, service, and credentials", async () => { const mockSha256Constructor = vi.fn().mockImplementation((args) => { return new Sha256(args); }); const key1 = await getSigningKey(mockSha256Constructor, credentials, shortDate, region, service); const key2 = await getSigningKey(mockSha256Constructor, credentials, shortDate, region, service); expect(key1).toBe(key2); expect(mockSha256Constructor).toHaveBeenCalledTimes(6); }); it("should cache a maximum of 50 entries", async () => { const keys: Array = new Array(50); // fill the cache for (let i = 0; i < 50; i++) { keys[i] = await getSigningKey(Sha256, credentials, shortDate, `us-foo-${i.toString(10)}`, service); } // evict the oldest member from the cache await getSigningKey(Sha256, credentials, shortDate, `us-foo-50`, service); // the second oldest member should still be in cache await expect(getSigningKey(Sha256, credentials, shortDate, `us-foo-1`, service)).resolves.toStrictEqual(keys[1]); // the oldest member should not be in the cache await expect(getSigningKey(Sha256, credentials, shortDate, `us-foo-0`, service)).resolves.not.toBe(keys[0]); }); }); }); ================================================ FILE: packages/signature-v4/src/credentialDerivation.ts ================================================ import { toHex, toUint8Array } from "@smithy/core/serde"; import type { AwsCredentialIdentity, ChecksumConstructor, HashConstructor, SourceData } from "@smithy/types"; import { KEY_TYPE_IDENTIFIER, MAX_CACHE_SIZE } from "./constants"; const signingKeyCache: Record = {}; const cacheQueue: Array = []; /** * Create a string describing the scope of credentials used to sign a request. * * @internal * * @param shortDate - the current calendar date in the form YYYYMMDD. * @param region - the AWS region in which the service resides. * @param service - the service to which the signed request is being sent. */ export const createScope = (shortDate: string, region: string, service: string): string => `${shortDate}/${region}/${service}/${KEY_TYPE_IDENTIFIER}`; /** * Derive a signing key from its composite parts. * * @internal * * @param sha256Constructor - a constructor function that can instantiate SHA-256 * hash objects. * @param credentials - the credentials with which the request will be * signed. * @param shortDate - the current calendar date in the form YYYYMMDD. * @param region - the AWS region in which the service resides. * @param service - the service to which the signed request is being * sent. */ export const getSigningKey = async ( sha256Constructor: ChecksumConstructor | HashConstructor, credentials: AwsCredentialIdentity, shortDate: string, region: string, service: string ): Promise => { const credsHash = await hmac(sha256Constructor, credentials.secretAccessKey, credentials.accessKeyId); const cacheKey = `${shortDate}:${region}:${service}:${toHex(credsHash)}:${credentials.sessionToken}`; if (cacheKey in signingKeyCache) { return signingKeyCache[cacheKey]; } cacheQueue.push(cacheKey); while (cacheQueue.length > MAX_CACHE_SIZE) { delete signingKeyCache[cacheQueue.shift() as string]; } let key: SourceData = `AWS4${credentials.secretAccessKey}`; for (const signable of [shortDate, region, service, KEY_TYPE_IDENTIFIER]) { key = await hmac(sha256Constructor, key, signable); } return (signingKeyCache[cacheKey] = key as Uint8Array); }; /** * @internal */ export const clearCredentialCache = (): void => { cacheQueue.length = 0; Object.keys(signingKeyCache).forEach((cacheKey) => { delete signingKeyCache[cacheKey]; }); }; const hmac = ( ctor: ChecksumConstructor | HashConstructor, secret: SourceData, data: SourceData ): Promise => { const hash = new ctor(secret); hash.update(toUint8Array(data)); return hash.digest(); }; ================================================ FILE: packages/signature-v4/src/getCanonicalHeaders.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { HeaderBag } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { ALWAYS_UNSIGNABLE_HEADERS } from "./constants"; import { getCanonicalHeaders } from "./getCanonicalHeaders"; describe("getCanonicalHeaders", () => { it("should downcase all headers", () => { expect( getCanonicalHeaders( new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { fOo: "bar", BaZ: "QUUX", HoSt: "foo.us-east-1.amazonaws.com", }, hostname: "foo.us-east-1.amazonaws.com", }) ) ).toEqual({ foo: "bar", baz: "QUUX", host: "foo.us-east-1.amazonaws.com", }); }); it("should remove all unsignable headers", () => { const request = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { "x-amz-user-agent": "aws-sdk-js-v3", host: "foo.us-east-1.amazonaws.com", foo: "bar", }, hostname: "foo.us-east-1.amazonaws.com", }); for (const headerName of Object.keys(ALWAYS_UNSIGNABLE_HEADERS)) { request.headers[headerName] = "baz"; } expect(getCanonicalHeaders(request)).toEqual({ "x-amz-user-agent": "aws-sdk-js-v3", host: "foo.us-east-1.amazonaws.com", foo: "bar", }); }); it("should ignore headers with undefined values", () => { const headers: HeaderBag = { "x-amz-user-agent": "aws-sdk-js-v3", host: "foo.us-east-1.amazonaws.com", ":authority": "", }; const request = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { ...headers, foo: undefined as any, bar: null as any, }, hostname: "foo.us-east-1.amazonaws.com", }); expect(getCanonicalHeaders(request)).toEqual(headers); }); it("should allow specifying custom unsignable headers", () => { const request = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { host: "foo.us-east-1.amazonaws.com", foo: "bar", "user-agent": "foo-user", }, hostname: "foo.us-east-1.amazonaws.com", }); expect(getCanonicalHeaders(request, new Set(["foo"]))).toEqual({ host: "foo.us-east-1.amazonaws.com", }); }); it("should allow specifying custom signable headers that override unsignable ones", () => { const request = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { host: "foo.us-east-1.amazonaws.com", foo: "bar", "user-agent": "foo-user", }, hostname: "foo.us-east-1.amazonaws.com", }); expect(getCanonicalHeaders(request, new Set(["foo"]), new Set(["foo", "user-agent"]))).toEqual({ host: "foo.us-east-1.amazonaws.com", foo: "bar", "user-agent": "foo-user", }); }); }); ================================================ FILE: packages/signature-v4/src/getCanonicalHeaders.ts ================================================ import type { HeaderBag, HttpRequest } from "@smithy/types"; import { ALWAYS_UNSIGNABLE_HEADERS, PROXY_HEADER_PATTERN, SEC_HEADER_PATTERN } from "./constants"; /** * @internal */ export const getCanonicalHeaders = ( { headers }: HttpRequest, unsignableHeaders?: Set, signableHeaders?: Set ): HeaderBag => { const canonical: HeaderBag = {}; for (const headerName of Object.keys(headers).sort()) { if (headers[headerName] == undefined) { continue; } const canonicalHeaderName = headerName.toLowerCase(); if ( canonicalHeaderName in ALWAYS_UNSIGNABLE_HEADERS || unsignableHeaders?.has(canonicalHeaderName) || PROXY_HEADER_PATTERN.test(canonicalHeaderName) || SEC_HEADER_PATTERN.test(canonicalHeaderName) ) { if (!signableHeaders || (signableHeaders && !signableHeaders.has(canonicalHeaderName))) { continue; } } canonical[canonicalHeaderName] = headers[headerName].trim().replace(/\s+/g, " "); } return canonical; }; ================================================ FILE: packages/signature-v4/src/getCanonicalQuery.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { describe, expect, test as it } from "vitest"; import { getCanonicalQuery } from "./getCanonicalQuery"; const httpRequestOptions = { method: "POST", protocol: "https:", path: "/", headers: {}, hostname: "foo.us-east-1.amazonaws.com", }; describe("getCanonicalQuery", () => { it("should return an empty string for requests with no querystring", () => { expect(getCanonicalQuery(new HttpRequest(httpRequestOptions))).toBe(""); }); it("should serialize simple key => value pairs", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { fizz: "buzz", foo: "bar" }, }) ) ).toBe("fizz=buzz&foo=bar"); }); it("should sort query keys alphabetically", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { foo: "bar", baz: "quux", fizz: "buzz" }, }) ) ).toBe("baz=quux&fizz=buzz&foo=bar"); }); it("should sort query keys alphabetically after URI-encode", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { A: "65", "[": "91", a: "97", "{": "123" }, }) ) ).toBe("%5B=91&%7B=123&A=65&a=97"); }); it("should URI-encode keys and values", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { "🐎": "🦄", "💩": "☃️" }, }) ) ).toBe("%F0%9F%90%8E=%F0%9F%A6%84&%F0%9F%92%A9=%E2%98%83%EF%B8%8F"); }); it("should omit the x-amz-signature parameter, regardless of case", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { "x-amz-signature": "foo", "X-Amz-Signature": "bar", fizz: "buzz", }, }) ) ).toBe("fizz=buzz"); }); it("should serialize arrays of values", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { foo: ["bar", "baz"] }, }) ) ).toBe("foo=bar&foo=baz"); }); it("should serialize arrays using an alphabetic sort", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { snap: ["pop", "crackle"] }, }) ) ).toBe("snap=crackle&snap=pop"); }); it("should URI-encode members of query param arrays", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { "🐎": ["💩", "🦄"] }, }) ) ).toBe("%F0%9F%90%8E=%F0%9F%92%A9&%F0%9F%90%8E=%F0%9F%A6%84"); }); it("should sort URI-encode members of query param arrays", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { p: ["a", "à"] }, }) ) ).toBe("p=%C3%A0&p=a"); }); it("should omit non-string, non-array values from the serialized query", () => { expect( getCanonicalQuery( new HttpRequest({ ...httpRequestOptions, query: { foo: "bar", baz: new Uint8Array(0) as any }, }) ) ).toBe("foo=bar"); }); }); ================================================ FILE: packages/signature-v4/src/getCanonicalQuery.ts ================================================ import { escapeUri } from "@smithy/core/protocols"; import type { HttpRequest } from "@smithy/types"; import { SIGNATURE_HEADER } from "./constants"; /** * @internal */ export const getCanonicalQuery = ({ query = {} }: HttpRequest): string => { const keys: Array = []; const serialized: Record = {}; for (const key of Object.keys(query)) { if (key.toLowerCase() === SIGNATURE_HEADER) { continue; } const encodedKey = escapeUri(key); keys.push(encodedKey); const value = query[key]; if (typeof value === "string") { serialized[encodedKey] = `${encodedKey}=${escapeUri(value)}`; } else if (Array.isArray(value)) { serialized[encodedKey] = value .slice(0) .reduce((encoded: Array, value: string) => encoded.concat([`${encodedKey}=${escapeUri(value)}`]), []) .sort() .join("&"); } } return keys .sort() .map((key) => serialized[key]) .filter((serialized) => serialized) // omit any falsy values .join("&"); }; ================================================ FILE: packages/signature-v4/src/getPayloadHash.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import { HttpRequest } from "@smithy/core/protocols"; import { describe, expect, test as it, vi } from "vitest"; import { SHA256_HEADER, UNSIGNED_PAYLOAD } from "./constants"; import { getPayloadHash } from "./getPayloadHash"; describe("getPayloadHash", () => { const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: {}, hostname: "foo.us-east-1.amazonaws.com", }); it("should return the SHA-256 hash of an empty string if a request has no payload (body)", async () => { await expect(getPayloadHash(minimalRequest, Sha256)).resolves.toBe( "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ); }); it(`should return the value in the '${SHA256_HEADER}' header (if present)`, async () => { await expect( getPayloadHash( new HttpRequest({ ...minimalRequest, headers: { [SHA256_HEADER]: "foo", }, }), vi.fn(() => { throw new Error("I should not have been invoked!"); }) ) ).resolves.toBe("foo"); }); it("should return the hex-encoded hash of a string body", async () => { await expect( getPayloadHash( new HttpRequest({ ...minimalRequest, body: "foo", }), Sha256 ) ).resolves.toBe("2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae"); }); it("should return the hex-encoded hash of a ArrayBufferView body", async () => { await expect( getPayloadHash( new HttpRequest({ ...minimalRequest, body: new Uint8Array([0xde, 0xad, 0xbe, 0xef]), }), Sha256 ) ).resolves.toBe("5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953"); }); it("should return the hex-encoded hash of a ArrayBuffer body", async () => { await expect( getPayloadHash( new HttpRequest({ ...minimalRequest, body: new Uint8Array([0xde, 0xad, 0xbe, 0xef]).buffer, }), Sha256 ) ).resolves.toBe("5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953"); }); it(`should return ${UNSIGNED_PAYLOAD} if the request has a streaming body and no stream collector is provided`, async () => { /** * An environment specific stream that the signer knows nothing about. */ class ExoticStream {} await expect( getPayloadHash( new HttpRequest({ ...minimalRequest, body: new ExoticStream() as any, }), Sha256 ) ).resolves.toBe(UNSIGNED_PAYLOAD); }); }); ================================================ FILE: packages/signature-v4/src/getPayloadHash.ts ================================================ import { isArrayBuffer, toHex, toUint8Array } from "@smithy/core/serde"; import type { ChecksumConstructor, HashConstructor, HttpRequest } from "@smithy/types"; import { SHA256_HEADER, UNSIGNED_PAYLOAD } from "./constants"; /** * @internal */ export const getPayloadHash = async ( { headers, body }: HttpRequest, hashConstructor: ChecksumConstructor | HashConstructor ): Promise => { for (const headerName of Object.keys(headers)) { if (headerName.toLowerCase() === SHA256_HEADER) { return headers[headerName]; } } if (body == undefined) { return "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; } else if (typeof body === "string" || ArrayBuffer.isView(body) || isArrayBuffer(body)) { const hashCtor = new hashConstructor(); hashCtor.update(toUint8Array(body)); return toHex(await hashCtor.digest()); } // As any defined body that is not a string or binary data is a stream, this // body is unsignable. Attempt to send the request with an unsigned payload, // which may or may not be accepted by the service. return UNSIGNED_PAYLOAD; }; ================================================ FILE: packages/signature-v4/src/headerUtil.ts ================================================ import type { HeaderBag } from "@smithy/types"; export const hasHeader = (soughtHeader: string, headers: HeaderBag): boolean => { soughtHeader = soughtHeader.toLowerCase(); for (const headerName of Object.keys(headers)) { if (soughtHeader === headerName.toLowerCase()) { return true; } } return false; }; /* Get the value of one request header, ignore the case. Return string if header is in the headers, else return undefined */ export const getHeaderValue = (soughtHeader: string, headers: HeaderBag): string | undefined => { soughtHeader = soughtHeader.toLowerCase(); for (const headerName of Object.keys(headers)) { if (soughtHeader === headerName.toLowerCase()) { return headers[headerName]; } } return undefined; }; /* Delete the one request header, ignore the case. Do nothing if it's not there */ export const deleteHeader = (soughtHeader: string, headers: HeaderBag) => { soughtHeader = soughtHeader.toLowerCase(); for (const headerName of Object.keys(headers)) { if (soughtHeader === headerName.toLowerCase()) { delete headers[headerName]; } } }; ================================================ FILE: packages/signature-v4/src/index.ts ================================================ export * from "./SignatureV4"; export * from "./constants"; export { getCanonicalHeaders } from "./getCanonicalHeaders"; export { getCanonicalQuery } from "./getCanonicalQuery"; export { getPayloadHash } from "./getPayloadHash"; export { moveHeadersToQuery } from "./moveHeadersToQuery"; export { prepareRequest } from "./prepareRequest"; export * from "./credentialDerivation"; export { SignatureV4Base, type SignatureV4Init, type SignatureV4CryptoInit } from "./SignatureV4Base"; export { hasHeader } from "./headerUtil"; export * from "./signature-v4a-container"; ================================================ FILE: packages/signature-v4/src/moveHeadersToQuery.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { describe, expect, test as it } from "vitest"; import { moveHeadersToQuery } from "./moveHeadersToQuery"; const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { host: "foo.us-east-1.amazonaws.com", }, hostname: "foo.us-east-1.amazonaws.com", }); describe("moveHeadersToQuery", () => { it('should hoist "x-amz-" headers to the querystring', () => { const req = moveHeadersToQuery( new HttpRequest({ ...minimalRequest, headers: { Host: "www.example.com", "X-Amz-Website-Redirect-Location": "/index.html", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", "X-Amz-Storage-Class": "STANDARD_IA", }, }) ); expect(req.query).toEqual({ "X-Amz-Website-Redirect-Location": "/index.html", "X-Amz-Storage-Class": "STANDARD_IA", }); expect(req.headers).toEqual({ Host: "www.example.com", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", }); }); it("should not overwrite existing query values with different keys", () => { const req = moveHeadersToQuery( new HttpRequest({ ...minimalRequest, headers: { Host: "www.example.com", "X-Amz-Website-Redirect-Location": "/index.html", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", "X-Amz-Storage-Class": "STANDARD_IA", }, query: { Foo: "buzz", fizz: "bar", "X-Amz-Storage-Class": "REDUCED_REDUNDANCY", }, }) ); expect(req.query).toEqual({ Foo: "buzz", fizz: "bar", "X-Amz-Website-Redirect-Location": "/index.html", "X-Amz-Storage-Class": "STANDARD_IA", }); }); it("should skip hoisting headers to the querystring supplied in unhoistedHeaders", () => { const req = moveHeadersToQuery( new HttpRequest({ ...minimalRequest, headers: { Host: "www.example.com", "X-Amz-Website-Redirect-Location": "/index.html", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", "X-Amz-Storage-Class": "STANDARD_IA", }, }), { unhoistableHeaders: new Set(["x-amz-website-redirect-location"]), } ); expect(req.query).toEqual({ "X-Amz-Storage-Class": "STANDARD_IA", }); expect(req.headers).toEqual({ Host: "www.example.com", "X-Amz-Website-Redirect-Location": "/index.html", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", }); }); it("should obey hoistableHeaders configuration over unhoistableHeaders", () => { const req = moveHeadersToQuery( new HttpRequest({ ...minimalRequest, headers: { Host: "www.example.com", "X-Amz-Website-Redirect-Location": "/index.html", Foo: "bar", fizz: "buzz", SNAP: "crackle, pop", "X-Amz-Storage-Class": "STANDARD_IA", }, }), { hoistableHeaders: new Set(["x-amz-website-redirect-location", "snap"]), unhoistableHeaders: new Set(["x-amz-website-redirect-location"]), } ); expect(req.query).toEqual({ SNAP: "crackle, pop", "X-Amz-Storage-Class": "STANDARD_IA", "X-Amz-Website-Redirect-Location": "/index.html", }); expect(req.headers).toEqual({ Host: "www.example.com", Foo: "bar", fizz: "buzz", }); }); }); ================================================ FILE: packages/signature-v4/src/moveHeadersToQuery.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { HttpRequest as IHttpRequest, QueryParameterBag } from "@smithy/types"; /** * @internal */ export const moveHeadersToQuery = ( request: IHttpRequest, options: { unhoistableHeaders?: Set; hoistableHeaders?: Set } = {} ): IHttpRequest & { query: QueryParameterBag } => { const { headers, query = {} as QueryParameterBag } = HttpRequest.clone(request); for (const name of Object.keys(headers)) { const lname = name.toLowerCase(); if ( (lname.slice(0, 6) === "x-amz-" && !options.unhoistableHeaders?.has(lname)) || options.hoistableHeaders?.has(lname) ) { query[name] = headers[name]; delete headers[name]; } } return { ...request, headers, query, }; }; ================================================ FILE: packages/signature-v4/src/prepareRequest.spec.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import { describe, expect, test as it } from "vitest"; import { AMZ_DATE_HEADER, AUTH_HEADER, DATE_HEADER } from "./constants"; import { prepareRequest } from "./prepareRequest"; const minimalRequest = new HttpRequest({ method: "POST", protocol: "https:", path: "/", headers: { host: "foo.us-bar-1.amazonaws.com", }, hostname: "foo.us-bar-1.amazonaws.com", }); describe("prepareRequest", () => { it("should clone requests", () => { const prepared = prepareRequest(minimalRequest); expect(prepared).toEqual(prepareRequest(minimalRequest)); expect(prepared).not.toBe(prepareRequest(minimalRequest)); }); it("should ignore previously set authorization, date, and x-amz-date headers", async () => { const { headers } = prepareRequest( new HttpRequest({ ...minimalRequest, headers: { [AUTH_HEADER]: "foo", [AMZ_DATE_HEADER]: "bar", [DATE_HEADER]: "baz", }, }) ); expect(headers[AUTH_HEADER]).toBeUndefined(); expect(headers[AMZ_DATE_HEADER]).toBeUndefined(); expect(headers[DATE_HEADER]).toBeUndefined(); }); }); ================================================ FILE: packages/signature-v4/src/prepareRequest.ts ================================================ import { HttpRequest } from "@smithy/core/protocols"; import type { HttpRequest as IHttpRequest } from "@smithy/types"; import { GENERATED_HEADERS } from "./constants"; /** * @internal */ export const prepareRequest = (request: IHttpRequest): IHttpRequest => { // Create a clone of the request object that does not clone the body request = HttpRequest.clone(request); for (const headerName of Object.keys(request.headers)) { if (GENERATED_HEADERS.indexOf(headerName.toLowerCase()) > -1) { delete request.headers[headerName]; } } return request; }; ================================================ FILE: packages/signature-v4/src/signature-v4a-container.ts ================================================ import type { RequestSigner } from "@smithy/types"; /** * @public */ export type OptionalSigV4aSigner = { /** * This constructor is not typed so as not to require a type import * from the signature-v4a package. * * The true type is SignatureV4a from @smithy/signature-v4a. */ new (options: any): RequestSigner; }; /** * \@smithy/signature-v4a will install the constructor in this * container if it's installed. * This avoids a runtime-require being interpreted statically by bundlers. * * @public */ export const signatureV4aContainer: { SignatureV4a: null | OptionalSigV4aSigner; } = { SignatureV4a: null, }; ================================================ FILE: packages/signature-v4/src/suite.fixture.ts ================================================ import type { HttpRequest } from "@smithy/types"; export interface TestCase { name: string; request: HttpRequest; authorization: string; } export const region = "us-east-1"; export const service = "service"; export const credentials = { accessKeyId: "AKIDEXAMPLE", secretAccessKey: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", }; export const signingDate = new Date("2015-08-30T12:36:00Z"); export const requests: Array = [ { name: "get-header-key-duplicate", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "value2,value2,value1", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138ea", }, { name: "get-header-value-multiline", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "value1,value2,value3", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=ba17b383a53190154eb5fa66a1b836cc297cc0a3d70a5d00705980573d8ff790", }, { name: "get-header-value-order", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "value4,value1,value3,value2", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01", }, { name: "get-header-value-trim", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "value1", "my-header2": '"a b c"', "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736", }, { name: "get-unreserved", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24f", }, { name: "get-utf8", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/ሴ", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85", }, { name: "get-vanilla", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31", }, { name: "get-vanilla-empty-query-key", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: { Param1: "value1", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aeb", }, { name: "get-vanilla-query", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31", }, { name: "get-vanilla-query-order-key-case", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: { Param2: "value2", Param1: "value1", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500", }, { name: "get-vanilla-query-unreserved", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: { "-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz": "-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197", }, { name: "get-vanilla-utf8-query", request: { protocol: "https:", method: "GET", hostname: "example.amazonaws.com", query: { ሴ: "bar", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04", }, { name: "post-header-key-case", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b", }, { name: "post-header-key-sort", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "value1", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852c", }, { name: "post-header-value-case", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "my-header1": "VALUE1", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7d", }, { name: "post-sts-header-after", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b", }, { name: "post-sts-header-before", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", "x-amz-security-token": "AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05ead", }, { name: "post-vanilla", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b", }, { name: "post-vanilla-empty-query-value", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: { Param1: "value1", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11", }, { name: "post-vanilla-query", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: { Param1: "value1", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11", }, { name: "post-vanilla-query-nonunreserved", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: { "@#$%^": "", "+": '/,?><`";:\\|][{}', }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=66c82657c86e26fb25238d0e69f011edc4c6df5ae71119d7cb98ed9b87393c1e", }, { name: "post-vanilla-query-space", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: { p: "", }, headers: { host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=e71688addb58a26418614085fb730ba3faa623b461c17f48f2fbdb9361b94a9b", }, { name: "post-x-www-form-urlencoded", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { "content-type": "application/x-www-form-urlencoded", host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, body: "Param1=value1", path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ff11897932ad3f4e8b18135d722051e5ac45fc38421b1da7b9d196a0fe09473a", }, { name: "post-x-www-form-urlencoded-parameters", request: { protocol: "https:", method: "POST", hostname: "example.amazonaws.com", query: {}, headers: { "content-type": "application/x-www-form-urlencoded; charset=utf8", host: "example.amazonaws.com", "x-amz-date": "20150830T123600Z", }, body: "Param1=value1", path: "/", }, authorization: "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=1a72ec8f64bd914b0e42e42607c7fbce7fb2c7465f63e3092b3b0d39fa77a6fe", }, ]; ================================================ FILE: packages/signature-v4/src/suite.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import { HttpRequest } from "@smithy/core/protocols"; import { describe, expect, test as it } from "vitest"; import { SignatureV4 } from "./SignatureV4"; import { credentials, region, requests, service, signingDate } from "./suite.fixture"; /** * Executes the official AWS Signature Version 4 test suite. * * @link http://docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html */ describe("AWS Signature Version 4 Test Suite", () => { const signer = new SignatureV4({ credentials, region, service, sha256: Sha256, applyChecksum: false, }); for (const { name, request, authorization } of requests) { it(`should calculate the correct signature for ${name}`, async () => { const signed = await signer.sign(new HttpRequest(request), { signingDate, }); expect(signed.headers["authorization"]).toEqual(authorization); }); } }); ================================================ FILE: packages/signature-v4/src/utilDate.spec.ts ================================================ import { describe, expect, test as it } from "vitest"; import { iso8601, toDate } from "./utilDate"; const toIsoString = "2017-05-22T19:33:14.175Z"; const iso8601String = "2017-05-22T19:33:14Z"; const rfc822String = "Mon, 22 May 2017 19:33:14 GMT"; const epochTs = 1495481594; describe("iso8601", () => { it("should convert date objects to ISO-8601 strings", () => { expect(iso8601(new Date(toIsoString))).toBe(iso8601String); }); it("should convert parseable date strings to ISO-8601 strings", () => { const date = new Date(toIsoString); expect(iso8601(date.toUTCString())).toBe(iso8601String); expect(iso8601(date.toISOString())).toBe(iso8601String); }); it("should assume numbers are epoch timestamps and convert them to ISO-8601 strings accordingly", () => { expect(iso8601(epochTs)).toBe(iso8601String); }); }); describe("toDate", () => { it("should convert epoch timestamps to date objects", () => { const date = toDate(epochTs); expect(date).toBeInstanceOf(Date); expect(date.valueOf()).toBe(epochTs * 1000); }); it("should convert ISO-8601 strings to date objects", () => { const date = toDate(iso8601String); expect(date).toBeInstanceOf(Date); expect(date.valueOf()).toBe(epochTs * 1000); }); it("should convert RFC 822 strings to date objects", () => { const date = toDate(rfc822String); expect(date).toBeInstanceOf(Date); expect(date.valueOf()).toBe(epochTs * 1000); }); }); ================================================ FILE: packages/signature-v4/src/utilDate.ts ================================================ export const iso8601 = (time: number | string | Date): string => toDate(time) .toISOString() .replace(/\.\d{3}Z$/, "Z"); export const toDate = (time: number | string | Date): Date => { if (typeof time === "number") { return new Date(time * 1000); } if (typeof time === "string") { if (Number(time)) { return new Date(Number(time) * 1000); } return new Date(time); } return time; }; ================================================ FILE: packages/signature-v4/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "noUnusedLocals": true, "outDir": "dist-es", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/signature-v4a/.gitignore ================================================ /node_modules/ /build/ /dist/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/signature-v4a/CHANGELOG.md ================================================ # @smithy/signature-v4a ## 3.2.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 - @smithy/signature-v4@5.4.3 ## 3.2.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 - @smithy/signature-v4@5.4.2 ## 3.2.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 - @smithy/signature-v4@5.4.1 ## 3.2.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 - @smithy/signature-v4@5.4.0 ## 3.1.14 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/signature-v4@5.3.14 ## 3.1.13 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/signature-v4@5.3.13 ## 3.1.12 ### Patch Changes - Updated dependencies [5340b11] - @smithy/types@4.13.1 - @smithy/signature-v4@5.3.12 ## 3.1.11 ### Patch Changes - a4d95e6: Set downlevel types to be used in typescript@'<4.5' - Updated dependencies [a4d95e6] - @smithy/util-hex-encoding@4.2.2 - @smithy/signature-v4@5.3.11 - @smithy/util-utf8@4.2.2 ## 3.1.10 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/signature-v4@5.3.10 ## 3.1.9 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/signature-v4@5.3.9 - @smithy/types@4.12.1 - @smithy/util-hex-encoding@4.2.1 - @smithy/util-utf8@4.2.1 ## 3.1.8 ### Patch Changes - Updated dependencies [745867a] - @smithy/types@4.12.0 - @smithy/signature-v4@5.3.8 ## 3.1.7 ### Patch Changes - Updated dependencies [9ccb841] - @smithy/types@4.11.0 - @smithy/signature-v4@5.3.7 ## 3.1.6 ### Patch Changes - Updated dependencies [5a56762] - @smithy/types@4.10.0 - @smithy/signature-v4@5.3.6 ## 3.1.5 ### Patch Changes - Updated dependencies [3926fd7] - @smithy/types@4.9.0 - @smithy/signature-v4@5.3.5 ## 3.1.4 ### Patch Changes - Updated dependencies [6da0ab3] - @smithy/types@4.8.1 - @smithy/signature-v4@5.3.4 ## 3.1.3 ### Patch Changes - Updated dependencies [8a2a912] - @smithy/types@4.8.0 - @smithy/signature-v4@5.3.3 ## 3.1.2 ### Patch Changes - Updated dependencies [052d261] - @smithy/types@4.7.1 - @smithy/signature-v4@5.3.2 ## 3.1.1 ### Patch Changes - Updated dependencies [761d89c] - Updated dependencies [7f8af58] - @smithy/types@4.7.0 - @smithy/signature-v4@5.3.1 ## 3.1.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ### Patch Changes - Updated dependencies [45ee67f] - @smithy/signature-v4@5.3.0 - @smithy/types@4.6.0 - @smithy/util-hex-encoding@4.2.0 - @smithy/util-utf8@4.2.0 ## 3.0.7 ### Patch Changes - Updated dependencies [bb7c1c1] - @smithy/types@4.5.0 - @smithy/signature-v4@5.2.1 ## 3.0.6 ### Patch Changes - f884df7: enforce consistent-type-imports - Updated dependencies [64cda93] - Updated dependencies [f884df7] - @smithy/util-hex-encoding@4.1.0 - @smithy/signature-v4@5.2.0 - @smithy/util-utf8@4.1.0 - @smithy/types@4.4.0 ## 3.0.5 ### Patch Changes - Updated dependencies [64e033f] - @smithy/types@4.3.2 - @smithy/signature-v4@5.1.3 ## 3.0.4 ### Patch Changes - bb7975e: set sideEffects bundler metadata ## 3.0.3 ### Patch Changes - Updated dependencies [358c1ff] - @smithy/types@4.3.1 - @smithy/signature-v4@5.1.2 ## 3.0.2 ### Patch Changes - Updated dependencies [0547fab] - @smithy/types@4.3.0 - @smithy/signature-v4@5.1.1 ## 3.0.1 ### Patch Changes - Updated dependencies [e2a8b41] - @smithy/signature-v4@5.1.0 ================================================ FILE: packages/signature-v4a/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/signature-v4a/README.md ================================================ # @smithy/signature-v4a [![NPM version](https://img.shields.io/npm/v/@smithy/signature-v4a/latest.svg)](https://www.npmjs.com/package/@smithy/signature-v4a) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/signature-v4a.svg)](https://www.npmjs.com/package/@smithy/signature-v4a) This package is an internal SigV4a addon for AWS Signature Version 4 (SigV4). ================================================ FILE: packages/signature-v4a/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/signature-v4a/package.json ================================================ { "name": "@smithy/signature-v4a", "version": "3.2.3", "description": "Asymmetric addon for the @smithy/signature-v4 package", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:elliptic": "node ./scripts/esbuild.mjs", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline signature-v4a", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": true, "dependencies": { "@smithy/core": "workspace:^", "@smithy/signature-v4": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@aws-crypto/sha256-js": "5.2.0", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "elliptic": "6.5.5", "premove": "4.0.0" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/awslabs/smithy-typescript/tree/main/packages/signature-v4a", "repository": { "type": "git", "url": "https://github.com/awslabs/smithy-typescript.git", "directory": "packages/signature-v4a" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/signature-v4a/scripts/Ec.js ================================================ export { ec as Ec } from "elliptic"; ================================================ FILE: packages/signature-v4a/scripts/esbuild.mjs ================================================ import * as esbuild from "esbuild"; import * as path from "path"; import * as fs from "fs"; import { fileURLToPath } from "url"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const bundledSource = path.join(__dirname, "..", "src", "elliptic", "Ec.ts"); const buildOptions = { platform: "browser", target: ["node16"], bundle: true, format: "esm", mainFields: ["module", "main"], allowOverwrite: true, entryPoints: [path.join(__dirname, "Ec.js")], supported: {}, outfile: bundledSource, keepNames: false, external: [], }; await esbuild.build(buildOptions); const typescript = fs.readFileSync(bundledSource, "utf-8"); fs.writeFileSync( bundledSource, `// @ts-nocheck /* eslint-disable */ ` + typescript, "utf-8" ); ================================================ FILE: packages/signature-v4a/src/SignatureV4a.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import type { AwsCredentialIdentity, HttpRequest } from "@smithy/types"; import { describe, expect, it } from "vitest"; import { SignatureV4a } from "./SignatureV4a"; describe("SignatureV4a", () => { it("SignatureV4a credential check", async () => { const creds: AwsCredentialIdentity = { accessKeyId: "test-access-key", secretAccessKey: "test-secret-access-key", sessionToken: "test-secret", }; const sigV4aSigner = new SignatureV4a({ credentials: creds, sha256: Sha256, region: "*", service: "test-service", applyChecksum: false, }); const request: HttpRequest = { headers: {}, hostname: "test", method: "GET", path: "/v1.1/test", protocol: "HTTPS", }; const signingDate = new Date(); signingDate.setTime(1711493155780); const result = await sigV4aSigner.sign(request, { signingDate: signingDate, }); expect(result.headers["x-amz-date"]).toEqual("20240326T224555Z"); expect(result.headers["x-amz-security-token"]).toEqual(creds.sessionToken); expect(result.headers["x-amz-region-set"]).toEqual("*"); expect(result.headers["authorization"]).toEqual( "AWS4-ECDSA-P256-SHA256 Credential=test-access-key/20240326/test-service/aws4_request, SignedHeaders=x-amz-date;x-amz-region-set;x-amz-security-token, Signature=30440220145f66a150392193d4c50ec322ac2ab930989bbd56566a43132962f8f5bed2280220346d08e335f58e7d515c45618841869650d11f0dff107733f74228a891828919" ); }); }); ================================================ FILE: packages/signature-v4a/src/SignatureV4a.ts ================================================ import { toHex, toUint8Array } from "@smithy/core/serde"; import { ALGORITHM_IDENTIFIER_V4A, AMZ_DATE_HEADER, AUTH_HEADER, SHA256_HEADER, SignatureV4Base, TOKEN_HEADER, getCanonicalHeaders, getPayloadHash, hasHeader, prepareRequest, type SignatureV4CryptoInit, type SignatureV4Init, } from "@smithy/signature-v4"; import type { HttpRequest, RequestSigner, RequestSigningArguments } from "@smithy/types"; import { REGION_HEADER } from "./constants"; import { createSigV4aScope, getSigV4aSigningKey } from "./credentialDerivation"; // @ts-ignore import { Ec } from "./elliptic/Ec"; /** * @public */ export class SignatureV4a extends SignatureV4Base implements RequestSigner { /** * Creates a SigV4a signer * @param applyChecksum Apply checksum header * @param credentials Credentials to use when signing * @param region Region to sign for, Wildcard (*) also accepted * @param service Service to sign for * @param uriEscapePath Defaults to true. Used for non s3 services. */ constructor({ applyChecksum, credentials, region, service, sha256, uriEscapePath = true, }: SignatureV4Init & SignatureV4CryptoInit) { super({ applyChecksum, credentials, region, service, sha256, uriEscapePath, }); } /** * Sign a request using SigV4a * @param toSign HttpRequest to sign * @param options Additional options */ public async sign(toSign: HttpRequest, options: any): Promise { return this.signRequest(toSign, options); } /** * Sign a SigV4a request and return its modified HttpRequest. See SigV4a wiki for implementation details * @param requestToSign HttpRequest to sign * @param signingDate Signing date (uses UTC now if not specified) * @param signableHeaders Headers to include in the signing process * @param unsignableHeaders Headers to not include in the signing process * @param signingRegion Region to sign the request for. '*' can be used as a wildcard. Falls back to constructor value * @param signingService Service to sign for * @private */ private async signRequest( requestToSign: HttpRequest, { signingDate = new Date(), signableHeaders, unsignableHeaders, signingRegion, signingService, }: RequestSigningArguments = {} ): Promise { const credentials = await this.credentialProvider(); this.validateResolvedCredentials(credentials); const region = signingRegion ?? (await this.regionProvider()); const request = prepareRequest(requestToSign); const { longDate, shortDate } = this.formatDate(signingDate); const scope = createSigV4aScope(shortDate, signingService ?? this.service); const pKey = await getSigV4aSigningKey(this.sha256, credentials.accessKeyId, credentials.secretAccessKey); request.headers[AMZ_DATE_HEADER] = longDate; if (credentials.sessionToken) { request.headers[TOKEN_HEADER] = credentials.sessionToken; } // Region can also be '*' for SigV4a request.headers[REGION_HEADER] = region; const payloadHash = await getPayloadHash(request, this.sha256); if (!hasHeader(SHA256_HEADER, request.headers) && this.applyChecksum) { request.headers[SHA256_HEADER] = payloadHash; } const canonicalHeaders = getCanonicalHeaders(request, unsignableHeaders, signableHeaders); const canonicalRequest = this.createCanonicalRequest(request, canonicalHeaders, payloadHash); const stringToSign = await this.createStringToSign(longDate, scope, canonicalRequest, ALGORITHM_IDENTIFIER_V4A); const signature = await this.getSignature(pKey, stringToSign); request.headers[AUTH_HEADER] = `${ALGORITHM_IDENTIFIER_V4A} ` + `Credential=${credentials.accessKeyId}/${scope}, ` + `SignedHeaders=${this.getCanonicalHeaderList(canonicalHeaders)}, ` + `Signature=${signature}`; return request; } /** * * @param privateKey Calculated private key * @param stringToSign String to sign using private key * @private */ private async getSignature(privateKey: Uint8Array, stringToSign: string): Promise { // Create ECDSA and get key pair const ecdsa = new Ec("p256"); const key = ecdsa.keyFromPrivate(privateKey); // Format request using SHA256 const hash = new this.sha256(); hash.update(toUint8Array(stringToSign)); const hashResult = await hash.digest(); // Finally sign using ECDSA keypair. const signature = key.sign(hashResult); // Convert signature to DER format (ASN.1's normal singing format) return toHex(new Uint8Array(signature.toDER())); } } ================================================ FILE: packages/signature-v4a/src/constants.ts ================================================ import { REGION_SET_PARAM } from "@smithy/signature-v4"; /** * @internal */ export const REGION_HEADER = REGION_SET_PARAM.toLowerCase(); // AWS SigV4a private signing key constants /** * @internal */ export const ONE_AS_4_BYTES = [0x00, 0x00, 0x00, 0x01]; /** * @internal */ export const TWOFIFTYSIX_AS_4_BYTES = [0x00, 0x00, 0x01, 0x00]; /** * @internal */ export const N_MINUS_TWO = [ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbc, 0xe6, 0xfa, 0xad, 0xa7, 0x17, 0x9e, 0x84, 0xf3, 0xb9, 0xca, 0xc2, 0xfc, 0x63, 0x25, 0x4f, ]; ================================================ FILE: packages/signature-v4a/src/credentialDerivation.spec.ts ================================================ import { Sha256 } from "@aws-crypto/sha256-js"; import { describe, expect, it, vi } from "vitest"; import { N_MINUS_TWO } from "./constants"; import { addOneToArray, buildFixedInputBuffer, getSigV4aSigningKey, isBiggerThanNMinus2 } from "./credentialDerivation"; describe("signatureV4a signing key", () => { it("should get signing key", async () => { const secret = "test-secret"; const accessKey = "test-access-key"; const mockSha256Constructor = vi.fn().mockImplementation((args) => { return new Sha256(args); }); const result = await getSigV4aSigningKey(mockSha256Constructor, secret, accessKey); const expectedResult = new Uint8Array([ 107, 171, 179, 226, 62, 241, 77, 131, 240, 163, 149, 40, 120, 236, 169, 100, 28, 130, 40, 97, 214, 239, 24, 15, 158, 224, 37, 30, 241, 83, 119, 174, ]); expect(result).toEqual(expectedResult); }); it("buildFixedInputBuffer", () => { const startBuffer = "start"; const accessKey = "key"; const result = buildFixedInputBuffer(startBuffer, accessKey, 1); const expectedString = "start" + "\u0000\u0000\u0000\u0001" + "AWS4-ECDSA-P256-SHA256" + "\u0000" + "key" + "\u0001" + "\u0000\u0000\u0001\u0000"; expect(result).toEqual(expectedString); }); it("addOneToArray, no carry", () => { const originalValue = new Uint8Array(32); originalValue[31] = 0xfe; const result = addOneToArray(originalValue); expect(result.length).toEqual(32); expect(result[31]).toEqual(0xff); expect(result[30]).toEqual(0x00); }); it("addOneToArray, carry", () => { const originalValue = new Uint8Array(32); originalValue[31] = 0xff; originalValue[30] = 0xff; originalValue[29] = 0xfe; const result = addOneToArray(originalValue); expect(result.length).toEqual(32); expect(result[31]).toEqual(0x00); expect(result[30]).toEqual(0x00); expect(result[29]).toEqual(0xff); }); it("addOneToArray, carry to last digit", () => { const originalValue = new Uint8Array(32); for (let i = 0; i < originalValue.length; i++) { originalValue[i] = 0xff; } const result = addOneToArray(originalValue); expect(result.length).toEqual(33); expect(result[0]).toEqual(0x01); for (let i = 1; i < originalValue.length; i++) { expect(result[i]).toEqual(0x00); } }); it("Number smaller than NMinus2", () => { let comparisonNumber = new Uint8Array(32); let result = isBiggerThanNMinus2(comparisonNumber); expect(result).toBeFalsy(); comparisonNumber = new Uint8Array(N_MINUS_TWO); comparisonNumber[31] = comparisonNumber[31] - 1; result = isBiggerThanNMinus2(comparisonNumber); expect(result).toBeFalsy(); }); it("Number bigger than NMinus2", () => { let comparisonNumber = new Uint8Array(32); comparisonNumber[0] = 0xff; comparisonNumber[1] = 0xff; comparisonNumber[2] = 0xff; comparisonNumber[3] = 0xff; comparisonNumber[4] = 0x01; let result = isBiggerThanNMinus2(comparisonNumber); expect(result).toBeTruthy(); comparisonNumber = new Uint8Array(N_MINUS_TWO); comparisonNumber[31] = comparisonNumber[31] + 1; result = isBiggerThanNMinus2(comparisonNumber); expect(result).toBeTruthy(); }); it("Number equals NMinus2", () => { const comparisonNumber = new Uint8Array(N_MINUS_TWO); const result = isBiggerThanNMinus2(comparisonNumber); expect(result).toBeFalsy(); }); }); ================================================ FILE: packages/signature-v4a/src/credentialDerivation.ts ================================================ import { toUint8Array } from "@smithy/core/serde"; import { ALGORITHM_IDENTIFIER_V4A, KEY_TYPE_IDENTIFIER } from "@smithy/signature-v4"; import type { ChecksumConstructor, HashConstructor } from "@smithy/types"; import { N_MINUS_TWO, ONE_AS_4_BYTES, TWOFIFTYSIX_AS_4_BYTES } from "./constants"; const signingKeyCache: Record = {}; const cacheQueue: Array = []; /** * Create a string describing the scope of credentials used to sign a request. * @param shortDate * @param shortDate The current calendar date in the form YYYYMMDD. * @param service The service to which the signed request is being sent. */ export const createSigV4aScope = (shortDate: string, service: string): string => `${shortDate}/${service}/${KEY_TYPE_IDENTIFIER}`; /** * @internal */ export const clearCredentialCache = (): void => { cacheQueue.length = 0; Object.keys(signingKeyCache).forEach((cacheKey) => { delete signingKeyCache[cacheKey]; }); }; /** * @internal */ export const getSigV4aSigningKey = async ( sha256: ChecksumConstructor | HashConstructor, accessKey: string, secretKey: string ): Promise => { let outputBufferWriter = ""; /* * The maximum number of iterations we will attempt to derive a valid ecc key for. The probability that this counter * value ever gets reached is vanishingly low -- with reasonable uniformity/independence assumptions, it's * approximately * * 2 ^ (-32 * 254) */ const maxTrials = 254; const aws4ALength = 5; const inputKeyLength = aws4ALength + secretKey.length; // Allocate array const inputKeyBuf = inputKeyLength <= 64 ? new Uint8Array(64) : new Uint8Array(inputKeyLength); // Input AWS4A and secret into array const aws4aArray = "AWS4A".split(""); for (let index = 0; index < aws4aArray.length; index++) { inputKeyBuf[index] = aws4aArray[index].charCodeAt(0); } const secretKeyArray = secretKey.split(""); for (let index = 0; index < secretKeyArray.length; index++) { inputKeyBuf[aws4aArray.length + index] = secretKeyArray[index].charCodeAt(0); } let trial = 1; while (trial < maxTrials) { outputBufferWriter = buildFixedInputBuffer(outputBufferWriter, accessKey, trial); const secretKey = inputKeyBuf.subarray(0, inputKeyLength); const hash = new sha256(secretKey); const hashVal = toUint8Array(outputBufferWriter); hash.update(hashVal); const hashedOutput = await hash.digest(); if (isBiggerThanNMinus2(hashedOutput)) { trial++; continue; } return addOneToArray(hashedOutput); } throw new Error("Cannot derive signing key: number of maximum trials exceeded."); }; /** * Build the signing key request. Implementation copied from .NET implementation * @param bufferInput Input string. Will append values and return as new string * @param accessKey Access key used for signing * @param counter Trial number */ export const buildFixedInputBuffer = (bufferInput: string, accessKey: string, counter: number): string => { /* Label = “AWS4-ECDSA-P256-SHA256” ExternalCounter = 0x01 This counter would be incremented by 1 if the step below fails. Context = "AccessKeyID" || ExternalCounter Length = “256”, 0x0100 (32-bit integer) FixedInputString= 1 || Label || 0x00 || Context || Length */ let outputBuffer = bufferInput; outputBuffer += ONE_AS_4_BYTES.map((value) => String.fromCharCode(value)).join(""); outputBuffer += ALGORITHM_IDENTIFIER_V4A; outputBuffer += String.fromCharCode(0x00); outputBuffer += accessKey; outputBuffer += String.fromCharCode(counter); outputBuffer += TWOFIFTYSIX_AS_4_BYTES.map((value) => String.fromCharCode(value)).join(""); return outputBuffer; }; /** * Check if calculated value is larger than NMinus2 constant * @param value Array in Big-Endian format */ export const isBiggerThanNMinus2 = (value: Uint8Array): boolean => { // N_MINUS_TWO constant is 32 in length, hashed input is also 32 in length // It is in Big-Endian format, significant digit first. for (let index = 0; index < value.length; index++) { if (value[index] > N_MINUS_TWO[index]) { // Value is greater than const return true; } else if (value[index] < N_MINUS_TWO[index]) { // Const is greater return false; } } // Numbers are then same return false; }; /** * Adds one to a big-endian number * @param value Big-endian formatted number */ export const addOneToArray = (value: Uint8Array): Uint8Array => { // Value is in Big-Endian format, significant digit first. This is why we go the opposite way when calculating const output = new Uint8Array(32); // We are adding one, we can simply add this to carry let carry = 1; for (let index = value.length - 1; index >= 0; index--) { const newValueAtIndex = (value[index] + carry) % 256; // If the new value is less than the old, we must have eclipsed 255. We need to carry a digit if (newValueAtIndex < value[index]) { carry = 1; } else { carry = 0; } output[index] = newValueAtIndex; } if (carry !== 0) { return new Uint8Array([carry, ...output]); } return output; }; ================================================ FILE: packages/signature-v4a/src/elliptic/Ec.ts ================================================ // @ts-nocheck /* eslint-disable */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if ((from && typeof from === "object") || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable, }); } return to; }; var __toESM = (mod, isNodeMode, target) => ( (target = mod != null ? __create(__getProtoOf(mod)) : {}), __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod ) ); // ../../node_modules/elliptic/package.json var require_package = __commonJS({ "../../node_modules/elliptic/package.json"(exports, module) { module.exports = { name: "elliptic", version: "6.5.5", description: "EC cryptography", main: "lib/elliptic.js", files: ["lib"], scripts: { lint: "eslint lib test", "lint:fix": "npm run lint -- --fix", unit: "istanbul test _mocha --reporter=spec test/index.js", test: "npm run lint && npm run unit", version: "grunt dist && git add dist/", }, repository: { type: "git", url: "git@github.com:indutny/elliptic", }, keywords: ["EC", "Elliptic", "curve", "Cryptography"], author: "Fedor Indutny ", license: "MIT", bugs: { url: "https://github.com/indutny/elliptic/issues", }, homepage: "https://github.com/indutny/elliptic", devDependencies: { brfs: "^2.0.2", coveralls: "^3.1.0", eslint: "^7.6.0", grunt: "^1.2.1", "grunt-browserify": "^5.3.0", "grunt-cli": "^1.3.2", "grunt-contrib-connect": "^3.0.0", "grunt-contrib-copy": "^1.0.0", "grunt-contrib-uglify": "^5.0.0", "grunt-mocha-istanbul": "^5.0.2", "grunt-saucelabs": "^9.0.1", istanbul: "^0.4.5", mocha: "^8.0.1", }, dependencies: { "bn.js": "^4.11.9", brorand: "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", inherits: "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1", }, }; }, }); // (disabled):../../node_modules/buffer/index.js var require_buffer = __commonJS({ "(disabled):../../node_modules/buffer/index.js"() {}, }); // ../../node_modules/bn.js/lib/bn.js var require_bn = __commonJS({ "../../node_modules/bn.js/lib/bn.js"(exports, module) { (function (module2, exports2) { "use strict"; function assert(val, msg) { if (!val) throw new Error(msg || "Assertion failed"); } function inherits(ctor, superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } function BN(number, base, endian) { if (BN.isBN(number)) { return number; } this.negative = 0; this.words = null; this.length = 0; this.red = null; if (number !== null) { if (base === "le" || base === "be") { endian = base; base = 10; } this._init(number || 0, base || 10, endian || "be"); } } if (typeof module2 === "object") { module2.exports = BN; } else { exports2.BN = BN; } BN.BN = BN; BN.wordSize = 26; var Buffer2; try { if (typeof window !== "undefined" && typeof window.Buffer !== "undefined") { Buffer2 = window.Buffer; } else { Buffer2 = require_buffer().Buffer; } } catch (e) {} BN.isBN = function isBN(num) { if (num instanceof BN) { return true; } return ( num !== null && typeof num === "object" && num.constructor.wordSize === BN.wordSize && Array.isArray(num.words) ); }; BN.max = function max(left, right) { if (left.cmp(right) > 0) return left; return right; }; BN.min = function min(left, right) { if (left.cmp(right) < 0) return left; return right; }; BN.prototype._init = function init(number, base, endian) { if (typeof number === "number") { return this._initNumber(number, base, endian); } if (typeof number === "object") { return this._initArray(number, base, endian); } if (base === "hex") { base = 16; } assert(base === (base | 0) && base >= 2 && base <= 36); number = number.toString().replace(/\s+/g, ""); var start = 0; if (number[0] === "-") { start++; this.negative = 1; } if (start < number.length) { if (base === 16) { this._parseHex(number, start, endian); } else { this._parseBase(number, base, start); if (endian === "le") { this._initArray(this.toArray(), base, endian); } } } }; BN.prototype._initNumber = function _initNumber(number, base, endian) { if (number < 0) { this.negative = 1; number = -number; } if (number < 67108864) { this.words = [number & 67108863]; this.length = 1; } else if (number < 4503599627370496) { this.words = [number & 67108863, (number / 67108864) & 67108863]; this.length = 2; } else { assert(number < 9007199254740992); this.words = [number & 67108863, (number / 67108864) & 67108863, 1]; this.length = 3; } if (endian !== "le") return; this._initArray(this.toArray(), base, endian); }; BN.prototype._initArray = function _initArray(number, base, endian) { assert(typeof number.length === "number"); if (number.length <= 0) { this.words = [0]; this.length = 1; return this; } this.length = Math.ceil(number.length / 3); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var j, w; var off = 0; if (endian === "be") { for (i = number.length - 1, j = 0; i >= 0; i -= 3) { w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16); this.words[j] |= (w << off) & 67108863; this.words[j + 1] = (w >>> (26 - off)) & 67108863; off += 24; if (off >= 26) { off -= 26; j++; } } } else if (endian === "le") { for (i = 0, j = 0; i < number.length; i += 3) { w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16); this.words[j] |= (w << off) & 67108863; this.words[j + 1] = (w >>> (26 - off)) & 67108863; off += 24; if (off >= 26) { off -= 26; j++; } } } return this.strip(); }; function parseHex4Bits(string, index) { var c = string.charCodeAt(index); if (c >= 65 && c <= 70) { return c - 55; } else if (c >= 97 && c <= 102) { return c - 87; } else { return (c - 48) & 15; } } function parseHexByte(string, lowerBound, index) { var r = parseHex4Bits(string, index); if (index - 1 >= lowerBound) { r |= parseHex4Bits(string, index - 1) << 4; } return r; } BN.prototype._parseHex = function _parseHex(number, start, endian) { this.length = Math.ceil((number.length - start) / 6); this.words = new Array(this.length); for (var i = 0; i < this.length; i++) { this.words[i] = 0; } var off = 0; var j = 0; var w; if (endian === "be") { for (i = number.length - 1; i >= start; i -= 2) { w = parseHexByte(number, start, i) << off; this.words[j] |= w & 67108863; if (off >= 18) { off -= 18; j += 1; this.words[j] |= w >>> 26; } else { off += 8; } } } else { var parseLength = number.length - start; for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) { w = parseHexByte(number, start, i) << off; this.words[j] |= w & 67108863; if (off >= 18) { off -= 18; j += 1; this.words[j] |= w >>> 26; } else { off += 8; } } } this.strip(); }; function parseBase(str, start, end, mul) { var r = 0; var len = Math.min(str.length, end); for (var i = start; i < len; i++) { var c = str.charCodeAt(i) - 48; r *= mul; if (c >= 49) { r += c - 49 + 10; } else if (c >= 17) { r += c - 17 + 10; } else { r += c; } } return r; } BN.prototype._parseBase = function _parseBase(number, base, start) { this.words = [0]; this.length = 1; for (var limbLen = 0, limbPow = 1; limbPow <= 67108863; limbPow *= base) { limbLen++; } limbLen--; limbPow = (limbPow / base) | 0; var total = number.length - start; var mod = total % limbLen; var end = Math.min(total, total - mod) + start; var word = 0; for (var i = start; i < end; i += limbLen) { word = parseBase(number, i, i + limbLen, base); this.imuln(limbPow); if (this.words[0] + word < 67108864) { this.words[0] += word; } else { this._iaddn(word); } } if (mod !== 0) { var pow = 1; word = parseBase(number, i, number.length, base); for (i = 0; i < mod; i++) { pow *= base; } this.imuln(pow); if (this.words[0] + word < 67108864) { this.words[0] += word; } else { this._iaddn(word); } } this.strip(); }; BN.prototype.copy = function copy(dest) { dest.words = new Array(this.length); for (var i = 0; i < this.length; i++) { dest.words[i] = this.words[i]; } dest.length = this.length; dest.negative = this.negative; dest.red = this.red; }; BN.prototype.clone = function clone() { var r = new BN(null); this.copy(r); return r; }; BN.prototype._expand = function _expand(size) { while (this.length < size) { this.words[this.length++] = 0; } return this; }; BN.prototype.strip = function strip() { while (this.length > 1 && this.words[this.length - 1] === 0) { this.length--; } return this._normSign(); }; BN.prototype._normSign = function _normSign() { if (this.length === 1 && this.words[0] === 0) { this.negative = 0; } return this; }; BN.prototype.inspect = function inspect() { return (this.red ? ""; }; var zeros = [ "", "0", "00", "000", "0000", "00000", "000000", "0000000", "00000000", "000000000", "0000000000", "00000000000", "000000000000", "0000000000000", "00000000000000", "000000000000000", "0000000000000000", "00000000000000000", "000000000000000000", "0000000000000000000", "00000000000000000000", "000000000000000000000", "0000000000000000000000", "00000000000000000000000", "000000000000000000000000", "0000000000000000000000000", ]; var groupSizes = [ 0, 0, 25, 16, 12, 11, 10, 9, 8, 8, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, ]; var groupBases = [ 0, 0, 33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216, 43046721, 1e7, 19487171, 35831808, 62748517, 7529536, 11390625, 16777216, 24137569, 34012224, 47045881, 64e6, 4084101, 5153632, 6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149, 243e5, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176, ]; BN.prototype.toString = function toString(base, padding) { base = base || 10; padding = padding | 0 || 1; var out; if (base === 16 || base === "hex") { out = ""; var off = 0; var carry = 0; for (var i = 0; i < this.length; i++) { var w = this.words[i]; var word = (((w << off) | carry) & 16777215).toString(16); carry = (w >>> (24 - off)) & 16777215; if (carry !== 0 || i !== this.length - 1) { out = zeros[6 - word.length] + word + out; } else { out = word + out; } off += 2; if (off >= 26) { off -= 26; i--; } } if (carry !== 0) { out = carry.toString(16) + out; } while (out.length % padding !== 0) { out = "0" + out; } if (this.negative !== 0) { out = "-" + out; } return out; } if (base === (base | 0) && base >= 2 && base <= 36) { var groupSize = groupSizes[base]; var groupBase = groupBases[base]; out = ""; var c = this.clone(); c.negative = 0; while (!c.isZero()) { var r = c.modn(groupBase).toString(base); c = c.idivn(groupBase); if (!c.isZero()) { out = zeros[groupSize - r.length] + r + out; } else { out = r + out; } } if (this.isZero()) { out = "0" + out; } while (out.length % padding !== 0) { out = "0" + out; } if (this.negative !== 0) { out = "-" + out; } return out; } assert(false, "Base should be between 2 and 36"); }; BN.prototype.toNumber = function toNumber() { var ret = this.words[0]; if (this.length === 2) { ret += this.words[1] * 67108864; } else if (this.length === 3 && this.words[2] === 1) { ret += 4503599627370496 + this.words[1] * 67108864; } else if (this.length > 2) { assert(false, "Number can only safely store up to 53 bits"); } return this.negative !== 0 ? -ret : ret; }; BN.prototype.toJSON = function toJSON() { return this.toString(16); }; BN.prototype.toBuffer = function toBuffer(endian, length) { assert(typeof Buffer2 !== "undefined"); return this.toArrayLike(Buffer2, endian, length); }; BN.prototype.toArray = function toArray(endian, length) { return this.toArrayLike(Array, endian, length); }; BN.prototype.toArrayLike = function toArrayLike(ArrayType, endian, length) { var byteLength = this.byteLength(); var reqLength = length || Math.max(1, byteLength); assert(byteLength <= reqLength, "byte array longer than desired length"); assert(reqLength > 0, "Requested array length <= 0"); this.strip(); var littleEndian = endian === "le"; var res = new ArrayType(reqLength); var b, i; var q = this.clone(); if (!littleEndian) { for (i = 0; i < reqLength - byteLength; i++) { res[i] = 0; } for (i = 0; !q.isZero(); i++) { b = q.andln(255); q.iushrn(8); res[reqLength - i - 1] = b; } } else { for (i = 0; !q.isZero(); i++) { b = q.andln(255); q.iushrn(8); res[i] = b; } for (; i < reqLength; i++) { res[i] = 0; } } return res; }; if (Math.clz32) { BN.prototype._countBits = function _countBits(w) { return 32 - Math.clz32(w); }; } else { BN.prototype._countBits = function _countBits(w) { var t = w; var r = 0; if (t >= 4096) { r += 13; t >>>= 13; } if (t >= 64) { r += 7; t >>>= 7; } if (t >= 8) { r += 4; t >>>= 4; } if (t >= 2) { r += 2; t >>>= 2; } return r + t; }; } BN.prototype._zeroBits = function _zeroBits(w) { if (w === 0) return 26; var t = w; var r = 0; if ((t & 8191) === 0) { r += 13; t >>>= 13; } if ((t & 127) === 0) { r += 7; t >>>= 7; } if ((t & 15) === 0) { r += 4; t >>>= 4; } if ((t & 3) === 0) { r += 2; t >>>= 2; } if ((t & 1) === 0) { r++; } return r; }; BN.prototype.bitLength = function bitLength() { var w = this.words[this.length - 1]; var hi = this._countBits(w); return (this.length - 1) * 26 + hi; }; function toBitArray(num) { var w = new Array(num.bitLength()); for (var bit = 0; bit < w.length; bit++) { var off = (bit / 26) | 0; var wbit = bit % 26; w[bit] = (num.words[off] & (1 << wbit)) >>> wbit; } return w; } BN.prototype.zeroBits = function zeroBits() { if (this.isZero()) return 0; var r = 0; for (var i = 0; i < this.length; i++) { var b = this._zeroBits(this.words[i]); r += b; if (b !== 26) break; } return r; }; BN.prototype.byteLength = function byteLength() { return Math.ceil(this.bitLength() / 8); }; BN.prototype.toTwos = function toTwos(width) { if (this.negative !== 0) { return this.abs().inotn(width).iaddn(1); } return this.clone(); }; BN.prototype.fromTwos = function fromTwos(width) { if (this.testn(width - 1)) { return this.notn(width).iaddn(1).ineg(); } return this.clone(); }; BN.prototype.isNeg = function isNeg() { return this.negative !== 0; }; BN.prototype.neg = function neg() { return this.clone().ineg(); }; BN.prototype.ineg = function ineg() { if (!this.isZero()) { this.negative ^= 1; } return this; }; BN.prototype.iuor = function iuor(num) { while (this.length < num.length) { this.words[this.length++] = 0; } for (var i = 0; i < num.length; i++) { this.words[i] = this.words[i] | num.words[i]; } return this.strip(); }; BN.prototype.ior = function ior(num) { assert((this.negative | num.negative) === 0); return this.iuor(num); }; BN.prototype.or = function or(num) { if (this.length > num.length) return this.clone().ior(num); return num.clone().ior(this); }; BN.prototype.uor = function uor(num) { if (this.length > num.length) return this.clone().iuor(num); return num.clone().iuor(this); }; BN.prototype.iuand = function iuand(num) { var b; if (this.length > num.length) { b = num; } else { b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = this.words[i] & num.words[i]; } this.length = b.length; return this.strip(); }; BN.prototype.iand = function iand(num) { assert((this.negative | num.negative) === 0); return this.iuand(num); }; BN.prototype.and = function and(num) { if (this.length > num.length) return this.clone().iand(num); return num.clone().iand(this); }; BN.prototype.uand = function uand(num) { if (this.length > num.length) return this.clone().iuand(num); return num.clone().iuand(this); }; BN.prototype.iuxor = function iuxor(num) { var a; var b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } for (var i = 0; i < b.length; i++) { this.words[i] = a.words[i] ^ b.words[i]; } if (this !== a) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = a.length; return this.strip(); }; BN.prototype.ixor = function ixor(num) { assert((this.negative | num.negative) === 0); return this.iuxor(num); }; BN.prototype.xor = function xor(num) { if (this.length > num.length) return this.clone().ixor(num); return num.clone().ixor(this); }; BN.prototype.uxor = function uxor(num) { if (this.length > num.length) return this.clone().iuxor(num); return num.clone().iuxor(this); }; BN.prototype.inotn = function inotn(width) { assert(typeof width === "number" && width >= 0); var bytesNeeded = Math.ceil(width / 26) | 0; var bitsLeft = width % 26; this._expand(bytesNeeded); if (bitsLeft > 0) { bytesNeeded--; } for (var i = 0; i < bytesNeeded; i++) { this.words[i] = ~this.words[i] & 67108863; } if (bitsLeft > 0) { this.words[i] = ~this.words[i] & (67108863 >> (26 - bitsLeft)); } return this.strip(); }; BN.prototype.notn = function notn(width) { return this.clone().inotn(width); }; BN.prototype.setn = function setn(bit, val) { assert(typeof bit === "number" && bit >= 0); var off = (bit / 26) | 0; var wbit = bit % 26; this._expand(off + 1); if (val) { this.words[off] = this.words[off] | (1 << wbit); } else { this.words[off] = this.words[off] & ~(1 << wbit); } return this.strip(); }; BN.prototype.iadd = function iadd(num) { var r; if (this.negative !== 0 && num.negative === 0) { this.negative = 0; r = this.isub(num); this.negative ^= 1; return this._normSign(); } else if (this.negative === 0 && num.negative !== 0) { num.negative = 0; r = this.isub(num); num.negative = 1; return r._normSign(); } var a, b; if (this.length > num.length) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) + (b.words[i] | 0) + carry; this.words[i] = r & 67108863; carry = r >>> 26; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; this.words[i] = r & 67108863; carry = r >>> 26; } this.length = a.length; if (carry !== 0) { this.words[this.length] = carry; this.length++; } else if (a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } return this; }; BN.prototype.add = function add(num) { var res; if (num.negative !== 0 && this.negative === 0) { num.negative = 0; res = this.sub(num); num.negative ^= 1; return res; } else if (num.negative === 0 && this.negative !== 0) { this.negative = 0; res = num.sub(this); this.negative = 1; return res; } if (this.length > num.length) return this.clone().iadd(num); return num.clone().iadd(this); }; BN.prototype.isub = function isub(num) { if (num.negative !== 0) { num.negative = 0; var r = this.iadd(num); num.negative = 1; return r._normSign(); } else if (this.negative !== 0) { this.negative = 0; this.iadd(num); this.negative = 1; return this._normSign(); } var cmp = this.cmp(num); if (cmp === 0) { this.negative = 0; this.length = 1; this.words[0] = 0; return this; } var a, b; if (cmp > 0) { a = this; b = num; } else { a = num; b = this; } var carry = 0; for (var i = 0; i < b.length; i++) { r = (a.words[i] | 0) - (b.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 67108863; } for (; carry !== 0 && i < a.length; i++) { r = (a.words[i] | 0) + carry; carry = r >> 26; this.words[i] = r & 67108863; } if (carry === 0 && i < a.length && a !== this) { for (; i < a.length; i++) { this.words[i] = a.words[i]; } } this.length = Math.max(this.length, i); if (a !== this) { this.negative = 1; } return this.strip(); }; BN.prototype.sub = function sub(num) { return this.clone().isub(num); }; function smallMulTo(self2, num, out) { out.negative = num.negative ^ self2.negative; var len = (self2.length + num.length) | 0; out.length = len; len = (len - 1) | 0; var a = self2.words[0] | 0; var b = num.words[0] | 0; var r = a * b; var lo = r & 67108863; var carry = (r / 67108864) | 0; out.words[0] = lo; for (var k = 1; k < len; k++) { var ncarry = carry >>> 26; var rword = carry & 67108863; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { var i = (k - j) | 0; a = self2.words[i] | 0; b = num.words[j] | 0; r = a * b + rword; ncarry += (r / 67108864) | 0; rword = r & 67108863; } out.words[k] = rword | 0; carry = ncarry | 0; } if (carry !== 0) { out.words[k] = carry | 0; } else { out.length--; } return out.strip(); } var comb10MulTo = function comb10MulTo2(self2, num, out) { var a = self2.words; var b = num.words; var o = out.words; var c = 0; var lo; var mid; var hi; var a0 = a[0] | 0; var al0 = a0 & 8191; var ah0 = a0 >>> 13; var a1 = a[1] | 0; var al1 = a1 & 8191; var ah1 = a1 >>> 13; var a2 = a[2] | 0; var al2 = a2 & 8191; var ah2 = a2 >>> 13; var a3 = a[3] | 0; var al3 = a3 & 8191; var ah3 = a3 >>> 13; var a4 = a[4] | 0; var al4 = a4 & 8191; var ah4 = a4 >>> 13; var a5 = a[5] | 0; var al5 = a5 & 8191; var ah5 = a5 >>> 13; var a6 = a[6] | 0; var al6 = a6 & 8191; var ah6 = a6 >>> 13; var a7 = a[7] | 0; var al7 = a7 & 8191; var ah7 = a7 >>> 13; var a8 = a[8] | 0; var al8 = a8 & 8191; var ah8 = a8 >>> 13; var a9 = a[9] | 0; var al9 = a9 & 8191; var ah9 = a9 >>> 13; var b0 = b[0] | 0; var bl0 = b0 & 8191; var bh0 = b0 >>> 13; var b1 = b[1] | 0; var bl1 = b1 & 8191; var bh1 = b1 >>> 13; var b2 = b[2] | 0; var bl2 = b2 & 8191; var bh2 = b2 >>> 13; var b3 = b[3] | 0; var bl3 = b3 & 8191; var bh3 = b3 >>> 13; var b4 = b[4] | 0; var bl4 = b4 & 8191; var bh4 = b4 >>> 13; var b5 = b[5] | 0; var bl5 = b5 & 8191; var bh5 = b5 >>> 13; var b6 = b[6] | 0; var bl6 = b6 & 8191; var bh6 = b6 >>> 13; var b7 = b[7] | 0; var bl7 = b7 & 8191; var bh7 = b7 >>> 13; var b8 = b[8] | 0; var bl8 = b8 & 8191; var bh8 = b8 >>> 13; var b9 = b[9] | 0; var bl9 = b9 & 8191; var bh9 = b9 >>> 13; out.negative = self2.negative ^ num.negative; out.length = 19; lo = Math.imul(al0, bl0); mid = Math.imul(al0, bh0); mid = (mid + Math.imul(ah0, bl0)) | 0; hi = Math.imul(ah0, bh0); var w0 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0; w0 &= 67108863; lo = Math.imul(al1, bl0); mid = Math.imul(al1, bh0); mid = (mid + Math.imul(ah1, bl0)) | 0; hi = Math.imul(ah1, bh0); lo = (lo + Math.imul(al0, bl1)) | 0; mid = (mid + Math.imul(al0, bh1)) | 0; mid = (mid + Math.imul(ah0, bl1)) | 0; hi = (hi + Math.imul(ah0, bh1)) | 0; var w1 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0; w1 &= 67108863; lo = Math.imul(al2, bl0); mid = Math.imul(al2, bh0); mid = (mid + Math.imul(ah2, bl0)) | 0; hi = Math.imul(ah2, bh0); lo = (lo + Math.imul(al1, bl1)) | 0; mid = (mid + Math.imul(al1, bh1)) | 0; mid = (mid + Math.imul(ah1, bl1)) | 0; hi = (hi + Math.imul(ah1, bh1)) | 0; lo = (lo + Math.imul(al0, bl2)) | 0; mid = (mid + Math.imul(al0, bh2)) | 0; mid = (mid + Math.imul(ah0, bl2)) | 0; hi = (hi + Math.imul(ah0, bh2)) | 0; var w2 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0; w2 &= 67108863; lo = Math.imul(al3, bl0); mid = Math.imul(al3, bh0); mid = (mid + Math.imul(ah3, bl0)) | 0; hi = Math.imul(ah3, bh0); lo = (lo + Math.imul(al2, bl1)) | 0; mid = (mid + Math.imul(al2, bh1)) | 0; mid = (mid + Math.imul(ah2, bl1)) | 0; hi = (hi + Math.imul(ah2, bh1)) | 0; lo = (lo + Math.imul(al1, bl2)) | 0; mid = (mid + Math.imul(al1, bh2)) | 0; mid = (mid + Math.imul(ah1, bl2)) | 0; hi = (hi + Math.imul(ah1, bh2)) | 0; lo = (lo + Math.imul(al0, bl3)) | 0; mid = (mid + Math.imul(al0, bh3)) | 0; mid = (mid + Math.imul(ah0, bl3)) | 0; hi = (hi + Math.imul(ah0, bh3)) | 0; var w3 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0; w3 &= 67108863; lo = Math.imul(al4, bl0); mid = Math.imul(al4, bh0); mid = (mid + Math.imul(ah4, bl0)) | 0; hi = Math.imul(ah4, bh0); lo = (lo + Math.imul(al3, bl1)) | 0; mid = (mid + Math.imul(al3, bh1)) | 0; mid = (mid + Math.imul(ah3, bl1)) | 0; hi = (hi + Math.imul(ah3, bh1)) | 0; lo = (lo + Math.imul(al2, bl2)) | 0; mid = (mid + Math.imul(al2, bh2)) | 0; mid = (mid + Math.imul(ah2, bl2)) | 0; hi = (hi + Math.imul(ah2, bh2)) | 0; lo = (lo + Math.imul(al1, bl3)) | 0; mid = (mid + Math.imul(al1, bh3)) | 0; mid = (mid + Math.imul(ah1, bl3)) | 0; hi = (hi + Math.imul(ah1, bh3)) | 0; lo = (lo + Math.imul(al0, bl4)) | 0; mid = (mid + Math.imul(al0, bh4)) | 0; mid = (mid + Math.imul(ah0, bl4)) | 0; hi = (hi + Math.imul(ah0, bh4)) | 0; var w4 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0; w4 &= 67108863; lo = Math.imul(al5, bl0); mid = Math.imul(al5, bh0); mid = (mid + Math.imul(ah5, bl0)) | 0; hi = Math.imul(ah5, bh0); lo = (lo + Math.imul(al4, bl1)) | 0; mid = (mid + Math.imul(al4, bh1)) | 0; mid = (mid + Math.imul(ah4, bl1)) | 0; hi = (hi + Math.imul(ah4, bh1)) | 0; lo = (lo + Math.imul(al3, bl2)) | 0; mid = (mid + Math.imul(al3, bh2)) | 0; mid = (mid + Math.imul(ah3, bl2)) | 0; hi = (hi + Math.imul(ah3, bh2)) | 0; lo = (lo + Math.imul(al2, bl3)) | 0; mid = (mid + Math.imul(al2, bh3)) | 0; mid = (mid + Math.imul(ah2, bl3)) | 0; hi = (hi + Math.imul(ah2, bh3)) | 0; lo = (lo + Math.imul(al1, bl4)) | 0; mid = (mid + Math.imul(al1, bh4)) | 0; mid = (mid + Math.imul(ah1, bl4)) | 0; hi = (hi + Math.imul(ah1, bh4)) | 0; lo = (lo + Math.imul(al0, bl5)) | 0; mid = (mid + Math.imul(al0, bh5)) | 0; mid = (mid + Math.imul(ah0, bl5)) | 0; hi = (hi + Math.imul(ah0, bh5)) | 0; var w5 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0; w5 &= 67108863; lo = Math.imul(al6, bl0); mid = Math.imul(al6, bh0); mid = (mid + Math.imul(ah6, bl0)) | 0; hi = Math.imul(ah6, bh0); lo = (lo + Math.imul(al5, bl1)) | 0; mid = (mid + Math.imul(al5, bh1)) | 0; mid = (mid + Math.imul(ah5, bl1)) | 0; hi = (hi + Math.imul(ah5, bh1)) | 0; lo = (lo + Math.imul(al4, bl2)) | 0; mid = (mid + Math.imul(al4, bh2)) | 0; mid = (mid + Math.imul(ah4, bl2)) | 0; hi = (hi + Math.imul(ah4, bh2)) | 0; lo = (lo + Math.imul(al3, bl3)) | 0; mid = (mid + Math.imul(al3, bh3)) | 0; mid = (mid + Math.imul(ah3, bl3)) | 0; hi = (hi + Math.imul(ah3, bh3)) | 0; lo = (lo + Math.imul(al2, bl4)) | 0; mid = (mid + Math.imul(al2, bh4)) | 0; mid = (mid + Math.imul(ah2, bl4)) | 0; hi = (hi + Math.imul(ah2, bh4)) | 0; lo = (lo + Math.imul(al1, bl5)) | 0; mid = (mid + Math.imul(al1, bh5)) | 0; mid = (mid + Math.imul(ah1, bl5)) | 0; hi = (hi + Math.imul(ah1, bh5)) | 0; lo = (lo + Math.imul(al0, bl6)) | 0; mid = (mid + Math.imul(al0, bh6)) | 0; mid = (mid + Math.imul(ah0, bl6)) | 0; hi = (hi + Math.imul(ah0, bh6)) | 0; var w6 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0; w6 &= 67108863; lo = Math.imul(al7, bl0); mid = Math.imul(al7, bh0); mid = (mid + Math.imul(ah7, bl0)) | 0; hi = Math.imul(ah7, bh0); lo = (lo + Math.imul(al6, bl1)) | 0; mid = (mid + Math.imul(al6, bh1)) | 0; mid = (mid + Math.imul(ah6, bl1)) | 0; hi = (hi + Math.imul(ah6, bh1)) | 0; lo = (lo + Math.imul(al5, bl2)) | 0; mid = (mid + Math.imul(al5, bh2)) | 0; mid = (mid + Math.imul(ah5, bl2)) | 0; hi = (hi + Math.imul(ah5, bh2)) | 0; lo = (lo + Math.imul(al4, bl3)) | 0; mid = (mid + Math.imul(al4, bh3)) | 0; mid = (mid + Math.imul(ah4, bl3)) | 0; hi = (hi + Math.imul(ah4, bh3)) | 0; lo = (lo + Math.imul(al3, bl4)) | 0; mid = (mid + Math.imul(al3, bh4)) | 0; mid = (mid + Math.imul(ah3, bl4)) | 0; hi = (hi + Math.imul(ah3, bh4)) | 0; lo = (lo + Math.imul(al2, bl5)) | 0; mid = (mid + Math.imul(al2, bh5)) | 0; mid = (mid + Math.imul(ah2, bl5)) | 0; hi = (hi + Math.imul(ah2, bh5)) | 0; lo = (lo + Math.imul(al1, bl6)) | 0; mid = (mid + Math.imul(al1, bh6)) | 0; mid = (mid + Math.imul(ah1, bl6)) | 0; hi = (hi + Math.imul(ah1, bh6)) | 0; lo = (lo + Math.imul(al0, bl7)) | 0; mid = (mid + Math.imul(al0, bh7)) | 0; mid = (mid + Math.imul(ah0, bl7)) | 0; hi = (hi + Math.imul(ah0, bh7)) | 0; var w7 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0; w7 &= 67108863; lo = Math.imul(al8, bl0); mid = Math.imul(al8, bh0); mid = (mid + Math.imul(ah8, bl0)) | 0; hi = Math.imul(ah8, bh0); lo = (lo + Math.imul(al7, bl1)) | 0; mid = (mid + Math.imul(al7, bh1)) | 0; mid = (mid + Math.imul(ah7, bl1)) | 0; hi = (hi + Math.imul(ah7, bh1)) | 0; lo = (lo + Math.imul(al6, bl2)) | 0; mid = (mid + Math.imul(al6, bh2)) | 0; mid = (mid + Math.imul(ah6, bl2)) | 0; hi = (hi + Math.imul(ah6, bh2)) | 0; lo = (lo + Math.imul(al5, bl3)) | 0; mid = (mid + Math.imul(al5, bh3)) | 0; mid = (mid + Math.imul(ah5, bl3)) | 0; hi = (hi + Math.imul(ah5, bh3)) | 0; lo = (lo + Math.imul(al4, bl4)) | 0; mid = (mid + Math.imul(al4, bh4)) | 0; mid = (mid + Math.imul(ah4, bl4)) | 0; hi = (hi + Math.imul(ah4, bh4)) | 0; lo = (lo + Math.imul(al3, bl5)) | 0; mid = (mid + Math.imul(al3, bh5)) | 0; mid = (mid + Math.imul(ah3, bl5)) | 0; hi = (hi + Math.imul(ah3, bh5)) | 0; lo = (lo + Math.imul(al2, bl6)) | 0; mid = (mid + Math.imul(al2, bh6)) | 0; mid = (mid + Math.imul(ah2, bl6)) | 0; hi = (hi + Math.imul(ah2, bh6)) | 0; lo = (lo + Math.imul(al1, bl7)) | 0; mid = (mid + Math.imul(al1, bh7)) | 0; mid = (mid + Math.imul(ah1, bl7)) | 0; hi = (hi + Math.imul(ah1, bh7)) | 0; lo = (lo + Math.imul(al0, bl8)) | 0; mid = (mid + Math.imul(al0, bh8)) | 0; mid = (mid + Math.imul(ah0, bl8)) | 0; hi = (hi + Math.imul(ah0, bh8)) | 0; var w8 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0; w8 &= 67108863; lo = Math.imul(al9, bl0); mid = Math.imul(al9, bh0); mid = (mid + Math.imul(ah9, bl0)) | 0; hi = Math.imul(ah9, bh0); lo = (lo + Math.imul(al8, bl1)) | 0; mid = (mid + Math.imul(al8, bh1)) | 0; mid = (mid + Math.imul(ah8, bl1)) | 0; hi = (hi + Math.imul(ah8, bh1)) | 0; lo = (lo + Math.imul(al7, bl2)) | 0; mid = (mid + Math.imul(al7, bh2)) | 0; mid = (mid + Math.imul(ah7, bl2)) | 0; hi = (hi + Math.imul(ah7, bh2)) | 0; lo = (lo + Math.imul(al6, bl3)) | 0; mid = (mid + Math.imul(al6, bh3)) | 0; mid = (mid + Math.imul(ah6, bl3)) | 0; hi = (hi + Math.imul(ah6, bh3)) | 0; lo = (lo + Math.imul(al5, bl4)) | 0; mid = (mid + Math.imul(al5, bh4)) | 0; mid = (mid + Math.imul(ah5, bl4)) | 0; hi = (hi + Math.imul(ah5, bh4)) | 0; lo = (lo + Math.imul(al4, bl5)) | 0; mid = (mid + Math.imul(al4, bh5)) | 0; mid = (mid + Math.imul(ah4, bl5)) | 0; hi = (hi + Math.imul(ah4, bh5)) | 0; lo = (lo + Math.imul(al3, bl6)) | 0; mid = (mid + Math.imul(al3, bh6)) | 0; mid = (mid + Math.imul(ah3, bl6)) | 0; hi = (hi + Math.imul(ah3, bh6)) | 0; lo = (lo + Math.imul(al2, bl7)) | 0; mid = (mid + Math.imul(al2, bh7)) | 0; mid = (mid + Math.imul(ah2, bl7)) | 0; hi = (hi + Math.imul(ah2, bh7)) | 0; lo = (lo + Math.imul(al1, bl8)) | 0; mid = (mid + Math.imul(al1, bh8)) | 0; mid = (mid + Math.imul(ah1, bl8)) | 0; hi = (hi + Math.imul(ah1, bh8)) | 0; lo = (lo + Math.imul(al0, bl9)) | 0; mid = (mid + Math.imul(al0, bh9)) | 0; mid = (mid + Math.imul(ah0, bl9)) | 0; hi = (hi + Math.imul(ah0, bh9)) | 0; var w9 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0; w9 &= 67108863; lo = Math.imul(al9, bl1); mid = Math.imul(al9, bh1); mid = (mid + Math.imul(ah9, bl1)) | 0; hi = Math.imul(ah9, bh1); lo = (lo + Math.imul(al8, bl2)) | 0; mid = (mid + Math.imul(al8, bh2)) | 0; mid = (mid + Math.imul(ah8, bl2)) | 0; hi = (hi + Math.imul(ah8, bh2)) | 0; lo = (lo + Math.imul(al7, bl3)) | 0; mid = (mid + Math.imul(al7, bh3)) | 0; mid = (mid + Math.imul(ah7, bl3)) | 0; hi = (hi + Math.imul(ah7, bh3)) | 0; lo = (lo + Math.imul(al6, bl4)) | 0; mid = (mid + Math.imul(al6, bh4)) | 0; mid = (mid + Math.imul(ah6, bl4)) | 0; hi = (hi + Math.imul(ah6, bh4)) | 0; lo = (lo + Math.imul(al5, bl5)) | 0; mid = (mid + Math.imul(al5, bh5)) | 0; mid = (mid + Math.imul(ah5, bl5)) | 0; hi = (hi + Math.imul(ah5, bh5)) | 0; lo = (lo + Math.imul(al4, bl6)) | 0; mid = (mid + Math.imul(al4, bh6)) | 0; mid = (mid + Math.imul(ah4, bl6)) | 0; hi = (hi + Math.imul(ah4, bh6)) | 0; lo = (lo + Math.imul(al3, bl7)) | 0; mid = (mid + Math.imul(al3, bh7)) | 0; mid = (mid + Math.imul(ah3, bl7)) | 0; hi = (hi + Math.imul(ah3, bh7)) | 0; lo = (lo + Math.imul(al2, bl8)) | 0; mid = (mid + Math.imul(al2, bh8)) | 0; mid = (mid + Math.imul(ah2, bl8)) | 0; hi = (hi + Math.imul(ah2, bh8)) | 0; lo = (lo + Math.imul(al1, bl9)) | 0; mid = (mid + Math.imul(al1, bh9)) | 0; mid = (mid + Math.imul(ah1, bl9)) | 0; hi = (hi + Math.imul(ah1, bh9)) | 0; var w10 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0; w10 &= 67108863; lo = Math.imul(al9, bl2); mid = Math.imul(al9, bh2); mid = (mid + Math.imul(ah9, bl2)) | 0; hi = Math.imul(ah9, bh2); lo = (lo + Math.imul(al8, bl3)) | 0; mid = (mid + Math.imul(al8, bh3)) | 0; mid = (mid + Math.imul(ah8, bl3)) | 0; hi = (hi + Math.imul(ah8, bh3)) | 0; lo = (lo + Math.imul(al7, bl4)) | 0; mid = (mid + Math.imul(al7, bh4)) | 0; mid = (mid + Math.imul(ah7, bl4)) | 0; hi = (hi + Math.imul(ah7, bh4)) | 0; lo = (lo + Math.imul(al6, bl5)) | 0; mid = (mid + Math.imul(al6, bh5)) | 0; mid = (mid + Math.imul(ah6, bl5)) | 0; hi = (hi + Math.imul(ah6, bh5)) | 0; lo = (lo + Math.imul(al5, bl6)) | 0; mid = (mid + Math.imul(al5, bh6)) | 0; mid = (mid + Math.imul(ah5, bl6)) | 0; hi = (hi + Math.imul(ah5, bh6)) | 0; lo = (lo + Math.imul(al4, bl7)) | 0; mid = (mid + Math.imul(al4, bh7)) | 0; mid = (mid + Math.imul(ah4, bl7)) | 0; hi = (hi + Math.imul(ah4, bh7)) | 0; lo = (lo + Math.imul(al3, bl8)) | 0; mid = (mid + Math.imul(al3, bh8)) | 0; mid = (mid + Math.imul(ah3, bl8)) | 0; hi = (hi + Math.imul(ah3, bh8)) | 0; lo = (lo + Math.imul(al2, bl9)) | 0; mid = (mid + Math.imul(al2, bh9)) | 0; mid = (mid + Math.imul(ah2, bl9)) | 0; hi = (hi + Math.imul(ah2, bh9)) | 0; var w11 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0; w11 &= 67108863; lo = Math.imul(al9, bl3); mid = Math.imul(al9, bh3); mid = (mid + Math.imul(ah9, bl3)) | 0; hi = Math.imul(ah9, bh3); lo = (lo + Math.imul(al8, bl4)) | 0; mid = (mid + Math.imul(al8, bh4)) | 0; mid = (mid + Math.imul(ah8, bl4)) | 0; hi = (hi + Math.imul(ah8, bh4)) | 0; lo = (lo + Math.imul(al7, bl5)) | 0; mid = (mid + Math.imul(al7, bh5)) | 0; mid = (mid + Math.imul(ah7, bl5)) | 0; hi = (hi + Math.imul(ah7, bh5)) | 0; lo = (lo + Math.imul(al6, bl6)) | 0; mid = (mid + Math.imul(al6, bh6)) | 0; mid = (mid + Math.imul(ah6, bl6)) | 0; hi = (hi + Math.imul(ah6, bh6)) | 0; lo = (lo + Math.imul(al5, bl7)) | 0; mid = (mid + Math.imul(al5, bh7)) | 0; mid = (mid + Math.imul(ah5, bl7)) | 0; hi = (hi + Math.imul(ah5, bh7)) | 0; lo = (lo + Math.imul(al4, bl8)) | 0; mid = (mid + Math.imul(al4, bh8)) | 0; mid = (mid + Math.imul(ah4, bl8)) | 0; hi = (hi + Math.imul(ah4, bh8)) | 0; lo = (lo + Math.imul(al3, bl9)) | 0; mid = (mid + Math.imul(al3, bh9)) | 0; mid = (mid + Math.imul(ah3, bl9)) | 0; hi = (hi + Math.imul(ah3, bh9)) | 0; var w12 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0; w12 &= 67108863; lo = Math.imul(al9, bl4); mid = Math.imul(al9, bh4); mid = (mid + Math.imul(ah9, bl4)) | 0; hi = Math.imul(ah9, bh4); lo = (lo + Math.imul(al8, bl5)) | 0; mid = (mid + Math.imul(al8, bh5)) | 0; mid = (mid + Math.imul(ah8, bl5)) | 0; hi = (hi + Math.imul(ah8, bh5)) | 0; lo = (lo + Math.imul(al7, bl6)) | 0; mid = (mid + Math.imul(al7, bh6)) | 0; mid = (mid + Math.imul(ah7, bl6)) | 0; hi = (hi + Math.imul(ah7, bh6)) | 0; lo = (lo + Math.imul(al6, bl7)) | 0; mid = (mid + Math.imul(al6, bh7)) | 0; mid = (mid + Math.imul(ah6, bl7)) | 0; hi = (hi + Math.imul(ah6, bh7)) | 0; lo = (lo + Math.imul(al5, bl8)) | 0; mid = (mid + Math.imul(al5, bh8)) | 0; mid = (mid + Math.imul(ah5, bl8)) | 0; hi = (hi + Math.imul(ah5, bh8)) | 0; lo = (lo + Math.imul(al4, bl9)) | 0; mid = (mid + Math.imul(al4, bh9)) | 0; mid = (mid + Math.imul(ah4, bl9)) | 0; hi = (hi + Math.imul(ah4, bh9)) | 0; var w13 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0; w13 &= 67108863; lo = Math.imul(al9, bl5); mid = Math.imul(al9, bh5); mid = (mid + Math.imul(ah9, bl5)) | 0; hi = Math.imul(ah9, bh5); lo = (lo + Math.imul(al8, bl6)) | 0; mid = (mid + Math.imul(al8, bh6)) | 0; mid = (mid + Math.imul(ah8, bl6)) | 0; hi = (hi + Math.imul(ah8, bh6)) | 0; lo = (lo + Math.imul(al7, bl7)) | 0; mid = (mid + Math.imul(al7, bh7)) | 0; mid = (mid + Math.imul(ah7, bl7)) | 0; hi = (hi + Math.imul(ah7, bh7)) | 0; lo = (lo + Math.imul(al6, bl8)) | 0; mid = (mid + Math.imul(al6, bh8)) | 0; mid = (mid + Math.imul(ah6, bl8)) | 0; hi = (hi + Math.imul(ah6, bh8)) | 0; lo = (lo + Math.imul(al5, bl9)) | 0; mid = (mid + Math.imul(al5, bh9)) | 0; mid = (mid + Math.imul(ah5, bl9)) | 0; hi = (hi + Math.imul(ah5, bh9)) | 0; var w14 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0; w14 &= 67108863; lo = Math.imul(al9, bl6); mid = Math.imul(al9, bh6); mid = (mid + Math.imul(ah9, bl6)) | 0; hi = Math.imul(ah9, bh6); lo = (lo + Math.imul(al8, bl7)) | 0; mid = (mid + Math.imul(al8, bh7)) | 0; mid = (mid + Math.imul(ah8, bl7)) | 0; hi = (hi + Math.imul(ah8, bh7)) | 0; lo = (lo + Math.imul(al7, bl8)) | 0; mid = (mid + Math.imul(al7, bh8)) | 0; mid = (mid + Math.imul(ah7, bl8)) | 0; hi = (hi + Math.imul(ah7, bh8)) | 0; lo = (lo + Math.imul(al6, bl9)) | 0; mid = (mid + Math.imul(al6, bh9)) | 0; mid = (mid + Math.imul(ah6, bl9)) | 0; hi = (hi + Math.imul(ah6, bh9)) | 0; var w15 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0; w15 &= 67108863; lo = Math.imul(al9, bl7); mid = Math.imul(al9, bh7); mid = (mid + Math.imul(ah9, bl7)) | 0; hi = Math.imul(ah9, bh7); lo = (lo + Math.imul(al8, bl8)) | 0; mid = (mid + Math.imul(al8, bh8)) | 0; mid = (mid + Math.imul(ah8, bl8)) | 0; hi = (hi + Math.imul(ah8, bh8)) | 0; lo = (lo + Math.imul(al7, bl9)) | 0; mid = (mid + Math.imul(al7, bh9)) | 0; mid = (mid + Math.imul(ah7, bl9)) | 0; hi = (hi + Math.imul(ah7, bh9)) | 0; var w16 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0; w16 &= 67108863; lo = Math.imul(al9, bl8); mid = Math.imul(al9, bh8); mid = (mid + Math.imul(ah9, bl8)) | 0; hi = Math.imul(ah9, bh8); lo = (lo + Math.imul(al8, bl9)) | 0; mid = (mid + Math.imul(al8, bh9)) | 0; mid = (mid + Math.imul(ah8, bl9)) | 0; hi = (hi + Math.imul(ah8, bh9)) | 0; var w17 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0; w17 &= 67108863; lo = Math.imul(al9, bl9); mid = Math.imul(al9, bh9); mid = (mid + Math.imul(ah9, bl9)) | 0; hi = Math.imul(ah9, bh9); var w18 = (((c + lo) | 0) + ((mid & 8191) << 13)) | 0; c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0; w18 &= 67108863; o[0] = w0; o[1] = w1; o[2] = w2; o[3] = w3; o[4] = w4; o[5] = w5; o[6] = w6; o[7] = w7; o[8] = w8; o[9] = w9; o[10] = w10; o[11] = w11; o[12] = w12; o[13] = w13; o[14] = w14; o[15] = w15; o[16] = w16; o[17] = w17; o[18] = w18; if (c !== 0) { o[19] = c; out.length++; } return out; }; if (!Math.imul) { comb10MulTo = smallMulTo; } function bigMulTo(self2, num, out) { out.negative = num.negative ^ self2.negative; out.length = self2.length + num.length; var carry = 0; var hncarry = 0; for (var k = 0; k < out.length - 1; k++) { var ncarry = hncarry; hncarry = 0; var rword = carry & 67108863; var maxJ = Math.min(k, num.length - 1); for (var j = Math.max(0, k - self2.length + 1); j <= maxJ; j++) { var i = k - j; var a = self2.words[i] | 0; var b = num.words[j] | 0; var r = a * b; var lo = r & 67108863; ncarry = (ncarry + ((r / 67108864) | 0)) | 0; lo = (lo + rword) | 0; rword = lo & 67108863; ncarry = (ncarry + (lo >>> 26)) | 0; hncarry += ncarry >>> 26; ncarry &= 67108863; } out.words[k] = rword; carry = ncarry; ncarry = hncarry; } if (carry !== 0) { out.words[k] = carry; } else { out.length--; } return out.strip(); } function jumboMulTo(self2, num, out) { var fftm = new FFTM(); return fftm.mulp(self2, num, out); } BN.prototype.mulTo = function mulTo(num, out) { var res; var len = this.length + num.length; if (this.length === 10 && num.length === 10) { res = comb10MulTo(this, num, out); } else if (len < 63) { res = smallMulTo(this, num, out); } else if (len < 1024) { res = bigMulTo(this, num, out); } else { res = jumboMulTo(this, num, out); } return res; }; function FFTM(x, y) { this.x = x; this.y = y; } FFTM.prototype.makeRBT = function makeRBT(N) { var t = new Array(N); var l = BN.prototype._countBits(N) - 1; for (var i = 0; i < N; i++) { t[i] = this.revBin(i, l, N); } return t; }; FFTM.prototype.revBin = function revBin(x, l, N) { if (x === 0 || x === N - 1) return x; var rb = 0; for (var i = 0; i < l; i++) { rb |= (x & 1) << (l - i - 1); x >>= 1; } return rb; }; FFTM.prototype.permute = function permute(rbt, rws, iws, rtws, itws, N) { for (var i = 0; i < N; i++) { rtws[i] = rws[rbt[i]]; itws[i] = iws[rbt[i]]; } }; FFTM.prototype.transform = function transform(rws, iws, rtws, itws, N, rbt) { this.permute(rbt, rws, iws, rtws, itws, N); for (var s = 1; s < N; s <<= 1) { var l = s << 1; var rtwdf = Math.cos((2 * Math.PI) / l); var itwdf = Math.sin((2 * Math.PI) / l); for (var p = 0; p < N; p += l) { var rtwdf_ = rtwdf; var itwdf_ = itwdf; for (var j = 0; j < s; j++) { var re = rtws[p + j]; var ie = itws[p + j]; var ro = rtws[p + j + s]; var io = itws[p + j + s]; var rx = rtwdf_ * ro - itwdf_ * io; io = rtwdf_ * io + itwdf_ * ro; ro = rx; rtws[p + j] = re + ro; itws[p + j] = ie + io; rtws[p + j + s] = re - ro; itws[p + j + s] = ie - io; if (j !== l) { rx = rtwdf * rtwdf_ - itwdf * itwdf_; itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_; rtwdf_ = rx; } } } } }; FFTM.prototype.guessLen13b = function guessLen13b(n, m) { var N = Math.max(m, n) | 1; var odd = N & 1; var i = 0; for (N = (N / 2) | 0; N; N = N >>> 1) { i++; } return 1 << (i + 1 + odd); }; FFTM.prototype.conjugate = function conjugate(rws, iws, N) { if (N <= 1) return; for (var i = 0; i < N / 2; i++) { var t = rws[i]; rws[i] = rws[N - i - 1]; rws[N - i - 1] = t; t = iws[i]; iws[i] = -iws[N - i - 1]; iws[N - i - 1] = -t; } }; FFTM.prototype.normalize13b = function normalize13b(ws, N) { var carry = 0; for (var i = 0; i < N / 2; i++) { var w = Math.round(ws[2 * i + 1] / N) * 8192 + Math.round(ws[2 * i] / N) + carry; ws[i] = w & 67108863; if (w < 67108864) { carry = 0; } else { carry = (w / 67108864) | 0; } } return ws; }; FFTM.prototype.convert13b = function convert13b(ws, len, rws, N) { var carry = 0; for (var i = 0; i < len; i++) { carry = carry + (ws[i] | 0); rws[2 * i] = carry & 8191; carry = carry >>> 13; rws[2 * i + 1] = carry & 8191; carry = carry >>> 13; } for (i = 2 * len; i < N; ++i) { rws[i] = 0; } assert(carry === 0); assert((carry & ~8191) === 0); }; FFTM.prototype.stub = function stub(N) { var ph = new Array(N); for (var i = 0; i < N; i++) { ph[i] = 0; } return ph; }; FFTM.prototype.mulp = function mulp(x, y, out) { var N = 2 * this.guessLen13b(x.length, y.length); var rbt = this.makeRBT(N); var _ = this.stub(N); var rws = new Array(N); var rwst = new Array(N); var iwst = new Array(N); var nrws = new Array(N); var nrwst = new Array(N); var niwst = new Array(N); var rmws = out.words; rmws.length = N; this.convert13b(x.words, x.length, rws, N); this.convert13b(y.words, y.length, nrws, N); this.transform(rws, _, rwst, iwst, N, rbt); this.transform(nrws, _, nrwst, niwst, N, rbt); for (var i = 0; i < N; i++) { var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i]; iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i]; rwst[i] = rx; } this.conjugate(rwst, iwst, N); this.transform(rwst, iwst, rmws, _, N, rbt); this.conjugate(rmws, _, N); this.normalize13b(rmws, N); out.negative = x.negative ^ y.negative; out.length = x.length + y.length; return out.strip(); }; BN.prototype.mul = function mul(num) { var out = new BN(null); out.words = new Array(this.length + num.length); return this.mulTo(num, out); }; BN.prototype.mulf = function mulf(num) { var out = new BN(null); out.words = new Array(this.length + num.length); return jumboMulTo(this, num, out); }; BN.prototype.imul = function imul(num) { return this.clone().mulTo(num, this); }; BN.prototype.imuln = function imuln(num) { assert(typeof num === "number"); assert(num < 67108864); var carry = 0; for (var i = 0; i < this.length; i++) { var w = (this.words[i] | 0) * num; var lo = (w & 67108863) + (carry & 67108863); carry >>= 26; carry += (w / 67108864) | 0; carry += lo >>> 26; this.words[i] = lo & 67108863; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.muln = function muln(num) { return this.clone().imuln(num); }; BN.prototype.sqr = function sqr() { return this.mul(this); }; BN.prototype.isqr = function isqr() { return this.imul(this.clone()); }; BN.prototype.pow = function pow(num) { var w = toBitArray(num); if (w.length === 0) return new BN(1); var res = this; for (var i = 0; i < w.length; i++, res = res.sqr()) { if (w[i] !== 0) break; } if (++i < w.length) { for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) { if (w[i] === 0) continue; res = res.mul(q); } } return res; }; BN.prototype.iushln = function iushln(bits) { assert(typeof bits === "number" && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; var carryMask = (67108863 >>> (26 - r)) << (26 - r); var i; if (r !== 0) { var carry = 0; for (i = 0; i < this.length; i++) { var newCarry = this.words[i] & carryMask; var c = ((this.words[i] | 0) - newCarry) << r; this.words[i] = c | carry; carry = newCarry >>> (26 - r); } if (carry) { this.words[i] = carry; this.length++; } } if (s !== 0) { for (i = this.length - 1; i >= 0; i--) { this.words[i + s] = this.words[i]; } for (i = 0; i < s; i++) { this.words[i] = 0; } this.length += s; } return this.strip(); }; BN.prototype.ishln = function ishln(bits) { assert(this.negative === 0); return this.iushln(bits); }; BN.prototype.iushrn = function iushrn(bits, hint, extended) { assert(typeof bits === "number" && bits >= 0); var h; if (hint) { h = (hint - (hint % 26)) / 26; } else { h = 0; } var r = bits % 26; var s = Math.min((bits - r) / 26, this.length); var mask = 67108863 ^ ((67108863 >>> r) << r); var maskedWords = extended; h -= s; h = Math.max(0, h); if (maskedWords) { for (var i = 0; i < s; i++) { maskedWords.words[i] = this.words[i]; } maskedWords.length = s; } if (s === 0) { } else if (this.length > s) { this.length -= s; for (i = 0; i < this.length; i++) { this.words[i] = this.words[i + s]; } } else { this.words[0] = 0; this.length = 1; } var carry = 0; for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) { var word = this.words[i] | 0; this.words[i] = (carry << (26 - r)) | (word >>> r); carry = word & mask; } if (maskedWords && carry !== 0) { maskedWords.words[maskedWords.length++] = carry; } if (this.length === 0) { this.words[0] = 0; this.length = 1; } return this.strip(); }; BN.prototype.ishrn = function ishrn(bits, hint, extended) { assert(this.negative === 0); return this.iushrn(bits, hint, extended); }; BN.prototype.shln = function shln(bits) { return this.clone().ishln(bits); }; BN.prototype.ushln = function ushln(bits) { return this.clone().iushln(bits); }; BN.prototype.shrn = function shrn(bits) { return this.clone().ishrn(bits); }; BN.prototype.ushrn = function ushrn(bits) { return this.clone().iushrn(bits); }; BN.prototype.testn = function testn(bit) { assert(typeof bit === "number" && bit >= 0); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; if (this.length <= s) return false; var w = this.words[s]; return !!(w & q); }; BN.prototype.imaskn = function imaskn(bits) { assert(typeof bits === "number" && bits >= 0); var r = bits % 26; var s = (bits - r) / 26; assert(this.negative === 0, "imaskn works only with positive numbers"); if (this.length <= s) { return this; } if (r !== 0) { s++; } this.length = Math.min(s, this.length); if (r !== 0) { var mask = 67108863 ^ ((67108863 >>> r) << r); this.words[this.length - 1] &= mask; } return this.strip(); }; BN.prototype.maskn = function maskn(bits) { return this.clone().imaskn(bits); }; BN.prototype.iaddn = function iaddn(num) { assert(typeof num === "number"); assert(num < 67108864); if (num < 0) return this.isubn(-num); if (this.negative !== 0) { if (this.length === 1 && (this.words[0] | 0) < num) { this.words[0] = num - (this.words[0] | 0); this.negative = 0; return this; } this.negative = 0; this.isubn(num); this.negative = 1; return this; } return this._iaddn(num); }; BN.prototype._iaddn = function _iaddn(num) { this.words[0] += num; for (var i = 0; i < this.length && this.words[i] >= 67108864; i++) { this.words[i] -= 67108864; if (i === this.length - 1) { this.words[i + 1] = 1; } else { this.words[i + 1]++; } } this.length = Math.max(this.length, i + 1); return this; }; BN.prototype.isubn = function isubn(num) { assert(typeof num === "number"); assert(num < 67108864); if (num < 0) return this.iaddn(-num); if (this.negative !== 0) { this.negative = 0; this.iaddn(num); this.negative = 1; return this; } this.words[0] -= num; if (this.length === 1 && this.words[0] < 0) { this.words[0] = -this.words[0]; this.negative = 1; } else { for (var i = 0; i < this.length && this.words[i] < 0; i++) { this.words[i] += 67108864; this.words[i + 1] -= 1; } } return this.strip(); }; BN.prototype.addn = function addn(num) { return this.clone().iaddn(num); }; BN.prototype.subn = function subn(num) { return this.clone().isubn(num); }; BN.prototype.iabs = function iabs() { this.negative = 0; return this; }; BN.prototype.abs = function abs() { return this.clone().iabs(); }; BN.prototype._ishlnsubmul = function _ishlnsubmul(num, mul, shift) { var len = num.length + shift; var i; this._expand(len); var w; var carry = 0; for (i = 0; i < num.length; i++) { w = (this.words[i + shift] | 0) + carry; var right = (num.words[i] | 0) * mul; w -= right & 67108863; carry = (w >> 26) - ((right / 67108864) | 0); this.words[i + shift] = w & 67108863; } for (; i < this.length - shift; i++) { w = (this.words[i + shift] | 0) + carry; carry = w >> 26; this.words[i + shift] = w & 67108863; } if (carry === 0) return this.strip(); assert(carry === -1); carry = 0; for (i = 0; i < this.length; i++) { w = -(this.words[i] | 0) + carry; carry = w >> 26; this.words[i] = w & 67108863; } this.negative = 1; return this.strip(); }; BN.prototype._wordDiv = function _wordDiv(num, mode) { var shift = this.length - num.length; var a = this.clone(); var b = num; var bhi = b.words[b.length - 1] | 0; var bhiBits = this._countBits(bhi); shift = 26 - bhiBits; if (shift !== 0) { b = b.ushln(shift); a.iushln(shift); bhi = b.words[b.length - 1] | 0; } var m = a.length - b.length; var q; if (mode !== "mod") { q = new BN(null); q.length = m + 1; q.words = new Array(q.length); for (var i = 0; i < q.length; i++) { q.words[i] = 0; } } var diff = a.clone()._ishlnsubmul(b, 1, m); if (diff.negative === 0) { a = diff; if (q) { q.words[m] = 1; } } for (var j = m - 1; j >= 0; j--) { var qj = (a.words[b.length + j] | 0) * 67108864 + (a.words[b.length + j - 1] | 0); qj = Math.min((qj / bhi) | 0, 67108863); a._ishlnsubmul(b, qj, j); while (a.negative !== 0) { qj--; a.negative = 0; a._ishlnsubmul(b, 1, j); if (!a.isZero()) { a.negative ^= 1; } } if (q) { q.words[j] = qj; } } if (q) { q.strip(); } a.strip(); if (mode !== "div" && shift !== 0) { a.iushrn(shift); } return { div: q || null, mod: a, }; }; BN.prototype.divmod = function divmod(num, mode, positive) { assert(!num.isZero()); if (this.isZero()) { return { div: new BN(0), mod: new BN(0), }; } var div, mod, res; if (this.negative !== 0 && num.negative === 0) { res = this.neg().divmod(num, mode); if (mode !== "mod") { div = res.div.neg(); } if (mode !== "div") { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.iadd(num); } } return { div, mod, }; } if (this.negative === 0 && num.negative !== 0) { res = this.divmod(num.neg(), mode); if (mode !== "mod") { div = res.div.neg(); } return { div, mod: res.mod, }; } if ((this.negative & num.negative) !== 0) { res = this.neg().divmod(num.neg(), mode); if (mode !== "div") { mod = res.mod.neg(); if (positive && mod.negative !== 0) { mod.isub(num); } } return { div: res.div, mod, }; } if (num.length > this.length || this.cmp(num) < 0) { return { div: new BN(0), mod: this, }; } if (num.length === 1) { if (mode === "div") { return { div: this.divn(num.words[0]), mod: null, }; } if (mode === "mod") { return { div: null, mod: new BN(this.modn(num.words[0])), }; } return { div: this.divn(num.words[0]), mod: new BN(this.modn(num.words[0])), }; } return this._wordDiv(num, mode); }; BN.prototype.div = function div(num) { return this.divmod(num, "div", false).div; }; BN.prototype.mod = function mod(num) { return this.divmod(num, "mod", false).mod; }; BN.prototype.umod = function umod(num) { return this.divmod(num, "mod", true).mod; }; BN.prototype.divRound = function divRound(num) { var dm = this.divmod(num); if (dm.mod.isZero()) return dm.div; var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod; var half = num.ushrn(1); var r2 = num.andln(1); var cmp = mod.cmp(half); if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div; return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1); }; BN.prototype.modn = function modn(num) { assert(num <= 67108863); var p = (1 << 26) % num; var acc = 0; for (var i = this.length - 1; i >= 0; i--) { acc = (p * acc + (this.words[i] | 0)) % num; } return acc; }; BN.prototype.idivn = function idivn(num) { assert(num <= 67108863); var carry = 0; for (var i = this.length - 1; i >= 0; i--) { var w = (this.words[i] | 0) + carry * 67108864; this.words[i] = (w / num) | 0; carry = w % num; } return this.strip(); }; BN.prototype.divn = function divn(num) { return this.clone().idivn(num); }; BN.prototype.egcd = function egcd(p) { assert(p.negative === 0); assert(!p.isZero()); var x = this; var y = p.clone(); if (x.negative !== 0) { x = x.umod(p); } else { x = x.clone(); } var A = new BN(1); var B = new BN(0); var C = new BN(0); var D = new BN(1); var g = 0; while (x.isEven() && y.isEven()) { x.iushrn(1); y.iushrn(1); ++g; } var yp = y.clone(); var xp = x.clone(); while (!x.isZero()) { for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { x.iushrn(i); while (i-- > 0) { if (A.isOdd() || B.isOdd()) { A.iadd(yp); B.isub(xp); } A.iushrn(1); B.iushrn(1); } } for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { y.iushrn(j); while (j-- > 0) { if (C.isOdd() || D.isOdd()) { C.iadd(yp); D.isub(xp); } C.iushrn(1); D.iushrn(1); } } if (x.cmp(y) >= 0) { x.isub(y); A.isub(C); B.isub(D); } else { y.isub(x); C.isub(A); D.isub(B); } } return { a: C, b: D, gcd: y.iushln(g), }; }; BN.prototype._invmp = function _invmp(p) { assert(p.negative === 0); assert(!p.isZero()); var a = this; var b = p.clone(); if (a.negative !== 0) { a = a.umod(p); } else { a = a.clone(); } var x1 = new BN(1); var x2 = new BN(0); var delta = b.clone(); while (a.cmpn(1) > 0 && b.cmpn(1) > 0) { for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1); if (i > 0) { a.iushrn(i); while (i-- > 0) { if (x1.isOdd()) { x1.iadd(delta); } x1.iushrn(1); } } for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1); if (j > 0) { b.iushrn(j); while (j-- > 0) { if (x2.isOdd()) { x2.iadd(delta); } x2.iushrn(1); } } if (a.cmp(b) >= 0) { a.isub(b); x1.isub(x2); } else { b.isub(a); x2.isub(x1); } } var res; if (a.cmpn(1) === 0) { res = x1; } else { res = x2; } if (res.cmpn(0) < 0) { res.iadd(p); } return res; }; BN.prototype.gcd = function gcd(num) { if (this.isZero()) return num.abs(); if (num.isZero()) return this.abs(); var a = this.clone(); var b = num.clone(); a.negative = 0; b.negative = 0; for (var shift = 0; a.isEven() && b.isEven(); shift++) { a.iushrn(1); b.iushrn(1); } do { while (a.isEven()) { a.iushrn(1); } while (b.isEven()) { b.iushrn(1); } var r = a.cmp(b); if (r < 0) { var t = a; a = b; b = t; } else if (r === 0 || b.cmpn(1) === 0) { break; } a.isub(b); } while (true); return b.iushln(shift); }; BN.prototype.invm = function invm(num) { return this.egcd(num).a.umod(num); }; BN.prototype.isEven = function isEven() { return (this.words[0] & 1) === 0; }; BN.prototype.isOdd = function isOdd() { return (this.words[0] & 1) === 1; }; BN.prototype.andln = function andln(num) { return this.words[0] & num; }; BN.prototype.bincn = function bincn(bit) { assert(typeof bit === "number"); var r = bit % 26; var s = (bit - r) / 26; var q = 1 << r; if (this.length <= s) { this._expand(s + 1); this.words[s] |= q; return this; } var carry = q; for (var i = s; carry !== 0 && i < this.length; i++) { var w = this.words[i] | 0; w += carry; carry = w >>> 26; w &= 67108863; this.words[i] = w; } if (carry !== 0) { this.words[i] = carry; this.length++; } return this; }; BN.prototype.isZero = function isZero() { return this.length === 1 && this.words[0] === 0; }; BN.prototype.cmpn = function cmpn(num) { var negative = num < 0; if (this.negative !== 0 && !negative) return -1; if (this.negative === 0 && negative) return 1; this.strip(); var res; if (this.length > 1) { res = 1; } else { if (negative) { num = -num; } assert(num <= 67108863, "Number is too big"); var w = this.words[0] | 0; res = w === num ? 0 : w < num ? -1 : 1; } if (this.negative !== 0) return -res | 0; return res; }; BN.prototype.cmp = function cmp(num) { if (this.negative !== 0 && num.negative === 0) return -1; if (this.negative === 0 && num.negative !== 0) return 1; var res = this.ucmp(num); if (this.negative !== 0) return -res | 0; return res; }; BN.prototype.ucmp = function ucmp(num) { if (this.length > num.length) return 1; if (this.length < num.length) return -1; var res = 0; for (var i = this.length - 1; i >= 0; i--) { var a = this.words[i] | 0; var b = num.words[i] | 0; if (a === b) continue; if (a < b) { res = -1; } else if (a > b) { res = 1; } break; } return res; }; BN.prototype.gtn = function gtn(num) { return this.cmpn(num) === 1; }; BN.prototype.gt = function gt(num) { return this.cmp(num) === 1; }; BN.prototype.gten = function gten(num) { return this.cmpn(num) >= 0; }; BN.prototype.gte = function gte(num) { return this.cmp(num) >= 0; }; BN.prototype.ltn = function ltn(num) { return this.cmpn(num) === -1; }; BN.prototype.lt = function lt(num) { return this.cmp(num) === -1; }; BN.prototype.lten = function lten(num) { return this.cmpn(num) <= 0; }; BN.prototype.lte = function lte(num) { return this.cmp(num) <= 0; }; BN.prototype.eqn = function eqn(num) { return this.cmpn(num) === 0; }; BN.prototype.eq = function eq(num) { return this.cmp(num) === 0; }; BN.red = function red(num) { return new Red(num); }; BN.prototype.toRed = function toRed(ctx) { assert(!this.red, "Already a number in reduction context"); assert(this.negative === 0, "red works only with positives"); return ctx.convertTo(this)._forceRed(ctx); }; BN.prototype.fromRed = function fromRed() { assert(this.red, "fromRed works only with numbers in reduction context"); return this.red.convertFrom(this); }; BN.prototype._forceRed = function _forceRed(ctx) { this.red = ctx; return this; }; BN.prototype.forceRed = function forceRed(ctx) { assert(!this.red, "Already a number in reduction context"); return this._forceRed(ctx); }; BN.prototype.redAdd = function redAdd(num) { assert(this.red, "redAdd works only with red numbers"); return this.red.add(this, num); }; BN.prototype.redIAdd = function redIAdd(num) { assert(this.red, "redIAdd works only with red numbers"); return this.red.iadd(this, num); }; BN.prototype.redSub = function redSub(num) { assert(this.red, "redSub works only with red numbers"); return this.red.sub(this, num); }; BN.prototype.redISub = function redISub(num) { assert(this.red, "redISub works only with red numbers"); return this.red.isub(this, num); }; BN.prototype.redShl = function redShl(num) { assert(this.red, "redShl works only with red numbers"); return this.red.shl(this, num); }; BN.prototype.redMul = function redMul(num) { assert(this.red, "redMul works only with red numbers"); this.red._verify2(this, num); return this.red.mul(this, num); }; BN.prototype.redIMul = function redIMul(num) { assert(this.red, "redMul works only with red numbers"); this.red._verify2(this, num); return this.red.imul(this, num); }; BN.prototype.redSqr = function redSqr() { assert(this.red, "redSqr works only with red numbers"); this.red._verify1(this); return this.red.sqr(this); }; BN.prototype.redISqr = function redISqr() { assert(this.red, "redISqr works only with red numbers"); this.red._verify1(this); return this.red.isqr(this); }; BN.prototype.redSqrt = function redSqrt() { assert(this.red, "redSqrt works only with red numbers"); this.red._verify1(this); return this.red.sqrt(this); }; BN.prototype.redInvm = function redInvm() { assert(this.red, "redInvm works only with red numbers"); this.red._verify1(this); return this.red.invm(this); }; BN.prototype.redNeg = function redNeg() { assert(this.red, "redNeg works only with red numbers"); this.red._verify1(this); return this.red.neg(this); }; BN.prototype.redPow = function redPow(num) { assert(this.red && !num.red, "redPow(normalNum)"); this.red._verify1(this); return this.red.pow(this, num); }; var primes = { k256: null, p224: null, p192: null, p25519: null, }; function MPrime(name, p) { this.name = name; this.p = new BN(p, 16); this.n = this.p.bitLength(); this.k = new BN(1).iushln(this.n).isub(this.p); this.tmp = this._tmp(); } MPrime.prototype._tmp = function _tmp() { var tmp = new BN(null); tmp.words = new Array(Math.ceil(this.n / 13)); return tmp; }; MPrime.prototype.ireduce = function ireduce(num) { var r = num; var rlen; do { this.split(r, this.tmp); r = this.imulK(r); r = r.iadd(this.tmp); rlen = r.bitLength(); } while (rlen > this.n); var cmp = rlen < this.n ? -1 : r.ucmp(this.p); if (cmp === 0) { r.words[0] = 0; r.length = 1; } else if (cmp > 0) { r.isub(this.p); } else { if (r.strip !== void 0) { r.strip(); } else { r._strip(); } } return r; }; MPrime.prototype.split = function split(input, out) { input.iushrn(this.n, 0, out); }; MPrime.prototype.imulK = function imulK(num) { return num.imul(this.k); }; function K256() { MPrime.call(this, "k256", "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f"); } inherits(K256, MPrime); K256.prototype.split = function split(input, output) { var mask = 4194303; var outLen = Math.min(input.length, 9); for (var i = 0; i < outLen; i++) { output.words[i] = input.words[i]; } output.length = outLen; if (input.length <= 9) { input.words[0] = 0; input.length = 1; return; } var prev = input.words[9]; output.words[output.length++] = prev & mask; for (i = 10; i < input.length; i++) { var next = input.words[i] | 0; input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22); prev = next; } prev >>>= 22; input.words[i - 10] = prev; if (prev === 0 && input.length > 10) { input.length -= 10; } else { input.length -= 9; } }; K256.prototype.imulK = function imulK(num) { num.words[num.length] = 0; num.words[num.length + 1] = 0; num.length += 2; var lo = 0; for (var i = 0; i < num.length; i++) { var w = num.words[i] | 0; lo += w * 977; num.words[i] = lo & 67108863; lo = w * 64 + ((lo / 67108864) | 0); } if (num.words[num.length - 1] === 0) { num.length--; if (num.words[num.length - 1] === 0) { num.length--; } } return num; }; function P224() { MPrime.call(this, "p224", "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001"); } inherits(P224, MPrime); function P192() { MPrime.call(this, "p192", "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff"); } inherits(P192, MPrime); function P25519() { MPrime.call(this, "25519", "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed"); } inherits(P25519, MPrime); P25519.prototype.imulK = function imulK(num) { var carry = 0; for (var i = 0; i < num.length; i++) { var hi = (num.words[i] | 0) * 19 + carry; var lo = hi & 67108863; hi >>>= 26; num.words[i] = lo; carry = hi; } if (carry !== 0) { num.words[num.length++] = carry; } return num; }; BN._prime = function prime(name) { if (primes[name]) return primes[name]; var prime2; if (name === "k256") { prime2 = new K256(); } else if (name === "p224") { prime2 = new P224(); } else if (name === "p192") { prime2 = new P192(); } else if (name === "p25519") { prime2 = new P25519(); } else { throw new Error("Unknown prime " + name); } primes[name] = prime2; return prime2; }; function Red(m) { if (typeof m === "string") { var prime = BN._prime(m); this.m = prime.p; this.prime = prime; } else { assert(m.gtn(1), "modulus must be greater than 1"); this.m = m; this.prime = null; } } Red.prototype._verify1 = function _verify1(a) { assert(a.negative === 0, "red works only with positives"); assert(a.red, "red works only with red numbers"); }; Red.prototype._verify2 = function _verify2(a, b) { assert((a.negative | b.negative) === 0, "red works only with positives"); assert(a.red && a.red === b.red, "red works only with red numbers"); }; Red.prototype.imod = function imod(a) { if (this.prime) return this.prime.ireduce(a)._forceRed(this); return a.umod(this.m)._forceRed(this); }; Red.prototype.neg = function neg(a) { if (a.isZero()) { return a.clone(); } return this.m.sub(a)._forceRed(this); }; Red.prototype.add = function add(a, b) { this._verify2(a, b); var res = a.add(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res._forceRed(this); }; Red.prototype.iadd = function iadd(a, b) { this._verify2(a, b); var res = a.iadd(b); if (res.cmp(this.m) >= 0) { res.isub(this.m); } return res; }; Red.prototype.sub = function sub(a, b) { this._verify2(a, b); var res = a.sub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res._forceRed(this); }; Red.prototype.isub = function isub(a, b) { this._verify2(a, b); var res = a.isub(b); if (res.cmpn(0) < 0) { res.iadd(this.m); } return res; }; Red.prototype.shl = function shl(a, num) { this._verify1(a); return this.imod(a.ushln(num)); }; Red.prototype.imul = function imul(a, b) { this._verify2(a, b); return this.imod(a.imul(b)); }; Red.prototype.mul = function mul(a, b) { this._verify2(a, b); return this.imod(a.mul(b)); }; Red.prototype.isqr = function isqr(a) { return this.imul(a, a.clone()); }; Red.prototype.sqr = function sqr(a) { return this.mul(a, a); }; Red.prototype.sqrt = function sqrt(a) { if (a.isZero()) return a.clone(); var mod3 = this.m.andln(3); assert(mod3 % 2 === 1); if (mod3 === 3) { var pow = this.m.add(new BN(1)).iushrn(2); return this.pow(a, pow); } var q = this.m.subn(1); var s = 0; while (!q.isZero() && q.andln(1) === 0) { s++; q.iushrn(1); } assert(!q.isZero()); var one = new BN(1).toRed(this); var nOne = one.redNeg(); var lpow = this.m.subn(1).iushrn(1); var z = this.m.bitLength(); z = new BN(2 * z * z).toRed(this); while (this.pow(z, lpow).cmp(nOne) !== 0) { z.redIAdd(nOne); } var c = this.pow(z, q); var r = this.pow(a, q.addn(1).iushrn(1)); var t = this.pow(a, q); var m = s; while (t.cmp(one) !== 0) { var tmp = t; for (var i = 0; tmp.cmp(one) !== 0; i++) { tmp = tmp.redSqr(); } assert(i < m); var b = this.pow(c, new BN(1).iushln(m - i - 1)); r = r.redMul(b); c = b.redSqr(); t = t.redMul(c); m = i; } return r; }; Red.prototype.invm = function invm(a) { var inv = a._invmp(this.m); if (inv.negative !== 0) { inv.negative = 0; return this.imod(inv).redNeg(); } else { return this.imod(inv); } }; Red.prototype.pow = function pow(a, num) { if (num.isZero()) return new BN(1).toRed(this); if (num.cmpn(1) === 0) return a.clone(); var windowSize = 4; var wnd = new Array(1 << windowSize); wnd[0] = new BN(1).toRed(this); wnd[1] = a; for (var i = 2; i < wnd.length; i++) { wnd[i] = this.mul(wnd[i - 1], a); } var res = wnd[0]; var current = 0; var currentLen = 0; var start = num.bitLength() % 26; if (start === 0) { start = 26; } for (i = num.length - 1; i >= 0; i--) { var word = num.words[i]; for (var j = start - 1; j >= 0; j--) { var bit = (word >> j) & 1; if (res !== wnd[0]) { res = this.sqr(res); } if (bit === 0 && current === 0) { currentLen = 0; continue; } current <<= 1; current |= bit; currentLen++; if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue; res = this.mul(res, wnd[current]); currentLen = 0; current = 0; } start = 26; } return res; }; Red.prototype.convertTo = function convertTo(num) { var r = num.umod(this.m); return r === num ? r.clone() : r; }; Red.prototype.convertFrom = function convertFrom(num) { var res = num.clone(); res.red = null; return res; }; BN.mont = function mont(num) { return new Mont(num); }; function Mont(m) { Red.call(this, m); this.shift = this.m.bitLength(); if (this.shift % 26 !== 0) { this.shift += 26 - (this.shift % 26); } this.r = new BN(1).iushln(this.shift); this.r2 = this.imod(this.r.sqr()); this.rinv = this.r._invmp(this.m); this.minv = this.rinv.mul(this.r).isubn(1).div(this.m); this.minv = this.minv.umod(this.r); this.minv = this.r.sub(this.minv); } inherits(Mont, Red); Mont.prototype.convertTo = function convertTo(num) { return this.imod(num.ushln(this.shift)); }; Mont.prototype.convertFrom = function convertFrom(num) { var r = this.imod(num.mul(this.rinv)); r.red = null; return r; }; Mont.prototype.imul = function imul(a, b) { if (a.isZero() || b.isZero()) { a.words[0] = 0; a.length = 1; return a; } var t = a.imul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.mul = function mul(a, b) { if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this); var t = a.mul(b); var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m); var u = t.isub(c).iushrn(this.shift); var res = u; if (u.cmp(this.m) >= 0) { res = u.isub(this.m); } else if (u.cmpn(0) < 0) { res = u.iadd(this.m); } return res._forceRed(this); }; Mont.prototype.invm = function invm(a) { var res = this.imod(a._invmp(this.m).mul(this.r2)); return res._forceRed(this); }; })(typeof module === "undefined" || module, exports); }, }); // ../../node_modules/minimalistic-assert/index.js var require_minimalistic_assert = __commonJS({ "../../node_modules/minimalistic-assert/index.js"(exports, module) { module.exports = assert; function assert(val, msg) { if (!val) throw new Error(msg || "Assertion failed"); } assert.equal = function assertEqual(l, r, msg) { if (l != r) throw new Error(msg || "Assertion failed: " + l + " != " + r); }; }, }); // ../../node_modules/minimalistic-crypto-utils/lib/utils.js var require_utils = __commonJS({ "../../node_modules/minimalistic-crypto-utils/lib/utils.js"(exports) { "use strict"; var utils = exports; function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg !== "string") { for (var i = 0; i < msg.length; i++) res[i] = msg[i] | 0; return res; } if (enc === "hex") { msg = msg.replace(/[^a-z0-9]+/gi, ""); if (msg.length % 2 !== 0) msg = "0" + msg; for (var i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } else { for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); var hi = c >> 8; var lo = c & 255; if (hi) res.push(hi, lo); else res.push(lo); } } return res; } utils.toArray = toArray; function zero2(word) { if (word.length === 1) return "0" + word; else return word; } utils.zero2 = zero2; function toHex(msg) { var res = ""; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } utils.toHex = toHex; utils.encode = function encode(arr, enc) { if (enc === "hex") return toHex(arr); else return arr; }; }, }); // ../../node_modules/elliptic/lib/elliptic/utils.js var require_utils2 = __commonJS({ "../../node_modules/elliptic/lib/elliptic/utils.js"(exports) { "use strict"; var utils = exports; var BN = require_bn(); var minAssert = require_minimalistic_assert(); var minUtils = require_utils(); utils.assert = minAssert; utils.toArray = minUtils.toArray; utils.zero2 = minUtils.zero2; utils.toHex = minUtils.toHex; utils.encode = minUtils.encode; function getNAF(num, w, bits) { var naf = new Array(Math.max(num.bitLength(), bits) + 1); var i; for (i = 0; i < naf.length; i += 1) { naf[i] = 0; } var ws = 1 << (w + 1); var k = num.clone(); for (i = 0; i < naf.length; i++) { var z; var mod = k.andln(ws - 1); if (k.isOdd()) { if (mod > (ws >> 1) - 1) z = (ws >> 1) - mod; else z = mod; k.isubn(z); } else { z = 0; } naf[i] = z; k.iushrn(1); } return naf; } utils.getNAF = getNAF; function getJSF(k1, k2) { var jsf = [[], []]; k1 = k1.clone(); k2 = k2.clone(); var d1 = 0; var d2 = 0; var m8; while (k1.cmpn(-d1) > 0 || k2.cmpn(-d2) > 0) { var m14 = (k1.andln(3) + d1) & 3; var m24 = (k2.andln(3) + d2) & 3; if (m14 === 3) m14 = -1; if (m24 === 3) m24 = -1; var u1; if ((m14 & 1) === 0) { u1 = 0; } else { m8 = (k1.andln(7) + d1) & 7; if ((m8 === 3 || m8 === 5) && m24 === 2) u1 = -m14; else u1 = m14; } jsf[0].push(u1); var u2; if ((m24 & 1) === 0) { u2 = 0; } else { m8 = (k2.andln(7) + d2) & 7; if ((m8 === 3 || m8 === 5) && m14 === 2) u2 = -m24; else u2 = m24; } jsf[1].push(u2); if (2 * d1 === u1 + 1) d1 = 1 - d1; if (2 * d2 === u2 + 1) d2 = 1 - d2; k1.iushrn(1); k2.iushrn(1); } return jsf; } utils.getJSF = getJSF; function cachedProperty(obj, name, computer) { var key = "_" + name; obj.prototype[name] = function cachedProperty2() { return this[key] !== void 0 ? this[key] : (this[key] = computer.call(this)); }; } utils.cachedProperty = cachedProperty; function parseBytes(bytes) { return typeof bytes === "string" ? utils.toArray(bytes, "hex") : bytes; } utils.parseBytes = parseBytes; function intFromLE(bytes) { return new BN(bytes, "hex", "le"); } utils.intFromLE = intFromLE; }, }); // (disabled):crypto var require_crypto = __commonJS({ "(disabled):crypto"() {}, }); // ../../node_modules/brorand/index.js var require_brorand = __commonJS({ "../../node_modules/brorand/index.js"(exports, module) { var r; module.exports = function rand(len) { if (!r) r = new Rand(null); return r.generate(len); }; function Rand(rand) { this.rand = rand; } module.exports.Rand = Rand; Rand.prototype.generate = function generate(len) { return this._rand(len); }; Rand.prototype._rand = function _rand(n) { if (this.rand.getBytes) return this.rand.getBytes(n); var res = new Uint8Array(n); for (var i = 0; i < res.length; i++) res[i] = this.rand.getByte(); return res; }; if (typeof self === "object") { if (self.crypto && self.crypto.getRandomValues) { Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); self.crypto.getRandomValues(arr); return arr; }; } else if (self.msCrypto && self.msCrypto.getRandomValues) { Rand.prototype._rand = function _rand(n) { var arr = new Uint8Array(n); self.msCrypto.getRandomValues(arr); return arr; }; } else if (typeof window === "object") { Rand.prototype._rand = function () { throw new Error("Not implemented yet"); }; } } else { try { crypto = require_crypto(); if (typeof crypto.randomBytes !== "function") throw new Error("Not supported"); Rand.prototype._rand = function _rand(n) { return crypto.randomBytes(n); }; } catch (e) {} } var crypto; }, }); // ../../node_modules/elliptic/lib/elliptic/curve/base.js var require_base = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curve/base.js"(exports, module) { "use strict"; var BN = require_bn(); var utils = require_utils2(); var getNAF = utils.getNAF; var getJSF = utils.getJSF; var assert = utils.assert; function BaseCurve(type, conf) { this.type = type; this.p = new BN(conf.p, 16); this.red = conf.prime ? BN.red(conf.prime) : BN.mont(this.p); this.zero = new BN(0).toRed(this.red); this.one = new BN(1).toRed(this.red); this.two = new BN(2).toRed(this.red); this.n = conf.n && new BN(conf.n, 16); this.g = conf.g && this.pointFromJSON(conf.g, conf.gRed); this._wnafT1 = new Array(4); this._wnafT2 = new Array(4); this._wnafT3 = new Array(4); this._wnafT4 = new Array(4); this._bitLength = this.n ? this.n.bitLength() : 0; var adjustCount = this.n && this.p.div(this.n); if (!adjustCount || adjustCount.cmpn(100) > 0) { this.redN = null; } else { this._maxwellTrick = true; this.redN = this.n.toRed(this.red); } } module.exports = BaseCurve; BaseCurve.prototype.point = function point() { throw new Error("Not implemented"); }; BaseCurve.prototype.validate = function validate() { throw new Error("Not implemented"); }; BaseCurve.prototype._fixedNafMul = function _fixedNafMul(p, k) { assert(p.precomputed); var doubles = p._getDoubles(); var naf = getNAF(k, 1, this._bitLength); var I = (1 << (doubles.step + 1)) - (doubles.step % 2 === 0 ? 2 : 1); I /= 3; var repr = []; var j; var nafW; for (j = 0; j < naf.length; j += doubles.step) { nafW = 0; for (var l = j + doubles.step - 1; l >= j; l--) nafW = (nafW << 1) + naf[l]; repr.push(nafW); } var a = this.jpoint(null, null, null); var b = this.jpoint(null, null, null); for (var i = I; i > 0; i--) { for (j = 0; j < repr.length; j++) { nafW = repr[j]; if (nafW === i) b = b.mixedAdd(doubles.points[j]); else if (nafW === -i) b = b.mixedAdd(doubles.points[j].neg()); } a = a.add(b); } return a.toP(); }; BaseCurve.prototype._wnafMul = function _wnafMul(p, k) { var w = 4; var nafPoints = p._getNAFPoints(w); w = nafPoints.wnd; var wnd = nafPoints.points; var naf = getNAF(k, w, this._bitLength); var acc = this.jpoint(null, null, null); for (var i = naf.length - 1; i >= 0; i--) { for (var l = 0; i >= 0 && naf[i] === 0; i--) l++; if (i >= 0) l++; acc = acc.dblp(l); if (i < 0) break; var z = naf[i]; assert(z !== 0); if (p.type === "affine") { if (z > 0) acc = acc.mixedAdd(wnd[(z - 1) >> 1]); else acc = acc.mixedAdd(wnd[(-z - 1) >> 1].neg()); } else { if (z > 0) acc = acc.add(wnd[(z - 1) >> 1]); else acc = acc.add(wnd[(-z - 1) >> 1].neg()); } } return p.type === "affine" ? acc.toP() : acc; }; BaseCurve.prototype._wnafMulAdd = function _wnafMulAdd(defW, points, coeffs, len, jacobianResult) { var wndWidth = this._wnafT1; var wnd = this._wnafT2; var naf = this._wnafT3; var max = 0; var i; var j; var p; for (i = 0; i < len; i++) { p = points[i]; var nafPoints = p._getNAFPoints(defW); wndWidth[i] = nafPoints.wnd; wnd[i] = nafPoints.points; } for (i = len - 1; i >= 1; i -= 2) { var a = i - 1; var b = i; if (wndWidth[a] !== 1 || wndWidth[b] !== 1) { naf[a] = getNAF(coeffs[a], wndWidth[a], this._bitLength); naf[b] = getNAF(coeffs[b], wndWidth[b], this._bitLength); max = Math.max(naf[a].length, max); max = Math.max(naf[b].length, max); continue; } var comb = [ points[a], /* 1 */ null, /* 3 */ null, /* 5 */ points[b], /* 7 */ ]; if (points[a].y.cmp(points[b].y) === 0) { comb[1] = points[a].add(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } else if (points[a].y.cmp(points[b].y.redNeg()) === 0) { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].add(points[b].neg()); } else { comb[1] = points[a].toJ().mixedAdd(points[b]); comb[2] = points[a].toJ().mixedAdd(points[b].neg()); } var index = [ -3 /* -1 -1 */, -1 /* -1 0 */, -5 /* -1 1 */, -7 /* 0 -1 */, 0 /* 0 0 */, 7 /* 0 1 */, 5 /* 1 -1 */, 1 /* 1 0 */, 3, /* 1 1 */ ]; var jsf = getJSF(coeffs[a], coeffs[b]); max = Math.max(jsf[0].length, max); naf[a] = new Array(max); naf[b] = new Array(max); for (j = 0; j < max; j++) { var ja = jsf[0][j] | 0; var jb = jsf[1][j] | 0; naf[a][j] = index[(ja + 1) * 3 + (jb + 1)]; naf[b][j] = 0; wnd[a] = comb; } } var acc = this.jpoint(null, null, null); var tmp = this._wnafT4; for (i = max; i >= 0; i--) { var k = 0; while (i >= 0) { var zero = true; for (j = 0; j < len; j++) { tmp[j] = naf[j][i] | 0; if (tmp[j] !== 0) zero = false; } if (!zero) break; k++; i--; } if (i >= 0) k++; acc = acc.dblp(k); if (i < 0) break; for (j = 0; j < len; j++) { var z = tmp[j]; p; if (z === 0) continue; else if (z > 0) p = wnd[j][(z - 1) >> 1]; else if (z < 0) p = wnd[j][(-z - 1) >> 1].neg(); if (p.type === "affine") acc = acc.mixedAdd(p); else acc = acc.add(p); } } for (i = 0; i < len; i++) wnd[i] = null; if (jacobianResult) return acc; else return acc.toP(); }; function BasePoint(curve, type) { this.curve = curve; this.type = type; this.precomputed = null; } BaseCurve.BasePoint = BasePoint; BasePoint.prototype.eq = function eq() { throw new Error("Not implemented"); }; BasePoint.prototype.validate = function validate() { return this.curve.validate(this); }; BaseCurve.prototype.decodePoint = function decodePoint(bytes, enc) { bytes = utils.toArray(bytes, enc); var len = this.p.byteLength(); if ((bytes[0] === 4 || bytes[0] === 6 || bytes[0] === 7) && bytes.length - 1 === 2 * len) { if (bytes[0] === 6) assert(bytes[bytes.length - 1] % 2 === 0); else if (bytes[0] === 7) assert(bytes[bytes.length - 1] % 2 === 1); var res = this.point(bytes.slice(1, 1 + len), bytes.slice(1 + len, 1 + 2 * len)); return res; } else if ((bytes[0] === 2 || bytes[0] === 3) && bytes.length - 1 === len) { return this.pointFromX(bytes.slice(1, 1 + len), bytes[0] === 3); } throw new Error("Unknown point format"); }; BasePoint.prototype.encodeCompressed = function encodeCompressed(enc) { return this.encode(enc, true); }; BasePoint.prototype._encode = function _encode(compact) { var len = this.curve.p.byteLength(); var x = this.getX().toArray("be", len); if (compact) return [this.getY().isEven() ? 2 : 3].concat(x); return [4].concat(x, this.getY().toArray("be", len)); }; BasePoint.prototype.encode = function encode(enc, compact) { return utils.encode(this._encode(compact), enc); }; BasePoint.prototype.precompute = function precompute(power) { if (this.precomputed) return this; var precomputed = { doubles: null, naf: null, beta: null, }; precomputed.naf = this._getNAFPoints(8); precomputed.doubles = this._getDoubles(4, power); precomputed.beta = this._getBeta(); this.precomputed = precomputed; return this; }; BasePoint.prototype._hasDoubles = function _hasDoubles(k) { if (!this.precomputed) return false; var doubles = this.precomputed.doubles; if (!doubles) return false; return doubles.points.length >= Math.ceil((k.bitLength() + 1) / doubles.step); }; BasePoint.prototype._getDoubles = function _getDoubles(step, power) { if (this.precomputed && this.precomputed.doubles) return this.precomputed.doubles; var doubles = [this]; var acc = this; for (var i = 0; i < power; i += step) { for (var j = 0; j < step; j++) acc = acc.dbl(); doubles.push(acc); } return { step, points: doubles, }; }; BasePoint.prototype._getNAFPoints = function _getNAFPoints(wnd) { if (this.precomputed && this.precomputed.naf) return this.precomputed.naf; var res = [this]; var max = (1 << wnd) - 1; var dbl = max === 1 ? null : this.dbl(); for (var i = 1; i < max; i++) res[i] = res[i - 1].add(dbl); return { wnd, points: res, }; }; BasePoint.prototype._getBeta = function _getBeta() { return null; }; BasePoint.prototype.dblp = function dblp(k) { var r = this; for (var i = 0; i < k; i++) r = r.dbl(); return r; }; }, }); // ../../node_modules/has-symbols/shams.js var require_shams = __commonJS({ "../../node_modules/has-symbols/shams.js"(exports, module) { "use strict"; module.exports = function hasSymbols() { if (typeof Symbol !== "function" || typeof Object.getOwnPropertySymbols !== "function") { return false; } if (typeof Symbol.iterator === "symbol") { return true; } var obj = {}; var sym = Symbol("test"); var symObj = Object(sym); if (typeof sym === "string") { return false; } if (Object.prototype.toString.call(sym) !== "[object Symbol]") { return false; } if (Object.prototype.toString.call(symObj) !== "[object Symbol]") { return false; } var symVal = 42; obj[sym] = symVal; for (sym in obj) { return false; } if (typeof Object.keys === "function" && Object.keys(obj).length !== 0) { return false; } if (typeof Object.getOwnPropertyNames === "function" && Object.getOwnPropertyNames(obj).length !== 0) { return false; } var syms = Object.getOwnPropertySymbols(obj); if (syms.length !== 1 || syms[0] !== sym) { return false; } if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } if (typeof Object.getOwnPropertyDescriptor === "function") { var descriptor = Object.getOwnPropertyDescriptor(obj, sym); if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } } return true; }; }, }); // ../../node_modules/has-tostringtag/shams.js var require_shams2 = __commonJS({ "../../node_modules/has-tostringtag/shams.js"(exports, module) { "use strict"; var hasSymbols = require_shams(); module.exports = function hasToStringTagShams() { return hasSymbols() && !!Symbol.toStringTag; }; }, }); // ../../node_modules/has-symbols/index.js var require_has_symbols = __commonJS({ "../../node_modules/has-symbols/index.js"(exports, module) { "use strict"; var origSymbol = typeof Symbol !== "undefined" && Symbol; var hasSymbolSham = require_shams(); module.exports = function hasNativeSymbols() { if (typeof origSymbol !== "function") { return false; } if (typeof Symbol !== "function") { return false; } if (typeof origSymbol("foo") !== "symbol") { return false; } if (typeof Symbol("bar") !== "symbol") { return false; } return hasSymbolSham(); }; }, }); // ../../node_modules/is-arguments/node_modules/function-bind/implementation.js var require_implementation = __commonJS({ "../../node_modules/is-arguments/node_modules/function-bind/implementation.js"(exports, module) { "use strict"; var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var funcType = "[object Function]"; module.exports = function bind(that) { var target = this; if (typeof target !== "function" || toStr.call(target) !== funcType) { throw new TypeError(ERROR_MESSAGE + target); } var args = slice.call(arguments, 1); var bound; var binder = function () { if (this instanceof bound) { var result = target.apply(this, args.concat(slice.call(arguments))); if (Object(result) === result) { return result; } return this; } else { return target.apply(that, args.concat(slice.call(arguments))); } }; var boundLength = Math.max(0, target.length - args.length); var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push("$" + i); } bound = Function( "binder", "return function (" + boundArgs.join(",") + "){ return binder.apply(this,arguments); }" )(binder); if (target.prototype) { var Empty = function Empty2() {}; Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; }, }); // ../../node_modules/is-arguments/node_modules/function-bind/index.js var require_function_bind = __commonJS({ "../../node_modules/is-arguments/node_modules/function-bind/index.js"(exports, module) { "use strict"; var implementation = require_implementation(); module.exports = Function.prototype.bind || implementation; }, }); // ../../node_modules/has/node_modules/function-bind/implementation.js var require_implementation2 = __commonJS({ "../../node_modules/has/node_modules/function-bind/implementation.js"(exports, module) { "use strict"; var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var funcType = "[object Function]"; module.exports = function bind(that) { var target = this; if (typeof target !== "function" || toStr.call(target) !== funcType) { throw new TypeError(ERROR_MESSAGE + target); } var args = slice.call(arguments, 1); var bound; var binder = function () { if (this instanceof bound) { var result = target.apply(this, args.concat(slice.call(arguments))); if (Object(result) === result) { return result; } return this; } else { return target.apply(that, args.concat(slice.call(arguments))); } }; var boundLength = Math.max(0, target.length - args.length); var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push("$" + i); } bound = Function( "binder", "return function (" + boundArgs.join(",") + "){ return binder.apply(this,arguments); }" )(binder); if (target.prototype) { var Empty = function Empty2() {}; Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; }, }); // ../../node_modules/has/node_modules/function-bind/index.js var require_function_bind2 = __commonJS({ "../../node_modules/has/node_modules/function-bind/index.js"(exports, module) { "use strict"; var implementation = require_implementation2(); module.exports = Function.prototype.bind || implementation; }, }); // ../../node_modules/has/src/index.js var require_src = __commonJS({ "../../node_modules/has/src/index.js"(exports, module) { "use strict"; var bind = require_function_bind2(); module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); }, }); // ../../node_modules/is-arguments/node_modules/get-intrinsic/index.js var require_get_intrinsic = __commonJS({ "../../node_modules/is-arguments/node_modules/get-intrinsic/index.js"(exports, module) { "use strict"; var undefined2; var $SyntaxError = SyntaxError; var $Function = Function; var $TypeError = TypeError; var getEvalledConstructor = function (expressionSyntax) { try { return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")(); } catch (e) {} }; var $gOPD = Object.getOwnPropertyDescriptor; if ($gOPD) { try { $gOPD({}, ""); } catch (e) { $gOPD = null; } } var throwTypeError = function () { throw new $TypeError(); }; var ThrowTypeError = $gOPD ? (function () { try { arguments.callee; return throwTypeError; } catch (calleeThrows) { try { return $gOPD(arguments, "callee").get; } catch (gOPDthrows) { return throwTypeError; } } })() : throwTypeError; var hasSymbols = require_has_symbols()(); var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; var needsEval = {}; var TypedArray = typeof Uint8Array === "undefined" ? undefined2 : getProto(Uint8Array); var INTRINSICS = { "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, "%Array%": Array, "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, "%ArrayIteratorPrototype%": hasSymbols ? getProto([][Symbol.iterator]()) : undefined2, "%AsyncFromSyncIteratorPrototype%": undefined2, "%AsyncFunction%": needsEval, "%AsyncGenerator%": needsEval, "%AsyncGeneratorFunction%": needsEval, "%AsyncIteratorPrototype%": needsEval, "%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics, "%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt, "%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array, "%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array, "%Boolean%": Boolean, "%DataView%": typeof DataView === "undefined" ? undefined2 : DataView, "%Date%": Date, "%decodeURI%": decodeURI, "%decodeURIComponent%": decodeURIComponent, "%encodeURI%": encodeURI, "%encodeURIComponent%": encodeURIComponent, "%Error%": Error, "%eval%": eval, // eslint-disable-line no-eval "%EvalError%": EvalError, "%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array, "%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array, "%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry, "%Function%": $Function, "%GeneratorFunction%": needsEval, "%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array, "%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array, "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, "%isFinite%": isFinite, "%isNaN%": isNaN, "%IteratorPrototype%": hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined2, "%JSON%": typeof JSON === "object" ? JSON : undefined2, "%Map%": typeof Map === "undefined" ? undefined2 : Map, "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Map()[Symbol.iterator]()), "%Math%": Math, "%Number%": Number, "%Object%": Object, "%parseFloat%": parseFloat, "%parseInt%": parseInt, "%Promise%": typeof Promise === "undefined" ? undefined2 : Promise, "%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy, "%RangeError%": RangeError, "%ReferenceError%": ReferenceError, "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, "%RegExp%": RegExp, "%Set%": typeof Set === "undefined" ? undefined2 : Set, "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Set()[Symbol.iterator]()), "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, "%String%": String, "%StringIteratorPrototype%": hasSymbols ? getProto(""[Symbol.iterator]()) : undefined2, "%Symbol%": hasSymbols ? Symbol : undefined2, "%SyntaxError%": $SyntaxError, "%ThrowTypeError%": ThrowTypeError, "%TypedArray%": TypedArray, "%TypeError%": $TypeError, "%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array, "%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray, "%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array, "%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array, "%URIError%": URIError, "%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap, "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet, }; try { null.error; } catch (e) { errorProto = getProto(getProto(e)); INTRINSICS["%Error.prototype%"] = errorProto; } var errorProto; var doEval = function doEval2(name) { var value; if (name === "%AsyncFunction%") { value = getEvalledConstructor("async function () {}"); } else if (name === "%GeneratorFunction%") { value = getEvalledConstructor("function* () {}"); } else if (name === "%AsyncGeneratorFunction%") { value = getEvalledConstructor("async function* () {}"); } else if (name === "%AsyncGenerator%") { var fn = doEval2("%AsyncGeneratorFunction%"); if (fn) { value = fn.prototype; } } else if (name === "%AsyncIteratorPrototype%") { var gen = doEval2("%AsyncGenerator%"); if (gen) { value = getProto(gen.prototype); } } INTRINSICS[name] = value; return value; }; var LEGACY_ALIASES = { "%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"], "%ArrayPrototype%": ["Array", "prototype"], "%ArrayProto_entries%": ["Array", "prototype", "entries"], "%ArrayProto_forEach%": ["Array", "prototype", "forEach"], "%ArrayProto_keys%": ["Array", "prototype", "keys"], "%ArrayProto_values%": ["Array", "prototype", "values"], "%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"], "%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"], "%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"], "%BooleanPrototype%": ["Boolean", "prototype"], "%DataViewPrototype%": ["DataView", "prototype"], "%DatePrototype%": ["Date", "prototype"], "%ErrorPrototype%": ["Error", "prototype"], "%EvalErrorPrototype%": ["EvalError", "prototype"], "%Float32ArrayPrototype%": ["Float32Array", "prototype"], "%Float64ArrayPrototype%": ["Float64Array", "prototype"], "%FunctionPrototype%": ["Function", "prototype"], "%Generator%": ["GeneratorFunction", "prototype"], "%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"], "%Int8ArrayPrototype%": ["Int8Array", "prototype"], "%Int16ArrayPrototype%": ["Int16Array", "prototype"], "%Int32ArrayPrototype%": ["Int32Array", "prototype"], "%JSONParse%": ["JSON", "parse"], "%JSONStringify%": ["JSON", "stringify"], "%MapPrototype%": ["Map", "prototype"], "%NumberPrototype%": ["Number", "prototype"], "%ObjectPrototype%": ["Object", "prototype"], "%ObjProto_toString%": ["Object", "prototype", "toString"], "%ObjProto_valueOf%": ["Object", "prototype", "valueOf"], "%PromisePrototype%": ["Promise", "prototype"], "%PromiseProto_then%": ["Promise", "prototype", "then"], "%Promise_all%": ["Promise", "all"], "%Promise_reject%": ["Promise", "reject"], "%Promise_resolve%": ["Promise", "resolve"], "%RangeErrorPrototype%": ["RangeError", "prototype"], "%ReferenceErrorPrototype%": ["ReferenceError", "prototype"], "%RegExpPrototype%": ["RegExp", "prototype"], "%SetPrototype%": ["Set", "prototype"], "%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"], "%StringPrototype%": ["String", "prototype"], "%SymbolPrototype%": ["Symbol", "prototype"], "%SyntaxErrorPrototype%": ["SyntaxError", "prototype"], "%TypedArrayPrototype%": ["TypedArray", "prototype"], "%TypeErrorPrototype%": ["TypeError", "prototype"], "%Uint8ArrayPrototype%": ["Uint8Array", "prototype"], "%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"], "%Uint16ArrayPrototype%": ["Uint16Array", "prototype"], "%Uint32ArrayPrototype%": ["Uint32Array", "prototype"], "%URIErrorPrototype%": ["URIError", "prototype"], "%WeakMapPrototype%": ["WeakMap", "prototype"], "%WeakSetPrototype%": ["WeakSet", "prototype"], }; var bind = require_function_bind(); var hasOwn = require_src(); var $concat = bind.call(Function.call, Array.prototype.concat); var $spliceApply = bind.call(Function.apply, Array.prototype.splice); var $replace = bind.call(Function.call, String.prototype.replace); var $strSlice = bind.call(Function.call, String.prototype.slice); var $exec = bind.call(Function.call, RegExp.prototype.exec); var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; var reEscapeChar = /\\(\\)?/g; var stringToPath = function stringToPath2(string) { var first = $strSlice(string, 0, 1); var last = $strSlice(string, -1); if (first === "%" && last !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`"); } else if (last === "%" && first !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`"); } var result = []; $replace(string, rePropName, function (match, number, quote, subString) { result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number || match; }); return result; }; var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) { var intrinsicName = name; var alias; if (hasOwn(LEGACY_ALIASES, intrinsicName)) { alias = LEGACY_ALIASES[intrinsicName]; intrinsicName = "%" + alias[0] + "%"; } if (hasOwn(INTRINSICS, intrinsicName)) { var value = INTRINSICS[intrinsicName]; if (value === needsEval) { value = doEval(intrinsicName); } if (typeof value === "undefined" && !allowMissing) { throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!"); } return { alias, name: intrinsicName, value, }; } throw new $SyntaxError("intrinsic " + name + " does not exist!"); }; module.exports = function GetIntrinsic(name, allowMissing) { if (typeof name !== "string" || name.length === 0) { throw new $TypeError("intrinsic name must be a non-empty string"); } if (arguments.length > 1 && typeof allowMissing !== "boolean") { throw new $TypeError('"allowMissing" argument must be a boolean'); } if ($exec(/^%?[^%]*%?$/, name) === null) { throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name"); } var parts = stringToPath(name); var intrinsicBaseName = parts.length > 0 ? parts[0] : ""; var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing); var intrinsicRealName = intrinsic.name; var value = intrinsic.value; var skipFurtherCaching = false; var alias = intrinsic.alias; if (alias) { intrinsicBaseName = alias[0]; $spliceApply(parts, $concat([0, 1], alias)); } for (var i = 1, isOwn = true; i < parts.length; i += 1) { var part = parts[i]; var first = $strSlice(part, 0, 1); var last = $strSlice(part, -1); if ( (first === '"' || first === "'" || first === "`" || last === '"' || last === "'" || last === "`") && first !== last ) { throw new $SyntaxError("property names with quotes must have matching quotes"); } if (part === "constructor" || !isOwn) { skipFurtherCaching = true; } intrinsicBaseName += "." + part; intrinsicRealName = "%" + intrinsicBaseName + "%"; if (hasOwn(INTRINSICS, intrinsicRealName)) { value = INTRINSICS[intrinsicRealName]; } else if (value != null) { if (!(part in value)) { if (!allowMissing) { throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available."); } return void 0; } if ($gOPD && i + 1 >= parts.length) { var desc = $gOPD(value, part); isOwn = !!desc; if (isOwn && "get" in desc && !("originalValue" in desc.get)) { value = desc.get; } else { value = value[part]; } } else { isOwn = hasOwn(value, part); value = value[part]; } if (isOwn && !skipFurtherCaching) { INTRINSICS[intrinsicRealName] = value; } } } return value; }; }, }); // ../../node_modules/is-arguments/node_modules/call-bind/index.js var require_call_bind = __commonJS({ "../../node_modules/is-arguments/node_modules/call-bind/index.js"(exports, module) { "use strict"; var bind = require_function_bind(); var GetIntrinsic = require_get_intrinsic(); var $apply = GetIntrinsic("%Function.prototype.apply%"); var $call = GetIntrinsic("%Function.prototype.call%"); var $reflectApply = GetIntrinsic("%Reflect.apply%", true) || bind.call($call, $apply); var $gOPD = GetIntrinsic("%Object.getOwnPropertyDescriptor%", true); var $defineProperty = GetIntrinsic("%Object.defineProperty%", true); var $max = GetIntrinsic("%Math.max%"); if ($defineProperty) { try { $defineProperty({}, "a", { value: 1 }); } catch (e) { $defineProperty = null; } } module.exports = function callBind(originalFunction) { var func = $reflectApply(bind, $call, arguments); if ($gOPD && $defineProperty) { var desc = $gOPD(func, "length"); if (desc.configurable) { $defineProperty(func, "length", { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }); } } return func; }; var applyBind = function applyBind2() { return $reflectApply(bind, $apply, arguments); }; if ($defineProperty) { $defineProperty(module.exports, "apply", { value: applyBind }); } else { module.exports.apply = applyBind; } }, }); // ../../node_modules/is-arguments/node_modules/call-bind/callBound.js var require_callBound = __commonJS({ "../../node_modules/is-arguments/node_modules/call-bind/callBound.js"(exports, module) { "use strict"; var GetIntrinsic = require_get_intrinsic(); var callBind = require_call_bind(); var $indexOf = callBind(GetIntrinsic("String.prototype.indexOf")); module.exports = function callBoundIntrinsic(name, allowMissing) { var intrinsic = GetIntrinsic(name, !!allowMissing); if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) { return callBind(intrinsic); } return intrinsic; }; }, }); // ../../node_modules/is-arguments/index.js var require_is_arguments = __commonJS({ "../../node_modules/is-arguments/index.js"(exports, module) { "use strict"; var hasToStringTag = require_shams2()(); var callBound = require_callBound(); var $toString = callBound("Object.prototype.toString"); var isStandardArguments = function isArguments(value) { if (hasToStringTag && value && typeof value === "object" && Symbol.toStringTag in value) { return false; } return $toString(value) === "[object Arguments]"; }; var isLegacyArguments = function isArguments(value) { if (isStandardArguments(value)) { return true; } return ( value !== null && typeof value === "object" && typeof value.length === "number" && value.length >= 0 && $toString(value) !== "[object Array]" && $toString(value.callee) === "[object Function]" ); }; var supportsStandardArguments = (function () { return isStandardArguments(arguments); })(); isStandardArguments.isLegacyArguments = isLegacyArguments; module.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments; }, }); // ../../node_modules/is-generator-function/index.js var require_is_generator_function = __commonJS({ "../../node_modules/is-generator-function/index.js"(exports, module) { "use strict"; var toStr = Object.prototype.toString; var fnToStr = Function.prototype.toString; var isFnRegex = /^\s*(?:function)?\*/; var hasToStringTag = require_shams2()(); var getProto = Object.getPrototypeOf; var getGeneratorFunc = function () { if (!hasToStringTag) { return false; } try { return Function("return function*() {}")(); } catch (e) {} }; var GeneratorFunction; module.exports = function isGeneratorFunction(fn) { if (typeof fn !== "function") { return false; } if (isFnRegex.test(fnToStr.call(fn))) { return true; } if (!hasToStringTag) { var str = toStr.call(fn); return str === "[object GeneratorFunction]"; } if (!getProto) { return false; } if (typeof GeneratorFunction === "undefined") { var generatorFunc = getGeneratorFunc(); GeneratorFunction = generatorFunc ? getProto(generatorFunc) : false; } return getProto(fn) === GeneratorFunction; }; }, }); // ../../node_modules/is-callable/index.js var require_is_callable = __commonJS({ "../../node_modules/is-callable/index.js"(exports, module) { "use strict"; var fnToStr = Function.prototype.toString; var reflectApply = typeof Reflect === "object" && Reflect !== null && Reflect.apply; var badArrayLike; var isCallableMarker; if (typeof reflectApply === "function" && typeof Object.defineProperty === "function") { try { badArrayLike = Object.defineProperty({}, "length", { get: function () { throw isCallableMarker; }, }); isCallableMarker = {}; reflectApply( function () { throw 42; }, null, badArrayLike ); } catch (_) { if (_ !== isCallableMarker) { reflectApply = null; } } } else { reflectApply = null; } var constructorRegex = /^\s*class\b/; var isES6ClassFn = function isES6ClassFunction(value) { try { var fnStr = fnToStr.call(value); return constructorRegex.test(fnStr); } catch (e) { return false; } }; var tryFunctionObject = function tryFunctionToStr(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }; var toStr = Object.prototype.toString; var objectClass = "[object Object]"; var fnClass = "[object Function]"; var genClass = "[object GeneratorFunction]"; var ddaClass = "[object HTMLAllCollection]"; var ddaClass2 = "[object HTML document.all class]"; var ddaClass3 = "[object HTMLCollection]"; var hasToStringTag = typeof Symbol === "function" && !!Symbol.toStringTag; var isIE68 = !(0 in [,]); var isDDA = function isDocumentDotAll() { return false; }; if (typeof document === "object") { all = document.all; if (toStr.call(all) === toStr.call(document.all)) { isDDA = function isDocumentDotAll(value) { if ((isIE68 || !value) && (typeof value === "undefined" || typeof value === "object")) { try { var str = toStr.call(value); return ( (str === ddaClass || str === ddaClass2 || str === ddaClass3 || str === objectClass) && value("") == null ); } catch (e) {} } return false; }; } } var all; module.exports = reflectApply ? function isCallable(value) { if (isDDA(value)) { return true; } if (!value) { return false; } if (typeof value !== "function" && typeof value !== "object") { return false; } try { reflectApply(value, null, badArrayLike); } catch (e) { if (e !== isCallableMarker) { return false; } } return !isES6ClassFn(value) && tryFunctionObject(value); } : function isCallable(value) { if (isDDA(value)) { return true; } if (!value) { return false; } if (typeof value !== "function" && typeof value !== "object") { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = toStr.call(value); if (strClass !== fnClass && strClass !== genClass && !/^\[object HTML/.test(strClass)) { return false; } return tryFunctionObject(value); }; }, }); // ../../node_modules/for-each/index.js var require_for_each = __commonJS({ "../../node_modules/for-each/index.js"(exports, module) { "use strict"; var isCallable = require_is_callable(); var toStr = Object.prototype.toString; var hasOwnProperty = Object.prototype.hasOwnProperty; var forEachArray = function forEachArray2(array, iterator, receiver) { for (var i = 0, len = array.length; i < len; i++) { if (hasOwnProperty.call(array, i)) { if (receiver == null) { iterator(array[i], i, array); } else { iterator.call(receiver, array[i], i, array); } } } }; var forEachString = function forEachString2(string, iterator, receiver) { for (var i = 0, len = string.length; i < len; i++) { if (receiver == null) { iterator(string.charAt(i), i, string); } else { iterator.call(receiver, string.charAt(i), i, string); } } }; var forEachObject = function forEachObject2(object, iterator, receiver) { for (var k in object) { if (hasOwnProperty.call(object, k)) { if (receiver == null) { iterator(object[k], k, object); } else { iterator.call(receiver, object[k], k, object); } } } }; var forEach = function forEach2(list, iterator, thisArg) { if (!isCallable(iterator)) { throw new TypeError("iterator must be a function"); } var receiver; if (arguments.length >= 3) { receiver = thisArg; } if (toStr.call(list) === "[object Array]") { forEachArray(list, iterator, receiver); } else if (typeof list === "string") { forEachString(list, iterator, receiver); } else { forEachObject(list, iterator, receiver); } }; module.exports = forEach; }, }); // ../../node_modules/util/node_modules/available-typed-arrays/index.js var require_available_typed_arrays = __commonJS({ "../../node_modules/util/node_modules/available-typed-arrays/index.js"(exports, module) { "use strict"; var possibleNames = [ "BigInt64Array", "BigUint64Array", "Float32Array", "Float64Array", "Int16Array", "Int32Array", "Int8Array", "Uint16Array", "Uint32Array", "Uint8Array", "Uint8ClampedArray", ]; var g = typeof globalThis === "undefined" ? global : globalThis; module.exports = function availableTypedArrays() { var out = []; for (var i = 0; i < possibleNames.length; i++) { if (typeof g[possibleNames[i]] === "function") { out[out.length] = possibleNames[i]; } } return out; }; }, }); // ../../node_modules/util/node_modules/function-bind/implementation.js var require_implementation3 = __commonJS({ "../../node_modules/util/node_modules/function-bind/implementation.js"(exports, module) { "use strict"; var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var funcType = "[object Function]"; module.exports = function bind(that) { var target = this; if (typeof target !== "function" || toStr.call(target) !== funcType) { throw new TypeError(ERROR_MESSAGE + target); } var args = slice.call(arguments, 1); var bound; var binder = function () { if (this instanceof bound) { var result = target.apply(this, args.concat(slice.call(arguments))); if (Object(result) === result) { return result; } return this; } else { return target.apply(that, args.concat(slice.call(arguments))); } }; var boundLength = Math.max(0, target.length - args.length); var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push("$" + i); } bound = Function( "binder", "return function (" + boundArgs.join(",") + "){ return binder.apply(this,arguments); }" )(binder); if (target.prototype) { var Empty = function Empty2() {}; Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; }, }); // ../../node_modules/util/node_modules/function-bind/index.js var require_function_bind3 = __commonJS({ "../../node_modules/util/node_modules/function-bind/index.js"(exports, module) { "use strict"; var implementation = require_implementation3(); module.exports = Function.prototype.bind || implementation; }, }); // ../../node_modules/util/node_modules/get-intrinsic/index.js var require_get_intrinsic2 = __commonJS({ "../../node_modules/util/node_modules/get-intrinsic/index.js"(exports, module) { "use strict"; var undefined2; var $SyntaxError = SyntaxError; var $Function = Function; var $TypeError = TypeError; var getEvalledConstructor = function (expressionSyntax) { try { return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")(); } catch (e) {} }; var $gOPD = Object.getOwnPropertyDescriptor; if ($gOPD) { try { $gOPD({}, ""); } catch (e) { $gOPD = null; } } var throwTypeError = function () { throw new $TypeError(); }; var ThrowTypeError = $gOPD ? (function () { try { arguments.callee; return throwTypeError; } catch (calleeThrows) { try { return $gOPD(arguments, "callee").get; } catch (gOPDthrows) { return throwTypeError; } } })() : throwTypeError; var hasSymbols = require_has_symbols()(); var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; var needsEval = {}; var TypedArray = typeof Uint8Array === "undefined" ? undefined2 : getProto(Uint8Array); var INTRINSICS = { "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, "%Array%": Array, "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, "%ArrayIteratorPrototype%": hasSymbols ? getProto([][Symbol.iterator]()) : undefined2, "%AsyncFromSyncIteratorPrototype%": undefined2, "%AsyncFunction%": needsEval, "%AsyncGenerator%": needsEval, "%AsyncGeneratorFunction%": needsEval, "%AsyncIteratorPrototype%": needsEval, "%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics, "%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt, "%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array, "%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array, "%Boolean%": Boolean, "%DataView%": typeof DataView === "undefined" ? undefined2 : DataView, "%Date%": Date, "%decodeURI%": decodeURI, "%decodeURIComponent%": decodeURIComponent, "%encodeURI%": encodeURI, "%encodeURIComponent%": encodeURIComponent, "%Error%": Error, "%eval%": eval, // eslint-disable-line no-eval "%EvalError%": EvalError, "%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array, "%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array, "%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry, "%Function%": $Function, "%GeneratorFunction%": needsEval, "%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array, "%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array, "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, "%isFinite%": isFinite, "%isNaN%": isNaN, "%IteratorPrototype%": hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined2, "%JSON%": typeof JSON === "object" ? JSON : undefined2, "%Map%": typeof Map === "undefined" ? undefined2 : Map, "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Map()[Symbol.iterator]()), "%Math%": Math, "%Number%": Number, "%Object%": Object, "%parseFloat%": parseFloat, "%parseInt%": parseInt, "%Promise%": typeof Promise === "undefined" ? undefined2 : Promise, "%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy, "%RangeError%": RangeError, "%ReferenceError%": ReferenceError, "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, "%RegExp%": RegExp, "%Set%": typeof Set === "undefined" ? undefined2 : Set, "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Set()[Symbol.iterator]()), "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, "%String%": String, "%StringIteratorPrototype%": hasSymbols ? getProto(""[Symbol.iterator]()) : undefined2, "%Symbol%": hasSymbols ? Symbol : undefined2, "%SyntaxError%": $SyntaxError, "%ThrowTypeError%": ThrowTypeError, "%TypedArray%": TypedArray, "%TypeError%": $TypeError, "%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array, "%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray, "%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array, "%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array, "%URIError%": URIError, "%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap, "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet, }; try { null.error; } catch (e) { errorProto = getProto(getProto(e)); INTRINSICS["%Error.prototype%"] = errorProto; } var errorProto; var doEval = function doEval2(name) { var value; if (name === "%AsyncFunction%") { value = getEvalledConstructor("async function () {}"); } else if (name === "%GeneratorFunction%") { value = getEvalledConstructor("function* () {}"); } else if (name === "%AsyncGeneratorFunction%") { value = getEvalledConstructor("async function* () {}"); } else if (name === "%AsyncGenerator%") { var fn = doEval2("%AsyncGeneratorFunction%"); if (fn) { value = fn.prototype; } } else if (name === "%AsyncIteratorPrototype%") { var gen = doEval2("%AsyncGenerator%"); if (gen) { value = getProto(gen.prototype); } } INTRINSICS[name] = value; return value; }; var LEGACY_ALIASES = { "%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"], "%ArrayPrototype%": ["Array", "prototype"], "%ArrayProto_entries%": ["Array", "prototype", "entries"], "%ArrayProto_forEach%": ["Array", "prototype", "forEach"], "%ArrayProto_keys%": ["Array", "prototype", "keys"], "%ArrayProto_values%": ["Array", "prototype", "values"], "%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"], "%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"], "%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"], "%BooleanPrototype%": ["Boolean", "prototype"], "%DataViewPrototype%": ["DataView", "prototype"], "%DatePrototype%": ["Date", "prototype"], "%ErrorPrototype%": ["Error", "prototype"], "%EvalErrorPrototype%": ["EvalError", "prototype"], "%Float32ArrayPrototype%": ["Float32Array", "prototype"], "%Float64ArrayPrototype%": ["Float64Array", "prototype"], "%FunctionPrototype%": ["Function", "prototype"], "%Generator%": ["GeneratorFunction", "prototype"], "%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"], "%Int8ArrayPrototype%": ["Int8Array", "prototype"], "%Int16ArrayPrototype%": ["Int16Array", "prototype"], "%Int32ArrayPrototype%": ["Int32Array", "prototype"], "%JSONParse%": ["JSON", "parse"], "%JSONStringify%": ["JSON", "stringify"], "%MapPrototype%": ["Map", "prototype"], "%NumberPrototype%": ["Number", "prototype"], "%ObjectPrototype%": ["Object", "prototype"], "%ObjProto_toString%": ["Object", "prototype", "toString"], "%ObjProto_valueOf%": ["Object", "prototype", "valueOf"], "%PromisePrototype%": ["Promise", "prototype"], "%PromiseProto_then%": ["Promise", "prototype", "then"], "%Promise_all%": ["Promise", "all"], "%Promise_reject%": ["Promise", "reject"], "%Promise_resolve%": ["Promise", "resolve"], "%RangeErrorPrototype%": ["RangeError", "prototype"], "%ReferenceErrorPrototype%": ["ReferenceError", "prototype"], "%RegExpPrototype%": ["RegExp", "prototype"], "%SetPrototype%": ["Set", "prototype"], "%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"], "%StringPrototype%": ["String", "prototype"], "%SymbolPrototype%": ["Symbol", "prototype"], "%SyntaxErrorPrototype%": ["SyntaxError", "prototype"], "%TypedArrayPrototype%": ["TypedArray", "prototype"], "%TypeErrorPrototype%": ["TypeError", "prototype"], "%Uint8ArrayPrototype%": ["Uint8Array", "prototype"], "%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"], "%Uint16ArrayPrototype%": ["Uint16Array", "prototype"], "%Uint32ArrayPrototype%": ["Uint32Array", "prototype"], "%URIErrorPrototype%": ["URIError", "prototype"], "%WeakMapPrototype%": ["WeakMap", "prototype"], "%WeakSetPrototype%": ["WeakSet", "prototype"], }; var bind = require_function_bind3(); var hasOwn = require_src(); var $concat = bind.call(Function.call, Array.prototype.concat); var $spliceApply = bind.call(Function.apply, Array.prototype.splice); var $replace = bind.call(Function.call, String.prototype.replace); var $strSlice = bind.call(Function.call, String.prototype.slice); var $exec = bind.call(Function.call, RegExp.prototype.exec); var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; var reEscapeChar = /\\(\\)?/g; var stringToPath = function stringToPath2(string) { var first = $strSlice(string, 0, 1); var last = $strSlice(string, -1); if (first === "%" && last !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`"); } else if (last === "%" && first !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`"); } var result = []; $replace(string, rePropName, function (match, number, quote, subString) { result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number || match; }); return result; }; var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) { var intrinsicName = name; var alias; if (hasOwn(LEGACY_ALIASES, intrinsicName)) { alias = LEGACY_ALIASES[intrinsicName]; intrinsicName = "%" + alias[0] + "%"; } if (hasOwn(INTRINSICS, intrinsicName)) { var value = INTRINSICS[intrinsicName]; if (value === needsEval) { value = doEval(intrinsicName); } if (typeof value === "undefined" && !allowMissing) { throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!"); } return { alias, name: intrinsicName, value, }; } throw new $SyntaxError("intrinsic " + name + " does not exist!"); }; module.exports = function GetIntrinsic(name, allowMissing) { if (typeof name !== "string" || name.length === 0) { throw new $TypeError("intrinsic name must be a non-empty string"); } if (arguments.length > 1 && typeof allowMissing !== "boolean") { throw new $TypeError('"allowMissing" argument must be a boolean'); } if ($exec(/^%?[^%]*%?$/, name) === null) { throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name"); } var parts = stringToPath(name); var intrinsicBaseName = parts.length > 0 ? parts[0] : ""; var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing); var intrinsicRealName = intrinsic.name; var value = intrinsic.value; var skipFurtherCaching = false; var alias = intrinsic.alias; if (alias) { intrinsicBaseName = alias[0]; $spliceApply(parts, $concat([0, 1], alias)); } for (var i = 1, isOwn = true; i < parts.length; i += 1) { var part = parts[i]; var first = $strSlice(part, 0, 1); var last = $strSlice(part, -1); if ( (first === '"' || first === "'" || first === "`" || last === '"' || last === "'" || last === "`") && first !== last ) { throw new $SyntaxError("property names with quotes must have matching quotes"); } if (part === "constructor" || !isOwn) { skipFurtherCaching = true; } intrinsicBaseName += "." + part; intrinsicRealName = "%" + intrinsicBaseName + "%"; if (hasOwn(INTRINSICS, intrinsicRealName)) { value = INTRINSICS[intrinsicRealName]; } else if (value != null) { if (!(part in value)) { if (!allowMissing) { throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available."); } return void 0; } if ($gOPD && i + 1 >= parts.length) { var desc = $gOPD(value, part); isOwn = !!desc; if (isOwn && "get" in desc && !("originalValue" in desc.get)) { value = desc.get; } else { value = value[part]; } } else { isOwn = hasOwn(value, part); value = value[part]; } if (isOwn && !skipFurtherCaching) { INTRINSICS[intrinsicRealName] = value; } } } return value; }; }, }); // ../../node_modules/util/node_modules/call-bind/index.js var require_call_bind2 = __commonJS({ "../../node_modules/util/node_modules/call-bind/index.js"(exports, module) { "use strict"; var bind = require_function_bind3(); var GetIntrinsic = require_get_intrinsic2(); var $apply = GetIntrinsic("%Function.prototype.apply%"); var $call = GetIntrinsic("%Function.prototype.call%"); var $reflectApply = GetIntrinsic("%Reflect.apply%", true) || bind.call($call, $apply); var $gOPD = GetIntrinsic("%Object.getOwnPropertyDescriptor%", true); var $defineProperty = GetIntrinsic("%Object.defineProperty%", true); var $max = GetIntrinsic("%Math.max%"); if ($defineProperty) { try { $defineProperty({}, "a", { value: 1 }); } catch (e) { $defineProperty = null; } } module.exports = function callBind(originalFunction) { var func = $reflectApply(bind, $call, arguments); if ($gOPD && $defineProperty) { var desc = $gOPD(func, "length"); if (desc.configurable) { $defineProperty(func, "length", { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) }); } } return func; }; var applyBind = function applyBind2() { return $reflectApply(bind, $apply, arguments); }; if ($defineProperty) { $defineProperty(module.exports, "apply", { value: applyBind }); } else { module.exports.apply = applyBind; } }, }); // ../../node_modules/util/node_modules/call-bind/callBound.js var require_callBound2 = __commonJS({ "../../node_modules/util/node_modules/call-bind/callBound.js"(exports, module) { "use strict"; var GetIntrinsic = require_get_intrinsic2(); var callBind = require_call_bind2(); var $indexOf = callBind(GetIntrinsic("String.prototype.indexOf")); module.exports = function callBoundIntrinsic(name, allowMissing) { var intrinsic = GetIntrinsic(name, !!allowMissing); if (typeof intrinsic === "function" && $indexOf(name, ".prototype.") > -1) { return callBind(intrinsic); } return intrinsic; }; }, }); // ../../node_modules/gopd/node_modules/function-bind/implementation.js var require_implementation4 = __commonJS({ "../../node_modules/gopd/node_modules/function-bind/implementation.js"(exports, module) { "use strict"; var ERROR_MESSAGE = "Function.prototype.bind called on incompatible "; var slice = Array.prototype.slice; var toStr = Object.prototype.toString; var funcType = "[object Function]"; module.exports = function bind(that) { var target = this; if (typeof target !== "function" || toStr.call(target) !== funcType) { throw new TypeError(ERROR_MESSAGE + target); } var args = slice.call(arguments, 1); var bound; var binder = function () { if (this instanceof bound) { var result = target.apply(this, args.concat(slice.call(arguments))); if (Object(result) === result) { return result; } return this; } else { return target.apply(that, args.concat(slice.call(arguments))); } }; var boundLength = Math.max(0, target.length - args.length); var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push("$" + i); } bound = Function( "binder", "return function (" + boundArgs.join(",") + "){ return binder.apply(this,arguments); }" )(binder); if (target.prototype) { var Empty = function Empty2() {}; Empty.prototype = target.prototype; bound.prototype = new Empty(); Empty.prototype = null; } return bound; }; }, }); // ../../node_modules/gopd/node_modules/function-bind/index.js var require_function_bind4 = __commonJS({ "../../node_modules/gopd/node_modules/function-bind/index.js"(exports, module) { "use strict"; var implementation = require_implementation4(); module.exports = Function.prototype.bind || implementation; }, }); // ../../node_modules/gopd/node_modules/get-intrinsic/index.js var require_get_intrinsic3 = __commonJS({ "../../node_modules/gopd/node_modules/get-intrinsic/index.js"(exports, module) { "use strict"; var undefined2; var $SyntaxError = SyntaxError; var $Function = Function; var $TypeError = TypeError; var getEvalledConstructor = function (expressionSyntax) { try { return $Function('"use strict"; return (' + expressionSyntax + ").constructor;")(); } catch (e) {} }; var $gOPD = Object.getOwnPropertyDescriptor; if ($gOPD) { try { $gOPD({}, ""); } catch (e) { $gOPD = null; } } var throwTypeError = function () { throw new $TypeError(); }; var ThrowTypeError = $gOPD ? (function () { try { arguments.callee; return throwTypeError; } catch (calleeThrows) { try { return $gOPD(arguments, "callee").get; } catch (gOPDthrows) { return throwTypeError; } } })() : throwTypeError; var hasSymbols = require_has_symbols()(); var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; var needsEval = {}; var TypedArray = typeof Uint8Array === "undefined" ? undefined2 : getProto(Uint8Array); var INTRINSICS = { "%AggregateError%": typeof AggregateError === "undefined" ? undefined2 : AggregateError, "%Array%": Array, "%ArrayBuffer%": typeof ArrayBuffer === "undefined" ? undefined2 : ArrayBuffer, "%ArrayIteratorPrototype%": hasSymbols ? getProto([][Symbol.iterator]()) : undefined2, "%AsyncFromSyncIteratorPrototype%": undefined2, "%AsyncFunction%": needsEval, "%AsyncGenerator%": needsEval, "%AsyncGeneratorFunction%": needsEval, "%AsyncIteratorPrototype%": needsEval, "%Atomics%": typeof Atomics === "undefined" ? undefined2 : Atomics, "%BigInt%": typeof BigInt === "undefined" ? undefined2 : BigInt, "%BigInt64Array%": typeof BigInt64Array === "undefined" ? undefined2 : BigInt64Array, "%BigUint64Array%": typeof BigUint64Array === "undefined" ? undefined2 : BigUint64Array, "%Boolean%": Boolean, "%DataView%": typeof DataView === "undefined" ? undefined2 : DataView, "%Date%": Date, "%decodeURI%": decodeURI, "%decodeURIComponent%": decodeURIComponent, "%encodeURI%": encodeURI, "%encodeURIComponent%": encodeURIComponent, "%Error%": Error, "%eval%": eval, // eslint-disable-line no-eval "%EvalError%": EvalError, "%Float32Array%": typeof Float32Array === "undefined" ? undefined2 : Float32Array, "%Float64Array%": typeof Float64Array === "undefined" ? undefined2 : Float64Array, "%FinalizationRegistry%": typeof FinalizationRegistry === "undefined" ? undefined2 : FinalizationRegistry, "%Function%": $Function, "%GeneratorFunction%": needsEval, "%Int8Array%": typeof Int8Array === "undefined" ? undefined2 : Int8Array, "%Int16Array%": typeof Int16Array === "undefined" ? undefined2 : Int16Array, "%Int32Array%": typeof Int32Array === "undefined" ? undefined2 : Int32Array, "%isFinite%": isFinite, "%isNaN%": isNaN, "%IteratorPrototype%": hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined2, "%JSON%": typeof JSON === "object" ? JSON : undefined2, "%Map%": typeof Map === "undefined" ? undefined2 : Map, "%MapIteratorPrototype%": typeof Map === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Map()[Symbol.iterator]()), "%Math%": Math, "%Number%": Number, "%Object%": Object, "%parseFloat%": parseFloat, "%parseInt%": parseInt, "%Promise%": typeof Promise === "undefined" ? undefined2 : Promise, "%Proxy%": typeof Proxy === "undefined" ? undefined2 : Proxy, "%RangeError%": RangeError, "%ReferenceError%": ReferenceError, "%Reflect%": typeof Reflect === "undefined" ? undefined2 : Reflect, "%RegExp%": RegExp, "%Set%": typeof Set === "undefined" ? undefined2 : Set, "%SetIteratorPrototype%": typeof Set === "undefined" || !hasSymbols ? undefined2 : getProto(/* @__PURE__ */ new Set()[Symbol.iterator]()), "%SharedArrayBuffer%": typeof SharedArrayBuffer === "undefined" ? undefined2 : SharedArrayBuffer, "%String%": String, "%StringIteratorPrototype%": hasSymbols ? getProto(""[Symbol.iterator]()) : undefined2, "%Symbol%": hasSymbols ? Symbol : undefined2, "%SyntaxError%": $SyntaxError, "%ThrowTypeError%": ThrowTypeError, "%TypedArray%": TypedArray, "%TypeError%": $TypeError, "%Uint8Array%": typeof Uint8Array === "undefined" ? undefined2 : Uint8Array, "%Uint8ClampedArray%": typeof Uint8ClampedArray === "undefined" ? undefined2 : Uint8ClampedArray, "%Uint16Array%": typeof Uint16Array === "undefined" ? undefined2 : Uint16Array, "%Uint32Array%": typeof Uint32Array === "undefined" ? undefined2 : Uint32Array, "%URIError%": URIError, "%WeakMap%": typeof WeakMap === "undefined" ? undefined2 : WeakMap, "%WeakRef%": typeof WeakRef === "undefined" ? undefined2 : WeakRef, "%WeakSet%": typeof WeakSet === "undefined" ? undefined2 : WeakSet, }; try { null.error; } catch (e) { errorProto = getProto(getProto(e)); INTRINSICS["%Error.prototype%"] = errorProto; } var errorProto; var doEval = function doEval2(name) { var value; if (name === "%AsyncFunction%") { value = getEvalledConstructor("async function () {}"); } else if (name === "%GeneratorFunction%") { value = getEvalledConstructor("function* () {}"); } else if (name === "%AsyncGeneratorFunction%") { value = getEvalledConstructor("async function* () {}"); } else if (name === "%AsyncGenerator%") { var fn = doEval2("%AsyncGeneratorFunction%"); if (fn) { value = fn.prototype; } } else if (name === "%AsyncIteratorPrototype%") { var gen = doEval2("%AsyncGenerator%"); if (gen) { value = getProto(gen.prototype); } } INTRINSICS[name] = value; return value; }; var LEGACY_ALIASES = { "%ArrayBufferPrototype%": ["ArrayBuffer", "prototype"], "%ArrayPrototype%": ["Array", "prototype"], "%ArrayProto_entries%": ["Array", "prototype", "entries"], "%ArrayProto_forEach%": ["Array", "prototype", "forEach"], "%ArrayProto_keys%": ["Array", "prototype", "keys"], "%ArrayProto_values%": ["Array", "prototype", "values"], "%AsyncFunctionPrototype%": ["AsyncFunction", "prototype"], "%AsyncGenerator%": ["AsyncGeneratorFunction", "prototype"], "%AsyncGeneratorPrototype%": ["AsyncGeneratorFunction", "prototype", "prototype"], "%BooleanPrototype%": ["Boolean", "prototype"], "%DataViewPrototype%": ["DataView", "prototype"], "%DatePrototype%": ["Date", "prototype"], "%ErrorPrototype%": ["Error", "prototype"], "%EvalErrorPrototype%": ["EvalError", "prototype"], "%Float32ArrayPrototype%": ["Float32Array", "prototype"], "%Float64ArrayPrototype%": ["Float64Array", "prototype"], "%FunctionPrototype%": ["Function", "prototype"], "%Generator%": ["GeneratorFunction", "prototype"], "%GeneratorPrototype%": ["GeneratorFunction", "prototype", "prototype"], "%Int8ArrayPrototype%": ["Int8Array", "prototype"], "%Int16ArrayPrototype%": ["Int16Array", "prototype"], "%Int32ArrayPrototype%": ["Int32Array", "prototype"], "%JSONParse%": ["JSON", "parse"], "%JSONStringify%": ["JSON", "stringify"], "%MapPrototype%": ["Map", "prototype"], "%NumberPrototype%": ["Number", "prototype"], "%ObjectPrototype%": ["Object", "prototype"], "%ObjProto_toString%": ["Object", "prototype", "toString"], "%ObjProto_valueOf%": ["Object", "prototype", "valueOf"], "%PromisePrototype%": ["Promise", "prototype"], "%PromiseProto_then%": ["Promise", "prototype", "then"], "%Promise_all%": ["Promise", "all"], "%Promise_reject%": ["Promise", "reject"], "%Promise_resolve%": ["Promise", "resolve"], "%RangeErrorPrototype%": ["RangeError", "prototype"], "%ReferenceErrorPrototype%": ["ReferenceError", "prototype"], "%RegExpPrototype%": ["RegExp", "prototype"], "%SetPrototype%": ["Set", "prototype"], "%SharedArrayBufferPrototype%": ["SharedArrayBuffer", "prototype"], "%StringPrototype%": ["String", "prototype"], "%SymbolPrototype%": ["Symbol", "prototype"], "%SyntaxErrorPrototype%": ["SyntaxError", "prototype"], "%TypedArrayPrototype%": ["TypedArray", "prototype"], "%TypeErrorPrototype%": ["TypeError", "prototype"], "%Uint8ArrayPrototype%": ["Uint8Array", "prototype"], "%Uint8ClampedArrayPrototype%": ["Uint8ClampedArray", "prototype"], "%Uint16ArrayPrototype%": ["Uint16Array", "prototype"], "%Uint32ArrayPrototype%": ["Uint32Array", "prototype"], "%URIErrorPrototype%": ["URIError", "prototype"], "%WeakMapPrototype%": ["WeakMap", "prototype"], "%WeakSetPrototype%": ["WeakSet", "prototype"], }; var bind = require_function_bind4(); var hasOwn = require_src(); var $concat = bind.call(Function.call, Array.prototype.concat); var $spliceApply = bind.call(Function.apply, Array.prototype.splice); var $replace = bind.call(Function.call, String.prototype.replace); var $strSlice = bind.call(Function.call, String.prototype.slice); var $exec = bind.call(Function.call, RegExp.prototype.exec); var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; var reEscapeChar = /\\(\\)?/g; var stringToPath = function stringToPath2(string) { var first = $strSlice(string, 0, 1); var last = $strSlice(string, -1); if (first === "%" && last !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected closing `%`"); } else if (last === "%" && first !== "%") { throw new $SyntaxError("invalid intrinsic syntax, expected opening `%`"); } var result = []; $replace(string, rePropName, function (match, number, quote, subString) { result[result.length] = quote ? $replace(subString, reEscapeChar, "$1") : number || match; }); return result; }; var getBaseIntrinsic = function getBaseIntrinsic2(name, allowMissing) { var intrinsicName = name; var alias; if (hasOwn(LEGACY_ALIASES, intrinsicName)) { alias = LEGACY_ALIASES[intrinsicName]; intrinsicName = "%" + alias[0] + "%"; } if (hasOwn(INTRINSICS, intrinsicName)) { var value = INTRINSICS[intrinsicName]; if (value === needsEval) { value = doEval(intrinsicName); } if (typeof value === "undefined" && !allowMissing) { throw new $TypeError("intrinsic " + name + " exists, but is not available. Please file an issue!"); } return { alias, name: intrinsicName, value, }; } throw new $SyntaxError("intrinsic " + name + " does not exist!"); }; module.exports = function GetIntrinsic(name, allowMissing) { if (typeof name !== "string" || name.length === 0) { throw new $TypeError("intrinsic name must be a non-empty string"); } if (arguments.length > 1 && typeof allowMissing !== "boolean") { throw new $TypeError('"allowMissing" argument must be a boolean'); } if ($exec(/^%?[^%]*%?$/, name) === null) { throw new $SyntaxError("`%` may not be present anywhere but at the beginning and end of the intrinsic name"); } var parts = stringToPath(name); var intrinsicBaseName = parts.length > 0 ? parts[0] : ""; var intrinsic = getBaseIntrinsic("%" + intrinsicBaseName + "%", allowMissing); var intrinsicRealName = intrinsic.name; var value = intrinsic.value; var skipFurtherCaching = false; var alias = intrinsic.alias; if (alias) { intrinsicBaseName = alias[0]; $spliceApply(parts, $concat([0, 1], alias)); } for (var i = 1, isOwn = true; i < parts.length; i += 1) { var part = parts[i]; var first = $strSlice(part, 0, 1); var last = $strSlice(part, -1); if ( (first === '"' || first === "'" || first === "`" || last === '"' || last === "'" || last === "`") && first !== last ) { throw new $SyntaxError("property names with quotes must have matching quotes"); } if (part === "constructor" || !isOwn) { skipFurtherCaching = true; } intrinsicBaseName += "." + part; intrinsicRealName = "%" + intrinsicBaseName + "%"; if (hasOwn(INTRINSICS, intrinsicRealName)) { value = INTRINSICS[intrinsicRealName]; } else if (value != null) { if (!(part in value)) { if (!allowMissing) { throw new $TypeError("base intrinsic for " + name + " exists, but the property is not available."); } return void 0; } if ($gOPD && i + 1 >= parts.length) { var desc = $gOPD(value, part); isOwn = !!desc; if (isOwn && "get" in desc && !("originalValue" in desc.get)) { value = desc.get; } else { value = value[part]; } } else { isOwn = hasOwn(value, part); value = value[part]; } if (isOwn && !skipFurtherCaching) { INTRINSICS[intrinsicRealName] = value; } } } return value; }; }, }); // ../../node_modules/gopd/index.js var require_gopd = __commonJS({ "../../node_modules/gopd/index.js"(exports, module) { "use strict"; var GetIntrinsic = require_get_intrinsic3(); var $gOPD = GetIntrinsic("%Object.getOwnPropertyDescriptor%", true); if ($gOPD) { try { $gOPD([], "length"); } catch (e) { $gOPD = null; } } module.exports = $gOPD; }, }); // ../../node_modules/util/node_modules/is-typed-array/index.js var require_is_typed_array = __commonJS({ "../../node_modules/util/node_modules/is-typed-array/index.js"(exports, module) { "use strict"; var forEach = require_for_each(); var availableTypedArrays = require_available_typed_arrays(); var callBound = require_callBound2(); var $toString = callBound("Object.prototype.toString"); var hasToStringTag = require_shams2()(); var gOPD = require_gopd(); var g = typeof globalThis === "undefined" ? global : globalThis; var typedArrays = availableTypedArrays(); var $indexOf = callBound("Array.prototype.indexOf", true) || function indexOf(array, value) { for (var i = 0; i < array.length; i += 1) { if (array[i] === value) { return i; } } return -1; }; var $slice = callBound("String.prototype.slice"); var toStrTags = {}; var getPrototypeOf = Object.getPrototypeOf; if (hasToStringTag && gOPD && getPrototypeOf) { forEach(typedArrays, function (typedArray) { var arr = new g[typedArray](); if (Symbol.toStringTag in arr) { var proto = getPrototypeOf(arr); var descriptor = gOPD(proto, Symbol.toStringTag); if (!descriptor) { var superProto = getPrototypeOf(proto); descriptor = gOPD(superProto, Symbol.toStringTag); } toStrTags[typedArray] = descriptor.get; } }); } var tryTypedArrays = function tryAllTypedArrays(value) { var anyTrue = false; forEach(toStrTags, function (getter, typedArray) { if (!anyTrue) { try { anyTrue = getter.call(value) === typedArray; } catch (e) {} } }); return anyTrue; }; module.exports = function isTypedArray(value) { if (!value || typeof value !== "object") { return false; } if (!hasToStringTag || !(Symbol.toStringTag in value)) { var tag = $slice($toString(value), 8, -1); return $indexOf(typedArrays, tag) > -1; } if (!gOPD) { return false; } return tryTypedArrays(value); }; }, }); // ../../node_modules/util/node_modules/which-typed-array/index.js var require_which_typed_array = __commonJS({ "../../node_modules/util/node_modules/which-typed-array/index.js"(exports, module) { "use strict"; var forEach = require_for_each(); var availableTypedArrays = require_available_typed_arrays(); var callBound = require_callBound2(); var gOPD = require_gopd(); var $toString = callBound("Object.prototype.toString"); var hasToStringTag = require_shams2()(); var g = typeof globalThis === "undefined" ? global : globalThis; var typedArrays = availableTypedArrays(); var $slice = callBound("String.prototype.slice"); var toStrTags = {}; var getPrototypeOf = Object.getPrototypeOf; if (hasToStringTag && gOPD && getPrototypeOf) { forEach(typedArrays, function (typedArray) { if (typeof g[typedArray] === "function") { var arr = new g[typedArray](); if (Symbol.toStringTag in arr) { var proto = getPrototypeOf(arr); var descriptor = gOPD(proto, Symbol.toStringTag); if (!descriptor) { var superProto = getPrototypeOf(proto); descriptor = gOPD(superProto, Symbol.toStringTag); } toStrTags[typedArray] = descriptor.get; } } }); } var tryTypedArrays = function tryAllTypedArrays(value) { var foundName = false; forEach(toStrTags, function (getter, typedArray) { if (!foundName) { try { var name = getter.call(value); if (name === typedArray) { foundName = name; } } catch (e) {} } }); return foundName; }; var isTypedArray = require_is_typed_array(); module.exports = function whichTypedArray(value) { if (!isTypedArray(value)) { return false; } if (!hasToStringTag || !(Symbol.toStringTag in value)) { return $slice($toString(value), 8, -1); } return tryTypedArrays(value); }; }, }); // ../../node_modules/util/support/types.js var require_types = __commonJS({ "../../node_modules/util/support/types.js"(exports) { "use strict"; var isArgumentsObject = require_is_arguments(); var isGeneratorFunction = require_is_generator_function(); var whichTypedArray = require_which_typed_array(); var isTypedArray = require_is_typed_array(); function uncurryThis(f) { return f.call.bind(f); } var BigIntSupported = typeof BigInt !== "undefined"; var SymbolSupported = typeof Symbol !== "undefined"; var ObjectToString = uncurryThis(Object.prototype.toString); var numberValue = uncurryThis(Number.prototype.valueOf); var stringValue = uncurryThis(String.prototype.valueOf); var booleanValue = uncurryThis(Boolean.prototype.valueOf); if (BigIntSupported) { bigIntValue = uncurryThis(BigInt.prototype.valueOf); } var bigIntValue; if (SymbolSupported) { symbolValue = uncurryThis(Symbol.prototype.valueOf); } var symbolValue; function checkBoxedPrimitive(value, prototypeValueOf) { if (typeof value !== "object") { return false; } try { prototypeValueOf(value); return true; } catch (e) { return false; } } exports.isArgumentsObject = isArgumentsObject; exports.isGeneratorFunction = isGeneratorFunction; exports.isTypedArray = isTypedArray; function isPromise(input) { return ( (typeof Promise !== "undefined" && input instanceof Promise) || (input !== null && typeof input === "object" && typeof input.then === "function" && typeof input.catch === "function") ); } exports.isPromise = isPromise; function isArrayBufferView(value) { if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) { return ArrayBuffer.isView(value); } return isTypedArray(value) || isDataView(value); } exports.isArrayBufferView = isArrayBufferView; function isUint8Array(value) { return whichTypedArray(value) === "Uint8Array"; } exports.isUint8Array = isUint8Array; function isUint8ClampedArray(value) { return whichTypedArray(value) === "Uint8ClampedArray"; } exports.isUint8ClampedArray = isUint8ClampedArray; function isUint16Array(value) { return whichTypedArray(value) === "Uint16Array"; } exports.isUint16Array = isUint16Array; function isUint32Array(value) { return whichTypedArray(value) === "Uint32Array"; } exports.isUint32Array = isUint32Array; function isInt8Array(value) { return whichTypedArray(value) === "Int8Array"; } exports.isInt8Array = isInt8Array; function isInt16Array(value) { return whichTypedArray(value) === "Int16Array"; } exports.isInt16Array = isInt16Array; function isInt32Array(value) { return whichTypedArray(value) === "Int32Array"; } exports.isInt32Array = isInt32Array; function isFloat32Array(value) { return whichTypedArray(value) === "Float32Array"; } exports.isFloat32Array = isFloat32Array; function isFloat64Array(value) { return whichTypedArray(value) === "Float64Array"; } exports.isFloat64Array = isFloat64Array; function isBigInt64Array(value) { return whichTypedArray(value) === "BigInt64Array"; } exports.isBigInt64Array = isBigInt64Array; function isBigUint64Array(value) { return whichTypedArray(value) === "BigUint64Array"; } exports.isBigUint64Array = isBigUint64Array; function isMapToString(value) { return ObjectToString(value) === "[object Map]"; } isMapToString.working = typeof Map !== "undefined" && isMapToString(/* @__PURE__ */ new Map()); function isMap(value) { if (typeof Map === "undefined") { return false; } return isMapToString.working ? isMapToString(value) : value instanceof Map; } exports.isMap = isMap; function isSetToString(value) { return ObjectToString(value) === "[object Set]"; } isSetToString.working = typeof Set !== "undefined" && isSetToString(/* @__PURE__ */ new Set()); function isSet(value) { if (typeof Set === "undefined") { return false; } return isSetToString.working ? isSetToString(value) : value instanceof Set; } exports.isSet = isSet; function isWeakMapToString(value) { return ObjectToString(value) === "[object WeakMap]"; } isWeakMapToString.working = typeof WeakMap !== "undefined" && isWeakMapToString(/* @__PURE__ */ new WeakMap()); function isWeakMap(value) { if (typeof WeakMap === "undefined") { return false; } return isWeakMapToString.working ? isWeakMapToString(value) : value instanceof WeakMap; } exports.isWeakMap = isWeakMap; function isWeakSetToString(value) { return ObjectToString(value) === "[object WeakSet]"; } isWeakSetToString.working = typeof WeakSet !== "undefined" && isWeakSetToString(/* @__PURE__ */ new WeakSet()); function isWeakSet(value) { return isWeakSetToString(value); } exports.isWeakSet = isWeakSet; function isArrayBufferToString(value) { return ObjectToString(value) === "[object ArrayBuffer]"; } isArrayBufferToString.working = typeof ArrayBuffer !== "undefined" && isArrayBufferToString(new ArrayBuffer()); function isArrayBuffer(value) { if (typeof ArrayBuffer === "undefined") { return false; } return isArrayBufferToString.working ? isArrayBufferToString(value) : value instanceof ArrayBuffer; } exports.isArrayBuffer = isArrayBuffer; function isDataViewToString(value) { return ObjectToString(value) === "[object DataView]"; } isDataViewToString.working = typeof ArrayBuffer !== "undefined" && typeof DataView !== "undefined" && isDataViewToString(new DataView(new ArrayBuffer(1), 0, 1)); function isDataView(value) { if (typeof DataView === "undefined") { return false; } return isDataViewToString.working ? isDataViewToString(value) : value instanceof DataView; } exports.isDataView = isDataView; var SharedArrayBufferCopy = typeof SharedArrayBuffer !== "undefined" ? SharedArrayBuffer : void 0; function isSharedArrayBufferToString(value) { return ObjectToString(value) === "[object SharedArrayBuffer]"; } function isSharedArrayBuffer(value) { if (typeof SharedArrayBufferCopy === "undefined") { return false; } if (typeof isSharedArrayBufferToString.working === "undefined") { isSharedArrayBufferToString.working = isSharedArrayBufferToString(new SharedArrayBufferCopy()); } return isSharedArrayBufferToString.working ? isSharedArrayBufferToString(value) : value instanceof SharedArrayBufferCopy; } exports.isSharedArrayBuffer = isSharedArrayBuffer; function isAsyncFunction(value) { return ObjectToString(value) === "[object AsyncFunction]"; } exports.isAsyncFunction = isAsyncFunction; function isMapIterator(value) { return ObjectToString(value) === "[object Map Iterator]"; } exports.isMapIterator = isMapIterator; function isSetIterator(value) { return ObjectToString(value) === "[object Set Iterator]"; } exports.isSetIterator = isSetIterator; function isGeneratorObject(value) { return ObjectToString(value) === "[object Generator]"; } exports.isGeneratorObject = isGeneratorObject; function isWebAssemblyCompiledModule(value) { return ObjectToString(value) === "[object WebAssembly.Module]"; } exports.isWebAssemblyCompiledModule = isWebAssemblyCompiledModule; function isNumberObject(value) { return checkBoxedPrimitive(value, numberValue); } exports.isNumberObject = isNumberObject; function isStringObject(value) { return checkBoxedPrimitive(value, stringValue); } exports.isStringObject = isStringObject; function isBooleanObject(value) { return checkBoxedPrimitive(value, booleanValue); } exports.isBooleanObject = isBooleanObject; function isBigIntObject(value) { return BigIntSupported && checkBoxedPrimitive(value, bigIntValue); } exports.isBigIntObject = isBigIntObject; function isSymbolObject(value) { return SymbolSupported && checkBoxedPrimitive(value, symbolValue); } exports.isSymbolObject = isSymbolObject; function isBoxedPrimitive(value) { return ( isNumberObject(value) || isStringObject(value) || isBooleanObject(value) || isBigIntObject(value) || isSymbolObject(value) ); } exports.isBoxedPrimitive = isBoxedPrimitive; function isAnyArrayBuffer(value) { return typeof Uint8Array !== "undefined" && (isArrayBuffer(value) || isSharedArrayBuffer(value)); } exports.isAnyArrayBuffer = isAnyArrayBuffer; ["isProxy", "isExternal", "isModuleNamespaceObject"].forEach(function (method) { Object.defineProperty(exports, method, { enumerable: false, value: function () { throw new Error(method + " is not supported in userland"); }, }); }); }, }); // ../../node_modules/util/support/isBufferBrowser.js var require_isBufferBrowser = __commonJS({ "../../node_modules/util/support/isBufferBrowser.js"(exports, module) { module.exports = function isBuffer(arg) { return ( arg && typeof arg === "object" && typeof arg.copy === "function" && typeof arg.fill === "function" && typeof arg.readUInt8 === "function" ); }; }, }); // ../../node_modules/util/util.js var require_util = __commonJS({ "../../node_modules/util/util.js"(exports) { var getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors || function getOwnPropertyDescriptors2(obj) { var keys = Object.keys(obj); var descriptors = {}; for (var i = 0; i < keys.length; i++) { descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]); } return descriptors; }; var formatRegExp = /%[sdj%]/g; exports.format = function (f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(" "); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function (x2) { if (x2 === "%%") return "%"; if (i >= len) return x2; switch (x2) { case "%s": return String(args[i++]); case "%d": return Number(args[i++]); case "%j": try { return JSON.stringify(args[i++]); } catch (_) { return "[Circular]"; } default: return x2; } }); for (var x = args[i]; i < len; x = args[++i]) { if (isNull(x) || !isObject(x)) { str += " " + x; } else { str += " " + inspect(x); } } return str; }; exports.deprecate = function (fn, msg) { if (typeof process !== "undefined" && process.noDeprecation === true) { return fn; } if (typeof process === "undefined") { return function () { return exports.deprecate(fn, msg).apply(this, arguments); }; } var warned = false; function deprecated() { if (!warned) { if (process.throwDeprecation) { throw new Error(msg); } else if (process.traceDeprecation) { console.trace(msg); } else { console.error(msg); } warned = true; } return fn.apply(this, arguments); } return deprecated; }; var debugs = {}; var debugEnvRegex = /^$/; if (process.env.NODE_DEBUG) { debugEnv = process.env.NODE_DEBUG; debugEnv = debugEnv .replace(/[|\\{}()[\]^$+?.]/g, "\\$&") .replace(/\*/g, ".*") .replace(/,/g, "$|^") .toUpperCase(); debugEnvRegex = new RegExp("^" + debugEnv + "$", "i"); } var debugEnv; exports.debuglog = function (set) { set = set.toUpperCase(); if (!debugs[set]) { if (debugEnvRegex.test(set)) { var pid = process.pid; debugs[set] = function () { var msg = exports.format.apply(exports, arguments); console.error("%s %d: %s", set, pid, msg); }; } else { debugs[set] = function () {}; } } return debugs[set]; }; function inspect(obj, opts) { var ctx = { seen: [], stylize: stylizeNoColor, }; if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { ctx.showHidden = opts; } else if (opts) { exports._extend(ctx, opts); } if (isUndefined(ctx.showHidden)) ctx.showHidden = false; if (isUndefined(ctx.depth)) ctx.depth = 2; if (isUndefined(ctx.colors)) ctx.colors = false; if (isUndefined(ctx.customInspect)) ctx.customInspect = true; if (ctx.colors) ctx.stylize = stylizeWithColor; return formatValue(ctx, obj, ctx.depth); } exports.inspect = inspect; inspect.colors = { bold: [1, 22], italic: [3, 23], underline: [4, 24], inverse: [7, 27], white: [37, 39], grey: [90, 39], black: [30, 39], blue: [34, 39], cyan: [36, 39], green: [32, 39], magenta: [35, 39], red: [31, 39], yellow: [33, 39], }; inspect.styles = { special: "cyan", number: "yellow", boolean: "yellow", undefined: "grey", null: "bold", string: "green", date: "magenta", // "name": intentionally not styling regexp: "red", }; function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return "\x1B[" + inspect.colors[style][0] + "m" + str + "\x1B[" + inspect.colors[style][1] + "m"; } else { return str; } } function stylizeNoColor(str, styleType) { return str; } function arrayToHash(array) { var hash = {}; array.forEach(function (val, idx) { hash[val] = true; }); return hash; } function formatValue(ctx, value, recurseTimes) { if ( ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value) ) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } if (isError(value) && (keys.indexOf("message") >= 0 || keys.indexOf("description") >= 0)) { return formatError(value); } if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ": " + value.name : ""; return ctx.stylize("[Function" + name + "]", "special"); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), "date"); } if (isError(value)) { return formatError(value); } } var base = "", array = false, braces = ["{", "}"]; if (isArray(value)) { array = true; braces = ["[", "]"]; } if (isFunction(value)) { var n = value.name ? ": " + value.name : ""; base = " [Function" + n + "]"; } if (isRegExp(value)) { base = " " + RegExp.prototype.toString.call(value); } if (isDate(value)) { base = " " + Date.prototype.toUTCString.call(value); } if (isError(value)) { base = " " + formatError(value); } if (keys.length === 0 && (!array || value.length == 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), "regexp"); } else { return ctx.stylize("[Object]", "special"); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function (key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize("undefined", "undefined"); if (isString(value)) { var simple = "'" + JSON.stringify(value).replace(/^"|"$/g, "").replace(/'/g, "\\'").replace(/\\"/g, '"') + "'"; return ctx.stylize(simple, "string"); } if (isNumber(value)) return ctx.stylize("" + value, "number"); if (isBoolean(value)) return ctx.stylize("" + value, "boolean"); if (isNull(value)) return ctx.stylize("null", "null"); } function formatError(value) { return "[" + Error.prototype.toString.call(value) + "]"; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(""); } } keys.forEach(function (key) { if (!key.match(/^\d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; if (desc.get) { if (desc.set) { str = ctx.stylize("[Getter/Setter]", "special"); } else { str = ctx.stylize("[Getter]", "special"); } } else { if (desc.set) { str = ctx.stylize("[Setter]", "special"); } } if (!hasOwnProperty(visibleKeys, key)) { name = "[" + key + "]"; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf("\n") > -1) { if (array) { str = str .split("\n") .map(function (line) { return " " + line; }) .join("\n") .slice(2); } else { str = "\n" + str .split("\n") .map(function (line) { return " " + line; }) .join("\n"); } } } else { str = ctx.stylize("[Circular]", "special"); } } if (isUndefined(name)) { if (array && key.match(/^\d+$/)) { return str; } name = JSON.stringify("" + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.slice(1, -1); name = ctx.stylize(name, "name"); } else { name = name .replace(/'/g, "\\'") .replace(/\\"/g, '"') .replace(/(^"|"$)/g, "'"); name = ctx.stylize(name, "string"); } } return name + ": " + str; } function reduceToSingleString(output, base, braces) { var numLinesEst = 0; var length = output.reduce(function (prev, cur) { numLinesEst++; if (cur.indexOf("\n") >= 0) numLinesEst++; return prev + cur.replace(/\u001b\[\d\d?m/g, "").length + 1; }, 0); if (length > 60) { return braces[0] + (base === "" ? "" : base + "\n ") + " " + output.join(",\n ") + " " + braces[1]; } return braces[0] + base + " " + output.join(", ") + " " + braces[1]; } exports.types = require_types(); function isArray(ar) { return Array.isArray(ar); } exports.isArray = isArray; function isBoolean(arg) { return typeof arg === "boolean"; } exports.isBoolean = isBoolean; function isNull(arg) { return arg === null; } exports.isNull = isNull; function isNullOrUndefined(arg) { return arg == null; } exports.isNullOrUndefined = isNullOrUndefined; function isNumber(arg) { return typeof arg === "number"; } exports.isNumber = isNumber; function isString(arg) { return typeof arg === "string"; } exports.isString = isString; function isSymbol(arg) { return typeof arg === "symbol"; } exports.isSymbol = isSymbol; function isUndefined(arg) { return arg === void 0; } exports.isUndefined = isUndefined; function isRegExp(re) { return isObject(re) && objectToString(re) === "[object RegExp]"; } exports.isRegExp = isRegExp; exports.types.isRegExp = isRegExp; function isObject(arg) { return typeof arg === "object" && arg !== null; } exports.isObject = isObject; function isDate(d) { return isObject(d) && objectToString(d) === "[object Date]"; } exports.isDate = isDate; exports.types.isDate = isDate; function isError(e) { return isObject(e) && (objectToString(e) === "[object Error]" || e instanceof Error); } exports.isError = isError; exports.types.isNativeError = isError; function isFunction(arg) { return typeof arg === "function"; } exports.isFunction = isFunction; function isPrimitive(arg) { return ( arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol typeof arg === "undefined" ); } exports.isPrimitive = isPrimitive; exports.isBuffer = require_isBufferBrowser(); function objectToString(o) { return Object.prototype.toString.call(o); } function pad(n) { return n < 10 ? "0" + n.toString(10) : n.toString(10); } var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; function timestamp() { var d = /* @__PURE__ */ new Date(); var time = [pad(d.getHours()), pad(d.getMinutes()), pad(d.getSeconds())].join(":"); return [d.getDate(), months[d.getMonth()], time].join(" "); } exports.log = function () { console.log("%s - %s", timestamp(), exports.format.apply(exports, arguments)); }; exports.inherits = require_inherits(); exports._extend = function (origin, add) { if (!add || !isObject(add)) return origin; var keys = Object.keys(add); var i = keys.length; while (i--) { origin[keys[i]] = add[keys[i]]; } return origin; }; function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } var kCustomPromisifiedSymbol = typeof Symbol !== "undefined" ? Symbol("util.promisify.custom") : void 0; exports.promisify = function promisify(original) { if (typeof original !== "function") throw new TypeError('The "original" argument must be of type Function'); if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) { var fn = original[kCustomPromisifiedSymbol]; if (typeof fn !== "function") { throw new TypeError('The "util.promisify.custom" argument must be of type Function'); } Object.defineProperty(fn, kCustomPromisifiedSymbol, { value: fn, enumerable: false, writable: false, configurable: true, }); return fn; } function fn() { var promiseResolve, promiseReject; var promise = new Promise(function (resolve, reject) { promiseResolve = resolve; promiseReject = reject; }); var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } args.push(function (err, value) { if (err) { promiseReject(err); } else { promiseResolve(value); } }); try { original.apply(this, args); } catch (err) { promiseReject(err); } return promise; } Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, { value: fn, enumerable: false, writable: false, configurable: true, }); return Object.defineProperties(fn, getOwnPropertyDescriptors(original)); }; exports.promisify.custom = kCustomPromisifiedSymbol; function callbackifyOnRejected(reason, cb) { if (!reason) { var newReason = new Error("Promise was rejected with a falsy value"); newReason.reason = reason; reason = newReason; } return cb(reason); } function callbackify(original) { if (typeof original !== "function") { throw new TypeError('The "original" argument must be of type Function'); } function callbackified() { var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } var maybeCb = args.pop(); if (typeof maybeCb !== "function") { throw new TypeError("The last argument must be of type Function"); } var self2 = this; var cb = function () { return maybeCb.apply(self2, arguments); }; original.apply(this, args).then( function (ret) { process.nextTick(cb.bind(null, null, ret)); }, function (rej) { process.nextTick(callbackifyOnRejected.bind(null, rej, cb)); } ); } Object.setPrototypeOf(callbackified, Object.getPrototypeOf(original)); Object.defineProperties(callbackified, getOwnPropertyDescriptors(original)); return callbackified; } exports.callbackify = callbackify; }, }); // ../../node_modules/inherits/inherits_browser.js var require_inherits_browser = __commonJS({ "../../node_modules/inherits/inherits_browser.js"(exports, module) { if (typeof Object.create === "function") { module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true, }, }); } }; } else { module.exports = function inherits(ctor, superCtor) { if (superCtor) { ctor.super_ = superCtor; var TempCtor = function () {}; TempCtor.prototype = superCtor.prototype; ctor.prototype = new TempCtor(); ctor.prototype.constructor = ctor; } }; } }, }); // ../../node_modules/inherits/inherits.js var require_inherits = __commonJS({ "../../node_modules/inherits/inherits.js"(exports, module) { try { util = require_util(); if (typeof util.inherits !== "function") throw ""; module.exports = util.inherits; } catch (e) { module.exports = require_inherits_browser(); } var util; }, }); // ../../node_modules/elliptic/lib/elliptic/curve/short.js var require_short = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curve/short.js"(exports, module) { "use strict"; var utils = require_utils2(); var BN = require_bn(); var inherits = require_inherits(); var Base = require_base(); var assert = utils.assert; function ShortCurve(conf) { Base.call(this, "short", conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.tinv = this.two.redInvm(); this.zeroA = this.a.fromRed().cmpn(0) === 0; this.threeA = this.a.fromRed().sub(this.p).cmpn(-3) === 0; this.endo = this._getEndomorphism(conf); this._endoWnafT1 = new Array(4); this._endoWnafT2 = new Array(4); } inherits(ShortCurve, Base); module.exports = ShortCurve; ShortCurve.prototype._getEndomorphism = function _getEndomorphism(conf) { if (!this.zeroA || !this.g || !this.n || this.p.modn(3) !== 1) return; var beta; var lambda; if (conf.beta) { beta = new BN(conf.beta, 16).toRed(this.red); } else { var betas = this._getEndoRoots(this.p); beta = betas[0].cmp(betas[1]) < 0 ? betas[0] : betas[1]; beta = beta.toRed(this.red); } if (conf.lambda) { lambda = new BN(conf.lambda, 16); } else { var lambdas = this._getEndoRoots(this.n); if (this.g.mul(lambdas[0]).x.cmp(this.g.x.redMul(beta)) === 0) { lambda = lambdas[0]; } else { lambda = lambdas[1]; assert(this.g.mul(lambda).x.cmp(this.g.x.redMul(beta)) === 0); } } var basis; if (conf.basis) { basis = conf.basis.map(function (vec) { return { a: new BN(vec.a, 16), b: new BN(vec.b, 16), }; }); } else { basis = this._getEndoBasis(lambda); } return { beta, lambda, basis, }; }; ShortCurve.prototype._getEndoRoots = function _getEndoRoots(num) { var red = num === this.p ? this.red : BN.mont(num); var tinv = new BN(2).toRed(red).redInvm(); var ntinv = tinv.redNeg(); var s = new BN(3).toRed(red).redNeg().redSqrt().redMul(tinv); var l1 = ntinv.redAdd(s).fromRed(); var l2 = ntinv.redSub(s).fromRed(); return [l1, l2]; }; ShortCurve.prototype._getEndoBasis = function _getEndoBasis(lambda) { var aprxSqrt = this.n.ushrn(Math.floor(this.n.bitLength() / 2)); var u = lambda; var v = this.n.clone(); var x1 = new BN(1); var y1 = new BN(0); var x2 = new BN(0); var y2 = new BN(1); var a0; var b0; var a1; var b1; var a2; var b2; var prevR; var i = 0; var r; var x; while (u.cmpn(0) !== 0) { var q = v.div(u); r = v.sub(q.mul(u)); x = x2.sub(q.mul(x1)); var y = y2.sub(q.mul(y1)); if (!a1 && r.cmp(aprxSqrt) < 0) { a0 = prevR.neg(); b0 = x1; a1 = r.neg(); b1 = x; } else if (a1 && ++i === 2) { break; } prevR = r; v = u; u = r; x2 = x1; x1 = x; y2 = y1; y1 = y; } a2 = r.neg(); b2 = x; var len1 = a1.sqr().add(b1.sqr()); var len2 = a2.sqr().add(b2.sqr()); if (len2.cmp(len1) >= 0) { a2 = a0; b2 = b0; } if (a1.negative) { a1 = a1.neg(); b1 = b1.neg(); } if (a2.negative) { a2 = a2.neg(); b2 = b2.neg(); } return [ { a: a1, b: b1 }, { a: a2, b: b2 }, ]; }; ShortCurve.prototype._endoSplit = function _endoSplit(k) { var basis = this.endo.basis; var v1 = basis[0]; var v2 = basis[1]; var c1 = v2.b.mul(k).divRound(this.n); var c2 = v1.b.neg().mul(k).divRound(this.n); var p1 = c1.mul(v1.a); var p2 = c2.mul(v2.a); var q1 = c1.mul(v1.b); var q2 = c2.mul(v2.b); var k1 = k.sub(p1).sub(p2); var k2 = q1.add(q2).neg(); return { k1, k2 }; }; ShortCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var y2 = x.redSqr().redMul(x).redIAdd(x.redMul(this.a)).redIAdd(this.b); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error("invalid point"); var isOdd = y.fromRed().isOdd(); if ((odd && !isOdd) || (!odd && isOdd)) y = y.redNeg(); return this.point(x, y); }; ShortCurve.prototype.validate = function validate(point) { if (point.inf) return true; var x = point.x; var y = point.y; var ax = this.a.redMul(x); var rhs = x.redSqr().redMul(x).redIAdd(ax).redIAdd(this.b); return y.redSqr().redISub(rhs).cmpn(0) === 0; }; ShortCurve.prototype._endoWnafMulAdd = function _endoWnafMulAdd(points, coeffs, jacobianResult) { var npoints = this._endoWnafT1; var ncoeffs = this._endoWnafT2; for (var i = 0; i < points.length; i++) { var split = this._endoSplit(coeffs[i]); var p = points[i]; var beta = p._getBeta(); if (split.k1.negative) { split.k1.ineg(); p = p.neg(true); } if (split.k2.negative) { split.k2.ineg(); beta = beta.neg(true); } npoints[i * 2] = p; npoints[i * 2 + 1] = beta; ncoeffs[i * 2] = split.k1; ncoeffs[i * 2 + 1] = split.k2; } var res = this._wnafMulAdd(1, npoints, ncoeffs, i * 2, jacobianResult); for (var j = 0; j < i * 2; j++) { npoints[j] = null; ncoeffs[j] = null; } return res; }; function Point(curve, x, y, isRed) { Base.BasePoint.call(this, curve, "affine"); if (x === null && y === null) { this.x = null; this.y = null; this.inf = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); if (isRed) { this.x.forceRed(this.curve.red); this.y.forceRed(this.curve.red); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); this.inf = false; } } inherits(Point, Base.BasePoint); ShortCurve.prototype.point = function point(x, y, isRed) { return new Point(this, x, y, isRed); }; ShortCurve.prototype.pointFromJSON = function pointFromJSON(obj, red) { return Point.fromJSON(this, obj, red); }; Point.prototype._getBeta = function _getBeta() { if (!this.curve.endo) return; var pre = this.precomputed; if (pre && pre.beta) return pre.beta; var beta = this.curve.point(this.x.redMul(this.curve.endo.beta), this.y); if (pre) { var curve = this.curve; var endoMul = function (p) { return curve.point(p.x.redMul(curve.endo.beta), p.y); }; pre.beta = beta; beta.precomputed = { beta: null, naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(endoMul), }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(endoMul), }, }; } return beta; }; Point.prototype.toJSON = function toJSON() { if (!this.precomputed) return [this.x, this.y]; return [ this.x, this.y, this.precomputed && { doubles: this.precomputed.doubles && { step: this.precomputed.doubles.step, points: this.precomputed.doubles.points.slice(1), }, naf: this.precomputed.naf && { wnd: this.precomputed.naf.wnd, points: this.precomputed.naf.points.slice(1), }, }, ]; }; Point.fromJSON = function fromJSON(curve, obj, red) { if (typeof obj === "string") obj = JSON.parse(obj); var res = curve.point(obj[0], obj[1], red); if (!obj[2]) return res; function obj2point(obj2) { return curve.point(obj2[0], obj2[1], red); } var pre = obj[2]; res.precomputed = { beta: null, doubles: pre.doubles && { step: pre.doubles.step, points: [res].concat(pre.doubles.points.map(obj2point)), }, naf: pre.naf && { wnd: pre.naf.wnd, points: [res].concat(pre.naf.points.map(obj2point)), }, }; return res; }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ""; return ""; }; Point.prototype.isInfinity = function isInfinity() { return this.inf; }; Point.prototype.add = function add(p) { if (this.inf) return p; if (p.inf) return this; if (this.eq(p)) return this.dbl(); if (this.neg().eq(p)) return this.curve.point(null, null); if (this.x.cmp(p.x) === 0) return this.curve.point(null, null); var c = this.y.redSub(p.y); if (c.cmpn(0) !== 0) c = c.redMul(this.x.redSub(p.x).redInvm()); var nx = c.redSqr().redISub(this.x).redISub(p.x); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.dbl = function dbl() { if (this.inf) return this; var ys1 = this.y.redAdd(this.y); if (ys1.cmpn(0) === 0) return this.curve.point(null, null); var a = this.curve.a; var x2 = this.x.redSqr(); var dyinv = ys1.redInvm(); var c = x2.redAdd(x2).redIAdd(x2).redIAdd(a).redMul(dyinv); var nx = c.redSqr().redISub(this.x.redAdd(this.x)); var ny = c.redMul(this.x.redSub(nx)).redISub(this.y); return this.curve.point(nx, ny); }; Point.prototype.getX = function getX() { return this.x.fromRed(); }; Point.prototype.getY = function getY() { return this.y.fromRed(); }; Point.prototype.mul = function mul(k) { k = new BN(k, 16); if (this.isInfinity()) return this; else if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else if (this.curve.endo) return this.curve._endoWnafMulAdd([this], [k]); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p2, k2) { var points = [this, p2]; var coeffs = [k1, k2]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs); else return this.curve._wnafMulAdd(1, points, coeffs, 2); }; Point.prototype.jmulAdd = function jmulAdd(k1, p2, k2) { var points = [this, p2]; var coeffs = [k1, k2]; if (this.curve.endo) return this.curve._endoWnafMulAdd(points, coeffs, true); else return this.curve._wnafMulAdd(1, points, coeffs, 2, true); }; Point.prototype.eq = function eq(p) { return this === p || (this.inf === p.inf && (this.inf || (this.x.cmp(p.x) === 0 && this.y.cmp(p.y) === 0))); }; Point.prototype.neg = function neg(_precompute) { if (this.inf) return this; var res = this.curve.point(this.x, this.y.redNeg()); if (_precompute && this.precomputed) { var pre = this.precomputed; var negate = function (p) { return p.neg(); }; res.precomputed = { naf: pre.naf && { wnd: pre.naf.wnd, points: pre.naf.points.map(negate), }, doubles: pre.doubles && { step: pre.doubles.step, points: pre.doubles.points.map(negate), }, }; } return res; }; Point.prototype.toJ = function toJ() { if (this.inf) return this.curve.jpoint(null, null, null); var res = this.curve.jpoint(this.x, this.y, this.curve.one); return res; }; function JPoint(curve, x, y, z) { Base.BasePoint.call(this, curve, "jacobian"); if (x === null && y === null && z === null) { this.x = this.curve.one; this.y = this.curve.one; this.z = new BN(0); } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = new BN(z, 16); } if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); this.zOne = this.z === this.curve.one; } inherits(JPoint, Base.BasePoint); ShortCurve.prototype.jpoint = function jpoint(x, y, z) { return new JPoint(this, x, y, z); }; JPoint.prototype.toP = function toP() { if (this.isInfinity()) return this.curve.point(null, null); var zinv = this.z.redInvm(); var zinv2 = zinv.redSqr(); var ax = this.x.redMul(zinv2); var ay = this.y.redMul(zinv2).redMul(zinv); return this.curve.point(ax, ay); }; JPoint.prototype.neg = function neg() { return this.curve.jpoint(this.x, this.y.redNeg(), this.z); }; JPoint.prototype.add = function add(p) { if (this.isInfinity()) return p; if (p.isInfinity()) return this; var pz2 = p.z.redSqr(); var z2 = this.z.redSqr(); var u1 = this.x.redMul(pz2); var u2 = p.x.redMul(z2); var s1 = this.y.redMul(pz2.redMul(p.z)); var s2 = p.y.redMul(z2.redMul(this.z)); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(p.z).redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mixedAdd = function mixedAdd(p) { if (this.isInfinity()) return p.toJ(); if (p.isInfinity()) return this; var z2 = this.z.redSqr(); var u1 = this.x; var u2 = p.x.redMul(z2); var s1 = this.y; var s2 = p.y.redMul(z2).redMul(this.z); var h = u1.redSub(u2); var r = s1.redSub(s2); if (h.cmpn(0) === 0) { if (r.cmpn(0) !== 0) return this.curve.jpoint(null, null, null); else return this.dbl(); } var h2 = h.redSqr(); var h3 = h2.redMul(h); var v = u1.redMul(h2); var nx = r.redSqr().redIAdd(h3).redISub(v).redISub(v); var ny = r.redMul(v.redISub(nx)).redISub(s1.redMul(h3)); var nz = this.z.redMul(h); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.dblp = function dblp(pow) { if (pow === 0) return this; if (this.isInfinity()) return this; if (!pow) return this.dbl(); var i; if (this.curve.zeroA || this.curve.threeA) { var r = this; for (i = 0; i < pow; i++) r = r.dbl(); return r; } var a = this.curve.a; var tinv = this.curve.tinv; var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); var jyd = jy.redAdd(jy); for (i = 0; i < pow; i++) { var jx2 = jx.redSqr(); var jyd2 = jyd.redSqr(); var jyd4 = jyd2.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var t1 = jx.redMul(jyd2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var dny = c.redMul(t2); dny = dny.redIAdd(dny).redISub(jyd4); var nz = jyd.redMul(jz); if (i + 1 < pow) jz4 = jz4.redMul(jyd4); jx = nx; jz = nz; jyd = dny; } return this.curve.jpoint(jx, jyd.redMul(tinv), jz); }; JPoint.prototype.dbl = function dbl() { if (this.isInfinity()) return this; if (this.curve.zeroA) return this._zeroDbl(); else if (this.curve.threeA) return this._threeDbl(); else return this._dbl(); }; JPoint.prototype._zeroDbl = function _zeroDbl() { var nx; var ny; var nz; if (this.zOne) { var xx = this.x.redSqr(); var yy = this.y.redSqr(); var yyyy = yy.redSqr(); var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); var m = xx.redAdd(xx).redIAdd(xx); var t = m.redSqr().redISub(s).redISub(s); var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); nx = t; ny = m.redMul(s.redISub(t)).redISub(yyyy8); nz = this.y.redAdd(this.y); } else { var a = this.x.redSqr(); var b = this.y.redSqr(); var c = b.redSqr(); var d = this.x.redAdd(b).redSqr().redISub(a).redISub(c); d = d.redIAdd(d); var e = a.redAdd(a).redIAdd(a); var f = e.redSqr(); var c8 = c.redIAdd(c); c8 = c8.redIAdd(c8); c8 = c8.redIAdd(c8); nx = f.redISub(d).redISub(d); ny = e.redMul(d.redISub(nx)).redISub(c8); nz = this.y.redMul(this.z); nz = nz.redIAdd(nz); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._threeDbl = function _threeDbl() { var nx; var ny; var nz; if (this.zOne) { var xx = this.x.redSqr(); var yy = this.y.redSqr(); var yyyy = yy.redSqr(); var s = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); s = s.redIAdd(s); var m = xx.redAdd(xx).redIAdd(xx).redIAdd(this.curve.a); var t = m.redSqr().redISub(s).redISub(s); nx = t; var yyyy8 = yyyy.redIAdd(yyyy); yyyy8 = yyyy8.redIAdd(yyyy8); yyyy8 = yyyy8.redIAdd(yyyy8); ny = m.redMul(s.redISub(t)).redISub(yyyy8); nz = this.y.redAdd(this.y); } else { var delta = this.z.redSqr(); var gamma = this.y.redSqr(); var beta = this.x.redMul(gamma); var alpha = this.x.redSub(delta).redMul(this.x.redAdd(delta)); alpha = alpha.redAdd(alpha).redIAdd(alpha); var beta4 = beta.redIAdd(beta); beta4 = beta4.redIAdd(beta4); var beta8 = beta4.redAdd(beta4); nx = alpha.redSqr().redISub(beta8); nz = this.y.redAdd(this.z).redSqr().redISub(gamma).redISub(delta); var ggamma8 = gamma.redSqr(); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ggamma8 = ggamma8.redIAdd(ggamma8); ny = alpha.redMul(beta4.redISub(nx)).redISub(ggamma8); } return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype._dbl = function _dbl() { var a = this.curve.a; var jx = this.x; var jy = this.y; var jz = this.z; var jz4 = jz.redSqr().redSqr(); var jx2 = jx.redSqr(); var jy2 = jy.redSqr(); var c = jx2.redAdd(jx2).redIAdd(jx2).redIAdd(a.redMul(jz4)); var jxd4 = jx.redAdd(jx); jxd4 = jxd4.redIAdd(jxd4); var t1 = jxd4.redMul(jy2); var nx = c.redSqr().redISub(t1.redAdd(t1)); var t2 = t1.redISub(nx); var jyd8 = jy2.redSqr(); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); jyd8 = jyd8.redIAdd(jyd8); var ny = c.redMul(t2).redISub(jyd8); var nz = jy.redAdd(jy).redMul(jz); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.trpl = function trpl() { if (!this.curve.zeroA) return this.dbl().add(this); var xx = this.x.redSqr(); var yy = this.y.redSqr(); var zz = this.z.redSqr(); var yyyy = yy.redSqr(); var m = xx.redAdd(xx).redIAdd(xx); var mm = m.redSqr(); var e = this.x.redAdd(yy).redSqr().redISub(xx).redISub(yyyy); e = e.redIAdd(e); e = e.redAdd(e).redIAdd(e); e = e.redISub(mm); var ee = e.redSqr(); var t = yyyy.redIAdd(yyyy); t = t.redIAdd(t); t = t.redIAdd(t); t = t.redIAdd(t); var u = m.redIAdd(e).redSqr().redISub(mm).redISub(ee).redISub(t); var yyu4 = yy.redMul(u); yyu4 = yyu4.redIAdd(yyu4); yyu4 = yyu4.redIAdd(yyu4); var nx = this.x.redMul(ee).redISub(yyu4); nx = nx.redIAdd(nx); nx = nx.redIAdd(nx); var ny = this.y.redMul(u.redMul(t.redISub(u)).redISub(e.redMul(ee))); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); ny = ny.redIAdd(ny); var nz = this.z.redAdd(e).redSqr().redISub(zz).redISub(ee); return this.curve.jpoint(nx, ny, nz); }; JPoint.prototype.mul = function mul(k, kbase) { k = new BN(k, kbase); return this.curve._wnafMul(this, k); }; JPoint.prototype.eq = function eq(p) { if (p.type === "affine") return this.eq(p.toJ()); if (this === p) return true; var z2 = this.z.redSqr(); var pz2 = p.z.redSqr(); if (this.x.redMul(pz2).redISub(p.x.redMul(z2)).cmpn(0) !== 0) return false; var z3 = z2.redMul(this.z); var pz3 = pz2.redMul(p.z); return this.y.redMul(pz3).redISub(p.y.redMul(z3)).cmpn(0) === 0; }; JPoint.prototype.eqXToP = function eqXToP(x) { var zs = this.z.redSqr(); var rx = x.toRed(this.curve.red).redMul(zs); if (this.x.cmp(rx) === 0) return true; var xc = x.clone(); var t = this.curve.redN.redMul(zs); for (;;) { xc.iadd(this.curve.n); if (xc.cmp(this.curve.p) >= 0) return false; rx.redIAdd(t); if (this.x.cmp(rx) === 0) return true; } }; JPoint.prototype.inspect = function inspect() { if (this.isInfinity()) return ""; return ( "" ); }; JPoint.prototype.isInfinity = function isInfinity() { return this.z.cmpn(0) === 0; }; }, }); // ../../node_modules/elliptic/lib/elliptic/curve/mont.js var require_mont = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curve/mont.js"(exports, module) { "use strict"; var BN = require_bn(); var inherits = require_inherits(); var Base = require_base(); var utils = require_utils2(); function MontCurve(conf) { Base.call(this, "mont", conf); this.a = new BN(conf.a, 16).toRed(this.red); this.b = new BN(conf.b, 16).toRed(this.red); this.i4 = new BN(4).toRed(this.red).redInvm(); this.two = new BN(2).toRed(this.red); this.a24 = this.i4.redMul(this.a.redAdd(this.two)); } inherits(MontCurve, Base); module.exports = MontCurve; MontCurve.prototype.validate = function validate(point) { var x = point.normalize().x; var x2 = x.redSqr(); var rhs = x2.redMul(x).redAdd(x2.redMul(this.a)).redAdd(x); var y = rhs.redSqrt(); return y.redSqr().cmp(rhs) === 0; }; function Point(curve, x, z) { Base.BasePoint.call(this, curve, "projective"); if (x === null && z === null) { this.x = this.curve.one; this.z = this.curve.zero; } else { this.x = new BN(x, 16); this.z = new BN(z, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); } } inherits(Point, Base.BasePoint); MontCurve.prototype.decodePoint = function decodePoint(bytes, enc) { return this.point(utils.toArray(bytes, enc), 1); }; MontCurve.prototype.point = function point(x, z) { return new Point(this, x, z); }; MontCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; Point.prototype.precompute = function precompute() {}; Point.prototype._encode = function _encode() { return this.getX().toArray("be", this.curve.p.byteLength()); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1] || curve.one); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ""; return ""; }; Point.prototype.isInfinity = function isInfinity() { return this.z.cmpn(0) === 0; }; Point.prototype.dbl = function dbl() { var a = this.x.redAdd(this.z); var aa = a.redSqr(); var b = this.x.redSub(this.z); var bb = b.redSqr(); var c = aa.redSub(bb); var nx = aa.redMul(bb); var nz = c.redMul(bb.redAdd(this.curve.a24.redMul(c))); return this.curve.point(nx, nz); }; Point.prototype.add = function add() { throw new Error("Not supported on Montgomery curve"); }; Point.prototype.diffAdd = function diffAdd(p, diff) { var a = this.x.redAdd(this.z); var b = this.x.redSub(this.z); var c = p.x.redAdd(p.z); var d = p.x.redSub(p.z); var da = d.redMul(a); var cb = c.redMul(b); var nx = diff.z.redMul(da.redAdd(cb).redSqr()); var nz = diff.x.redMul(da.redISub(cb).redSqr()); return this.curve.point(nx, nz); }; Point.prototype.mul = function mul(k) { var t = k.clone(); var a = this; var b = this.curve.point(null, null); var c = this; for (var bits = []; t.cmpn(0) !== 0; t.iushrn(1)) bits.push(t.andln(1)); for (var i = bits.length - 1; i >= 0; i--) { if (bits[i] === 0) { a = a.diffAdd(b, c); b = b.dbl(); } else { b = a.diffAdd(b, c); a = a.dbl(); } } return b; }; Point.prototype.mulAdd = function mulAdd() { throw new Error("Not supported on Montgomery curve"); }; Point.prototype.jumlAdd = function jumlAdd() { throw new Error("Not supported on Montgomery curve"); }; Point.prototype.eq = function eq(other) { return this.getX().cmp(other.getX()) === 0; }; Point.prototype.normalize = function normalize() { this.x = this.x.redMul(this.z.redInvm()); this.z = this.curve.one; return this; }; Point.prototype.getX = function getX() { this.normalize(); return this.x.fromRed(); }; }, }); // ../../node_modules/elliptic/lib/elliptic/curve/edwards.js var require_edwards = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curve/edwards.js"(exports, module) { "use strict"; var utils = require_utils2(); var BN = require_bn(); var inherits = require_inherits(); var Base = require_base(); var assert = utils.assert; function EdwardsCurve(conf) { this.twisted = (conf.a | 0) !== 1; this.mOneA = this.twisted && (conf.a | 0) === -1; this.extended = this.mOneA; Base.call(this, "edwards", conf); this.a = new BN(conf.a, 16).umod(this.red.m); this.a = this.a.toRed(this.red); this.c = new BN(conf.c, 16).toRed(this.red); this.c2 = this.c.redSqr(); this.d = new BN(conf.d, 16).toRed(this.red); this.dd = this.d.redAdd(this.d); assert(!this.twisted || this.c.fromRed().cmpn(1) === 0); this.oneC = (conf.c | 0) === 1; } inherits(EdwardsCurve, Base); module.exports = EdwardsCurve; EdwardsCurve.prototype._mulA = function _mulA(num) { if (this.mOneA) return num.redNeg(); else return this.a.redMul(num); }; EdwardsCurve.prototype._mulC = function _mulC(num) { if (this.oneC) return num; else return this.c.redMul(num); }; EdwardsCurve.prototype.jpoint = function jpoint(x, y, z, t) { return this.point(x, y, z, t); }; EdwardsCurve.prototype.pointFromX = function pointFromX(x, odd) { x = new BN(x, 16); if (!x.red) x = x.toRed(this.red); var x2 = x.redSqr(); var rhs = this.c2.redSub(this.a.redMul(x2)); var lhs = this.one.redSub(this.c2.redMul(this.d).redMul(x2)); var y2 = rhs.redMul(lhs.redInvm()); var y = y2.redSqrt(); if (y.redSqr().redSub(y2).cmp(this.zero) !== 0) throw new Error("invalid point"); var isOdd = y.fromRed().isOdd(); if ((odd && !isOdd) || (!odd && isOdd)) y = y.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.pointFromY = function pointFromY(y, odd) { y = new BN(y, 16); if (!y.red) y = y.toRed(this.red); var y2 = y.redSqr(); var lhs = y2.redSub(this.c2); var rhs = y2.redMul(this.d).redMul(this.c2).redSub(this.a); var x2 = lhs.redMul(rhs.redInvm()); if (x2.cmp(this.zero) === 0) { if (odd) throw new Error("invalid point"); else return this.point(this.zero, y); } var x = x2.redSqrt(); if (x.redSqr().redSub(x2).cmp(this.zero) !== 0) throw new Error("invalid point"); if (x.fromRed().isOdd() !== odd) x = x.redNeg(); return this.point(x, y); }; EdwardsCurve.prototype.validate = function validate(point) { if (point.isInfinity()) return true; point.normalize(); var x2 = point.x.redSqr(); var y2 = point.y.redSqr(); var lhs = x2.redMul(this.a).redAdd(y2); var rhs = this.c2.redMul(this.one.redAdd(this.d.redMul(x2).redMul(y2))); return lhs.cmp(rhs) === 0; }; function Point(curve, x, y, z, t) { Base.BasePoint.call(this, curve, "projective"); if (x === null && y === null && z === null) { this.x = this.curve.zero; this.y = this.curve.one; this.z = this.curve.one; this.t = this.curve.zero; this.zOne = true; } else { this.x = new BN(x, 16); this.y = new BN(y, 16); this.z = z ? new BN(z, 16) : this.curve.one; this.t = t && new BN(t, 16); if (!this.x.red) this.x = this.x.toRed(this.curve.red); if (!this.y.red) this.y = this.y.toRed(this.curve.red); if (!this.z.red) this.z = this.z.toRed(this.curve.red); if (this.t && !this.t.red) this.t = this.t.toRed(this.curve.red); this.zOne = this.z === this.curve.one; if (this.curve.extended && !this.t) { this.t = this.x.redMul(this.y); if (!this.zOne) this.t = this.t.redMul(this.z.redInvm()); } } } inherits(Point, Base.BasePoint); EdwardsCurve.prototype.pointFromJSON = function pointFromJSON(obj) { return Point.fromJSON(this, obj); }; EdwardsCurve.prototype.point = function point(x, y, z, t) { return new Point(this, x, y, z, t); }; Point.fromJSON = function fromJSON(curve, obj) { return new Point(curve, obj[0], obj[1], obj[2]); }; Point.prototype.inspect = function inspect() { if (this.isInfinity()) return ""; return ( "" ); }; Point.prototype.isInfinity = function isInfinity() { return this.x.cmpn(0) === 0 && (this.y.cmp(this.z) === 0 || (this.zOne && this.y.cmp(this.curve.c) === 0)); }; Point.prototype._extDbl = function _extDbl() { var a = this.x.redSqr(); var b = this.y.redSqr(); var c = this.z.redSqr(); c = c.redIAdd(c); var d = this.curve._mulA(a); var e = this.x.redAdd(this.y).redSqr().redISub(a).redISub(b); var g = d.redAdd(b); var f = g.redSub(c); var h = d.redSub(b); var nx = e.redMul(f); var ny = g.redMul(h); var nt = e.redMul(h); var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projDbl = function _projDbl() { var b = this.x.redAdd(this.y).redSqr(); var c = this.x.redSqr(); var d = this.y.redSqr(); var nx; var ny; var nz; var e; var h; var j; if (this.curve.twisted) { e = this.curve._mulA(c); var f = e.redAdd(d); if (this.zOne) { nx = b.redSub(c).redSub(d).redMul(f.redSub(this.curve.two)); ny = f.redMul(e.redSub(d)); nz = f.redSqr().redSub(f).redSub(f); } else { h = this.z.redSqr(); j = f.redSub(h).redISub(h); nx = b.redSub(c).redISub(d).redMul(j); ny = f.redMul(e.redSub(d)); nz = f.redMul(j); } } else { e = c.redAdd(d); h = this.curve._mulC(this.z).redSqr(); j = e.redSub(h).redSub(h); nx = this.curve._mulC(b.redISub(e)).redMul(j); ny = this.curve._mulC(e).redMul(c.redISub(d)); nz = e.redMul(j); } return this.curve.point(nx, ny, nz); }; Point.prototype.dbl = function dbl() { if (this.isInfinity()) return this; if (this.curve.extended) return this._extDbl(); else return this._projDbl(); }; Point.prototype._extAdd = function _extAdd(p) { var a = this.y.redSub(this.x).redMul(p.y.redSub(p.x)); var b = this.y.redAdd(this.x).redMul(p.y.redAdd(p.x)); var c = this.t.redMul(this.curve.dd).redMul(p.t); var d = this.z.redMul(p.z.redAdd(p.z)); var e = b.redSub(a); var f = d.redSub(c); var g = d.redAdd(c); var h = b.redAdd(a); var nx = e.redMul(f); var ny = g.redMul(h); var nt = e.redMul(h); var nz = f.redMul(g); return this.curve.point(nx, ny, nz, nt); }; Point.prototype._projAdd = function _projAdd(p) { var a = this.z.redMul(p.z); var b = a.redSqr(); var c = this.x.redMul(p.x); var d = this.y.redMul(p.y); var e = this.curve.d.redMul(c).redMul(d); var f = b.redSub(e); var g = b.redAdd(e); var tmp = this.x.redAdd(this.y).redMul(p.x.redAdd(p.y)).redISub(c).redISub(d); var nx = a.redMul(f).redMul(tmp); var ny; var nz; if (this.curve.twisted) { ny = a.redMul(g).redMul(d.redSub(this.curve._mulA(c))); nz = f.redMul(g); } else { ny = a.redMul(g).redMul(d.redSub(c)); nz = this.curve._mulC(f).redMul(g); } return this.curve.point(nx, ny, nz); }; Point.prototype.add = function add(p) { if (this.isInfinity()) return p; if (p.isInfinity()) return this; if (this.curve.extended) return this._extAdd(p); else return this._projAdd(p); }; Point.prototype.mul = function mul(k) { if (this._hasDoubles(k)) return this.curve._fixedNafMul(this, k); else return this.curve._wnafMul(this, k); }; Point.prototype.mulAdd = function mulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, false); }; Point.prototype.jmulAdd = function jmulAdd(k1, p, k2) { return this.curve._wnafMulAdd(1, [this, p], [k1, k2], 2, true); }; Point.prototype.normalize = function normalize() { if (this.zOne) return this; var zi = this.z.redInvm(); this.x = this.x.redMul(zi); this.y = this.y.redMul(zi); if (this.t) this.t = this.t.redMul(zi); this.z = this.curve.one; this.zOne = true; return this; }; Point.prototype.neg = function neg() { return this.curve.point(this.x.redNeg(), this.y, this.z, this.t && this.t.redNeg()); }; Point.prototype.getX = function getX() { this.normalize(); return this.x.fromRed(); }; Point.prototype.getY = function getY() { this.normalize(); return this.y.fromRed(); }; Point.prototype.eq = function eq(other) { return this === other || (this.getX().cmp(other.getX()) === 0 && this.getY().cmp(other.getY()) === 0); }; Point.prototype.eqXToP = function eqXToP(x) { var rx = x.toRed(this.curve.red).redMul(this.z); if (this.x.cmp(rx) === 0) return true; var xc = x.clone(); var t = this.curve.redN.redMul(this.z); for (;;) { xc.iadd(this.curve.n); if (xc.cmp(this.curve.p) >= 0) return false; rx.redIAdd(t); if (this.x.cmp(rx) === 0) return true; } }; Point.prototype.toP = Point.prototype.normalize; Point.prototype.mixedAdd = Point.prototype.add; }, }); // ../../node_modules/elliptic/lib/elliptic/curve/index.js var require_curve = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curve/index.js"(exports) { "use strict"; var curve = exports; curve.base = require_base(); curve.short = require_short(); curve.mont = require_mont(); curve.edwards = require_edwards(); }, }); // ../../node_modules/hash.js/lib/hash/utils.js var require_utils3 = __commonJS({ "../../node_modules/hash.js/lib/hash/utils.js"(exports) { "use strict"; var assert = require_minimalistic_assert(); var inherits = require_inherits(); exports.inherits = inherits; function isSurrogatePair(msg, i) { if ((msg.charCodeAt(i) & 64512) !== 55296) { return false; } if (i < 0 || i + 1 >= msg.length) { return false; } return (msg.charCodeAt(i + 1) & 64512) === 56320; } function toArray(msg, enc) { if (Array.isArray(msg)) return msg.slice(); if (!msg) return []; var res = []; if (typeof msg === "string") { if (!enc) { var p = 0; for (var i = 0; i < msg.length; i++) { var c = msg.charCodeAt(i); if (c < 128) { res[p++] = c; } else if (c < 2048) { res[p++] = (c >> 6) | 192; res[p++] = (c & 63) | 128; } else if (isSurrogatePair(msg, i)) { c = 65536 + ((c & 1023) << 10) + (msg.charCodeAt(++i) & 1023); res[p++] = (c >> 18) | 240; res[p++] = ((c >> 12) & 63) | 128; res[p++] = ((c >> 6) & 63) | 128; res[p++] = (c & 63) | 128; } else { res[p++] = (c >> 12) | 224; res[p++] = ((c >> 6) & 63) | 128; res[p++] = (c & 63) | 128; } } } else if (enc === "hex") { msg = msg.replace(/[^a-z0-9]+/gi, ""); if (msg.length % 2 !== 0) msg = "0" + msg; for (i = 0; i < msg.length; i += 2) res.push(parseInt(msg[i] + msg[i + 1], 16)); } } else { for (i = 0; i < msg.length; i++) res[i] = msg[i] | 0; } return res; } exports.toArray = toArray; function toHex(msg) { var res = ""; for (var i = 0; i < msg.length; i++) res += zero2(msg[i].toString(16)); return res; } exports.toHex = toHex; function htonl(w) { var res = (w >>> 24) | ((w >>> 8) & 65280) | ((w << 8) & 16711680) | ((w & 255) << 24); return res >>> 0; } exports.htonl = htonl; function toHex32(msg, endian) { var res = ""; for (var i = 0; i < msg.length; i++) { var w = msg[i]; if (endian === "little") w = htonl(w); res += zero8(w.toString(16)); } return res; } exports.toHex32 = toHex32; function zero2(word) { if (word.length === 1) return "0" + word; else return word; } exports.zero2 = zero2; function zero8(word) { if (word.length === 7) return "0" + word; else if (word.length === 6) return "00" + word; else if (word.length === 5) return "000" + word; else if (word.length === 4) return "0000" + word; else if (word.length === 3) return "00000" + word; else if (word.length === 2) return "000000" + word; else if (word.length === 1) return "0000000" + word; else return word; } exports.zero8 = zero8; function join32(msg, start, end, endian) { var len = end - start; assert(len % 4 === 0); var res = new Array(len / 4); for (var i = 0, k = start; i < res.length; i++, k += 4) { var w; if (endian === "big") w = (msg[k] << 24) | (msg[k + 1] << 16) | (msg[k + 2] << 8) | msg[k + 3]; else w = (msg[k + 3] << 24) | (msg[k + 2] << 16) | (msg[k + 1] << 8) | msg[k]; res[i] = w >>> 0; } return res; } exports.join32 = join32; function split32(msg, endian) { var res = new Array(msg.length * 4); for (var i = 0, k = 0; i < msg.length; i++, k += 4) { var m = msg[i]; if (endian === "big") { res[k] = m >>> 24; res[k + 1] = (m >>> 16) & 255; res[k + 2] = (m >>> 8) & 255; res[k + 3] = m & 255; } else { res[k + 3] = m >>> 24; res[k + 2] = (m >>> 16) & 255; res[k + 1] = (m >>> 8) & 255; res[k] = m & 255; } } return res; } exports.split32 = split32; function rotr32(w, b) { return (w >>> b) | (w << (32 - b)); } exports.rotr32 = rotr32; function rotl32(w, b) { return (w << b) | (w >>> (32 - b)); } exports.rotl32 = rotl32; function sum32(a, b) { return (a + b) >>> 0; } exports.sum32 = sum32; function sum32_3(a, b, c) { return (a + b + c) >>> 0; } exports.sum32_3 = sum32_3; function sum32_4(a, b, c, d) { return (a + b + c + d) >>> 0; } exports.sum32_4 = sum32_4; function sum32_5(a, b, c, d, e) { return (a + b + c + d + e) >>> 0; } exports.sum32_5 = sum32_5; function sum64(buf, pos, ah, al) { var bh = buf[pos]; var bl = buf[pos + 1]; var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; buf[pos] = hi >>> 0; buf[pos + 1] = lo; } exports.sum64 = sum64; function sum64_hi(ah, al, bh, bl) { var lo = (al + bl) >>> 0; var hi = (lo < al ? 1 : 0) + ah + bh; return hi >>> 0; } exports.sum64_hi = sum64_hi; function sum64_lo(ah, al, bh, bl) { var lo = al + bl; return lo >>> 0; } exports.sum64_lo = sum64_lo; function sum64_4_hi(ah, al, bh, bl, ch, cl, dh, dl) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; var hi = ah + bh + ch + dh + carry; return hi >>> 0; } exports.sum64_4_hi = sum64_4_hi; function sum64_4_lo(ah, al, bh, bl, ch, cl, dh, dl) { var lo = al + bl + cl + dl; return lo >>> 0; } exports.sum64_4_lo = sum64_4_lo; function sum64_5_hi(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var carry = 0; var lo = al; lo = (lo + bl) >>> 0; carry += lo < al ? 1 : 0; lo = (lo + cl) >>> 0; carry += lo < cl ? 1 : 0; lo = (lo + dl) >>> 0; carry += lo < dl ? 1 : 0; lo = (lo + el) >>> 0; carry += lo < el ? 1 : 0; var hi = ah + bh + ch + dh + eh + carry; return hi >>> 0; } exports.sum64_5_hi = sum64_5_hi; function sum64_5_lo(ah, al, bh, bl, ch, cl, dh, dl, eh, el) { var lo = al + bl + cl + dl + el; return lo >>> 0; } exports.sum64_5_lo = sum64_5_lo; function rotr64_hi(ah, al, num) { var r = (al << (32 - num)) | (ah >>> num); return r >>> 0; } exports.rotr64_hi = rotr64_hi; function rotr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; } exports.rotr64_lo = rotr64_lo; function shr64_hi(ah, al, num) { return ah >>> num; } exports.shr64_hi = shr64_hi; function shr64_lo(ah, al, num) { var r = (ah << (32 - num)) | (al >>> num); return r >>> 0; } exports.shr64_lo = shr64_lo; }, }); // ../../node_modules/hash.js/lib/hash/common.js var require_common = __commonJS({ "../../node_modules/hash.js/lib/hash/common.js"(exports) { "use strict"; var utils = require_utils3(); var assert = require_minimalistic_assert(); function BlockHash() { this.pending = null; this.pendingTotal = 0; this.blockSize = this.constructor.blockSize; this.outSize = this.constructor.outSize; this.hmacStrength = this.constructor.hmacStrength; this.padLength = this.constructor.padLength / 8; this.endian = "big"; this._delta8 = this.blockSize / 8; this._delta32 = this.blockSize / 32; } exports.BlockHash = BlockHash; BlockHash.prototype.update = function update(msg, enc) { msg = utils.toArray(msg, enc); if (!this.pending) this.pending = msg; else this.pending = this.pending.concat(msg); this.pendingTotal += msg.length; if (this.pending.length >= this._delta8) { msg = this.pending; var r = msg.length % this._delta8; this.pending = msg.slice(msg.length - r, msg.length); if (this.pending.length === 0) this.pending = null; msg = utils.join32(msg, 0, msg.length - r, this.endian); for (var i = 0; i < msg.length; i += this._delta32) this._update(msg, i, i + this._delta32); } return this; }; BlockHash.prototype.digest = function digest(enc) { this.update(this._pad()); assert(this.pending === null); return this._digest(enc); }; BlockHash.prototype._pad = function pad() { var len = this.pendingTotal; var bytes = this._delta8; var k = bytes - ((len + this.padLength) % bytes); var res = new Array(k + this.padLength); res[0] = 128; for (var i = 1; i < k; i++) res[i] = 0; len <<= 3; if (this.endian === "big") { for (var t = 8; t < this.padLength; t++) res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = (len >>> 24) & 255; res[i++] = (len >>> 16) & 255; res[i++] = (len >>> 8) & 255; res[i++] = len & 255; } else { res[i++] = len & 255; res[i++] = (len >>> 8) & 255; res[i++] = (len >>> 16) & 255; res[i++] = (len >>> 24) & 255; res[i++] = 0; res[i++] = 0; res[i++] = 0; res[i++] = 0; for (t = 8; t < this.padLength; t++) res[i++] = 0; } return res; }; }, }); // ../../node_modules/hash.js/lib/hash/sha/common.js var require_common2 = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/common.js"(exports) { "use strict"; var utils = require_utils3(); var rotr32 = utils.rotr32; function ft_1(s, x, y, z) { if (s === 0) return ch32(x, y, z); if (s === 1 || s === 3) return p32(x, y, z); if (s === 2) return maj32(x, y, z); } exports.ft_1 = ft_1; function ch32(x, y, z) { return (x & y) ^ (~x & z); } exports.ch32 = ch32; function maj32(x, y, z) { return (x & y) ^ (x & z) ^ (y & z); } exports.maj32 = maj32; function p32(x, y, z) { return x ^ y ^ z; } exports.p32 = p32; function s0_256(x) { return rotr32(x, 2) ^ rotr32(x, 13) ^ rotr32(x, 22); } exports.s0_256 = s0_256; function s1_256(x) { return rotr32(x, 6) ^ rotr32(x, 11) ^ rotr32(x, 25); } exports.s1_256 = s1_256; function g0_256(x) { return rotr32(x, 7) ^ rotr32(x, 18) ^ (x >>> 3); } exports.g0_256 = g0_256; function g1_256(x) { return rotr32(x, 17) ^ rotr32(x, 19) ^ (x >>> 10); } exports.g1_256 = g1_256; }, }); // ../../node_modules/hash.js/lib/hash/sha/1.js var require__ = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/1.js"(exports, module) { "use strict"; var utils = require_utils3(); var common = require_common(); var shaCommon = require_common2(); var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_5 = utils.sum32_5; var ft_1 = shaCommon.ft_1; var BlockHash = common.BlockHash; var sha1_K = [1518500249, 1859775393, 2400959708, 3395469782]; function SHA1() { if (!(this instanceof SHA1)) return new SHA1(); BlockHash.call(this); this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520]; this.W = new Array(80); } utils.inherits(SHA1, BlockHash); module.exports = SHA1; SHA1.blockSize = 512; SHA1.outSize = 160; SHA1.hmacStrength = 80; SHA1.padLength = 64; SHA1.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for (; i < W.length; i++) W[i] = rotl32(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; for (i = 0; i < W.length; i++) { var s = ~~(i / 20); var t = sum32_5(rotl32(a, 5), ft_1(s, b, c, d), e, W[i], sha1_K[s]); e = d; d = c; c = rotl32(b, 30); b = a; a = t; } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); }; SHA1.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h, "big"); else return utils.split32(this.h, "big"); }; }, }); // ../../node_modules/hash.js/lib/hash/sha/256.js var require__2 = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/256.js"(exports, module) { "use strict"; var utils = require_utils3(); var common = require_common(); var shaCommon = require_common2(); var assert = require_minimalistic_assert(); var sum32 = utils.sum32; var sum32_4 = utils.sum32_4; var sum32_5 = utils.sum32_5; var ch32 = shaCommon.ch32; var maj32 = shaCommon.maj32; var s0_256 = shaCommon.s0_256; var s1_256 = shaCommon.s1_256; var g0_256 = shaCommon.g0_256; var g1_256 = shaCommon.g1_256; var BlockHash = common.BlockHash; var sha256_K = [ 1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298, ]; function SHA256() { if (!(this instanceof SHA256)) return new SHA256(); BlockHash.call(this); this.h = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225]; this.k = sha256_K; this.W = new Array(64); } utils.inherits(SHA256, BlockHash); module.exports = SHA256; SHA256.blockSize = 512; SHA256.outSize = 256; SHA256.hmacStrength = 192; SHA256.padLength = 64; SHA256.prototype._update = function _update(msg, start) { var W = this.W; for (var i = 0; i < 16; i++) W[i] = msg[start + i]; for (; i < W.length; i++) W[i] = sum32_4(g1_256(W[i - 2]), W[i - 7], g0_256(W[i - 15]), W[i - 16]); var a = this.h[0]; var b = this.h[1]; var c = this.h[2]; var d = this.h[3]; var e = this.h[4]; var f = this.h[5]; var g = this.h[6]; var h = this.h[7]; assert(this.k.length === W.length); for (i = 0; i < W.length; i++) { var T1 = sum32_5(h, s1_256(e), ch32(e, f, g), this.k[i], W[i]); var T2 = sum32(s0_256(a), maj32(a, b, c)); h = g; g = f; f = e; e = sum32(d, T1); d = c; c = b; b = a; a = sum32(T1, T2); } this.h[0] = sum32(this.h[0], a); this.h[1] = sum32(this.h[1], b); this.h[2] = sum32(this.h[2], c); this.h[3] = sum32(this.h[3], d); this.h[4] = sum32(this.h[4], e); this.h[5] = sum32(this.h[5], f); this.h[6] = sum32(this.h[6], g); this.h[7] = sum32(this.h[7], h); }; SHA256.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h, "big"); else return utils.split32(this.h, "big"); }; }, }); // ../../node_modules/hash.js/lib/hash/sha/224.js var require__3 = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/224.js"(exports, module) { "use strict"; var utils = require_utils3(); var SHA256 = require__2(); function SHA224() { if (!(this instanceof SHA224)) return new SHA224(); SHA256.call(this); this.h = [3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]; } utils.inherits(SHA224, SHA256); module.exports = SHA224; SHA224.blockSize = 512; SHA224.outSize = 224; SHA224.hmacStrength = 192; SHA224.padLength = 64; SHA224.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h.slice(0, 7), "big"); else return utils.split32(this.h.slice(0, 7), "big"); }; }, }); // ../../node_modules/hash.js/lib/hash/sha/512.js var require__4 = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/512.js"(exports, module) { "use strict"; var utils = require_utils3(); var common = require_common(); var assert = require_minimalistic_assert(); var rotr64_hi = utils.rotr64_hi; var rotr64_lo = utils.rotr64_lo; var shr64_hi = utils.shr64_hi; var shr64_lo = utils.shr64_lo; var sum64 = utils.sum64; var sum64_hi = utils.sum64_hi; var sum64_lo = utils.sum64_lo; var sum64_4_hi = utils.sum64_4_hi; var sum64_4_lo = utils.sum64_4_lo; var sum64_5_hi = utils.sum64_5_hi; var sum64_5_lo = utils.sum64_5_lo; var BlockHash = common.BlockHash; var sha512_K = [ 1116352408, 3609767458, 1899447441, 602891725, 3049323471, 3964484399, 3921009573, 2173295548, 961987163, 4081628472, 1508970993, 3053834265, 2453635748, 2937671579, 2870763221, 3664609560, 3624381080, 2734883394, 310598401, 1164996542, 607225278, 1323610764, 1426881987, 3590304994, 1925078388, 4068182383, 2162078206, 991336113, 2614888103, 633803317, 3248222580, 3479774868, 3835390401, 2666613458, 4022224774, 944711139, 264347078, 2341262773, 604807628, 2007800933, 770255983, 1495990901, 1249150122, 1856431235, 1555081692, 3175218132, 1996064986, 2198950837, 2554220882, 3999719339, 2821834349, 766784016, 2952996808, 2566594879, 3210313671, 3203337956, 3336571891, 1034457026, 3584528711, 2466948901, 113926993, 3758326383, 338241895, 168717936, 666307205, 1188179964, 773529912, 1546045734, 1294757372, 1522805485, 1396182291, 2643833823, 1695183700, 2343527390, 1986661051, 1014477480, 2177026350, 1206759142, 2456956037, 344077627, 2730485921, 1290863460, 2820302411, 3158454273, 3259730800, 3505952657, 3345764771, 106217008, 3516065817, 3606008344, 3600352804, 1432725776, 4094571909, 1467031594, 275423344, 851169720, 430227734, 3100823752, 506948616, 1363258195, 659060556, 3750685593, 883997877, 3785050280, 958139571, 3318307427, 1322822218, 3812723403, 1537002063, 2003034995, 1747873779, 3602036899, 1955562222, 1575990012, 2024104815, 1125592928, 2227730452, 2716904306, 2361852424, 442776044, 2428436474, 593698344, 2756734187, 3733110249, 3204031479, 2999351573, 3329325298, 3815920427, 3391569614, 3928383900, 3515267271, 566280711, 3940187606, 3454069534, 4118630271, 4000239992, 116418474, 1914138554, 174292421, 2731055270, 289380356, 3203993006, 460393269, 320620315, 685471733, 587496836, 852142971, 1086792851, 1017036298, 365543100, 1126000580, 2618297676, 1288033470, 3409855158, 1501505948, 4234509866, 1607167915, 987167468, 1816402316, 1246189591, ]; function SHA512() { if (!(this instanceof SHA512)) return new SHA512(); BlockHash.call(this); this.h = [ 1779033703, 4089235720, 3144134277, 2227873595, 1013904242, 4271175723, 2773480762, 1595750129, 1359893119, 2917565137, 2600822924, 725511199, 528734635, 4215389547, 1541459225, 327033209, ]; this.k = sha512_K; this.W = new Array(160); } utils.inherits(SHA512, BlockHash); module.exports = SHA512; SHA512.blockSize = 1024; SHA512.outSize = 512; SHA512.hmacStrength = 192; SHA512.padLength = 128; SHA512.prototype._prepareBlock = function _prepareBlock(msg, start) { var W = this.W; for (var i = 0; i < 32; i++) W[i] = msg[start + i]; for (; i < W.length; i += 2) { var c0_hi = g1_512_hi(W[i - 4], W[i - 3]); var c0_lo = g1_512_lo(W[i - 4], W[i - 3]); var c1_hi = W[i - 14]; var c1_lo = W[i - 13]; var c2_hi = g0_512_hi(W[i - 30], W[i - 29]); var c2_lo = g0_512_lo(W[i - 30], W[i - 29]); var c3_hi = W[i - 32]; var c3_lo = W[i - 31]; W[i] = sum64_4_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); W[i + 1] = sum64_4_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo); } }; SHA512.prototype._update = function _update(msg, start) { this._prepareBlock(msg, start); var W = this.W; var ah = this.h[0]; var al = this.h[1]; var bh = this.h[2]; var bl = this.h[3]; var ch = this.h[4]; var cl = this.h[5]; var dh = this.h[6]; var dl = this.h[7]; var eh = this.h[8]; var el = this.h[9]; var fh = this.h[10]; var fl = this.h[11]; var gh = this.h[12]; var gl = this.h[13]; var hh = this.h[14]; var hl = this.h[15]; assert(this.k.length === W.length); for (var i = 0; i < W.length; i += 2) { var c0_hi = hh; var c0_lo = hl; var c1_hi = s1_512_hi(eh, el); var c1_lo = s1_512_lo(eh, el); var c2_hi = ch64_hi(eh, el, fh, fl, gh, gl); var c2_lo = ch64_lo(eh, el, fh, fl, gh, gl); var c3_hi = this.k[i]; var c3_lo = this.k[i + 1]; var c4_hi = W[i]; var c4_lo = W[i + 1]; var T1_hi = sum64_5_hi(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); var T1_lo = sum64_5_lo(c0_hi, c0_lo, c1_hi, c1_lo, c2_hi, c2_lo, c3_hi, c3_lo, c4_hi, c4_lo); c0_hi = s0_512_hi(ah, al); c0_lo = s0_512_lo(ah, al); c1_hi = maj64_hi(ah, al, bh, bl, ch, cl); c1_lo = maj64_lo(ah, al, bh, bl, ch, cl); var T2_hi = sum64_hi(c0_hi, c0_lo, c1_hi, c1_lo); var T2_lo = sum64_lo(c0_hi, c0_lo, c1_hi, c1_lo); hh = gh; hl = gl; gh = fh; gl = fl; fh = eh; fl = el; eh = sum64_hi(dh, dl, T1_hi, T1_lo); el = sum64_lo(dl, dl, T1_hi, T1_lo); dh = ch; dl = cl; ch = bh; cl = bl; bh = ah; bl = al; ah = sum64_hi(T1_hi, T1_lo, T2_hi, T2_lo); al = sum64_lo(T1_hi, T1_lo, T2_hi, T2_lo); } sum64(this.h, 0, ah, al); sum64(this.h, 2, bh, bl); sum64(this.h, 4, ch, cl); sum64(this.h, 6, dh, dl); sum64(this.h, 8, eh, el); sum64(this.h, 10, fh, fl); sum64(this.h, 12, gh, gl); sum64(this.h, 14, hh, hl); }; SHA512.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h, "big"); else return utils.split32(this.h, "big"); }; function ch64_hi(xh, xl, yh, yl, zh) { var r = (xh & yh) ^ (~xh & zh); if (r < 0) r += 4294967296; return r; } function ch64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ (~xl & zl); if (r < 0) r += 4294967296; return r; } function maj64_hi(xh, xl, yh, yl, zh) { var r = (xh & yh) ^ (xh & zh) ^ (yh & zh); if (r < 0) r += 4294967296; return r; } function maj64_lo(xh, xl, yh, yl, zh, zl) { var r = (xl & yl) ^ (xl & zl) ^ (yl & zl); if (r < 0) r += 4294967296; return r; } function s0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 28); var c1_hi = rotr64_hi(xl, xh, 2); var c2_hi = rotr64_hi(xl, xh, 7); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 4294967296; return r; } function s0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 28); var c1_lo = rotr64_lo(xl, xh, 2); var c2_lo = rotr64_lo(xl, xh, 7); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 4294967296; return r; } function s1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 14); var c1_hi = rotr64_hi(xh, xl, 18); var c2_hi = rotr64_hi(xl, xh, 9); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 4294967296; return r; } function s1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 14); var c1_lo = rotr64_lo(xh, xl, 18); var c2_lo = rotr64_lo(xl, xh, 9); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 4294967296; return r; } function g0_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 1); var c1_hi = rotr64_hi(xh, xl, 8); var c2_hi = shr64_hi(xh, xl, 7); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 4294967296; return r; } function g0_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 1); var c1_lo = rotr64_lo(xh, xl, 8); var c2_lo = shr64_lo(xh, xl, 7); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 4294967296; return r; } function g1_512_hi(xh, xl) { var c0_hi = rotr64_hi(xh, xl, 19); var c1_hi = rotr64_hi(xl, xh, 29); var c2_hi = shr64_hi(xh, xl, 6); var r = c0_hi ^ c1_hi ^ c2_hi; if (r < 0) r += 4294967296; return r; } function g1_512_lo(xh, xl) { var c0_lo = rotr64_lo(xh, xl, 19); var c1_lo = rotr64_lo(xl, xh, 29); var c2_lo = shr64_lo(xh, xl, 6); var r = c0_lo ^ c1_lo ^ c2_lo; if (r < 0) r += 4294967296; return r; } }, }); // ../../node_modules/hash.js/lib/hash/sha/384.js var require__5 = __commonJS({ "../../node_modules/hash.js/lib/hash/sha/384.js"(exports, module) { "use strict"; var utils = require_utils3(); var SHA512 = require__4(); function SHA384() { if (!(this instanceof SHA384)) return new SHA384(); SHA512.call(this); this.h = [ 3418070365, 3238371032, 1654270250, 914150663, 2438529370, 812702999, 355462360, 4144912697, 1731405415, 4290775857, 2394180231, 1750603025, 3675008525, 1694076839, 1203062813, 3204075428, ]; } utils.inherits(SHA384, SHA512); module.exports = SHA384; SHA384.blockSize = 1024; SHA384.outSize = 384; SHA384.hmacStrength = 192; SHA384.padLength = 128; SHA384.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h.slice(0, 12), "big"); else return utils.split32(this.h.slice(0, 12), "big"); }; }, }); // ../../node_modules/hash.js/lib/hash/sha.js var require_sha = __commonJS({ "../../node_modules/hash.js/lib/hash/sha.js"(exports) { "use strict"; exports.sha1 = require__(); exports.sha224 = require__3(); exports.sha256 = require__2(); exports.sha384 = require__5(); exports.sha512 = require__4(); }, }); // ../../node_modules/hash.js/lib/hash/ripemd.js var require_ripemd = __commonJS({ "../../node_modules/hash.js/lib/hash/ripemd.js"(exports) { "use strict"; var utils = require_utils3(); var common = require_common(); var rotl32 = utils.rotl32; var sum32 = utils.sum32; var sum32_3 = utils.sum32_3; var sum32_4 = utils.sum32_4; var BlockHash = common.BlockHash; function RIPEMD160() { if (!(this instanceof RIPEMD160)) return new RIPEMD160(); BlockHash.call(this); this.h = [1732584193, 4023233417, 2562383102, 271733878, 3285377520]; this.endian = "little"; } utils.inherits(RIPEMD160, BlockHash); exports.ripemd160 = RIPEMD160; RIPEMD160.blockSize = 512; RIPEMD160.outSize = 160; RIPEMD160.hmacStrength = 192; RIPEMD160.padLength = 64; RIPEMD160.prototype._update = function update(msg, start) { var A = this.h[0]; var B = this.h[1]; var C = this.h[2]; var D = this.h[3]; var E = this.h[4]; var Ah = A; var Bh = B; var Ch = C; var Dh = D; var Eh = E; for (var j = 0; j < 80; j++) { var T = sum32(rotl32(sum32_4(A, f(j, B, C, D), msg[r[j] + start], K(j)), s[j]), E); A = E; E = D; D = rotl32(C, 10); C = B; B = T; T = sum32(rotl32(sum32_4(Ah, f(79 - j, Bh, Ch, Dh), msg[rh[j] + start], Kh(j)), sh[j]), Eh); Ah = Eh; Eh = Dh; Dh = rotl32(Ch, 10); Ch = Bh; Bh = T; } T = sum32_3(this.h[1], C, Dh); this.h[1] = sum32_3(this.h[2], D, Eh); this.h[2] = sum32_3(this.h[3], E, Ah); this.h[3] = sum32_3(this.h[4], A, Bh); this.h[4] = sum32_3(this.h[0], B, Ch); this.h[0] = T; }; RIPEMD160.prototype._digest = function digest(enc) { if (enc === "hex") return utils.toHex32(this.h, "little"); else return utils.split32(this.h, "little"); }; function f(j, x, y, z) { if (j <= 15) return x ^ y ^ z; else if (j <= 31) return (x & y) | (~x & z); else if (j <= 47) return (x | ~y) ^ z; else if (j <= 63) return (x & z) | (y & ~z); else return x ^ (y | ~z); } function K(j) { if (j <= 15) return 0; else if (j <= 31) return 1518500249; else if (j <= 47) return 1859775393; else if (j <= 63) return 2400959708; else return 2840853838; } function Kh(j) { if (j <= 15) return 1352829926; else if (j <= 31) return 1548603684; else if (j <= 47) return 1836072691; else if (j <= 63) return 2053994217; else return 0; } var r = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, ]; var rh = [ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, ]; var s = [ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, ]; var sh = [ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, ]; }, }); // ../../node_modules/hash.js/lib/hash/hmac.js var require_hmac = __commonJS({ "../../node_modules/hash.js/lib/hash/hmac.js"(exports, module) { "use strict"; var utils = require_utils3(); var assert = require_minimalistic_assert(); function Hmac(hash, key, enc) { if (!(this instanceof Hmac)) return new Hmac(hash, key, enc); this.Hash = hash; this.blockSize = hash.blockSize / 8; this.outSize = hash.outSize / 8; this.inner = null; this.outer = null; this._init(utils.toArray(key, enc)); } module.exports = Hmac; Hmac.prototype._init = function init(key) { if (key.length > this.blockSize) key = new this.Hash().update(key).digest(); assert(key.length <= this.blockSize); for (var i = key.length; i < this.blockSize; i++) key.push(0); for (i = 0; i < key.length; i++) key[i] ^= 54; this.inner = new this.Hash().update(key); for (i = 0; i < key.length; i++) key[i] ^= 106; this.outer = new this.Hash().update(key); }; Hmac.prototype.update = function update(msg, enc) { this.inner.update(msg, enc); return this; }; Hmac.prototype.digest = function digest(enc) { this.outer.update(this.inner.digest()); return this.outer.digest(enc); }; }, }); // ../../node_modules/hash.js/lib/hash.js var require_hash = __commonJS({ "../../node_modules/hash.js/lib/hash.js"(exports) { var hash = exports; hash.utils = require_utils3(); hash.common = require_common(); hash.sha = require_sha(); hash.ripemd = require_ripemd(); hash.hmac = require_hmac(); hash.sha1 = hash.sha.sha1; hash.sha256 = hash.sha.sha256; hash.sha224 = hash.sha.sha224; hash.sha384 = hash.sha.sha384; hash.sha512 = hash.sha.sha512; hash.ripemd160 = hash.ripemd.ripemd160; }, }); // ../../node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js var require_secp256k1 = __commonJS({ "../../node_modules/elliptic/lib/elliptic/precomputed/secp256k1.js"(exports, module) { module.exports = { doubles: { step: 4, points: [ [ "e60fce93b59e9ec53011aabc21c23e97b2a31369b87a5ae9c44ee89e2a6dec0a", "f7e3507399e595929db99f34f57937101296891e44d23f0be1f32cce69616821", ], [ "8282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", "11f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf", ], [ "175e159f728b865a72f99cc6c6fc846de0b93833fd2222ed73fce5b551e5b739", "d3506e0d9e3c79eba4ef97a51ff71f5eacb5955add24345c6efa6ffee9fed695", ], [ "363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640", "4e273adfc732221953b445397f3363145b9a89008199ecb62003c7f3bee9de9", ], [ "8b4b5f165df3c2be8c6244b5b745638843e4a781a15bcd1b69f79a55dffdf80c", "4aad0a6f68d308b4b3fbd7813ab0da04f9e336546162ee56b3eff0c65fd4fd36", ], [ "723cbaa6e5db996d6bf771c00bd548c7b700dbffa6c0e77bcb6115925232fcda", "96e867b5595cc498a921137488824d6e2660a0653779494801dc069d9eb39f5f", ], [ "eebfa4d493bebf98ba5feec812c2d3b50947961237a919839a533eca0e7dd7fa", "5d9a8ca3970ef0f269ee7edaf178089d9ae4cdc3a711f712ddfd4fdae1de8999", ], [ "100f44da696e71672791d0a09b7bde459f1215a29b3c03bfefd7835b39a48db0", "cdd9e13192a00b772ec8f3300c090666b7ff4a18ff5195ac0fbd5cd62bc65a09", ], [ "e1031be262c7ed1b1dc9227a4a04c017a77f8d4464f3b3852c8acde6e534fd2d", "9d7061928940405e6bb6a4176597535af292dd419e1ced79a44f18f29456a00d", ], [ "feea6cae46d55b530ac2839f143bd7ec5cf8b266a41d6af52d5e688d9094696d", "e57c6b6c97dce1bab06e4e12bf3ecd5c981c8957cc41442d3155debf18090088", ], [ "da67a91d91049cdcb367be4be6ffca3cfeed657d808583de33fa978bc1ec6cb1", "9bacaa35481642bc41f463f7ec9780e5dec7adc508f740a17e9ea8e27a68be1d", ], [ "53904faa0b334cdda6e000935ef22151ec08d0f7bb11069f57545ccc1a37b7c0", "5bc087d0bc80106d88c9eccac20d3c1c13999981e14434699dcb096b022771c8", ], [ "8e7bcd0bd35983a7719cca7764ca906779b53a043a9b8bcaeff959f43ad86047", "10b7770b2a3da4b3940310420ca9514579e88e2e47fd68b3ea10047e8460372a", ], [ "385eed34c1cdff21e6d0818689b81bde71a7f4f18397e6690a841e1599c43862", "283bebc3e8ea23f56701de19e9ebf4576b304eec2086dc8cc0458fe5542e5453", ], [ "6f9d9b803ecf191637c73a4413dfa180fddf84a5947fbc9c606ed86c3fac3a7", "7c80c68e603059ba69b8e2a30e45c4d47ea4dd2f5c281002d86890603a842160", ], [ "3322d401243c4e2582a2147c104d6ecbf774d163db0f5e5313b7e0e742d0e6bd", "56e70797e9664ef5bfb019bc4ddaf9b72805f63ea2873af624f3a2e96c28b2a0", ], [ "85672c7d2de0b7da2bd1770d89665868741b3f9af7643397721d74d28134ab83", "7c481b9b5b43b2eb6374049bfa62c2e5e77f17fcc5298f44c8e3094f790313a6", ], [ "948bf809b1988a46b06c9f1919413b10f9226c60f668832ffd959af60c82a0a", "53a562856dcb6646dc6b74c5d1c3418c6d4dff08c97cd2bed4cb7f88d8c8e589", ], [ "6260ce7f461801c34f067ce0f02873a8f1b0e44dfc69752accecd819f38fd8e8", "bc2da82b6fa5b571a7f09049776a1ef7ecd292238051c198c1a84e95b2b4ae17", ], [ "e5037de0afc1d8d43d8348414bbf4103043ec8f575bfdc432953cc8d2037fa2d", "4571534baa94d3b5f9f98d09fb990bddbd5f5b03ec481f10e0e5dc841d755bda", ], [ "e06372b0f4a207adf5ea905e8f1771b4e7e8dbd1c6a6c5b725866a0ae4fce725", "7a908974bce18cfe12a27bb2ad5a488cd7484a7787104870b27034f94eee31dd", ], [ "213c7a715cd5d45358d0bbf9dc0ce02204b10bdde2a3f58540ad6908d0559754", "4b6dad0b5ae462507013ad06245ba190bb4850f5f36a7eeddff2c27534b458f2", ], [ "4e7c272a7af4b34e8dbb9352a5419a87e2838c70adc62cddf0cc3a3b08fbd53c", "17749c766c9d0b18e16fd09f6def681b530b9614bff7dd33e0b3941817dcaae6", ], [ "fea74e3dbe778b1b10f238ad61686aa5c76e3db2be43057632427e2840fb27b6", "6e0568db9b0b13297cf674deccb6af93126b596b973f7b77701d3db7f23cb96f", ], [ "76e64113f677cf0e10a2570d599968d31544e179b760432952c02a4417bdde39", "c90ddf8dee4e95cf577066d70681f0d35e2a33d2b56d2032b4b1752d1901ac01", ], [ "c738c56b03b2abe1e8281baa743f8f9a8f7cc643df26cbee3ab150242bcbb891", "893fb578951ad2537f718f2eacbfbbbb82314eef7880cfe917e735d9699a84c3", ], [ "d895626548b65b81e264c7637c972877d1d72e5f3a925014372e9f6588f6c14b", "febfaa38f2bc7eae728ec60818c340eb03428d632bb067e179363ed75d7d991f", ], [ "b8da94032a957518eb0f6433571e8761ceffc73693e84edd49150a564f676e03", "2804dfa44805a1e4d7c99cc9762808b092cc584d95ff3b511488e4e74efdf6e7", ], [ "e80fea14441fb33a7d8adab9475d7fab2019effb5156a792f1a11778e3c0df5d", "eed1de7f638e00771e89768ca3ca94472d155e80af322ea9fcb4291b6ac9ec78", ], [ "a301697bdfcd704313ba48e51d567543f2a182031efd6915ddc07bbcc4e16070", "7370f91cfb67e4f5081809fa25d40f9b1735dbf7c0a11a130c0d1a041e177ea1", ], [ "90ad85b389d6b936463f9d0512678de208cc330b11307fffab7ac63e3fb04ed4", "e507a3620a38261affdcbd9427222b839aefabe1582894d991d4d48cb6ef150", ], [ "8f68b9d2f63b5f339239c1ad981f162ee88c5678723ea3351b7b444c9ec4c0da", "662a9f2dba063986de1d90c2b6be215dbbea2cfe95510bfdf23cbf79501fff82", ], [ "e4f3fb0176af85d65ff99ff9198c36091f48e86503681e3e6686fd5053231e11", "1e63633ad0ef4f1c1661a6d0ea02b7286cc7e74ec951d1c9822c38576feb73bc", ], [ "8c00fa9b18ebf331eb961537a45a4266c7034f2f0d4e1d0716fb6eae20eae29e", "efa47267fea521a1a9dc343a3736c974c2fadafa81e36c54e7d2a4c66702414b", ], [ "e7a26ce69dd4829f3e10cec0a9e98ed3143d084f308b92c0997fddfc60cb3e41", "2a758e300fa7984b471b006a1aafbb18d0a6b2c0420e83e20e8a9421cf2cfd51", ], [ "b6459e0ee3662ec8d23540c223bcbdc571cbcb967d79424f3cf29eb3de6b80ef", "67c876d06f3e06de1dadf16e5661db3c4b3ae6d48e35b2ff30bf0b61a71ba45", ], [ "d68a80c8280bb840793234aa118f06231d6f1fc67e73c5a5deda0f5b496943e8", "db8ba9fff4b586d00c4b1f9177b0e28b5b0e7b8f7845295a294c84266b133120", ], [ "324aed7df65c804252dc0270907a30b09612aeb973449cea4095980fc28d3d5d", "648a365774b61f2ff130c0c35aec1f4f19213b0c7e332843967224af96ab7c84", ], [ "4df9c14919cde61f6d51dfdbe5fee5dceec4143ba8d1ca888e8bd373fd054c96", "35ec51092d8728050974c23a1d85d4b5d506cdc288490192ebac06cad10d5d", ], [ "9c3919a84a474870faed8a9c1cc66021523489054d7f0308cbfc99c8ac1f98cd", "ddb84f0f4a4ddd57584f044bf260e641905326f76c64c8e6be7e5e03d4fc599d", ], [ "6057170b1dd12fdf8de05f281d8e06bb91e1493a8b91d4cc5a21382120a959e5", "9a1af0b26a6a4807add9a2daf71df262465152bc3ee24c65e899be932385a2a8", ], [ "a576df8e23a08411421439a4518da31880cef0fba7d4df12b1a6973eecb94266", "40a6bf20e76640b2c92b97afe58cd82c432e10a7f514d9f3ee8be11ae1b28ec8", ], [ "7778a78c28dec3e30a05fe9629de8c38bb30d1f5cf9a3a208f763889be58ad71", "34626d9ab5a5b22ff7098e12f2ff580087b38411ff24ac563b513fc1fd9f43ac", ], [ "928955ee637a84463729fd30e7afd2ed5f96274e5ad7e5cb09eda9c06d903ac", "c25621003d3f42a827b78a13093a95eeac3d26efa8a8d83fc5180e935bcd091f", ], [ "85d0fef3ec6db109399064f3a0e3b2855645b4a907ad354527aae75163d82751", "1f03648413a38c0be29d496e582cf5663e8751e96877331582c237a24eb1f962", ], [ "ff2b0dce97eece97c1c9b6041798b85dfdfb6d8882da20308f5404824526087e", "493d13fef524ba188af4c4dc54d07936c7b7ed6fb90e2ceb2c951e01f0c29907", ], [ "827fbbe4b1e880ea9ed2b2e6301b212b57f1ee148cd6dd28780e5e2cf856e241", "c60f9c923c727b0b71bef2c67d1d12687ff7a63186903166d605b68baec293ec", ], [ "eaa649f21f51bdbae7be4ae34ce6e5217a58fdce7f47f9aa7f3b58fa2120e2b3", "be3279ed5bbbb03ac69a80f89879aa5a01a6b965f13f7e59d47a5305ba5ad93d", ], [ "e4a42d43c5cf169d9391df6decf42ee541b6d8f0c9a137401e23632dda34d24f", "4d9f92e716d1c73526fc99ccfb8ad34ce886eedfa8d8e4f13a7f7131deba9414", ], [ "1ec80fef360cbdd954160fadab352b6b92b53576a88fea4947173b9d4300bf19", "aeefe93756b5340d2f3a4958a7abbf5e0146e77f6295a07b671cdc1cc107cefd", ], [ "146a778c04670c2f91b00af4680dfa8bce3490717d58ba889ddb5928366642be", "b318e0ec3354028add669827f9d4b2870aaa971d2f7e5ed1d0b297483d83efd0", ], [ "fa50c0f61d22e5f07e3acebb1aa07b128d0012209a28b9776d76a8793180eef9", "6b84c6922397eba9b72cd2872281a68a5e683293a57a213b38cd8d7d3f4f2811", ], [ "da1d61d0ca721a11b1a5bf6b7d88e8421a288ab5d5bba5220e53d32b5f067ec2", "8157f55a7c99306c79c0766161c91e2966a73899d279b48a655fba0f1ad836f1", ], [ "a8e282ff0c9706907215ff98e8fd416615311de0446f1e062a73b0610d064e13", "7f97355b8db81c09abfb7f3c5b2515888b679a3e50dd6bd6cef7c73111f4cc0c", ], [ "174a53b9c9a285872d39e56e6913cab15d59b1fa512508c022f382de8319497c", "ccc9dc37abfc9c1657b4155f2c47f9e6646b3a1d8cb9854383da13ac079afa73", ], [ "959396981943785c3d3e57edf5018cdbe039e730e4918b3d884fdff09475b7ba", "2e7e552888c331dd8ba0386a4b9cd6849c653f64c8709385e9b8abf87524f2fd", ], [ "d2a63a50ae401e56d645a1153b109a8fcca0a43d561fba2dbb51340c9d82b151", "e82d86fb6443fcb7565aee58b2948220a70f750af484ca52d4142174dcf89405", ], [ "64587e2335471eb890ee7896d7cfdc866bacbdbd3839317b3436f9b45617e073", "d99fcdd5bf6902e2ae96dd6447c299a185b90a39133aeab358299e5e9faf6589", ], [ "8481bde0e4e4d885b3a546d3e549de042f0aa6cea250e7fd358d6c86dd45e458", "38ee7b8cba5404dd84a25bf39cecb2ca900a79c42b262e556d64b1b59779057e", ], [ "13464a57a78102aa62b6979ae817f4637ffcfed3c4b1ce30bcd6303f6caf666b", "69be159004614580ef7e433453ccb0ca48f300a81d0942e13f495a907f6ecc27", ], [ "bc4a9df5b713fe2e9aef430bcc1dc97a0cd9ccede2f28588cada3a0d2d83f366", "d3a81ca6e785c06383937adf4b798caa6e8a9fbfa547b16d758d666581f33c1", ], [ "8c28a97bf8298bc0d23d8c749452a32e694b65e30a9472a3954ab30fe5324caa", "40a30463a3305193378fedf31f7cc0eb7ae784f0451cb9459e71dc73cbef9482", ], [ "8ea9666139527a8c1dd94ce4f071fd23c8b350c5a4bb33748c4ba111faccae0", "620efabbc8ee2782e24e7c0cfb95c5d735b783be9cf0f8e955af34a30e62b945", ], [ "dd3625faef5ba06074669716bbd3788d89bdde815959968092f76cc4eb9a9787", "7a188fa3520e30d461da2501045731ca941461982883395937f68d00c644a573", ], [ "f710d79d9eb962297e4f6232b40e8f7feb2bc63814614d692c12de752408221e", "ea98e67232d3b3295d3b535532115ccac8612c721851617526ae47a9c77bfc82", ], ], }, naf: { wnd: 7, points: [ [ "f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9", "388f7b0f632de8140fe337e62a37f3566500a99934c2231b6cb9fd7584b8e672", ], [ "2f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4", "d8ac222636e5e3d6d4dba9dda6c9c426f788271bab0d6840dca87d3aa6ac62d6", ], [ "5cbdf0646e5db4eaa398f365f2ea7a0e3d419b7e0330e39ce92bddedcac4f9bc", "6aebca40ba255960a3178d6d861a54dba813d0b813fde7b5a5082628087264da", ], [ "acd484e2f0c7f65309ad178a9f559abde09796974c57e714c35f110dfc27ccbe", "cc338921b0a7d9fd64380971763b61e9add888a4375f8e0f05cc262ac64f9c37", ], [ "774ae7f858a9411e5ef4246b70c65aac5649980be5c17891bbec17895da008cb", "d984a032eb6b5e190243dd56d7b7b365372db1e2dff9d6a8301d74c9c953c61b", ], [ "f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8", "ab0902e8d880a89758212eb65cdaf473a1a06da521fa91f29b5cb52db03ed81", ], [ "d7924d4f7d43ea965a465ae3095ff41131e5946f3c85f79e44adbcf8e27e080e", "581e2872a86c72a683842ec228cc6defea40af2bd896d3a5c504dc9ff6a26b58", ], [ "defdea4cdb677750a420fee807eacf21eb9898ae79b9768766e4faa04a2d4a34", "4211ab0694635168e997b0ead2a93daeced1f4a04a95c0f6cfb199f69e56eb77", ], [ "2b4ea0a797a443d293ef5cff444f4979f06acfebd7e86d277475656138385b6c", "85e89bc037945d93b343083b5a1c86131a01f60c50269763b570c854e5c09b7a", ], [ "352bbf4a4cdd12564f93fa332ce333301d9ad40271f8107181340aef25be59d5", "321eb4075348f534d59c18259dda3e1f4a1b3b2e71b1039c67bd3d8bcf81998c", ], [ "2fa2104d6b38d11b0230010559879124e42ab8dfeff5ff29dc9cdadd4ecacc3f", "2de1068295dd865b64569335bd5dd80181d70ecfc882648423ba76b532b7d67", ], [ "9248279b09b4d68dab21a9b066edda83263c3d84e09572e269ca0cd7f5453714", "73016f7bf234aade5d1aa71bdea2b1ff3fc0de2a887912ffe54a32ce97cb3402", ], [ "daed4f2be3a8bf278e70132fb0beb7522f570e144bf615c07e996d443dee8729", "a69dce4a7d6c98e8d4a1aca87ef8d7003f83c230f3afa726ab40e52290be1c55", ], [ "c44d12c7065d812e8acf28d7cbb19f9011ecd9e9fdf281b0e6a3b5e87d22e7db", "2119a460ce326cdc76c45926c982fdac0e106e861edf61c5a039063f0e0e6482", ], [ "6a245bf6dc698504c89a20cfded60853152b695336c28063b61c65cbd269e6b4", "e022cf42c2bd4a708b3f5126f16a24ad8b33ba48d0423b6efd5e6348100d8a82", ], [ "1697ffa6fd9de627c077e3d2fe541084ce13300b0bec1146f95ae57f0d0bd6a5", "b9c398f186806f5d27561506e4557433a2cf15009e498ae7adee9d63d01b2396", ], [ "605bdb019981718b986d0f07e834cb0d9deb8360ffb7f61df982345ef27a7479", "2972d2de4f8d20681a78d93ec96fe23c26bfae84fb14db43b01e1e9056b8c49", ], [ "62d14dab4150bf497402fdc45a215e10dcb01c354959b10cfe31c7e9d87ff33d", "80fc06bd8cc5b01098088a1950eed0db01aa132967ab472235f5642483b25eaf", ], [ "80c60ad0040f27dade5b4b06c408e56b2c50e9f56b9b8b425e555c2f86308b6f", "1c38303f1cc5c30f26e66bad7fe72f70a65eed4cbe7024eb1aa01f56430bd57a", ], [ "7a9375ad6167ad54aa74c6348cc54d344cc5dc9487d847049d5eabb0fa03c8fb", "d0e3fa9eca8726909559e0d79269046bdc59ea10c70ce2b02d499ec224dc7f7", ], [ "d528ecd9b696b54c907a9ed045447a79bb408ec39b68df504bb51f459bc3ffc9", "eecf41253136e5f99966f21881fd656ebc4345405c520dbc063465b521409933", ], [ "49370a4b5f43412ea25f514e8ecdad05266115e4a7ecb1387231808f8b45963", "758f3f41afd6ed428b3081b0512fd62a54c3f3afbb5b6764b653052a12949c9a", ], [ "77f230936ee88cbbd73df930d64702ef881d811e0e1498e2f1c13eb1fc345d74", "958ef42a7886b6400a08266e9ba1b37896c95330d97077cbbe8eb3c7671c60d6", ], [ "f2dac991cc4ce4b9ea44887e5c7c0bce58c80074ab9d4dbaeb28531b7739f530", "e0dedc9b3b2f8dad4da1f32dec2531df9eb5fbeb0598e4fd1a117dba703a3c37", ], [ "463b3d9f662621fb1b4be8fbbe2520125a216cdfc9dae3debcba4850c690d45b", "5ed430d78c296c3543114306dd8622d7c622e27c970a1de31cb377b01af7307e", ], [ "f16f804244e46e2a09232d4aff3b59976b98fac14328a2d1a32496b49998f247", "cedabd9b82203f7e13d206fcdf4e33d92a6c53c26e5cce26d6579962c4e31df6", ], [ "caf754272dc84563b0352b7a14311af55d245315ace27c65369e15f7151d41d1", "cb474660ef35f5f2a41b643fa5e460575f4fa9b7962232a5c32f908318a04476", ], [ "2600ca4b282cb986f85d0f1709979d8b44a09c07cb86d7c124497bc86f082120", "4119b88753c15bd6a693b03fcddbb45d5ac6be74ab5f0ef44b0be9475a7e4b40", ], [ "7635ca72d7e8432c338ec53cd12220bc01c48685e24f7dc8c602a7746998e435", "91b649609489d613d1d5e590f78e6d74ecfc061d57048bad9e76f302c5b9c61", ], [ "754e3239f325570cdbbf4a87deee8a66b7f2b33479d468fbc1a50743bf56cc18", "673fb86e5bda30fb3cd0ed304ea49a023ee33d0197a695d0c5d98093c536683", ], [ "e3e6bd1071a1e96aff57859c82d570f0330800661d1c952f9fe2694691d9b9e8", "59c9e0bba394e76f40c0aa58379a3cb6a5a2283993e90c4167002af4920e37f5", ], [ "186b483d056a033826ae73d88f732985c4ccb1f32ba35f4b4cc47fdcf04aa6eb", "3b952d32c67cf77e2e17446e204180ab21fb8090895138b4a4a797f86e80888b", ], [ "df9d70a6b9876ce544c98561f4be4f725442e6d2b737d9c91a8321724ce0963f", "55eb2dafd84d6ccd5f862b785dc39d4ab157222720ef9da217b8c45cf2ba2417", ], [ "5edd5cc23c51e87a497ca815d5dce0f8ab52554f849ed8995de64c5f34ce7143", "efae9c8dbc14130661e8cec030c89ad0c13c66c0d17a2905cdc706ab7399a868", ], [ "290798c2b6476830da12fe02287e9e777aa3fba1c355b17a722d362f84614fba", "e38da76dcd440621988d00bcf79af25d5b29c094db2a23146d003afd41943e7a", ], [ "af3c423a95d9f5b3054754efa150ac39cd29552fe360257362dfdecef4053b45", "f98a3fd831eb2b749a93b0e6f35cfb40c8cd5aa667a15581bc2feded498fd9c6", ], [ "766dbb24d134e745cccaa28c99bf274906bb66b26dcf98df8d2fed50d884249a", "744b1152eacbe5e38dcc887980da38b897584a65fa06cedd2c924f97cbac5996", ], [ "59dbf46f8c94759ba21277c33784f41645f7b44f6c596a58ce92e666191abe3e", "c534ad44175fbc300f4ea6ce648309a042ce739a7919798cd85e216c4a307f6e", ], [ "f13ada95103c4537305e691e74e9a4a8dd647e711a95e73cb62dc6018cfd87b8", "e13817b44ee14de663bf4bc808341f326949e21a6a75c2570778419bdaf5733d", ], [ "7754b4fa0e8aced06d4167a2c59cca4cda1869c06ebadfb6488550015a88522c", "30e93e864e669d82224b967c3020b8fa8d1e4e350b6cbcc537a48b57841163a2", ], [ "948dcadf5990e048aa3874d46abef9d701858f95de8041d2a6828c99e2262519", "e491a42537f6e597d5d28a3224b1bc25df9154efbd2ef1d2cbba2cae5347d57e", ], [ "7962414450c76c1689c7b48f8202ec37fb224cf5ac0bfa1570328a8a3d7c77ab", "100b610ec4ffb4760d5c1fc133ef6f6b12507a051f04ac5760afa5b29db83437", ], [ "3514087834964b54b15b160644d915485a16977225b8847bb0dd085137ec47ca", "ef0afbb2056205448e1652c48e8127fc6039e77c15c2378b7e7d15a0de293311", ], [ "d3cc30ad6b483e4bc79ce2c9dd8bc54993e947eb8df787b442943d3f7b527eaf", "8b378a22d827278d89c5e9be8f9508ae3c2ad46290358630afb34db04eede0a4", ], [ "1624d84780732860ce1c78fcbfefe08b2b29823db913f6493975ba0ff4847610", "68651cf9b6da903e0914448c6cd9d4ca896878f5282be4c8cc06e2a404078575", ], [ "733ce80da955a8a26902c95633e62a985192474b5af207da6df7b4fd5fc61cd4", "f5435a2bd2badf7d485a4d8b8db9fcce3e1ef8e0201e4578c54673bc1dc5ea1d", ], [ "15d9441254945064cf1a1c33bbd3b49f8966c5092171e699ef258dfab81c045c", "d56eb30b69463e7234f5137b73b84177434800bacebfc685fc37bbe9efe4070d", ], [ "a1d0fcf2ec9de675b612136e5ce70d271c21417c9d2b8aaaac138599d0717940", "edd77f50bcb5a3cab2e90737309667f2641462a54070f3d519212d39c197a629", ], [ "e22fbe15c0af8ccc5780c0735f84dbe9a790badee8245c06c7ca37331cb36980", "a855babad5cd60c88b430a69f53a1a7a38289154964799be43d06d77d31da06", ], [ "311091dd9860e8e20ee13473c1155f5f69635e394704eaa74009452246cfa9b3", "66db656f87d1f04fffd1f04788c06830871ec5a64feee685bd80f0b1286d8374", ], [ "34c1fd04d301be89b31c0442d3e6ac24883928b45a9340781867d4232ec2dbdf", "9414685e97b1b5954bd46f730174136d57f1ceeb487443dc5321857ba73abee", ], [ "f219ea5d6b54701c1c14de5b557eb42a8d13f3abbcd08affcc2a5e6b049b8d63", "4cb95957e83d40b0f73af4544cccf6b1f4b08d3c07b27fb8d8c2962a400766d1", ], [ "d7b8740f74a8fbaab1f683db8f45de26543a5490bca627087236912469a0b448", "fa77968128d9c92ee1010f337ad4717eff15db5ed3c049b3411e0315eaa4593b", ], [ "32d31c222f8f6f0ef86f7c98d3a3335ead5bcd32abdd94289fe4d3091aa824bf", "5f3032f5892156e39ccd3d7915b9e1da2e6dac9e6f26e961118d14b8462e1661", ], [ "7461f371914ab32671045a155d9831ea8793d77cd59592c4340f86cbc18347b5", "8ec0ba238b96bec0cbdddcae0aa442542eee1ff50c986ea6b39847b3cc092ff6", ], [ "ee079adb1df1860074356a25aa38206a6d716b2c3e67453d287698bad7b2b2d6", "8dc2412aafe3be5c4c5f37e0ecc5f9f6a446989af04c4e25ebaac479ec1c8c1e", ], [ "16ec93e447ec83f0467b18302ee620f7e65de331874c9dc72bfd8616ba9da6b5", "5e4631150e62fb40d0e8c2a7ca5804a39d58186a50e497139626778e25b0674d", ], [ "eaa5f980c245f6f038978290afa70b6bd8855897f98b6aa485b96065d537bd99", "f65f5d3e292c2e0819a528391c994624d784869d7e6ea67fb18041024edc07dc", ], [ "78c9407544ac132692ee1910a02439958ae04877151342ea96c4b6b35a49f51", "f3e0319169eb9b85d5404795539a5e68fa1fbd583c064d2462b675f194a3ddb4", ], [ "494f4be219a1a77016dcd838431aea0001cdc8ae7a6fc688726578d9702857a5", "42242a969283a5f339ba7f075e36ba2af925ce30d767ed6e55f4b031880d562c", ], [ "a598a8030da6d86c6bc7f2f5144ea549d28211ea58faa70ebf4c1e665c1fe9b5", "204b5d6f84822c307e4b4a7140737aec23fc63b65b35f86a10026dbd2d864e6b", ], [ "c41916365abb2b5d09192f5f2dbeafec208f020f12570a184dbadc3e58595997", "4f14351d0087efa49d245b328984989d5caf9450f34bfc0ed16e96b58fa9913", ], [ "841d6063a586fa475a724604da03bc5b92a2e0d2e0a36acfe4c73a5514742881", "73867f59c0659e81904f9a1c7543698e62562d6744c169ce7a36de01a8d6154", ], [ "5e95bb399a6971d376026947f89bde2f282b33810928be4ded112ac4d70e20d5", "39f23f366809085beebfc71181313775a99c9aed7d8ba38b161384c746012865", ], [ "36e4641a53948fd476c39f8a99fd974e5ec07564b5315d8bf99471bca0ef2f66", "d2424b1b1abe4eb8164227b085c9aa9456ea13493fd563e06fd51cf5694c78fc", ], [ "336581ea7bfbbb290c191a2f507a41cf5643842170e914faeab27c2c579f726", "ead12168595fe1be99252129b6e56b3391f7ab1410cd1e0ef3dcdcabd2fda224", ], [ "8ab89816dadfd6b6a1f2634fcf00ec8403781025ed6890c4849742706bd43ede", "6fdcef09f2f6d0a044e654aef624136f503d459c3e89845858a47a9129cdd24e", ], [ "1e33f1a746c9c5778133344d9299fcaa20b0938e8acff2544bb40284b8c5fb94", "60660257dd11b3aa9c8ed618d24edff2306d320f1d03010e33a7d2057f3b3b6", ], [ "85b7c1dcb3cec1b7ee7f30ded79dd20a0ed1f4cc18cbcfcfa410361fd8f08f31", "3d98a9cdd026dd43f39048f25a8847f4fcafad1895d7a633c6fed3c35e999511", ], [ "29df9fbd8d9e46509275f4b125d6d45d7fbe9a3b878a7af872a2800661ac5f51", "b4c4fe99c775a606e2d8862179139ffda61dc861c019e55cd2876eb2a27d84b", ], [ "a0b1cae06b0a847a3fea6e671aaf8adfdfe58ca2f768105c8082b2e449fce252", "ae434102edde0958ec4b19d917a6a28e6b72da1834aff0e650f049503a296cf2", ], [ "4e8ceafb9b3e9a136dc7ff67e840295b499dfb3b2133e4ba113f2e4c0e121e5", "cf2174118c8b6d7a4b48f6d534ce5c79422c086a63460502b827ce62a326683c", ], [ "d24a44e047e19b6f5afb81c7ca2f69080a5076689a010919f42725c2b789a33b", "6fb8d5591b466f8fc63db50f1c0f1c69013f996887b8244d2cdec417afea8fa3", ], [ "ea01606a7a6c9cdd249fdfcfacb99584001edd28abbab77b5104e98e8e3b35d4", "322af4908c7312b0cfbfe369f7a7b3cdb7d4494bc2823700cfd652188a3ea98d", ], [ "af8addbf2b661c8a6c6328655eb96651252007d8c5ea31be4ad196de8ce2131f", "6749e67c029b85f52a034eafd096836b2520818680e26ac8f3dfbcdb71749700", ], [ "e3ae1974566ca06cc516d47e0fb165a674a3dabcfca15e722f0e3450f45889", "2aeabe7e4531510116217f07bf4d07300de97e4874f81f533420a72eeb0bd6a4", ], [ "591ee355313d99721cf6993ffed1e3e301993ff3ed258802075ea8ced397e246", "b0ea558a113c30bea60fc4775460c7901ff0b053d25ca2bdeee98f1a4be5d196", ], [ "11396d55fda54c49f19aa97318d8da61fa8584e47b084945077cf03255b52984", "998c74a8cd45ac01289d5833a7beb4744ff536b01b257be4c5767bea93ea57a4", ], [ "3c5d2a1ba39c5a1790000738c9e0c40b8dcdfd5468754b6405540157e017aa7a", "b2284279995a34e2f9d4de7396fc18b80f9b8b9fdd270f6661f79ca4c81bd257", ], [ "cc8704b8a60a0defa3a99a7299f2e9c3fbc395afb04ac078425ef8a1793cc030", "bdd46039feed17881d1e0862db347f8cf395b74fc4bcdc4e940b74e3ac1f1b13", ], [ "c533e4f7ea8555aacd9777ac5cad29b97dd4defccc53ee7ea204119b2889b197", "6f0a256bc5efdf429a2fb6242f1a43a2d9b925bb4a4b3a26bb8e0f45eb596096", ], [ "c14f8f2ccb27d6f109f6d08d03cc96a69ba8c34eec07bbcf566d48e33da6593", "c359d6923bb398f7fd4473e16fe1c28475b740dd098075e6c0e8649113dc3a38", ], [ "a6cbc3046bc6a450bac24789fa17115a4c9739ed75f8f21ce441f72e0b90e6ef", "21ae7f4680e889bb130619e2c0f95a360ceb573c70603139862afd617fa9b9f", ], [ "347d6d9a02c48927ebfb86c1359b1caf130a3c0267d11ce6344b39f99d43cc38", "60ea7f61a353524d1c987f6ecec92f086d565ab687870cb12689ff1e31c74448", ], [ "da6545d2181db8d983f7dcb375ef5866d47c67b1bf31c8cf855ef7437b72656a", "49b96715ab6878a79e78f07ce5680c5d6673051b4935bd897fea824b77dc208a", ], [ "c40747cc9d012cb1a13b8148309c6de7ec25d6945d657146b9d5994b8feb1111", "5ca560753be2a12fc6de6caf2cb489565db936156b9514e1bb5e83037e0fa2d4", ], [ "4e42c8ec82c99798ccf3a610be870e78338c7f713348bd34c8203ef4037f3502", "7571d74ee5e0fb92a7a8b33a07783341a5492144cc54bcc40a94473693606437", ], [ "3775ab7089bc6af823aba2e1af70b236d251cadb0c86743287522a1b3b0dedea", "be52d107bcfa09d8bcb9736a828cfa7fac8db17bf7a76a2c42ad961409018cf7", ], [ "cee31cbf7e34ec379d94fb814d3d775ad954595d1314ba8846959e3e82f74e26", "8fd64a14c06b589c26b947ae2bcf6bfa0149ef0be14ed4d80f448a01c43b1c6d", ], [ "b4f9eaea09b6917619f6ea6a4eb5464efddb58fd45b1ebefcdc1a01d08b47986", "39e5c9925b5a54b07433a4f18c61726f8bb131c012ca542eb24a8ac07200682a", ], [ "d4263dfc3d2df923a0179a48966d30ce84e2515afc3dccc1b77907792ebcc60e", "62dfaf07a0f78feb30e30d6295853ce189e127760ad6cf7fae164e122a208d54", ], [ "48457524820fa65a4f8d35eb6930857c0032acc0a4a2de422233eeda897612c4", "25a748ab367979d98733c38a1fa1c2e7dc6cc07db2d60a9ae7a76aaa49bd0f77", ], [ "dfeeef1881101f2cb11644f3a2afdfc2045e19919152923f367a1767c11cceda", "ecfb7056cf1de042f9420bab396793c0c390bde74b4bbdff16a83ae09a9a7517", ], [ "6d7ef6b17543f8373c573f44e1f389835d89bcbc6062ced36c82df83b8fae859", "cd450ec335438986dfefa10c57fea9bcc521a0959b2d80bbf74b190dca712d10", ], [ "e75605d59102a5a2684500d3b991f2e3f3c88b93225547035af25af66e04541f", "f5c54754a8f71ee540b9b48728473e314f729ac5308b06938360990e2bfad125", ], [ "eb98660f4c4dfaa06a2be453d5020bc99a0c2e60abe388457dd43fefb1ed620c", "6cb9a8876d9cb8520609af3add26cd20a0a7cd8a9411131ce85f44100099223e", ], [ "13e87b027d8514d35939f2e6892b19922154596941888336dc3563e3b8dba942", "fef5a3c68059a6dec5d624114bf1e91aac2b9da568d6abeb2570d55646b8adf1", ], [ "ee163026e9fd6fe017c38f06a5be6fc125424b371ce2708e7bf4491691e5764a", "1acb250f255dd61c43d94ccc670d0f58f49ae3fa15b96623e5430da0ad6c62b2", ], [ "b268f5ef9ad51e4d78de3a750c2dc89b1e626d43505867999932e5db33af3d80", "5f310d4b3c99b9ebb19f77d41c1dee018cf0d34fd4191614003e945a1216e423", ], [ "ff07f3118a9df035e9fad85eb6c7bfe42b02f01ca99ceea3bf7ffdba93c4750d", "438136d603e858a3a5c440c38eccbaddc1d2942114e2eddd4740d098ced1f0d8", ], [ "8d8b9855c7c052a34146fd20ffb658bea4b9f69e0d825ebec16e8c3ce2b526a1", "cdb559eedc2d79f926baf44fb84ea4d44bcf50fee51d7ceb30e2e7f463036758", ], [ "52db0b5384dfbf05bfa9d472d7ae26dfe4b851ceca91b1eba54263180da32b63", "c3b997d050ee5d423ebaf66a6db9f57b3180c902875679de924b69d84a7b375", ], [ "e62f9490d3d51da6395efd24e80919cc7d0f29c3f3fa48c6fff543becbd43352", "6d89ad7ba4876b0b22c2ca280c682862f342c8591f1daf5170e07bfd9ccafa7d", ], [ "7f30ea2476b399b4957509c88f77d0191afa2ff5cb7b14fd6d8e7d65aaab1193", "ca5ef7d4b231c94c3b15389a5f6311e9daff7bb67b103e9880ef4bff637acaec", ], [ "5098ff1e1d9f14fb46a210fada6c903fef0fb7b4a1dd1d9ac60a0361800b7a00", "9731141d81fc8f8084d37c6e7542006b3ee1b40d60dfe5362a5b132fd17ddc0", ], [ "32b78c7de9ee512a72895be6b9cbefa6e2f3c4ccce445c96b9f2c81e2778ad58", "ee1849f513df71e32efc3896ee28260c73bb80547ae2275ba497237794c8753c", ], [ "e2cb74fddc8e9fbcd076eef2a7c72b0ce37d50f08269dfc074b581550547a4f7", "d3aa2ed71c9dd2247a62df062736eb0baddea9e36122d2be8641abcb005cc4a4", ], [ "8438447566d4d7bedadc299496ab357426009a35f235cb141be0d99cd10ae3a8", "c4e1020916980a4da5d01ac5e6ad330734ef0d7906631c4f2390426b2edd791f", ], [ "4162d488b89402039b584c6fc6c308870587d9c46f660b878ab65c82c711d67e", "67163e903236289f776f22c25fb8a3afc1732f2b84b4e95dbda47ae5a0852649", ], [ "3fad3fa84caf0f34f0f89bfd2dcf54fc175d767aec3e50684f3ba4a4bf5f683d", "cd1bc7cb6cc407bb2f0ca647c718a730cf71872e7d0d2a53fa20efcdfe61826", ], [ "674f2600a3007a00568c1a7ce05d0816c1fb84bf1370798f1c69532faeb1a86b", "299d21f9413f33b3edf43b257004580b70db57da0b182259e09eecc69e0d38a5", ], [ "d32f4da54ade74abb81b815ad1fb3b263d82d6c692714bcff87d29bd5ee9f08f", "f9429e738b8e53b968e99016c059707782e14f4535359d582fc416910b3eea87", ], [ "30e4e670435385556e593657135845d36fbb6931f72b08cb1ed954f1e3ce3ff6", "462f9bce619898638499350113bbc9b10a878d35da70740dc695a559eb88db7b", ], [ "be2062003c51cc3004682904330e4dee7f3dcd10b01e580bf1971b04d4cad297", "62188bc49d61e5428573d48a74e1c655b1c61090905682a0d5558ed72dccb9bc", ], [ "93144423ace3451ed29e0fb9ac2af211cb6e84a601df5993c419859fff5df04a", "7c10dfb164c3425f5c71a3f9d7992038f1065224f72bb9d1d902a6d13037b47c", ], [ "b015f8044f5fcbdcf21ca26d6c34fb8197829205c7b7d2a7cb66418c157b112c", "ab8c1e086d04e813744a655b2df8d5f83b3cdc6faa3088c1d3aea1454e3a1d5f", ], [ "d5e9e1da649d97d89e4868117a465a3a4f8a18de57a140d36b3f2af341a21b52", "4cb04437f391ed73111a13cc1d4dd0db1693465c2240480d8955e8592f27447a", ], [ "d3ae41047dd7ca065dbf8ed77b992439983005cd72e16d6f996a5316d36966bb", "bd1aeb21ad22ebb22a10f0303417c6d964f8cdd7df0aca614b10dc14d125ac46", ], [ "463e2763d885f958fc66cdd22800f0a487197d0a82e377b49f80af87c897b065", "bfefacdb0e5d0fd7df3a311a94de062b26b80c61fbc97508b79992671ef7ca7f", ], [ "7985fdfd127c0567c6f53ec1bb63ec3158e597c40bfe747c83cddfc910641917", "603c12daf3d9862ef2b25fe1de289aed24ed291e0ec6708703a5bd567f32ed03", ], [ "74a1ad6b5f76e39db2dd249410eac7f99e74c59cb83d2d0ed5ff1543da7703e9", "cc6157ef18c9c63cd6193d83631bbea0093e0968942e8c33d5737fd790e0db08", ], [ "30682a50703375f602d416664ba19b7fc9bab42c72747463a71d0896b22f6da3", "553e04f6b018b4fa6c8f39e7f311d3176290d0e0f19ca73f17714d9977a22ff8", ], [ "9e2158f0d7c0d5f26c3791efefa79597654e7a2b2464f52b1ee6c1347769ef57", "712fcdd1b9053f09003a3481fa7762e9ffd7c8ef35a38509e2fbf2629008373", ], [ "176e26989a43c9cfeba4029c202538c28172e566e3c4fce7322857f3be327d66", "ed8cc9d04b29eb877d270b4878dc43c19aefd31f4eee09ee7b47834c1fa4b1c3", ], [ "75d46efea3771e6e68abb89a13ad747ecf1892393dfc4f1b7004788c50374da8", "9852390a99507679fd0b86fd2b39a868d7efc22151346e1a3ca4726586a6bed8", ], [ "809a20c67d64900ffb698c4c825f6d5f2310fb0451c869345b7319f645605721", "9e994980d9917e22b76b061927fa04143d096ccc54963e6a5ebfa5f3f8e286c1", ], [ "1b38903a43f7f114ed4500b4eac7083fdefece1cf29c63528d563446f972c180", "4036edc931a60ae889353f77fd53de4a2708b26b6f5da72ad3394119daf408f9", ], ], }, }; }, }); // ../../node_modules/elliptic/lib/elliptic/curves.js var require_curves = __commonJS({ "../../node_modules/elliptic/lib/elliptic/curves.js"(exports) { "use strict"; var curves = exports; var hash = require_hash(); var curve = require_curve(); var utils = require_utils2(); var assert = utils.assert; function PresetCurve(options) { if (options.type === "short") this.curve = new curve.short(options); else if (options.type === "edwards") this.curve = new curve.edwards(options); else this.curve = new curve.mont(options); this.g = this.curve.g; this.n = this.curve.n; this.hash = options.hash; assert(this.g.validate(), "Invalid curve"); assert(this.g.mul(this.n).isInfinity(), "Invalid curve, G*N != O"); } curves.PresetCurve = PresetCurve; function defineCurve(name, options) { Object.defineProperty(curves, name, { configurable: true, enumerable: true, get: function () { var curve2 = new PresetCurve(options); Object.defineProperty(curves, name, { configurable: true, enumerable: true, value: curve2, }); return curve2; }, }); } defineCurve("p192", { type: "short", prime: "p192", p: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff", a: "ffffffff ffffffff ffffffff fffffffe ffffffff fffffffc", b: "64210519 e59c80e7 0fa7e9ab 72243049 feb8deec c146b9b1", n: "ffffffff ffffffff ffffffff 99def836 146bc9b1 b4d22831", hash: hash.sha256, gRed: false, g: [ "188da80e b03090f6 7cbf20eb 43a18800 f4ff0afd 82ff1012", "07192b95 ffc8da78 631011ed 6b24cdd5 73f977a1 1e794811", ], }); defineCurve("p224", { type: "short", prime: "p224", p: "ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001", a: "ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff fffffffe", b: "b4050a85 0c04b3ab f5413256 5044b0b7 d7bfd8ba 270b3943 2355ffb4", n: "ffffffff ffffffff ffffffff ffff16a2 e0b8f03e 13dd2945 5c5c2a3d", hash: hash.sha256, gRed: false, g: [ "b70e0cbd 6bb4bf7f 321390b9 4a03c1d3 56c21122 343280d6 115c1d21", "bd376388 b5f723fb 4c22dfe6 cd4375a0 5a074764 44d58199 85007e34", ], }); defineCurve("p256", { type: "short", prime: null, p: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff ffffffff", a: "ffffffff 00000001 00000000 00000000 00000000 ffffffff ffffffff fffffffc", b: "5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b", n: "ffffffff 00000000 ffffffff ffffffff bce6faad a7179e84 f3b9cac2 fc632551", hash: hash.sha256, gRed: false, g: [ "6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296", "4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5", ], }); defineCurve("p384", { type: "short", prime: null, p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 ffffffff", a: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff 00000000 00000000 fffffffc", b: "b3312fa7 e23ee7e4 988e056b e3f82d19 181d9c6e fe814112 0314088f 5013875a c656398d 8a2ed19d 2a85c8ed d3ec2aef", n: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff c7634d81 f4372ddf 581a0db2 48b0a77a ecec196a ccc52973", hash: hash.sha384, gRed: false, g: [ "aa87ca22 be8b0537 8eb1c71e f320ad74 6e1d3b62 8ba79b98 59f741e0 82542a38 5502f25d bf55296c 3a545e38 72760ab7", "3617de4a 96262c6f 5d9e98bf 9292dc29 f8f41dbd 289a147c e9da3113 b5f0b8c0 0a60b1ce 1d7e819d 7a431d7c 90ea0e5f", ], }); defineCurve("p521", { type: "short", prime: null, p: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff", a: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffc", b: "00000051 953eb961 8e1c9a1f 929a21a0 b68540ee a2da725b 99b315f3 b8b48991 8ef109e1 56193951 ec7e937b 1652c0bd 3bb1bf07 3573df88 3d2c34f1 ef451fd4 6b503f00", n: "000001ff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffa 51868783 bf2f966b 7fcc0148 f709a5d0 3bb5c9b8 899c47ae bb6fb71e 91386409", hash: hash.sha512, gRed: false, g: [ "000000c6 858e06b7 0404e9cd 9e3ecb66 2395b442 9c648139 053fb521 f828af60 6b4d3dba a14b5e77 efe75928 fe1dc127 a2ffa8de 3348b3c1 856a429b f97e7e31 c2e5bd66", "00000118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9 98f54449 579b4468 17afbd17 273e662c 97ee7299 5ef42640 c550b901 3fad0761 353c7086 a272c240 88be9476 9fd16650", ], }); defineCurve("curve25519", { type: "mont", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "76d06", b: "1", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: hash.sha256, gRed: false, g: ["9"], }); defineCurve("ed25519", { type: "edwards", prime: "p25519", p: "7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed", a: "-1", c: "1", // -121665 * (121666^(-1)) (mod P) d: "52036cee2b6ffe73 8cc740797779e898 00700a4d4141d8ab 75eb4dca135978a3", n: "1000000000000000 0000000000000000 14def9dea2f79cd6 5812631a5cf5d3ed", hash: hash.sha256, gRed: false, g: [ "216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a", // 4/5 "6666666666666666666666666666666666666666666666666666666666666658", ], }); var pre; try { pre = require_secp256k1(); } catch (e) { pre = void 0; } defineCurve("secp256k1", { type: "short", prime: "k256", p: "ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f", a: "0", b: "7", n: "ffffffff ffffffff ffffffff fffffffe baaedce6 af48a03b bfd25e8c d0364141", h: "1", hash: hash.sha256, // Precomputed endomorphism beta: "7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee", lambda: "5363ad4cc05c30e0a5261c028812645a122e22ea20816678df02967c1b23bd72", basis: [ { a: "3086d221a7d46bcde86c90e49284eb15", b: "-e4437ed6010e88286f547fa90abfe4c3", }, { a: "114ca50f7a8e2f3f657c1108d9d44cfd8", b: "3086d221a7d46bcde86c90e49284eb15", }, ], gRed: false, g: [ "79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798", "483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", pre, ], }); }, }); // ../../node_modules/hmac-drbg/lib/hmac-drbg.js var require_hmac_drbg = __commonJS({ "../../node_modules/hmac-drbg/lib/hmac-drbg.js"(exports, module) { "use strict"; var hash = require_hash(); var utils = require_utils(); var assert = require_minimalistic_assert(); function HmacDRBG(options) { if (!(this instanceof HmacDRBG)) return new HmacDRBG(options); this.hash = options.hash; this.predResist = !!options.predResist; this.outLen = this.hash.outSize; this.minEntropy = options.minEntropy || this.hash.hmacStrength; this._reseed = null; this.reseedInterval = null; this.K = null; this.V = null; var entropy = utils.toArray(options.entropy, options.entropyEnc || "hex"); var nonce = utils.toArray(options.nonce, options.nonceEnc || "hex"); var pers = utils.toArray(options.pers, options.persEnc || "hex"); assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"); this._init(entropy, nonce, pers); } module.exports = HmacDRBG; HmacDRBG.prototype._init = function init(entropy, nonce, pers) { var seed = entropy.concat(nonce).concat(pers); this.K = new Array(this.outLen / 8); this.V = new Array(this.outLen / 8); for (var i = 0; i < this.V.length; i++) { this.K[i] = 0; this.V[i] = 1; } this._update(seed); this._reseed = 1; this.reseedInterval = 281474976710656; }; HmacDRBG.prototype._hmac = function hmac() { return new hash.hmac(this.hash, this.K); }; HmacDRBG.prototype._update = function update(seed) { var kmac = this._hmac().update(this.V).update([0]); if (seed) kmac = kmac.update(seed); this.K = kmac.digest(); this.V = this._hmac().update(this.V).digest(); if (!seed) return; this.K = this._hmac().update(this.V).update([1]).update(seed).digest(); this.V = this._hmac().update(this.V).digest(); }; HmacDRBG.prototype.reseed = function reseed(entropy, entropyEnc, add, addEnc) { if (typeof entropyEnc !== "string") { addEnc = add; add = entropyEnc; entropyEnc = null; } entropy = utils.toArray(entropy, entropyEnc); add = utils.toArray(add, addEnc); assert(entropy.length >= this.minEntropy / 8, "Not enough entropy. Minimum is: " + this.minEntropy + " bits"); this._update(entropy.concat(add || [])); this._reseed = 1; }; HmacDRBG.prototype.generate = function generate(len, enc, add, addEnc) { if (this._reseed > this.reseedInterval) throw new Error("Reseed is required"); if (typeof enc !== "string") { addEnc = add; add = enc; enc = null; } if (add) { add = utils.toArray(add, addEnc || "hex"); this._update(add); } var temp = []; while (temp.length < len) { this.V = this._hmac().update(this.V).digest(); temp = temp.concat(this.V); } var res = temp.slice(0, len); this._update(add); this._reseed++; return utils.encode(res, enc); }; }, }); // ../../node_modules/elliptic/lib/elliptic/ec/key.js var require_key = __commonJS({ "../../node_modules/elliptic/lib/elliptic/ec/key.js"(exports, module) { "use strict"; var BN = require_bn(); var utils = require_utils2(); var assert = utils.assert; function KeyPair(ec2, options) { this.ec = ec2; this.priv = null; this.pub = null; if (options.priv) this._importPrivate(options.priv, options.privEnc); if (options.pub) this._importPublic(options.pub, options.pubEnc); } module.exports = KeyPair; KeyPair.fromPublic = function fromPublic(ec2, pub, enc) { if (pub instanceof KeyPair) return pub; return new KeyPair(ec2, { pub, pubEnc: enc, }); }; KeyPair.fromPrivate = function fromPrivate(ec2, priv, enc) { if (priv instanceof KeyPair) return priv; return new KeyPair(ec2, { priv, privEnc: enc, }); }; KeyPair.prototype.validate = function validate() { var pub = this.getPublic(); if (pub.isInfinity()) return { result: false, reason: "Invalid public key" }; if (!pub.validate()) return { result: false, reason: "Public key is not a point" }; if (!pub.mul(this.ec.curve.n).isInfinity()) return { result: false, reason: "Public key * N != O" }; return { result: true, reason: null }; }; KeyPair.prototype.getPublic = function getPublic(compact, enc) { if (typeof compact === "string") { enc = compact; compact = null; } if (!this.pub) this.pub = this.ec.g.mul(this.priv); if (!enc) return this.pub; return this.pub.encode(enc, compact); }; KeyPair.prototype.getPrivate = function getPrivate(enc) { if (enc === "hex") return this.priv.toString(16, 2); else return this.priv; }; KeyPair.prototype._importPrivate = function _importPrivate(key, enc) { this.priv = new BN(key, enc || 16); this.priv = this.priv.umod(this.ec.curve.n); }; KeyPair.prototype._importPublic = function _importPublic(key, enc) { if (key.x || key.y) { if (this.ec.curve.type === "mont") { assert(key.x, "Need x coordinate"); } else if (this.ec.curve.type === "short" || this.ec.curve.type === "edwards") { assert(key.x && key.y, "Need both x and y coordinate"); } this.pub = this.ec.curve.point(key.x, key.y); return; } this.pub = this.ec.curve.decodePoint(key, enc); }; KeyPair.prototype.derive = function derive(pub) { if (!pub.validate()) { assert(pub.validate(), "public point not validated"); } return pub.mul(this.priv).getX(); }; KeyPair.prototype.sign = function sign(msg, enc, options) { return this.ec.sign(msg, this, enc, options); }; KeyPair.prototype.verify = function verify(msg, signature) { return this.ec.verify(msg, signature, this); }; KeyPair.prototype.inspect = function inspect() { return ( "" ); }; }, }); // ../../node_modules/elliptic/lib/elliptic/ec/signature.js var require_signature = __commonJS({ "../../node_modules/elliptic/lib/elliptic/ec/signature.js"(exports, module) { "use strict"; var BN = require_bn(); var utils = require_utils2(); var assert = utils.assert; function Signature(options, enc) { if (options instanceof Signature) return options; if (this._importDER(options, enc)) return; assert(options.r && options.s, "Signature without r or s"); this.r = new BN(options.r, 16); this.s = new BN(options.s, 16); if (options.recoveryParam === void 0) this.recoveryParam = null; else this.recoveryParam = options.recoveryParam; } module.exports = Signature; function Position() { this.place = 0; } function getLength(buf, p) { var initial = buf[p.place++]; if (!(initial & 128)) { return initial; } var octetLen = initial & 15; if (octetLen === 0 || octetLen > 4) { return false; } var val = 0; for (var i = 0, off = p.place; i < octetLen; i++, off++) { val <<= 8; val |= buf[off]; val >>>= 0; } if (val <= 127) { return false; } p.place = off; return val; } function rmPadding(buf) { var i = 0; var len = buf.length - 1; while (!buf[i] && !(buf[i + 1] & 128) && i < len) { i++; } if (i === 0) { return buf; } return buf.slice(i); } Signature.prototype._importDER = function _importDER(data, enc) { data = utils.toArray(data, enc); var p = new Position(); if (data[p.place++] !== 48) { return false; } var len = getLength(data, p); if (len === false) { return false; } if (len + p.place !== data.length) { return false; } if (data[p.place++] !== 2) { return false; } var rlen = getLength(data, p); if (rlen === false) { return false; } var r = data.slice(p.place, rlen + p.place); p.place += rlen; if (data[p.place++] !== 2) { return false; } var slen = getLength(data, p); if (slen === false) { return false; } if (data.length !== slen + p.place) { return false; } var s = data.slice(p.place, slen + p.place); if (r[0] === 0) { if (r[1] & 128) { r = r.slice(1); } else { return false; } } if (s[0] === 0) { if (s[1] & 128) { s = s.slice(1); } else { return false; } } this.r = new BN(r); this.s = new BN(s); this.recoveryParam = null; return true; }; function constructLength(arr, len) { if (len < 128) { arr.push(len); return; } var octets = 1 + ((Math.log(len) / Math.LN2) >>> 3); arr.push(octets | 128); while (--octets) { arr.push((len >>> (octets << 3)) & 255); } arr.push(len); } Signature.prototype.toDER = function toDER(enc) { var r = this.r.toArray(); var s = this.s.toArray(); if (r[0] & 128) r = [0].concat(r); if (s[0] & 128) s = [0].concat(s); r = rmPadding(r); s = rmPadding(s); while (!s[0] && !(s[1] & 128)) { s = s.slice(1); } var arr = [2]; constructLength(arr, r.length); arr = arr.concat(r); arr.push(2); constructLength(arr, s.length); var backHalf = arr.concat(s); var res = [48]; constructLength(res, backHalf.length); res = res.concat(backHalf); return utils.encode(res, enc); }; }, }); // ../../node_modules/elliptic/lib/elliptic/ec/index.js var require_ec = __commonJS({ "../../node_modules/elliptic/lib/elliptic/ec/index.js"(exports, module) { "use strict"; var BN = require_bn(); var HmacDRBG = require_hmac_drbg(); var utils = require_utils2(); var curves = require_curves(); var rand = require_brorand(); var assert = utils.assert; var KeyPair = require_key(); var Signature = require_signature(); function EC(options) { if (!(this instanceof EC)) return new EC(options); if (typeof options === "string") { assert(Object.prototype.hasOwnProperty.call(curves, options), "Unknown curve " + options); options = curves[options]; } if (options instanceof curves.PresetCurve) options = { curve: options }; this.curve = options.curve.curve; this.n = this.curve.n; this.nh = this.n.ushrn(1); this.g = this.curve.g; this.g = options.curve.g; this.g.precompute(options.curve.n.bitLength() + 1); this.hash = options.hash || options.curve.hash; } module.exports = EC; EC.prototype.keyPair = function keyPair(options) { return new KeyPair(this, options); }; EC.prototype.keyFromPrivate = function keyFromPrivate(priv, enc) { return KeyPair.fromPrivate(this, priv, enc); }; EC.prototype.keyFromPublic = function keyFromPublic(pub, enc) { return KeyPair.fromPublic(this, pub, enc); }; EC.prototype.genKeyPair = function genKeyPair(options) { if (!options) options = {}; var drbg = new HmacDRBG({ hash: this.hash, pers: options.pers, persEnc: options.persEnc || "utf8", entropy: options.entropy || rand(this.hash.hmacStrength), entropyEnc: (options.entropy && options.entropyEnc) || "utf8", nonce: this.n.toArray(), }); var bytes = this.n.byteLength(); var ns2 = this.n.sub(new BN(2)); for (;;) { var priv = new BN(drbg.generate(bytes)); if (priv.cmp(ns2) > 0) continue; priv.iaddn(1); return this.keyFromPrivate(priv); } }; EC.prototype._truncateToN = function _truncateToN(msg, truncOnly) { var delta = msg.byteLength() * 8 - this.n.bitLength(); if (delta > 0) msg = msg.ushrn(delta); if (!truncOnly && msg.cmp(this.n) >= 0) return msg.sub(this.n); else return msg; }; EC.prototype.sign = function sign(msg, key, enc, options) { if (typeof enc === "object") { options = enc; enc = null; } if (!options) options = {}; key = this.keyFromPrivate(key, enc); msg = this._truncateToN(new BN(msg, 16)); var bytes = this.n.byteLength(); var bkey = key.getPrivate().toArray("be", bytes); var nonce = msg.toArray("be", bytes); var drbg = new HmacDRBG({ hash: this.hash, entropy: bkey, nonce, pers: options.pers, persEnc: options.persEnc || "utf8", }); var ns1 = this.n.sub(new BN(1)); for (var iter = 0; ; iter++) { var k = options.k ? options.k(iter) : new BN(drbg.generate(this.n.byteLength())); k = this._truncateToN(k, true); if (k.cmpn(1) <= 0 || k.cmp(ns1) >= 0) continue; var kp = this.g.mul(k); if (kp.isInfinity()) continue; var kpX = kp.getX(); var r = kpX.umod(this.n); if (r.cmpn(0) === 0) continue; var s = k.invm(this.n).mul(r.mul(key.getPrivate()).iadd(msg)); s = s.umod(this.n); if (s.cmpn(0) === 0) continue; var recoveryParam = (kp.getY().isOdd() ? 1 : 0) | (kpX.cmp(r) !== 0 ? 2 : 0); if (options.canonical && s.cmp(this.nh) > 0) { s = this.n.sub(s); recoveryParam ^= 1; } return new Signature({ r, s, recoveryParam }); } }; EC.prototype.verify = function verify(msg, signature, key, enc) { msg = this._truncateToN(new BN(msg, 16)); key = this.keyFromPublic(key, enc); signature = new Signature(signature, "hex"); var r = signature.r; var s = signature.s; if (r.cmpn(1) < 0 || r.cmp(this.n) >= 0) return false; if (s.cmpn(1) < 0 || s.cmp(this.n) >= 0) return false; var sinv = s.invm(this.n); var u1 = sinv.mul(msg).umod(this.n); var u2 = sinv.mul(r).umod(this.n); var p; if (!this.curve._maxwellTrick) { p = this.g.mulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; return p.getX().umod(this.n).cmp(r) === 0; } p = this.g.jmulAdd(u1, key.getPublic(), u2); if (p.isInfinity()) return false; return p.eqXToP(r); }; EC.prototype.recoverPubKey = function (msg, signature, j, enc) { assert((3 & j) === j, "The recovery param is more than two bits"); signature = new Signature(signature, enc); var n = this.n; var e = new BN(msg); var r = signature.r; var s = signature.s; var isYOdd = j & 1; var isSecondKey = j >> 1; if (r.cmp(this.curve.p.umod(this.curve.n)) >= 0 && isSecondKey) throw new Error("Unable to find sencond key candinate"); if (isSecondKey) r = this.curve.pointFromX(r.add(this.curve.n), isYOdd); else r = this.curve.pointFromX(r, isYOdd); var rInv = signature.r.invm(n); var s1 = n.sub(e).mul(rInv).umod(n); var s2 = s.mul(rInv).umod(n); return this.g.mulAdd(s1, r, s2); }; EC.prototype.getKeyRecoveryParam = function (e, signature, Q, enc) { signature = new Signature(signature, enc); if (signature.recoveryParam !== null) return signature.recoveryParam; for (var i = 0; i < 4; i++) { var Qprime; try { Qprime = this.recoverPubKey(e, signature, i); } catch (e2) { continue; } if (Qprime.eq(Q)) return i; } throw new Error("Unable to find valid recovery factor"); }; }, }); // ../../node_modules/elliptic/lib/elliptic/eddsa/key.js var require_key2 = __commonJS({ "../../node_modules/elliptic/lib/elliptic/eddsa/key.js"(exports, module) { "use strict"; var utils = require_utils2(); var assert = utils.assert; var parseBytes = utils.parseBytes; var cachedProperty = utils.cachedProperty; function KeyPair(eddsa, params) { this.eddsa = eddsa; this._secret = parseBytes(params.secret); if (eddsa.isPoint(params.pub)) this._pub = params.pub; else this._pubBytes = parseBytes(params.pub); } KeyPair.fromPublic = function fromPublic(eddsa, pub) { if (pub instanceof KeyPair) return pub; return new KeyPair(eddsa, { pub }); }; KeyPair.fromSecret = function fromSecret(eddsa, secret) { if (secret instanceof KeyPair) return secret; return new KeyPair(eddsa, { secret }); }; KeyPair.prototype.secret = function secret() { return this._secret; }; cachedProperty(KeyPair, "pubBytes", function pubBytes() { return this.eddsa.encodePoint(this.pub()); }); cachedProperty(KeyPair, "pub", function pub() { if (this._pubBytes) return this.eddsa.decodePoint(this._pubBytes); return this.eddsa.g.mul(this.priv()); }); cachedProperty(KeyPair, "privBytes", function privBytes() { var eddsa = this.eddsa; var hash = this.hash(); var lastIx = eddsa.encodingLength - 1; var a = hash.slice(0, eddsa.encodingLength); a[0] &= 248; a[lastIx] &= 127; a[lastIx] |= 64; return a; }); cachedProperty(KeyPair, "priv", function priv() { return this.eddsa.decodeInt(this.privBytes()); }); cachedProperty(KeyPair, "hash", function hash() { return this.eddsa.hash().update(this.secret()).digest(); }); cachedProperty(KeyPair, "messagePrefix", function messagePrefix() { return this.hash().slice(this.eddsa.encodingLength); }); KeyPair.prototype.sign = function sign(message) { assert(this._secret, "KeyPair can only verify"); return this.eddsa.sign(message, this); }; KeyPair.prototype.verify = function verify(message, sig) { return this.eddsa.verify(message, sig, this); }; KeyPair.prototype.getSecret = function getSecret(enc) { assert(this._secret, "KeyPair is public only"); return utils.encode(this.secret(), enc); }; KeyPair.prototype.getPublic = function getPublic(enc) { return utils.encode(this.pubBytes(), enc); }; module.exports = KeyPair; }, }); // ../../node_modules/elliptic/lib/elliptic/eddsa/signature.js var require_signature2 = __commonJS({ "../../node_modules/elliptic/lib/elliptic/eddsa/signature.js"(exports, module) { "use strict"; var BN = require_bn(); var utils = require_utils2(); var assert = utils.assert; var cachedProperty = utils.cachedProperty; var parseBytes = utils.parseBytes; function Signature(eddsa, sig) { this.eddsa = eddsa; if (typeof sig !== "object") sig = parseBytes(sig); if (Array.isArray(sig)) { sig = { R: sig.slice(0, eddsa.encodingLength), S: sig.slice(eddsa.encodingLength), }; } assert(sig.R && sig.S, "Signature without R or S"); if (eddsa.isPoint(sig.R)) this._R = sig.R; if (sig.S instanceof BN) this._S = sig.S; this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; } cachedProperty(Signature, "S", function S() { return this.eddsa.decodeInt(this.Sencoded()); }); cachedProperty(Signature, "R", function R() { return this.eddsa.decodePoint(this.Rencoded()); }); cachedProperty(Signature, "Rencoded", function Rencoded() { return this.eddsa.encodePoint(this.R()); }); cachedProperty(Signature, "Sencoded", function Sencoded() { return this.eddsa.encodeInt(this.S()); }); Signature.prototype.toBytes = function toBytes() { return this.Rencoded().concat(this.Sencoded()); }; Signature.prototype.toHex = function toHex() { return utils.encode(this.toBytes(), "hex").toUpperCase(); }; module.exports = Signature; }, }); // ../../node_modules/elliptic/lib/elliptic/eddsa/index.js var require_eddsa = __commonJS({ "../../node_modules/elliptic/lib/elliptic/eddsa/index.js"(exports, module) { "use strict"; var hash = require_hash(); var curves = require_curves(); var utils = require_utils2(); var assert = utils.assert; var parseBytes = utils.parseBytes; var KeyPair = require_key2(); var Signature = require_signature2(); function EDDSA(curve) { assert(curve === "ed25519", "only tested with ed25519 so far"); if (!(this instanceof EDDSA)) return new EDDSA(curve); curve = curves[curve].curve; this.curve = curve; this.g = curve.g; this.g.precompute(curve.n.bitLength() + 1); this.pointClass = curve.point().constructor; this.encodingLength = Math.ceil(curve.n.bitLength() / 8); this.hash = hash.sha512; } module.exports = EDDSA; EDDSA.prototype.sign = function sign(message, secret) { message = parseBytes(message); var key = this.keyFromSecret(secret); var r = this.hashInt(key.messagePrefix(), message); var R = this.g.mul(r); var Rencoded = this.encodePoint(R); var s_ = this.hashInt(Rencoded, key.pubBytes(), message).mul(key.priv()); var S = r.add(s_).umod(this.curve.n); return this.makeSignature({ R, S, Rencoded }); }; EDDSA.prototype.verify = function verify(message, sig, pub) { message = parseBytes(message); sig = this.makeSignature(sig); var key = this.keyFromPublic(pub); var h = this.hashInt(sig.Rencoded(), key.pubBytes(), message); var SG = this.g.mul(sig.S()); var RplusAh = sig.R().add(key.pub().mul(h)); return RplusAh.eq(SG); }; EDDSA.prototype.hashInt = function hashInt() { var hash2 = this.hash(); for (var i = 0; i < arguments.length; i++) hash2.update(arguments[i]); return utils.intFromLE(hash2.digest()).umod(this.curve.n); }; EDDSA.prototype.keyFromPublic = function keyFromPublic(pub) { return KeyPair.fromPublic(this, pub); }; EDDSA.prototype.keyFromSecret = function keyFromSecret(secret) { return KeyPair.fromSecret(this, secret); }; EDDSA.prototype.makeSignature = function makeSignature(sig) { if (sig instanceof Signature) return sig; return new Signature(this, sig); }; EDDSA.prototype.encodePoint = function encodePoint(point) { var enc = point.getY().toArray("le", this.encodingLength); enc[this.encodingLength - 1] |= point.getX().isOdd() ? 128 : 0; return enc; }; EDDSA.prototype.decodePoint = function decodePoint(bytes) { bytes = utils.parseBytes(bytes); var lastIx = bytes.length - 1; var normed = bytes.slice(0, lastIx).concat(bytes[lastIx] & ~128); var xIsOdd = (bytes[lastIx] & 128) !== 0; var y = utils.intFromLE(normed); return this.curve.pointFromY(y, xIsOdd); }; EDDSA.prototype.encodeInt = function encodeInt(num) { return num.toArray("le", this.encodingLength); }; EDDSA.prototype.decodeInt = function decodeInt(bytes) { return utils.intFromLE(bytes); }; EDDSA.prototype.isPoint = function isPoint(val) { return val instanceof this.pointClass; }; }, }); // ../../node_modules/elliptic/lib/elliptic.js var require_elliptic = __commonJS({ "../../node_modules/elliptic/lib/elliptic.js"(exports) { "use strict"; var elliptic = exports; elliptic.version = require_package().version; elliptic.utils = require_utils2(); elliptic.rand = require_brorand(); elliptic.curve = require_curve(); elliptic.curves = require_curves(); elliptic.ec = require_ec(); elliptic.eddsa = require_eddsa(); }, }); // scripts/Ec.js var import_elliptic = __toESM(require_elliptic()); var export_Ec = import_elliptic.ec; export { export_Ec as Ec }; ================================================ FILE: packages/signature-v4a/src/index.ts ================================================ import { signatureV4aContainer } from "@smithy/signature-v4"; import { SignatureV4a } from "./SignatureV4a"; signatureV4aContainer.SignatureV4a = SignatureV4a; export * from "./SignatureV4a"; ================================================ FILE: packages/signature-v4a/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4a/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "noUnusedLocals": true, "outDir": "dist-es", "rootDir": "src", "stripInternal": true }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4a/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/signature-v4a/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/node_modules/**", "**/es/**"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/smithy-client/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/smithy-client/CHANGELOG.md ================================================ # @smithy/smithy-client ## 4.13.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 4.13.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.13.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.13.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/smithy-client/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/smithy-client/package.json ================================================ { "name": "@smithy/smithy-client", "version": "4.13.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/smithy-client", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/smithy-client" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/smithy-client/scripts/fix-api-extractor.js ================================================ const fs = require("node:fs"); const path = require("path"); const file = path.join(__dirname, "..", "dist-types", "index.d.ts"); const contents = fs.readFileSync(file, "utf-8"); /** * This build script temporarily excludes the statement * ``` * export * from "@smithy/core/serde"; * ``` * from the package's type declarations during running api-extractor. * * This has no effect on the runtime, but api-extractor at this time cannot understand * the package.json exports field nor the compatibility redirect (packages/core/serde.d.ts). */ module.exports = { source: `export * from "@smithy/core/serde";`, replacement: `/* export * from "@smithy/core/serde"; */`, unset() { fs.writeFileSync(file, contents.replace(module.exports.replacement, module.exports.source)); }, set() { fs.writeFileSync(file, contents.replace(module.exports.source, module.exports.replacement)); }, }; if (process.argv.includes("--unset")) { module.exports.unset(); } else { module.exports.set(); } ================================================ FILE: packages/smithy-client/src/index.ts ================================================ /** @deprecated Use @smithy/core submodules instead. */ export type { DocumentType, SdkError, SmithyException } from "@smithy/types"; // from @smithy/core/serde export { LazyJsonString, NumericValue, _parseEpochTimestamp, _parseRfc3339DateTimeWithOffset, _parseRfc7231DateTime, copyDocumentWithTransform, dateToUtcString, expectBoolean, expectByte, expectFloat32, expectInt, expectInt32, expectLong, expectNonNull, expectNumber, expectObject, expectShort, expectString, expectUnion, generateIdempotencyToken, handleFloat, limitedParseDouble, limitedParseFloat, limitedParseFloat32, logger, nv, parseBoolean, parseEpochTimestamp, parseRfc3339DateTime, parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, quoteHeader, splitEvery, splitHeader, strictParseByte, strictParseDouble, strictParseFloat, strictParseFloat32, strictParseInt, strictParseInt32, strictParseLong, strictParseShort, } from "@smithy/core/serde"; export type { AutomaticJsonStringConversion, NumericType } from "@smithy/core/serde"; // from @smithy/core/client export { Client, Command, NoOpLogger, SENSITIVE_STRING, ServiceException, _json, convertMap, createAggregatedClient, decorateServiceException, emitWarningIfUnsupportedVersion, getArrayIfSingleItem, getDefaultClientConfiguration, getDefaultExtensionConfiguration, getValueFromTextNode, isSerializableHeaderValue, loadConfigsForDefaultMode, map, resolveDefaultRuntimeConfig, serializeDateTime, serializeFloat, take, throwDefaultError, withBaseException, } from "@smithy/core/client"; export type { CommandImpl, ConditionalLazyValueInstruction, ConditionalValueInstruction, DefaultExtensionRuntimeConfigType, DefaultsMode, DefaultsModeConfigs, ExceptionOptionType, FilterStatus, FilterStatusSupplier, LazyValueInstruction, ObjectMappingInstruction, ObjectMappingInstructions, ResolvedDefaultsMode, ServiceExceptionOptions, SimpleValueInstruction, SmithyConfiguration, SmithyResolvedConfiguration, SourceMappingInstruction, SourceMappingInstructions, UnfilteredValue, Value, ValueFilteringFunction, ValueMapper, ValueSupplier, } from "@smithy/core/client"; // from @smithy/core/protocols export { collectBody, extendedEncodeURIComponent, resolvedPath } from "@smithy/core/protocols"; ================================================ FILE: packages/smithy-client/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "noUnusedLocals": true, "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/smithy-client/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "noUnusedLocals": true, "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/smithy-client/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/snapshot-testing/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/snapshot-testing/CHANGELOG.md ================================================ # Change Log ## 2.1.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 - @smithy/node-http-handler@4.7.3 ## 2.1.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 - @smithy/node-http-handler@4.7.2 ## 2.1.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 - @smithy/node-http-handler@4.7.1 ## 2.1.0 ### Minor Changes - 4f30af1: consolidation for core/protocols - 8963b91: consolidate packages into core/serde - cad44fc: consolidate core/event-streams ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [da4e89e] - Updated dependencies [5329323] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [09093fb] - Updated dependencies [7ec62a0] - Updated dependencies [75603d4] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 - @smithy/node-http-handler@4.7.0 ## 2.0.8 ### Patch Changes - Updated dependencies [769ed47] - @smithy/node-http-handler@4.6.1 - @smithy/core@3.23.17 ## 2.0.7 ### Patch Changes - Updated dependencies [a029f0e] - Updated dependencies [60d13c8] - @smithy/core@3.23.16 - @smithy/node-http-handler@4.6.0 ## 2.0.6 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/node-http-handler@4.5.3 - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/eventstream-codec@4.2.14 - @smithy/protocol-http@5.3.14 ## 2.0.5 ### Patch Changes - fe15001: generate sparse values in snapshots - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/eventstream-codec@4.2.13 - @smithy/node-http-handler@4.5.2 - @smithy/protocol-http@5.3.13 ## 2.0.4 ### Patch Changes - Updated dependencies [fac1a34] - Updated dependencies [7198e09] - @smithy/node-http-handler@4.5.1 - @smithy/core@3.23.13 ## 2.0.3 ### Patch Changes - Updated dependencies [4e7fa38] - @smithy/node-http-handler@4.5.0 - @smithy/core@3.23.12 ## 2.0.2 ### Patch Changes - Updated dependencies [dab22f1] - Updated dependencies [2edd638] - @smithy/node-http-handler@4.4.16 - @smithy/core@3.23.11 ## 2.0.1 ### Patch Changes - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/eventstream-codec@4.2.12 - @smithy/node-http-handler@4.4.15 - @smithy/protocol-http@5.3.12 ## 2.0.0 ### Major Changes - 8cc5514: add error snapshots ## 1.0.10 ### Patch Changes - 6ef5430: add response snapshot generation - Updated dependencies [6ef5430] - Updated dependencies [6ef5430] - @smithy/core@3.23.9 ## 1.0.9 ### Patch Changes - Updated dependencies [a4d95e6] - @smithy/eventstream-codec@4.2.11 - @smithy/util-hex-encoding@4.2.2 - @smithy/protocol-http@5.3.11 - @smithy/util-base64@4.3.2 - @smithy/util-utf8@4.2.2 - @smithy/core@3.23.8 ## 1.0.8 ### Patch Changes - Updated dependencies [11569eb] - @smithy/core@3.23.7 ## 1.0.7 ### Patch Changes - c8f3a9f: additional member value overrides for snapshot data generator ## 1.0.6 ### Patch Changes - abfdfb6: in snapshot-testing, normalize date string timezone - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/core@3.23.6 - @smithy/eventstream-codec@4.2.10 - @smithy/protocol-http@5.3.10 ## 1.0.5 ### Patch Changes - Updated dependencies [026b177] - Updated dependencies [cde9f09] - @smithy/core@3.23.5 ## 1.0.4 ### Patch Changes - 832fa25: omit exec env from user agent ## 1.0.3 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/core@3.23.4 - @smithy/eventstream-codec@4.2.9 - @smithy/protocol-http@5.3.9 - @smithy/types@4.12.1 - @smithy/util-base64@4.3.1 - @smithy/util-hex-encoding@4.2.1 - @smithy/util-utf8@4.2.1 ## 1.0.2 ### Patch Changes - @smithy/core@3.23.3 ## 1.0.1 ### Patch Changes - b1c9f6c: fix snapshotting of AWS event stream inputs ## 1.0.0 ### Major Changes - c5db01c: internal snapshot testing package ### Patch Changes - Updated dependencies [c5db01c] - @smithy/core@3.23.2 ================================================ FILE: packages/snapshot-testing/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/snapshot-testing/README.md ================================================ # @smithy/snapshot-testing [![NPM version](https://img.shields.io/npm/v/@smithy/snapshot-testing/latest.svg)](https://www.npmjs.com/package/@smithy/snapshot-testing) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/snapshot-testing.svg)](https://www.npmjs.com/package/@smithy/snapshot-testing) This is an internal package used for snapshot testing. ================================================ FILE: packages/snapshot-testing/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/EmptyInputOutput.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/EmptyInputOutput content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 1 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] {} [actual bytes] 160 ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/Float16.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/Float16 smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/FractionalSeconds.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/FractionalSeconds smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/GreetingWithErrors.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/GreetingWithErrors smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/NoInputOutput.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/NoInputOutput smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/RecursiveShapes.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RecursiveShapes content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 107 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "nested": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": {} } } } } } [actual bytes] 161, 102, 110, 101, 115, 116, 101, 100, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 160 ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/RpcV2CborSparseMaps.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RpcV2CborSparseMaps content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 370 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "sparseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" }, "sparse": null }, "sparseNumberMap": { "key1": 0, "key2": 0, "key3": 0, "sparse": null }, "sparseBooleanMap": { "key1": false, "key2": false, "key3": false, "sparse": null }, "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null }, "sparseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ], "sparse": null } } [actual bytes] 165, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 164, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 102, 115, 112, 97, 114, 115, 101, 246, 112, 115, 112, 97, 114, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 164, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 108, 115, 112, 97, 114, 115, 101, 83, 101, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/SimpleScalarProperties.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/SimpleScalarProperties content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 154 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "trueBooleanValue": false, "falseBooleanValue": false, "byteValue": 0, "doubleValue": 0, "floatValue": 0, "integerValue": 0, "longValue": 0, "shortValue": 0, "stringValue": "__stringValue__", "blobValue": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } } [actual bytes] 170, 112, 116, 114, 117, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 113, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 105, 98, 121, 116, 101, 86, 97, 108, 117, 101, 0, 107, 100, 111, 117, 98, 108, 101, 86, 97, 108, 117, 101, 0, 106, 102, 108, 111, 97, 116, 86, 97, 108, 117, 101, 0, 108, 105, 110, 116, 101, 103, 101, 114, 86, 97, 108, 117, 101, 0, 105, 108, 111, 110, 103, 86, 97, 108, 117, 101, 0, 106, 115, 104, 111, 114, 116, 86, 97, 108, 117, 101, 0, 107, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 111, 95, 95, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 95, 95, 105, 98, 108, 111, 98, 86, 97, 108, 117, 101, 68, 1, 0, 0, 1 ================================================ FILE: packages/snapshot-testing/integ-snapshots/req/SparseNullsOperation.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/SparseNullsOperation content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 123 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "sparseStringList": [ "__member__", "__member__", "__member__", null ], "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null } } [actual bytes] 162, 112, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 132, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/EmptyInputOutput.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/Float16.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "value": 0 } [actual bytes] 161, 101, 118, 97, 108, 117, 101, 0 --- [output object] --- { value: (number) 0, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/FractionalSeconds.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "datetime": { "tag": 1, "value": 946702799.999 } } [actual bytes] 161, 104, 100, 97, 116, 101, 116, 105, 109, 101, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59 --- [output object] --- { datetime: (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/GreetingWithErrors.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "greeting": "__greeting__" } [actual bytes] 161, 104, 103, 114, 101, 101, 116, 105, 110, 103, 108, 95, 95, 103, 114, 101, 101, 116, 105, 110, 103, 95, 95 --- [output object] --- { greeting: "__greeting__", $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/NoInputOutput.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/RecursiveShapes.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "nested": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": {} } } } } } [actual bytes] 161, 102, 110, 101, 115, 116, 101, 100, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 160 --- [output object] --- { nested: { foo: "__foo__", nested: { bar: "__bar__", recursiveMember: { foo: "__foo__", nested: { bar: "__bar__", recursiveMember: {} } } } }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/RpcV2CborSparseMaps.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "sparseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" }, "sparse": null }, "sparseNumberMap": { "key1": 0, "key2": 0, "key3": 0, "sparse": null }, "sparseBooleanMap": { "key1": false, "key2": false, "key3": false, "sparse": null }, "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null }, "sparseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ], "sparse": null } } [actual bytes] 165, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 164, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 102, 115, 112, 97, 114, 115, 101, 246, 112, 115, 112, 97, 114, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 164, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 108, 115, 112, 97, 114, 115, 101, 83, 101, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 --- [output object] --- { sparseStructMap: { key1: { hi: "__hi__" }, key2: { hi: "__hi__" }, key3: { hi: "__hi__" }, sparse: (null) }, sparseNumberMap: { key1: (number) 0, key2: (number) 0, key3: (number) 0, sparse: (null) }, sparseBooleanMap: { key1: (boolean) false, key2: (boolean) false, key3: (boolean) false, sparse: (null) }, sparseStringMap: { key1: "__value__", key2: "__value__", key3: "__value__", sparse: (null) }, sparseSetMap: { key1: [ "__member__", "__member__", "__member__" ], key2: [ "__member__", "__member__", "__member__" ], key3: [ "__member__", "__member__", "__member__" ], sparse: (null) }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/SimpleScalarProperties.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "trueBooleanValue": false, "falseBooleanValue": false, "byteValue": 0, "doubleValue": 0, "floatValue": 0, "integerValue": 0, "longValue": 0, "shortValue": 0, "stringValue": "__stringValue__", "blobValue": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } } [actual bytes] 170, 112, 116, 114, 117, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 113, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 105, 98, 121, 116, 101, 86, 97, 108, 117, 101, 0, 107, 100, 111, 117, 98, 108, 101, 86, 97, 108, 117, 101, 0, 106, 102, 108, 111, 97, 116, 86, 97, 108, 117, 101, 0, 108, 105, 110, 116, 101, 103, 101, 114, 86, 97, 108, 117, 101, 0, 105, 108, 111, 110, 103, 86, 97, 108, 117, 101, 0, 106, 115, 104, 111, 114, 116, 86, 97, 108, 117, 101, 0, 107, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 111, 95, 95, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 95, 95, 105, 98, 108, 111, 98, 86, 97, 108, 117, 101, 68, 1, 0, 0, 1 --- [output object] --- { trueBooleanValue: (boolean) false, falseBooleanValue: (boolean) false, byteValue: (number) 0, doubleValue: (number) 0, floatValue: (number) 0, integerValue: (number) 0, longValue: (number) 0, shortValue: (number) 0, stringValue: "__stringValue__", blobValue: (Uint8Array) bytes[1, 0, 0, 1], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res/SparseNullsOperation.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "sparseStringList": [ "__member__", "__member__", "__member__", null ], "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null } } [actual bytes] 162, 112, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 132, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 --- [output object] --- { sparseStringList: [ "__member__", "__member__", "__member__", (null) ], sparseStringMap: { key1: "__value__", key2: "__value__", key3: "__value__", sparse: (null) }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res-err/ComplexError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#ComplexError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 43, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 67, 111, 109, 112, 108, 101, 120, 69, 114, 114, 111, 114 --- [error name & message] --- ComplexError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ComplexError", TopLevel: (undefined), Nested: (undefined), message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "TopLevel": "__TopLevel__", "Nested": { "Foo": "__Foo__" }, "__type": "smithy.protocoltests.rpcv2Cbor#ComplexError" } [actual bytes] 163, 104, 84, 111, 112, 76, 101, 118, 101, 108, 108, 95, 95, 84, 111, 112, 76, 101, 118, 101, 108, 95, 95, 102, 78, 101, 115, 116, 101, 100, 161, 99, 70, 111, 111, 103, 95, 95, 70, 111, 111, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 43, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 67, 111, 109, 112, 108, 101, 120, 69, 114, 114, 111, 114 --- [error name & message] --- ComplexError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ComplexError", TopLevel: "__TopLevel__", Nested: { Foo: "__Foo__" }, message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res-err/InvalidGreeting.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#InvalidGreeting" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 73, 110, 118, 97, 108, 105, 100, 71, 114, 101, 101, 116, 105, 110, 103 --- [error name & message] --- InvalidGreeting: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "InvalidGreeting", Message: (undefined), message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "Message": "__Message__", "__type": "smithy.protocoltests.rpcv2Cbor#InvalidGreeting" } [actual bytes] 162, 103, 77, 101, 115, 115, 97, 103, 101, 107, 95, 95, 77, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 73, 110, 118, 97, 108, 105, 100, 71, 114, 101, 101, 116, 105, 110, 103 --- [error name & message] --- InvalidGreeting: __Message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "InvalidGreeting", Message: "__Message__", message: "__Message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res-err/RpcV2ProtocolServiceException.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.ts.sdk.synthetic.smithy.protocoltests.rpcv2Cbor#RpcV2ProtocolServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 84, 115, 109, 105, 116, 104, 121, 46, 116, 115, 46, 115, 100, 107, 46, 115, 121, 110, 116, 104, 101, 116, 105, 99, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 82, 112, 99, 86, 50, 80, 114, 111, 116, 111, 99, 111, 108, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- undefined: Unknown --- [error object] --- { $fault: (undefined), $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: (undefined), message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.ts.sdk.synthetic.smithy.protocoltests.rpcv2Cbor#RpcV2ProtocolServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 84, 115, 109, 105, 116, 104, 121, 46, 116, 115, 46, 115, 100, 107, 46, 115, 121, 110, 116, 104, 101, 116, 105, 99, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 82, 112, 99, 86, 50, 80, 114, 111, 116, 111, 99, 111, 108, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- undefined: Unknown --- [error object] --- { $fault: (undefined), $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: (undefined), message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res-err/UnmodeledServiceException.txt ================================================ ======================== minimal response ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 56, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", __type: "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } ======================== w/ optional fields ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "Message": "__Message__", "__type": "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } [actual bytes] 162, 103, 77, 101, 115, 115, 97, 103, 101, 107, 95, 95, 77, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 56, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: __Message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", Message: "__Message__", __type: "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException", message: "__Message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: packages/snapshot-testing/integ-snapshots/res-err/ValidationException.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "fieldList": [ { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" } ], "__type": "smithy.framework#ValidationException" } [actual bytes] 163, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 105, 102, 105, 101, 108, 100, 76, 105, 115, 116, 131, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 36, 115, 109, 105, 116, 104, 121, 46, 102, 114, 97, 109, 101, 119, 111, 114, 107, 35, 86, 97, 108, 105, 100, 97, 116, 105, 111, 110, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- ValidationException: __message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ValidationException", fieldList: [ { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" } ], message: "__message__" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "fieldList": [ { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" } ], "__type": "smithy.framework#ValidationException" } [actual bytes] 163, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 105, 102, 105, 101, 108, 100, 76, 105, 115, 116, 131, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 36, 115, 109, 105, 116, 104, 121, 46, 102, 114, 97, 109, 101, 119, 111, 114, 107, 35, 86, 97, 108, 105, 100, 97, 116, 105, 111, 110, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- ValidationException: __message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ValidationException", fieldList: [ { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" } ], message: "__message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: packages/snapshot-testing/package.json ================================================ { "name": "@smithy/snapshot-testing", "version": "2.1.3", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline snapshot-testing", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts", "test:watch": "yarn g:vitest watch" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/node-http-handler": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<=4.0": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/snapshot-testing", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/snapshot-testing" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/snapshot-testing/src/SnapshotRequestHandler.ts ================================================ import type { HttpHandler } from "@smithy/core/protocols"; import { NormalizedSchema } from "@smithy/core/schema"; import type { HttpHandlerOptions, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, Logger, RequestHandlerOutput, } from "@smithy/types"; import { serializeHttpRequest } from "./serializers/serializeHttpRequest"; import { RequestSnapshotCompleted } from "./snapshot-testing-types"; /** * @internal */ export interface SnapshotRequestHandlerOptions { /** * The serialized request will be pushed to the logger's trace method. */ logger?: Logger; /** * Optional response to use. */ response?: IHttpResponse; } /** * @internal */ interface ResolvedSnapshotRequestHandlerOptions extends SnapshotRequestHandlerOptions {} /** * @internal */ export class SnapshotRequestHandler implements HttpHandler { private readonly config: ResolvedSnapshotRequestHandlerOptions; public constructor(options: SnapshotRequestHandlerOptions = {}) { this.config = { logger: console, ...options, }; } public async handle( request: IHttpRequest, handlerOptions: (HttpHandlerOptions & any) | undefined = {} ): Promise> { const { logger, response } = this.config; if (response) { return { response }; } const [client, [, namespace, name, traits, input, output], command] = [ handlerOptions[Symbol.for("$client")], handlerOptions[Symbol.for("$schema")], handlerOptions[Symbol.for("$command")], ]; const requestSerialization = await serializeHttpRequest(request); logger?.trace?.(requestSerialization); const $out = NormalizedSchema.of(output); const eventStreamOutput = $out.getEventStreamMember(); const hasDataStreamResponsePayload = Object.values($out.getMemberSchemas()).some( ($) => $.isStreaming() && $.isBlobSchema() ); void [client, namespace, name, traits, input, command, eventStreamOutput, hasDataStreamResponsePayload]; throw new RequestSnapshotCompleted(); } public updateHttpClientConfig( key: K, value: SnapshotRequestHandlerOptions[K] ): void { this.config[key] = value; } public httpHandlerConfigs(): SnapshotRequestHandlerOptions { return this.config; } } ================================================ FILE: packages/snapshot-testing/src/SnapshotRunner.ts ================================================ import { accessSync, constants, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { NormalizedSchema } from "@smithy/core/schema"; import type { Client, Command, HttpResponse as IHttpResponse, Logger, StaticErrorSchema, StaticOperationSchema, } from "@smithy/types"; import { SnapshotRequestHandler } from "./SnapshotRequestHandler"; import { snapshotTestingProtocolResponseSerializers } from "./protocols/index"; import { serializeDocument } from "./serializers/serializeDocument"; import { serializeHttpResponse } from "./serializers/serializeHttpResponse"; import { RequestSnapshotCompleted } from "./snapshot-testing-types"; import { createFromSchema } from "./structure/createFromSchema"; /** * @internal */ type $Client = Client; /** * @internal */ type $Command = Command; /** * @internal */ type $ClientCtor = { new (...args: any[]): $Client }; /** * @internal */ type $CommandCtor = { new (...args: any[]): $Command }; /** * @internal */ export interface SnapshotRunnerOptions { /** * Path to write snapshots. Should be a folder without other files. */ snapshotDirPath: string; /** * Client constructor for the client that owns the commands in the schemas map. */ Client: $ClientCtor; /** * Map of operation schema to command classes. */ schemas: Map; /** * Errors for which to generate response-error snapshots. */ errors?: StaticErrorSchema[]; /** * write - write the data without comparing. * compare - throw if comparison to existing files in the same folder contain mismatches. * * @defaultValue "write" */ mode?: "write" | "compare"; /** * Provide this if running in a test framework. */ testCase?(caseName: string, run: () => Promise): void; /** * Provide this if running in a test framework. */ assertions?(caseName: string, expected: string, actual: string): Promise; } /** * Takes a client and map of commands to create a snapshot * of requests and responses associated with the client's operations. * * These snapshots can be visually inspected for e.g. regression diffs, * or exercised in snapshot tests. * * @internal */ export class SnapshotRunner { public constructor(private options: SnapshotRunnerOptions) { const dir = dirname(options.snapshotDirPath); accessSync(dir, constants.W_OK); } public run(): Promise { const { snapshotDirPath, Client, schemas, mode = "write", testCase = async (_, run) => { await run(); }, assertions = (caseName, ex, act) => { if (ex !== act) { throw new Error(`Serialization for ${caseName} does not match snapshot on disk.`); } }, errors = [], } = this.options; if (mode === "write") { rmSync(snapshotDirPath, { recursive: true, force: true }); } const promises = [] as Promise[]; // requests for (const [schema, CommandCtor] of schemas) { const operationName = CommandCtor.name.replace(/Command$/, ""); const testCaseExec = testCase(operationName + " (request)", async () => { let buf = ``; const logger = { ...console, trace(msg: string) { buf += msg; }, }; await this.executeCommand({ logger, Client, schema, CommandCtor, }).catch((e) => { if (e instanceof RequestSnapshotCompleted) { return; } logger.trace("\n[CommandError]\n"); logger.trace(e.stack); logger.error(`${e.name}: ${e.message}`); }); const snapshotPath = join(snapshotDirPath, "req", operationName + ".txt"); const containerFolder = dirname(snapshotPath); if (!existsSync(containerFolder)) { mkdirSync(containerFolder, { recursive: true }); } if (mode === "compare") { const canonical = readFileSync(snapshotPath, "utf-8"); if (assertions) { assertions(operationName, canonical, buf); } else { if (canonical !== buf) { throw new Error(`Serialization for ${CommandCtor.name} does not match snapshot on disk.`); } } } else { writeFileSync(snapshotPath, buf, "utf-8"); } }); promises.push(Promise.resolve(testCaseExec)); } // responses for (const [schema, CommandCtor] of schemas) { const [, namespace, name, traits, input, output] = schema; const operationName = CommandCtor.name.replace(/Command$/, ""); const testCaseExec = testCase(operationName + " (response)", async () => { let buf = ``; const logger = { ...console, trace(msg: string) { buf += msg; }, }; const client = this.initClient(Client, { endpoint: "https://localhost", logger }); const protocolId = client.config.protocol.getShapeId(); for (const options of [{ mode: "min" }, { mode: "max" }] as const) { if (options.mode === "min") { logger.trace("=".repeat(24) + ` minimal response ` + "=".repeat(24)); } else { logger.trace("=".repeat(24) + ` w/ optional fields ` + "=".repeat(24)); } logger.trace("\n"); const snapshotProtocol = snapshotTestingProtocolResponseSerializers[protocolId]; if (!snapshotProtocol) { throw new Error(`No response serializer found for protocol: ${protocolId}`); } snapshotProtocol.setSerdeContext(client.config); // copies to allow two types of serializers to read the response stream. const [r1, r2] = [ await snapshotProtocol.serializeResponse(schema, createFromSchema(output, undefined, options)), await snapshotProtocol.serializeResponse(schema, createFromSchema(output, undefined, options)), ]; const ns = NormalizedSchema.of(output); const mayBufferResponseBody = !ns.getEventStreamMember() && !Object.values(ns.getMemberSchemas()).some(($) => $.isBlobSchema() && $.isStreaming()); const serialization = await serializeHttpResponse(r1, mayBufferResponseBody); logger.trace(serialization); const command = new CommandCtor(createFromSchema(input)); client.config.requestHandler = new SnapshotRequestHandler({ response: r2, }); try { const output = await client.send(command); const outputSerialization = await serializeDocument(output); logger.trace("\n\n--- [output object] ---\n"); logger.trace(outputSerialization); } catch (e) { logger.trace(`\n\n[CommandError]\n`); logger.trace(e.stack); logger.error(`${e.name}: ${e.message}`); } logger.trace("\n\n"); } const snapshotPath = join(snapshotDirPath, "res", operationName + ".txt"); const containerFolder = dirname(snapshotPath); if (!existsSync(containerFolder)) { mkdirSync(containerFolder, { recursive: true }); } if (mode === "compare") { const canonical = readFileSync(snapshotPath, "utf-8"); if (assertions) { assertions(operationName, canonical, buf); } else { if (canonical !== buf) { throw new Error(`Deserialization for ${CommandCtor.name} does not match snapshot on disk.`); } } } else { writeFileSync(snapshotPath, buf, "utf-8"); } }); promises.push(Promise.resolve(testCaseExec)); } // errors const [$operation, CommandCtor] = schemas[Symbol.iterator]().next().value!; const [, ns] = $operation; for (const $error of [ [-3, ns, "UnmodeledServiceException", { error: "server" }, ["Message"], [0]] satisfies StaticErrorSchema, ...errors, ]) { const [, namespace, name, traits, memberNames, members, requiredMemberCount] = $error; const $errorNormalized = NormalizedSchema.of($error); const qualifiedName = $errorNormalized.getName(true); const testCaseExec = testCase(qualifiedName + " (error)", async () => { let buf = ``; const logger = { ...console, trace(msg: string) { buf += msg; }, }; const client = this.initClient(Client, { endpoint: "https://localhost", logger, maxAttempts: 1 }); const protocolId = client.config.protocol.getShapeId(); for (const options of [{ mode: "min" }, { mode: "max" }, { mode: "frontend" }] as const) { if (options.mode === "frontend") { logger.trace("=".repeat(24) + ` frontend error ` + "=".repeat(24)); } else if (options.mode === "min") { logger.trace("=".repeat(24) + ` minimal response ` + "=".repeat(24)); } else if (options.mode === "max") { logger.trace("=".repeat(24) + ` w/ optional fields ` + "=".repeat(24)); } logger.trace("\n"); const snapshotProtocol = snapshotTestingProtocolResponseSerializers[protocolId]; if (!snapshotProtocol) { throw new Error(`No response serializer found for protocol: ${protocolId}`); } snapshotProtocol.setSerdeContext(client.config); // copies to allow two types of serializers to read the response stream. const [r1, r2] = options.mode === "frontend" ? [ await snapshotProtocol.serializeGenericFrontendErrorResponse(), await snapshotProtocol.serializeGenericFrontendErrorResponse(), ] : [ await snapshotProtocol.serializeErrorResponse($error, createFromSchema($error, undefined, options)), await snapshotProtocol.serializeErrorResponse($error, createFromSchema($error, undefined, options)), ]; const ns = NormalizedSchema.of($operation[5]); const mayBufferResponseBody = !ns.getEventStreamMember() && !Object.values(ns.getMemberSchemas()).some(($) => $.isBlobSchema() && $.isStreaming()); const serialization = await serializeHttpResponse(r1, mayBufferResponseBody); logger.trace(serialization); const command = new CommandCtor(createFromSchema($operation[4 /*input*/])); client.config.requestHandler = new SnapshotRequestHandler({ response: r2, }); try { const output = await client.send(command).catch((e: any) => e); const outputSerialization = await serializeDocument(output); logger.trace("\n\n--- [error name & message] ---\n"); logger.trace(`${output.name}: ${output.message}`); logger.trace("\n\n--- [error object] ---\n"); logger.trace(outputSerialization); } catch (e) { logger.trace(`\n\n[CommandError]\n`); logger.trace(e.stack); logger.error(`${e.name}: ${e.message}`); } logger.trace("\n\n"); } const snapshotPath = join(snapshotDirPath, "res-err", name + ".txt"); const containerFolder = dirname(snapshotPath); if (!existsSync(containerFolder)) { mkdirSync(containerFolder, { recursive: true }); } if (mode === "compare") { const canonical = readFileSync(snapshotPath, "utf-8"); if (assertions) { assertions(name, canonical, buf); } else { if (canonical !== buf) { throw new Error(`Error deserialization for ${name} does not match snapshot on disk.`); } } } else { writeFileSync(snapshotPath, buf, "utf-8"); } }); promises.push(Promise.resolve(testCaseExec)); } return Promise.all(promises).then(() => {}); } private async executeCommand({ logger, Client, schema, CommandCtor, endpoint, }: { logger: Logger; Client: $ClientCtor; schema: StaticOperationSchema; CommandCtor: $CommandCtor; endpoint?: string; }) { const client = this.initClient(Client, { endpoint, logger }); const [, namespace, name, traits, input, output] = schema; const command = new CommandCtor(createFromSchema(input)); const $ = NormalizedSchema.of(input); if ($.getEventStreamMember()) { client.middlewareStack.add(this.getEventStreamStaticSignatureMiddleware, { tags: ["EVENT_STREAM", "SIGNATURE"], name: "eventStreamStaticSignatureMiddleware", step: "build" as const, override: true, }); } const snapshotMetadata = { [Symbol.for("$schema")]: schema, [Symbol.for("$client")]: client, [Symbol.for("$command")]: command, }; await client.send(command, snapshotMetadata).catch((e: any) => { switch (e.name) { case "EndpointError": return this.executeCommand({ logger, Client, schema, CommandCtor, endpoint: "https://localhost/mock-required-endpoint", }); default: throw e; } }); } private initClient( Client: any, { endpoint, logger, response, maxAttempts, }: { endpoint?: string; logger?: Logger; response?: IHttpResponse; maxAttempts?: number } ): any { return new Client({ region: "us-east-1", credentials: { accessKeyId: "MOCK_ak", secretAccessKey: "MOCK_sak", }, apiKey: { apiKey: "MOCK_api_key" }, endpoint, requestHandler: new SnapshotRequestHandler({ logger, response, }), maxAttempts, }); } private getEventStreamStaticSignatureMiddleware = (next: any, context: any) => async (args: any) => { context.__staticSignature = true; return next(args); }; } ================================================ FILE: packages/snapshot-testing/src/index.ts ================================================ export { SnapshotRunner } from "./SnapshotRunner"; export { customFields } from "./structure/createFromSchema"; /** * Extend this to create additional snapshot response serializers. * * @internal */ export { SnapshotProtocol } from "./protocols/SnapshotProtocol"; /** * Add additional SnapshotProtocol to this object, key by protocol ShapeId. * @internal */ export { snapshotTestingProtocolResponseSerializers } from "./protocols/index"; ================================================ FILE: packages/snapshot-testing/src/protocols/SmithyRpcV2CborSnapshotProtocol.ts ================================================ import { CborCodec } from "@smithy/core/cbor"; import { NormalizedSchema } from "@smithy/core/schema"; import type { HttpResponse, StaticErrorSchema, StaticOperationSchema } from "@smithy/types"; import type { SnapshotServerProtocol } from "../snapshot-testing-types"; import { SnapshotProtocol } from "./SnapshotProtocol"; /** * @internal */ export class SmithyRpcV2CborSnapshotProtocol extends SnapshotProtocol implements SnapshotServerProtocol { private codec = new CborCodec(); private serializer = this.codec.createSerializer(); private deserializer = this.codec.createDeserializer(); public getDefaultContentType(): string { return "application/cbor"; } public getShapeId(): string { return "smithy.protocols#rpcv2Cbor"; } public async serializeResponse(operationSchema: StaticOperationSchema, output: any): Promise { const $output = NormalizedSchema.of(operationSchema[5]); const eventStreamMember = $output.getEventStreamMember(); const response: HttpResponse = { statusCode: 200, headers: { "smithy-protocol": "rpc-v2-cbor", "content-type": this.getDefaultContentType(), }, }; if (eventStreamMember) { const eventStreamSerde = this.getEventStreamSerde(this.serializer, this.deserializer); if (output[eventStreamMember]?.[Symbol.asyncIterator]) { response.body = await eventStreamSerde.serializeEventStream({ eventStream: output[eventStreamMember], requestSchema: $output, }); } else { response.body = { async *[Symbol.asyncIterator]() {}, }; } } else { const { serializer } = this; serializer.write($output, output); // refrain from wrapping in Readable so the snapshot can use object view on the bytes. response.body = serializer.flush(); } return response; } public async serializeErrorResponse( errorSchema: StaticErrorSchema, output: Output ): Promise { const $error = NormalizedSchema.of(errorSchema); const clientFault = $error.getMergedTraits().error !== "server"; const httpError = $error.getMergedTraits().httpError; const status = Number(typeof httpError === "number" ? httpError : clientFault ? 400 : 500); const response: HttpResponse = { statusCode: status, headers: { "smithy-protocol": "rpc-v2-cbor", "content-type": this.getDefaultContentType(), }, }; const { serializer } = this; Object.assign(output, { __type: $error.getName(true), }); serializer.write($error, output); response.body = serializer.flush(); return response; } } ================================================ FILE: packages/snapshot-testing/src/protocols/SnapshotProtocol.ts ================================================ import { Readable } from "node:stream"; import { EventStreamSerde } from "@smithy/core/event-streams"; import { HttpResponse, SerdeContext } from "@smithy/core/protocols"; import type { $ShapeDeserializer, $ShapeSerializer, EventStreamMarshaller, EventStreamSerdeContext, HttpResponse as IHttpResponse, StaticErrorSchema, StaticOperationSchema, } from "@smithy/types"; import type { SnapshotServerProtocol } from "../snapshot-testing-types"; /** * @internal */ export abstract class SnapshotProtocol extends SerdeContext implements SnapshotServerProtocol { public abstract getShapeId(): string; public abstract getDefaultContentType(): string; public abstract serializeResponse( operationSchema: StaticOperationSchema, output: Output ): Promise; public abstract serializeErrorResponse( errorSchema: StaticErrorSchema, output: Output ): Promise; public async serializeGenericFrontendErrorResponse(): Promise { return new HttpResponse({ headers: { "content-type": "text/html", }, statusCode: 500, body: Readable.from("An unmodeled error occurred in a front end layer."), }); } protected getEventStreamSerde( serializer: $ShapeSerializer | $ShapeSerializer, deserializer: $ShapeDeserializer | $ShapeDeserializer ) { return new EventStreamSerde({ marshaller: this.getEventStreamMarshaller(), serializer, deserializer, defaultContentType: this.getDefaultContentType(), }); } protected getEventStreamMarshaller(): EventStreamMarshaller { const context = this.serdeContext as unknown as EventStreamSerdeContext; if (!context.eventStreamMarshaller) { throw new Error("@smithy/core - HttpProtocol: eventStreamMarshaller missing in serdeContext."); } return context.eventStreamMarshaller; } } ================================================ FILE: packages/snapshot-testing/src/protocols/index.ts ================================================ import { SmithyRpcV2CborSnapshotProtocol } from "./SmithyRpcV2CborSnapshotProtocol"; import type { SnapshotProtocol } from "./SnapshotProtocol"; const smithyRpcV2CborSnapshotProtocol = new SmithyRpcV2CborSnapshotProtocol(); /** * @internal */ export const snapshotTestingProtocolResponseSerializers = { [smithyRpcV2CborSnapshotProtocol.getShapeId()]: smithyRpcV2CborSnapshotProtocol, } as Record; ================================================ FILE: packages/snapshot-testing/src/serializers/ContentTypeDetection.ts ================================================ import { cbor } from "@smithy/core/cbor"; import { fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { HeaderBag } from "@smithy/types"; import { serializeBytes } from "./serializeBytes"; /** * @internal */ export class ContentTypeDetection { protected r!: { headers: HeaderBag; }; public isXml(): boolean { return this.getContentType() === "application/xml"; } public isQuery(): boolean { return this.getContentType() === "application/x-www-form-urlencoded"; } public isJson(): boolean { return this.getContentType() === "application/json" || this.getContentType().startsWith("application/x-amz-json-"); } public isCbor(): boolean { return this.r?.headers?.["smithy-protocol"] === "rpc-v2-cbor" || this.getContentType() === "application/cbor"; } public getContentType(): string { return this.r?.headers?.["content-type"] ?? ""; } public formatStringBody(s: string): [string, string] { try { if (this.isJson()) { try { return ["json", JSON.stringify(JSON.parse(s), null, 2)]; } catch (e) {} return ["json", s]; } else if (this.isXml()) { return ["xml", simpleFormatXml(s)]; } else if (this.isQuery()) { return ["query", formatQuery(s)]; } } catch (e) {} if (s.length === 0) { return ["empty", s]; } if (isAscii(s)) { return ["text", s]; } try { return ["unrecognized format as base64", toBase64(fromUtf8(s))]; } catch (e) {} return ["??", s]; } public formatBody(bytes: Uint8Array): [string, string] { if (this.isCbor()) { try { cbor.deserialize(bytes); return ["cbor object view", serializeBytes(bytes)]; } catch (e) {} } return this.formatStringBody(toUtf8(bytes)); } } /** * Inserts line breaks and indentation for XML. */ function simpleFormatXml(xml: string): string { const indent = 4; let b = ""; let indentation = 0; for (let i = 0; i < xml.length; ++i) { const c = xml[i]; if (c === "<") { if (xml[i + 1] === "/") { b += "\n" + " ".repeat(indentation - indent) + c; indentation -= indent * 2; } else { b += c; } } else if (c === ">") { if (xml[i - 1] === "/" || xml[i - 1] === "?") { b += c + "\n"; } else { indentation += indent; b += c + "\n" + " ".repeat(indentation); } } else { b += c; } } return b .split("\n") .filter((s) => !!s.trim()) .join("\n"); } /** * Inserts line breaks for Query format. */ function formatQuery(q: string): string { return q.replace(/(&)/g, "&\n"); } function isAscii(str: string) { return /^[\x00-\x7F]*$/.test(str); } ================================================ FILE: packages/snapshot-testing/src/serializers/SnapshotEventStreamSerializer.ts ================================================ import { toHex, toUtf8 } from "@smithy/core/serde"; import type { Message } from "@smithy/types"; import { ContentTypeDetection } from "./ContentTypeDetection"; import { serializeDate } from "./serializeDate"; /** * @internal */ export class SnapshotEventStreamSerializer extends ContentTypeDetection { private headers: Message["headers"] = {}; private totalLength = ""; private headerLength = ""; private preludeCrc = ""; private payloadAnnotation = ""; private payloadSnapshot = ""; private messageCrc = ""; private inner?: SnapshotEventStreamSerializer; public constructor(private message: Uint8Array) { super(); } public decode() { const message = this.message; const dv = new DataView(message.buffer, message.byteOffset, message.byteLength); const [totalByteLength, headersByteLength, preludeCrc] = [dv.getUint32(0), dv.getUint32(4), dv.getUint32(8)]; this.totalLength = String(totalByteLength); this.headerLength = String(headersByteLength); this.preludeCrc = String(preludeCrc); const [headers, payload, messageCrc] = [ message.subarray(12, 12 + headersByteLength), message.subarray(12 + headersByteLength, totalByteLength - 4), dv.getUint32(totalByteLength - 4), ]; this.messageCrc = String(messageCrc); let i = 12; while (i < 12 + headersByteLength) { const headerNameByteLength = dv.getUint8(i); i += 1; const headerName = toUtf8(message.subarray(i, i + headerNameByteLength)); i += headerNameByteLength; const headerValueType = dv.getUint8(i); i += 1; switch (headerValueType) { case 0: case 1: this.headers[headerName] = { type: "boolean", value: headerValueType === 0, }; break; case 2: this.headers[headerName] = { type: "byte", value: dv.getInt8(i), }; i += 1; break; case 3: this.headers[headerName] = { type: "short", value: dv.getInt16(i), }; i += 2; break; case 4: this.headers[headerName] = { type: "integer", value: dv.getInt32(i), }; i += 4; break; case 5: this.headers[headerName] = { type: "long", value: String(dv.getBigInt64(i)) as any, }; i += 8; break; case 6: const blobLength = dv.getUint16(i); i += 2; this.headers[headerName] = { type: "binary", value: message.subarray(i, i + blobLength), }; i += blobLength; break; case 7: const stringByteLength = dv.getUint16(i); i += 2; const value = toUtf8(message.subarray(i, i + stringByteLength)); this.headers[headerName] = { type: "string", value, }; i += stringByteLength; if (headerName === ":content-type") { this.r = { headers: { "content-type": value, }, }; } break; case 8: this.headers[headerName] = { type: "timestamp", value: new Date(Number(dv.getBigUint64(i))), }; i += 8; break; case 9: const uuidBytes = message.subarray(i, i + 16); i += 16; this.headers[headerName] = { type: "uuid", value: `${toHex(uuidBytes.subarray(0, 4))}-${toHex(uuidBytes.subarray(4, 6))}-${toHex( uuidBytes.subarray(6, 8) )}-${toHex(uuidBytes.subarray(8, 10))}-${toHex(uuidBytes.subarray(10))}`, }; break; default: throw new Error(`Unrecognized header type tag=${headerValueType}`); } } [this.payloadAnnotation, this.payloadSnapshot] = this.formatBody(payload); if (this.headers[":chunk-signature"] && payload.byteLength > 0) { // is signing transform stream chunk, need to decode another level. const inner = new SnapshotEventStreamSerializer(payload); inner.decode(); this.inner = inner; } } public toString() { this.decode(); if (this.inner) { const { inner } = this; return `[chunk (event-stream object view)] [total-size] ${this.totalLength} [header-size] ${this.headerLength} [prelude-crc] ${this.preludeCrc} [total-size] ${inner.totalLength} [header-size] ${inner.headerLength} [prelude-crc] ${inner.preludeCrc} ${serializeEventHeaders(this.headers)} ${serializeEventHeaders(inner.headers)} [${inner.payloadAnnotation}] ${inner.payloadSnapshot} [message-crc] ${inner.messageCrc} [message-crc] ${this.messageCrc} ${"===".repeat(20)} `; } return `[chunk (event-stream object view)] [total-size] ${this.totalLength} [header-size] ${this.headerLength} [prelude-crc] ${this.preludeCrc} ${serializeEventHeaders(this.headers)} [${this.payloadAnnotation}] ${this.payloadSnapshot} [message-crc] ${this.messageCrc} ${"===".repeat(20)} `; } } function serializeEventHeaders(headers: Message["headers"]): string { let b = ""; for (const [k, { type, value }] of Object.entries(headers ?? {})) { if (type === "string") { b += `${k}: ${value}\n`; } else if (value instanceof Date) { b += `${k}: ${serializeDate(value)} (${type})\n`; } else { b += `${k}: ${value} (${type})\n`; } } return b; } ================================================ FILE: packages/snapshot-testing/src/serializers/SnapshotPayloadSerializer.ts ================================================ import { fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { PayloadWithHeaders } from "../snapshot-testing-types"; import { ContentTypeDetection } from "./ContentTypeDetection"; import { SnapshotEventStreamSerializer } from "./SnapshotEventStreamSerializer"; /** * @internal */ export class SnapshotPayloadSerializer extends ContentTypeDetection { public constructor(protected r: PayloadWithHeaders) { super(); } /** * @returns [body type hint, body snapshot serialization] */ public async toStringAsync(): Promise<[string, string]> { const { body } = this.r; if (typeof body === "undefined") { return [`[no body]`, ""]; } if (typeof body === "string") { const [annotation, payloadSnapshot] = this.formatStringBody(body); return [`[string (${annotation})]`, payloadSnapshot]; } let b = ``; let header = ``; if (body instanceof Uint8Array) { const [annotation, payloadSnapshot] = this.formatBody(body); return [`[Uint8Array (${annotation})]`, payloadSnapshot]; } else if (typeof body[Symbol.iterator] === "function") { const iterable = body as { [Symbol.iterator](): IterableIterator; }; const ctor = body.constructor.name; header = `[iterable (${ctor})]\n`; for (const chunk of iterable) { b += await serializeChunk(chunk); } } else if (typeof body[Symbol.asyncIterator] === "function") { const asyncIterable = body as { [Symbol.asyncIterator](): AsyncIterableIterator; }; const ctor = body.constructor.name; header = `[async_iterable (${ctor})]\n`; for await (const chunk of asyncIterable) { b += await serializeChunk(chunk); } } else { throw new Error(`cannot serialize [body=${body}] without iterator.`); } return [header, b]; } } /** * Serialize a single chunk of a stream (HTTP payload). */ async function serializeChunk(chunk: unknown): Promise { if (!(chunk instanceof Uint8Array) && typeof chunk !== "string") { chunk = String(chunk); } const utf8 = toUtf8(chunk as any) + "\n"; if (isEvent(utf8)) { const messageSerializer = new SnapshotEventStreamSerializer(chunk as Uint8Array); return messageSerializer.toString(); } return `[chunk (b64)] ${toBase64(fromUtf8(utf8))} `; } function isEvent(str: string): boolean { return ( (str.includes(":message-type") && str.includes(":event-type")) || str.includes(":date") || str.includes(":chunk-signature") ); } ================================================ FILE: packages/snapshot-testing/src/serializers/serializeBytes.ts ================================================ import { cbor } from "@smithy/core/cbor"; /** * CBOR bytes with inline explanations. * @param bytes - to serialize. */ export function serializeBytes(bytes: Uint8Array): string { const objectString = debugBytes(bytes); const byteList = bytesToString(bytes); return `${objectString}\n\n[actual bytes]\n${byteList}`; } /** * @internal */ export function bytesToString(bytes: Uint8Array) { const items = Array.from(bytes).map((b) => String(b)); const lines = []; for (let i = 0; i < items.length; i += 24) { lines.push(items.slice(i, i + 24).join(", ")); } return lines.join(",\n"); } /** * @internal */ export function debugBytes(bytes: Uint8Array): string { const object = cbor.deserialize(bytes); return JSON.stringify(object, null, 2); } ================================================ FILE: packages/snapshot-testing/src/serializers/serializeDate.ts ================================================ export const serializeDate = (d: Date) => d.toLocaleString("en-US", { timeZone: "America/Los_Angeles", weekday: "short", year: "numeric", month: "short", day: "numeric", hour: "numeric", minute: "2-digit", second: "2-digit", timeZoneName: "long", hour12: false, }); ================================================ FILE: packages/snapshot-testing/src/serializers/serializeDocument.ts ================================================ import { serializeDate } from "./serializeDate"; /** * @internal */ export async function serializeDocument(doc: any, indent = 0): Promise { const spaces = " ".repeat(indent); const type = doc instanceof Date ? "Date" : doc instanceof Uint8Array ? "Uint8Array" : typeof doc; if (doc === null) { return `${spaces}(null)`; } if (doc === undefined) { return `${spaces}(undefined)`; } if (doc instanceof Date) { return `${spaces}(Date) ${serializeDate(doc)}`; } if (doc instanceof Uint8Array) { return `${spaces}(Uint8Array) bytes[${Array.from(doc).join(", ")}]`; } if (typeof doc !== "object") { if (type === "string") { return `${spaces}"${doc}"`; } return `${spaces}(${type}) ${doc}`; } if (doc[Symbol.asyncIterator]) { const values = []; for await (const value of doc) { values.push(await serializeDocument(value, indent + 2)); } if (values.length === 0) { return `${spaces}async_it[]`; } return `${spaces}async_it[\n${values.join(",\n")}\n${spaces}]`; } if (Array.isArray(doc)) { if (doc.length === 0) { return `${spaces}[]`; } const serialized = await Promise.all(doc.map((v) => serializeDocument(v, indent + 2))); return `${spaces}[\n${serialized.join(",\n")}\n${spaces}]`; } const keys = Object.keys(doc); if (keys.length === 0) { return `${spaces}{}`; } const serialized = await Promise.all( keys.map(async (k) => `${" ".repeat(indent + 2)}${k}: ${(await serializeDocument(doc[k], indent + 2)).trim()}`) ); return `${spaces}{\n${serialized.join(",\n")}\n${spaces}}`; } ================================================ FILE: packages/snapshot-testing/src/serializers/serializeHttpRequest.spec.ts ================================================ import type { HttpRequest } from "@smithy/types"; import { describe, expect, it as test } from "vitest"; import { serializeHttpRequest } from "./serializeHttpRequest"; describe("serializeHttpRequest user-agent replacement", () => { test("should replace aws-sdk-js version", async () => { const request: HttpRequest = { method: "GET", protocol: "https:", hostname: "example.com", path: "/", headers: { "user-agent": "aws-sdk-js/3.123.456 os/linux lang/js", }, }; const result = await serializeHttpRequest(request); expect(result).toEqual(`GET https://example.com / user-agent: aws-sdk-js/3.___._ lang/js [no body] `); }); test("should remove os metadata", async () => { const request: HttpRequest = { method: "GET", protocol: "https:", hostname: "example.com", path: "/", headers: { "user-agent": "aws-sdk-js/3.0.0 os/darwin lang/js", }, }; const result = await serializeHttpRequest(request); expect(result).toEqual(`GET https://example.com / user-agent: aws-sdk-js/3.___._ lang/js [no body] `); }); test("should remove exec-env with various formats", async () => { const request: HttpRequest = { method: "GET", protocol: "https:", hostname: "example.com", path: "/", headers: { "user-agent": "aws-sdk-js/3.0.0 exec-env/AWS_Lambda_nodejs20.x lang/js", }, }; const result = await serializeHttpRequest(request); expect(result).toEqual(`GET https://example.com / user-agent: aws-sdk-js/3.___._ lang/js [no body] `); }); test("should remove exec-env with periods, underscores, and dashes", async () => { const request: HttpRequest = { method: "GET", protocol: "https:", hostname: "example.com", path: "/", headers: { "x-amz-user-agent": "aws-sdk-js/3.0.0 exec-env/test_env.name-123 lang/js", }, }; const result = await serializeHttpRequest(request); expect(result).toEqual(`GET https://example.com / x-amz-user-agent: aws-sdk-js/3.___._ lang/js [no body] `); }); test("should replace hash version", async () => { const request: HttpRequest = { method: "GET", protocol: "https:", hostname: "example.com", path: "/", headers: { "user-agent": "aws-sdk-js/3.0.0 #1.2.3 lang/js", }, }; const result = await serializeHttpRequest(request); expect(result).toEqual(`GET https://example.com / user-agent: aws-sdk-js/3.___._ #_.__ lang/js [no body] `); }); }); ================================================ FILE: packages/snapshot-testing/src/serializers/serializeHttpRequest.ts ================================================ import type { HttpRequest as IHttpRequest } from "@smithy/types"; import { SnapshotPayloadSerializer } from "./SnapshotPayloadSerializer"; /** * Serialize an http request to string for snapshotting. * @param request * * @internal */ export async function serializeHttpRequest(request: IHttpRequest): Promise { const { method, protocol, hostname, port, path, query, headers, username, password, fragment, body } = request; const defaultPort = protocol === "https:" || protocol === "wss:" ? 443 : 80; let slug = `${path}`; let append = "?"; for (const [k, v] of Object.entries(query ?? {})) { if (Array.isArray(v)) { for (const v2 of v) { slug += `${append}${k}=${v2}`; append = "&"; } } else { slug += `${append}${k}=${v}`; append = "&"; } } if (fragment) { slug += `#${fragment}`; } if (username || password) { slug = `:***@${slug}`; } let headerLines = ``; for (const [k, v] of Object.entries(headers ?? {})) { if (k.toLowerCase().match(/security|-token/)) { headerLines += `${k}: ***\n`; } else if (k.toLowerCase() === "authorization") { let value = "***"; if (headers[k].match(/Credential=\w+\//)) { value = headers[k] .replace(/Credential=\w+\//g, "Credential=***/") .replace(/Credential=\*\*\*\/\d{8}\//g, "Credential=***/19991231/") .replace(/Signature=\w+/g, "Signature=***"); } headerLines += `${k}: ${value}\n`; } else if (k.toLowerCase() === "x-amz-date") { headerLines += `${k}: ${v.replace(/^(\d{8})T(\d{6}Z)$/, "19991231T235959Z")}\n`; } else if (k.toLowerCase() === "user-agent" || k.toLowerCase() === "x-amz-user-agent") { headerLines += `${k}: ${v .replace(/aws-sdk-js\/\d\.\d+\.\d+/, "aws-sdk-js/3.___._") .replace(/os\/(.*?)\s/g, "") .replace(/exec-env\/([\w._-]+)\s?/g, "") .replace(/#(.*?)\s/g, "#_.__ ")}\n`; } else { headerLines += `${k}: ${v}\n`; } } const [bodyAnnotation, bodySnapshot] = await new SnapshotPayloadSerializer(request).toStringAsync(); return derandomize(`${method} ${protocol}//${hostname}${port && port !== defaultPort ? `:${port}` : ""} ${slug} ${headerLines} ${bodyAnnotation} ${bodySnapshot} `); } function derandomize(str: string): string { return str.replace( /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi, "1111abcd-uuid-uuid-uuid-000000001111" ); } ================================================ FILE: packages/snapshot-testing/src/serializers/serializeHttpResponse.ts ================================================ import { Readable } from "node:stream"; import { streamCollector } from "@smithy/node-http-handler"; import type { HttpResponse } from "@smithy/types"; import { SnapshotPayloadSerializer } from "./SnapshotPayloadSerializer"; /** * @internal */ export async function serializeHttpResponse(r: HttpResponse, mayBufferResponseBody?: boolean): Promise { const { statusCode, headers } = r; let headerLines = ``; for (const [k, v] of Object.entries(headers ?? {})) { headerLines += `${k}: ${v}\n`; } if (mayBufferResponseBody && r.body instanceof Readable) { r.body = await streamCollector(r.body); } const [bodyAnnotation, bodySnapshot] = await new SnapshotPayloadSerializer(r).toStringAsync(); return `[status] ${statusCode} ${headerLines} ${bodyAnnotation} ${bodySnapshot} `; } ================================================ FILE: packages/snapshot-testing/src/snapshot-testing-types.ts ================================================ import type { HttpResponse, HttpRequest as IHttpRequest, HttpResponse as IHttpResponse, StaticOperationSchema, } from "@smithy/types"; /** * @internal */ export type PayloadWithHeaders = Pick | Pick; /** * @internal */ export class RequestSnapshotCompleted extends Error { public snapshotComplete = true; } /** * Server protocol for snapshot testing. * * @internal */ export interface SnapshotServerProtocol { getShapeId(): string; serializeResponse( operationSchema: StaticOperationSchema, output: Output ): Promise; } ================================================ FILE: packages/snapshot-testing/src/snapshot-testing.integ.spec.ts ================================================ import * as path from "node:path"; import { ComplexError$, EmptyInputOutput$, EmptyInputOutputCommand, Float16$, Float16Command, FractionalSeconds$, FractionalSecondsCommand, GreetingWithErrors$, GreetingWithErrorsCommand, InvalidGreeting$, NoInputOutput$, NoInputOutputCommand, RecursiveShapes$, RecursiveShapesCommand, RpcV2CborSparseMaps$, RpcV2CborSparseMapsCommand, RpcV2Protocol, RpcV2ProtocolServiceException$, SimpleScalarProperties$, SimpleScalarPropertiesCommand, SparseNullsOperation$, SparseNullsOperationCommand, ValidationException$, } from "@smithy/smithy-rpcv2-cbor-schema"; import type { Command, StaticOperationSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { SnapshotRunner } from "./SnapshotRunner"; type $Command = Command; describe("snapshot testing", () => { const runner = new SnapshotRunner({ snapshotDirPath: path.join(__dirname, "..", "integ-snapshots"), Client: RpcV2Protocol, schemas: new Map([ [EmptyInputOutput$, EmptyInputOutputCommand], [Float16$, Float16Command], [FractionalSeconds$, FractionalSecondsCommand], [GreetingWithErrors$, GreetingWithErrorsCommand], [NoInputOutput$, NoInputOutputCommand], [RecursiveShapes$, RecursiveShapesCommand], [RpcV2CborSparseMaps$, RpcV2CborSparseMapsCommand], [SparseNullsOperation$, SparseNullsOperationCommand], [SimpleScalarProperties$, SimpleScalarPropertiesCommand], ]), errors: [RpcV2ProtocolServiceException$, ValidationException$, ComplexError$, InvalidGreeting$], mode: "write", testCase(caseName: string, run: () => Promise) { it(caseName, run); }, assertions(caseName: string, expected: string, actual: string): Promise { expect(actual).toEqual(expected); return Promise.resolve(); }, }); runner.run(); }); ================================================ FILE: packages/snapshot-testing/src/structure/createFromSchema.ts ================================================ import { Readable } from "node:stream"; import { NormalizedSchema } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; import type { $SchemaRef, StaticStructureSchema } from "@smithy/types"; /** * Creates a static value for a given schema. * * @internal * * @param schema - for which to generate an object. * @param path - to cut off recursive schema at a certain depth. * @param options * @param options.mode - 'min' or 'max' for generating optional members. */ export function createFromSchema(schema: $SchemaRef, path = "", options: { mode?: "min" | "max" } = {}): any { const { mode = "max" } = options; const $ = NormalizedSchema.of(schema); const memberName = $.isMemberSchema() ? $.getMemberName() : "____"; if (customFields[memberName]) { return customFields[memberName]; } const qualifiedName = $.getName(true) ?? "UnknownSchema!"; path += " -> " + qualifiedName + "$" + memberName; const haltRecursion = path.split(qualifiedName).length >= 4; if ($.isStringSchema()) { if ($.isIdempotencyToken()) { return "00000000-0000-4000-8000-000000000000"; } return "__" + memberName + "__"; } else if ($.isNumericSchema()) { return 0; } else if ($.isBigIntegerSchema()) { return BigInt(1000001); } else if ($.isBigDecimalSchema()) { return new NumericValue("9876543210.0123456789", "bigDecimal"); } else if ($.isBooleanSchema()) { return false; } else if ($.isBlobSchema()) { if ($.isStreaming()) { return Readable.from(new Uint8Array([1, 0, 0, 1])); } return new Uint8Array([1, 0, 0, 1]); } else if ($.isTimestampSchema()) { return new Date(946702799999); } else if ($.isMapSchema()) { const map = {} as any; if (haltRecursion) { return map; } const $v = $.getValueSchema(); map.key1 = createFromSchema($v, path + "$k1", options); map.key2 = createFromSchema($v, path + "$k2", options); map.key3 = createFromSchema($v, path + "$k3", options); if ($.getMergedTraits().sparse) { map.sparse = null; } return map; } else if ($.isListSchema()) { const list = [] as any; if (haltRecursion) { return list; } const $v = $.getValueSchema(); list.push( createFromSchema($v, path + "$l1", options), createFromSchema($v, path + "$l2", options), createFromSchema($v, path + "$l3", options) ); if ($.getMergedTraits().sparse) { list.push(null); } return list; } else if ($.isStructSchema()) { const isUnion = $.isUnionSchema(); const requiredMembers = ($.getSchema() as StaticStructureSchema)[6] ?? 0; const isEventStream = isUnion && $.isStreaming(); const struct = {} as any; if (isEventStream) { return { async *[Symbol.asyncIterator]() { for (const [memberName, $member] of $.structIterator()) { yield { [memberName]: createFromSchema($member, path, options), }; } }, }; } else { if (haltRecursion) { return struct; } const unionMemberSelector = path.split("").reduce((a, c) => { return a + c.charCodeAt(0); }, 0) % Object.entries($.getMemberSchemas()).length; let i = 0; for (const [memberName, $member] of $.structIterator()) { if (i >= requiredMembers && mode === "min") { break; } if (!isUnion || i++ === unionMemberSelector) { struct[memberName] = createFromSchema($member, path, options); if (isUnion) { break; } } } } return struct; } else if ($.isUnitSchema()) { return {}; } else if ($.isDocumentSchema()) { return { doc_note: "this is a document", doc_date: new Date(946702799999), doc_blob: new Uint8Array([1, 0, 0, 1]), doc_list: [-7, -3, 0, 1, 5], }; } console.warn("WARN: Unsupported schema type in snapshot test", $); return "UNSUPPORTED_SCHEMA_TYPE"; } /** * Overrides the generated values for members with matching names. * @internal */ export const customFields: Record = { PredictEndpoint: "https://localhost", ChecksumAlgorithm: "CRC64NVME", AccountId: "123456789012", OutpostId: "OutpostId", }; ================================================ FILE: packages/snapshot-testing/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/snapshot-testing/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/snapshot-testing/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/snapshot-testing/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/snapshot-testing/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/typecheck/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/typecheck/CHANGELOG.md ================================================ # Change Log ## 1.1.3 ### Patch Changes - Updated dependencies [cf00244] - @smithy/types@4.14.2 - @smithy/core@3.24.3 ## 1.1.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 1.1.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 1.1.0 ### Minor Changes - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ## 1.0.25 ### Patch Changes - @smithy/core@3.23.17 ## 1.0.24 ### Patch Changes - Updated dependencies [a029f0e] - @smithy/core@3.23.16 ## 1.0.23 ### Patch Changes - Updated dependencies [131fce4] - Updated dependencies [52b4789] - @smithy/types@4.14.1 - @smithy/core@3.23.15 - @smithy/util-middleware@4.2.14 ## 1.0.22 ### Patch Changes - Updated dependencies [cffd868] - @smithy/types@4.14.0 - @smithy/core@3.23.14 - @smithy/util-middleware@4.2.13 ## 1.0.21 ### Patch Changes - Updated dependencies [7198e09] - @smithy/core@3.23.13 ## 1.0.20 ### Patch Changes - @smithy/core@3.23.12 ## 1.0.19 ### Patch Changes - Updated dependencies [2edd638] - @smithy/core@3.23.11 ## 1.0.18 ### Patch Changes - Updated dependencies [5340b11] - @smithy/core@3.23.10 - @smithy/types@4.13.1 - @smithy/util-middleware@4.2.12 ## 1.0.17 ### Patch Changes - Updated dependencies [6ef5430] - Updated dependencies [6ef5430] - @smithy/core@3.23.9 ## 1.0.16 ### Patch Changes - Updated dependencies [a4d95e6] - @smithy/util-middleware@4.2.11 - @smithy/core@3.23.8 ## 1.0.15 ### Patch Changes - Updated dependencies [11569eb] - @smithy/core@3.23.7 ## 1.0.14 ### Patch Changes - Updated dependencies [d0954cc] - @smithy/types@4.13.0 - @smithy/core@3.23.6 - @smithy/util-middleware@4.2.10 ## 1.0.13 ### Patch Changes - Updated dependencies [026b177] - Updated dependencies [cde9f09] - @smithy/core@3.23.5 ## 1.0.12 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false - Updated dependencies [03c3dc8] - @smithy/core@3.23.4 - @smithy/types@4.12.1 - @smithy/util-middleware@4.2.9 ## 1.0.11 ### Patch Changes - @smithy/core@3.23.3 ## 1.0.10 ### Patch Changes - Updated dependencies [c5db01c] - @smithy/core@3.23.2 ## 1.0.9 ### Patch Changes - Updated dependencies [6f96c01] - @smithy/core@3.23.1 ## 1.0.8 ### Patch Changes - Updated dependencies [4f05c6a] - @smithy/core@3.23.0 ## 1.0.7 ### Patch Changes - @smithy/core@3.22.1 ## 1.0.6 ### Patch Changes - Updated dependencies [472bf01] - @smithy/core@3.22.0 ## 1.0.5 ### Patch Changes - Updated dependencies [fa0e0c4] - @smithy/core@3.21.1 ## 1.0.4 ### Patch Changes - Updated dependencies [c2a6f46] - @smithy/core@3.21.0 ## 1.0.3 ### Patch Changes - Updated dependencies [96cc077] - @smithy/core@3.20.8 ## 1.0.2 ### Patch Changes - Updated dependencies [ae6ef2e] - @smithy/core@3.20.7 ## 1.0.1 ### Patch Changes - Updated dependencies [862c942] - @smithy/core@3.20.6 ## 1.0.0 ### Major Changes - 8ed2b6f: add runtime typecheck pkg ================================================ FILE: packages/typecheck/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/typecheck/README.md ================================================ # @smithy/typecheck [![NPM version](https://img.shields.io/npm/v/@smithy/typecheck/latest.svg)](https://www.npmjs.com/package/@smithy/typecheck) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/typecheck.svg)](https://www.npmjs.com/package/@smithy/typecheck) This package contains optional functions for runtime typechecking. ## Prerequisites This package requires Smithy-TypeScript client SDKs generated with v0.41.1 or greater. For AWS SDK for JavaScript v3 clients (`@aws-sdk/client-*`), this means [v3.953.0](https://github.com/aws/aws-sdk-js-v3/releases/tag/v3.953.0) or higher is required. If you attach the plugin to an unsupported client, an error will be thrown on any request made with the client: ```shell Error: @smithy/typecheck::rttcMiddleware - unsupported client version. ``` ## Use with caution Runtime typechecking has two disadvantages you should accept before use: - client-side typechecks are not as accurate as allowing the server to validate and potentially reject your request. The older a client is, the more likely that the server implementation may have changed in comparison to the types shipped with that client. - additional CPU time and memory will be used on executing the typechecks. ## When to use runtime typechecks For example, if you are developing a script against a service, enabling the runtime typechecking plugin can assist in the placement of input parameters by providing a faster feedback loop than making requests against the service. It can also be potentially useful when accepting an input from another source. ## Runtime Typecheck - Client Plugin Usage ```ts // example: attaching the runtime typechecker. import { getRuntimeTypecheckPlugin } from "@smithy/typecheck"; import { XYZClient, XYZCommand } from "xyz"; const client = new XYZClient({}); client.middlewareStack.use( getRuntimeTypecheckPlugin({ logger: console, // use false or a string corresponding to a log level, // (trace, debug, info, warn, error) // or "throw" to have an error be thrown. input: "warn", // use false or a log level string. output: false, }) ); await client.send(new XYZCommand()); ``` In this example, the runtime typechecker plugin will now emit all type validation errors as warnings to the logger implementation. ### Example log output ``` RpcV2ProtocolClient->RecursiveShapesCommand input validation: {}.nested.foo: expected string, got number. {}.nested.nested.bar: expected string, got number. {}.nested.nested.recursiveMember.nested: unmatched keys: foo, extra1. {}.nested.nested.recursiveMember.nested.bar: expected string, got number. ``` The `{}` indicates the root object, and each error line logs the path to the field in question and reason for the validation error. ## Runtime Typecheck - Standalone Object Validation See also [documentation on schemas](https://github.com/aws/aws-sdk-js-v3/blob/main/supplemental-docs/SCHEMAS.md). As of the prerequisite versions mentioned above, client packages export schema definitions for all structural shapes used by the client, derived from the Smithy service model. These schemas can be used to validate the shape of an input object. ```ts // example: validating a schema and object pair. import { validateSchema } from "@smithy/typecheck"; import { MyStruct$ } from "my-smithy-client-package"; const errors: string[] = validateSchema( // schema from generated client package. MyStruct$, // user-defined object. { x: 0, y: 1, } ); ``` ```ts // example: bound validator const myStructValidator = validateSchema.bind(null, MyStruct$); const errors: string[] = myStructValidator({ x: 0, y: 1 }); ``` The returned errors array will be the same statements as those appearing in the client plugin example above. ================================================ FILE: packages/typecheck/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/typecheck/package.json ================================================ { "name": "@smithy/typecheck", "version": "1.1.3", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline typecheck", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:vitest run", "test:integration": "yarn g:vitest run -c vitest.config.integ.mts", "test:integration:watch": "yarn g:vitest watch -c vitest.config.integ.mts", "test:watch": "yarn g:vitest watch" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<=4.0": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/typecheck", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/typecheck" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/typecheck/src/getRuntimeTypecheckPlugin.ts ================================================ import { getSmithyContext } from "@smithy/core/client"; import type { HandlerExecutionContext, InitializeHandler, InitializeHandlerArguments, InitializeHandlerOptions, MetadataBearer, MiddlewareStack, Pluggable, StaticOperationSchema, } from "@smithy/types"; import type { RuntimeTypecheckOptions } from "./types"; import { validateSchema } from "./validateSchema"; /** * Applies a configurable middleware that performs runtime typechecks on request inputs and response outputs. * @public */ export function getRuntimeTypecheckPlugin( options: RuntimeTypecheckOptions ): Pluggable { return { applyToStack: (commandStack: MiddlewareStack) => { commandStack.add(runtimeTypecheckMiddleware(options), runtimeTypecheckOptions); }, }; } /** * @internal */ const runtimeTypecheckOptions: InitializeHandlerOptions = { name: "runtimeTypecheckMiddleware", step: "initialize", tags: ["RUNTIME_TYPECHECK"], override: true, }; /** * @internal */ const runtimeTypecheckMiddleware = (options: RuntimeTypecheckOptions) => (next: InitializeHandler, context: HandlerExecutionContext) => { const n = options; return async (args: InitializeHandlerArguments) => { const { input } = args; const { operationSchema } = getSmithyContext(context) as { operationSchema: StaticOperationSchema; }; if (!operationSchema) { throw new Error(`@smithy/typecheck::rttcMiddleware - unsupported client version.`); } if (operationSchema?.[4]) { const errors = validateSchema(operationSchema[4], input); if (n.input && errors.length) { const msg = `${context.clientName}->${context.commandName} input validation: \n\t${errors.join("\n\t")}`; if (n.input === "throw") { throw new Error(msg); } else { options?.logger?.[n.input]?.(msg); } } } const result = await next(args); const { output } = result; if (operationSchema?.[5]) { const copy = { ...output, }; delete copy.$metadata; const errors = validateSchema(operationSchema[5], copy); if (n.output && errors.length) { const msg = `${context.clientName}->${context.commandName} output validation: \n\t${errors.join("\n\t")}`; options?.logger?.[n.output]?.(msg); } } return result; }; }; ================================================ FILE: packages/typecheck/src/index.ts ================================================ export * from "./getRuntimeTypecheckPlugin"; export * from "./types"; export * from "./validateSchema"; ================================================ FILE: packages/typecheck/src/runtime-typecheck.integ.spec.ts ================================================ import { cbor } from "@smithy/core/cbor"; import { HttpResponse } from "@smithy/protocol-http"; import { RpcV2Protocol as MICGClient } from "@smithy/smithy-rpcv2-cbor"; import { RpcV2Protocol } from "@smithy/smithy-rpcv2-cbor-schema"; import { requireRequestsFrom } from "@smithy/util-test/src"; import { describe, expect, test as it, vi } from "vitest"; import { getRuntimeTypecheckPlugin } from "./getRuntimeTypecheckPlugin"; describe("schema-based runtime typecheck integration test", () => { it("should detect type mismatches", async () => { const logger = { info: vi.fn(), debug: vi.fn(), error: vi.fn(), warn: vi.fn(), trace: vi.fn(), }; const client = new RpcV2Protocol({ endpoint: "https://localhost", logger, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({ nested: { foo: 5, }, }), }) ); client.middlewareStack.use( getRuntimeTypecheckPlugin({ logger, input: "warn", output: "info", }) ); const output = await client.recursiveShapes({ nested: { foo: 0, nested: { bar: 0, recursiveMember: { nested: { foo: 1, extra1: 0, bar: 0, recursiveMember: {} }, }, }, }, } as any); expect(output).toEqual({ $metadata: { attempts: 1, cfId: undefined, extendedRequestId: undefined, httpStatusCode: 200, requestId: undefined, totalRetryDelay: 0, }, nested: { foo: 5, }, }); expect(logger.warn).toHaveBeenCalledWith( "RpcV2ProtocolClient->RecursiveShapesCommand input validation: \n" + "\t{}.nested.foo: expected string, got number.\n" + "\t{}.nested.nested.bar: expected string, got number.\n" + "\t{}.nested.nested.recursiveMember.nested: unmatched keys: foo, extra1.\n" + "\t{}.nested.nested.recursiveMember.nested.bar: expected string, got number." ); expect(logger.info).toHaveBeenCalledWith( "RpcV2ProtocolClient->RecursiveShapesCommand output validation: \n" + "\t{}.nested.foo: expected string, got number." ); }); it("can be configured to throw an error", async () => { const logger = { info: vi.fn(), debug: vi.fn(), error: vi.fn(), warn: vi.fn(), trace: vi.fn(), }; const client = new RpcV2Protocol({ endpoint: "https://localhost", logger, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({ nested: { foo: 5, }, }), }) ); client.middlewareStack.use( getRuntimeTypecheckPlugin({ logger, input: "throw", output: "info", }) ); await expect(() => client.recursiveShapes({ nested: { foo: 0, nested: { bar: 0, recursiveMember: { nested: { foo: 1, extra1: 0, bar: 0, recursiveMember: {} }, }, }, }, } as any) ).rejects.toThrowError( "RpcV2ProtocolClient->RecursiveShapesCommand input validation: \n" + "\t{}.nested.foo: expected string, got number.\n" + "\t{}.nested.nested.bar: expected string, got number.\n" + "\t{}.nested.nested.recursiveMember.nested: unmatched keys: foo, extra1.\n" + "\t{}.nested.nested.recursiveMember.nested.bar: expected string, got number." ); expect(logger.warn).not.toHaveBeenCalled(); expect(logger.info).not.toHaveBeenCalled(); }); it("should notify when an incompatible client is used", async () => { const logger = { info: vi.fn(), debug: vi.fn(), error: vi.fn(), warn: vi.fn(), trace: vi.fn(), }; const client = new MICGClient({ endpoint: "https://localhost", logger, }); requireRequestsFrom(client) .toMatch({ hostname: /localhost/, }) .respondWith( new HttpResponse({ headers: { "smithy-protocol": "rpc-v2-cbor", }, statusCode: 200, body: cbor.serialize({ nested: { foo: "5", }, }), }) ); client.middlewareStack.use( getRuntimeTypecheckPlugin({ logger, input: "warn", output: "info", }) ); await expect(() => client.recursiveShapes({ nested: { foo: 0, nested: { bar: 0, recursiveMember: { nested: { foo: 1, extra1: 0, bar: 0, recursiveMember: {} }, }, }, }, } as any) ).rejects.toThrowError("@smithy/typecheck::rttcMiddleware - unsupported client version."); }); }); ================================================ FILE: packages/typecheck/src/types.ts ================================================ import type { Logger } from "@smithy/types"; /** * Caution: the default and intended behavior is to skip runtime typechecking * for performance and compatibility reasons. The server response will * contain validation information if requirements are not met, and * is the most accurate source. * * Client-side RTTC is provided as a convenience for a faster feedback loop * during script development, but cannot be relied upon as the authority. * * `trace`, `debug`, `info`, `warn`, and `error` will call the corresponding logger channel. * `throw` will instead throw an exception. * * `false` shuts off all runtime typecheck behavior (the default). * * @public */ export type RuntimeTypecheckBehavior = false | keyof Logger | "throw"; /** * Allows separate configuration of inputs and outputs. * If providing a single value (RuntimeTypecheckBehavior), it will apply ONLY * to inputs. * * @public */ export type RuntimeTypecheckOptions = { /** * The logger to call with the typecheck validation errors. */ logger?: Logger; input?: RuntimeTypecheckBehavior; /** * Automatic `throw` is not supported in output validation. * We do not recommend throwing on output validation. */ output?: false | keyof Logger; }; ================================================ FILE: packages/typecheck/src/validateSchema.spec.ts ================================================ import type { BigDecimalSchema, BigIntegerSchema, BlobSchema, BooleanSchema, DocumentSchema, NumericSchema, StaticListSchema, StaticMapSchema, StaticStructureSchema, TimestampEpochSecondsSchema, } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { validateSchema } from "./validateSchema"; describe("schema-based runtime typecheck", () => { const Widget$: StaticStructureSchema = [ 3, "ns", "Widget", 0, [ "string", "n", "bool", "media", "timestamp", "document", "bigint", "bigdecimal", "blob", "list", "sparseList", "map", "sparseMap", "widget", ], [ 0, 1 satisfies NumericSchema, 2 satisfies BooleanSchema, [0, "ns", "Media", { mediaType: "application/json" }, 0], 7 satisfies TimestampEpochSecondsSchema, 15 satisfies DocumentSchema, 17 satisfies BigIntegerSchema, 19 satisfies BigDecimalSchema, 21 satisfies BlobSchema, [[1, "ns", "List", 0, () => Widget$] satisfies StaticListSchema, 0], [[1, "ns", "List", 0, () => Widget$] satisfies StaticListSchema, { sparse: 1 }], [2, "ns", "Map", 0, 0, () => Widget$] satisfies StaticMapSchema, [[2, "ns", "Map", 0, 0, () => Widget$] satisfies StaticMapSchema, { sparse: 1 }], () => Widget$, ], 2, ] satisfies StaticStructureSchema; it("should detect type mismatches", () => { expect( validateSchema(Widget$, { string: 0, n: "", bool: 0, media: "ahh", timestamp: new Date(), document: { a: [0, 1, 2, 3], }, bigint: 45, bigdecimal: 1.2, blob: [0, 1, 2, 3], list: {}, sparseList: [0], map: [], sparseMap: { a: 0 }, widget: 5, }) ).toEqual([ "{}.string: expected string, got number.", "{}.n: expected number, got string.", "{}.bool: expected boolean, got number.", "{}.bigint: expected bigint, got number.", "{}.bigdecimal: expected NumericValue, got number.", "{}.blob: expected Uint8Array, got object.", "{}.list:expected array (list), got object.", "{}.sparseList[0]: expected {ns#Widget}, got number", '{}.sparseMap["a"]: expected {ns#Widget}, got number', "{}.widget: expected {ns#Widget}, got number", ]); }); it("should detect missing required members", () => { expect(validateSchema(Widget$, {})).toEqual(["{}.string: is required.", "{}.n: is required."]); expect( validateSchema(Widget$, { string: "", n: 0, list: [null, { string: "", n: 0 }], sparseList: [ null, null, { string: ".", }, ], sparseMap: { a: null, b: { n: 0, }, }, map: { a: null, b: { n: 0, }, }, widget: { string: "", n: 0, widget: { n: 0, }, }, }) ).toEqual([ "{}.list[0]: should be non-null.", "{}.sparseList[2].n: is required.", "{}.map[a]: should be non-null.", '{}.map["b"].string: is required.', '{}.sparseMap["b"].string: is required.', "{}.widget.widget.string: is required.", ]); }); it("should detect extraneous members", () => { expect( validateSchema(Widget$, { string: "", n: 0, document: { a: 1, b: 2, }, extra1: 0, extra2: 1, widget: { string: "", n: 0, extra1: 0, extra2: 1 }, }) ).toEqual(["{}: unmatched keys: extra1, extra2.", "{}.widget: unmatched keys: extra1, extra2."]); }); }); ================================================ FILE: packages/typecheck/src/validateSchema.ts ================================================ import { NormalizedSchema } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; import type { $SchemaRef, StaticStructureSchema } from "@smithy/types"; /** * Provides list of validation errors, which may be empty. * @public * @param schema - to validate against. * @param data - to validate. * @param path - object path for error message contextualization. */ export function validateSchema(schema: $SchemaRef, data: unknown, path = "{}"): string[] { const errors: string[] = []; if (data == undefined) { return errors; } const $ = NormalizedSchema.of(schema); if ($.isStringSchema()) { if (typeof data !== "string") { errors.push(`${path}: expected string, got ${typeof data}.`); } } else if ($.isNumericSchema()) { if (typeof data !== "number") { errors.push(`${path}: expected number, got ${typeof data}.`); } } else if ($.isBigIntegerSchema()) { if (typeof data !== "bigint") { errors.push(`${path}: expected bigint, got ${typeof data}.`); } } else if ($.isBigDecimalSchema()) { if (!(data instanceof NumericValue)) { errors.push(`${path}: expected NumericValue, got ${typeof data}.`); } } else if ($.isBooleanSchema()) { if (typeof data !== "boolean") { errors.push(`${path}: expected boolean, got ${typeof data}.`); } } else if ($.isBlobSchema()) { if ($.isStreaming()) { // many types are allowed for streaming payloads. } else { if (!(data instanceof Uint8Array)) { errors.push(`${path}: expected Uint8Array, got ${typeof data}.`); } } } else if ($.isTimestampSchema()) { if (!(data instanceof Date)) { errors.push(`${path}: expected Date, got ${typeof data}.`); } } else if ($.isMapSchema()) { if (typeof data !== "object") { errors.push(`${path}:expected map object, got ${typeof data}.`); } else { const sparse = !!$.getMergedTraits().sparse; const map$ = $.getValueSchema(); for (const [key, value] of Object.entries(data)) { if (value == null) { if (!sparse) { errors.push(`${path}[${key}]: should be non-null.`); } } else { errors.push(...validateSchema(map$, value, path + `["${key}"]`)); } } } } else if ($.isListSchema()) { if (!Array.isArray(data)) { errors.push(`${path}:expected array (list), got ${typeof data}.`); } else { const list$ = $.getValueSchema(); const sparse = !!$.getMergedTraits().sparse; for (let i = 0; i < data.length; ++i) { const value = data[i]; if (value == null) { if (!sparse) { errors.push(`${path}[${i}]: should be non-null.`); } } else { errors.push(...validateSchema(list$, value, path + `[${i}]`)); } } } } else if ($.isStructSchema()) { if (typeof data !== "object") { errors.push(`${path}: expected {${$.getName(true)}}, got ${typeof data}`); } else { const keys = new Set(Object.keys(data)); let required = ($.getSchema() as StaticStructureSchema)?.[6] ?? 0; for (const [member, member$] of $.structIterator()) { keys.delete(member); const value = (data as any)[member]; const isRequired = required-- > 0; if (isRequired && value == null) { errors.push(`${path}.${member}: is required.`); } else { errors.push(...validateSchema(member$, value, path + `.${member}`)); } } if (keys.size > 0) { errors.unshift(`${path}: unmatched keys: ${Array.from(keys).join(", ")}.`); } } } return errors; } ================================================ FILE: packages/typecheck/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/typecheck/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/typecheck/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/typecheck/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/typecheck/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ,e2e,browser}.spec.ts"], include: ["**/*.spec.ts"], environment: "node", }, }); ================================================ FILE: packages/types/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/types/CHANGELOG.md ================================================ # Change Log ## 4.14.2 ### Patch Changes - cf00244: fix(types): exclude SharedArrayBuffer from recursive type transform ## 4.14.1 ### Patch Changes - 131fce4: add eventStream indicator signal for NodeHttp2ConnectionManager so it does not reuse connections for event streams - 52b4789: allow snapshot of credentials for event-stream signing ## 4.14.0 ### Minor Changes - cffd868: Introduce default retry behavior modifications slated for 2026. They are: less time between server error retries, but slightly more time between throttling errors. Lower retry capacity consumption for throttling, and improved parsing of the retry-after and x-amz-retry-after headers. ## 4.13.1 ### Patch Changes - 5340b11: apply resolved endpoint headers to final request ## 4.13.0 ### Minor Changes - d0954cc: allow adding new checksum algorithms via extension ## 4.12.1 ### Patch Changes - 03c3dc8: update for rollup build externalLiveBindings=false ## 4.12.0 ### Minor Changes - 745867a: encode required member count in structure schemas ## 4.11.0 ### Minor Changes - 9ccb841: add static union schema as a new type ## 4.10.0 ### Minor Changes - 5a56762: make protocol selection easier ## 4.9.0 ### Minor Changes - 3926fd7: set release level for schemas ## 4.8.1 ### Patch Changes - 6da0ab3: export used types ## 4.8.0 ### Minor Changes - 8a2a912: remove usage of non-static schema classes ## 4.7.1 ### Patch Changes - 052d261: fix ordering of static simple schema type ## 4.7.0 ### Minor Changes - 761d89c: undeprecate socketTimeout for node:https requests - 7f8af58: generation of static schema ## 4.6.0 ### Minor Changes - 45ee67f: update dist-cjs generation to use rollup ## 4.5.0 ### Minor Changes - bb7c1c1: schema code size optimizations ## 4.4.0 ### Minor Changes - 64cda93: set sideEffects bundler metadata ### Patch Changes - f884df7: enforce consistent-type-imports ## 4.3.2 ### Patch Changes - 64e033f: schema serde: http binding and cbor serializer refactoring ## 4.3.1 ### Patch Changes - 358c1ff: fix Command interface compatibility with type transformers ## 4.3.0 ### Minor Changes - 0547fab: add types for schemas ## 4.2.0 ### Minor Changes - e917e61: enforce singular config object during client instantiation ## 4.1.0 ### Minor Changes - 2aff9df: Added middleware support to pagination - 000b2ae: allow paginator token fallback to be specified by operation input ## 4.0.0 ### Major Changes - 20d99be: major version bump for dropping node16 support ## 3.7.2 ### Patch Changes - b52b4e8: add support for error cause in transient error checks ## 3.7.1 ### Patch Changes - fcd5ca8: prevent infinite recursion with NoUndefined and RecursiveRequired re: DocumentType ## 3.7.0 ### Minor Changes - cd1929b: vitest compatibility ## 3.6.0 ### Minor Changes - 84bec05: add feature identification map to smithy context ## 3.5.0 ### Minor Changes - a4c1285: configurable hoisted headers ## 3.4.2 ### Patch Changes - e7b438b: add interface stub for browser RequestInit type ## 3.4.1 ### Patch Changes - cf9257e: add requestInit options to fetch ## 3.4.0 ### Minor Changes - 2dad138: Add string array to EndpointParameters ### Patch Changes - 9f3f2f5: fix type transforms ## 3.3.0 ### Minor Changes - 4784fb9: Adding support for setting the fetch API credentials mode ## 3.2.0 ### Minor Changes - c2a5595: use platform AbortController|AbortSignal implementations ### Patch Changes - c16e014: add logger option to node-http-handler parameters, clear socket usage check timeout on error ## 3.1.0 ### Minor Changes - 38da9009: adds accountId to the AwsCredentialIdentity interface ## 3.0.0 ### Major Changes - 671aa704: update to node16 minimum ### Minor Changes - 7a7c84d3: fix type transforms for method signatures with no arguments ## 2.12.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - 661f1d60: allow command constructor argument to be omitted if no required members ## 2.11.0 ### Minor Changes - 43f3e1e2: encoders allow string inputs ## 2.10.1 ### Patch Changes - dd0d9b4b: make clock skew correcting errors transient ## 2.10.0 ### Minor Changes - d70a00ac: allow ctor args in lieu of Agent instances in node-http-handler ctor - 1e23f967: add socket exhaustion checked warning to node-http-handler ## 2.9.1 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm ## 2.9.0 ### Minor Changes - 9939f823: bundle dist-cjs index ## 2.8.0 ### Minor Changes - 590af6b7: support credential scope ## 2.7.0 ### Minor Changes - 340634a5: move default fetch and http handler ctor types to the types package ## 2.6.0 ### Minor Changes - 9bfc64ed: add type helper for nullability in clients ### Patch Changes - 9579a9a0: Add internal error and success handlers to `HttpSigner`. ## 2.5.0 ### Minor Changes - 8044a814: feat(experimentalIdentityAndAuth): move `experimentalIdentityAndAuth` types and interfaces to `@smithy/types` and `@smithy/core` ## 2.4.0 ### Minor Changes - 5e9fd6ce: transform inputs for env specific type helpers ### Patch Changes - 05f5d42c: Allow lowercase type names for endpoint parameter ## 2.3.5 ### Patch Changes - d6b4c090: Add enum IniSectionType ## 2.3.4 ### Patch Changes - 2f70f105: Support `aliases` for `MiddlewareStack` - 9a562d37: check for existence of browser Blob/ReadableStream types in payload union ## 2.3.3 ### Patch Changes - ea0635d6: add debug method to middlewareStack ## 2.3.2 ### Patch Changes - fbfeebee: Add `clientName` and `commandName` to `HandlerExecutionContext` - c0b17a13: Add Smithy context to `HandlerExecutionContext` ## 2.3.1 ### Patch Changes - b9265813: fix: broken ChecksumConfiguration interface in TS < 4.4 and conditional generic types in TS<4.1 - 6d1c2fb1: fix paginator type ## 2.3.0 ### Minor Changes - 88bcec3d: Add retry to runtime extension ## 2.2.2 ### Patch Changes - b753dd4c: move extensions code to smithy-client - 6c8ffa27: Rename defaultClientConfiguration to defaultExtensionConfiguration ## 2.2.1 ### Patch Changes - 381e03c4: Remove symbol as an index from ChecksumConfiguration interface in @smithy/types ## 2.2.0 ### Minor Changes - f6cb949d: add extensions to client runtime config ## 2.1.0 ### Minor Changes - 59548ba9: Add type to check optional Client Configuration ### Patch Changes - 3e1ab589: add release tag public to client init interface components ## 2.0.2 ### Patch Changes - 1b951769: custom ts3.4 downlevel for types/transform/type-transform ## 2.0.1 ### Patch Changes - 9d53bc76: update to 2.x major versions ## 1.2.0 ### Minor Changes - e3cbb3cc: set types to the 1.x line ## 2.0.0 ### Major Changes - d90a45b5: improved streaming payload types ### Patch Changes - 8cd89c75: enable api extractor for documentation generation ## 1.1.1 ### Patch Changes - 6e312329: restore downlevel types ## 1.1.0 ### Minor Changes - adedc001c: Add types for migrated packages All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. See [@aws-sdk/types](https://github.com/aws/aws-sdk-js-v3/blob/main/packages/types/CHANGELOG.md) for additional history. ================================================ FILE: packages/types/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/types/README.md ================================================ # @smithy/types [![NPM version](https://img.shields.io/npm/v/@smithy/types/latest.svg)](https://www.npmjs.com/package/@smithy/types) [![NPM downloads](https://img.shields.io/npm/dm/@smithy/types.svg)](https://www.npmjs.com/package/@smithy/types) ## Usage This package is mostly used internally by generated clients. Some public components have independent applications. --- ### Scenario: Removing `| undefined` from input and output structures Generated shapes' members are unioned with `undefined` for input shapes, and are `?` (optional) for output shapes. - for inputs, this defers the validation to the service. - for outputs, this strongly suggests that you should runtime-check the output data. If you would like to skip these steps, use the `AssertiveClient` or `UncheckedClient` type helpers. Using AWS S3 as an example: ```ts import { S3 } from "@aws-sdk/client-s3"; import type { AssertiveClient, UncheckedClient } from "@smithy/types"; const s3a = new S3({}) as AssertiveClient; const s3b = new S3({}) as UncheckedClient; // AssertiveClient enforces required inputs are not undefined // and required outputs are not undefined. const get = await s3a.getObject({ Bucket: "", // @ts-expect-error (undefined not assignable to string) Key: undefined, }); // UncheckedClient makes output fields non-nullable. // You should still perform type checks as you deem // necessary, but the SDK will no longer prompt you // with nullability errors. const body = await ( await s3b.getObject({ Bucket: "", Key: "", }) ).Body.transformToString(); ``` When using the transform on non-aggregated client with the `Command` syntax, the input cannot be validated because it goes through another class. ```ts import { GetObjectCommand, GetObjectCommandInput, ListBucketsCommand, S3Client } from "@aws-sdk/client-s3"; import type { AssertiveClient, NoUndefined, UncheckedClient } from "@smithy/types"; const s3 = new S3Client({}) as UncheckedClient; const list = await s3.send( new ListBucketsCommand({ // command inputs are not validated by the type transform. // because this is a separate class. }) ); /** * Although less ergonomic, you can use the NoUndefined * transform on the input type. */ const getObjectInput: NoUndefined = { Bucket: "undefined", // @ts-expect-error (undefined not assignable to string) Key: undefined, // optional params can still be undefined. SSECustomerAlgorithm: undefined, }; const get = s3.send(new GetObjectCommand(getObjectInput)); // outputs are still transformed. await get.Body.TransformToString(); ``` ### Scenario: Narrowing a smithy-typescript generated client's output payload blob types This is mostly relevant to operations with streaming bodies such as within the S3Client in the AWS SDK for JavaScript v3. Because blob payload types are platform dependent, you may wish to indicate in your application that a client is running in a specific environment. This narrows the blob payload types. ```typescript import type { IncomingMessage } from "node:http"; import { GetObjectCommand, S3Client } from "@aws-sdk/client-s3"; import type { NodeJsClient, SdkStream, StreamingBlobPayloadOutputTypes } from "@smithy/types"; // default client init. const s3Default = new S3Client({}); // client init with type narrowing. const s3NarrowType = new S3Client({}) as NodeJsClient; // The default type of blob payloads is a wide union type including multiple possible // request handlers. const body1: StreamingBlobPayloadOutputTypes = (await s3Default.send(new GetObjectCommand({ Key: "", Bucket: "" }))) .Body!; // This is of the narrower type SdkStream representing // blob payload responses using specifically the node:http request handler. const body2: SdkStream = (await s3NarrowType.send(new GetObjectCommand({ Key: "", Bucket: "" }))) .Body!; ``` ================================================ FILE: packages/types/api-extractor.json ================================================ { "extends": "../../api-extractor.packages.json", "mainEntryPointFilePath": "./dist-types/index.d.ts" } ================================================ FILE: packages/types/package.json ================================================ { "name": "@smithy/types", "version": "4.14.2", "scripts": { "build": "concurrently 'yarn:build:types' 'yarn:build:es:cjs'", "build:es:cjs": "yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline types", "build:types": "yarn g:tsc -p tsconfig.types.json", "build:types:downlevel": "premove dist-types/ts3.4 && downlevel-dts dist-types dist-types/ts3.4 && node scripts/downlevel", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "extract:docs": "api-extractor run --local", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "yarn g:tsc -p tsconfig.test.json" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS Smithy Team", "email": "", "url": "https://smithy.io" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "typesVersions": { "<=4.0": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/types", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/types" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/types/scripts/downlevel.js ================================================ const fs = require("fs"); const path = require("path"); const pkgRoot = path.join(__dirname, ".."); function replaceDownlevelFile(pathFromSrc = "") { const code = fs.readFileSync(path.join(pkgRoot, "dist-types", "ts3.4", "downlevel-ts3.4", pathFromSrc), "utf-8"); fs.writeFileSync(path.join(pkgRoot, "dist-types", "ts3.4", pathFromSrc), code, "utf-8"); } replaceDownlevelFile("transform/type-transform.d.ts"); ================================================ FILE: packages/types/src/abort-handler.ts ================================================ import type { AbortSignal as DeprecatedAbortSignal } from "./abort"; /** * @public */ export interface AbortHandler { (this: AbortSignal | DeprecatedAbortSignal, ev: any): any; } ================================================ FILE: packages/types/src/abort.ts ================================================ import type { AbortHandler } from "./abort-handler"; /** * @public */ export { AbortHandler }; /** * Holders of an AbortSignal object may query if the associated operation has * been aborted and register an onabort handler. * * @public * @deprecated use platform (global) type for AbortSignal. * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal */ export interface AbortSignal { /** * Whether the action represented by this signal has been cancelled. */ readonly aborted: boolean; /** * A function to be invoked when the action represented by this signal has * been cancelled. */ onabort: AbortHandler | Function | null; } /** * The AWS SDK uses a Controller/Signal model to allow for cooperative * cancellation of asynchronous operations. When initiating such an operation, * the caller can create an AbortController and then provide linked signal to * subtasks. This allows a single source to communicate to multiple consumers * that an action has been aborted without dictating how that cancellation * should be handled. * * @public * @deprecated use platform (global) type for AbortController. * @see https://developer.mozilla.org/en-US/docs/Web/API/AbortController */ export interface AbortController { /** * An object that reports whether the action associated with this * `AbortController` has been cancelled. */ readonly signal: AbortSignal; /** * Declares the operation associated with this AbortController to have been * cancelled. */ abort(): void; } ================================================ FILE: packages/types/src/auth/HttpApiKeyAuth.ts ================================================ /** * @internal */ export enum HttpApiKeyAuthLocation { HEADER = "header", QUERY = "query", } ================================================ FILE: packages/types/src/auth/HttpAuthScheme.ts ================================================ import type { Identity, IdentityProvider } from "../identity/identity"; import type { HandlerExecutionContext } from "../middleware"; import type { HttpSigner } from "./HttpSigner"; import type { IdentityProviderConfig } from "./IdentityProviderConfig"; /** * ID for {@link HttpAuthScheme} * @internal */ export type HttpAuthSchemeId = string; /** * Interface that defines an HttpAuthScheme * @internal */ export interface HttpAuthScheme { /** * ID for an HttpAuthScheme, typically the absolute shape ID of a Smithy auth trait. */ schemeId: HttpAuthSchemeId; /** * Gets the IdentityProvider corresponding to an HttpAuthScheme. */ identityProvider(config: IdentityProviderConfig): IdentityProvider | undefined; /** * HttpSigner corresponding to an HttpAuthScheme. */ signer: HttpSigner; } /** * Interface that defines the identity and signing properties when selecting * an HttpAuthScheme. * @internal */ export interface HttpAuthOption { schemeId: HttpAuthSchemeId; identityProperties?: Record; signingProperties?: Record; propertiesExtractor?: ( config: TConfig, context: TContext ) => { identityProperties?: Record; signingProperties?: Record; }; } /** * @internal */ export interface SelectedHttpAuthScheme { httpAuthOption: HttpAuthOption; identity: Identity; signer: HttpSigner; } ================================================ FILE: packages/types/src/auth/HttpAuthSchemeProvider.ts ================================================ import type { HandlerExecutionContext } from "../middleware"; import type { HttpAuthOption } from "./HttpAuthScheme"; /** * @internal */ export interface HttpAuthSchemeParameters { operation?: string; } /** * @internal */ export interface HttpAuthSchemeProvider { (authParameters: TParameters): HttpAuthOption[]; } /** * @internal */ export interface HttpAuthSchemeParametersProvider< TConfig extends object, TContext extends HandlerExecutionContext, TParameters extends HttpAuthSchemeParameters, TInput extends object, > { (config: TConfig, context: TContext, input: TInput): Promise; } ================================================ FILE: packages/types/src/auth/HttpSigner.ts ================================================ import type { HttpRequest, HttpResponse } from "../http"; import type { Identity } from "../identity/identity"; /** * @internal */ export interface ErrorHandler { (signingProperties: Record): (error: E) => never; } /** * @internal */ export interface SuccessHandler { (httpResponse: HttpResponse | unknown, signingProperties: Record): void; } /** * Interface to sign identity and signing properties. * @internal */ export interface HttpSigner { /** * Signs an HttpRequest with an identity and signing properties. * @param httpRequest request to sign * @param identity identity to sing the request with * @param signingProperties property bag for signing * @returns signed request in a promise */ sign(httpRequest: HttpRequest, identity: Identity, signingProperties: Record): Promise; /** * Handler that executes after the {@link HttpSigner.sign} invocation and corresponding * middleware throws an error. * The error handler is expected to throw the error it receives, so the return type of the error handler is `never`. * @internal */ errorHandler?: ErrorHandler; /** * Handler that executes after the {@link HttpSigner.sign} invocation and corresponding * middleware succeeds. * @internal */ successHandler?: SuccessHandler; } ================================================ FILE: packages/types/src/auth/IdentityProviderConfig.ts ================================================ import type { Identity, IdentityProvider } from "../identity/identity"; import type { HttpAuthSchemeId } from "./HttpAuthScheme"; /** * Interface to get an IdentityProvider for a specified HttpAuthScheme * @internal */ export interface IdentityProviderConfig { /** * Get the IdentityProvider for a specified HttpAuthScheme. * @param schemeId schemeId of the HttpAuthScheme * @returns IdentityProvider or undefined if HttpAuthScheme is not found */ getIdentityProvider(schemeId: HttpAuthSchemeId): IdentityProvider | undefined; } ================================================ FILE: packages/types/src/auth/auth.ts ================================================ /** * Authentication schemes represent a way that the service will authenticate the customer’s identity. * * @internal */ export interface AuthScheme { /** * @example "sigv4a" or "sigv4" */ name: "sigv4" | "sigv4a" | string; /** * @example "s3" */ signingName: string; /** * @example "us-east-1" */ signingRegion: string; /** * @example ["*"] * @example ["us-west-2", "us-east-1"] */ signingRegionSet?: string[]; /** * @deprecated this field was renamed to signingRegion. */ signingScope?: never; properties: Record; } /** * @deprecated * * @internal */ export interface HttpAuthDefinition { /** * Defines the location of where the Auth is serialized. */ in: HttpAuthLocation; /** * Defines the name of the HTTP header or query string parameter * that contains the Auth. */ name: string; /** * Defines the security scheme to use on the `Authorization` header value. * This can only be set if the "in" property is set to {@link HttpAuthLocation.HEADER}. */ scheme?: string; } /** * @deprecated * * @internal */ export enum HttpAuthLocation { HEADER = "header", QUERY = "query", } ================================================ FILE: packages/types/src/auth/index.ts ================================================ export * from "./auth"; export * from "./HttpApiKeyAuth"; export * from "./HttpAuthScheme"; export * from "./HttpAuthSchemeProvider"; export * from "./HttpSigner"; export * from "./IdentityProviderConfig"; ================================================ FILE: packages/types/src/blob/blob-payload-input-types.ts ================================================ import type { Readable } from "node:stream"; import type { BlobOptionalType, ReadableStreamOptionalType } from "../externals-check/browser-externals-check"; /** * A union of types that can be used as inputs for the service model * "blob" type when it represents the request's entire payload or body. * For example, in Lambda::invoke, the payload is modeled as a blob type * and this union applies to it. * In contrast, in Lambda::createFunction the Zip file option is a blob type, * but is not the (entire) payload and this union does not apply. * Note: not all types are signable by the standard SignatureV4 signer when * used as the request body. For example, in Node.js a Readable stream * is not signable by the default signer. * They are included in the union because it may work in some cases, * but the expected types are primarily string and Uint8Array. * Additional details may be found in the internal * function "getPayloadHash" in the SignatureV4 module. * * @public */ export type BlobPayloadInputTypes = | string | ArrayBuffer | ArrayBufferView | Uint8Array | NodeJsRuntimeBlobTypes | BrowserRuntimeBlobTypes; /** * Additional blob types for the Node.js environment. * * @public */ export type NodeJsRuntimeBlobTypes = Readable | Buffer; /** * Additional blob types for the browser environment. * * @public */ export type BrowserRuntimeBlobTypes = BlobOptionalType | ReadableStreamOptionalType; /** * @internal * @deprecated renamed to BlobPayloadInputTypes. */ export type BlobTypes = BlobPayloadInputTypes; ================================================ FILE: packages/types/src/checksum.ts ================================================ import type { SourceData } from "./crypto"; /** * An object that provides a checksum of data provided in chunks to `update`. * The checksum may be performed incrementally as chunks are received or all * at once when the checksum is finalized, depending on the underlying * implementation. * It's recommended to compute checksum incrementally to avoid reading the * entire payload in memory. * A class that implements this interface may accept an optional secret key in its * constructor while computing checksum value, when using HMAC. If provided, * this secret key would be used when computing checksum. * * @public */ export interface Checksum { /** * Constant length of the digest created by the algorithm in bytes. */ digestLength?: number; /** * Creates a new checksum object that contains a deep copy of the internal * state of the current `Checksum` object. */ copy?(): Checksum; /** * Returns the digest of all of the data passed. */ digest(): Promise; /** * Allows marking a checksum for checksums that support the ability * to mark and reset. * * @param readLimit - The maximum limit of bytes that can be read * before the mark position becomes invalid. */ mark?(readLimit: number): void; /** * Resets the checksum to its initial value. */ reset(): void; /** * Adds a chunk of data for which checksum needs to be computed. * This can be called many times with new data as it is streamed. * * Implementations may override this method which passes second param * which makes Checksum object stateless. * * @param chunk - The buffer to update checksum with. */ update(chunk: Uint8Array): void; } /** * A constructor for a Checksum that may be used to calculate an HMAC. Implementing * classes should not directly hold the provided key in memory beyond the * lexical scope of the constructor. * * @public */ export interface ChecksumConstructor { new (secret?: SourceData): Checksum; } ================================================ FILE: packages/types/src/client.ts ================================================ import type { Command } from "./command"; import type { MiddlewareStack } from "./middleware"; import type { MetadataBearer } from "./response"; import type { OptionalParameter } from "./util"; /** * A type which checks if the client configuration is optional. * If all entries of the client configuration are optional, it allows client creation without passing any config. * * @public */ export type CheckOptionalClientConfig = OptionalParameter; /** * function definition for different overrides of client's 'send' function. * * @public */ export interface InvokeFunction< InputTypes extends object, OutputTypes extends MetadataBearer, ResolvedClientConfiguration, > { ( command: Command, options?: any ): Promise; ( command: Command, cb: (err: any, data?: OutputType) => void ): void; ( command: Command, options: any, cb: (err: any, data?: OutputType) => void ): void; ( command: Command, options?: any, cb?: (err: any, data?: OutputType) => void ): Promise | void; } /** * Signature that appears on aggregated clients' methods. * * @public */ export interface InvokeMethod { (input: InputType, options?: any): Promise; (input: InputType, cb: (err: any, data?: OutputType) => void): void; (input: InputType, options: any, cb: (err: any, data?: OutputType) => void): void; (input: InputType, options?: any, cb?: (err: any, data?: OutputType) => void): Promise | void; } /** * Signature that appears on aggregated clients' methods when argument is optional. * * @public */ export interface InvokeMethodOptionalArgs { (): Promise; (input: InputType, options?: any): Promise; (input: InputType, cb: (err: any, data?: OutputType) => void): void; (input: InputType, options: any, cb: (err: any, data?: OutputType) => void): void; (input: InputType, options?: any, cb?: (err: any, data?: OutputType) => void): Promise | void; } /** * A general interface for service clients, idempotent to browser or node clients * This type corresponds to SmithyClient(https://github.com/aws/aws-sdk-js-v3/blob/main/packages/smithy-client/src/client.ts). * It's provided for using without importing the SmithyClient class. * @internal */ export interface Client { readonly config: ResolvedClientConfiguration; middlewareStack: MiddlewareStack; send: InvokeFunction; destroy: () => void; } ================================================ FILE: packages/types/src/command.ts ================================================ import type { Handler, MiddlewareStack } from "./middleware"; import type { MetadataBearer } from "./response"; /** * @public */ export interface Command< ClientInput extends object, InputType extends ClientInput, ClientOutput extends MetadataBearer, OutputType extends ClientOutput, ResolvedConfiguration, > extends CommandIO { readonly input: InputType; readonly middlewareStack: MiddlewareStack; /** * This should be OperationSchema from @smithy/types, but would * create problems with the client transform type adaptors. */ readonly schema?: any; resolveMiddleware( stack: MiddlewareStack, configuration: ResolvedConfiguration, options: any ): Handler; } /** * This is a subset of the Command type used only to detect the i/o types. * * @internal */ export interface CommandIO { readonly input: InputType; resolveMiddleware(stack: any, configuration: any, options: any): Handler; } /** * @internal */ export type GetOutputType = Command extends CommandIO ? O : never; ================================================ FILE: packages/types/src/connection/config.ts ================================================ /** * @public */ export interface ConnectConfiguration { /** * The maximum time in milliseconds that the connection phase of a request * may take before the connection attempt is abandoned. */ requestTimeout?: number; /** * Signal from the Command class object context, * tells the connection manager to use a new connection. */ isEventStream?: boolean; } ================================================ FILE: packages/types/src/connection/index.ts ================================================ export * from "./config"; export * from "./manager"; export * from "./pool"; ================================================ FILE: packages/types/src/connection/manager.ts ================================================ import type { RequestContext } from "../transfer"; import type { ConnectConfiguration } from "./config"; /** * @public */ export interface ConnectionManagerConfiguration { /** * Maximum number of allowed concurrent requests per connection. */ maxConcurrency?: number; /** * Disables concurrent requests per connection. */ disableConcurrency?: boolean; } /** * @public */ export interface ConnectionManager { /** * Retrieves a connection from the connection pool if available, * otherwise establish a new connection */ lease(requestContext: RequestContext, connectionConfiguration: ConnectConfiguration): T; /** * Releases the connection back to the pool making it potentially * re-usable by other requests. */ release(requestContext: RequestContext, connection: T): void; /** * Destroys the connection manager. All connections will be closed. */ destroy(): void; } ================================================ FILE: packages/types/src/connection/pool.ts ================================================ /** * @public */ export interface ConnectionPool { /** * Retrieve the first connection in the pool */ poll(): T | void; /** * Release the connection back to the pool making it potentially * re-usable by other requests. */ offerLast(connection: T): void; /** * Removes the connection from the pool, and destroys it. */ destroy(connection: T): void; /** * Implements the iterable protocol and allows arrays to be consumed * by most syntaxes expecting iterables, such as the spread syntax * and for...of loops */ [Symbol.iterator](): Iterator; } /** * Unused. * @internal * @deprecated */ export interface CacheKey { destination: string; } ================================================ FILE: packages/types/src/crypto.ts ================================================ /** * @public */ export type SourceData = string | ArrayBuffer | ArrayBufferView; /** * An object that provides a hash of data provided in chunks to `update`. The * hash may be performed incrementally as chunks are received or all at once * when the hash is finalized, depending on the underlying implementation. * * @public * @deprecated use {@link Checksum} */ export interface Hash { /** * Adds a chunk of data to the hash. If a buffer is provided, the `encoding` * argument will be ignored. If a string is provided without a specified * encoding, implementations must assume UTF-8 encoding. * * Not all encodings are supported on all platforms, though all must support * UTF-8. */ update(toHash: SourceData, encoding?: "utf8" | "ascii" | "latin1"): void; /** * Finalizes the hash and provides a promise that will be fulfilled with the * raw bytes of the calculated hash. */ digest(): Promise; } /** * A constructor for a hash that may be used to calculate an HMAC. Implementing * classes should not directly hold the provided key in memory beyond the * lexical scope of the constructor. * * @public * @deprecated use {@link ChecksumConstructor} */ export interface HashConstructor { new (secret?: SourceData): Hash; } /** * A function that calculates the hash of a data stream. Determining the hash * will consume the stream, so only replayable streams should be provided to an * implementation of this interface. * * @public */ export interface StreamHasher { (hashCtor: HashConstructor, stream: StreamType): Promise; } /** * A function that returns a promise fulfilled with bytes from a * cryptographically secure pseudorandom number generator. * * @public */ export interface randomValues { (byteLength: number): Promise; } ================================================ FILE: packages/types/src/downlevel-ts3.4/transform/type-transform.ts ================================================ /** * Transforms any members of the object T having type FromType * to ToType. This applies only to exact type matches. * This is for the case where FromType is a union and only those fields * matching the same union should be transformed. * * @public */ export type Transform = RecursiveTransformExact; /** * Returns ToType if T matches exactly with FromType. * * @internal */ type TransformExact = [T] extends [FromType] ? ([FromType] extends [T] ? ToType : T) : T; /** * Applies TransformExact to members of an object recursively. * * @internal */ type RecursiveTransformExact = T extends Function ? T : T extends object ? { [key in keyof T]: [T[key]] extends [FromType] ? [FromType] extends [T[key]] ? ToType : RecursiveTransformExact : RecursiveTransformExact; } : TransformExact; ================================================ FILE: packages/types/src/encode.ts ================================================ import type { Message } from "./eventStream"; /** * @public */ export interface MessageEncoder { encode(message: Message): Uint8Array; } /** * @public */ export interface MessageDecoder { decode(message: ArrayBufferView): Message; feed(message: ArrayBufferView): void; endOfStream(): void; getMessage(): AvailableMessage; getAvailableMessages(): AvailableMessages; } /** * @public */ export interface AvailableMessage { getMessage(): Message | undefined; isEndOfStream(): boolean; } /** * @public */ export interface AvailableMessages { getMessages(): Message[]; isEndOfStream(): boolean; } ================================================ FILE: packages/types/src/endpoint.ts ================================================ import type { AuthScheme } from "./auth/auth"; /** * @public */ export interface EndpointPartition { name: string; dnsSuffix: string; dualStackDnsSuffix: string; supportsFIPS: boolean; supportsDualStack: boolean; } /** * @public */ export interface EndpointARN { partition: string; service: string; region: string; accountId: string; resourceId: Array; } /** * @public */ export enum EndpointURLScheme { HTTP = "http", HTTPS = "https", } /** * @public */ export interface EndpointURL { /** * The URL scheme such as http or https. */ scheme: EndpointURLScheme; /** * The authority is the host and optional port component of the URL. */ authority: string; /** * The parsed path segment of the URL. * This value is as-is as provided by the user. */ path: string; /** * The parsed path segment of the URL. * This value is guranteed to start and end with a "/". */ normalizedPath: string; /** * A boolean indicating whether the authority is an IP address. */ isIp: boolean; } /** * @public */ export type EndpointObjectProperty = | string | boolean | { [key: string]: EndpointObjectProperty } | EndpointObjectProperty[]; /** * @public */ export interface EndpointV2 { url: URL; properties?: { authSchemes?: AuthScheme[]; } & Record; headers?: Record; } /** * @public */ export type EndpointParameters = { [name: string]: undefined | boolean | string | string[] }; ================================================ FILE: packages/types/src/endpoints/EndpointRuleObject.ts ================================================ import type { EndpointObjectProperty } from "../endpoint"; import type { ConditionObject, Expression } from "./shared"; /** * @public */ export type EndpointObjectProperties = Record; /** * @public */ export type EndpointObjectHeaders = Record; /** * @public */ export type EndpointObject = { url: Expression; properties?: EndpointObjectProperties; headers?: EndpointObjectHeaders; }; /** * @public */ export type EndpointRuleObject = { type: "endpoint"; conditions?: ConditionObject[]; endpoint: EndpointObject; documentation?: string; }; ================================================ FILE: packages/types/src/endpoints/ErrorRuleObject.ts ================================================ import type { ConditionObject, Expression } from "./shared"; /** * @public */ export type ErrorRuleObject = { type: "error"; conditions?: ConditionObject[]; error: Expression; documentation?: string; }; ================================================ FILE: packages/types/src/endpoints/RuleSetObject.ts ================================================ import type { RuleSetRules } from "./TreeRuleObject"; /** * @public */ export type DeprecatedObject = { message?: string; since?: string; }; /** * @public */ export type ParameterObject = { type: "String" | "string" | "Boolean" | "boolean"; default?: string | boolean; required?: boolean; documentation?: string; builtIn?: string; deprecated?: DeprecatedObject; }; /** * @public */ export type RuleSetObject = { version: string; serviceId?: string; parameters: Record; rules: RuleSetRules; }; ================================================ FILE: packages/types/src/endpoints/TreeRuleObject.ts ================================================ import type { EndpointRuleObject } from "./EndpointRuleObject"; import type { ErrorRuleObject } from "./ErrorRuleObject"; import type { ConditionObject } from "./shared"; /** * @public */ export type RuleSetRules = Array; /** * @public */ export type TreeRuleObject = { type: "tree"; conditions?: ConditionObject[]; rules: RuleSetRules; documentation?: string; }; ================================================ FILE: packages/types/src/endpoints/index.ts ================================================ export * from "./EndpointRuleObject"; export * from "./ErrorRuleObject"; export * from "./RuleSetObject"; export * from "./shared"; export * from "./TreeRuleObject"; ================================================ FILE: packages/types/src/endpoints/shared.ts ================================================ import type { Logger } from "../logger"; /** * @public */ export type ReferenceObject = { ref: string }; /** * @public */ export type FunctionObject = { fn: string; argv: FunctionArgv }; /** * @public */ export type FunctionArgv = Array; /** * @public */ export type FunctionReturn = string | boolean | number | { [key: string]: FunctionReturn }; /** * @public */ export type ConditionObject = FunctionObject & { assign?: string }; /** * @public */ export type Expression = string | ReferenceObject | FunctionObject; /** * @public */ export type EndpointParams = Record; /** * @public */ export type EndpointResolverOptions = { endpointParams: EndpointParams; logger?: Logger; }; /** * @public */ export type ReferenceRecord = Record; /** * @public */ export type EvaluateOptions = EndpointResolverOptions & { referenceRecord: ReferenceRecord; }; ================================================ FILE: packages/types/src/eventStream.ts ================================================ import type { HttpRequest } from "./http"; import type { FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput, HandlerExecutionContext, } from "./middleware"; import type { MetadataBearer } from "./response"; /** * An event stream message. The headers and body properties will always be * defined, with empty headers represented as an object with no keys and an * empty body represented as a zero-length Uint8Array. * * @public */ export interface Message { headers: MessageHeaders; body: Uint8Array; } /** * @public */ export type MessageHeaders = Record; /** * @public */ export type HeaderValue = { type: K; value: V }; /** * @public */ export type BooleanHeaderValue = HeaderValue<"boolean", boolean>; /** * @public */ export type ByteHeaderValue = HeaderValue<"byte", number>; /** * @public */ export type ShortHeaderValue = HeaderValue<"short", number>; /** * @public */ export type IntegerHeaderValue = HeaderValue<"integer", number>; /** * @public */ export type LongHeaderValue = HeaderValue<"long", Int64>; /** * @public */ export type BinaryHeaderValue = HeaderValue<"binary", Uint8Array>; /** * @public */ export type StringHeaderValue = HeaderValue<"string", string>; /** * @public */ export type TimestampHeaderValue = HeaderValue<"timestamp", Date>; /** * @public */ export type UuidHeaderValue = HeaderValue<"uuid", string>; /** * @public */ export type MessageHeaderValue = | BooleanHeaderValue | ByteHeaderValue | ShortHeaderValue | IntegerHeaderValue | LongHeaderValue | BinaryHeaderValue | StringHeaderValue | TimestampHeaderValue | UuidHeaderValue; /** * @public */ export interface Int64 { readonly bytes: Uint8Array; valueOf: () => number; toString: () => string; } /** * Util functions for serializing or deserializing event stream * * @public */ export interface EventStreamSerdeContext { eventStreamMarshaller: EventStreamMarshaller; } /** * A function which deserializes binary event stream message into modeled shape. * * @public */ export interface EventStreamMarshallerDeserFn { (body: StreamType, deserializer: (input: Record) => Promise): AsyncIterable; } /** * A function that serializes modeled shape into binary stream message. * * @public */ export interface EventStreamMarshallerSerFn { (input: AsyncIterable, serializer: (event: T) => Message): StreamType; } /** * An interface which provides functions for serializing and deserializing binary event stream * to/from corresponsing modeled shape. * * @public */ export interface EventStreamMarshaller { deserialize: EventStreamMarshallerDeserFn; serialize: EventStreamMarshallerSerFn; } /** * @public */ export interface EventStreamRequestSigner { sign(request: HttpRequest): Promise; } /** * @public */ export interface EventStreamPayloadHandler { handle: ( next: FinalizeHandler, args: FinalizeHandlerArguments, context?: HandlerExecutionContext ) => Promise>; } /** * @public */ export interface EventStreamPayloadHandlerProvider { (options: any): EventStreamPayloadHandler; } /** * @public */ export interface EventStreamSerdeProvider { (options: any): EventStreamMarshaller; } /** * @public */ export interface EventStreamSignerProvider { (options: any): EventStreamRequestSigner; } ================================================ FILE: packages/types/src/extensions/checksum.ts ================================================ import type { ChecksumConstructor } from "../checksum"; import type { HashConstructor } from "../crypto"; /** * @internal */ export enum AlgorithmId { MD5 = "md5", CRC32 = "crc32", CRC32C = "crc32c", SHA1 = "sha1", SHA256 = "sha256", } /** * @internal */ export interface ChecksumAlgorithm { algorithmId(): AlgorithmId | string; checksumConstructor(): ChecksumConstructor | HashConstructor; } /** * @deprecated unused. * @internal */ type ChecksumConfigurationLegacy = { /** * @deprecated unused. */ [other in string | number]: any; }; /** * @internal */ export interface ChecksumConfiguration extends ChecksumConfigurationLegacy { addChecksumAlgorithm(algo: ChecksumAlgorithm): void; checksumAlgorithms(): ChecksumAlgorithm[]; } /** * @deprecated will be removed for implicit type. * @internal */ type GetChecksumConfigurationType = ( runtimeConfig: Partial<{ sha256: ChecksumConstructor | HashConstructor; md5: ChecksumConstructor | HashConstructor; }> ) => ChecksumConfiguration; /** * @internal * @deprecated will be moved to smithy-client. */ export const getChecksumConfiguration: GetChecksumConfigurationType = ( runtimeConfig: Partial<{ sha256: ChecksumConstructor | HashConstructor; md5: ChecksumConstructor | HashConstructor; }> ) => { const checksumAlgorithms: ChecksumAlgorithm[] = []; if (runtimeConfig.sha256 !== undefined) { checksumAlgorithms.push({ algorithmId: () => AlgorithmId.SHA256, checksumConstructor: () => runtimeConfig.sha256!, }); } if (runtimeConfig.md5 != undefined) { checksumAlgorithms.push({ algorithmId: () => AlgorithmId.MD5, checksumConstructor: () => runtimeConfig.md5!, }); } return { addChecksumAlgorithm(algo: ChecksumAlgorithm): void { checksumAlgorithms.push(algo); }, checksumAlgorithms(): ChecksumAlgorithm[] { return checksumAlgorithms; }, }; }; /** * @internal * @deprecated will be removed for implicit type. */ type ResolveChecksumRuntimeConfigType = (clientConfig: ChecksumConfiguration) => any; /** * @internal * * @deprecated will be moved to smithy-client. */ export const resolveChecksumRuntimeConfig: ResolveChecksumRuntimeConfigType = (clientConfig: ChecksumConfiguration) => { const runtimeConfig: any = {}; clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => { runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor(); }); return runtimeConfig; }; ================================================ FILE: packages/types/src/extensions/defaultClientConfiguration.ts ================================================ import { getChecksumConfiguration, resolveChecksumRuntimeConfig, type ChecksumConfiguration } from "./checksum"; /** * Default client configuration consisting various configurations for modifying a service client * * @internal * @deprecated will be replaced by DefaultExtensionConfiguration. */ export interface DefaultClientConfiguration extends ChecksumConfiguration {} /** * @deprecated will be removed for implicit type. */ type GetDefaultConfigurationType = (runtimeConfig: any) => DefaultClientConfiguration; /** * Helper function to resolve default client configuration from runtime config * * @internal * @deprecated moving to @smithy/smithy-client. */ export const getDefaultClientConfiguration: GetDefaultConfigurationType = (runtimeConfig: any) => { return getChecksumConfiguration(runtimeConfig); }; /** * @deprecated will be removed for implicit type. */ type ResolveDefaultRuntimeConfigType = (clientConfig: DefaultClientConfiguration) => any; /** * Helper function to resolve runtime config from default client configuration * * @internal * @deprecated moving to @smithy/smithy-client. */ export const resolveDefaultRuntimeConfig: ResolveDefaultRuntimeConfigType = (config: DefaultClientConfiguration) => { return resolveChecksumRuntimeConfig(config); }; ================================================ FILE: packages/types/src/extensions/defaultExtensionConfiguration.ts ================================================ import type { ChecksumConfiguration } from "./checksum"; import type { RetryStrategyConfiguration } from "./retry"; /** * Default extension configuration consisting various configurations for modifying a service client * * @internal */ export interface DefaultExtensionConfiguration extends ChecksumConfiguration, RetryStrategyConfiguration {} ================================================ FILE: packages/types/src/extensions/index.ts ================================================ export * from "./defaultClientConfiguration"; export * from "./defaultExtensionConfiguration"; export { AlgorithmId, ChecksumAlgorithm, ChecksumConfiguration } from "./checksum"; export { RetryStrategyConfiguration } from "./retry"; ================================================ FILE: packages/types/src/extensions/retry.ts ================================================ import type { RetryStrategyV2 } from "../retry"; import type { Provider, RetryStrategy } from "../util"; /** * A configuration interface with methods called by runtime extension * @internal */ export interface RetryStrategyConfiguration { /** * Set retry strategy used for all http requests * @param retryStrategy */ setRetryStrategy(retryStrategy: Provider): void; /** * Get retry strategy used for all http requests * @param retryStrategy */ retryStrategy(): Provider; } ================================================ FILE: packages/types/src/externals-check/browser-externals-check.ts ================================================ import type { Exact } from "../transform/exact"; /** * A checked type that resolves to Blob if it is defined as more than a stub, otherwise * resolves to 'never' so as not to widen the type of unions containing Blob * excessively. * * @public */ export type BlobOptionalType = BlobDefined extends true ? Blob : Unavailable; /** * A checked type that resolves to ReadableStream if it is defined as more than a stub, otherwise * resolves to 'never' so as not to widen the type of unions containing ReadableStream * excessively. * * @public */ export type ReadableStreamOptionalType = ReadableStreamDefined extends true ? ReadableStream : Unavailable; /** * Indicates a type is unavailable if it resolves to this. * * @public */ export type Unavailable = never; /** * Whether the global types define more than a stub for ReadableStream. * * @internal */ export type ReadableStreamDefined = Exact extends true ? false : true; /** * Whether the global types define more than a stub for Blob. * * @internal */ export type BlobDefined = Exact extends true ? false : true; ================================================ FILE: packages/types/src/feature-ids.ts ================================================ /** * @internal */ export type SmithyFeatures = Partial<{ RESOURCE_MODEL: "A"; WAITER: "B"; PAGINATOR: "C"; RETRY_MODE_LEGACY: "D"; RETRY_MODE_STANDARD: "E"; RETRY_MODE_ADAPTIVE: "F"; GZIP_REQUEST_COMPRESSION: "L"; PROTOCOL_RPC_V2_CBOR: "M"; ENDPOINT_OVERRIDE: "N"; SIGV4A_SIGNING: "S"; CREDENTIALS_CODE: "e"; }>; ================================================ FILE: packages/types/src/http/httpHandlerInitialization.ts ================================================ import type { Agent as hAgent, AgentOptions as hAgentOptions } from "node:http"; import type { Agent as hsAgent, AgentOptions as hsAgentOptions } from "node:https"; import type { HttpRequest as IHttpRequest } from "../http"; import type { Logger } from "../logger"; /** * * This type represents an alternate client constructor option for the entry * "requestHandler". Instead of providing an instance of a requestHandler, the user * may provide the requestHandler's constructor options for either the * NodeHttpHandler or FetchHttpHandler. * * For other RequestHandlers like HTTP2 or WebSocket, * constructor parameter passthrough is not currently available. * * @public */ export type RequestHandlerParams = NodeHttpHandlerOptions | FetchHttpHandlerOptions; /** * Represents the http options that can be passed to a node http client. * @public */ export interface NodeHttpHandlerOptions { /** * The maximum time in milliseconds that the connection phase of a request * may take before the connection attempt is abandoned. * Defaults to 0, which disables the timeout. */ connectionTimeout?: number; /** * The maximum number of milliseconds request & response should take. * Defaults to 0, which disables the timeout. * * If exceeded, a warning will be emitted unless throwOnRequestTimeout=true, * in which case a TimeoutError will be thrown. */ requestTimeout?: number; /** * Because requestTimeout was for a long time incorrectly being set as a socket idle timeout, * users must also opt-in for request timeout thrown errors. * Without this setting, a breach of the request timeout will be logged as a warning. */ throwOnRequestTimeout?: boolean; /** * The maximum time in milliseconds that a socket may remain idle before it * is closed. Defaults to 0, which means no maximum. * * This does not affect the server, which may still close the connection due to an idle socket. */ socketTimeout?: number; /** * Delay before the NodeHttpHandler checks for socket exhaustion, * and emits a warning if the active sockets and enqueued request count is greater than * 2x the maxSockets count. * * Defaults to connectionTimeout + requestTimeout or 3000ms if those are not set. */ socketAcquisitionWarningTimeout?: number; /** * You can pass http.Agent or its constructor options. */ httpAgent?: hAgent | hAgentOptions; /** * You can pass https.Agent or its constructor options. */ httpsAgent?: hsAgent | hsAgentOptions; /** * Optional logger. */ logger?: Logger; } /** * Represents the http options that can be passed to a browser http client. * @public */ export interface FetchHttpHandlerOptions { /** * The number of milliseconds a request can take before being automatically * terminated. */ requestTimeout?: number; /** * Whether to allow the request to outlive the page. Default value is false. * * There may be limitations to the payload size, number of concurrent requests, * request duration etc. when using keepalive in browsers. * * These may change over time, so look for up to date information about * these limitations before enabling keepalive. */ keepAlive?: boolean; /** * A string indicating whether credentials will be sent with the request always, never, or * only when sent to a same-origin URL. * @see https://developer.mozilla.org/en-US/docs/Web/API/Request/credentials */ credentials?: "include" | "omit" | "same-origin" | undefined | string; /** * Cache settings for fetch. * @see https://developer.mozilla.org/en-US/docs/Web/API/Request/cache */ cache?: "default" | "force-cache" | "no-cache" | "no-store" | "only-if-cached" | "reload"; /** * An optional function that produces additional RequestInit * parameters for each httpRequest. * * This is applied last via merging with Object.assign() and overwrites other values * set from other sources. * * @example * ```js * new Client({ * requestHandler: { * requestInit(httpRequest) { * return { cache: "no-store" }; * } * } * }); * ``` */ requestInit?: (httpRequest: IHttpRequest) => RequestInit; } declare global { /** * interface merging stub. */ interface RequestInit {} } ================================================ FILE: packages/types/src/http.ts ================================================ import type { AbortSignal as DeprecatedAbortSignal } from "./abort"; import type { URI } from "./uri"; /** * @public * * @deprecated use {@link EndpointV2} from `@smithy/types`. */ export interface Endpoint { protocol: string; hostname: string; port?: number; path: string; query?: QueryParameterBag; headers?: HeaderBag; } /** * Interface an HTTP request class. Contains * addressing information in addition to standard message properties. * * @public */ export interface HttpRequest extends HttpMessage, URI { method: string; } /** * Represents an HTTP message as received in reply to a request. Contains a * numeric status code in addition to standard message properties. * * @public */ export interface HttpResponse extends HttpMessage { statusCode: number; reason?: string; } /** * Represents an HTTP message with headers and an optional static or streaming * body. body: ArrayBuffer | ArrayBufferView | string | Uint8Array | Readable | ReadableStream; * * @public */ export interface HttpMessage { headers: HeaderBag; body?: any; } /** * A mapping of query parameter names to strings or arrays of strings, with the * second being used when a parameter contains a list of values. Value can be set * to null when query is not in key-value pairs shape * * @public */ export type QueryParameterBag = Record | null>; /** * @public */ export type FieldOptions = { name: string; kind?: FieldPosition; values?: string[]; }; /** * @public */ export enum FieldPosition { HEADER, TRAILER, } /** * A mapping of header names to string values. Multiple values for the same * header should be represented as a single string with values separated by * `, `. * Keys should be considered case insensitive, even if this is not enforced by a * particular implementation. For example, given the following HeaderBag, where * keys differ only in case: * ```json * { * 'x-request-date': '2000-01-01T00:00:00Z', * 'X-Request-Date': '2001-01-01T00:00:00Z' * } * ``` * The SDK may at any point during processing remove one of the object * properties in favor of the other. The headers may or may not be combined, and * the SDK will not deterministically select which header candidate to use. * * @public */ export type HeaderBag = Record; /** * Represents an HTTP message with headers and an optional static or streaming * body. bode: ArrayBuffer | ArrayBufferView | string | Uint8Array | Readable | ReadableStream; * * @public */ export interface HttpMessage { headers: HeaderBag; body?: any; } /** * Represents the options that may be passed to an Http Handler. * * @public */ export interface HttpHandlerOptions { abortSignal?: AbortSignal | DeprecatedAbortSignal; /** * The maximum time in milliseconds that the connection phase of a request * may take before the connection attempt is abandoned. */ requestTimeout?: number; } ================================================ FILE: packages/types/src/identity/apiKeyIdentity.ts ================================================ import type { Identity, IdentityProvider } from "../identity/identity"; /** * @public */ export interface ApiKeyIdentity extends Identity { /** * The literal API Key */ readonly apiKey: string; } /** * @public */ export type ApiKeyIdentityProvider = IdentityProvider; ================================================ FILE: packages/types/src/identity/awsCredentialIdentity.ts ================================================ import type { Identity, IdentityProvider } from "./identity"; /** * @public */ export interface AwsCredentialIdentity extends Identity { /** * AWS access key ID */ readonly accessKeyId: string; /** * AWS secret access key */ readonly secretAccessKey: string; /** * A security or session token to use with these credentials. Usually * present for temporary credentials. */ readonly sessionToken?: string; /** * AWS credential scope for this set of credentials. */ readonly credentialScope?: string; /** * AWS accountId. */ readonly accountId?: string; } /** * @public */ export type AwsCredentialIdentityProvider = IdentityProvider; ================================================ FILE: packages/types/src/identity/identity.ts ================================================ /** * @public */ export interface Identity { /** * A `Date` when the identity or credential will no longer be accepted. */ readonly expiration?: Date; } /** * @public */ export interface IdentityProvider { (identityProperties?: Record): Promise; } ================================================ FILE: packages/types/src/identity/index.ts ================================================ export * from "./apiKeyIdentity"; export * from "./awsCredentialIdentity"; export * from "./identity"; export * from "./tokenIdentity"; ================================================ FILE: packages/types/src/identity/tokenIdentity.ts ================================================ import type { Identity, IdentityProvider } from "../identity/identity"; /** * @internal */ export interface TokenIdentity extends Identity { /** * The literal token string */ readonly token: string; } /** * @internal */ export type TokenIdentityProvider = IdentityProvider; ================================================ FILE: packages/types/src/index.ts ================================================ export * from "./abort"; export * from "./auth"; export * from "./blob/blob-payload-input-types"; export * from "./checksum"; export * from "./client"; export * from "./command"; export * from "./connection"; export * from "./crypto"; export * from "./encode"; export * from "./endpoint"; export * from "./endpoints"; export * from "./eventStream"; export * from "./extensions"; export * from "./feature-ids"; export * from "./http"; export * from "./http/httpHandlerInitialization"; export * from "./identity"; export * from "./logger"; export * from "./middleware"; export * from "./pagination"; export * from "./profile"; export * from "./response"; export * from "./retry"; export * from "./schema/schema"; export * from "./schema/traits"; export * from "./schema/schema-deprecated"; export * from "./schema/sentinels"; export * from "./schema/static-schemas"; export * from "./serde"; export * from "./shapes"; export * from "./signature"; export * from "./stream"; export * from "./streaming-payload/streaming-blob-common-types"; export * from "./streaming-payload/streaming-blob-payload-input-types"; export * from "./streaming-payload/streaming-blob-payload-output-types"; export * from "./transfer"; export * from "./transform/client-payload-blob-type-narrow"; export * from "./transform/mutable"; export * from "./transform/no-undefined"; export * from "./transform/type-transform"; export * from "./uri"; export * from "./util"; export * from "./waiter"; ================================================ FILE: packages/types/src/logger.ts ================================================ /** * Represents a logger object that is available in HandlerExecutionContext * throughout the middleware stack. * * @public */ export interface Logger { trace?: (...content: any[]) => void; debug: (...content: any[]) => void; info: (...content: any[]) => void; warn: (...content: any[]) => void; error: (...content: any[]) => void; } ================================================ FILE: packages/types/src/middleware.ts ================================================ import type { SelectedHttpAuthScheme } from "./auth/HttpAuthScheme"; import type { AuthScheme, HttpAuthDefinition } from "./auth/auth"; import type { Command } from "./command"; import type { EndpointV2 } from "./endpoint"; import type { SmithyFeatures } from "./feature-ids"; import type { Logger } from "./logger"; import type { UserAgent } from "./util"; /** * @public */ export interface InitializeHandlerArguments { /** * User input to a command. Reflects the userland representation of the * union of data types the command can effectively handle. */ input: Input; } /** * @public */ export interface InitializeHandlerOutput extends DeserializeHandlerOutput { output: Output; } /** * @public */ export interface SerializeHandlerArguments extends InitializeHandlerArguments { /** * The user input serialized as a request object. The request object is unknown, * so you cannot modify it directly. When work with request, you need to guard its * type to e.g. HttpRequest with 'instanceof' operand * * During the build phase of the execution of a middleware stack, a built * request may or may not be available. */ request?: unknown; } /** * @public */ export interface SerializeHandlerOutput extends InitializeHandlerOutput {} /** * @public */ export interface BuildHandlerArguments extends FinalizeHandlerArguments {} /** * @public */ export interface BuildHandlerOutput extends InitializeHandlerOutput {} /** * @public */ export interface FinalizeHandlerArguments extends SerializeHandlerArguments { /** * The user input serialized as a request. */ request: unknown; } /** * @public */ export interface FinalizeHandlerOutput extends InitializeHandlerOutput {} /** * @public */ export interface DeserializeHandlerArguments extends FinalizeHandlerArguments {} /** * @public */ export interface DeserializeHandlerOutput { /** * The raw response object from runtime is deserialized to structured output object. * The response object is unknown so you cannot modify it directly. When work with * response, you need to guard its type to e.g. HttpResponse with 'instanceof' operand. * * During the deserialize phase of the execution of a middleware stack, a deserialized * response may or may not be available */ response: unknown; output?: Output; } /** * @public */ export interface InitializeHandler { /** * Asynchronously converts an input object into an output object. * * @param args - An object containing a input to the command as well as any * associated or previously generated execution artifacts. */ (args: InitializeHandlerArguments): Promise>; } /** * @public */ export type Handler = InitializeHandler; /** * @public */ export interface SerializeHandler { /** * Asynchronously converts an input object into an output object. * * @param args - An object containing a input to the command as well as any * associated or previously generated execution artifacts. */ (args: SerializeHandlerArguments): Promise>; } /** * @public */ export interface FinalizeHandler { /** * Asynchronously converts an input object into an output object. * * @param args - An object containing a input to the command as well as any * associated or previously generated execution artifacts. */ (args: FinalizeHandlerArguments): Promise>; } /** * @public */ export interface BuildHandler { (args: BuildHandlerArguments): Promise>; } /** * @public */ export interface DeserializeHandler { (args: DeserializeHandlerArguments): Promise>; } /** * A factory function that creates functions implementing the `Handler` * interface. * * @public */ export interface InitializeMiddleware { /** * @param next - The handler to invoke after this middleware has operated on * the user input and before this middleware operates on the output. * * @param context - Invariant data and functions for use by the handler. */ (next: InitializeHandler, context: HandlerExecutionContext): InitializeHandler; } /** * A factory function that creates functions implementing the `BuildHandler` * interface. * * @public */ export interface SerializeMiddleware { /** * @param next - The handler to invoke after this middleware has operated on * the user input and before this middleware operates on the output. * * @param context - Invariant data and functions for use by the handler. */ (next: SerializeHandler, context: HandlerExecutionContext): SerializeHandler; } /** * A factory function that creates functions implementing the `FinalizeHandler` * interface. * * @public */ export interface FinalizeRequestMiddleware { /** * @param next - The handler to invoke after this middleware has operated on * the user input and before this middleware operates on the output. * * @param context - Invariant data and functions for use by the handler. */ (next: FinalizeHandler, context: HandlerExecutionContext): FinalizeHandler; } /** * @public */ export interface BuildMiddleware { (next: BuildHandler, context: HandlerExecutionContext): BuildHandler; } /** * @public */ export interface DeserializeMiddleware { (next: DeserializeHandler, context: HandlerExecutionContext): DeserializeHandler; } /** * @public */ export type MiddlewareType = | InitializeMiddleware | SerializeMiddleware | BuildMiddleware | FinalizeRequestMiddleware | DeserializeMiddleware; /** * A factory function that creates the terminal handler atop which a middleware * stack sits. * * @public */ export interface Terminalware { (context: HandlerExecutionContext): DeserializeHandler; } /** * @public */ export type Step = "initialize" | "serialize" | "build" | "finalizeRequest" | "deserialize"; /** * @public */ export type Priority = "high" | "normal" | "low"; /** * @public */ export interface HandlerOptions { /** * Handlers are ordered using a "step" that describes the stage of command * execution at which the handler will be executed. The available steps are: * * - initialize: The input is being prepared. Examples of typical * initialization tasks include injecting default options computing * derived parameters. * - serialize: The input is complete and ready to be serialized. Examples * of typical serialization tasks include input validation and building * an HTTP request from user input. * - build: The input has been serialized into an HTTP request, but that * request may require further modification. Any request alterations * will be applied to all retries. Examples of typical build tasks * include injecting HTTP headers that describe a stable aspect of the * request, such as `Content-Length` or a body checksum. * - finalizeRequest: The request is being prepared to be sent over the wire. The * request in this stage should already be semantically complete and * should therefore only be altered as match the recipient's * expectations. Examples of typical finalization tasks include request * signing and injecting hop-by-hop headers. * - deserialize: The response has arrived, the middleware here will deserialize * the raw response object to structured response * * Unlike initialization and build handlers, which are executed once * per operation execution, finalization and deserialize handlers will be * executed foreach HTTP request sent. * * @defaultValue 'initialize' */ step?: Step; /** * A list of strings to any that identify the general purpose or important * characteristics of a given handler. */ tags?: Array; /** * A unique name to refer to a middleware */ name?: string; /** * Aliases allows for middleware to be found by multiple names besides {@link HandlerOptions.name}. * This allows for references to replaced middleware to continue working, e.g. replacing * multiple auth-specific middleware with a single generic auth middleware. * * @internal */ aliases?: Array; /** * A flag to override the existing middleware with the same name. Without * setting it, adding middleware with duplicated name will throw an exception. * @internal */ override?: boolean; } /** * @public */ export interface AbsoluteLocation { /** * By default middleware will be added to individual step in un-guaranteed order. * In the case that * * @defaultValue 'normal' */ priority?: Priority; } /** * @public */ export type Relation = "before" | "after"; /** * @public */ export interface RelativeLocation { /** * Specify the relation to be before or after a know middleware. */ relation: Relation; /** * A known middleware name to indicate inserting middleware's location. */ toMiddleware: string; } /** * @public */ export type RelativeMiddlewareOptions = RelativeLocation & Omit; /** * @public */ export interface InitializeHandlerOptions extends HandlerOptions { step?: "initialize"; } /** * @public */ export interface SerializeHandlerOptions extends HandlerOptions { step: "serialize"; } /** * @public */ export interface BuildHandlerOptions extends HandlerOptions { step: "build"; } /** * @public */ export interface FinalizeRequestHandlerOptions extends HandlerOptions { step: "finalizeRequest"; } /** * @public */ export interface DeserializeHandlerOptions extends HandlerOptions { step: "deserialize"; } /** * A stack storing middleware. It can be resolved into a handler. It supports 2 * approaches for adding middleware: * 1. Adding middleware to specific step with `add()`. The order of middleware * added into same step is determined by order of adding them. If one middleware * needs to be executed at the front of the step or at the end of step, set * `priority` options to `high` or `low`. * 2. Adding middleware to location relative to known middleware with `addRelativeTo()`. * This is useful when given middleware must be executed before or after specific * middleware(`toMiddleware`). You can add a middleware relatively to another * middleware which also added relatively. But eventually, this relative middleware * chain **must** be 'anchored' by a middleware that added using `add()` API * with absolute `step` and `priority`. This mothod will throw if specified * `toMiddleware` is not found. * * @public */ export interface MiddlewareStack extends Pluggable { /** * Add middleware to the stack to be executed during the "initialize" step, * optionally specifying a priority, tags and name */ add(middleware: InitializeMiddleware, options?: InitializeHandlerOptions & AbsoluteLocation): void; /** * Add middleware to the stack to be executed during the "serialize" step, * optionally specifying a priority, tags and name */ add(middleware: SerializeMiddleware, options: SerializeHandlerOptions & AbsoluteLocation): void; /** * Add middleware to the stack to be executed during the "build" step, * optionally specifying a priority, tags and name */ add(middleware: BuildMiddleware, options: BuildHandlerOptions & AbsoluteLocation): void; /** * Add middleware to the stack to be executed during the "finalizeRequest" step, * optionally specifying a priority, tags and name */ add( middleware: FinalizeRequestMiddleware, options: FinalizeRequestHandlerOptions & AbsoluteLocation ): void; /** * Add middleware to the stack to be executed during the "deserialize" step, * optionally specifying a priority, tags and name */ add(middleware: DeserializeMiddleware, options: DeserializeHandlerOptions & AbsoluteLocation): void; /** * Add middleware to a stack position before or after a known middleware,optionally * specifying name and tags. */ addRelativeTo(middleware: MiddlewareType, options: RelativeMiddlewareOptions): void; /** * Apply a customization function to mutate the middleware stack, often * used for customizations that requires mutating multiple middleware. */ use(pluggable: Pluggable): void; /** * Create a shallow clone of this stack. Step bindings and handler priorities * and tags are preserved in the copy. */ clone(): MiddlewareStack; /** * Removes middleware from the stack. * * If a string is provided, it will be treated as middleware name. If a middleware * is inserted with the given name, it will be removed. * * If a middleware class is provided, all usages thereof will be removed. */ remove(toRemove: MiddlewareType | string): boolean; /** * Removes middleware that contains given tag * * Multiple middleware will potentially be removed */ removeByTag(toRemove: string): boolean; /** * Create a stack containing the middlewares in this stack as well as the * middlewares in the `from` stack. Neither source is modified, and step * bindings and handler priorities and tags are preserved in the copy. */ concat( from: MiddlewareStack ): MiddlewareStack; /** * Returns a list of the current order of middleware in the stack. * This does not execute the middleware functions, nor does it * provide a reference to the stack itself. */ identify(): string[]; /** * When an operation is called using this stack, * it will log its list of middleware to the console using * the identify function. * If no argument given, returns the current value. * * @internal * @param toggle - set whether to log on resolve. */ identifyOnResolve(toggle?: boolean): boolean; /** * Builds a single handler function from zero or more middleware classes and * a core handler. The core handler is meant to send command objects to AWS * services and return promises that will resolve with the operation result * or be rejected with an error. * * When a composed handler is invoked, the arguments will pass through all * middleware in a defined order, and the return from the innermost handler * will pass through all middleware in the reverse of that order. */ resolve( handler: DeserializeHandler, context: HandlerExecutionContext ): InitializeHandler; } /** * @internal */ export const SMITHY_CONTEXT_KEY = "__smithy_context"; /** * Data and helper objects that are not expected to change from one execution of * a composed handler to another. * * @public */ export interface HandlerExecutionContext { /** * A logger that may be invoked by any handler during execution of an * operation. */ logger?: Logger; /** * Name of the service the operation is being sent to. */ clientName?: string; /** * Name of the operation being executed. */ commandName?: string; /** * Additional user agent that inferred by middleware. It can be used to save * the internal user agent sections without overriding the `customUserAgent` * config in clients. */ userAgent?: UserAgent; /** * Resolved by the endpointMiddleware function of `@smithy/middleware-endpoint` * in the serialization stage. */ endpointV2?: EndpointV2; /** * Set at the same time as endpointV2. */ authSchemes?: AuthScheme[]; /** * The current auth configuration that has been set by any auth middleware and * that will prevent from being set more than once. */ currentAuthConfig?: HttpAuthDefinition; /** * @deprecated do not extend this field, it is a carryover from AWS SDKs. * Used by DynamoDbDocumentClient. */ dynamoDbDocumentClientOptions?: Partial<{ overrideInputFilterSensitiveLog(...args: any[]): string | void; overrideOutputFilterSensitiveLog(...args: any[]): string | void; }>; /** * Context for Smithy properties. * * @internal */ [SMITHY_CONTEXT_KEY]?: { service?: string; operation?: string; commandInstance?: Command; selectedHttpAuthScheme?: SelectedHttpAuthScheme; features?: SmithyFeatures; /** * @deprecated * Do not assign arbitrary members to the Smithy Context, * fields should be explicitly declared here to avoid collisions. */ [key: string]: unknown; }; /** * Set by some operations which instructs the retry behavior to backoff * after a failed request even when no further retry (of the same request) is expected. * @internal */ __retryLongPoll?: boolean; /** * @deprecated * Do not assign arbitrary members to the context, since * they can interfere with existing functionality. * * Additional members should instead be declared on the SMITHY_CONTEXT_KEY * or other reserved keys. */ [key: string]: any; } /** * @public */ export interface Pluggable { /** * A function that mutate the passed in middleware stack. Functions implementing * this interface can add, remove, modify existing middleware stack from clients * or commands */ applyToStack: (stack: MiddlewareStack) => void; } ================================================ FILE: packages/types/src/pagination.ts ================================================ import type { Client } from "./client"; import type { Command } from "./command"; /** * Expected type definition of a paginator. * * @public */ export type Paginator = AsyncGenerator; /** * Expected paginator configuration passed to an operation. Services will extend * this interface definition and may type client further. * * @public */ export interface PaginationConfiguration { client: Client; pageSize?: number; startingToken?: any; /** * For some APIs, such as CloudWatchLogs events, the next page token will always * be present. * * When true, this config field will have the paginator stop when the token doesn't change * instead of when it is not present. */ stopOnSameToken?: boolean; /** * @param command - reference to the instantiated command. This callback is executed * prior to sending the command with the paginator's client. * @returns the original command or a replacement, defaulting to the original command object. */ withCommand?: (command: Command) => typeof command | undefined; } ================================================ FILE: packages/types/src/profile.ts ================================================ /** * @public */ export enum IniSectionType { PROFILE = "profile", SSO_SESSION = "sso-session", SERVICES = "services", } /** * @public */ export type IniSection = Record; /** * @public * * @deprecated Please use {@link IniSection} */ export interface Profile extends IniSection {} /** * @public */ export type ParsedIniData = Record; /** * @public */ export interface SharedConfigFiles { credentialsFile: ParsedIniData; configFile: ParsedIniData; } ================================================ FILE: packages/types/src/response.ts ================================================ /** * @public */ export interface ResponseMetadata { /** * The status code of the last HTTP response received for this operation. */ httpStatusCode?: number; /** * A unique identifier for the last request sent for this operation. Often * requested by AWS service teams to aid in debugging. */ requestId?: string; /** * A secondary identifier for the last request sent. Used for debugging. */ extendedRequestId?: string; /** * A tertiary identifier for the last request sent. Used for debugging. */ cfId?: string; /** * The number of times this operation was attempted. */ attempts?: number; /** * The total amount of time (in milliseconds) that was spent waiting between * retry attempts. */ totalRetryDelay?: number; } /** * @public */ export interface MetadataBearer { /** * Metadata pertaining to this request. */ $metadata: ResponseMetadata; } ================================================ FILE: packages/types/src/retry.ts ================================================ import type { SdkError } from "./shapes"; /** * @public */ export type RetryErrorType = /** * This is a connection level error such as a socket timeout, socket connect * error, tls negotiation timeout etc... * Typically these should never be applied for non-idempotent request types * since in this scenario, it's impossible to know whether the operation had * a side effect on the server. */ | "TRANSIENT" /** * This is an error where the server explicitly told the client to back off, * such as a 429 or 503 Http error. */ | "THROTTLING" /** * This is a server error that isn't explicitly throttling but is considered * by the client to be something that should be retried. */ | "SERVER_ERROR" /** * Doesn't count against any budgets. This could be something like a 401 * challenge in Http. */ | "CLIENT_ERROR"; /** * @public */ export interface RetryErrorInfo { /** * The error thrown during the initial request, if available. */ error?: SdkError; errorType: RetryErrorType; /** * Protocol hint. This could come from Http's 'retry-after' header or * something from MQTT or any other protocol that has the ability to convey * retry info from a peer. * * The Date after which a retry should be attempted. */ retryAfterHint?: Date; } /** * @public */ export interface RetryBackoffStrategy { /** * @returns the number of milliseconds to wait before retrying an action. */ computeNextBackoffDelay(retryAttempt: number): number; } /** * @public */ export interface StandardRetryBackoffStrategy extends RetryBackoffStrategy { /** * Sets the delayBase used to compute backoff delays. * @param delayBase - */ setDelayBase(delayBase: number): void; } /** * @public */ export interface RetryStrategyOptions { backoffStrategy: RetryBackoffStrategy; maxRetriesBase: number; } /** * @public */ export interface RetryToken { /** * @returns the current count of retry. */ getRetryCount(): number; /** * @returns the number of milliseconds to wait before retrying an action. */ getRetryDelay(): number; /** * @returns whether the operation which generated this token is long polling. */ isLongPoll?(): boolean; } /** * @public */ export interface StandardRetryToken extends RetryToken { /** * @returns the cost of the last retry attempt. */ getRetryCost(): number | undefined; } /** * @public */ export interface RetryStrategyV2 { /** * Called before any retries (for the first call to the operation). It either * returns a retry token or an error upon the failure to acquire a token prior. * * tokenScope is arbitrary and out of scope for this component. However, * adding it here offers us a lot of future flexibility for outage detection. * For example, it could be "us-east-1" on a shared retry strategy, or * "us-west-2-c:dynamodb". */ acquireInitialRetryToken(retryTokenScope: string): Promise; /** * After a failed operation call, this function is invoked to refresh the * retryToken returned by acquireInitialRetryToken(). This function can * either choose to allow another retry and send a new or updated token, * or reject the retry attempt and report the error either in an exception * or returning an error. */ refreshRetryTokenForRetry(tokenToRenew: RetryToken, errorInfo: RetryErrorInfo): Promise; /** * Upon successful completion of the operation, this function is called * to record that the operation was successful. */ recordSuccess(token: RetryToken): void; } /** * @public */ export type ExponentialBackoffJitterType = "DEFAULT" | "NONE" | "FULL" | "DECORRELATED"; /** * @public */ export interface ExponentialBackoffStrategyOptions { jitterType: ExponentialBackoffJitterType; /* Scaling factor to add for the backoff in milliseconds. Default is 25ms */ backoffScaleValue?: number; } ================================================ FILE: packages/types/src/schema/schema-deprecated.ts ================================================ import type { EndpointV2 } from "../endpoint"; import type { HandlerExecutionContext } from "../middleware"; import type { MetadataBearer } from "../response"; import type { EndpointBearer, SerdeFunctions } from "../serde"; import type { ConfigurableSerdeContext, NormalizedSchema, SchemaTraits, SimpleSchema, UnitSchema } from "./schema"; import type { StaticSchema } from "./static-schemas"; /** * A schema is an object or value that describes how to serialize/deserialize data. * @internal * @deprecated use $Schema */ export type Schema = | UnitSchema | TraitsSchema | SimpleSchema | ListSchema | MapSchema | StructureSchema | MemberSchema | OperationSchema | StaticSchema | NormalizedSchema; /** * A schema "reference" is either a schema or a function that * provides a schema. This is useful for lazy loading, and to allow * code generation to define schema out of dependency order. * @internal * @deprecated use $SchemaRef */ export type SchemaRef = Schema | (() => Schema); /** * A schema that has traits. * * @internal * @deprecated use static schema. */ export interface TraitsSchema { namespace: string; name: string; traits: SchemaTraits; } /** * Indicates the schema is a member of a parent Structure schema. * It may also have a set of member traits distinct from its target shape's traits. * @internal * @deprecated use $MemberSchema */ export type MemberSchema = [SchemaRef, SchemaTraits]; /** * Schema for the structure aggregate type. * @internal * @deprecated use static schema. */ export interface StructureSchema extends TraitsSchema { memberNames: string[]; memberList: SchemaRef[]; /** * @deprecated structure member iteration will be linear on the memberNames and memberList arrays. * It can be collected into a hashmap form on an ad-hoc basis, but will not initialize as such. */ members?: Record | undefined; } /** * Schema for the list aggregate type. * @internal * @deprecated use static schema. */ export interface ListSchema extends TraitsSchema { valueSchema: SchemaRef; } /** * Schema for the map aggregate type. * @internal * @deprecated use static schema. */ export interface MapSchema extends TraitsSchema { keySchema: SchemaRef; valueSchema: SchemaRef; } /** * Schema for an operation. * @internal * @deprecated use StaticOperationSchema or $OperationSchema */ export interface OperationSchema { namespace: string; name: string; traits: SchemaTraits; input: SchemaRef; output: SchemaRef; } /** * Turns a serialization into a data object. * @internal * @deprecated use $ShapeDeserializer */ export interface ShapeDeserializer extends ConfigurableSerdeContext { /** * Optionally async. */ read(schema: Schema, data: SerializationType): any | Promise; } /** * Turns a data object into a serialization. * @internal * @deprecated use $ShapeSerializer */ export interface ShapeSerializer extends ConfigurableSerdeContext { write(schema: Schema, value: unknown): void; flush(): SerializationType; } /** * A codec creates serializers and deserializers for some format such as JSON, XML, or CBOR. * * @internal * @deprecated use $Codec */ export interface Codec extends ConfigurableSerdeContext { createSerializer(): ShapeSerializer; createDeserializer(): ShapeDeserializer; } /** * A client protocol defines how to convert a message (e.g. HTTP request/response) to and from a data object. * @internal * @deprecated use $ClientProtocol */ export interface ClientProtocol extends ConfigurableSerdeContext { /** * @returns the Smithy qualified shape id. */ getShapeId(): string; getRequestType(): { new (...args: any[]): Request }; getResponseType(): { new (...args: any[]): Response }; /** * @returns the payload codec if the requests/responses have a symmetric format. * It otherwise may return null. */ getPayloadCodec(): Codec; serializeRequest( operationSchema: OperationSchema, input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise; updateServiceEndpoint(request: Request, endpoint: EndpointV2): Request; deserializeResponse( operationSchema: OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: Response ): Promise; } /** * @public * @deprecated use $ClientProtocolCtor. */ export interface ClientProtocolCtor { new (args: any): ClientProtocol; } ================================================ FILE: packages/types/src/schema/schema.ts ================================================ import type { EndpointV2 } from "../endpoint"; import type { HandlerExecutionContext } from "../middleware"; import type { MetadataBearer } from "../response"; import type { EndpointBearer, SerdeFunctions } from "../serde"; import type { BigDecimalSchema, BigIntegerSchema, BlobSchema, BooleanSchema, DocumentSchema, NumericSchema, StreamingBlobSchema, StringSchema, TimestampDateTimeSchema, TimestampDefaultSchema, TimestampEpochSecondsSchema, TimestampHttpDateSchema, } from "./sentinels"; import type { StaticSchema } from "./static-schemas"; import type { TraitBitVector } from "./traits"; /** * A schema is an object or value that describes how to serialize/deserialize data. * @public */ export type $Schema = UnitSchema | SimpleSchema | $MemberSchema | StaticSchema | NormalizedSchema; /** * Traits attached to schema objects. * * When this is a number, it refers to a pre-allocated * trait combination that is equivalent to one of the * object type's variations. * * @public */ export type SchemaTraits = TraitBitVector | SchemaTraitsObject; /** * Simple schemas are those corresponding to simple Smithy types. * @see https://smithy.io/2.0/spec/simple-types.html * @public */ export type SimpleSchema = | BlobSchemas | StringSchema | BooleanSchema | NumericSchema | BigIntegerSchema | BigDecimalSchema | DocumentSchema | TimestampSchemas | number; /** * Sentinel value for Timestamp schema. * "Default" means unspecified and to use the protocol serializer's default format. * * @public */ export type TimestampSchemas = | TimestampDefaultSchema | TimestampDateTimeSchema | TimestampHttpDateSchema | TimestampEpochSecondsSchema; /** * Sentinel values for Blob schema. * @public */ export type BlobSchemas = BlobSchema | StreamingBlobSchema; /** * Signal value for the Smithy void value. Typically used for * operation input and outputs. * * @public */ export type UnitSchema = "unit"; /** * See https://smithy.io/2.0/trait-index.html for individual definitions. * * @public */ export type SchemaTraitsObject = { idempotent?: 1; idempotencyToken?: 1; sensitive?: 1; sparse?: 1; /** * timestampFormat is expressed by the schema sentinel values of 4, 5, 6, and 7, * and not contained in trait objects. * @deprecated use schema value. */ timestampFormat?: never; httpLabel?: 1; httpHeader?: string; httpQuery?: string; httpPrefixHeaders?: string; httpQueryParams?: 1; httpPayload?: 1; /** * [method, path, statusCode] */ http?: [string, string, number]; httpResponseCode?: 1; /** * [hostPrefix] */ endpoint?: [string]; xmlAttribute?: 1; xmlName?: string; /** * [prefix, uri] */ xmlNamespace?: [string, string]; xmlFlattened?: 1; jsonName?: string; mediaType?: string; error?: "client" | "server"; streaming?: 1; eventHeader?: 1; eventPayload?: 1; [traitName: string]: unknown; }; /** * Indicates the schema is a member of a parent Structure schema. * It may also have a set of member traits distinct from its target shape's traits. * @public */ export type $MemberSchema = [$SchemaRef, SchemaTraits]; /** * Schema for an operation. * @public */ export interface $OperationSchema { namespace: string; name: string; traits: SchemaTraits; input: $SchemaRef; output: $SchemaRef; } /** * Normalization wrapper for various schema data objects. * @public */ export interface NormalizedSchema { getSchema(): $Schema; getName(): string | undefined; isMemberSchema(): boolean; isListSchema(): boolean; isMapSchema(): boolean; isStructSchema(): boolean; isBlobSchema(): boolean; isTimestampSchema(): boolean; isStringSchema(): boolean; isBooleanSchema(): boolean; isNumericSchema(): boolean; isBigIntegerSchema(): boolean; isBigDecimalSchema(): boolean; isStreaming(): boolean; getMergedTraits(): SchemaTraitsObject; getMemberTraits(): SchemaTraitsObject; getOwnTraits(): SchemaTraitsObject; /** * For list/set/map. */ getValueSchema(): NormalizedSchema; /** * For struct/union. */ getMemberSchema(member: string): NormalizedSchema | undefined; structIterator(): Generator<[string, NormalizedSchema], undefined, undefined>; } /** * A schema "reference" is either a schema or a function that * provides a schema. This is useful for lazy loading, and to allow * code generation to define schema out of dependency order. * @public */ export type $SchemaRef = $Schema | (() => $Schema); /** * A codec creates serializers and deserializers for some format such as JSON, XML, or CBOR. * * @public */ export interface $Codec extends ConfigurableSerdeContext { createSerializer(): $ShapeSerializer; createDeserializer(): $ShapeDeserializer; } /** * Configuration for codecs. Different protocols may share codecs, but require different behaviors from them. * * @public */ export type CodecSettings = { timestampFormat: { /** * Whether to use member timestamp format traits. */ useTrait: boolean; /** * Default timestamp format. */ default: TimestampDateTimeSchema | TimestampHttpDateSchema | TimestampEpochSecondsSchema; }; /** * Whether to use HTTP binding traits. */ httpBindings?: boolean; }; /** * Turns a serialization into a data object. * @public */ export interface $ShapeDeserializer extends ConfigurableSerdeContext { /** * Optionally async. */ read(schema: $Schema, data: SerializationType): any | Promise; } /** * Turns a data object into a serialization. * @public */ export interface $ShapeSerializer extends ConfigurableSerdeContext { write(schema: $Schema, value: unknown): void; flush(): SerializationType; } /** * A client protocol defines how to convert a message (e.g. HTTP request/response) to and from a data object. * @public */ export interface $ClientProtocol extends ConfigurableSerdeContext { /** * @returns the Smithy qualified shape id. */ getShapeId(): string; getRequestType(): { new (...args: any[]): Request }; getResponseType(): { new (...args: any[]): Response }; /** * @returns the payload codec if the requests/responses have a symmetric format. * It otherwise may return null. */ getPayloadCodec(): $Codec; serializeRequest( operationSchema: $OperationSchema, input: Input, context: HandlerExecutionContext & SerdeFunctions & EndpointBearer ): Promise; updateServiceEndpoint(request: Request, endpoint: EndpointV2): Request; deserializeResponse( operationSchema: $OperationSchema, context: HandlerExecutionContext & SerdeFunctions, response: Response ): Promise; } /** * @public */ export interface $ClientProtocolCtor { new (args: any): $ClientProtocol; } /** * Allows a protocol, codec, or serde utility to accept the serdeContext * from a client configuration or request/response handlerExecutionContext. * * @public */ export interface ConfigurableSerdeContext { setSerdeContext(serdeContext: SerdeFunctions): void; } // TODO(schema): transports are not required in the current implementation. // /** // * @public // */ // export interface Transport { // getRequestType(): { new (...args: any[]): Request }; // getResponseType(): { new (...args: any[]): Response }; // // send(context: HandlerExecutionContext, request: Request): Promise; // } ================================================ FILE: packages/types/src/schema/sentinels.ts ================================================ // =============== Simple types =================== /** * The blob Smithy type, in JS as Uint8Array and other representations * such as Buffer, string, or Readable(Stream) depending on circumstances. * @public */ export type BlobSchema = 0b0001_0101; // 21 /** * @public */ export type StreamingBlobSchema = 0b0010_1010; // 42 /** * @public */ export type BooleanSchema = 0b0000_0010; // 2 /** * Includes string and enum Smithy types. * @public */ export type StringSchema = 0b0000_0000; // 0 /** * Includes all numeric Smithy types except bigInteger and bigDecimal. * byte, short, integer, long, float, double, intEnum. * * @public */ export type NumericSchema = 0b0000_0001; // 1 /** * @public */ export type BigIntegerSchema = 0b0001_0001; // 17 /** * @public */ export type BigDecimalSchema = 0b0001_0011; // 19 /** * @public */ export type DocumentSchema = 0b0000_1111; // 15 /** * Smithy type timestamp, in JS as native Date object. * @public */ export type TimestampDefaultSchema = 0b0000_0100; // 4 /** * @public */ export type TimestampDateTimeSchema = 0b0000_0101; // 5 /** * @public */ export type TimestampHttpDateSchema = 0b0000_0110; // 6 /** * @public */ export type TimestampEpochSecondsSchema = 0b0000_0111; // 7 // =============== Aggregate types =================== /** * Additional bit indicating the type is a list. * @public */ export type ListSchemaModifier = 0b0100_0000; // 64 /** * Additional bit indicating the type is a map. * @public */ export type MapSchemaModifier = 0b1000_0000; // 128 ================================================ FILE: packages/types/src/schema/static-schemas.ts ================================================ /* A static schema is a non-function-call object that has no side effects. Schemas are generated as static objects to improve tree-shaking behavior in downstream applications. */ import type { $SchemaRef, SchemaTraits } from "../schema/schema"; /** * @public */ export type StaticSchemaIdSimple = 0; /** * @public */ export type StaticSchemaIdList = 1; /** * @public */ export type StaticSchemaIdMap = 2; /** * @public */ export type StaticSchemaIdStruct = 3; /** * @public */ export type StaticSchemaIdUnion = 4; /** * @public */ export type StaticSchemaIdError = -3; /** * @public */ export type StaticSchemaIdOperation = 9; /** * @public */ export type StaticSchema = | StaticSimpleSchema | StaticListSchema | StaticMapSchema | StaticStructureSchema | StaticUnionSchema | StaticErrorSchema | StaticOperationSchema; /** * @public */ export type ShapeName = string; /** * @public */ export type ShapeNamespace = string; /** * @public */ export type StaticSimpleSchema = [StaticSchemaIdSimple, ShapeNamespace, ShapeName, SchemaTraits, $SchemaRef]; /** * @public */ export type StaticListSchema = [StaticSchemaIdList, ShapeNamespace, ShapeName, SchemaTraits, $SchemaRef]; /** * @public */ export type StaticMapSchema = [StaticSchemaIdMap, ShapeNamespace, ShapeName, SchemaTraits, $SchemaRef, $SchemaRef]; /** * @public */ export type StaticStructureSchema = [ StaticSchemaIdStruct, ShapeNamespace, ShapeName, SchemaTraits, string[], // member name list. $SchemaRef[], // member schema list. number?, // required member count, front-loaded in the lists. ]; /** * @public */ export type StaticUnionSchema = [ StaticSchemaIdUnion, ShapeNamespace, ShapeName, SchemaTraits, string[], // member name list. $SchemaRef[], // member schema list. ]; /** * @public */ export type StaticErrorSchema = [ StaticSchemaIdError, ShapeNamespace, ShapeName, SchemaTraits, string[], // member name list. $SchemaRef[], // member schema list. number?, // required member count, front-loaded in the lists. ]; /** * @public */ export type StaticOperationSchema = [ StaticSchemaIdOperation, ShapeNamespace, ShapeName, SchemaTraits, $SchemaRef, // input schema $SchemaRef, // output schema ]; ================================================ FILE: packages/types/src/schema/traits.ts ================================================ /** * A bitvector representing a traits object. * * Vector index to trait: * 0 - httpLabel * 1 - idempotent * 2 - idempotencyToken * 3 - sensitive * 4 - httpPayload * 5 - httpResponseCode * 6 - httpQueryParams * * The singular trait values are enumerated for quick identification, but * combination values are left to the `number` union type. * * @public */ export type TraitBitVector = | HttpLabelBitMask | IdempotentBitMask | IdempotencyTokenBitMask | SensitiveBitMask | HttpPayloadBitMask | HttpResponseCodeBitMask | HttpQueryParamsBitMask | number; /** * @public */ export type HttpLabelBitMask = 1; /** * @public */ export type IdempotentBitMask = 2; /** * @public */ export type IdempotencyTokenBitMask = 4; /** * @public */ export type SensitiveBitMask = 8; /** * @public */ export type HttpPayloadBitMask = 16; /** * @public */ export type HttpResponseCodeBitMask = 32; /** * @public */ export type HttpQueryParamsBitMask = 64; ================================================ FILE: packages/types/src/serde.ts ================================================ import type { Endpoint } from "./http"; import type { $ClientProtocol } from "./schema/schema"; import type { RequestHandler } from "./transfer"; import type { Decoder, Encoder, Provider } from "./util"; /** * Interface for object requires an Endpoint set. * * @public */ export interface EndpointBearer { /* TODO(endpointsv2) post-release */ // Keep using Endpoint V1 interface in serde // After all services have onboard EndpointV2, we need to migrate it to Endpoint V2 interface too. endpoint: Provider; } /** * @public */ export interface StreamCollector { /** * A function that converts a stream into an array of bytes. * * @param stream - The low-level native stream from browser or Nodejs runtime */ (stream: any): Promise; } /** * Request and Response serde util functions and settings for AWS services * * @public */ export interface SerdeContext extends SerdeFunctions, EndpointBearer { requestHandler: RequestHandler; disableHostPrefix: boolean; protocol?: $ClientProtocol; } /** * Serde functions from the client config. * * @public */ export interface SerdeFunctions { base64Encoder: Encoder; base64Decoder: Decoder; utf8Encoder: Encoder; utf8Decoder: Decoder; streamCollector: StreamCollector; } /** * @public */ export interface RequestSerializer { /** * Converts the provided `input` into a request object * * @param input - The user input to serialize. * * @param context - Context containing runtime-specific util functions. */ (input: any, context: Context): Promise; } /** * @public */ export interface ResponseDeserializer { /** * Converts the output of an operation into JavaScript types. * * @param output - The HTTP response received from the service * * @param context - context containing runtime-specific util functions. */ (output: ResponseType, context: Context): Promise; } /** * The interface contains mix-in utility functions to transfer the runtime-specific * stream implementation to specified format. Each stream can ONLY be transformed * once. * @public */ export interface SdkStreamMixin { transformToByteArray: () => Promise; transformToString: (encoding?: string) => Promise; transformToWebStream: () => ReadableStream; } /** * The type describing a runtime-specific stream implementation with mix-in * utility functions. * * @public */ export type SdkStream = BaseStream & SdkStreamMixin; /** * Indicates that the member of type T with * key StreamKey have been extended * with the SdkStreamMixin helper methods. * * @public */ export type WithSdkStreamMixin = { [key in keyof T]: key extends StreamKey ? SdkStream : T[key]; }; /** * Interface for internal function to inject stream utility functions * implementation * * @internal */ export interface SdkStreamMixinInjector { (stream: unknown): SdkStreamMixin; } /** * @internal */ export interface SdkStreamSerdeContext { sdkStreamMixin: SdkStreamMixinInjector; } ================================================ FILE: packages/types/src/shapes.ts ================================================ import type { HttpResponse } from "./http"; import type { MetadataBearer } from "./response"; /** * A document type represents an untyped JSON-like value. * Not all protocols support document types, and the serialization format of a * document type is protocol specific. All JSON protocols SHOULD support * document types and they SHOULD serialize document types inline as normal * JSON values. * * @public */ export type DocumentType = | null | boolean | number | string | DocumentType[] | { [prop: string]: DocumentType; }; /** * A structure shape with the error trait. * https://smithy.io/2.0/spec/behavior-traits.html#smithy-api-retryable-trait * * @public */ export interface RetryableTrait { /** * Indicates that the error is a retryable throttling error. */ readonly throttling?: boolean; } /** * Type that is implemented by all Smithy shapes marked with the * error trait. * * @public * @deprecated */ export interface SmithyException { /** * The shape ID name of the exception. */ readonly name: string; /** * Whether the client or server are at fault. */ readonly $fault: "client" | "server"; /** * The service that encountered the exception. */ readonly $service?: string; /** * Indicates that an error MAY be retried by the client. */ readonly $retryable?: RetryableTrait; /** * Reference to low-level HTTP response object. */ readonly $response?: HttpResponse; } /** * This type should not be used in your application. * Users of the AWS SDK for JavaScript v3 service clients should prefer to * use the specific Exception classes corresponding to each operation. * These can be found as code in the deserializer for the operation's Command class, * or as declarations in the service model file in codegen/sdk-codegen/aws-models. * If no exceptions are enumerated by a particular Command operation, * the base exception for the service should be used. Each client exports * a base ServiceException prefixed with the service name. * * @public * @deprecated See {@link https://aws.amazon.com/blogs/developer/service-error-handling-modular-aws-sdk-js/} */ export type SdkError = Error & Partial & Partial & { $metadata?: Partial["$metadata"] & { /** * If present, will have value of true and indicates that the error resulted in a * correction of the clock skew, a.k.a. config.systemClockOffset. * This is specific to AWS SDK and sigv4. */ readonly clockSkewCorrected?: true; }; cause?: Error; }; ================================================ FILE: packages/types/src/signature.ts ================================================ import type { Message } from "./eventStream"; import type { HttpRequest } from "./http"; import type { AwsCredentialIdentity } from "./identity/awsCredentialIdentity"; /** * A `Date` object, a unix (epoch) timestamp in seconds, or a string that can be * understood by the JavaScript `Date` constructor. * * @public */ export type DateInput = number | string | Date; /** * @public */ export interface SigningArguments { /** * The date and time to be used as signature metadata. This value should be * a Date object, a unix (epoch) timestamp, or a string that can be * understood by the JavaScript `Date` constructor.If not supplied, the * value returned by `new Date()` will be used. */ signingDate?: DateInput; /** * The service signing name. It will override the service name of the signer * in current invocation */ signingService?: string; /** * The region name to sign the request. It will override the signing region of the * signer in current invocation */ signingRegion?: string; } /** * @public */ export interface RequestSigningArguments extends SigningArguments { /** * A set of strings whose members represents headers that cannot be signed. * All headers in the provided request will have their names converted to * lower case and then checked for existence in the unsignableHeaders set. */ unsignableHeaders?: Set; /** * A set of strings whose members represents headers that should be signed. * Any values passed here will override those provided via unsignableHeaders, * allowing them to be signed. * * All headers in the provided request will have their names converted to * lower case before signing. */ signableHeaders?: Set; } /** * @public */ export interface RequestPresigningArguments extends RequestSigningArguments { /** * The number of seconds before the presigned URL expires */ expiresIn?: number; /** * A set of strings whose representing headers that should not be hoisted * to presigned request's query string. If not supplied, the presigner * moves all the AWS-specific headers (starting with `x-amz-`) to the request * query string. If supplied, these headers remain in the presigned request's * header. * All headers in the provided request will have their names converted to * lower case and then checked for existence in the unhoistableHeaders set. */ unhoistableHeaders?: Set; /** * This overrides any headers with the same name(s) set by unhoistableHeaders. * These headers will be hoisted into the query string and signed. */ hoistableHeaders?: Set; } /** * @public */ export interface EventSigningArguments extends SigningArguments, EventStreamRequestScopedCredentials { priorSignature: string; } /** * @public */ export interface MessageSigningArguments extends SigningArguments, EventStreamRequestScopedCredentials {} /** * @internal */ export interface EventStreamRequestScopedCredentials { /** * Optional, static credentials used for the duration of the event-stream request. * If not provided, the signer's internal credential provider would be used, if * the signer is SignatureV4. */ eventStreamCredentials?: AwsCredentialIdentity; } /** * @public */ export interface RequestPresigner { /** * Signs a request for future use. * * The request will be valid until either the provided `expiration` time has * passed or the underlying credentials have expired. * * @param requestToSign - The request that should be signed. * @param options - Additional signing options. */ presign(requestToSign: HttpRequest, options?: RequestPresigningArguments): Promise; } /** * An object that signs request objects with AWS credentials using one of the * AWS authentication protocols. * * @public */ export interface RequestSigner { /** * Sign the provided request for immediate dispatch. */ sign(requestToSign: HttpRequest, options?: RequestSigningArguments): Promise; } /** * @public */ export interface StringSigner { /** * Sign the provided `stringToSign` for use outside of the context of * request signing. Typical uses include signed policy generation. */ sign(stringToSign: string, options?: SigningArguments): Promise; } /** * @public */ export interface FormattedEvent { headers: Uint8Array; payload: Uint8Array; } /** * @public */ export interface EventSigner { /** * Sign the individual event of the event stream. */ sign(event: FormattedEvent, options: EventSigningArguments): Promise; } /** * @public */ export interface SignableMessage { message: Message; priorSignature: string; } /** * @public */ export interface SignedMessage { message: Message; signature: string; } /** * @public */ export interface MessageSigner { signMessage(message: SignableMessage, args: MessageSigningArguments): Promise; sign(event: SignableMessage, options: MessageSigningArguments): Promise; } ================================================ FILE: packages/types/src/stream.ts ================================================ import type { ChecksumConstructor } from "./checksum"; import type { HashConstructor, StreamHasher } from "./crypto"; import type { BodyLengthCalculator, Encoder } from "./util"; /** * @public */ export interface GetAwsChunkedEncodingStreamOptions { base64Encoder?: Encoder; bodyLengthChecker: BodyLengthCalculator; checksumAlgorithmFn?: ChecksumConstructor | HashConstructor; checksumLocationName?: string; streamHasher?: StreamHasher; } /** * A function that returns Readable Stream which follows aws-chunked encoding stream. * It optionally adds checksum if options are provided. * * @public */ export interface GetAwsChunkedEncodingStream { (readableStream: StreamType, options: GetAwsChunkedEncodingStreamOptions): StreamType; } ================================================ FILE: packages/types/src/streaming-payload/streaming-blob-common-types.ts ================================================ import type { Readable } from "node:stream"; import type { BlobOptionalType, ReadableStreamOptionalType } from "../externals-check/browser-externals-check"; /** * This is the union representing the modeled blob type with streaming trait * in a generic format that does not relate to HTTP input or output payloads. * Note: the non-streaming blob type is represented by Uint8Array, but because * the streaming blob type is always in the request/response paylod, it has * historically been handled with different types. * For compatibility with its historical representation, it must contain at least * Readble (Node.js), Blob (browser), and ReadableStream (browser). * * @public * @see https://smithy.io/2.0/spec/simple-types.html#blob * @see StreamingPayloadInputTypes for FAQ about mixing types from multiple environments. */ export type StreamingBlobTypes = NodeJsRuntimeStreamingBlobTypes | BrowserRuntimeStreamingBlobTypes; /** * Node.js streaming blob type. * * @public */ export type NodeJsRuntimeStreamingBlobTypes = Readable; /** * Browser streaming blob types. * * @public */ export type BrowserRuntimeStreamingBlobTypes = ReadableStreamOptionalType | BlobOptionalType; ================================================ FILE: packages/types/src/streaming-payload/streaming-blob-payload-input-types.ts ================================================ import type { Readable } from "node:stream"; import type { BlobOptionalType, ReadableStreamOptionalType } from "../externals-check/browser-externals-check"; /** * This union represents a superset of the compatible types you * can use for streaming payload inputs. * FAQ: * Why does the type union mix mutually exclusive runtime types, namely * Node.js and browser types? * There are several reasons: * 1. For backwards compatibility. * 2. As a convenient compromise solution so that users in either environment may use the types * without customization. * 3. The SDK does not have static type information about the exact implementation * of the HTTP RequestHandler being used in your client(s) (e.g. fetch, XHR, node:http, or node:http2), * given that it is chosen at runtime. There are multiple possible request handlers * in both the Node.js and browser runtime environments. * Rather than restricting the type to a known common format (Uint8Array, for example) * which doesn't include a universal streaming format in the currently supported Node.js versions, * the type declaration is widened to multiple possible formats. * It is up to the user to ultimately select a compatible format with the * runtime and HTTP handler implementation they are using. * Usage: * The typical solution we expect users to have is to manually narrow the * type when needed, picking the appropriate one out of the union according to the * runtime environment and specific request handler. * There is also the type utility "NodeJsClient", "BrowserClient" and more * exported from this package. These can be applied at the client level * to pre-narrow these streaming payload blobs. For usage see the readme.md * in the root of the \@smithy/types NPM package. * * @public */ export type StreamingBlobPayloadInputTypes = | NodeJsRuntimeStreamingBlobPayloadInputTypes | BrowserRuntimeStreamingBlobPayloadInputTypes; /** * Streaming payload input types in the Node.js environment. * These are derived from the types compatible with the request body used by node:http. * Note: not all types are signable by the standard SignatureV4 signer when * used as the request body. For example, in Node.js a Readable stream * is not signable by the default signer. * They are included in the union because it may be intended in some cases, * but the expected types are primarily string, Uint8Array, and Buffer. * Additional details may be found in the internal * function "getPayloadHash" in the SignatureV4 module. * * @public */ export type NodeJsRuntimeStreamingBlobPayloadInputTypes = string | Uint8Array | Buffer | Readable; /** * Streaming payload input types in the browser environment. * These are derived from the types compatible with fetch's Request.body. * * @public */ export type BrowserRuntimeStreamingBlobPayloadInputTypes = | string | Uint8Array | ReadableStreamOptionalType | BlobOptionalType; ================================================ FILE: packages/types/src/streaming-payload/streaming-blob-payload-output-types.ts ================================================ import type { IncomingMessage } from "node:http"; import type { Readable } from "node:stream"; import type { BlobOptionalType, ReadableStreamOptionalType } from "../externals-check/browser-externals-check"; import type { SdkStream } from "../serde"; /** * This union represents a superset of the types you may receive * in streaming payload outputs. * To highlight the upstream docs about the SdkStream mixin: * The interface contains mix-in (via Object.assign) methods to transform the runtime-specific * stream implementation to specified format. Each stream can ONLY be transformed * once. * The available methods are described on the SdkStream type via SdkStreamMixin. * * @public * @see StreamingPayloadInputTypes for FAQ about mixing types from multiple environments. */ export type StreamingBlobPayloadOutputTypes = | NodeJsRuntimeStreamingBlobPayloadOutputTypes | BrowserRuntimeStreamingBlobPayloadOutputTypes; /** * Streaming payload output types in the Node.js environment. * This is by default the IncomingMessage type from node:http responses when * using the default node-http-handler in Node.js environments. * It can be other Readable types like node:http2's ClientHttp2Stream * such as when using the node-http2-handler. * The SdkStreamMixin adds methods on this type to help transform (collect) it to * other formats. * * @public */ export type NodeJsRuntimeStreamingBlobPayloadOutputTypes = SdkStream; /** * Streaming payload output types in the browser environment. * This is by default fetch's Response.body type (ReadableStream) when using * the default fetch-http-handler in browser-like environments. * It may be a Blob, such as when using the XMLHttpRequest handler * and receiving an arraybuffer response body. * The SdkStreamMixin adds methods on this type to help transform (collect) it to * other formats. * * @public */ export type BrowserRuntimeStreamingBlobPayloadOutputTypes = SdkStream; ================================================ FILE: packages/types/src/transfer.ts ================================================ /** * @public */ export type RequestHandlerOutput = { response: ResponseType }; /** * @public */ export interface RequestHandler { /** * metadata contains information of a handler. For example * 'h2' refers this handler is for handling HTTP/2 requests, * whereas 'h1' refers handling HTTP1 requests */ metadata?: RequestHandlerMetadata; destroy?: () => void; handle: (request: RequestType, handlerOptions?: HandlerOptions) => Promise>; } /** * @public */ export interface RequestHandlerMetadata { handlerProtocol: RequestHandlerProtocol | string; } /** * Values from ALPN Protocol IDs. * * @public * @see https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids */ export enum RequestHandlerProtocol { HTTP_0_9 = "http/0.9", HTTP_1_0 = "http/1.0", TDS_8_0 = "tds/8.0", } /** * @public */ export interface RequestContext { destination: URL; } ================================================ FILE: packages/types/src/transform/client-method-transforms.ts ================================================ import type { CommandIO } from "../command"; import type { MetadataBearer } from "../response"; import type { StreamingBlobPayloadOutputTypes } from "../streaming-payload/streaming-blob-payload-output-types"; import type { Transform } from "./type-transform"; /** * Narrowed version of InvokeFunction used in Client::send. * * @internal */ export interface NarrowedInvokeFunction< NarrowType, HttpHandlerOptions, InputTypes extends object, OutputTypes extends MetadataBearer, > { ( command: CommandIO, options?: HttpHandlerOptions ): Promise>; ( command: CommandIO, cb: (err: unknown, data?: Transform) => void ): void; ( command: CommandIO, options: HttpHandlerOptions, cb: (err: unknown, data?: Transform) => void ): void; ( command: CommandIO, options?: HttpHandlerOptions, cb?: (err: unknown, data?: Transform) => void ): Promise> | void; } /** * Narrowed version of InvokeMethod used in aggregated Client methods. * * @internal */ export interface NarrowedInvokeMethod< NarrowType, HttpHandlerOptions, InputType extends object, OutputType extends MetadataBearer, > { ( input: InputType, options?: HttpHandlerOptions ): Promise>; ( input: InputType, cb: (err: unknown, data?: Transform) => void ): void; ( input: InputType, options: HttpHandlerOptions, cb: (err: unknown, data?: Transform) => void ): void; ( input: InputType, options?: HttpHandlerOptions, cb?: (err: unknown, data?: OutputType) => void ): Promise> | void; } ================================================ FILE: packages/types/src/transform/client-payload-blob-type-narrow.spec.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { IncomingMessage } from "node:http"; import type { Client } from "../client"; import type { CommandIO } from "../command"; import type { HttpHandlerOptions } from "../http"; import type { MetadataBearer } from "../response"; import type { SdkStream } from "../serde"; import type { NodeJsRuntimeStreamingBlobPayloadInputTypes, StreamingBlobPayloadInputTypes, } from "../streaming-payload/streaming-blob-payload-input-types"; import type { StreamingBlobPayloadOutputTypes } from "../streaming-payload/streaming-blob-payload-output-types"; import type { BrowserClient, NodeJsClient } from "./client-payload-blob-type-narrow"; import type { Exact } from "./exact"; import type { Transform } from "./type-transform"; // it should narrow operational methods and the generic send method type MyInput = Partial<{ a: boolean; b: boolean | number; c: boolean | number | string; body?: StreamingBlobPayloadInputTypes; }>; type MyOutput = { a: boolean; b: boolean | number; c: boolean | number | string; body?: StreamingBlobPayloadOutputTypes; } & MetadataBearer; type MyConfig = { version: number; }; interface MyClient extends Client { getObject(args: MyInput, options?: HttpHandlerOptions): Promise; getObject(args: MyInput, cb: (err: any, data?: MyOutput) => void): void; getObject(args: MyInput, options: HttpHandlerOptions, cb: (err: any, data?: MyOutput) => void): void; putObject(args: MyInput, options?: HttpHandlerOptions): Promise; putObject(args: MyInput, cb: (err: any, data?: MyOutput) => void): void; putObject(args: MyInput, options: HttpHandlerOptions, cb: (err: any, data?: MyOutput) => void): void; } { interface NodeJsMyClient extends NodeJsClient {} const mockClient = null as unknown as NodeJsMyClient; type Input = Parameters[0]; const assert1: Exact< Input, Transform > = true as const; const assert2: Exact = false as const; } { interface NodeJsMyClient extends NodeJsClient {} const mockClient = null as unknown as NodeJsMyClient; const getObjectCall = () => mockClient.getObject({}); type A = Awaited>; type B = Omit & { body?: SdkStream }; const assert1: Exact = true as const; } { interface NodeJsMyClient extends BrowserClient {} const mockClient = null as unknown as NodeJsMyClient; const putObjectCall = () => new Promise((resolve) => { mockClient.putObject({}, (err: unknown, data) => { resolve(data!); }); }); type A = Awaited>; type B = Omit & { body?: SdkStream }; const assert1: Exact = true as const; } { interface NodeJsMyClient extends NodeJsClient {} const mockClient = null as unknown as NodeJsMyClient; const sendCall = () => mockClient.send(null as unknown as CommandIO, { abortSignal: null as any }); type A = Awaited>; type B = Omit & { body?: SdkStream }; const assert1: Exact = true as const; } ================================================ FILE: packages/types/src/transform/client-payload-blob-type-narrow.ts ================================================ import type { ClientHttp2Stream } from "node:http2"; import type { IncomingMessage } from "node:http"; import type { InvokeMethod } from "../client"; import type { GetOutputType } from "../command"; import type { HttpHandlerOptions } from "../http"; import type { SdkStream } from "../serde"; import type { BrowserRuntimeStreamingBlobPayloadInputTypes, NodeJsRuntimeStreamingBlobPayloadInputTypes, StreamingBlobPayloadInputTypes, } from "../streaming-payload/streaming-blob-payload-input-types"; import type { StreamingBlobPayloadOutputTypes } from "../streaming-payload/streaming-blob-payload-output-types"; import type { NarrowedInvokeMethod } from "./client-method-transforms"; import type { Transform } from "./type-transform"; /** * Creates a type with a given client type that narrows payload blob output * types to SdkStream. * This can be used for clients with the NodeHttpHandler requestHandler, * the default in Node.js when not using HTTP2. * Usage example: * ```typescript * const client = new YourClient({}) as NodeJsClient; * ``` * * @public */ export type NodeJsClient = NarrowPayloadBlobTypes< NodeJsRuntimeStreamingBlobPayloadInputTypes, SdkStream, ClientType >; /** * Variant of NodeJsClient for node:http2. * * @public */ export type NodeJsHttp2Client = NarrowPayloadBlobTypes< NodeJsRuntimeStreamingBlobPayloadInputTypes, SdkStream, ClientType >; /** * Creates a type with a given client type that narrows payload blob output * types to SdkStream. * This can be used for clients with the FetchHttpHandler requestHandler, * which is the default in browser environments. * Usage example: * ```typescript * const client = new YourClient({}) as BrowserClient; * ``` * * @public */ export type BrowserClient = NarrowPayloadBlobTypes< BrowserRuntimeStreamingBlobPayloadInputTypes, SdkStream, ClientType >; /** * Variant of BrowserClient for XMLHttpRequest. * * @public */ export type BrowserXhrClient = NarrowPayloadBlobTypes< BrowserRuntimeStreamingBlobPayloadInputTypes, SdkStream, ClientType >; /** * Narrow a given Client's blob payload outputs to the given type T. * * @public * @deprecated use NarrowPayloadBlobTypes. */ export type NarrowPayloadBlobOutputType = { [key in keyof ClientType]: [ClientType[key]] extends [ InvokeMethod, ] ? NarrowedInvokeMethod : ClientType[key]; } & { send( command: Command, options?: any ): Promise, StreamingBlobPayloadOutputTypes | undefined, T>>; }; /** * Narrow a Client's blob payload input and output types to I and O. * * @public */ export type NarrowPayloadBlobTypes = { [key in keyof ClientType]: [ClientType[key]] extends [ InvokeMethod, ] ? NarrowedInvokeMethod< O, HttpHandlerOptions, Transform, FunctionOutputTypes > : ClientType[key]; } & { send( command: Command, options?: any ): Promise, StreamingBlobPayloadOutputTypes | undefined, O>>; }; ================================================ FILE: packages/types/src/transform/exact.ts ================================================ /** * Checks that A and B extend each other. * * @internal */ export type Exact = [A] extends [B] ? ([B] extends [A] ? true : false) : false; ================================================ FILE: packages/types/src/transform/mutable.ts ================================================ /** * @internal */ export type Mutable = { -readonly [Property in keyof Type]: Type[Property]; }; ================================================ FILE: packages/types/src/transform/no-undefined.spec.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { Client } from "../client"; import type { CommandIO } from "../command"; import type { HttpHandlerOptions } from "../http"; import type { MetadataBearer } from "../response"; import type { DocumentType } from "../shapes"; import type { Exact } from "./exact"; import type { AssertiveClient, NoUndefined, UncheckedClient } from "./no-undefined"; type A = { a: string; b: number | string; c: boolean | number | string; required: string | undefined; optional?: string; nested: A; document: DocumentType; }; { // it should remove undefined union from required fields. type T = NoUndefined
; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; const assert4: Exact = true as const; const assert5: Exact = true as const; } { type MyInput = { a: string | undefined; b: number | undefined; c: string | number | undefined; optional?: string; document: DocumentType | undefined; }; type MyOutput = { a?: string; b?: number; c?: string | number; r?: MyOutput; document?: DocumentType; } & MetadataBearer; type MyConfig = { version: number; }; interface MyClient extends Client { getObject(args: MyInput, options?: HttpHandlerOptions): Promise; getObject(args: MyInput, cb: (err: any, data?: MyOutput) => void): void; getObject(args: MyInput, options: HttpHandlerOptions, cb: (err: any, data?: MyOutput) => void): void; putObject(args: MyInput, options?: HttpHandlerOptions): Promise; putObject(args: MyInput, cb: (err: any, data?: MyOutput) => void): void; putObject(args: MyInput, options: HttpHandlerOptions, cb: (err: any, data?: MyOutput) => void): void; listObjects(): Promise; listObjects(args: MyInput, options?: HttpHandlerOptions): Promise; listObjects(args: MyInput, cb: (err: any, data?: MyOutput) => void): void; listObjects(args: MyInput, options: HttpHandlerOptions, cb: (err: any, data?: MyOutput) => void): void; } { // AssertiveClient should enforce union of undefined on inputs // but preserve undefined outputs. const c = null as unknown as AssertiveClient; const input = { a: "", b: 0, c: 0, document: { aa: "b" }, }; const get = c.getObject(input); const output = null as unknown as Awaited; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; const assert4: Exact = true as const; if (output.r) { const assert5: Exact = true as const; const assert6: Exact = true as const; const assert7: Exact = true as const; const assert8: Exact = true as const; } } { // UncheckedClient both removes union-undefined from inputs // and the nullability of outputs. const c = null as unknown as UncheckedClient; const input = { a: "", b: 0, c: 0, document: { aa: "b" }, }; const get = c.getObject(input); const output = null as unknown as Awaited; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; const assert4: Exact = true as const; const assert5: Exact = true as const; const assert6: Exact = true as const; const assert7: Exact = true as const; const assert8: Exact = true as const; } { // Handles methods with optionally zero args. const c = null as unknown as AssertiveClient; const list = c.listObjects(); const output = null as unknown as Awaited; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; const assert4: Exact = true as const; if (output.r) { const assert5: Exact = true as const; const assert6: Exact = true as const; const assert7: Exact = true as const; const assert8: Exact = true as const; } } { // Works with outputs of the "send" method. const c = null as unknown as AssertiveClient; const list = c.send(null as unknown as CommandIO); const output = null as unknown as Awaited; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; const assert4: Exact = true as const; if (output.r) { const assert5: Exact = true as const; const assert6: Exact = true as const; const assert7: Exact = true as const; const assert8: Exact = true as const; } } } ================================================ FILE: packages/types/src/transform/no-undefined.ts ================================================ import type { InvokeMethod, InvokeMethodOptionalArgs } from "../client"; import type { GetOutputType } from "../command"; import type { DocumentType } from "../shapes"; /** * This type is intended as a type helper for generated clients. * When initializing client, cast it to this type by passing * the client constructor type as the type parameter. * * It will then recursively remove "undefined" as a union type from all * input and output shapes' members. Note, this does not affect * any member that is optional (?) such as outputs with no required members. * * @example * ```ts * const client = new Client({}) as AssertiveClient; * ``` * * @public */ export type AssertiveClient = NarrowClientIOTypes; /** * This is similar to AssertiveClient but additionally changes all * output types to (recursive) Required so as to bypass all output nullability guards. * * @public */ export type UncheckedClient = UncheckedClientOutputTypes; /** * Excludes undefined recursively. * * @internal */ export type NoUndefined = T extends Function ? T : T extends DocumentType ? T : [T] extends [object] ? { [key in keyof T]: NoUndefined; } : Exclude; /** * Excludes undefined and optional recursively. * * @internal */ export type RecursiveRequired = T extends Function ? T : T extends DocumentType ? T : [T] extends [object] ? { [key in keyof T]-?: RecursiveRequired; } : Exclude; /** * Removes undefined from unions. * * @internal */ type NarrowClientIOTypes = { [key in keyof ClientType]: [ClientType[key]] extends [ InvokeMethodOptionalArgs, ] ? InvokeMethodOptionalArgs, NoUndefined> : [ClientType[key]] extends [InvokeMethod] ? InvokeMethod, NoUndefined> : ClientType[key]; } & { send(command: Command, options?: any): Promise>>; }; /** * Removes undefined from unions and adds yolo output types. * * @internal */ type UncheckedClientOutputTypes = { [key in keyof ClientType]: [ClientType[key]] extends [ InvokeMethodOptionalArgs, ] ? InvokeMethodOptionalArgs, RecursiveRequired> : [ClientType[key]] extends [InvokeMethod] ? InvokeMethod, RecursiveRequired> : ClientType[key]; } & { send(command: Command, options?: any): Promise>>>; }; ================================================ FILE: packages/types/src/transform/type-transform.spec.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { Transform as DownlevelTransform } from "../downlevel-ts3.4/transform/type-transform"; import type { Exact } from "./exact"; import type { Transform } from "./type-transform"; type A = { a: string; b: number | string; c: boolean | number | string; nested: A; }; { // It should transform exact unions recursively. type T = Transform; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; } // It should not recurse into SharedArrayBuffer. type B = { typed: SharedArrayBuffer; untyped: { byteLength: number; }; }; // Transform targets number, which is a sub-property type of SharedArrayBuffer (e.g. byteLength). // If recursion occurred, SharedArrayBuffer's byteLength would be transformed. type T = Transform; const assert1: Exact = true as const; const assert2: Exact = true as const; { // the downlevel should function similarly type T = DownlevelTransform; const assert1: Exact = true as const; const assert2: Exact = true as const; const assert3: Exact = true as const; } ================================================ FILE: packages/types/src/transform/type-transform.ts ================================================ /** * Transforms any members of the object T having type FromType * to ToType. This applies only to exact type matches. * This is for the case where FromType is a union and only those fields * matching the same union should be transformed. * * @public */ export type Transform = ConditionalRecursiveTransformExact; /** * Returns ToType if T matches exactly with FromType. * * @internal */ type TransformExact = [T] extends [FromType] ? ([FromType] extends [T] ? ToType : T) : T; /** * Types excluded from recursive transformation to avoid circular references. * * @internal */ type ExcludedTransformTypes = SharedArrayBuffer; /** * Applies TransformExact to members of an object recursively. * * @internal */ type RecursiveTransformExact = T extends Function ? T : T extends ExcludedTransformTypes ? T : T extends object ? { [key in keyof T]: [T[key]] extends [FromType] ? [FromType] extends [T[key]] ? ToType : ConditionalRecursiveTransformExact : ConditionalRecursiveTransformExact; } : TransformExact; /** * Same as RecursiveTransformExact but does not assign to an object * unless there is a matching transformed member. * * @internal */ type ConditionalRecursiveTransformExact = [T] extends [ RecursiveTransformExact, ] ? [RecursiveTransformExact] extends [T] ? T : RecursiveTransformExact : RecursiveTransformExact; ================================================ FILE: packages/types/src/uri.ts ================================================ import type { QueryParameterBag } from "./http"; /** * Represents the components parts of a Uniform Resource Identifier used to * construct the target location of a Request. * * @internal */ export type URI = { protocol: string; hostname: string; port?: number; path: string; query?: QueryParameterBag; username?: string; password?: string; fragment?: string; }; ================================================ FILE: packages/types/src/util.spec.ts ================================================ /* eslint-disable @typescript-eslint/no-unused-vars */ import type { Exact, OptionalParameter } from "./util"; type Assignable = [RHS] extends [LHS] ? true : false; type OptionalInput = { key?: string; optional?: string; }; type RequiredInput = { key: string | undefined; optional?: string; }; { // optional parameter transform of an optional input is not equivalent to exactly 1 parameter. type A = [...OptionalParameter]; type B = [OptionalInput]; type C = [OptionalInput] | []; const assert1: Exact = false as const; const assert2: Exact = true as const; const assert3: Assignable = true as const; const assert4: A = []; const assert5: Assignable = true as const; const assert6: A = [{ key: "" }]; } { // optional parameter transform of a required input is equivalent to exactly 1 parameter. type A = [...OptionalParameter]; type B = [RequiredInput]; const assert1: Exact = true as const; const assert2: Assignable = false as const; const assert3: Assignable = true as const; const assert4: A = [{ key: "" }]; } ================================================ FILE: packages/types/src/util.ts ================================================ import type { Endpoint } from "./http"; import type { FinalizeHandler, FinalizeHandlerArguments, FinalizeHandlerOutput } from "./middleware"; import type { MetadataBearer } from "./response"; /** * A generic which checks if Type1 is exactly same as Type2. * * @public */ export type Exact = [Type1] extends [Type2] ? ([Type2] extends [Type1] ? true : false) : false; /** * A function that, given a Uint8Array of bytes, can produce a string * representation thereof. The function may optionally attempt to * convert other input types to Uint8Array before encoding. * * @example An encoder function that converts bytes to hexadecimal * representation would return `'hello'` when given * `new Uint8Array([104, 101, 108, 108, 111])`. * * @public */ export interface Encoder { /** * Caution: the `any` type on the input is for backwards compatibility. * Runtime support is limited to Uint8Array and string by default. * * You may choose to support more encoder input types if overriding the default * implementations. */ (input: Uint8Array | string | any): string; } /** * A function that, given a string, can derive the bytes represented by that * string. * * @example A decoder function that converts bytes to hexadecimal * representation would return `new Uint8Array([104, 101, 108, 108, 111])` when * given the string `'hello'`. * * @public */ export interface Decoder { (input: string): Uint8Array; } /** * A function that, when invoked, returns a promise that will be fulfilled with * a value of type T. * * @example A function that reads credentials from shared SDK configuration * files, assuming roles and collecting MFA tokens as necessary. * * @public */ export interface Provider { (): Promise; } /** * A tuple that represents an API name and optional version * of a library built using the AWS SDK. * * @public */ export type UserAgentPair = [name: string, version?: string]; /** * User agent data that to be put into the request's user * agent. * * @public */ export type UserAgent = UserAgentPair[]; /** * Parses a URL in string form into an Endpoint object. * * @public */ export interface UrlParser { (url: string | URL): Endpoint; } /** * A function that, when invoked, returns a promise that will be fulfilled with * a value of type T. It memoizes the result from the previous invocation * instead of calling the underlying resources every time. * * You can force the provider to refresh the memoized value by invoke the * function with optional parameter hash with `forceRefresh` boolean key and * value `true`. * * @example A function that reads credentials from IMDS service that could * return expired credentials. The SDK will keep using the expired credentials * until an unretryable service error requiring a force refresh of the * credentials. * * @public */ export interface MemoizedProvider { (options?: { forceRefresh?: boolean }): Promise; } /** * A function that, given a request body, determines the * length of the body. This is used to determine the Content-Length * that should be sent with a request. * * @example A function that reads a file stream and calculates * the size of the file. * * @public */ export interface BodyLengthCalculator { (body: any): number | undefined; } /** * Object containing regionalization information of * AWS services. * * @public */ export interface RegionInfo { hostname: string; partition: string; path?: string; signingService?: string; signingRegion?: string; } /** * Options to pass when calling {@link RegionInfoProvider} * * @public */ export interface RegionInfoProviderOptions { /** * Enables IPv6/IPv4 dualstack endpoint. * @defaultValue false */ useDualstackEndpoint: boolean; /** * Enables FIPS compatible endpoints. * @defaultValue false */ useFipsEndpoint: boolean; } /** * Function returns designated service's regionalization * information from given region. Each service client * comes with its regionalization provider. it serves * to provide the default values of related configurations * * @public */ export interface RegionInfoProvider { (region: string, options?: RegionInfoProviderOptions): Promise; } /** * Interface that specifies the retry behavior * * @public */ export interface RetryStrategy { /** * The retry mode describing how the retry strategy control the traffic flow. */ mode?: string; /** * the retry behavior the will invoke the next handler and handle the retry accordingly. * This function should also update the $metadata from the response accordingly. * @see {@link ResponseMetadata} */ retry: ( next: FinalizeHandler, args: FinalizeHandlerArguments ) => Promise>; } /** * Indicates the parameter may be omitted if the parameter object T * is equivalent to a Partial, i.e. all properties optional. * * @public */ export type OptionalParameter = Exact, T> extends true ? [] | [T] : [T]; ================================================ FILE: packages/types/src/waiter.ts ================================================ import type { AbortController as DeprecatedAbortController } from "./abort"; /** * @public */ export interface WaiterConfiguration { /** * Required service client */ client: Client; /** * The amount of time in seconds a user is willing to wait for a waiter to complete. */ maxWaitTime: number; /** * @deprecated Use abortSignal * Abort controller. Used for ending the waiter early. */ abortController?: AbortController | DeprecatedAbortController; /** * Abort Signal. Used for ending the waiter early. */ abortSignal?: AbortController["signal"] | DeprecatedAbortController["signal"]; /** * The minimum amount of time to delay between retries in seconds. This is the * floor of the exponential backoff. This value defaults to service default * if not specified. This value MUST be less than or equal to maxDelay and greater than 0. */ minDelay?: number; /** * The maximum amount of time to delay between retries in seconds. This is the * ceiling of the exponential backoff. This value defaults to service default * if not specified. If specified, this value MUST be greater than or equal to 1. */ maxDelay?: number; } ================================================ FILE: packages/types/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/types/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/types/tsconfig.test.json ================================================ { "compilerOptions": { "baseUrl": ".", "rootDir": "src", "noEmit": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"], "exclude": [] } ================================================ FILE: packages/types/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src", "noCheck": false }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/url-parser/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/url-parser/CHANGELOG.md ================================================ # @smithy/url-parser ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/url-parser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/url-parser/package.json ================================================ { "name": "@smithy/url-parser", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/url-parser", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/url-parser" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/url-parser/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { parseUrl } from "@smithy/core/protocols"; ================================================ FILE: packages/url-parser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/url-parser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/url-parser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-base64/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-base64/CHANGELOG.md ================================================ # @smithy/util-base64 ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-base64/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-base64/package.json ================================================ { "name": "@smithy/util-base64", "version": "4.4.3", "description": "A Base64 <-> UInt8Array converter", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-base64", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-base64" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-base64/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { fromBase64, toBase64 } from "@smithy/core/serde"; ================================================ FILE: packages/util-base64/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-base64/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-base64/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-browser/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-body-length-browser/CHANGELOG.md ================================================ # @smithy/util-body-length-browser ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-body-length-browser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-body-length-browser/package.json ================================================ { "name": "@smithy/util-body-length-browser", "description": "Determines the length of a request body in browsers", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-body-length-browser", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-body-length-browser" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" }, "engines": { "node": ">=18.0.0" } } ================================================ FILE: packages/util-body-length-browser/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { calculateBodyLength } from "@smithy/core/serde"; ================================================ FILE: packages/util-body-length-browser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-browser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": ["dom"], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-browser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-node/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-body-length-node/CHANGELOG.md ================================================ # @smithy/util-body-length-node ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-body-length-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-body-length-node/package.json ================================================ { "name": "@smithy/util-body-length-node", "description": "Determines the length of a request body in node.js", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-body-length-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-body-length-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-body-length-node/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { calculateBodyLength } from "@smithy/core/serde"; ================================================ FILE: packages/util-body-length-node/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-node/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-body-length-node/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-buffer-from/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-buffer-from/CHANGELOG.md ================================================ # @smithy/util-buffer-from ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-buffer-from/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-buffer-from/package.json ================================================ { "name": "@smithy/util-buffer-from", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-buffer-from", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-buffer-from" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-buffer-from/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { fromArrayBuffer, fromString, type StringEncoding } from "@smithy/core/serde"; ================================================ FILE: packages/util-buffer-from/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-buffer-from/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-buffer-from/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-config-provider/CHANGELOG.md ================================================ # @smithy/util-config-provider ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-config-provider/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-config-provider/package.json ================================================ { "name": "@smithy/util-config-provider", "version": "4.3.3", "description": "Utilities package for configuration providers", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "email": "", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-config-provider", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-config-provider" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-config-provider/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { booleanSelector, numberSelector, SelectorType } from "@smithy/core/config"; ================================================ FILE: packages/util-config-provider/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-config-provider/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-config-provider/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-browser/CHANGELOG.md ================================================ # @smithy/util-defaults-mode-browser ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-defaults-mode-browser/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-defaults-mode-browser/package.json ================================================ { "name": "@smithy/util-defaults-mode-browser", "version": "4.4.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-defaults-mode-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-defaults-mode-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-defaults-mode-browser/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { resolveDefaultsModeConfig } from "@smithy/core/config"; export type { ResolveDefaultsModeConfigOptions } from "@smithy/core/config"; ================================================ FILE: packages/util-defaults-mode-browser/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-browser/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-browser/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-node/CHANGELOG.md ================================================ # @smithy/util-defaults-mode-node ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 62fed78: package consolidation for core/config - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-defaults-mode-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-defaults-mode-node/package.json ================================================ { "name": "@smithy/util-defaults-mode-node", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-defaults-mode-node", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-defaults-mode-node" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-defaults-mode-node/src/index.ts ================================================ /** @deprecated Use @smithy/core/config instead. */ export { resolveDefaultsModeConfig } from "@smithy/core/config"; export type { ResolveDefaultsModeConfigOptions } from "@smithy/core/config"; ================================================ FILE: packages/util-defaults-mode-node/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-node/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-defaults-mode-node/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-endpoints/CHANGELOG.md ================================================ # @smithy/util-endpoints ## 3.5.3 ### Patch Changes - @smithy/core@3.24.3 ## 3.5.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 3.5.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 3.5.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols - 9194e9f: consolidate into core/endpoints - 62fed78: package consolidation for core/config ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-endpoints/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-endpoints/package.json ================================================ { "name": "@smithy/util-endpoints", "version": "3.5.3", "description": "Utilities to help with endpoint resolution.", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "keywords": [ "endpoint" ], "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/master/packages/util-endpoints", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-endpoints" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-endpoints/src/index.ts ================================================ /** @deprecated Use @smithy/core/endpoints instead. */ export { BinaryDecisionDiagram, EndpointCache, decideEndpoint, isIpAddress, isValidHostLabel, customEndpointFunctions, resolveEndpoint, EndpointError, } from "@smithy/core/endpoints"; export type { ConditionObject, DeprecatedObject, EndpointFunctions, EndpointObject, EndpointObjectHeaders, EndpointObjectProperties, EndpointParams, EndpointResolverOptions, EndpointRuleObject, ErrorRuleObject, EvaluateOptions, Expression, FunctionArgv, FunctionObject, FunctionReturn, ParameterObject, ReferenceObject, ReferenceRecord, RuleSetObject, RuleSetRules, TreeRuleObject, } from "@smithy/core/endpoints"; ================================================ FILE: packages/util-endpoints/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-endpoints/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-endpoints/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-hex-encoding/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-hex-encoding/CHANGELOG.md ================================================ # @smithy/util-hex-encoding ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-hex-encoding/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-hex-encoding/package.json ================================================ { "name": "@smithy/util-hex-encoding", "version": "4.3.3", "description": "Converts binary buffers to and from lowercase hexadecimal encoding", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-hex-encoding", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-hex-encoding" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-hex-encoding/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { fromHex, toHex } from "@smithy/core/serde"; ================================================ FILE: packages/util-hex-encoding/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-hex-encoding/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-hex-encoding/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-middleware/CHANGELOG.md ================================================ # @smithy/util-middleware ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - f21bf6b: consolidate packages into core/client ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-middleware/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-middleware/package.json ================================================ { "name": "@smithy/util-middleware", "version": "4.3.3", "description": "Shared utilities for to be used in middleware packages.", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "keywords": [ "aws", "middleware" ], "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/master/packages/util-middleware", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-middleware" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-middleware/src/index.ts ================================================ /** @deprecated Use @smithy/core/client instead. */ export { getSmithyContext, normalizeProvider } from "@smithy/core/client"; ================================================ FILE: packages/util-middleware/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-middleware/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-middleware/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-retry/CHANGELOG.md ================================================ # @smithy/util-retry ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-retry/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-retry/package.json ================================================ { "name": "@smithy/util-retry", "version": "4.4.3", "description": "Shared retry utilities to be used in middleware packages.", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "keywords": [ "aws", "retry" ], "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/master/packages/util-retry", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-retry" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-retry/src/index.ts ================================================ /** @deprecated Use @smithy/core/retry instead. */ export { AdaptiveRetryStrategy, ConfiguredRetryStrategy, DefaultRateLimiter, StandardRetryStrategy, DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_DELAY_BASE, DEFAULT_RETRY_MODE, INITIAL_RETRY_TOKENS, INVOCATION_ID_HEADER, MAXIMUM_RETRY_DELAY, REQUEST_HEADER, NO_RETRY_INCREMENT, RETRY_COST, RETRY_MODES, Retry, THROTTLING_RETRY_DELAY_BASE, TIMEOUT_RETRY_COST, } from "@smithy/core/retry"; export type { AdaptiveRetryStrategyOptions, DefaultRateLimiterOptions, RateLimiter, StandardRetryStrategyOptions, } from "@smithy/core/retry"; ================================================ FILE: packages/util-retry/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-retry/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-retry/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-stream/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-stream/CHANGELOG.md ================================================ # @smithy/util-stream ## 4.6.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.6.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.6.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.6.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 8963b91: consolidate packages into core/serde ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-stream/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-stream/package.json ================================================ { "name": "@smithy/util-stream", "version": "4.6.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "browser": {}, "react-native": {}, "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-stream", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-stream" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-stream/src/index.ts ================================================ /** * @deprecated Use @smithy/core/serde instead. */ export { Uint8ArrayBlobAdapter, ChecksumStream, createChecksumStream, createBufferedReadable, getAwsChunkedEncodingStream, headStream, sdkStreamMixin, splitStream, isReadableStream, isBlob, } from "@smithy/core/serde"; export type { ChecksumStreamInit } from "@smithy/core/serde"; ================================================ FILE: packages/util-stream/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-stream/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-stream/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-uri-escape/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-uri-escape/CHANGELOG.md ================================================ # @smithy/util-uri-escape ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 540aeb4: consolidate core/retry and related cleanup - 4f30af1: consolidation for core/protocols ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-uri-escape/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-uri-escape/package.json ================================================ { "name": "@smithy/util-uri-escape", "version": "4.3.3", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-uri-escape", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-uri-escape" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-uri-escape/src/index.ts ================================================ /** @deprecated Use @smithy/core/protocols instead. */ export { escapeUri, escapeUriPath } from "@smithy/core/protocols"; ================================================ FILE: packages/util-uri-escape/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-uri-escape/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-uri-escape/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-utf8/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-utf8/CHANGELOG.md ================================================ # @smithy/util-utf8 ## 4.3.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.3.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.3.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.3.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-utf8/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-utf8/package.json ================================================ { "name": "@smithy/util-utf8", "version": "4.3.3", "description": "A UTF-8 string <-> UInt8Array converter", "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-utf8", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-utf8" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-utf8/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { fromUtf8, toUint8Array, toUtf8 } from "@smithy/core/serde"; export type { StringEncoding } from "@smithy/core/serde"; ================================================ FILE: packages/util-utf8/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-utf8/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-utf8/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/util-waiter/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/util-waiter/CHANGELOG.md ================================================ # @smithy/util-waiter ## 4.4.3 ### Patch Changes - @smithy/core@3.24.3 ## 4.4.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 4.4.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 4.4.0 ### Minor Changes - f21bf6b: consolidate packages into core/client ### Patch Changes - 0be0b36: clean up exported API surface - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/util-waiter/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/util-waiter/package.json ================================================ { "name": "@smithy/util-waiter", "version": "4.4.3", "description": "Shared utilities for client waiters for the AWS SDK", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/util-waiter", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/util-waiter" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/util-waiter/src/index.ts ================================================ /** @deprecated Use @smithy/core/client instead. */ export { createWaiter, waiterServiceDefaults, WaiterState, checkExceptions } from "@smithy/core/client"; export type { WaiterConfiguration, WaiterOptions, WaiterResult } from "@smithy/core/client"; ================================================ FILE: packages/util-waiter/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/util-waiter/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/util-waiter/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: packages/uuid/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: packages/uuid/CHANGELOG.md ================================================ # @smithy/uuid ## 1.2.3 ### Patch Changes - @smithy/core@3.24.3 ## 1.2.2 ### Patch Changes - Updated dependencies [6d4eb8a] - @smithy/core@3.24.2 ## 1.2.1 ### Patch Changes - Updated dependencies [2dc5cf6] - Updated dependencies [1d0ff86] - @smithy/core@3.24.1 ## 1.2.0 ### Minor Changes - 8963b91: consolidate packages into core/serde ### Patch Changes - Updated dependencies [ee92b6b] - Updated dependencies [540aeb4] - Updated dependencies [0be0b36] - Updated dependencies [4f30af1] - Updated dependencies [8963b91] - Updated dependencies [fb323fb] - Updated dependencies [9194e9f] - Updated dependencies [7ec62a0] - Updated dependencies [62fed78] - Updated dependencies [cad44fc] - Updated dependencies [545589a] - Updated dependencies [f21bf6b] - Updated dependencies [7fd6ac0] - @smithy/core@3.24.0 ================================================ FILE: packages/uuid/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: packages/uuid/package.json ================================================ { "name": "@smithy/uuid", "version": "1.2.3", "description": "Polyfill for generating UUID v4", "dependencies": { "@smithy/core": "workspace:^", "tslib": "^2.6.2" }, "scripts": { "build": "yarn g:tsc -p tsconfig.cjs.json && yarn g:tsc -p tsconfig.es.json && yarn g:tsc -p tsconfig.types.json", "build:types": "yarn g:tsc -p tsconfig.types.json", "clean": "rm -rf dist-cjs dist-es dist-types", "stage-release": "rm -rf .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz" }, "author": { "name": "AWS SDK for JavaScript Team", "url": "https://aws.amazon.com/javascript/" }, "license": "Apache-2.0", "sideEffects": false, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "engines": { "node": ">=18.0.0" }, "files": [ "dist-*/**" ], "homepage": "https://github.com/smithy-lang/smithy-typescript/tree/main/packages/uuid", "repository": { "type": "git", "url": "https://github.com/smithy-lang/smithy-typescript.git", "directory": "packages/uuid" }, "typedoc": { "entryPoint": "src/index.ts" }, "publishConfig": { "directory": ".release/package" } } ================================================ FILE: packages/uuid/src/index.ts ================================================ /** @deprecated Use @smithy/core/serde instead. */ export { v4 } from "@smithy/core/serde"; ================================================ FILE: packages/uuid/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src" }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: packages/uuid/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src" }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: packages/uuid/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src" }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: prettier.config.js ================================================ module.exports = { // Custom printWidth: 120, trailingComma: "es5", plugins: ["@ianvs/prettier-plugin-sort-imports"], importOrder: ["", "", "^[.]"], importOrderTypeScriptVersion: "5.0.0", importOrderCaseSensitive: true, }; ================================================ FILE: private/my-local-model/package.json ================================================ { "name": "xyz", "description": "xyz client", "version": "3.24.1", "scripts": { "build": "concurrently 'npm:build:cjs' 'npm:build:es' 'npm:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "prepack": "npm run clean && npm run build", "test": "npx vitest run --passWithNoTests", "test:watch": "npx vitest watch --passWithNoTests", "test:integration": "npx vitest run --passWithNoTests -c vitest.config.integ.mts", "test:integration:watch": "npx vitest watch --passWithNoTests -c vitest.config.integ.mts" }, "main": "./dist-cjs/index.js", "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@smithy/core": "workspace:^", "@smithy/fetch-http-handler": "workspace:^", "@smithy/node-http-handler": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@tsconfig/node20": "20.1.8", "@types/node": "^20.14.8", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typescript": "~5.8.3", "vitest": "^4.0.17" }, "engines": { "node": ">=20.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "private": true, "browser": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.browser" }, "react-native": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.native" } } ================================================ FILE: private/my-local-model/src/XYZService.ts ================================================ // smithy-typescript generated code import { type WaiterResult, createAggregatedClient } from "@smithy/core/client"; import type { HttpHandlerOptions as __HttpHandlerOptions, PaginationConfiguration, Paginator, WaiterConfiguration, } from "@smithy/types"; import { type CamelCaseOperationCommandInput, type CamelCaseOperationCommandOutput, CamelCaseOperationCommand, } from "./commands/CamelCaseOperationCommand"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "./commands/GetNumbersCommand"; import { type HttpLabelCommandCommandInput, type HttpLabelCommandCommandOutput, HttpLabelCommandCommand, } from "./commands/HttpLabelCommandCommand"; import { type TradeEventStreamCommandInput, type TradeEventStreamCommandOutput, TradeEventStreamCommand, } from "./commands/TradeEventStreamCommand"; import type { HaltError } from "./models/errors"; import type { XYZServiceSyntheticServiceException } from "./models/XYZServiceSyntheticServiceException"; import { paginatecamelCaseOperation as paginateCamelCaseOperation } from "./pagination/camelCaseOperationPaginator"; import { paginateGetNumbers } from "./pagination/GetNumbersPaginator"; import { waitUntilNumbersAligned } from "./waiters/waitForNumbersAligned"; import { waitUntilNumbersMisaligned } from "./waiters/waitForNumbersMisaligned"; import { waitUntilNumbersWhatDoTheyDoAnyway } from "./waiters/waitForNumbersWhatDoTheyDoAnyway"; import { XYZServiceClient } from "./XYZServiceClient"; const commands = { HttpLabelCommandCommand, CamelCaseOperationCommand, GetNumbersCommand, TradeEventStreamCommand, }; const paginators = { paginateCamelCaseOperation, paginateGetNumbers, }; const waiters = { waitUntilNumbersAligned, waitUntilNumbersMisaligned, waitUntilNumbersWhatDoTheyDoAnyway, }; export interface XYZService { /** * @see {@link HttpLabelCommandCommand} */ httpLabelCommand( args: HttpLabelCommandCommandInput, options?: __HttpHandlerOptions ): Promise; httpLabelCommand( args: HttpLabelCommandCommandInput, cb: (err: any, data?: HttpLabelCommandCommandOutput) => void ): void; httpLabelCommand( args: HttpLabelCommandCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: HttpLabelCommandCommandOutput) => void ): void; /** * @see {@link CamelCaseOperationCommand} */ camelCaseOperation(): Promise; camelCaseOperation( args: CamelCaseOperationCommandInput, options?: __HttpHandlerOptions ): Promise; camelCaseOperation( args: CamelCaseOperationCommandInput, cb: (err: any, data?: CamelCaseOperationCommandOutput) => void ): void; camelCaseOperation( args: CamelCaseOperationCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: CamelCaseOperationCommandOutput) => void ): void; /** * @see {@link GetNumbersCommand} */ getNumbers(): Promise; getNumbers( args: GetNumbersCommandInput, options?: __HttpHandlerOptions ): Promise; getNumbers( args: GetNumbersCommandInput, cb: (err: any, data?: GetNumbersCommandOutput) => void ): void; getNumbers( args: GetNumbersCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: GetNumbersCommandOutput) => void ): void; /** * @see {@link TradeEventStreamCommand} */ tradeEventStream(): Promise; tradeEventStream( args: TradeEventStreamCommandInput, options?: __HttpHandlerOptions ): Promise; tradeEventStream( args: TradeEventStreamCommandInput, cb: (err: any, data?: TradeEventStreamCommandOutput) => void ): void; tradeEventStream( args: TradeEventStreamCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: TradeEventStreamCommandOutput) => void ): void; /** * @see {@link CamelCaseOperationCommand} * @param args - command input. * @param paginationConfig - optional pagination config. * @returns AsyncIterable of {@link CamelCaseOperationCommandOutput}. */ paginateCamelCaseOperation( args?: CamelCaseOperationCommandInput, paginationConfig?: Omit ): Paginator; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param paginationConfig - optional pagination config. * @returns AsyncIterable of {@link GetNumbersCommandOutput}. */ paginateGetNumbers( args?: GetNumbersCommandInput, paginationConfig?: Omit ): Paginator; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersAligned( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersMisaligned( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersWhatDoTheyDoAnyway( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; } /** * xyz interfaces * @public */ export class XYZService extends XYZServiceClient implements XYZService {} createAggregatedClient(commands, XYZService, { paginators, waiters }); ================================================ FILE: private/my-local-model/src/XYZServiceClient.ts ================================================ // smithy-typescript generated code import { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from "@smithy/core"; import { type DefaultsMode as __DefaultsMode, type SmithyConfiguration as __SmithyConfiguration, type SmithyResolvedConfiguration as __SmithyResolvedConfiguration, Client as __Client, } from "@smithy/core/client"; import { type EndpointInputConfig, type EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/core/endpoints"; import { type EventStreamSerdeInputConfig, type EventStreamSerdeResolvedConfig, resolveEventStreamSerdeConfig, } from "@smithy/core/event-streams"; import { type HttpHandlerUserInput as __HttpHandlerUserInput, getContentLengthPlugin } from "@smithy/core/protocols"; import { type RetryInputConfig, type RetryResolvedConfig, getRetryPlugin, resolveRetryConfig, } from "@smithy/core/retry"; import type { BodyLengthCalculator as __BodyLengthCalculator, CheckOptionalClientConfig as __CheckOptionalClientConfig, ChecksumConstructor as __ChecksumConstructor, Decoder as __Decoder, Encoder as __Encoder, EventStreamSerdeProvider as __EventStreamSerdeProvider, HashConstructor as __HashConstructor, HttpHandlerOptions as __HttpHandlerOptions, Logger as __Logger, Provider as __Provider, StreamCollector as __StreamCollector, UrlParser as __UrlParser, } from "@smithy/types"; import { type HttpAuthSchemeInputConfig, type HttpAuthSchemeResolvedConfig, defaultXYZServiceHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from "./auth/httpAuthSchemeProvider"; import type { CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, } from "./commands/CamelCaseOperationCommand"; import type { GetNumbersCommandInput, GetNumbersCommandOutput } from "./commands/GetNumbersCommand"; import type { HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput } from "./commands/HttpLabelCommandCommand"; import type { TradeEventStreamCommandInput, TradeEventStreamCommandOutput } from "./commands/TradeEventStreamCommand"; import { type ClientInputEndpointParameters, type ClientResolvedEndpointParameters, type EndpointParameters, resolveClientEndpointParameters, } from "./endpoint/EndpointParameters"; import { getRuntimeConfig as __getRuntimeConfig } from "./runtimeConfig"; import { type RuntimeExtension, type RuntimeExtensionsConfig, resolveRuntimeExtensions } from "./runtimeExtensions"; export { __Client }; /** * @public */ export type ServiceInputTypes = | CamelCaseOperationCommandInput | GetNumbersCommandInput | HttpLabelCommandCommandInput | TradeEventStreamCommandInput; /** * @public */ export type ServiceOutputTypes = | CamelCaseOperationCommandOutput | GetNumbersCommandOutput | HttpLabelCommandCommandOutput | TradeEventStreamCommandOutput; /** * @public */ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHandlerOptions>> { /** * The HTTP handler to use or its constructor options. Fetch in browser and Https in Nodejs. */ requestHandler?: __HttpHandlerUserInput; /** * A constructor for a class implementing the {@link @smithy/types#ChecksumConstructor} interface * that computes the SHA-256 HMAC or checksum of a string or binary buffer. * @internal */ sha256?: __ChecksumConstructor | __HashConstructor; /** * The function that will be used to convert strings into HTTP endpoints. * @internal */ urlParser?: __UrlParser; /** * A function that can calculate the length of a request body. * @internal */ bodyLengthChecker?: __BodyLengthCalculator; /** * A function that converts a stream into an array of bytes. * @internal */ streamCollector?: __StreamCollector; /** * The function that will be used to convert a base64-encoded string to a byte array. * @internal */ base64Decoder?: __Decoder; /** * The function that will be used to convert binary data to a base64-encoded string. * @internal */ base64Encoder?: __Encoder; /** * The function that will be used to convert a UTF8-encoded string to a byte array. * @internal */ utf8Decoder?: __Decoder; /** * The function that will be used to convert binary data to a UTF-8 encoded string. * @internal */ utf8Encoder?: __Encoder; /** * The runtime environment. * @internal */ runtime?: string; /** * Disable dynamically changing the endpoint of the client based on the hostPrefix * trait of an operation. */ disableHostPrefix?: boolean; /** * Value for how many times a request will be made at most in case of retry. */ maxAttempts?: number | __Provider; /** * Specifies which retry algorithm to use. * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-smithy-util-retry/Enum/RETRY_MODES/ * */ retryMode?: string | __Provider; /** * Optional logger for logging debug/info/warn/error. */ logger?: __Logger; /** * Optional extensions */ extensions?: RuntimeExtension[]; /** * The function that provides necessary utilities for generating and parsing event stream */ eventStreamSerdeProvider?: __EventStreamSerdeProvider; /** * The {@link @smithy/smithy-client#DefaultsMode} that will be used to determine how certain default configuration options are resolved in the SDK. */ defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>; } /** * @public */ export type XYZServiceClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOptions>> & ClientDefaults & RetryInputConfig & EndpointInputConfig & EventStreamSerdeInputConfig & HttpAuthSchemeInputConfig & ClientInputEndpointParameters; /** * @public * * The configuration interface of XYZServiceClient class constructor that set the region, credentials and other options. */ export interface XYZServiceClientConfig extends XYZServiceClientConfigType {} /** * @public */ export type XYZServiceClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHandlerOptions> & Required & RuntimeExtensionsConfig & RetryResolvedConfig & EndpointResolvedConfig & EventStreamSerdeResolvedConfig & HttpAuthSchemeResolvedConfig & ClientResolvedEndpointParameters; /** * @public * * The resolved configuration interface of XYZServiceClient class. This is resolved and normalized from the {@link XYZServiceClientConfig | constructor configuration interface}. */ export interface XYZServiceClientResolvedConfig extends XYZServiceClientResolvedConfigType {} /** * xyz interfaces * @public */ export class XYZServiceClient extends __Client< __HttpHandlerOptions, ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig > { /** * The resolved configuration of XYZServiceClient class. This is resolved and normalized from the {@link XYZServiceClientConfig | constructor configuration interface}. */ readonly config: XYZServiceClientResolvedConfig; constructor(...[configuration]: __CheckOptionalClientConfig) { const _config_0 = __getRuntimeConfig(configuration || {}); super(_config_0 as any); this.initConfig = _config_0; const _config_1 = resolveClientEndpointParameters(_config_0); const _config_2 = resolveRetryConfig(_config_1); const _config_3 = resolveEndpointConfig(_config_2); const _config_4 = resolveEventStreamSerdeConfig(_config_3); const _config_5 = resolveHttpAuthSchemeConfig(_config_4); const _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []); this.config = _config_6; this.middlewareStack.use(getRetryPlugin(this.config)); this.middlewareStack.use(getContentLengthPlugin(this.config)); this.middlewareStack.use( getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultXYZServiceHttpAuthSchemeParametersProvider, identityProviderConfigProvider: async (config: XYZServiceClientResolvedConfig) => new DefaultIdentityProviderConfig({ "smithy.api#httpApiKeyAuth": config.apiKey, }), }) ); this.middlewareStack.use(getHttpSigningPlugin(this.config)); } /** * Destroy underlying resources, like sockets. It's usually not necessary to do this. * However in Node.js, it's best to explicitly shut down the client's agent when it is no longer needed. * Otherwise, sockets might stay open for quite a long time before the server terminates them. */ destroy(): void { super.destroy(); } } ================================================ FILE: private/my-local-model/src/auth/httpAuthExtensionConfiguration.ts ================================================ // smithy-typescript generated code import type { ApiKeyIdentity, ApiKeyIdentityProvider, HttpAuthScheme } from "@smithy/types"; import type { XYZServiceHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; /** * @internal */ export interface HttpAuthExtensionConfiguration { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void; httpAuthSchemes(): HttpAuthScheme[]; setHttpAuthSchemeProvider(httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider): void; httpAuthSchemeProvider(): XYZServiceHttpAuthSchemeProvider; setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void; apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined; } /** * @internal */ export type HttpAuthRuntimeConfig = Partial<{ httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider; apiKey: ApiKeyIdentity | ApiKeyIdentityProvider; }>; /** * @internal */ export const getHttpAuthExtensionConfiguration = ( runtimeConfig: HttpAuthRuntimeConfig ): HttpAuthExtensionConfiguration => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!; let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!; let _apiKey = runtimeConfig.apiKey; return { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; }, setHttpAuthSchemeProvider(httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): XYZServiceHttpAuthSchemeProvider { return _httpAuthSchemeProvider; }, setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void { _apiKey = apiKey; }, apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined { return _apiKey; }, }; }; /** * @internal */ export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => { return { httpAuthSchemes: config.httpAuthSchemes(), httpAuthSchemeProvider: config.httpAuthSchemeProvider(), apiKey: config.apiKey(), }; }; ================================================ FILE: private/my-local-model/src/auth/httpAuthSchemeProvider.ts ================================================ // smithy-typescript generated code import { doesIdentityRequireRefresh, isIdentityExpired, memoizeIdentityProvider } from "@smithy/core"; import { getSmithyContext, normalizeProvider } from "@smithy/core/client"; import { type ApiKeyIdentity, type ApiKeyIdentityProvider, type HandlerExecutionContext, type HttpAuthOption, type HttpAuthScheme, type HttpAuthSchemeParameters, type HttpAuthSchemeParametersProvider, type HttpAuthSchemeProvider, type Provider, HttpApiKeyAuthLocation, } from "@smithy/types"; import type { XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @internal */ export interface XYZServiceHttpAuthSchemeParameters extends HttpAuthSchemeParameters {} /** * @internal */ export interface XYZServiceHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< XYZServiceClientResolvedConfig, HandlerExecutionContext, XYZServiceHttpAuthSchemeParameters, object > {} /** * @internal */ export const defaultXYZServiceHttpAuthSchemeParametersProvider = async ( config: XYZServiceClientResolvedConfig, context: HandlerExecutionContext, input: object ): Promise => { return { operation: getSmithyContext(context).operation as string, }; }; function createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters: XYZServiceHttpAuthSchemeParameters): HttpAuthOption { return { schemeId: "smithy.api#httpApiKeyAuth", signingProperties: { name: "X-Api-Key", in: HttpApiKeyAuthLocation.HEADER, scheme: undefined, }, }; } /** * @internal */ export interface XYZServiceHttpAuthSchemeProvider extends HttpAuthSchemeProvider {} /** * @internal */ export const defaultXYZServiceHttpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider = (authParameters) => { const options: HttpAuthOption[] = []; switch (authParameters.operation) { default: { options.push(createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters)); } } return options; }; /** * @public */ export interface HttpAuthSchemeInputConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ authSchemePreference?: string[] | Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ httpAuthSchemes?: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ httpAuthSchemeProvider?: XYZServiceHttpAuthSchemeProvider; /** * The API key to use when making requests. */ apiKey?: ApiKeyIdentity | ApiKeyIdentityProvider; } /** * @internal */ export interface HttpAuthSchemeResolvedConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ readonly authSchemePreference: Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ readonly httpAuthSchemes: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ readonly httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider; /** * The API key to use when making requests. */ readonly apiKey?: ApiKeyIdentityProvider; } /** * @internal */ export const resolveHttpAuthSchemeConfig = ( config: T & HttpAuthSchemeInputConfig ): T & HttpAuthSchemeResolvedConfig => { const apiKey = memoizeIdentityProvider(config.apiKey, isIdentityExpired, doesIdentityRequireRefresh); return Object.assign(config, { authSchemePreference: normalizeProvider(config.authSchemePreference ?? []), apiKey, }) as T & HttpAuthSchemeResolvedConfig; }; ================================================ FILE: private/my-local-model/src/commands/CamelCaseOperationCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { CamelCaseOperationInput, CamelCaseOperationOutput } from "../models/models_0"; import { de_CamelCaseOperationCommand, se_CamelCaseOperationCommand } from "../protocols/Rpcv2cbor"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link CamelCaseOperationCommand}. */ export interface CamelCaseOperationCommandInput extends CamelCaseOperationInput {} /** * @public * * The output of {@link CamelCaseOperationCommand}. */ export interface CamelCaseOperationCommandOutput extends CamelCaseOperationOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, CamelCaseOperationCommand } from "xyz"; // ES Modules import * // const { XYZServiceClient, CamelCaseOperationCommand } = require("xyz"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // camelCaseOperationInput * token: "STRING_VALUE", * }; * const command = new CamelCaseOperationCommand(input); * const response = await client.send(command); * // { // camelCaseOperationOutput * // token: "STRING_VALUE", * // results: [ // Blobs * // new Uint8Array(), * // ], * // }; * * ``` * * @param CamelCaseOperationCommandInput - {@link CamelCaseOperationCommandInput} * @returns {@link CamelCaseOperationCommandOutput} * @see {@link CamelCaseOperationCommandInput} for command's `input` shape. * @see {@link CamelCaseOperationCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class CamelCaseOperationCommand extends $Command .classBuilder< CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("XYZService", "camelCaseOperation", {}) .n("XYZServiceClient", "CamelCaseOperationCommand") .f(void 0, void 0) .ser(se_CamelCaseOperationCommand) .de(de_CamelCaseOperationCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: CamelCaseOperationInput; output: CamelCaseOperationOutput; }; sdk: { input: CamelCaseOperationCommandInput; output: CamelCaseOperationCommandOutput; }; }; } ================================================ FILE: private/my-local-model/src/commands/GetNumbersCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { GetNumbersRequest, GetNumbersResponse } from "../models/models_0"; import { de_GetNumbersCommand, se_GetNumbersCommand } from "../protocols/Rpcv2cbor"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link GetNumbersCommand}. */ export interface GetNumbersCommandInput extends GetNumbersRequest {} /** * @public * * The output of {@link GetNumbersCommand}. */ export interface GetNumbersCommandOutput extends GetNumbersResponse, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, GetNumbersCommand } from "xyz"; // ES Modules import * // const { XYZServiceClient, GetNumbersCommand } = require("xyz"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // GetNumbersRequest * bigDecimal: Number("bigdecimal"), * bigInteger: Number("bigint"), * fieldWithoutMessage: "STRING_VALUE", * fieldWithMessage: "STRING_VALUE", * startToken: "STRING_VALUE", * maxResults: Number("int"), * customHeaderInput: "STRING_VALUE", * numbers: { // IntegerMap * "": Number("int"), * }, * sparseNumbers: { // SparseIntegerMap * "": Number("int"), * }, * }; * const command = new GetNumbersCommand(input); * const response = await client.send(command); * // { // GetNumbersResponse * // bigDecimal: Number("bigdecimal"), * // bigInteger: Number("bigint"), * // numbers: [ // IntegerList * // Number("int"), * // ], * // sparseNumbers: [ // SparseIntegerList * // Number("int"), * // ], * // nextToken: "STRING_VALUE", * // deprecatedNumbers: [ * // Number("int"), * // ], * // deprecatedNumbersWithoutExplanation: [ * // Number("int"), * // ], * // deprecatedNumbersWithoutChronology: [ * // Number("int"), * // ], * // inexplicablyDeprecatedNumbers: [ * // Number("int"), * // ], * // }; * * ``` * * @param GetNumbersCommandInput - {@link GetNumbersCommandInput} * @returns {@link GetNumbersCommandOutput} * @see {@link GetNumbersCommandInput} for command's `input` shape. * @see {@link GetNumbersCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link CodedThrottlingError} (client fault) * * @throws {@link MysteryThrottlingError} (client fault) * * @throws {@link RetryableError} (client fault) * * @throws {@link HaltError} (client fault) * * @throws {@link XYZServiceServiceException} (client fault) * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class GetNumbersCommand extends $Command .classBuilder< GetNumbersCommandInput, GetNumbersCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep({ ...commonParams, CustomHeaderValue: { type: "contextParams", name: "customHeaderInput" }, }) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("XYZService", "GetNumbers", {}) .n("XYZServiceClient", "GetNumbersCommand") .f(void 0, void 0) .ser(se_GetNumbersCommand) .de(de_GetNumbersCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: GetNumbersRequest; output: GetNumbersResponse; }; sdk: { input: GetNumbersCommandInput; output: GetNumbersCommandOutput; }; }; } ================================================ FILE: private/my-local-model/src/commands/HttpLabelCommandCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { HttpLabelCommandInput, HttpLabelCommandOutput } from "../models/models_0"; import { de_HttpLabelCommandCommand, se_HttpLabelCommandCommand } from "../protocols/Rpcv2cbor"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link HttpLabelCommandCommand}. */ export interface HttpLabelCommandCommandInput extends HttpLabelCommandInput {} /** * @public * * The output of {@link HttpLabelCommandCommand}. */ export interface HttpLabelCommandCommandOutput extends HttpLabelCommandOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, HttpLabelCommandCommand } from "xyz"; // ES Modules import * // const { XYZServiceClient, HttpLabelCommandCommand } = require("xyz"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // HttpLabelCommandInput * LabelDoesNotApplyToRpcProtocol: "STRING_VALUE", // required * }; * const command = new HttpLabelCommandCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param HttpLabelCommandCommandInput - {@link HttpLabelCommandCommandInput} * @returns {@link HttpLabelCommandCommandOutput} * @see {@link HttpLabelCommandCommandInput} for command's `input` shape. * @see {@link HttpLabelCommandCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class HttpLabelCommandCommand extends $Command .classBuilder< HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("XYZService", "HttpLabelCommand", {}) .n("XYZServiceClient", "HttpLabelCommandCommand") .f(void 0, void 0) .ser(se_HttpLabelCommandCommand) .de(de_HttpLabelCommandCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: HttpLabelCommandInput; output: {}; }; sdk: { input: HttpLabelCommandCommandInput; output: HttpLabelCommandCommandOutput; }; }; } ================================================ FILE: private/my-local-model/src/commands/TradeEventStreamCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import { type TradeEventStreamRequest, type TradeEventStreamResponse, TradeEventStreamRequestFilterSensitiveLog, TradeEventStreamResponseFilterSensitiveLog, } from "../models/models_0"; import { de_TradeEventStreamCommand, se_TradeEventStreamCommand } from "../protocols/Rpcv2cbor"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link TradeEventStreamCommand}. */ export interface TradeEventStreamCommandInput extends TradeEventStreamRequest {} /** * @public * * The output of {@link TradeEventStreamCommand}. */ export interface TradeEventStreamCommandOutput extends TradeEventStreamResponse, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, TradeEventStreamCommand } from "xyz"; // ES Modules import * // const { XYZServiceClient, TradeEventStreamCommand } = require("xyz"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // TradeEventStreamRequest * eventStream: { // TradeEvents Union: only one key present * alpha: { // Alpha * id: "STRING_VALUE", * timestamp: new Date("TIMESTAMP"), * }, * beta: {}, * gamma: {}, * delta: { // DifferentShapeName * name: "STRING_VALUE", * number: Number("int"), * }, * }, * }; * const command = new TradeEventStreamCommand(input); * const response = await client.send(command); * // { // TradeEventStreamResponse * // eventStream: { // TradeEvents Union: only one key present * // alpha: { // Alpha * // id: "STRING_VALUE", * // timestamp: new Date("TIMESTAMP"), * // }, * // beta: {}, * // gamma: {}, * // delta: { // DifferentShapeName * // name: "STRING_VALUE", * // number: Number("int"), * // }, * // }, * // }; * * ``` * * @param TradeEventStreamCommandInput - {@link TradeEventStreamCommandInput} * @returns {@link TradeEventStreamCommandOutput} * @see {@link TradeEventStreamCommandInput} for command's `input` shape. * @see {@link TradeEventStreamCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class TradeEventStreamCommand extends $Command .classBuilder< TradeEventStreamCommandInput, TradeEventStreamCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("XYZService", "TradeEventStream", { /** * @internal */ eventStream: { input: true, output: true, }, }) .n("XYZServiceClient", "TradeEventStreamCommand") .f(TradeEventStreamRequestFilterSensitiveLog, TradeEventStreamResponseFilterSensitiveLog) .ser(se_TradeEventStreamCommand) .de(de_TradeEventStreamCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: TradeEventStreamRequest; output: TradeEventStreamResponse; }; sdk: { input: TradeEventStreamCommandInput; output: TradeEventStreamCommandOutput; }; }; } ================================================ FILE: private/my-local-model/src/commands/index.ts ================================================ // smithy-typescript generated code export * from "./CamelCaseOperationCommand"; export * from "./GetNumbersCommand"; export * from "./HttpLabelCommandCommand"; export * from "./TradeEventStreamCommand"; ================================================ FILE: private/my-local-model/src/endpoint/EndpointParameters.ts ================================================ // smithy-typescript generated code import type { Endpoint, EndpointParameters as __EndpointParameters, EndpointV2, Provider } from "@smithy/types"; /** * @public */ export interface ClientInputEndpointParameters { clientContextParams?: { apiKey?: string | undefined | Provider; region?: string | undefined | Provider; customParam?: string | undefined | Provider; enableFeature?: boolean | undefined | Provider; debugMode?: boolean | undefined | Provider; nonConflictingParam?: string | undefined | Provider; logger?: string | undefined | Provider; }; endpoint?: string | Provider | Endpoint | Provider | EndpointV2 | Provider; customParam?: string | undefined | Provider; enableFeature?: boolean | undefined | Provider; debugMode?: boolean | undefined | Provider; nonConflictingParam?: string | undefined | Provider; } /** * @public */ export type ClientResolvedEndpointParameters = Omit & { defaultSigningName: string; }; /** * @internal */ const clientContextParamDefaults = { logger: "default-logger", } as const; /** * @internal */ export const resolveClientEndpointParameters = ( options: T & ClientInputEndpointParameters ): T & ClientResolvedEndpointParameters => { return Object.assign(options, { customParam: options.customParam ?? "default-custom-value", enableFeature: options.enableFeature ?? true, debugMode: options.debugMode ?? false, nonConflictingParam: options.nonConflictingParam ?? "non-conflict-default", defaultSigningName: "", clientContextParams: Object.assign(clientContextParamDefaults, options.clientContextParams), }); }; /** * @internal */ export const commonParams = { ApiKey: { type: "clientContextParams", name: "apiKey" }, nonConflictingParam: { type: "clientContextParams", name: "nonConflictingParam" }, logger: { type: "clientContextParams", name: "logger" }, region: { type: "clientContextParams", name: "region" }, customParam: { type: "clientContextParams", name: "customParam" }, debugMode: { type: "clientContextParams", name: "debugMode" }, enableFeature: { type: "clientContextParams", name: "enableFeature" }, endpoint: { type: "builtInParams", name: "endpoint" }, } as const; /** * @internal */ export interface EndpointParameters extends __EndpointParameters { endpoint?: string | undefined; ApiKey?: string | undefined; region?: string | undefined; customParam?: string | undefined; enableFeature?: boolean | undefined; debugMode?: boolean | undefined; nonConflictingParam?: string | undefined; logger?: string | undefined; CustomHeaderValue?: string | undefined; } ================================================ FILE: private/my-local-model/src/endpoint/bdd.ts ================================================ // smithy-typescript generated code import { BinaryDecisionDiagram } from "@smithy/core/endpoints"; const d="x-api-key"; const a="isSet", b="{endpoint}", c=["{ApiKey}"]; const _data={ conditions: [ [a,[{ref:"endpoint"}]], [a,[{ref:"ApiKey"}]], [a,[{ref:"CustomHeaderValue"}]] ], results: [ [-1], [b,{},{[d]:c,"x-custom-header":["{CustomHeaderValue}"]}], [b,{},{[d]:c}], [b,{}], [-1,"endpoint is not set - you must configure an endpoint."] ] }; const root = 2; const r = 100_000_000; const nodes = new Int32Array([ -1, 1, -1, 0, 3, r + 4, 1, 4, r + 3, 2, r + 1, r + 2, ]); export const bdd = BinaryDecisionDiagram.from( nodes, root, _data.conditions, _data.results ); ================================================ FILE: private/my-local-model/src/endpoint/endpointResolver.ts ================================================ // smithy-typescript generated code import { type EndpointParams, decideEndpoint, EndpointCache } from "@smithy/core/endpoints"; import type { EndpointV2, Logger } from "@smithy/types"; import { bdd } from "./bdd"; import type { EndpointParameters } from "./EndpointParameters"; const cache = new EndpointCache({ size: 50, params: ["ApiKey", "CustomHeaderValue", "endpoint"], }); /** * @internal */ export const defaultEndpointResolver = ( endpointParams: EndpointParameters, context: { logger?: Logger } = {} ): EndpointV2 => { return cache.get(endpointParams as EndpointParams, () => decideEndpoint(bdd, { endpointParams: endpointParams as EndpointParams, logger: context.logger, }) ); }; ================================================ FILE: private/my-local-model/src/extensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpHandlerExtensionConfiguration } from "@smithy/core/protocols"; import type { DefaultExtensionConfiguration } from "@smithy/types"; import type { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration"; /** * @internal */ export interface XYZServiceExtensionConfiguration extends HttpHandlerExtensionConfiguration, DefaultExtensionConfiguration, HttpAuthExtensionConfiguration {} ================================================ FILE: private/my-local-model/src/index.ts ================================================ // smithy-typescript generated code /* eslint-disable */ /** * xyz interfaces * * @packageDocumentation */ export * from "./XYZServiceClient"; export * from "./XYZService"; export type { ClientInputEndpointParameters } from "./endpoint/EndpointParameters"; export type { RuntimeExtension } from "./runtimeExtensions"; export type { XYZServiceExtensionConfiguration } from "./extensionConfiguration"; export * from "./commands"; export * from "./pagination"; export * from "./waiters"; export * from "./models/errors"; export * from "./models/models_0"; export { XYZServiceSyntheticServiceException } from "./models/XYZServiceSyntheticServiceException"; ================================================ FILE: private/my-local-model/src/models/XYZServiceSyntheticServiceException.ts ================================================ // smithy-typescript generated code import { type ServiceExceptionOptions as __ServiceExceptionOptions, ServiceException as __ServiceException, } from "@smithy/core/client"; export type { __ServiceExceptionOptions }; export { __ServiceException }; /** * @public * * Base exception class for all service exceptions from XYZService service. */ export class XYZServiceSyntheticServiceException extends __ServiceException { /** * @internal */ constructor(options: __ServiceExceptionOptions) { super(options); Object.setPrototypeOf(this, XYZServiceSyntheticServiceException.prototype); } } ================================================ FILE: private/my-local-model/src/models/errors.ts ================================================ // smithy-typescript generated code import type { ExceptionOptionType as __ExceptionOptionType } from "@smithy/core/client"; import { XYZServiceSyntheticServiceException as __BaseException } from "./XYZServiceSyntheticServiceException"; /** * @public */ export class MainServiceLinkedError extends __BaseException { readonly name = "MainServiceLinkedError" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "MainServiceLinkedError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, MainServiceLinkedError.prototype); } } /** * @public */ export class CodedThrottlingError extends __BaseException { readonly name = "CodedThrottlingError" as const; readonly $fault = "client" as const; $retryable = { throttling: true, }; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "CodedThrottlingError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, CodedThrottlingError.prototype); } } /** * @public */ export class HaltError extends __BaseException { readonly name = "HaltError" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "HaltError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, HaltError.prototype); } } /** * @public */ export class MysteryThrottlingError extends __BaseException { readonly name = "MysteryThrottlingError" as const; readonly $fault = "client" as const; $retryable = { throttling: true, }; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "MysteryThrottlingError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, MysteryThrottlingError.prototype); } } /** * @public */ export class RetryableError extends __BaseException { readonly name = "RetryableError" as const; readonly $fault = "client" as const; $retryable = {}; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "RetryableError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, RetryableError.prototype); } } /** * @public */ export class XYZServiceServiceException extends __BaseException { readonly name = "XYZServiceServiceException" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "XYZServiceServiceException", $fault: "client", ...opts, }); Object.setPrototypeOf(this, XYZServiceServiceException.prototype); } } ================================================ FILE: private/my-local-model/src/models/models_0.ts ================================================ // smithy-typescript generated code import type { NumericValue } from "@smithy/core/serde"; /** * @public */ export interface HttpLabelCommandInput { LabelDoesNotApplyToRpcProtocol: string | undefined; } /** * @public */ export interface HttpLabelCommandOutput {} /** * @public */ export interface Alpha { id?: string | undefined; timestamp?: Date | undefined; } /** * @public */ export interface CamelCaseOperationInput { token?: string | undefined; } /** * @public */ export interface CamelCaseOperationOutput { token?: string | undefined; results?: Uint8Array[] | undefined; } /** * @public */ export interface DifferentShapeName { name?: string | undefined; number?: number | undefined; } /** * @public */ export interface GetNumbersRequest { bigDecimal?: NumericValue | undefined; bigInteger?: bigint | undefined; /** * This is deprecated documentation annotation. * * @deprecated deprecated. * @public */ fieldWithoutMessage?: string | undefined; /** * This is deprecated documentation annotation. * * @deprecated (since 3.0) This field has been deprecated. * @public */ fieldWithMessage?: string | undefined; startToken?: string | undefined; maxResults?: number | undefined; customHeaderInput?: string | undefined; numbers?: Record | undefined; sparseNumbers?: Record | undefined; } /** * @public */ export interface GetNumbersResponse { bigDecimal?: NumericValue | undefined; bigInteger?: bigint | undefined; numbers?: number[] | undefined; sparseNumbers?: (number | null)[] | undefined; nextToken?: string | undefined; /** * This is deprecated documentation annotation. * * @deprecated (since 1685-12-31) these numbers are not used anymore. * @public */ deprecatedNumbers?: number[] | undefined; /** * This is deprecated documentation annotation. * * @deprecated since 1685-12-31. * @public */ deprecatedNumbersWithoutExplanation?: number[] | undefined; /** * @deprecated these numbers are not used anymore?? * @public */ deprecatedNumbersWithoutChronology?: number[] | undefined; /** * @deprecated deprecated. * @public */ inexplicablyDeprecatedNumbers?: number[] | undefined; } /** * @public */ export interface Unit {} /** * @public */ export type TradeEvents = | TradeEvents.AlphaMember | TradeEvents.BetaMember | TradeEvents.DeltaMember | TradeEvents.GammaMember | TradeEvents.$UnknownMember; /** * @public */ export namespace TradeEvents { export interface AlphaMember { alpha: Alpha; beta?: never; gamma?: never; delta?: never; $unknown?: never; } export interface BetaMember { alpha?: never; beta: Unit; gamma?: never; delta?: never; $unknown?: never; } export interface GammaMember { alpha?: never; beta?: never; gamma: Unit; delta?: never; $unknown?: never; } export interface DeltaMember { alpha?: never; beta?: never; gamma?: never; delta: DifferentShapeName; $unknown?: never; } /** * @public */ export interface $UnknownMember { alpha?: never; beta?: never; gamma?: never; delta?: never; $unknown: [string, any]; } export interface Visitor { alpha: (value: Alpha) => T; beta: (value: Unit) => T; gamma: (value: Unit) => T; delta: (value: DifferentShapeName) => T; _: (name: string, value: any) => T; } export const visit = (value: TradeEvents, visitor: Visitor): T => { if (value.alpha !== undefined) return visitor.alpha(value.alpha); if (value.beta !== undefined) return visitor.beta(value.beta); if (value.gamma !== undefined) return visitor.gamma(value.gamma); if (value.delta !== undefined) return visitor.delta(value.delta); return visitor._(value.$unknown[0], value.$unknown[1]); }; } /** * @internal */ export const TradeEventsFilterSensitiveLog = (obj: TradeEvents): any => { if (obj.alpha !== undefined) { return { alpha: obj.alpha }; } if (obj.beta !== undefined) { return { beta: obj.beta }; } if (obj.gamma !== undefined) { return { gamma: obj.gamma }; } if (obj.delta !== undefined) { return { delta: obj.delta }; } if (obj.$unknown !== undefined) return { [obj.$unknown[0]]: "UNKNOWN" }; } /** * @public */ export interface TradeEventStreamRequest { eventStream?: AsyncIterable | undefined; } /** * @internal */ export const TradeEventStreamRequestFilterSensitiveLog = (obj: TradeEventStreamRequest): any => ({ ...obj, ...(obj.eventStream && { eventStream: 'STREAMING_CONTENT' }), }) /** * @public */ export interface TradeEventStreamResponse { eventStream?: AsyncIterable | undefined; } /** * @internal */ export const TradeEventStreamResponseFilterSensitiveLog = (obj: TradeEventStreamResponse): any => ({ ...obj, ...(obj.eventStream && { eventStream: 'STREAMING_CONTENT' }), }) ================================================ FILE: private/my-local-model/src/pagination/GetNumbersPaginator.ts ================================================ // smithy-typescript generated code import { createPaginator } from "@smithy/core"; import type { Paginator } from "@smithy/types"; import { GetNumbersCommand, GetNumbersCommandInput, GetNumbersCommandOutput } from "../commands/GetNumbersCommand"; import { XYZServiceClient } from "../XYZServiceClient"; import type { XYZServicePaginationConfiguration } from "./Interfaces"; /** * @public */ export const paginateGetNumbers: ( config: XYZServicePaginationConfiguration, input: GetNumbersCommandInput, ...rest: any[] ) => Paginator = createPaginator< XYZServicePaginationConfiguration, GetNumbersCommandInput, GetNumbersCommandOutput >(XYZServiceClient, GetNumbersCommand, "startToken", "nextToken", "maxResults"); ================================================ FILE: private/my-local-model/src/pagination/Interfaces.ts ================================================ // smithy-typescript generated code import type { PaginationConfiguration } from "@smithy/types"; import { XYZServiceClient } from "../XYZServiceClient"; /** * @public */ export interface XYZServicePaginationConfiguration extends PaginationConfiguration { client: XYZServiceClient; } ================================================ FILE: private/my-local-model/src/pagination/camelCaseOperationPaginator.ts ================================================ // smithy-typescript generated code import { createPaginator } from "@smithy/core"; import type { Paginator } from "@smithy/types"; import { CamelCaseOperationCommand, CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, } from "../commands/CamelCaseOperationCommand"; import { XYZServiceClient } from "../XYZServiceClient"; import type { XYZServicePaginationConfiguration } from "./Interfaces"; /** * @public */ export const paginatecamelCaseOperation: ( config: XYZServicePaginationConfiguration, input: CamelCaseOperationCommandInput, ...rest: any[] ) => Paginator = createPaginator< XYZServicePaginationConfiguration, CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput >(XYZServiceClient, CamelCaseOperationCommand, "token", "token", ""); ================================================ FILE: private/my-local-model/src/pagination/index.ts ================================================ // smithy-typescript generated code export * from "./Interfaces"; export * from "./camelCaseOperationPaginator"; export * from "./GetNumbersPaginator"; ================================================ FILE: private/my-local-model/src/protocols/Rpcv2cbor.ts ================================================ // smithy-typescript generated code import { buildHttpRpcRequest, cbor, checkCborResponse as cr, dateToTag as __dateToTag, loadSmithyRpcV2CborErrorCode, parseCborBody as parseBody, parseCborErrorBody as parseErrorBody, } from "@smithy/core/cbor"; import { _json, decorateServiceException as __decorateServiceException, take, withBaseException, } from "@smithy/core/client"; import { type HttpRequest as __HttpRequest, type HttpResponse as __HttpResponse, collectBody, } from "@smithy/core/protocols"; import { expectInt32 as __expectInt32, expectNonNull as __expectNonNull, expectString as __expectString, nv as __nv, parseEpochTimestamp as __parseEpochTimestamp, } from "@smithy/core/serde"; import type { Endpoint as __Endpoint, EventStreamSerdeContext as __EventStreamSerdeContext, HeaderBag as __HeaderBag, Message as __Message, MessageHeaders as __MessageHeaders, ResponseMetadata as __ResponseMetadata, SerdeContext as __SerdeContext, } from "@smithy/types"; import type { CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, } from "../commands/CamelCaseOperationCommand"; import type { GetNumbersCommandInput, GetNumbersCommandOutput } from "../commands/GetNumbersCommand"; import type { HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput } from "../commands/HttpLabelCommandCommand"; import type { TradeEventStreamCommandInput, TradeEventStreamCommandOutput } from "../commands/TradeEventStreamCommand"; import { CodedThrottlingError, HaltError, MainServiceLinkedError, MysteryThrottlingError, RetryableError, XYZServiceServiceException, } from "../models/errors"; import { type Alpha, type CamelCaseOperationInput, type CamelCaseOperationOutput, type DifferentShapeName, type GetNumbersRequest, type GetNumbersResponse, type HttpLabelCommandInput, type Unit, TradeEvents, } from "../models/models_0"; import { XYZServiceSyntheticServiceException as __BaseException } from "../models/XYZServiceSyntheticServiceException"; /** * serializeRpcv2cborHttpLabelCommandCommand */ export const se_HttpLabelCommandCommand = async ( input: HttpLabelCommandCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(_json(input)); return buildHttpRpcRequest(context, headers, "/service/XYZService/operation/HttpLabelCommand", undefined, body); }; /** * serializeRpcv2cborCamelCaseOperationCommand */ export const se_CamelCaseOperationCommand = async ( input: CamelCaseOperationCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(_json(input)); return buildHttpRpcRequest(context, headers, "/service/XYZService/operation/camelCaseOperation", undefined, body); }; /** * serializeRpcv2cborGetNumbersCommand */ export const se_GetNumbersCommand = async ( input: GetNumbersCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_GetNumbersRequest(input, context)); return buildHttpRpcRequest(context, headers, "/service/XYZService/operation/GetNumbers", undefined, body); }; /** * serializeRpcv2cborTradeEventStreamCommand */ export const se_TradeEventStreamCommand = async ( input: TradeEventStreamCommandInput, context: __SerdeContext & __EventStreamSerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = { ...SHARED_HEADERS }; headers.accept = "application/vnd.amazon.eventstream"; headers["content-type"] = "application/vnd.amazon.eventstream"; let body: any; body = se_TradeEvents(input.eventStream, context); return buildHttpRpcRequest(context, headers, "/service/XYZService/operation/TradeEventStream", undefined, body); }; /** * deserializeRpcv2cborHttpLabelCommandCommand */ export const de_HttpLabelCommandCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = _json(data); const response: HttpLabelCommandCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborCamelCaseOperationCommand */ export const de_CamelCaseOperationCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_CamelCaseOperationOutput(data, context); const response: CamelCaseOperationCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborGetNumbersCommand */ export const de_GetNumbersCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_GetNumbersResponse(data, context); const response: GetNumbersCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborTradeEventStreamCommand */ export const de_TradeEventStreamCommand = async ( output: __HttpResponse, context: __SerdeContext & __EventStreamSerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const contents = { eventStream: de_TradeEvents(output.body, context) }; const response: TradeEventStreamCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserialize_Rpcv2cborCommandError */ const de_CommandError = async ( output: __HttpResponse, context: __SerdeContext, ): Promise => { const parsedOutput: any = { ...output, body: await parseErrorBody(output.body, context) }; const errorCode = loadSmithyRpcV2CborErrorCode(output, parsedOutput.body); switch (errorCode) { case "MainServiceLinkedError": case "org.xyz.v1#MainServiceLinkedError": throw await de_MainServiceLinkedErrorRes(parsedOutput, context); case "CodedThrottlingError": case "org.xyz.v1#CodedThrottlingError": throw await de_CodedThrottlingErrorRes(parsedOutput, context); case "HaltError": case "org.xyz.v1#HaltError": throw await de_HaltErrorRes(parsedOutput, context); case "MysteryThrottlingError": case "org.xyz.v1#MysteryThrottlingError": throw await de_MysteryThrottlingErrorRes(parsedOutput, context); case "RetryableError": case "org.xyz.v1#RetryableError": throw await de_RetryableErrorRes(parsedOutput, context); case "XYZServiceServiceException": case "org.xyz.v1#XYZServiceServiceException": throw await de_XYZServiceServiceExceptionRes(parsedOutput, context); default: const parsedBody = parsedOutput.body; return throwDefaultError({ output, parsedBody, errorCode }) as never; } } /** * deserializeRpcv2cborCodedThrottlingErrorRes */ const de_CodedThrottlingErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new CodedThrottlingError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborHaltErrorRes */ const de_HaltErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new HaltError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborMainServiceLinkedErrorRes */ const de_MainServiceLinkedErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new MainServiceLinkedError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborMysteryThrottlingErrorRes */ const de_MysteryThrottlingErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new MysteryThrottlingError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborRetryableErrorRes */ const de_RetryableErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new RetryableError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborXYZServiceServiceExceptionRes */ const de_XYZServiceServiceExceptionRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new XYZServiceServiceException({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * serializeRpcv2cborTradeEvents */ const se_TradeEvents = ( input: any, context: __SerdeContext & __EventStreamSerdeContext ): any => { const eventMarshallingVisitor = (event: any): __Message => TradeEvents.visit(event, { alpha: value => se_Alpha_event(value, context), beta: value => se_Unit_event(value, context), gamma: value => se_Unit_event(value, context), delta: value => se_DifferentShapeName_event(value, context), _: value => value as any }); return context.eventStreamMarshaller.serialize(input, eventMarshallingVisitor); } const se_Alpha_event = ( input: Alpha, context: __SerdeContext ): __Message => { const headers: __MessageHeaders = { ":event-type": { type: "string", value: "alpha" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, } let body = new Uint8Array(); body = se_Alpha(input, context); body = cbor.serialize(body); return { headers, body }; } const se_DifferentShapeName_event = ( input: DifferentShapeName, context: __SerdeContext ): __Message => { const headers: __MessageHeaders = { ":event-type": { type: "string", value: "delta" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, } let body = new Uint8Array(); body = _json(input); body = cbor.serialize(body); return { headers, body }; } const se_Unit_event = ( input: Unit, context: __SerdeContext ): __Message => { const headers: __MessageHeaders = { ":event-type": { type: "string", value: "beta" }, ":message-type": { type: "string", value: "event" }, ":content-type": { type: "string", value: "application/cbor" }, } let body = new Uint8Array(); body = _json(input); body = cbor.serialize(body); return { headers, body }; } /** * deserializeRpcv2cborTradeEvents */ const de_TradeEvents = ( output: any, context: __SerdeContext & __EventStreamSerdeContext ): AsyncIterable => { return context.eventStreamMarshaller.deserialize( output, async event => { if (event["alpha"] != null) { return { alpha: await de_Alpha_event(event["alpha"], context), }; } if (event["beta"] != null) { return { beta: await de_Unit_event(event["beta"], context), }; } if (event["gamma"] != null) { return { gamma: await de_Unit_event(event["gamma"], context), }; } if (event["delta"] != null) { return { delta: await de_DifferentShapeName_event(event["delta"], context), }; } return {$unknown: event as any}; } ); } const de_Alpha_event = async ( output: any, context: __SerdeContext ): Promise => { const contents: Alpha = {} as any; const data: any = await parseBody(output.body, context); Object.assign(contents, de_Alpha(data, context)); return contents; } const de_DifferentShapeName_event = async ( output: any, context: __SerdeContext ): Promise => { const contents: DifferentShapeName = {} as any; const data: any = await parseBody(output.body, context); Object.assign(contents, _json(data)); return contents; } const de_Unit_event = async ( output: any, context: __SerdeContext ): Promise => { const contents: Unit = {} as any; const data: any = await parseBody(output.body, context); Object.assign(contents, _json(data)); return contents; } // se_HttpLabelCommandInput omitted. /** * serializeRpcv2cborAlpha */ const se_Alpha = ( input: Alpha, context: __SerdeContext ): any => { return take(input, { 'id': [], 'timestamp': __dateToTag, }); } // se_CamelCaseOperationInput omitted. // se_DifferentShapeName omitted. /** * serializeRpcv2cborGetNumbersRequest */ const se_GetNumbersRequest = ( input: GetNumbersRequest, context: __SerdeContext ): any => { return take(input, { 'bigDecimal': __nv, 'bigInteger': [], 'customHeaderInput': [], 'fieldWithMessage': [], 'fieldWithoutMessage': [], 'maxResults': [], 'numbers': _json, 'sparseNumbers': _ => se_SparseIntegerMap(_, context), 'startToken': [], }); } // se_IntegerMap omitted. /** * serializeRpcv2cborSparseIntegerMap */ const se_SparseIntegerMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = value; } else { acc[key] = null as any; } return acc; }, {}); } // se_Unit omitted. // de_HttpLabelCommandOutput omitted. /** * deserializeRpcv2cborAlpha */ const de_Alpha = ( output: any, context: __SerdeContext ): Alpha => { return take(output, { 'id': __expectString, 'timestamp': (_: any) => __expectNonNull(__parseEpochTimestamp(_)), }) as any; } /** * deserializeRpcv2cborBlobs */ const de_Blobs = ( output: any, context: __SerdeContext ): Uint8Array[] => { const collection = (output || []).filter((e: any) => e != null) return collection; } /** * deserializeRpcv2cborCamelCaseOperationOutput */ const de_CamelCaseOperationOutput = ( output: any, context: __SerdeContext ): CamelCaseOperationOutput => { return take(output, { 'results': (_: any) => de_Blobs(_, context), 'token': __expectString, }) as any; } // de_CodedThrottlingError omitted. // de_DifferentShapeName omitted. /** * deserializeRpcv2cborGetNumbersResponse */ const de_GetNumbersResponse = ( output: any, context: __SerdeContext ): GetNumbersResponse => { return take(output, { 'bigDecimal': [], 'bigInteger': [], 'deprecatedNumbers': _json, 'deprecatedNumbersWithoutChronology': _json, 'deprecatedNumbersWithoutExplanation': _json, 'inexplicablyDeprecatedNumbers': _json, 'nextToken': __expectString, 'numbers': _json, 'sparseNumbers': (_: any) => de_SparseIntegerList(_, context), }) as any; } // de_HaltError omitted. // de_IntegerList omitted. // de_MainServiceLinkedError omitted. // de_MysteryThrottlingError omitted. // de_RetryableError omitted. /** * deserializeRpcv2cborSparseIntegerList */ const de_SparseIntegerList = ( output: any, context: __SerdeContext ): (number | null)[] => { const collection = (output || []).map((entry: any) => { if (entry === null) { return null as any; } return __expectInt32(entry) as any; }); return collection; } // de_XYZServiceServiceException omitted. // de_Unit omitted. const deserializeMetadata = (output: __HttpResponse): __ResponseMetadata => ({ httpStatusCode: output.statusCode, requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"], extendedRequestId: output.headers["x-amz-id-2"], cfId: output.headers["x-amz-cf-id"], }); const throwDefaultError = withBaseException(__BaseException); const SHARED_HEADERS: __HeaderBag = { 'content-type': "application/cbor", "smithy-protocol": "rpc-v2-cbor", "accept": "application/cbor", }; ================================================ FILE: private/my-local-model/src/runtimeConfig.browser.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-browser"; import { loadConfigsForDefaultMode } from "@smithy/core/client"; import { resolveDefaultsModeConfig } from "@smithy/core/config"; import { eventStreamSerdeProvider } from "@smithy/core/event-streams"; import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/core/retry"; import { calculateBodyLength } from "@smithy/core/serde"; import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "browser", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, eventStreamSerdeProvider: config?.eventStreamSerdeProvider ?? eventStreamSerdeProvider, maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE), sha256: config?.sha256 ?? Sha256, streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/my-local-model/src/runtimeConfig.native.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-js"; import { getRuntimeConfig as getBrowserRuntimeConfig } from "./runtimeConfig.browser"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { const browserDefaults = getBrowserRuntimeConfig(config); return { ...browserDefaults, ...config, runtime: "react-native", sha256: config?.sha256 ?? Sha256, }; }; ================================================ FILE: private/my-local-model/src/runtimeConfig.shared.ts ================================================ // smithy-typescript generated code import { HttpApiKeyAuthSigner } from "@smithy/core"; import { NoOpLogger } from "@smithy/core/client"; import { parseUrl } from "@smithy/core/protocols"; import { fromBase64, fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { IdentityProviderConfig } from "@smithy/types"; import { defaultXYZServiceHttpAuthSchemeProvider } from "./auth/httpAuthSchemeProvider"; import { defaultEndpointResolver } from "./endpoint/endpointResolver"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { return { apiVersion: "1.0", base64Decoder: config?.base64Decoder ?? fromBase64, base64Encoder: config?.base64Encoder ?? toBase64, disableHostPrefix: config?.disableHostPrefix ?? false, endpointProvider: config?.endpointProvider ?? defaultEndpointResolver, extensions: config?.extensions ?? [], httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultXYZServiceHttpAuthSchemeProvider, httpAuthSchemes: config?.httpAuthSchemes ?? [ { schemeId: "smithy.api#httpApiKeyAuth", identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider("smithy.api#httpApiKeyAuth"), signer: new HttpApiKeyAuthSigner(), }, ], logger: config?.logger ?? new NoOpLogger(), urlParser: config?.urlParser ?? parseUrl, utf8Decoder: config?.utf8Decoder ?? fromUtf8, utf8Encoder: config?.utf8Encoder ?? toUtf8, }; }; ================================================ FILE: private/my-local-model/src/runtimeConfig.ts ================================================ // smithy-typescript generated code import { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from "@smithy/core/client"; import { loadConfig as loadNodeConfig, resolveDefaultsModeConfig } from "@smithy/core/config"; import { eventStreamSerdeProvider } from "@smithy/core/event-streams"; import { DEFAULT_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, } from "@smithy/core/retry"; import { calculateBodyLength, Hash } from "@smithy/core/serde"; import { NodeHttpHandler as RequestHandler, streamCollector } from "@smithy/node-http-handler"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { emitWarningIfUnsupportedVersion(process.version); const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "node", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, eventStreamSerdeProvider: config?.eventStreamSerdeProvider ?? eventStreamSerdeProvider, maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config), requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? loadNodeConfig( { ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE, }, config ), sha256: config?.sha256 ?? Hash.bind(null, "sha256"), streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/my-local-model/src/runtimeExtensions.ts ================================================ // smithy-typescript generated code import { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from "@smithy/core/client"; import { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from "@smithy/core/protocols"; import { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from "./auth/httpAuthExtensionConfiguration"; import type { XYZServiceExtensionConfiguration } from "./extensionConfiguration"; /** * @public */ export interface RuntimeExtension { configure(extensionConfiguration: XYZServiceExtensionConfiguration): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[]; } /** * @internal */ export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => { const extensionConfiguration: XYZServiceExtensionConfiguration = Object.assign( getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig) ); extensions.forEach((extension) => extension.configure(extensionConfiguration)); return Object.assign( runtimeConfig, resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration) ); }; ================================================ FILE: private/my-local-model/src/waiters/index.ts ================================================ // smithy-typescript generated code export * from "./waitForNumbersAligned"; export * from "./waitForNumbersMisaligned"; export * from "./waitForNumbersWhatDoTheyDoAnyway"; ================================================ FILE: private/my-local-model/src/waiters/waitForNumbersAligned.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.SUCCESS, reason }; } catch (exception) { reason = exception; if (exception.name === "MysteryThrottlingError") { return { state: WaiterState.RETRY, reason }; } if (exception.name === "HaltError") { return { state: WaiterState.FAILURE, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers align * @deprecated Use waitUntilNumbersAligned instead. waitForNumbersAligned does not throw error in non-success cases. */ export const waitForNumbersAligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersAligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model/src/waiters/waitForNumbersMisaligned.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { HaltError } from "../models/errors"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.RETRY, reason }; } catch (exception) { reason = exception; if (exception.name === "HaltError") { return { state: WaiterState.SUCCESS, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers don't align * @deprecated Use waitUntilNumbersMisaligned instead. waitForNumbersMisaligned does not throw error in non-success cases. */ export const waitForNumbersMisaligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers don't align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersMisaligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model/src/waiters/waitForNumbersWhatDoTheyDoAnyway.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { HaltError } from "../models/errors"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.SUCCESS, reason }; } catch (exception) { reason = exception; if (exception.name === "HaltError") { return { state: WaiterState.SUCCESS, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers align or don't align * @deprecated Use waitUntilNumbersWhatDoTheyDoAnyway instead. waitForNumbersWhatDoTheyDoAnyway does not throw error in non-success cases. */ export const waitForNumbersWhatDoTheyDoAnyway = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers align or don't align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersWhatDoTheyDoAnyway = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model/test/functional/rpcv2cbor.spec.ts ================================================ // smithy-typescript generated code import { afterAll, expect, test as it } from "vitest"; import { GetNumbersCommand } from "../../src/commands/GetNumbersCommand"; import { HttpLabelCommandCommand } from "../../src/commands/HttpLabelCommandCommand"; import { XYZServiceClient } from "../../src/XYZServiceClient"; import { Readable } from "node:stream"; import { HttpRequest, HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import type { Endpoint, HeaderBag, HttpHandlerOptions } from "@smithy/types"; /** * Throws an expected exception that contains the serialized request. */ class EXPECTED_REQUEST_SERIALIZATION_ERROR extends Error { constructor(readonly request: HttpRequest) { super(); } } /** * Throws an EXPECTED_REQUEST_SERIALIZATION_ERROR error before sending a * request. The thrown exception contains the serialized request. */ class RequestSerializationTestHandler implements HttpHandler { handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.reject(new EXPECTED_REQUEST_SERIALIZATION_ERROR(request)); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } /** * Returns a resolved Promise of the specified response contents. */ class ResponseDeserializationTestHandler implements HttpHandler { isSuccess: boolean; code: number; headers: HeaderBag; body: string | Uint8Array; isBase64Body: boolean; constructor(isSuccess: boolean, code: number, headers?: HeaderBag, body?: string) { this.isSuccess = isSuccess; this.code = code; if (headers === undefined) { this.headers = {}; } else { this.headers = headers; } if (body === undefined) { body = ""; } this.body = body; this.isBase64Body = String(body).length > 0 && Buffer.from(String(body), "base64").toString("base64") === body; } handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.resolve({ response: new HttpResponse({ statusCode: this.code, headers: this.headers, body: this.isBase64Body ? toBytes(this.body as string) : Readable.from([this.body]), }), }); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } interface comparableParts { [key: string]: string; } /** * Generates a standard map of un-equal values given input parts. */ const compareParts = (expectedParts: comparableParts, generatedParts: comparableParts) => { const unequalParts: any = {}; Object.keys(expectedParts).forEach((key) => { if (generatedParts[key] === undefined) { unequalParts[key] = { exp: expectedParts[key], gen: undefined }; } else if (!equivalentContents(expectedParts[key], generatedParts[key])) { unequalParts[key] = { exp: expectedParts[key], gen: generatedParts[key] }; } }); Object.keys(generatedParts).forEach((key) => { if (expectedParts[key] === undefined) { unequalParts[key] = { exp: undefined, gen: generatedParts[key] }; } }); if (Object.keys(unequalParts).length !== 0) { return unequalParts; } return undefined; }; /** * Compares all types for equivalent contents, doing nested * equality checks based on non-`$metadata` * properties that have defined values. */ const equivalentContents = (expected: any, generated: any): boolean => { if (typeof (global as any).expect === "function") { expect(normalizeByteArrayType(generated)).toEqual(normalizeByteArrayType(expected)); return true; } let localExpected = expected; // Short circuit on equality. if (localExpected == generated) { return true; } if (typeof expected !== "object") { return expected === generated; } // If a test fails with an issue in the below 6 lines, it's likely // due to an issue in the nestedness or existence of the property // being compared. delete localExpected["$metadata"]; delete generated["$metadata"]; Object.keys(localExpected).forEach((key) => localExpected[key] === undefined && delete localExpected[key]); Object.keys(generated).forEach((key) => generated[key] === undefined && delete generated[key]); const expectedProperties = Object.getOwnPropertyNames(localExpected); const generatedProperties = Object.getOwnPropertyNames(generated); // Short circuit on different property counts. if (expectedProperties.length != generatedProperties.length) { return false; } // Compare properties directly. for (var index = 0; index < expectedProperties.length; index++) { const propertyName = expectedProperties[index]; if (!equivalentContents(localExpected[propertyName], generated[propertyName])) { return false; } } return true; }; const clientParams = { region: "us-west-2", credentials: { accessKeyId: "key", secretAccessKey: "secret" }, apiKey: { apiKey: "apiKey" }, endpoint: { url: new URL("https://localhost/"), headers: { "x-default-header": ["default-header-value"], }, }, }; /** * A wrapper function that shadows `fail` from jest-jasmine2 * (jasmine2 was replaced with circus in > v27 as the default test runner) */ const fail = (error?: any): never => { throw new Error(error); }; /** * Hexadecimal to byteArray. */ const toBytes = (hex: string) => { return Buffer.from(hex, "base64"); }; function normalizeByteArrayType(data: any) { // normalize float32 errors if (typeof data === "number") { const u = new Uint8Array(4); const dv = new DataView(u.buffer, u.byteOffset, u.byteLength); dv.setFloat32(0, data); return dv.getFloat32(0); } if (!data || typeof data !== "object") { return data; } if (data instanceof Uint8Array) { return Uint8Array.from(data); } if (data instanceof String || data instanceof Boolean || data instanceof Number) { return data.valueOf(); } const output = {} as any; for (const key of Object.getOwnPropertyNames(data)) { output[key] = normalizeByteArrayType(data[key]); } return output; } const WARMUP_ITERATIONS = 10_000; const BENCHMARK_ITERATIONS = 10_000; const BENCHMARK_TIMEOUT = 60_000; /** * Test name to benchmark data. */ const benchmarks = {} as Record< string, { n: string; p50: string; p90: string; p95: string; p99: string; mean: string; stdDev: string; } >; function logBenchmarks() { console.table(benchmarks); } function logBenchmark(name: string, timings: number[]) { const n = timings.length; const p50 = timings[(n - 1) * 0.50 | 0] | 0; const p90 = timings[(n - 1) * 0.90 | 0] | 0; const p95 = timings[(n - 1) * 0.95 | 0] | 0; const p99 = timings[(n - 1) * 0.99 | 0] | 0; const mean = timings.reduce((a, b) => a + b, 0) / timings.length | 0; const stdDev = Math.sqrt(timings.reduce((a, b) => a + (b - mean) ** 2, 0) / timings.length) | 0; const fmt = (n: number) => String(n.toLocaleString()).padStart(10, ' '); benchmarks[name] = { n: fmt(n), p50: fmt(p50), p90: fmt(p90), p95: fmt(p95), p99: fmt(p99), mean: fmt(mean), stdDev: fmt(stdDev), }; return { name, p95, n, timings }; } function vizBenchmark({ name, p95, n, timings }: { name: string, p95: number, n: number, timings: number[] }) { const decile = p95 / 10; let d = 1; const centIndex = (n / 100) | 0; let line = ""; console.info(name); console.info("=".repeat(31), "Distribution Viz", "=".repeat(31)); for (let i = 0; i < n; i += centIndex) { const t = timings[i]; if (t < decile * d) { line += "."; } else { line += ` <= ${(decile * d) | 0}`; console.info(line); d += 1; line = "."; } } console.info(line + ` > ${(decile * (d - 1)) | 0}`); console.info("=".repeat(80)); } it("HttpLabelCommandExample:Response", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", } ), }); const params: any = { LabelDoesNotApplyToRpcProtocol: "placeholder", }; const command = new HttpLabelCommandCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); it("GetNumbersRequestExample:SerdeBenchmark:Request", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new GetNumbersCommand( { } as any, ); const name = "GetNumbersRequestExample:SerdeBenchmark:Request"; const timings = [] as number[]; const testStart = performance.now(); const numeric = (a: number, b: number) => a - b; let i = 0; while (++i) { const preSerialize = performance.now(); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; }; const postSerialize = performance.now(); if (i >= WARMUP_ITERATIONS) { // allow warmup timings.push(postSerialize * 1_000_000 - preSerialize * 1_000_000); } if (timings.length >= BENCHMARK_ITERATIONS) { timings.length = BENCHMARK_ITERATIONS; break; } else if (testStart + 30_000 < preSerialize) { break; } } timings.sort(numeric); vizBenchmark(logBenchmark(name, timings)); }, BENCHMARK_TIMEOUT); it("EndpointResolvedHeadersApplied:Request", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new GetNumbersCommand( { customHeaderInput: "test-custom-value", } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/XYZService/operation/GetNumbers"); expect(r.headers["x-custom-header"]).toBe("test-custom-value"); } }); it("GetNumbersResponseExample:SerdeBenchmark:Response", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", } ), }); const params: any = {}; const command = new GetNumbersCommand(params); const name = "GetNumbersResponseExample:SerdeBenchmark:Response"; const timings = [] as number[]; const numeric = (a: number, b: number) => a - b; let i = 0; client.middlewareStack.addRelativeTo( (next: any) => async (args: any) => { const preDeserialize = performance.now(); const r = await next(args); const postDeserialize = performance.now(); if (i >= WARMUP_ITERATIONS) { timings.push(postDeserialize * 1_000_000 - preDeserialize * 1_000_000); } return r; }, { name: "deserializerBenchmarkMiddleware", toMiddleware: "deserializerMiddleware", relation: "before", override: true, } ); const benchmarkStart = performance.now(); while (++i) { let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } if (i >= WARMUP_ITERATIONS + BENCHMARK_ITERATIONS) { break; } else if (benchmarkStart + 30_000 < performance.now()) { break; } } timings.sort(numeric); timings.length = Math.min(timings.length, BENCHMARK_ITERATIONS); vizBenchmark(logBenchmark(name, timings)); }, BENCHMARK_TIMEOUT); afterAll(() => { logBenchmarks(); }); ================================================ FILE: private/my-local-model/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist-cjs", "noCheck": true } } ================================================ FILE: private/my-local-model/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "lib": ["dom"], "module": "ESNext", "moduleResolution": "bundler", "outDir": "dist-es", "noCheck": true } } ================================================ FILE: private/my-local-model/tsconfig.json ================================================ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "downlevelIteration": true, "importHelpers": true, "incremental": true, "removeComments": true, "resolveJsonModule": true, "rootDir": "src", "useUnknownInCatchVariables": false }, "include": ["src"] } ================================================ FILE: private/my-local-model/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist-types", "emitDeclarationOnly": true, "noCheck": false } } ================================================ FILE: private/my-local-model/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: private/my-local-model/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ}.spec.ts"], include: ["**/*.spec.ts"], globals: true, }, }); ================================================ FILE: private/my-local-model-schema/package.json ================================================ { "name": "xyz-schema", "description": "xyz-schema client", "version": "0.0.0", "scripts": { "build": "concurrently 'npm:build:cjs' 'npm:build:es' 'npm:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "test:index": "tsc --noEmit ./test/index-types.ts && node ./test/index-objects.spec.mjs", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "prepack": "npm run clean && npm run build", "test": "npx vitest run --passWithNoTests", "test:watch": "npx vitest watch --passWithNoTests", "test:integration": "npx vitest run --passWithNoTests -c vitest.config.integ.mts", "test:integration:watch": "npx vitest watch --passWithNoTests -c vitest.config.integ.mts" }, "main": "./dist-cjs/index.js", "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@smithy/core": "workspace:^", "@smithy/fetch-http-handler": "workspace:^", "@smithy/node-http-handler": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@smithy/snapshot-testing": "workspace:^", "@tsconfig/node20": "20.1.8", "@types/node": "^20.14.8", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typescript": "~5.8.3", "vitest": "^4.0.17" }, "engines": { "node": ">=20.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "private": true, "browser": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.browser" }, "react-native": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.native" } } ================================================ FILE: private/my-local-model-schema/src/XYZService.ts ================================================ // smithy-typescript generated code import { type WaiterResult, createAggregatedClient } from "@smithy/core/client"; import type { HttpHandlerOptions as __HttpHandlerOptions, PaginationConfiguration, Paginator, WaiterConfiguration, } from "@smithy/types"; import { type CamelCaseOperationCommandInput, type CamelCaseOperationCommandOutput, CamelCaseOperationCommand, } from "./commands/CamelCaseOperationCommand"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "./commands/GetNumbersCommand"; import { type HttpLabelCommandCommandInput, type HttpLabelCommandCommandOutput, HttpLabelCommandCommand, } from "./commands/HttpLabelCommandCommand"; import { type TradeEventStreamCommandInput, type TradeEventStreamCommandOutput, TradeEventStreamCommand, } from "./commands/TradeEventStreamCommand"; import type { HaltError } from "./models/errors"; import type { XYZServiceSyntheticServiceException } from "./models/XYZServiceSyntheticServiceException"; import { paginatecamelCaseOperation as paginateCamelCaseOperation } from "./pagination/camelCaseOperationPaginator"; import { paginateGetNumbers } from "./pagination/GetNumbersPaginator"; import { waitUntilNumbersAligned } from "./waiters/waitForNumbersAligned"; import { waitUntilNumbersMisaligned } from "./waiters/waitForNumbersMisaligned"; import { waitUntilNumbersWhatDoTheyDoAnyway } from "./waiters/waitForNumbersWhatDoTheyDoAnyway"; import { XYZServiceClient } from "./XYZServiceClient"; const commands = { HttpLabelCommandCommand, CamelCaseOperationCommand, GetNumbersCommand, TradeEventStreamCommand, }; const paginators = { paginateCamelCaseOperation, paginateGetNumbers, }; const waiters = { waitUntilNumbersAligned, waitUntilNumbersMisaligned, waitUntilNumbersWhatDoTheyDoAnyway, }; export interface XYZService { /** * @see {@link HttpLabelCommandCommand} */ httpLabelCommand( args: HttpLabelCommandCommandInput, options?: __HttpHandlerOptions ): Promise; httpLabelCommand( args: HttpLabelCommandCommandInput, cb: (err: any, data?: HttpLabelCommandCommandOutput) => void ): void; httpLabelCommand( args: HttpLabelCommandCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: HttpLabelCommandCommandOutput) => void ): void; /** * @see {@link CamelCaseOperationCommand} */ camelCaseOperation(): Promise; camelCaseOperation( args: CamelCaseOperationCommandInput, options?: __HttpHandlerOptions ): Promise; camelCaseOperation( args: CamelCaseOperationCommandInput, cb: (err: any, data?: CamelCaseOperationCommandOutput) => void ): void; camelCaseOperation( args: CamelCaseOperationCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: CamelCaseOperationCommandOutput) => void ): void; /** * @see {@link GetNumbersCommand} */ getNumbers(): Promise; getNumbers( args: GetNumbersCommandInput, options?: __HttpHandlerOptions ): Promise; getNumbers( args: GetNumbersCommandInput, cb: (err: any, data?: GetNumbersCommandOutput) => void ): void; getNumbers( args: GetNumbersCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: GetNumbersCommandOutput) => void ): void; /** * @see {@link TradeEventStreamCommand} */ tradeEventStream(): Promise; tradeEventStream( args: TradeEventStreamCommandInput, options?: __HttpHandlerOptions ): Promise; tradeEventStream( args: TradeEventStreamCommandInput, cb: (err: any, data?: TradeEventStreamCommandOutput) => void ): void; tradeEventStream( args: TradeEventStreamCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: TradeEventStreamCommandOutput) => void ): void; /** * @see {@link CamelCaseOperationCommand} * @param args - command input. * @param paginationConfig - optional pagination config. * @returns AsyncIterable of {@link CamelCaseOperationCommandOutput}. */ paginateCamelCaseOperation( args?: CamelCaseOperationCommandInput, paginationConfig?: Omit ): Paginator; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param paginationConfig - optional pagination config. * @returns AsyncIterable of {@link GetNumbersCommandOutput}. */ paginateGetNumbers( args?: GetNumbersCommandInput, paginationConfig?: Omit ): Paginator; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersAligned( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersMisaligned( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; /** * @see {@link GetNumbersCommand} * @param args - command input. * @param waiterConfig - `maxWaitTime` in seconds or waiter config object. */ waitUntilNumbersWhatDoTheyDoAnyway( args: GetNumbersCommandInput, waiterConfig: number | Omit, "client"> ): Promise>; } /** * xyz interfaces * @public */ export class XYZService extends XYZServiceClient implements XYZService {} createAggregatedClient(commands, XYZService, { paginators, waiters }); ================================================ FILE: private/my-local-model-schema/src/XYZServiceClient.ts ================================================ // smithy-typescript generated code import { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from "@smithy/core"; import { type DefaultsMode as __DefaultsMode, type SmithyConfiguration as __SmithyConfiguration, type SmithyResolvedConfiguration as __SmithyResolvedConfiguration, Client as __Client, } from "@smithy/core/client"; import { type EndpointInputConfig, type EndpointResolvedConfig, resolveEndpointConfig } from "@smithy/core/endpoints"; import { type EventStreamSerdeInputConfig, type EventStreamSerdeResolvedConfig, resolveEventStreamSerdeConfig, } from "@smithy/core/event-streams"; import { type HttpHandlerUserInput as __HttpHandlerUserInput, getContentLengthPlugin } from "@smithy/core/protocols"; import { type RetryInputConfig, type RetryResolvedConfig, getRetryPlugin, resolveRetryConfig, } from "@smithy/core/retry"; import { getSchemaSerdePlugin } from "@smithy/core/schema"; import type { BodyLengthCalculator as __BodyLengthCalculator, CheckOptionalClientConfig as __CheckOptionalClientConfig, ChecksumConstructor as __ChecksumConstructor, Decoder as __Decoder, Encoder as __Encoder, EventStreamSerdeProvider as __EventStreamSerdeProvider, HashConstructor as __HashConstructor, HttpHandlerOptions as __HttpHandlerOptions, Logger as __Logger, Provider as __Provider, StreamCollector as __StreamCollector, UrlParser as __UrlParser, } from "@smithy/types"; import { type HttpAuthSchemeInputConfig, type HttpAuthSchemeResolvedConfig, defaultXYZServiceHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from "./auth/httpAuthSchemeProvider"; import type { CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, } from "./commands/CamelCaseOperationCommand"; import type { GetNumbersCommandInput, GetNumbersCommandOutput } from "./commands/GetNumbersCommand"; import type { HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput } from "./commands/HttpLabelCommandCommand"; import type { TradeEventStreamCommandInput, TradeEventStreamCommandOutput } from "./commands/TradeEventStreamCommand"; import { type ClientInputEndpointParameters, type ClientResolvedEndpointParameters, type EndpointParameters, resolveClientEndpointParameters, } from "./endpoint/EndpointParameters"; import { getRuntimeConfig as __getRuntimeConfig } from "./runtimeConfig"; import { type RuntimeExtension, type RuntimeExtensionsConfig, resolveRuntimeExtensions } from "./runtimeExtensions"; export { __Client }; /** * @public */ export type ServiceInputTypes = | CamelCaseOperationCommandInput | GetNumbersCommandInput | HttpLabelCommandCommandInput | TradeEventStreamCommandInput; /** * @public */ export type ServiceOutputTypes = | CamelCaseOperationCommandOutput | GetNumbersCommandOutput | HttpLabelCommandCommandOutput | TradeEventStreamCommandOutput; /** * @public */ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHandlerOptions>> { /** * The HTTP handler to use or its constructor options. Fetch in browser and Https in Nodejs. */ requestHandler?: __HttpHandlerUserInput; /** * A constructor for a class implementing the {@link @smithy/types#ChecksumConstructor} interface * that computes the SHA-256 HMAC or checksum of a string or binary buffer. * @internal */ sha256?: __ChecksumConstructor | __HashConstructor; /** * The function that will be used to convert strings into HTTP endpoints. * @internal */ urlParser?: __UrlParser; /** * A function that can calculate the length of a request body. * @internal */ bodyLengthChecker?: __BodyLengthCalculator; /** * A function that converts a stream into an array of bytes. * @internal */ streamCollector?: __StreamCollector; /** * The function that will be used to convert a base64-encoded string to a byte array. * @internal */ base64Decoder?: __Decoder; /** * The function that will be used to convert binary data to a base64-encoded string. * @internal */ base64Encoder?: __Encoder; /** * The function that will be used to convert a UTF8-encoded string to a byte array. * @internal */ utf8Decoder?: __Decoder; /** * The function that will be used to convert binary data to a UTF-8 encoded string. * @internal */ utf8Encoder?: __Encoder; /** * The runtime environment. * @internal */ runtime?: string; /** * Disable dynamically changing the endpoint of the client based on the hostPrefix * trait of an operation. */ disableHostPrefix?: boolean; /** * Value for how many times a request will be made at most in case of retry. */ maxAttempts?: number | __Provider; /** * Specifies which retry algorithm to use. * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-smithy-util-retry/Enum/RETRY_MODES/ * */ retryMode?: string | __Provider; /** * Optional logger for logging debug/info/warn/error. */ logger?: __Logger; /** * Optional extensions */ extensions?: RuntimeExtension[]; /** * The function that provides necessary utilities for generating and parsing event stream */ eventStreamSerdeProvider?: __EventStreamSerdeProvider; /** * The {@link @smithy/smithy-client#DefaultsMode} that will be used to determine how certain default configuration options are resolved in the SDK. */ defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>; } /** * @public */ export type XYZServiceClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOptions>> & ClientDefaults & RetryInputConfig & EndpointInputConfig & EventStreamSerdeInputConfig & HttpAuthSchemeInputConfig & ClientInputEndpointParameters; /** * @public * * The configuration interface of XYZServiceClient class constructor that set the region, credentials and other options. */ export interface XYZServiceClientConfig extends XYZServiceClientConfigType {} /** * @public */ export type XYZServiceClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHandlerOptions> & Required & RuntimeExtensionsConfig & RetryResolvedConfig & EndpointResolvedConfig & EventStreamSerdeResolvedConfig & HttpAuthSchemeResolvedConfig & ClientResolvedEndpointParameters; /** * @public * * The resolved configuration interface of XYZServiceClient class. This is resolved and normalized from the {@link XYZServiceClientConfig | constructor configuration interface}. */ export interface XYZServiceClientResolvedConfig extends XYZServiceClientResolvedConfigType {} /** * xyz interfaces * @public */ export class XYZServiceClient extends __Client< __HttpHandlerOptions, ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig > { /** * The resolved configuration of XYZServiceClient class. This is resolved and normalized from the {@link XYZServiceClientConfig | constructor configuration interface}. */ readonly config: XYZServiceClientResolvedConfig; constructor(...[configuration]: __CheckOptionalClientConfig) { const _config_0 = __getRuntimeConfig(configuration || {}); super(_config_0 as any); this.initConfig = _config_0; const _config_1 = resolveClientEndpointParameters(_config_0); const _config_2 = resolveRetryConfig(_config_1); const _config_3 = resolveEndpointConfig(_config_2); const _config_4 = resolveEventStreamSerdeConfig(_config_3); const _config_5 = resolveHttpAuthSchemeConfig(_config_4); const _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []); this.config = _config_6; this.middlewareStack.use(getSchemaSerdePlugin(this.config)); this.middlewareStack.use(getRetryPlugin(this.config)); this.middlewareStack.use(getContentLengthPlugin(this.config)); this.middlewareStack.use( getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultXYZServiceHttpAuthSchemeParametersProvider, identityProviderConfigProvider: async (config: XYZServiceClientResolvedConfig) => new DefaultIdentityProviderConfig({ "smithy.api#httpApiKeyAuth": config.apiKey, }), }) ); this.middlewareStack.use(getHttpSigningPlugin(this.config)); } /** * Destroy underlying resources, like sockets. It's usually not necessary to do this. * However in Node.js, it's best to explicitly shut down the client's agent when it is no longer needed. * Otherwise, sockets might stay open for quite a long time before the server terminates them. */ destroy(): void { super.destroy(); } } ================================================ FILE: private/my-local-model-schema/src/auth/httpAuthExtensionConfiguration.ts ================================================ // smithy-typescript generated code import type { ApiKeyIdentity, ApiKeyIdentityProvider, HttpAuthScheme } from "@smithy/types"; import type { XYZServiceHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; /** * @internal */ export interface HttpAuthExtensionConfiguration { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void; httpAuthSchemes(): HttpAuthScheme[]; setHttpAuthSchemeProvider(httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider): void; httpAuthSchemeProvider(): XYZServiceHttpAuthSchemeProvider; setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void; apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined; } /** * @internal */ export type HttpAuthRuntimeConfig = Partial<{ httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider; apiKey: ApiKeyIdentity | ApiKeyIdentityProvider; }>; /** * @internal */ export const getHttpAuthExtensionConfiguration = ( runtimeConfig: HttpAuthRuntimeConfig ): HttpAuthExtensionConfiguration => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!; let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!; let _apiKey = runtimeConfig.apiKey; return { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; }, setHttpAuthSchemeProvider(httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): XYZServiceHttpAuthSchemeProvider { return _httpAuthSchemeProvider; }, setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void { _apiKey = apiKey; }, apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined { return _apiKey; }, }; }; /** * @internal */ export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => { return { httpAuthSchemes: config.httpAuthSchemes(), httpAuthSchemeProvider: config.httpAuthSchemeProvider(), apiKey: config.apiKey(), }; }; ================================================ FILE: private/my-local-model-schema/src/auth/httpAuthSchemeProvider.ts ================================================ // smithy-typescript generated code import { doesIdentityRequireRefresh, isIdentityExpired, memoizeIdentityProvider } from "@smithy/core"; import { getSmithyContext, normalizeProvider } from "@smithy/core/client"; import { type ApiKeyIdentity, type ApiKeyIdentityProvider, type HandlerExecutionContext, type HttpAuthOption, type HttpAuthScheme, type HttpAuthSchemeParameters, type HttpAuthSchemeParametersProvider, type HttpAuthSchemeProvider, type Provider, HttpApiKeyAuthLocation, } from "@smithy/types"; import type { XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @internal */ export interface XYZServiceHttpAuthSchemeParameters extends HttpAuthSchemeParameters {} /** * @internal */ export interface XYZServiceHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< XYZServiceClientResolvedConfig, HandlerExecutionContext, XYZServiceHttpAuthSchemeParameters, object > {} /** * @internal */ export const defaultXYZServiceHttpAuthSchemeParametersProvider = async ( config: XYZServiceClientResolvedConfig, context: HandlerExecutionContext, input: object ): Promise => { return { operation: getSmithyContext(context).operation as string, }; }; function createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters: XYZServiceHttpAuthSchemeParameters): HttpAuthOption { return { schemeId: "smithy.api#httpApiKeyAuth", signingProperties: { name: "X-Api-Key", in: HttpApiKeyAuthLocation.HEADER, scheme: undefined, }, }; } /** * @internal */ export interface XYZServiceHttpAuthSchemeProvider extends HttpAuthSchemeProvider {} /** * @internal */ export const defaultXYZServiceHttpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider = (authParameters) => { const options: HttpAuthOption[] = []; switch (authParameters.operation) { default: { options.push(createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters)); } } return options; }; /** * @public */ export interface HttpAuthSchemeInputConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ authSchemePreference?: string[] | Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ httpAuthSchemes?: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ httpAuthSchemeProvider?: XYZServiceHttpAuthSchemeProvider; /** * The API key to use when making requests. */ apiKey?: ApiKeyIdentity | ApiKeyIdentityProvider; } /** * @internal */ export interface HttpAuthSchemeResolvedConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ readonly authSchemePreference: Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ readonly httpAuthSchemes: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ readonly httpAuthSchemeProvider: XYZServiceHttpAuthSchemeProvider; /** * The API key to use when making requests. */ readonly apiKey?: ApiKeyIdentityProvider; } /** * @internal */ export const resolveHttpAuthSchemeConfig = ( config: T & HttpAuthSchemeInputConfig ): T & HttpAuthSchemeResolvedConfig => { const apiKey = memoizeIdentityProvider(config.apiKey, isIdentityExpired, doesIdentityRequireRefresh); return Object.assign(config, { authSchemePreference: normalizeProvider(config.authSchemePreference ?? []), apiKey, }) as T & HttpAuthSchemeResolvedConfig; }; ================================================ FILE: private/my-local-model-schema/src/commands/CamelCaseOperationCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { CamelCaseOperationInput, CamelCaseOperationOutput } from "../models/models_0"; import { camelCaseOperation$ } from "../schemas/schemas_0"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link CamelCaseOperationCommand}. */ export interface CamelCaseOperationCommandInput extends CamelCaseOperationInput {} /** * @public * * The output of {@link CamelCaseOperationCommand}. */ export interface CamelCaseOperationCommandOutput extends CamelCaseOperationOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, CamelCaseOperationCommand } from "xyz-schema"; // ES Modules import * // const { XYZServiceClient, CamelCaseOperationCommand } = require("xyz-schema"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz-schema"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // camelCaseOperationInput * token: "STRING_VALUE", * }; * const command = new CamelCaseOperationCommand(input); * const response = await client.send(command); * // { // camelCaseOperationOutput * // token: "STRING_VALUE", * // results: [ // Blobs * // new Uint8Array(), * // ], * // }; * * ``` * * @param CamelCaseOperationCommandInput - {@link CamelCaseOperationCommandInput} * @returns {@link CamelCaseOperationCommandOutput} * @see {@link CamelCaseOperationCommandInput} for command's `input` shape. * @see {@link CamelCaseOperationCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class CamelCaseOperationCommand extends $Command .classBuilder< CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("XYZService", "camelCaseOperation", {}) .n("XYZServiceClient", "CamelCaseOperationCommand") .sc(camelCaseOperation$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: CamelCaseOperationInput; output: CamelCaseOperationOutput; }; sdk: { input: CamelCaseOperationCommandInput; output: CamelCaseOperationCommandOutput; }; }; } ================================================ FILE: private/my-local-model-schema/src/commands/GetNumbersCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { GetNumbersRequest, GetNumbersResponse } from "../models/models_0"; import { GetNumbers$ } from "../schemas/schemas_0"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link GetNumbersCommand}. */ export interface GetNumbersCommandInput extends GetNumbersRequest {} /** * @public * * The output of {@link GetNumbersCommand}. */ export interface GetNumbersCommandOutput extends GetNumbersResponse, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, GetNumbersCommand } from "xyz-schema"; // ES Modules import * // const { XYZServiceClient, GetNumbersCommand } = require("xyz-schema"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz-schema"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // GetNumbersRequest * bigDecimal: Number("bigdecimal"), * bigInteger: Number("bigint"), * fieldWithoutMessage: "STRING_VALUE", * fieldWithMessage: "STRING_VALUE", * startToken: "STRING_VALUE", * maxResults: Number("int"), * customHeaderInput: "STRING_VALUE", * numbers: { // IntegerMap * "": Number("int"), * }, * sparseNumbers: { // SparseIntegerMap * "": Number("int"), * }, * }; * const command = new GetNumbersCommand(input); * const response = await client.send(command); * // { // GetNumbersResponse * // bigDecimal: Number("bigdecimal"), * // bigInteger: Number("bigint"), * // numbers: [ // IntegerList * // Number("int"), * // ], * // sparseNumbers: [ // SparseIntegerList * // Number("int"), * // ], * // nextToken: "STRING_VALUE", * // deprecatedNumbers: [ * // Number("int"), * // ], * // deprecatedNumbersWithoutExplanation: [ * // Number("int"), * // ], * // deprecatedNumbersWithoutChronology: [ * // Number("int"), * // ], * // inexplicablyDeprecatedNumbers: [ * // Number("int"), * // ], * // }; * * ``` * * @param GetNumbersCommandInput - {@link GetNumbersCommandInput} * @returns {@link GetNumbersCommandOutput} * @see {@link GetNumbersCommandInput} for command's `input` shape. * @see {@link GetNumbersCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link CodedThrottlingError} (client fault) * * @throws {@link MysteryThrottlingError} (client fault) * * @throws {@link RetryableError} (client fault) * * @throws {@link HaltError} (client fault) * * @throws {@link XYZServiceServiceException} (client fault) * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class GetNumbersCommand extends $Command .classBuilder< GetNumbersCommandInput, GetNumbersCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep({ ...commonParams, CustomHeaderValue: { type: "contextParams", name: "customHeaderInput" }, }) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("XYZService", "GetNumbers", {}) .n("XYZServiceClient", "GetNumbersCommand") .sc(GetNumbers$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: GetNumbersRequest; output: GetNumbersResponse; }; sdk: { input: GetNumbersCommandInput; output: GetNumbersCommandOutput; }; }; } ================================================ FILE: private/my-local-model-schema/src/commands/HttpLabelCommandCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { HttpLabelCommandInput, HttpLabelCommandOutput } from "../models/models_0"; import { HttpLabelCommand$ } from "../schemas/schemas_0"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link HttpLabelCommandCommand}. */ export interface HttpLabelCommandCommandInput extends HttpLabelCommandInput {} /** * @public * * The output of {@link HttpLabelCommandCommand}. */ export interface HttpLabelCommandCommandOutput extends HttpLabelCommandOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, HttpLabelCommandCommand } from "xyz-schema"; // ES Modules import * // const { XYZServiceClient, HttpLabelCommandCommand } = require("xyz-schema"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz-schema"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // HttpLabelCommandInput * LabelDoesNotApplyToRpcProtocol: "STRING_VALUE", // required * }; * const command = new HttpLabelCommandCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param HttpLabelCommandCommandInput - {@link HttpLabelCommandCommandInput} * @returns {@link HttpLabelCommandCommandOutput} * @see {@link HttpLabelCommandCommandInput} for command's `input` shape. * @see {@link HttpLabelCommandCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class HttpLabelCommandCommand extends $Command .classBuilder< HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("XYZService", "HttpLabelCommand", {}) .n("XYZServiceClient", "HttpLabelCommandCommand") .sc(HttpLabelCommand$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: HttpLabelCommandInput; output: {}; }; sdk: { input: HttpLabelCommandCommandInput; output: HttpLabelCommandCommandOutput; }; }; } ================================================ FILE: private/my-local-model-schema/src/commands/TradeEventStreamCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { TradeEventStreamRequest, TradeEventStreamResponse } from "../models/models_0"; import { TradeEventStream$ } from "../schemas/schemas_0"; import type { ServiceInputTypes, ServiceOutputTypes, XYZServiceClientResolvedConfig } from "../XYZServiceClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link TradeEventStreamCommand}. */ export interface TradeEventStreamCommandInput extends TradeEventStreamRequest {} /** * @public * * The output of {@link TradeEventStreamCommand}. */ export interface TradeEventStreamCommandOutput extends TradeEventStreamResponse, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { XYZServiceClient, TradeEventStreamCommand } from "xyz-schema"; // ES Modules import * // const { XYZServiceClient, TradeEventStreamCommand } = require("xyz-schema"); // CommonJS import * // import type { XYZServiceClientConfig } from "xyz-schema"; * const config = {}; // type is XYZServiceClientConfig * const client = new XYZServiceClient(config); * const input = { // TradeEventStreamRequest * eventStream: { // TradeEvents Union: only one key present * alpha: { // Alpha * id: "STRING_VALUE", * timestamp: new Date("TIMESTAMP"), * }, * beta: {}, * gamma: {}, * delta: { // DifferentShapeName * name: "STRING_VALUE", * number: Number("int"), * }, * }, * }; * const command = new TradeEventStreamCommand(input); * const response = await client.send(command); * // { // TradeEventStreamResponse * // eventStream: { // TradeEvents Union: only one key present * // alpha: { // Alpha * // id: "STRING_VALUE", * // timestamp: new Date("TIMESTAMP"), * // }, * // beta: {}, * // gamma: {}, * // delta: { // DifferentShapeName * // name: "STRING_VALUE", * // number: Number("int"), * // }, * // }, * // }; * * ``` * * @param TradeEventStreamCommandInput - {@link TradeEventStreamCommandInput} * @returns {@link TradeEventStreamCommandOutput} * @see {@link TradeEventStreamCommandInput} for command's `input` shape. * @see {@link TradeEventStreamCommandOutput} for command's `response` shape. * @see {@link XYZServiceClientResolvedConfig | config} for XYZServiceClient's `config` shape. * * @throws {@link MainServiceLinkedError} (client fault) * * @throws {@link XYZServiceSyntheticServiceException} *

Base exception class for all service exceptions from XYZService service.

* * */ export class TradeEventStreamCommand extends $Command .classBuilder< TradeEventStreamCommandInput, TradeEventStreamCommandOutput, XYZServiceClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: XYZServiceClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("XYZService", "TradeEventStream", { /** * @internal */ eventStream: { input: true, output: true, }, }) .n("XYZServiceClient", "TradeEventStreamCommand") .sc(TradeEventStream$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: TradeEventStreamRequest; output: TradeEventStreamResponse; }; sdk: { input: TradeEventStreamCommandInput; output: TradeEventStreamCommandOutput; }; }; } ================================================ FILE: private/my-local-model-schema/src/commands/index.ts ================================================ // smithy-typescript generated code export * from "./CamelCaseOperationCommand"; export * from "./GetNumbersCommand"; export * from "./HttpLabelCommandCommand"; export * from "./TradeEventStreamCommand"; ================================================ FILE: private/my-local-model-schema/src/endpoint/EndpointParameters.ts ================================================ // smithy-typescript generated code import type { Endpoint, EndpointParameters as __EndpointParameters, EndpointV2, Provider } from "@smithy/types"; /** * @public */ export interface ClientInputEndpointParameters { clientContextParams?: { apiKey?: string | undefined | Provider; region?: string | undefined | Provider; customParam?: string | undefined | Provider; enableFeature?: boolean | undefined | Provider; debugMode?: boolean | undefined | Provider; nonConflictingParam?: string | undefined | Provider; logger?: string | undefined | Provider; }; endpoint?: string | Provider | Endpoint | Provider | EndpointV2 | Provider; customParam?: string | undefined | Provider; enableFeature?: boolean | undefined | Provider; debugMode?: boolean | undefined | Provider; nonConflictingParam?: string | undefined | Provider; } /** * @public */ export type ClientResolvedEndpointParameters = Omit & { defaultSigningName: string; }; /** * @internal */ const clientContextParamDefaults = { logger: "default-logger", } as const; /** * @internal */ export const resolveClientEndpointParameters = ( options: T & ClientInputEndpointParameters ): T & ClientResolvedEndpointParameters => { return Object.assign(options, { customParam: options.customParam ?? "default-custom-value", enableFeature: options.enableFeature ?? true, debugMode: options.debugMode ?? false, nonConflictingParam: options.nonConflictingParam ?? "non-conflict-default", defaultSigningName: "", clientContextParams: Object.assign(clientContextParamDefaults, options.clientContextParams), }); }; /** * @internal */ export const commonParams = { ApiKey: { type: "clientContextParams", name: "apiKey" }, nonConflictingParam: { type: "clientContextParams", name: "nonConflictingParam" }, logger: { type: "clientContextParams", name: "logger" }, region: { type: "clientContextParams", name: "region" }, customParam: { type: "clientContextParams", name: "customParam" }, debugMode: { type: "clientContextParams", name: "debugMode" }, enableFeature: { type: "clientContextParams", name: "enableFeature" }, endpoint: { type: "builtInParams", name: "endpoint" }, } as const; /** * @internal */ export interface EndpointParameters extends __EndpointParameters { endpoint?: string | undefined; ApiKey?: string | undefined; region?: string | undefined; customParam?: string | undefined; enableFeature?: boolean | undefined; debugMode?: boolean | undefined; nonConflictingParam?: string | undefined; logger?: string | undefined; CustomHeaderValue?: string | undefined; } ================================================ FILE: private/my-local-model-schema/src/endpoint/bdd.ts ================================================ // smithy-typescript generated code import { BinaryDecisionDiagram } from "@smithy/core/endpoints"; const d="x-api-key"; const a="isSet", b="{endpoint}", c=["{ApiKey}"]; const _data={ conditions: [ [a,[{ref:"endpoint"}]], [a,[{ref:"ApiKey"}]], [a,[{ref:"CustomHeaderValue"}]] ], results: [ [-1], [b,{},{[d]:c,"x-custom-header":["{CustomHeaderValue}"]}], [b,{},{[d]:c}], [b,{}], [-1,"endpoint is not set - you must configure an endpoint."] ] }; const root = 2; const r = 100_000_000; const nodes = new Int32Array([ -1, 1, -1, 0, 3, r + 4, 1, 4, r + 3, 2, r + 1, r + 2, ]); export const bdd = BinaryDecisionDiagram.from( nodes, root, _data.conditions, _data.results ); ================================================ FILE: private/my-local-model-schema/src/endpoint/endpointResolver.ts ================================================ // smithy-typescript generated code import { type EndpointParams, decideEndpoint, EndpointCache } from "@smithy/core/endpoints"; import type { EndpointV2, Logger } from "@smithy/types"; import { bdd } from "./bdd"; import type { EndpointParameters } from "./EndpointParameters"; const cache = new EndpointCache({ size: 50, params: ["ApiKey", "CustomHeaderValue", "endpoint"], }); /** * @internal */ export const defaultEndpointResolver = ( endpointParams: EndpointParameters, context: { logger?: Logger } = {} ): EndpointV2 => { return cache.get(endpointParams as EndpointParams, () => decideEndpoint(bdd, { endpointParams: endpointParams as EndpointParams, logger: context.logger, }) ); }; ================================================ FILE: private/my-local-model-schema/src/extensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpHandlerExtensionConfiguration } from "@smithy/core/protocols"; import type { DefaultExtensionConfiguration } from "@smithy/types"; import type { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration"; /** * @internal */ export interface XYZServiceExtensionConfiguration extends HttpHandlerExtensionConfiguration, DefaultExtensionConfiguration, HttpAuthExtensionConfiguration {} ================================================ FILE: private/my-local-model-schema/src/index.ts ================================================ // smithy-typescript generated code /* eslint-disable */ /** * xyz interfaces * * @packageDocumentation */ export * from "./XYZServiceClient"; export * from "./XYZService"; export type { ClientInputEndpointParameters } from "./endpoint/EndpointParameters"; export type { RuntimeExtension } from "./runtimeExtensions"; export type { XYZServiceExtensionConfiguration } from "./extensionConfiguration"; export * from "./commands"; export * from "./schemas/schemas_0"; export * from "./pagination"; export * from "./waiters"; export * from "./models/errors"; export * from "./models/models_0"; export { XYZServiceSyntheticServiceException } from "./models/XYZServiceSyntheticServiceException"; ================================================ FILE: private/my-local-model-schema/src/models/XYZServiceSyntheticServiceException.ts ================================================ // smithy-typescript generated code import { type ServiceExceptionOptions as __ServiceExceptionOptions, ServiceException as __ServiceException, } from "@smithy/core/client"; export type { __ServiceExceptionOptions }; export { __ServiceException }; /** * @public * * Base exception class for all service exceptions from XYZService service. */ export class XYZServiceSyntheticServiceException extends __ServiceException { /** * @internal */ constructor(options: __ServiceExceptionOptions) { super(options); Object.setPrototypeOf(this, XYZServiceSyntheticServiceException.prototype); } } ================================================ FILE: private/my-local-model-schema/src/models/errors.ts ================================================ // smithy-typescript generated code import type { ExceptionOptionType as __ExceptionOptionType } from "@smithy/core/client"; import { XYZServiceSyntheticServiceException as __BaseException } from "./XYZServiceSyntheticServiceException"; /** * @public */ export class MainServiceLinkedError extends __BaseException { readonly name = "MainServiceLinkedError" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "MainServiceLinkedError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, MainServiceLinkedError.prototype); } } /** * @public */ export class CodedThrottlingError extends __BaseException { readonly name = "CodedThrottlingError" as const; readonly $fault = "client" as const; $retryable = { throttling: true, }; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "CodedThrottlingError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, CodedThrottlingError.prototype); } } /** * @public */ export class HaltError extends __BaseException { readonly name = "HaltError" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "HaltError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, HaltError.prototype); } } /** * @public */ export class MysteryThrottlingError extends __BaseException { readonly name = "MysteryThrottlingError" as const; readonly $fault = "client" as const; $retryable = { throttling: true, }; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "MysteryThrottlingError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, MysteryThrottlingError.prototype); } } /** * @public */ export class RetryableError extends __BaseException { readonly name = "RetryableError" as const; readonly $fault = "client" as const; $retryable = {}; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "RetryableError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, RetryableError.prototype); } } /** * @public */ export class XYZServiceServiceException extends __BaseException { readonly name = "XYZServiceServiceException" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "XYZServiceServiceException", $fault: "client", ...opts, }); Object.setPrototypeOf(this, XYZServiceServiceException.prototype); } } ================================================ FILE: private/my-local-model-schema/src/models/models_0.ts ================================================ // smithy-typescript generated code import type { NumericValue } from "@smithy/core/serde"; /** * @public */ export interface HttpLabelCommandInput { LabelDoesNotApplyToRpcProtocol: string | undefined; } /** * @public */ export interface HttpLabelCommandOutput {} /** * @public */ export interface Alpha { id?: string | undefined; timestamp?: Date | undefined; } /** * @public */ export interface CamelCaseOperationInput { token?: string | undefined; } /** * @public */ export interface CamelCaseOperationOutput { token?: string | undefined; results?: Uint8Array[] | undefined; } /** * @public */ export interface DifferentShapeName { name?: string | undefined; number?: number | undefined; } /** * @public */ export interface GetNumbersRequest { bigDecimal?: NumericValue | undefined; bigInteger?: bigint | undefined; /** * This is deprecated documentation annotation. * * @deprecated deprecated. * @public */ fieldWithoutMessage?: string | undefined; /** * This is deprecated documentation annotation. * * @deprecated (since 3.0) This field has been deprecated. * @public */ fieldWithMessage?: string | undefined; startToken?: string | undefined; maxResults?: number | undefined; customHeaderInput?: string | undefined; numbers?: Record | undefined; sparseNumbers?: Record | undefined; } /** * @public */ export interface GetNumbersResponse { bigDecimal?: NumericValue | undefined; bigInteger?: bigint | undefined; numbers?: number[] | undefined; sparseNumbers?: (number | null)[] | undefined; nextToken?: string | undefined; /** * This is deprecated documentation annotation. * * @deprecated (since 1685-12-31) these numbers are not used anymore. * @public */ deprecatedNumbers?: number[] | undefined; /** * This is deprecated documentation annotation. * * @deprecated since 1685-12-31. * @public */ deprecatedNumbersWithoutExplanation?: number[] | undefined; /** * @deprecated these numbers are not used anymore?? * @public */ deprecatedNumbersWithoutChronology?: number[] | undefined; /** * @deprecated deprecated. * @public */ inexplicablyDeprecatedNumbers?: number[] | undefined; } /** * @public */ export interface Unit {} /** * @public */ export type TradeEvents = | TradeEvents.AlphaMember | TradeEvents.BetaMember | TradeEvents.DeltaMember | TradeEvents.GammaMember | TradeEvents.$UnknownMember; /** * @public */ export namespace TradeEvents { export interface AlphaMember { alpha: Alpha; beta?: never; gamma?: never; delta?: never; $unknown?: never; } export interface BetaMember { alpha?: never; beta: Unit; gamma?: never; delta?: never; $unknown?: never; } export interface GammaMember { alpha?: never; beta?: never; gamma: Unit; delta?: never; $unknown?: never; } export interface DeltaMember { alpha?: never; beta?: never; gamma?: never; delta: DifferentShapeName; $unknown?: never; } /** * @public */ export interface $UnknownMember { alpha?: never; beta?: never; gamma?: never; delta?: never; $unknown: [string, any]; } /** * @deprecated unused in schema-serde mode. * */ export interface Visitor { alpha: (value: Alpha) => T; beta: (value: Unit) => T; gamma: (value: Unit) => T; delta: (value: DifferentShapeName) => T; _: (name: string, value: any) => T; } } /** * @public */ export interface TradeEventStreamRequest { eventStream?: AsyncIterable | undefined; } /** * @public */ export interface TradeEventStreamResponse { eventStream?: AsyncIterable | undefined; } ================================================ FILE: private/my-local-model-schema/src/pagination/GetNumbersPaginator.ts ================================================ // smithy-typescript generated code import { createPaginator } from "@smithy/core"; import type { Paginator } from "@smithy/types"; import { GetNumbersCommand, GetNumbersCommandInput, GetNumbersCommandOutput } from "../commands/GetNumbersCommand"; import { XYZServiceClient } from "../XYZServiceClient"; import type { XYZServicePaginationConfiguration } from "./Interfaces"; /** * @public */ export const paginateGetNumbers: ( config: XYZServicePaginationConfiguration, input: GetNumbersCommandInput, ...rest: any[] ) => Paginator = createPaginator< XYZServicePaginationConfiguration, GetNumbersCommandInput, GetNumbersCommandOutput >(XYZServiceClient, GetNumbersCommand, "startToken", "nextToken", "maxResults"); ================================================ FILE: private/my-local-model-schema/src/pagination/Interfaces.ts ================================================ // smithy-typescript generated code import type { PaginationConfiguration } from "@smithy/types"; import { XYZServiceClient } from "../XYZServiceClient"; /** * @public */ export interface XYZServicePaginationConfiguration extends PaginationConfiguration { client: XYZServiceClient; } ================================================ FILE: private/my-local-model-schema/src/pagination/camelCaseOperationPaginator.ts ================================================ // smithy-typescript generated code import { createPaginator } from "@smithy/core"; import type { Paginator } from "@smithy/types"; import { CamelCaseOperationCommand, CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, } from "../commands/CamelCaseOperationCommand"; import { XYZServiceClient } from "../XYZServiceClient"; import type { XYZServicePaginationConfiguration } from "./Interfaces"; /** * @public */ export const paginatecamelCaseOperation: ( config: XYZServicePaginationConfiguration, input: CamelCaseOperationCommandInput, ...rest: any[] ) => Paginator = createPaginator< XYZServicePaginationConfiguration, CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput >(XYZServiceClient, CamelCaseOperationCommand, "token", "token", ""); ================================================ FILE: private/my-local-model-schema/src/pagination/index.ts ================================================ // smithy-typescript generated code export * from "./Interfaces"; export * from "./camelCaseOperationPaginator"; export * from "./GetNumbersPaginator"; ================================================ FILE: private/my-local-model-schema/src/runtimeConfig.browser.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-browser"; import { loadConfigsForDefaultMode } from "@smithy/core/client"; import { resolveDefaultsModeConfig } from "@smithy/core/config"; import { eventStreamSerdeProvider } from "@smithy/core/event-streams"; import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/core/retry"; import { calculateBodyLength } from "@smithy/core/serde"; import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "browser", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, eventStreamSerdeProvider: config?.eventStreamSerdeProvider ?? eventStreamSerdeProvider, maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE), sha256: config?.sha256 ?? Sha256, streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/my-local-model-schema/src/runtimeConfig.native.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-js"; import { getRuntimeConfig as getBrowserRuntimeConfig } from "./runtimeConfig.browser"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { const browserDefaults = getBrowserRuntimeConfig(config); return { ...browserDefaults, ...config, runtime: "react-native", sha256: config?.sha256 ?? Sha256, }; }; ================================================ FILE: private/my-local-model-schema/src/runtimeConfig.shared.ts ================================================ // smithy-typescript generated code import { HttpApiKeyAuthSigner } from "@smithy/core"; import { SmithyRpcV2CborProtocol } from "@smithy/core/cbor"; import { NoOpLogger } from "@smithy/core/client"; import { parseUrl } from "@smithy/core/protocols"; import { fromBase64, fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { IdentityProviderConfig } from "@smithy/types"; import { defaultXYZServiceHttpAuthSchemeProvider } from "./auth/httpAuthSchemeProvider"; import { defaultEndpointResolver } from "./endpoint/endpointResolver"; import { errorTypeRegistries } from "./schemas/schemas_0"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { return { apiVersion: "1.0", base64Decoder: config?.base64Decoder ?? fromBase64, base64Encoder: config?.base64Encoder ?? toBase64, disableHostPrefix: config?.disableHostPrefix ?? false, endpointProvider: config?.endpointProvider ?? defaultEndpointResolver, extensions: config?.extensions ?? [], httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultXYZServiceHttpAuthSchemeProvider, httpAuthSchemes: config?.httpAuthSchemes ?? [ { schemeId: "smithy.api#httpApiKeyAuth", identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider("smithy.api#httpApiKeyAuth"), signer: new HttpApiKeyAuthSigner(), }, ], logger: config?.logger ?? new NoOpLogger(), protocol: config?.protocol ?? SmithyRpcV2CborProtocol, protocolSettings: config?.protocolSettings ?? { defaultNamespace: "org.xyz.v1", errorTypeRegistries, }, urlParser: config?.urlParser ?? parseUrl, utf8Decoder: config?.utf8Decoder ?? fromUtf8, utf8Encoder: config?.utf8Encoder ?? toUtf8, }; }; ================================================ FILE: private/my-local-model-schema/src/runtimeConfig.ts ================================================ // smithy-typescript generated code import { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from "@smithy/core/client"; import { loadConfig as loadNodeConfig, resolveDefaultsModeConfig } from "@smithy/core/config"; import { eventStreamSerdeProvider } from "@smithy/core/event-streams"; import { DEFAULT_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, } from "@smithy/core/retry"; import { calculateBodyLength, Hash } from "@smithy/core/serde"; import { NodeHttpHandler as RequestHandler, streamCollector } from "@smithy/node-http-handler"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; import type { XYZServiceClientConfig } from "./XYZServiceClient"; /** * @internal */ export const getRuntimeConfig = (config: XYZServiceClientConfig) => { emitWarningIfUnsupportedVersion(process.version); const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "node", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, eventStreamSerdeProvider: config?.eventStreamSerdeProvider ?? eventStreamSerdeProvider, maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config), requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? loadNodeConfig( { ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE, }, config ), sha256: config?.sha256 ?? Hash.bind(null, "sha256"), streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/my-local-model-schema/src/runtimeExtensions.ts ================================================ // smithy-typescript generated code import { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from "@smithy/core/client"; import { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from "@smithy/core/protocols"; import { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from "./auth/httpAuthExtensionConfiguration"; import type { XYZServiceExtensionConfiguration } from "./extensionConfiguration"; /** * @public */ export interface RuntimeExtension { configure(extensionConfiguration: XYZServiceExtensionConfiguration): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[]; } /** * @internal */ export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => { const extensionConfiguration: XYZServiceExtensionConfiguration = Object.assign( getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig) ); extensions.forEach((extension) => extension.configure(extensionConfiguration)); return Object.assign( runtimeConfig, resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration) ); }; ================================================ FILE: private/my-local-model-schema/src/schemas/schemas_0.ts ================================================ const _A = "Alpha"; const _CTE = "CodedThrottlingError"; const _DSN = "DifferentShapeName"; const _GN = "GetNumbers"; const _GNR = "GetNumbersRequest"; const _GNRe = "GetNumbersResponse"; const _HE = "HaltError"; const _HLC = "HttpLabelCommand"; const _HLCI = "HttpLabelCommandInput"; const _HLCO = "HttpLabelCommandOutput"; const _LDNATRP = "LabelDoesNotApplyToRpcProtocol"; const _MSLE = "MainServiceLinkedError"; const _MTE = "MysteryThrottlingError"; const _RE = "RetryableError"; const _SIL = "SparseIntegerList"; const _SIM = "SparseIntegerMap"; const _TE = "TradeEvents"; const _TES = "TradeEventStream"; const _TESR = "TradeEventStreamRequest"; const _TESRr = "TradeEventStreamResponse"; const _XYZSSE = "XYZServiceServiceException"; const _a = "alpha"; const _b = "beta"; const _bD = "bigDecimal"; const _bI = "bigInteger"; const _c = "client"; const _cCO = "camelCaseOperation"; const _cCOI = "camelCaseOperationInput"; const _cCOO = "camelCaseOperationOutput"; const _cHI = "customHeaderInput"; const _d = "delta"; const _dN = "deprecatedNumbers"; const _dNWC = "deprecatedNumbersWithoutChronology"; const _dNWE = "deprecatedNumbersWithoutExplanation"; const _e = "error"; const _eS = "eventStream"; const _fWM = "fieldWithoutMessage"; const _fWMi = "fieldWithMessage"; const _g = "gamma"; const _h = "http"; const _hE = "httpError"; const _i = "id"; const _iDN = "inexplicablyDeprecatedNumbers"; const _m = "message"; const _mR = "maxResults"; const _n = "name"; const _nT = "nextToken"; const _nu = "number"; const _num = "numbers"; const _r = "results"; const _s = "smithy.ts.sdk.synthetic.org.xyz.v1"; const _sN = "sparseNumbers"; const _sT = "startToken"; const _sp = "sparse"; const _st = "streaming"; const _t = "timestamp"; const _to = "token"; const n0 = "org.xyz.v1"; const n1 = "org.xyz.secondary"; // smithy-typescript generated code import { TypeRegistry } from "@smithy/core/schema"; import type { StaticErrorSchema, StaticListSchema, StaticMapSchema, StaticOperationSchema, StaticStructureSchema, StaticUnionSchema, } from "@smithy/types"; import { CodedThrottlingError, HaltError, MainServiceLinkedError, MysteryThrottlingError, RetryableError, XYZServiceServiceException, } from "../models/errors"; import { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; /* eslint no-var: 0 */ const _s_registry = TypeRegistry.for(_s); export var XYZServiceSyntheticServiceException$: StaticErrorSchema = [-3, _s, "XYZServiceSyntheticServiceException", 0, [], []]; _s_registry.registerError(XYZServiceSyntheticServiceException$, XYZServiceSyntheticServiceException); const n0_registry = TypeRegistry.for(n0); export var CodedThrottlingError$: StaticErrorSchema = [-3, n0, _CTE, { [_e]: _c, [_hE]: 429 }, [], [] ]; n0_registry.registerError(CodedThrottlingError$, CodedThrottlingError); export var HaltError$: StaticErrorSchema = [-3, n0, _HE, { [_e]: _c }, [_m], [0] ]; n0_registry.registerError(HaltError$, HaltError); export var MainServiceLinkedError$: StaticErrorSchema = [-3, n0, _MSLE, { [_e]: _c, [_hE]: 400 }, [], [] ]; n0_registry.registerError(MainServiceLinkedError$, MainServiceLinkedError); export var MysteryThrottlingError$: StaticErrorSchema = [-3, n0, _MTE, { [_e]: _c }, [], [] ]; n0_registry.registerError(MysteryThrottlingError$, MysteryThrottlingError); export var RetryableError$: StaticErrorSchema = [-3, n0, _RE, { [_e]: _c }, [_m], [0] ]; n0_registry.registerError(RetryableError$, RetryableError); export var XYZServiceServiceException$: StaticErrorSchema = [-3, n0, _XYZSSE, { [_e]: _c }, [], [] ]; n0_registry.registerError(XYZServiceServiceException$, XYZServiceServiceException); /** * TypeRegistry instances containing modeled errors. * @internal * */ export const errorTypeRegistries = [ _s_registry, n0_registry, ] export var HttpLabelCommandInput$: StaticStructureSchema = [3, n1, _HLCI, 0, [_LDNATRP], [[0, 1]], 1 ]; export var HttpLabelCommandOutput$: StaticStructureSchema = [3, n1, _HLCO, 0, [], [] ]; export var Alpha$: StaticStructureSchema = [3, n0, _A, 0, [_i, _t], [0, 4] ]; export var camelCaseOperationInput$: StaticStructureSchema = [3, n0, _cCOI, 0, [_to], [0] ]; export var camelCaseOperationOutput$: StaticStructureSchema = [3, n0, _cCOO, 0, [_to, _r], [0, 64 | 21] ]; export var DifferentShapeName$: StaticStructureSchema = [3, n0, _DSN, 0, [_n, _nu], [0, 1] ]; export var GetNumbersRequest$: StaticStructureSchema = [3, n0, _GNR, 0, [_bD, _bI, _fWM, _fWMi, _sT, _mR, _cHI, _num, _sN], [19, 17, 0, 0, 0, 1, 0, 128 | 1, [() => SparseIntegerMap, 0]] ]; export var GetNumbersResponse$: StaticStructureSchema = [3, n0, _GNRe, 0, [_bD, _bI, _num, _sN, _nT, _dN, _dNWE, _dNWC, _iDN], [19, 17, 64 | 1, [() => SparseIntegerList, 0], 0, 64 | 1, 64 | 1, 64 | 1, 64 | 1] ]; export var TradeEventStreamRequest$: StaticStructureSchema = [3, n0, _TESR, 0, [_eS], [[() => TradeEvents$, 0]] ]; export var TradeEventStreamResponse$: StaticStructureSchema = [3, n0, _TESRr, 0, [_eS], [[() => TradeEvents$, 0]] ]; var __Unit = "unit" as const; var Blobs = 64 | 21; var IntegerList = 64 | 1; var SparseIntegerList: StaticListSchema = [1, n0, _SIL, { [_sp]: 1 }, 1 ]; var IntegerMap = 128 | 1; var SparseIntegerMap: StaticMapSchema = [2, n0, _SIM, { [_sp]: 1 }, 0, 1 ]; export var TradeEvents$: StaticUnionSchema = [4, n0, _TE, { [_st]: 1 }, [_a, _b, _g, _d], [() => Alpha$, () => __Unit, () => __Unit, () => DifferentShapeName$] ]; export var HttpLabelCommand$: StaticOperationSchema = [9, n1, _HLC, { [_h]: ["POST", "/{LabelDoesNotApplyToRpcProtocol}", 200] }, () => HttpLabelCommandInput$, () => HttpLabelCommandOutput$ ]; export var camelCaseOperation$: StaticOperationSchema = [9, n0, _cCO, { [_h]: ["POST", "/camel-case", 200] }, () => camelCaseOperationInput$, () => camelCaseOperationOutput$ ]; export var GetNumbers$: StaticOperationSchema = [9, n0, _GN, { [_h]: ["POST", "/get-numbers", 200] }, () => GetNumbersRequest$, () => GetNumbersResponse$ ]; export var TradeEventStream$: StaticOperationSchema = [9, n0, _TES, { [_h]: ["POST", "/trade-event-stream", 200] }, () => TradeEventStreamRequest$, () => TradeEventStreamResponse$ ]; ================================================ FILE: private/my-local-model-schema/src/waiters/index.ts ================================================ // smithy-typescript generated code export * from "./waitForNumbersAligned"; export * from "./waitForNumbersMisaligned"; export * from "./waitForNumbersWhatDoTheyDoAnyway"; ================================================ FILE: private/my-local-model-schema/src/waiters/waitForNumbersAligned.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.SUCCESS, reason }; } catch (exception) { reason = exception; if (exception.name === "MysteryThrottlingError") { return { state: WaiterState.RETRY, reason }; } if (exception.name === "HaltError") { return { state: WaiterState.FAILURE, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers align * @deprecated Use waitUntilNumbersAligned instead. waitForNumbersAligned does not throw error in non-success cases. */ export const waitForNumbersAligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersAligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model-schema/src/waiters/waitForNumbersMisaligned.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { HaltError } from "../models/errors"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.RETRY, reason }; } catch (exception) { reason = exception; if (exception.name === "HaltError") { return { state: WaiterState.SUCCESS, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers don't align * @deprecated Use waitUntilNumbersMisaligned instead. waitForNumbersMisaligned does not throw error in non-success cases. */ export const waitForNumbersMisaligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers don't align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersMisaligned = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model-schema/src/waiters/waitForNumbersWhatDoTheyDoAnyway.ts ================================================ // smithy-typescript generated code import { type WaiterConfiguration, type WaiterResult, checkExceptions, createWaiter, WaiterState, } from "@smithy/core/client"; import { type GetNumbersCommandInput, type GetNumbersCommandOutput, GetNumbersCommand, } from "../commands/GetNumbersCommand"; import type { HaltError } from "../models/errors"; import type { XYZServiceSyntheticServiceException } from "../models/XYZServiceSyntheticServiceException"; import type { XYZServiceClient } from "../XYZServiceClient"; const checkState = async (client: XYZServiceClient, input: GetNumbersCommandInput): Promise> => { let reason; try { let result: GetNumbersCommandOutput & any = await client.send(new GetNumbersCommand(input)); reason = result; return { state: WaiterState.SUCCESS, reason }; } catch (exception) { reason = exception; if (exception.name === "HaltError") { return { state: WaiterState.SUCCESS, reason }; } } return { state: WaiterState.RETRY, reason }; }; /** * wait until the numbers align or don't align * @deprecated Use waitUntilNumbersWhatDoTheyDoAnyway instead. waitForNumbersWhatDoTheyDoAnyway does not throw error in non-success cases. */ export const waitForNumbersWhatDoTheyDoAnyway = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; return createWaiter({ ...serviceDefaults, ...params }, input, checkState); }; /** * wait until the numbers align or don't align * @param params - Waiter configuration options. * @param input - The input to GetNumbersCommand for polling. */ export const waitUntilNumbersWhatDoTheyDoAnyway = async ( params: WaiterConfiguration, input: GetNumbersCommandInput ): Promise> => { const serviceDefaults = { minDelay: 2, maxDelay: 120 }; const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState); return checkExceptions(result) as WaiterResult; }; ================================================ FILE: private/my-local-model-schema/test/functional/rpcv2cbor.spec.ts ================================================ // smithy-typescript generated code import { afterAll, expect, test as it } from "vitest"; import { GetNumbersCommand } from "../../src/commands/GetNumbersCommand"; import { HttpLabelCommandCommand } from "../../src/commands/HttpLabelCommandCommand"; import { XYZServiceClient } from "../../src/XYZServiceClient"; import { Readable } from "node:stream"; import { HttpRequest, HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import type { Endpoint, HeaderBag, HttpHandlerOptions } from "@smithy/types"; /** * Throws an expected exception that contains the serialized request. */ class EXPECTED_REQUEST_SERIALIZATION_ERROR extends Error { constructor(readonly request: HttpRequest) { super(); } } /** * Throws an EXPECTED_REQUEST_SERIALIZATION_ERROR error before sending a * request. The thrown exception contains the serialized request. */ class RequestSerializationTestHandler implements HttpHandler { handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.reject(new EXPECTED_REQUEST_SERIALIZATION_ERROR(request)); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } /** * Returns a resolved Promise of the specified response contents. */ class ResponseDeserializationTestHandler implements HttpHandler { isSuccess: boolean; code: number; headers: HeaderBag; body: string | Uint8Array; isBase64Body: boolean; constructor(isSuccess: boolean, code: number, headers?: HeaderBag, body?: string) { this.isSuccess = isSuccess; this.code = code; if (headers === undefined) { this.headers = {}; } else { this.headers = headers; } if (body === undefined) { body = ""; } this.body = body; this.isBase64Body = String(body).length > 0 && Buffer.from(String(body), "base64").toString("base64") === body; } handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.resolve({ response: new HttpResponse({ statusCode: this.code, headers: this.headers, body: this.isBase64Body ? toBytes(this.body as string) : Readable.from([this.body]), }), }); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } interface comparableParts { [key: string]: string; } /** * Generates a standard map of un-equal values given input parts. */ const compareParts = (expectedParts: comparableParts, generatedParts: comparableParts) => { const unequalParts: any = {}; Object.keys(expectedParts).forEach((key) => { if (generatedParts[key] === undefined) { unequalParts[key] = { exp: expectedParts[key], gen: undefined }; } else if (!equivalentContents(expectedParts[key], generatedParts[key])) { unequalParts[key] = { exp: expectedParts[key], gen: generatedParts[key] }; } }); Object.keys(generatedParts).forEach((key) => { if (expectedParts[key] === undefined) { unequalParts[key] = { exp: undefined, gen: generatedParts[key] }; } }); if (Object.keys(unequalParts).length !== 0) { return unequalParts; } return undefined; }; /** * Compares all types for equivalent contents, doing nested * equality checks based on non-`$metadata` * properties that have defined values. */ const equivalentContents = (expected: any, generated: any): boolean => { if (typeof (global as any).expect === "function") { expect(normalizeByteArrayType(generated)).toEqual(normalizeByteArrayType(expected)); return true; } let localExpected = expected; // Short circuit on equality. if (localExpected == generated) { return true; } if (typeof expected !== "object") { return expected === generated; } // If a test fails with an issue in the below 6 lines, it's likely // due to an issue in the nestedness or existence of the property // being compared. delete localExpected["$metadata"]; delete generated["$metadata"]; Object.keys(localExpected).forEach((key) => localExpected[key] === undefined && delete localExpected[key]); Object.keys(generated).forEach((key) => generated[key] === undefined && delete generated[key]); const expectedProperties = Object.getOwnPropertyNames(localExpected); const generatedProperties = Object.getOwnPropertyNames(generated); // Short circuit on different property counts. if (expectedProperties.length != generatedProperties.length) { return false; } // Compare properties directly. for (var index = 0; index < expectedProperties.length; index++) { const propertyName = expectedProperties[index]; if (!equivalentContents(localExpected[propertyName], generated[propertyName])) { return false; } } return true; }; const clientParams = { region: "us-west-2", credentials: { accessKeyId: "key", secretAccessKey: "secret" }, apiKey: { apiKey: "apiKey" }, endpoint: { url: new URL("https://localhost/"), headers: { "x-default-header": ["default-header-value"], }, }, }; /** * A wrapper function that shadows `fail` from jest-jasmine2 * (jasmine2 was replaced with circus in > v27 as the default test runner) */ const fail = (error?: any): never => { throw new Error(error); }; /** * Hexadecimal to byteArray. */ const toBytes = (hex: string) => { return Buffer.from(hex, "base64"); }; function normalizeByteArrayType(data: any) { // normalize float32 errors if (typeof data === "number") { const u = new Uint8Array(4); const dv = new DataView(u.buffer, u.byteOffset, u.byteLength); dv.setFloat32(0, data); return dv.getFloat32(0); } if (!data || typeof data !== "object") { return data; } if (data instanceof Uint8Array) { return Uint8Array.from(data); } if (data instanceof String || data instanceof Boolean || data instanceof Number) { return data.valueOf(); } const output = {} as any; for (const key of Object.getOwnPropertyNames(data)) { output[key] = normalizeByteArrayType(data[key]); } return output; } const WARMUP_ITERATIONS = 10_000; const BENCHMARK_ITERATIONS = 10_000; const BENCHMARK_TIMEOUT = 60_000; /** * Test name to benchmark data. */ const benchmarks = {} as Record< string, { n: string; p50: string; p90: string; p95: string; p99: string; mean: string; stdDev: string; } >; function logBenchmarks() { console.table(benchmarks); } function logBenchmark(name: string, timings: number[]) { const n = timings.length; const p50 = timings[(n - 1) * 0.50 | 0] | 0; const p90 = timings[(n - 1) * 0.90 | 0] | 0; const p95 = timings[(n - 1) * 0.95 | 0] | 0; const p99 = timings[(n - 1) * 0.99 | 0] | 0; const mean = timings.reduce((a, b) => a + b, 0) / timings.length | 0; const stdDev = Math.sqrt(timings.reduce((a, b) => a + (b - mean) ** 2, 0) / timings.length) | 0; const fmt = (n: number) => String(n.toLocaleString()).padStart(10, ' '); benchmarks[name] = { n: fmt(n), p50: fmt(p50), p90: fmt(p90), p95: fmt(p95), p99: fmt(p99), mean: fmt(mean), stdDev: fmt(stdDev), }; return { name, p95, n, timings }; } function vizBenchmark({ name, p95, n, timings }: { name: string, p95: number, n: number, timings: number[] }) { const decile = p95 / 10; let d = 1; const centIndex = (n / 100) | 0; let line = ""; console.info(name); console.info("=".repeat(31), "Distribution Viz", "=".repeat(31)); for (let i = 0; i < n; i += centIndex) { const t = timings[i]; if (t < decile * d) { line += "."; } else { line += ` <= ${(decile * d) | 0}`; console.info(line); d += 1; line = "."; } } console.info(line + ` > ${(decile * (d - 1)) | 0}`); console.info("=".repeat(80)); } it("HttpLabelCommandExample:Response", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", } ), }); const params: any = { LabelDoesNotApplyToRpcProtocol: "placeholder", }; const command = new HttpLabelCommandCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); it("GetNumbersRequestExample:SerdeBenchmark:Request", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new GetNumbersCommand( { } as any, ); const name = "GetNumbersRequestExample:SerdeBenchmark:Request"; const timings = [] as number[]; const testStart = performance.now(); const numeric = (a: number, b: number) => a - b; let i = 0; while (++i) { const preSerialize = performance.now(); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; }; const postSerialize = performance.now(); if (i >= WARMUP_ITERATIONS) { // allow warmup timings.push(postSerialize * 1_000_000 - preSerialize * 1_000_000); } if (timings.length >= BENCHMARK_ITERATIONS) { timings.length = BENCHMARK_ITERATIONS; break; } else if (testStart + 30_000 < preSerialize) { break; } } timings.sort(numeric); vizBenchmark(logBenchmark(name, timings)); }, BENCHMARK_TIMEOUT); it("EndpointResolvedHeadersApplied:Request", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new GetNumbersCommand( { customHeaderInput: "test-custom-value", } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/XYZService/operation/GetNumbers"); expect(r.headers["x-custom-header"]).toBe("test-custom-value"); } }); it("GetNumbersResponseExample:SerdeBenchmark:Response", async () => { const client = new XYZServiceClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", } ), }); const params: any = {}; const command = new GetNumbersCommand(params); const name = "GetNumbersResponseExample:SerdeBenchmark:Response"; const timings = [] as number[]; const numeric = (a: number, b: number) => a - b; let i = 0; client.middlewareStack.addRelativeTo( (next: any) => async (args: any) => { const preDeserialize = performance.now(); const r = await next(args); const postDeserialize = performance.now(); if (i >= WARMUP_ITERATIONS) { timings.push(postDeserialize * 1_000_000 - preDeserialize * 1_000_000); } return r; }, { name: "deserializerBenchmarkMiddleware", toMiddleware: "deserializerMiddleware", relation: "before", override: true, } ); const benchmarkStart = performance.now(); while (++i) { let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } if (i >= WARMUP_ITERATIONS + BENCHMARK_ITERATIONS) { break; } else if (benchmarkStart + 30_000 < performance.now()) { break; } } timings.sort(numeric); timings.length = Math.min(timings.length, BENCHMARK_ITERATIONS); vizBenchmark(logBenchmark(name, timings)); }, BENCHMARK_TIMEOUT); afterAll(() => { logBenchmarks(); }); ================================================ FILE: private/my-local-model-schema/test/index-objects.spec.mjs ================================================ import { Alpha$, camelCaseOperation$, CamelCaseOperationCommand, camelCaseOperationInput$, camelCaseOperationOutput$, CodedThrottlingError, CodedThrottlingError$, DifferentShapeName$, GetNumbers$, GetNumbersCommand, GetNumbersRequest$, GetNumbersResponse$, HaltError, HaltError$, HttpLabelCommand$, HttpLabelCommandCommand, HttpLabelCommandInput$, HttpLabelCommandOutput$, MainServiceLinkedError, MainServiceLinkedError$, MysteryThrottlingError, MysteryThrottlingError$, paginatecamelCaseOperation, paginateGetNumbers, RetryableError, RetryableError$, TradeEvents$, TradeEventStream$, TradeEventStreamCommand, TradeEventStreamRequest$, TradeEventStreamResponse$, waitForNumbersAligned, waitForNumbersMisaligned, waitForNumbersWhatDoTheyDoAnyway, waitUntilNumbersAligned, waitUntilNumbersMisaligned, waitUntilNumbersWhatDoTheyDoAnyway, XYZService, XYZServiceClient, XYZServiceServiceException, XYZServiceServiceException$, XYZServiceSyntheticServiceException, } from "../dist-cjs/index.js"; import assert from "node:assert"; // clients assert(typeof XYZServiceClient === "function"); assert(typeof XYZService === "function"); // commands assert(typeof HttpLabelCommandCommand === "function"); assert(typeof HttpLabelCommand$ === "object"); assert(typeof CamelCaseOperationCommand === "function"); assert(typeof camelCaseOperation$ === "object"); assert(typeof GetNumbersCommand === "function"); assert(typeof GetNumbers$ === "object"); assert(typeof TradeEventStreamCommand === "function"); assert(typeof TradeEventStream$ === "object"); // structural schemas assert(typeof HttpLabelCommandInput$ === "object"); assert(typeof HttpLabelCommandOutput$ === "object"); assert(typeof Alpha$ === "object"); assert(typeof camelCaseOperationInput$ === "object"); assert(typeof camelCaseOperationOutput$ === "object"); assert(typeof DifferentShapeName$ === "object"); assert(typeof GetNumbersRequest$ === "object"); assert(typeof GetNumbersResponse$ === "object"); assert(typeof TradeEvents$ === "object"); assert(typeof TradeEventStreamRequest$ === "object"); assert(typeof TradeEventStreamResponse$ === "object"); // errors assert(CodedThrottlingError.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof CodedThrottlingError$ === "object"); assert(HaltError.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof HaltError$ === "object"); assert(MainServiceLinkedError.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof MainServiceLinkedError$ === "object"); assert(MysteryThrottlingError.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof MysteryThrottlingError$ === "object"); assert(RetryableError.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof RetryableError$ === "object"); assert(XYZServiceServiceException.prototype instanceof XYZServiceSyntheticServiceException); assert(typeof XYZServiceServiceException$ === "object"); assert(XYZServiceSyntheticServiceException.prototype instanceof Error); // waiters assert(typeof waitForNumbersAligned === "function"); assert(typeof waitForNumbersMisaligned === "function"); assert(typeof waitForNumbersWhatDoTheyDoAnyway === "function"); assert(typeof waitUntilNumbersAligned === "function"); assert(typeof waitUntilNumbersMisaligned === "function"); assert(typeof waitUntilNumbersWhatDoTheyDoAnyway === "function"); // paginators assert(typeof paginateGetNumbers === "function"); assert(typeof paginatecamelCaseOperation === "function"); console.log(`XYZService index test passed.`); ================================================ FILE: private/my-local-model-schema/test/index-types.ts ================================================ // smithy-typescript generated code export type { XYZServiceClient, XYZService, HttpLabelCommandCommand, HttpLabelCommandCommandInput, HttpLabelCommandCommandOutput, CamelCaseOperationCommand, CamelCaseOperationCommandInput, CamelCaseOperationCommandOutput, GetNumbersCommand, GetNumbersCommandInput, GetNumbersCommandOutput, TradeEventStreamCommand, TradeEventStreamCommandInput, TradeEventStreamCommandOutput, HttpLabelCommandInput, HttpLabelCommandOutput, Alpha, CamelCaseOperationInput, CamelCaseOperationOutput, DifferentShapeName, GetNumbersRequest, GetNumbersResponse, TradeEvents, TradeEventStreamRequest, TradeEventStreamResponse, CodedThrottlingError, HaltError, MainServiceLinkedError, MysteryThrottlingError, RetryableError, XYZServiceServiceException, XYZServiceSyntheticServiceException, waitForNumbersAligned, waitForNumbersMisaligned, waitForNumbersWhatDoTheyDoAnyway, waitUntilNumbersAligned, waitUntilNumbersMisaligned, waitUntilNumbersWhatDoTheyDoAnyway, paginateGetNumbers, paginatecamelCaseOperation, } from "../dist-types/index.d"; ================================================ FILE: private/my-local-model-schema/test/snapshots/req/CamelCaseOperation.txt ================================================ POST https://localhost /mock-required-endpoint/service/XYZService/operation/camelCaseOperation x-api-key: [object Object] content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 17 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 X-Api-Key: MOCK_api_key [Uint8Array (cbor object view)] { "token": "__token__" } [actual bytes] 161, 101, 116, 111, 107, 101, 110, 105, 95, 95, 116, 111, 107, 101, 110, 95, 95 ================================================ FILE: private/my-local-model-schema/test/snapshots/req/GetNumbers.txt ================================================ POST https://localhost /mock-required-endpoint/service/XYZService/operation/GetNumbers x-api-key: [object Object] x-custom-header: __customHeaderInput__ content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 270 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 X-Api-Key: MOCK_api_key [Uint8Array (cbor object view)] { "bigDecimal": { "string": "9876543210.0123456789", "type": "bigDecimal" }, "bigInteger": 1000001, "fieldWithoutMessage": "__fieldWithoutMessage__", "fieldWithMessage": "__fieldWithMessage__", "startToken": "__startToken__", "maxResults": 0, "customHeaderInput": "__customHeaderInput__", "numbers": { "key1": 0, "key2": 0, "key3": 0 }, "sparseNumbers": { "key1": 0, "key2": 0, "key3": 0, "sparse": null } } [actual bytes] 169, 106, 98, 105, 103, 68, 101, 99, 105, 109, 97, 108, 196, 130, 41, 194, 73, 5, 90, 165, 77, 54, 159, 210, 53, 21, 106, 98, 105, 103, 73, 110, 116, 101, 103, 101, 114, 26, 0, 15, 66, 65, 115, 102, 105, 101, 108, 100, 87, 105, 116, 104, 111, 117, 116, 77, 101, 115, 115, 97, 103, 101, 119, 95, 95, 102, 105, 101, 108, 100, 87, 105, 116, 104, 111, 117, 116, 77, 101, 115, 115, 97, 103, 101, 95, 95, 112, 102, 105, 101, 108, 100, 87, 105, 116, 104, 77, 101, 115, 115, 97, 103, 101, 116, 95, 95, 102, 105, 101, 108, 100, 87, 105, 116, 104, 77, 101, 115, 115, 97, 103, 101, 95, 95, 106, 115, 116, 97, 114, 116, 84, 111, 107, 101, 110, 110, 95, 95, 115, 116, 97, 114, 116, 84, 111, 107, 101, 110, 95, 95, 106, 109, 97, 120, 82, 101, 115, 117, 108, 116, 115, 0, 113, 99, 117, 115, 116, 111, 109, 72, 101, 97, 100, 101, 114, 73, 110, 112, 117, 116, 117, 95, 95, 99, 117, 115, 116, 111, 109, 72, 101, 97, 100, 101, 114, 73, 110, 112, 117, 116, 95, 95, 103, 110, 117, 109, 98, 101, 114, 115, 163, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 109, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 115, 164, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 102, 115, 112, 97, 114, 115, 101, 246 ================================================ FILE: private/my-local-model-schema/test/snapshots/req/HttpLabelCommand.txt ================================================ POST https://localhost /mock-required-endpoint/service/XYZService/operation/HttpLabelCommand x-api-key: [object Object] content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 69 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 X-Api-Key: MOCK_api_key [Uint8Array (cbor object view)] { "LabelDoesNotApplyToRpcProtocol": "__LabelDoesNotApplyToRpcProtocol__" } [actual bytes] 161, 120, 30, 76, 97, 98, 101, 108, 68, 111, 101, 115, 78, 111, 116, 65, 112, 112, 108, 121, 84, 111, 82, 112, 99, 80, 114, 111, 116, 111, 99, 111, 108, 120, 34, 95, 95, 76, 97, 98, 101, 108, 68, 111, 101, 115, 78, 111, 116, 65, 112, 112, 108, 121, 84, 111, 82, 112, 99, 80, 114, 111, 116, 111, 99, 111, 108, 95, 95 ================================================ FILE: private/my-local-model-schema/test/snapshots/req/TradeEventStream.txt ================================================ POST https://localhost /mock-required-endpoint/service/XYZService/operation/TradeEventStream x-api-key: [object Object] content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: undefined amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 X-Api-Key: MOCK_api_key [async_iterable (Readable)] [chunk (event-stream object view)] [total-size] 102 [header-size] 85 [prelude-crc] 1750202623 :event-type: initial-request :message-type: event :content-type: application/cbor [cbor object view] {} [actual bytes] 160 [message-crc] 802441068 ============================================================ [chunk (event-stream object view)] [total-size] 122 [header-size] 75 [prelude-crc] 927907615 :event-type: alpha :message-type: event :content-type: application/cbor [cbor object view] { "id": "__id__", "timestamp": { "tag": 1, "value": 946702799.999 } } [actual bytes] 162, 98, 105, 100, 102, 95, 95, 105, 100, 95, 95, 105, 116, 105, 109, 101, 115, 116, 97, 109, 112, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59 [message-crc] 2274737008 ============================================================ [chunk (event-stream object view)] [total-size] 91 [header-size] 74 [prelude-crc] 3169356093 :event-type: beta :message-type: event :content-type: application/cbor [cbor object view] {} [actual bytes] 160 [message-crc] 3285270063 ============================================================ [chunk (event-stream object view)] [total-size] 92 [header-size] 75 [prelude-crc] 2043635131 :event-type: gamma :message-type: event :content-type: application/cbor [cbor object view] {} [actual bytes] 160 [message-crc] 2477278713 ============================================================ [chunk (event-stream object view)] [total-size] 114 [header-size] 75 [prelude-crc] 121566430 :event-type: delta :message-type: event :content-type: application/cbor [cbor object view] { "name": "__name__", "number": 0 } [actual bytes] 162, 100, 110, 97, 109, 101, 104, 95, 95, 110, 97, 109, 101, 95, 95, 102, 110, 117, 109, 98, 101, 114, 0 [message-crc] 3691208368 ============================================================ [chunk (b64)] Cg== ================================================ FILE: private/my-local-model-schema/test/snapshots/res/CamelCaseOperation.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "token": "__token__", "results": [ { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } ] } [actual bytes] 162, 101, 116, 111, 107, 101, 110, 105, 95, 95, 116, 111, 107, 101, 110, 95, 95, 103, 114, 101, 115, 117, 108, 116, 115, 131, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1 --- [output object] --- { token: "__token__", results: [ (Uint8Array) bytes[1, 0, 0, 1], (Uint8Array) bytes[1, 0, 0, 1], (Uint8Array) bytes[1, 0, 0, 1] ], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/my-local-model-schema/test/snapshots/res/GetNumbers.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "bigDecimal": { "string": "9876543210.0123456789", "type": "bigDecimal" }, "bigInteger": 1000001, "numbers": [ 0, 0, 0 ], "sparseNumbers": [ 0, 0, 0, null ], "nextToken": "__nextToken__", "deprecatedNumbers": [ 0, 0, 0 ], "deprecatedNumbersWithoutExplanation": [ 0, 0, 0 ], "deprecatedNumbersWithoutChronology": [ 0, 0, 0 ], "inexplicablyDeprecatedNumbers": [ 0, 0, 0 ] } [actual bytes] 169, 106, 98, 105, 103, 68, 101, 99, 105, 109, 97, 108, 196, 130, 41, 194, 73, 5, 90, 165, 77, 54, 159, 210, 53, 21, 106, 98, 105, 103, 73, 110, 116, 101, 103, 101, 114, 26, 0, 15, 66, 65, 103, 110, 117, 109, 98, 101, 114, 115, 131, 0, 0, 0, 109, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 115, 132, 0, 0, 0, 246, 105, 110, 101, 120, 116, 84, 111, 107, 101, 110, 109, 95, 95, 110, 101, 120, 116, 84, 111, 107, 101, 110, 95, 95, 113, 100, 101, 112, 114, 101, 99, 97, 116, 101, 100, 78, 117, 109, 98, 101, 114, 115, 131, 0, 0, 0, 120, 35, 100, 101, 112, 114, 101, 99, 97, 116, 101, 100, 78, 117, 109, 98, 101, 114, 115, 87, 105, 116, 104, 111, 117, 116, 69, 120, 112, 108, 97, 110, 97, 116, 105, 111, 110, 131, 0, 0, 0, 120, 34, 100, 101, 112, 114, 101, 99, 97, 116, 101, 100, 78, 117, 109, 98, 101, 114, 115, 87, 105, 116, 104, 111, 117, 116, 67, 104, 114, 111, 110, 111, 108, 111, 103, 121, 131, 0, 0, 0, 120, 29, 105, 110, 101, 120, 112, 108, 105, 99, 97, 98, 108, 121, 68, 101, 112, 114, 101, 99, 97, 116, 101, 100, 78, 117, 109, 98, 101, 114, 115, 131, 0, 0, 0 --- [output object] --- { bigDecimal: { string: "9876543210.0123456789", type: "bigDecimal" }, bigInteger: (number) 1000001, numbers: [ (number) 0, (number) 0, (number) 0 ], sparseNumbers: [ (number) 0, (number) 0, (number) 0, (null) ], nextToken: "__nextToken__", deprecatedNumbers: [ (number) 0, (number) 0, (number) 0 ], deprecatedNumbersWithoutExplanation: [ (number) 0, (number) 0, (number) 0 ], deprecatedNumbersWithoutChronology: [ (number) 0, (number) 0, (number) 0 ], inexplicablyDeprecatedNumbers: [ (number) 0, (number) 0, (number) 0 ], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/my-local-model-schema/test/snapshots/res/HttpLabelCommand.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/my-local-model-schema/test/snapshots/res/TradeEventStream.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [async_iterable (Object)] --- [output object] --- { eventStream: async_it[], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [async_iterable (Readable)] [chunk (event-stream object view)] [total-size] 122 [header-size] 75 [prelude-crc] 927907615 :event-type: alpha :message-type: event :content-type: application/cbor [cbor object view] { "id": "__id__", "timestamp": { "tag": 1, "value": 946702799.999 } } [actual bytes] 162, 98, 105, 100, 102, 95, 95, 105, 100, 95, 95, 105, 116, 105, 109, 101, 115, 116, 97, 109, 112, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59 [message-crc] 2274737008 ============================================================ [chunk (event-stream object view)] [total-size] 91 [header-size] 74 [prelude-crc] 3169356093 :event-type: beta :message-type: event :content-type: application/cbor [cbor object view] {} [actual bytes] 160 [message-crc] 3285270063 ============================================================ [chunk (event-stream object view)] [total-size] 92 [header-size] 75 [prelude-crc] 2043635131 :event-type: gamma :message-type: event :content-type: application/cbor [cbor object view] {} [actual bytes] 160 [message-crc] 2477278713 ============================================================ [chunk (event-stream object view)] [total-size] 114 [header-size] 75 [prelude-crc] 121566430 :event-type: delta :message-type: event :content-type: application/cbor [cbor object view] { "name": "__name__", "number": 0 } [actual bytes] 162, 100, 110, 97, 109, 101, 104, 95, 95, 110, 97, 109, 101, 95, 95, 102, 110, 117, 109, 98, 101, 114, 0 [message-crc] 3691208368 ============================================================ [chunk (b64)] Cg== --- [output object] --- { eventStream: async_it[ { alpha: { id: "__id__", timestamp: (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time } }, { beta: {} }, { gamma: {} }, { delta: { name: "__name__", number: (number) 0 } } ], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/CodedThrottlingError.txt ================================================ ======================== minimal response ======================== [status] 429 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#CodedThrottlingError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 31, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 67, 111, 100, 101, 100, 84, 104, 114, 111, 116, 116, 108, 105, 110, 103, 69, 114, 114, 111, 114 --- [error name & message] --- CodedThrottlingError: Unknown --- [error object] --- { $fault: "client", $retryable: { throttling: (boolean) true }, $metadata: { httpStatusCode: (number) 429, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "CodedThrottlingError", message: "Unknown" } ======================== w/ optional fields ======================== [status] 429 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#CodedThrottlingError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 31, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 67, 111, 100, 101, 100, 84, 104, 114, 111, 116, 116, 108, 105, 110, 103, 69, 114, 114, 111, 114 --- [error name & message] --- CodedThrottlingError: Unknown --- [error object] --- { $fault: "client", $retryable: { throttling: (boolean) true }, $metadata: { httpStatusCode: (number) 429, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "CodedThrottlingError", message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/HaltError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#HaltError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 116, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 72, 97, 108, 116, 69, 114, 114, 111, 114 --- [error name & message] --- HaltError: undefined --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "HaltError", message: (undefined) } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "__type": "org.xyz.v1#HaltError" } [actual bytes] 162, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 116, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 72, 97, 108, 116, 69, 114, 114, 111, 114 --- [error name & message] --- HaltError: __message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "HaltError", message: "__message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/MainServiceLinkedError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#MainServiceLinkedError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 33, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 77, 97, 105, 110, 83, 101, 114, 118, 105, 99, 101, 76, 105, 110, 107, 101, 100, 69, 114, 114, 111, 114 --- [error name & message] --- MainServiceLinkedError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "MainServiceLinkedError", message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#MainServiceLinkedError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 33, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 77, 97, 105, 110, 83, 101, 114, 118, 105, 99, 101, 76, 105, 110, 107, 101, 100, 69, 114, 114, 111, 114 --- [error name & message] --- MainServiceLinkedError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "MainServiceLinkedError", message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/MysteryThrottlingError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#MysteryThrottlingError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 33, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 77, 121, 115, 116, 101, 114, 121, 84, 104, 114, 111, 116, 116, 108, 105, 110, 103, 69, 114, 114, 111, 114 --- [error name & message] --- MysteryThrottlingError: Unknown --- [error object] --- { $fault: "client", $retryable: { throttling: (boolean) true }, $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "MysteryThrottlingError", message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#MysteryThrottlingError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 33, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 77, 121, 115, 116, 101, 114, 121, 84, 104, 114, 111, 116, 116, 108, 105, 110, 103, 69, 114, 114, 111, 114 --- [error name & message] --- MysteryThrottlingError: Unknown --- [error object] --- { $fault: "client", $retryable: { throttling: (boolean) true }, $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "MysteryThrottlingError", message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/RetryableError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#RetryableError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 25, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 82, 101, 116, 114, 121, 97, 98, 108, 101, 69, 114, 114, 111, 114 --- [error name & message] --- RetryableError: undefined --- [error object] --- { $fault: "client", $retryable: {}, $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "RetryableError", message: (undefined) } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "__type": "org.xyz.v1#RetryableError" } [actual bytes] 162, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 25, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 82, 101, 116, 114, 121, 97, 98, 108, 101, 69, 114, 114, 111, 114 --- [error name & message] --- RetryableError: __message__ --- [error object] --- { $fault: "client", $retryable: {}, $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "RetryableError", message: "__message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/UnmodeledServiceException.txt ================================================ ======================== minimal response ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.secondary#UnmodeledServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 43, 111, 114, 103, 46, 120, 121, 122, 46, 115, 101, 99, 111, 110, 100, 97, 114, 121, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", __type: "org.xyz.secondary#UnmodeledServiceException" } ======================== w/ optional fields ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "Message": "__Message__", "__type": "org.xyz.secondary#UnmodeledServiceException" } [actual bytes] 162, 103, 77, 101, 115, 115, 97, 103, 101, 107, 95, 95, 77, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 43, 111, 114, 103, 46, 120, 121, 122, 46, 115, 101, 99, 111, 110, 100, 97, 114, 121, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: __Message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", Message: "__Message__", __type: "org.xyz.secondary#UnmodeledServiceException", message: "__Message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots/res-err/XYZServiceServiceException.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#XYZServiceServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 37, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 88, 89, 90, 83, 101, 114, 118, 105, 99, 101, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- XYZServiceServiceException: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "XYZServiceServiceException", message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "org.xyz.v1#XYZServiceServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 37, 111, 114, 103, 46, 120, 121, 122, 46, 118, 49, 35, 88, 89, 90, 83, 101, 114, 118, 105, 99, 101, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- XYZServiceServiceException: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "XYZServiceServiceException", message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/my-local-model-schema/test/snapshots.integ.spec.ts ================================================ // smithy-typescript generated code import { SnapshotRunner } from "@smithy/snapshot-testing"; import { join } from "node:path"; import { describe, expect, test as it, vi } from "vitest"; import { camelCaseOperation$, CamelCaseOperationCommand, CodedThrottlingError$, GetNumbers$, GetNumbersCommand, HaltError$, HttpLabelCommand$, HttpLabelCommandCommand, MainServiceLinkedError$, MysteryThrottlingError$, RetryableError$, TradeEventStream$, TradeEventStreamCommand, XYZServiceClient, XYZServiceServiceException$, } from "../src"; vi.setSystemTime(new Date(946702799999)); const Client = XYZServiceClient; const mode = (process.env.SNAPSHOT_MODE as "write" | "compare") ?? "write"; describe("XYZServiceClient" + ` (${mode})`, () => { const runner = new SnapshotRunner({ snapshotDirPath: join(__dirname, "snapshots"), Client, mode, testCase(caseName: string, run: () => Promise) { it(caseName, run); }, assertions(caseName: string, expected: string, actual: string): Promise { expect(actual).toEqual(expected); return Promise.resolve(); }, schemas: new Map([ [HttpLabelCommand$, HttpLabelCommandCommand], [camelCaseOperation$, CamelCaseOperationCommand], [GetNumbers$, GetNumbersCommand], [TradeEventStream$, TradeEventStreamCommand], ]), errors: [ CodedThrottlingError$, HaltError$, MainServiceLinkedError$, MysteryThrottlingError$, RetryableError$, XYZServiceServiceException$, ], }); runner.run(); }, 30_000); ================================================ FILE: private/my-local-model-schema/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist-cjs", "noCheck": true } } ================================================ FILE: private/my-local-model-schema/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "lib": ["dom"], "module": "ESNext", "moduleResolution": "bundler", "outDir": "dist-es", "noCheck": true } } ================================================ FILE: private/my-local-model-schema/tsconfig.json ================================================ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "downlevelIteration": true, "importHelpers": true, "incremental": true, "removeComments": true, "resolveJsonModule": true, "rootDir": "src", "useUnknownInCatchVariables": false }, "include": ["src"] } ================================================ FILE: private/my-local-model-schema/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist-types", "emitDeclarationOnly": true, "noCheck": false } } ================================================ FILE: private/my-local-model-schema/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: private/my-local-model-schema/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ}.spec.ts"], include: ["**/*.spec.ts"], globals: true, }, }); ================================================ FILE: private/smithy-rpcv2-cbor/package.json ================================================ { "name": "@smithy/smithy-rpcv2-cbor", "description": "@smithy/smithy-rpcv2-cbor client", "version": "1.0.0-alpha.1", "scripts": { "build": "concurrently 'npm:build:cjs' 'npm:build:es' 'npm:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "test:index": "tsc --noEmit ./test/index-types.ts && node ./test/index-objects.spec.mjs", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "prepack": "npm run clean && npm run build", "merged": "echo \"this is merged from user configuration.\"", "test": "npx vitest run --passWithNoTests", "test:watch": "npx vitest watch --passWithNoTests", "test:integration": "npx vitest run --passWithNoTests -c vitest.config.integ.mts", "test:integration:watch": "npx vitest watch --passWithNoTests -c vitest.config.integ.mts" }, "main": "./dist-cjs/index.js", "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@smithy/core": "workspace:^", "@smithy/fetch-http-handler": "workspace:^", "@smithy/node-http-handler": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@tsconfig/node20": "20.1.8", "@types/node": "^20.14.8", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typescript": "~5.8.3", "vitest": "^4.0.17" }, "engines": { "node": ">=20.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "author": { "name": "Smithy team", "url": "https://smithy.io/" }, "license": "Apache-2.0", "browser": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.browser" }, "react-native": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.native" }, "private": true } ================================================ FILE: private/smithy-rpcv2-cbor/src/RpcV2Protocol.ts ================================================ // smithy-typescript generated code import { createAggregatedClient } from "@smithy/core/client"; import type { HttpHandlerOptions as __HttpHandlerOptions } from "@smithy/types"; import { type EmptyInputOutputCommandInput, type EmptyInputOutputCommandOutput, EmptyInputOutputCommand, } from "./commands/EmptyInputOutputCommand"; import { type Float16CommandInput, type Float16CommandOutput, Float16Command } from "./commands/Float16Command"; import { type FractionalSecondsCommandInput, type FractionalSecondsCommandOutput, FractionalSecondsCommand, } from "./commands/FractionalSecondsCommand"; import { type GreetingWithErrorsCommandInput, type GreetingWithErrorsCommandOutput, GreetingWithErrorsCommand, } from "./commands/GreetingWithErrorsCommand"; import { type NoInputOutputCommandInput, type NoInputOutputCommandOutput, NoInputOutputCommand, } from "./commands/NoInputOutputCommand"; import { type OperationWithDefaultsCommandInput, type OperationWithDefaultsCommandOutput, OperationWithDefaultsCommand, } from "./commands/OperationWithDefaultsCommand"; import { type OptionalInputOutputCommandInput, type OptionalInputOutputCommandOutput, OptionalInputOutputCommand, } from "./commands/OptionalInputOutputCommand"; import { type RecursiveShapesCommandInput, type RecursiveShapesCommandOutput, RecursiveShapesCommand, } from "./commands/RecursiveShapesCommand"; import { type RpcV2CborDenseMapsCommandInput, type RpcV2CborDenseMapsCommandOutput, RpcV2CborDenseMapsCommand, } from "./commands/RpcV2CborDenseMapsCommand"; import { type RpcV2CborListsCommandInput, type RpcV2CborListsCommandOutput, RpcV2CborListsCommand, } from "./commands/RpcV2CborListsCommand"; import { type RpcV2CborSparseMapsCommandInput, type RpcV2CborSparseMapsCommandOutput, RpcV2CborSparseMapsCommand, } from "./commands/RpcV2CborSparseMapsCommand"; import { type SimpleScalarPropertiesCommandInput, type SimpleScalarPropertiesCommandOutput, SimpleScalarPropertiesCommand, } from "./commands/SimpleScalarPropertiesCommand"; import { type SparseNullsOperationCommandInput, type SparseNullsOperationCommandOutput, SparseNullsOperationCommand, } from "./commands/SparseNullsOperationCommand"; import { RpcV2ProtocolClient } from "./RpcV2ProtocolClient"; const commands = { EmptyInputOutputCommand, Float16Command, FractionalSecondsCommand, GreetingWithErrorsCommand, NoInputOutputCommand, OperationWithDefaultsCommand, OptionalInputOutputCommand, RecursiveShapesCommand, RpcV2CborDenseMapsCommand, RpcV2CborListsCommand, RpcV2CborSparseMapsCommand, SimpleScalarPropertiesCommand, SparseNullsOperationCommand, }; export interface RpcV2Protocol { /** * @see {@link EmptyInputOutputCommand} */ emptyInputOutput(): Promise; emptyInputOutput( args: EmptyInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; emptyInputOutput( args: EmptyInputOutputCommandInput, cb: (err: any, data?: EmptyInputOutputCommandOutput) => void ): void; emptyInputOutput( args: EmptyInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: EmptyInputOutputCommandOutput) => void ): void; /** * @see {@link Float16Command} */ float16(): Promise; float16( args: Float16CommandInput, options?: __HttpHandlerOptions ): Promise; float16( args: Float16CommandInput, cb: (err: any, data?: Float16CommandOutput) => void ): void; float16( args: Float16CommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: Float16CommandOutput) => void ): void; /** * @see {@link FractionalSecondsCommand} */ fractionalSeconds(): Promise; fractionalSeconds( args: FractionalSecondsCommandInput, options?: __HttpHandlerOptions ): Promise; fractionalSeconds( args: FractionalSecondsCommandInput, cb: (err: any, data?: FractionalSecondsCommandOutput) => void ): void; fractionalSeconds( args: FractionalSecondsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: FractionalSecondsCommandOutput) => void ): void; /** * @see {@link GreetingWithErrorsCommand} */ greetingWithErrors(): Promise; greetingWithErrors( args: GreetingWithErrorsCommandInput, options?: __HttpHandlerOptions ): Promise; greetingWithErrors( args: GreetingWithErrorsCommandInput, cb: (err: any, data?: GreetingWithErrorsCommandOutput) => void ): void; greetingWithErrors( args: GreetingWithErrorsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: GreetingWithErrorsCommandOutput) => void ): void; /** * @see {@link NoInputOutputCommand} */ noInputOutput(): Promise; noInputOutput( args: NoInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; noInputOutput( args: NoInputOutputCommandInput, cb: (err: any, data?: NoInputOutputCommandOutput) => void ): void; noInputOutput( args: NoInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: NoInputOutputCommandOutput) => void ): void; /** * @see {@link OperationWithDefaultsCommand} */ operationWithDefaults(): Promise; operationWithDefaults( args: OperationWithDefaultsCommandInput, options?: __HttpHandlerOptions ): Promise; operationWithDefaults( args: OperationWithDefaultsCommandInput, cb: (err: any, data?: OperationWithDefaultsCommandOutput) => void ): void; operationWithDefaults( args: OperationWithDefaultsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: OperationWithDefaultsCommandOutput) => void ): void; /** * @see {@link OptionalInputOutputCommand} */ optionalInputOutput(): Promise; optionalInputOutput( args: OptionalInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; optionalInputOutput( args: OptionalInputOutputCommandInput, cb: (err: any, data?: OptionalInputOutputCommandOutput) => void ): void; optionalInputOutput( args: OptionalInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: OptionalInputOutputCommandOutput) => void ): void; /** * @see {@link RecursiveShapesCommand} */ recursiveShapes(): Promise; recursiveShapes( args: RecursiveShapesCommandInput, options?: __HttpHandlerOptions ): Promise; recursiveShapes( args: RecursiveShapesCommandInput, cb: (err: any, data?: RecursiveShapesCommandOutput) => void ): void; recursiveShapes( args: RecursiveShapesCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RecursiveShapesCommandOutput) => void ): void; /** * @see {@link RpcV2CborDenseMapsCommand} */ rpcV2CborDenseMaps(): Promise; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, cb: (err: any, data?: RpcV2CborDenseMapsCommandOutput) => void ): void; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborDenseMapsCommandOutput) => void ): void; /** * @see {@link RpcV2CborListsCommand} */ rpcV2CborLists(): Promise; rpcV2CborLists( args: RpcV2CborListsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborLists( args: RpcV2CborListsCommandInput, cb: (err: any, data?: RpcV2CborListsCommandOutput) => void ): void; rpcV2CborLists( args: RpcV2CborListsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborListsCommandOutput) => void ): void; /** * @see {@link RpcV2CborSparseMapsCommand} */ rpcV2CborSparseMaps(): Promise; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, cb: (err: any, data?: RpcV2CborSparseMapsCommandOutput) => void ): void; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborSparseMapsCommandOutput) => void ): void; /** * @see {@link SimpleScalarPropertiesCommand} */ simpleScalarProperties(): Promise; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, options?: __HttpHandlerOptions ): Promise; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, cb: (err: any, data?: SimpleScalarPropertiesCommandOutput) => void ): void; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: SimpleScalarPropertiesCommandOutput) => void ): void; /** * @see {@link SparseNullsOperationCommand} */ sparseNullsOperation(): Promise; sparseNullsOperation( args: SparseNullsOperationCommandInput, options?: __HttpHandlerOptions ): Promise; sparseNullsOperation( args: SparseNullsOperationCommandInput, cb: (err: any, data?: SparseNullsOperationCommandOutput) => void ): void; sparseNullsOperation( args: SparseNullsOperationCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: SparseNullsOperationCommandOutput) => void ): void; } /** * @public */ export class RpcV2Protocol extends RpcV2ProtocolClient implements RpcV2Protocol {} createAggregatedClient(commands, RpcV2Protocol); ================================================ FILE: private/smithy-rpcv2-cbor/src/RpcV2ProtocolClient.ts ================================================ // smithy-typescript generated code import { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from "@smithy/core"; import { type DefaultsMode as __DefaultsMode, type SmithyConfiguration as __SmithyConfiguration, type SmithyResolvedConfiguration as __SmithyResolvedConfiguration, Client as __Client, } from "@smithy/core/client"; import { type EndpointInputConfig, type EndpointRequiredInputConfig, type EndpointRequiredResolvedConfig, type EndpointResolvedConfig, resolveEndpointConfig, resolveEndpointRequiredConfig, } from "@smithy/core/endpoints"; import { type HttpHandlerUserInput as __HttpHandlerUserInput, getContentLengthPlugin } from "@smithy/core/protocols"; import { type RetryInputConfig, type RetryResolvedConfig, getRetryPlugin, resolveRetryConfig, } from "@smithy/core/retry"; import type { BodyLengthCalculator as __BodyLengthCalculator, CheckOptionalClientConfig as __CheckOptionalClientConfig, ChecksumConstructor as __ChecksumConstructor, Decoder as __Decoder, Encoder as __Encoder, HashConstructor as __HashConstructor, HttpHandlerOptions as __HttpHandlerOptions, Logger as __Logger, Provider as __Provider, StreamCollector as __StreamCollector, UrlParser as __UrlParser, } from "@smithy/types"; import { type HttpAuthSchemeInputConfig, type HttpAuthSchemeResolvedConfig, defaultRpcV2ProtocolHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from "./auth/httpAuthSchemeProvider"; import type { EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput } from "./commands/EmptyInputOutputCommand"; import type { Float16CommandInput, Float16CommandOutput } from "./commands/Float16Command"; import type { FractionalSecondsCommandInput, FractionalSecondsCommandOutput, } from "./commands/FractionalSecondsCommand"; import type { GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, } from "./commands/GreetingWithErrorsCommand"; import type { NoInputOutputCommandInput, NoInputOutputCommandOutput } from "./commands/NoInputOutputCommand"; import type { OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, } from "./commands/OperationWithDefaultsCommand"; import type { OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, } from "./commands/OptionalInputOutputCommand"; import type { RecursiveShapesCommandInput, RecursiveShapesCommandOutput } from "./commands/RecursiveShapesCommand"; import type { RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, } from "./commands/RpcV2CborDenseMapsCommand"; import type { RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput } from "./commands/RpcV2CborListsCommand"; import type { RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, } from "./commands/RpcV2CborSparseMapsCommand"; import type { SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, } from "./commands/SimpleScalarPropertiesCommand"; import type { SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, } from "./commands/SparseNullsOperationCommand"; import { type ClientInputEndpointParameters, type ClientResolvedEndpointParameters, type EndpointParameters, resolveClientEndpointParameters, } from "./endpoint/EndpointParameters"; import { getRuntimeConfig as __getRuntimeConfig } from "./runtimeConfig"; import { type RuntimeExtension, type RuntimeExtensionsConfig, resolveRuntimeExtensions } from "./runtimeExtensions"; export { __Client }; /** * @public */ export type ServiceInputTypes = | EmptyInputOutputCommandInput | Float16CommandInput | FractionalSecondsCommandInput | GreetingWithErrorsCommandInput | NoInputOutputCommandInput | OperationWithDefaultsCommandInput | OptionalInputOutputCommandInput | RecursiveShapesCommandInput | RpcV2CborDenseMapsCommandInput | RpcV2CborListsCommandInput | RpcV2CborSparseMapsCommandInput | SimpleScalarPropertiesCommandInput | SparseNullsOperationCommandInput; /** * @public */ export type ServiceOutputTypes = | EmptyInputOutputCommandOutput | Float16CommandOutput | FractionalSecondsCommandOutput | GreetingWithErrorsCommandOutput | NoInputOutputCommandOutput | OperationWithDefaultsCommandOutput | OptionalInputOutputCommandOutput | RecursiveShapesCommandOutput | RpcV2CborDenseMapsCommandOutput | RpcV2CborListsCommandOutput | RpcV2CborSparseMapsCommandOutput | SimpleScalarPropertiesCommandOutput | SparseNullsOperationCommandOutput; /** * @public */ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHandlerOptions>> { /** * The HTTP handler to use or its constructor options. Fetch in browser and Https in Nodejs. */ requestHandler?: __HttpHandlerUserInput; /** * A constructor for a class implementing the {@link @smithy/types#ChecksumConstructor} interface * that computes the SHA-256 HMAC or checksum of a string or binary buffer. * @internal */ sha256?: __ChecksumConstructor | __HashConstructor; /** * The function that will be used to convert strings into HTTP endpoints. * @internal */ urlParser?: __UrlParser; /** * A function that can calculate the length of a request body. * @internal */ bodyLengthChecker?: __BodyLengthCalculator; /** * A function that converts a stream into an array of bytes. * @internal */ streamCollector?: __StreamCollector; /** * The function that will be used to convert a base64-encoded string to a byte array. * @internal */ base64Decoder?: __Decoder; /** * The function that will be used to convert binary data to a base64-encoded string. * @internal */ base64Encoder?: __Encoder; /** * The function that will be used to convert a UTF8-encoded string to a byte array. * @internal */ utf8Decoder?: __Decoder; /** * The function that will be used to convert binary data to a UTF-8 encoded string. * @internal */ utf8Encoder?: __Encoder; /** * The runtime environment. * @internal */ runtime?: string; /** * Disable dynamically changing the endpoint of the client based on the hostPrefix * trait of an operation. */ disableHostPrefix?: boolean; /** * Value for how many times a request will be made at most in case of retry. */ maxAttempts?: number | __Provider; /** * Specifies which retry algorithm to use. * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-smithy-util-retry/Enum/RETRY_MODES/ * */ retryMode?: string | __Provider; /** * Optional logger for logging debug/info/warn/error. */ logger?: __Logger; /** * Optional extensions */ extensions?: RuntimeExtension[]; /** * The {@link @smithy/smithy-client#DefaultsMode} that will be used to determine how certain default configuration options are resolved in the SDK. */ defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>; } /** * @public */ export type RpcV2ProtocolClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOptions>> & ClientDefaults & RetryInputConfig & EndpointInputConfig & EndpointRequiredInputConfig & HttpAuthSchemeInputConfig & ClientInputEndpointParameters; /** * @public * * The configuration interface of RpcV2ProtocolClient class constructor that set the region, credentials and other options. */ export interface RpcV2ProtocolClientConfig extends RpcV2ProtocolClientConfigType {} /** * @public */ export type RpcV2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHandlerOptions> & Required & RuntimeExtensionsConfig & RetryResolvedConfig & EndpointResolvedConfig & EndpointRequiredResolvedConfig & HttpAuthSchemeResolvedConfig & ClientResolvedEndpointParameters; /** * @public * * The resolved configuration interface of RpcV2ProtocolClient class. This is resolved and normalized from the {@link RpcV2ProtocolClientConfig | constructor configuration interface}. */ export interface RpcV2ProtocolClientResolvedConfig extends RpcV2ProtocolClientResolvedConfigType {} /** * @public */ export class RpcV2ProtocolClient extends __Client< __HttpHandlerOptions, ServiceInputTypes, ServiceOutputTypes, RpcV2ProtocolClientResolvedConfig > { /** * The resolved configuration of RpcV2ProtocolClient class. This is resolved and normalized from the {@link RpcV2ProtocolClientConfig | constructor configuration interface}. */ readonly config: RpcV2ProtocolClientResolvedConfig; constructor(...[configuration]: __CheckOptionalClientConfig) { const _config_0 = __getRuntimeConfig(configuration || {}); super(_config_0 as any); this.initConfig = _config_0; const _config_1 = resolveClientEndpointParameters(_config_0); const _config_2 = resolveRetryConfig(_config_1); const _config_3 = resolveEndpointConfig(_config_2); const _config_4 = resolveEndpointRequiredConfig(_config_3); const _config_5 = resolveHttpAuthSchemeConfig(_config_4); const _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []); this.config = _config_6; this.middlewareStack.use(getRetryPlugin(this.config)); this.middlewareStack.use(getContentLengthPlugin(this.config)); this.middlewareStack.use( getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultRpcV2ProtocolHttpAuthSchemeParametersProvider, identityProviderConfigProvider: async (config: RpcV2ProtocolClientResolvedConfig) => new DefaultIdentityProviderConfig({}), }) ); this.middlewareStack.use(getHttpSigningPlugin(this.config)); } /** * Destroy underlying resources, like sockets. It's usually not necessary to do this. * However in Node.js, it's best to explicitly shut down the client's agent when it is no longer needed. * Otherwise, sockets might stay open for quite a long time before the server terminates them. */ destroy(): void { super.destroy(); } } ================================================ FILE: private/smithy-rpcv2-cbor/src/auth/httpAuthExtensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpAuthScheme } from "@smithy/types"; import type { RpcV2ProtocolHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; /** * @internal */ export interface HttpAuthExtensionConfiguration { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void; httpAuthSchemes(): HttpAuthScheme[]; setHttpAuthSchemeProvider(httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider): void; httpAuthSchemeProvider(): RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export type HttpAuthRuntimeConfig = Partial<{ httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider; }>; /** * @internal */ export const getHttpAuthExtensionConfiguration = ( runtimeConfig: HttpAuthRuntimeConfig ): HttpAuthExtensionConfiguration => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!; let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!; return { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; }, setHttpAuthSchemeProvider(httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): RpcV2ProtocolHttpAuthSchemeProvider { return _httpAuthSchemeProvider; }, }; }; /** * @internal */ export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => { return { httpAuthSchemes: config.httpAuthSchemes(), httpAuthSchemeProvider: config.httpAuthSchemeProvider(), }; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/auth/httpAuthSchemeProvider.ts ================================================ // smithy-typescript generated code import { getSmithyContext, normalizeProvider } from "@smithy/core/client"; import type { HandlerExecutionContext, HttpAuthOption, HttpAuthScheme, HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, HttpAuthSchemeProvider, Provider, } from "@smithy/types"; import type { RpcV2ProtocolClientResolvedConfig } from "../RpcV2ProtocolClient"; /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeParameters extends HttpAuthSchemeParameters {} /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< RpcV2ProtocolClientResolvedConfig, HandlerExecutionContext, RpcV2ProtocolHttpAuthSchemeParameters, object > {} /** * @internal */ export const defaultRpcV2ProtocolHttpAuthSchemeParametersProvider = async ( config: RpcV2ProtocolClientResolvedConfig, context: HandlerExecutionContext, input: object ): Promise => { return { operation: getSmithyContext(context).operation as string, }; }; function createSmithyApiNoAuthHttpAuthOption(authParameters: RpcV2ProtocolHttpAuthSchemeParameters): HttpAuthOption { return { schemeId: "smithy.api#noAuth", }; } /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeProvider extends HttpAuthSchemeProvider {} /** * @internal */ export const defaultRpcV2ProtocolHttpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider = (authParameters) => { const options: HttpAuthOption[] = []; switch (authParameters.operation) { default: { options.push(createSmithyApiNoAuthHttpAuthOption(authParameters)); } } return options; }; /** * @public */ export interface HttpAuthSchemeInputConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ authSchemePreference?: string[] | Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ httpAuthSchemes?: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ httpAuthSchemeProvider?: RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export interface HttpAuthSchemeResolvedConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ readonly authSchemePreference: Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ readonly httpAuthSchemes: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ readonly httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export const resolveHttpAuthSchemeConfig = ( config: T & HttpAuthSchemeInputConfig ): T & HttpAuthSchemeResolvedConfig => { return Object.assign(config, { authSchemePreference: normalizeProvider(config.authSchemePreference ?? []), }) as T & HttpAuthSchemeResolvedConfig; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/EmptyInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { EmptyStructure } from "../models/models_0"; import { de_EmptyInputOutputCommand, se_EmptyInputOutputCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link EmptyInputOutputCommand}. */ export interface EmptyInputOutputCommandInput extends EmptyStructure {} /** * @public * * The output of {@link EmptyInputOutputCommand}. */ export interface EmptyInputOutputCommandOutput extends EmptyStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, EmptyInputOutputCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, EmptyInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new EmptyInputOutputCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param EmptyInputOutputCommandInput - {@link EmptyInputOutputCommandInput} * @returns {@link EmptyInputOutputCommandOutput} * @see {@link EmptyInputOutputCommandInput} for command's `input` shape. * @see {@link EmptyInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class EmptyInputOutputCommand extends $Command .classBuilder< EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "EmptyInputOutput", {}) .n("RpcV2ProtocolClient", "EmptyInputOutputCommand") .f(void 0, void 0) .ser(se_EmptyInputOutputCommand) .de(de_EmptyInputOutputCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: {}; }; sdk: { input: EmptyInputOutputCommandInput; output: EmptyInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/Float16Command.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { Float16Output } from "../models/models_0"; import { de_Float16Command, se_Float16Command } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link Float16Command}. */ export interface Float16CommandInput {} /** * @public * * The output of {@link Float16Command}. */ export interface Float16CommandOutput extends Float16Output, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, Float16Command } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, Float16Command } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new Float16Command(input); * const response = await client.send(command); * // { // Float16Output * // value: Number("double"), * // }; * * ``` * * @param Float16CommandInput - {@link Float16CommandInput} * @returns {@link Float16CommandOutput} * @see {@link Float16CommandInput} for command's `input` shape. * @see {@link Float16CommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class Float16Command extends $Command .classBuilder< Float16CommandInput, Float16CommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "Float16", {}) .n("RpcV2ProtocolClient", "Float16Command") .f(void 0, void 0) .ser(se_Float16Command) .de(de_Float16Command) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: Float16Output; }; sdk: { input: Float16CommandInput; output: Float16CommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/FractionalSecondsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { FractionalSecondsOutput } from "../models/models_0"; import { de_FractionalSecondsCommand, se_FractionalSecondsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link FractionalSecondsCommand}. */ export interface FractionalSecondsCommandInput {} /** * @public * * The output of {@link FractionalSecondsCommand}. */ export interface FractionalSecondsCommandOutput extends FractionalSecondsOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, FractionalSecondsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, FractionalSecondsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new FractionalSecondsCommand(input); * const response = await client.send(command); * // { // FractionalSecondsOutput * // datetime: new Date("TIMESTAMP"), * // }; * * ``` * * @param FractionalSecondsCommandInput - {@link FractionalSecondsCommandInput} * @returns {@link FractionalSecondsCommandOutput} * @see {@link FractionalSecondsCommandInput} for command's `input` shape. * @see {@link FractionalSecondsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class FractionalSecondsCommand extends $Command .classBuilder< FractionalSecondsCommandInput, FractionalSecondsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "FractionalSeconds", {}) .n("RpcV2ProtocolClient", "FractionalSecondsCommand") .f(void 0, void 0) .ser(se_FractionalSecondsCommand) .de(de_FractionalSecondsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: FractionalSecondsOutput; }; sdk: { input: FractionalSecondsCommandInput; output: FractionalSecondsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/GreetingWithErrorsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { GreetingWithErrorsOutput } from "../models/models_0"; import { de_GreetingWithErrorsCommand, se_GreetingWithErrorsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link GreetingWithErrorsCommand}. */ export interface GreetingWithErrorsCommandInput {} /** * @public * * The output of {@link GreetingWithErrorsCommand}. */ export interface GreetingWithErrorsCommandOutput extends GreetingWithErrorsOutput, __MetadataBearer {} /** * This operation has three possible return values: * * 1. A successful response in the form of GreetingWithErrorsOutput * 2. An InvalidGreeting error. * 3. A ComplexError error. * * Implementations must be able to successfully take a response and * properly deserialize successful and error responses. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, GreetingWithErrorsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, GreetingWithErrorsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new GreetingWithErrorsCommand(input); * const response = await client.send(command); * // { // GreetingWithErrorsOutput * // greeting: "STRING_VALUE", * // }; * * ``` * * @param GreetingWithErrorsCommandInput - {@link GreetingWithErrorsCommandInput} * @returns {@link GreetingWithErrorsCommandOutput} * @see {@link GreetingWithErrorsCommandInput} for command's `input` shape. * @see {@link GreetingWithErrorsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link InvalidGreeting} (client fault) * This error is thrown when an invalid greeting value is provided. * * @throws {@link ComplexError} (client fault) * This error is thrown when a request is invalid. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class GreetingWithErrorsCommand extends $Command .classBuilder< GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "GreetingWithErrors", {}) .n("RpcV2ProtocolClient", "GreetingWithErrorsCommand") .f(void 0, void 0) .ser(se_GreetingWithErrorsCommand) .de(de_GreetingWithErrorsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: GreetingWithErrorsOutput; }; sdk: { input: GreetingWithErrorsCommandInput; output: GreetingWithErrorsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/NoInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import { de_NoInputOutputCommand, se_NoInputOutputCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link NoInputOutputCommand}. */ export interface NoInputOutputCommandInput {} /** * @public * * The output of {@link NoInputOutputCommand}. */ export interface NoInputOutputCommandOutput extends __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, NoInputOutputCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, NoInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new NoInputOutputCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param NoInputOutputCommandInput - {@link NoInputOutputCommandInput} * @returns {@link NoInputOutputCommandOutput} * @see {@link NoInputOutputCommandInput} for command's `input` shape. * @see {@link NoInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class NoInputOutputCommand extends $Command .classBuilder< NoInputOutputCommandInput, NoInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "NoInputOutput", {}) .n("RpcV2ProtocolClient", "NoInputOutputCommand") .f(void 0, void 0) .ser(se_NoInputOutputCommand) .de(de_NoInputOutputCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: {}; }; sdk: { input: NoInputOutputCommandInput; output: NoInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/OperationWithDefaultsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { OperationWithDefaultsInput, OperationWithDefaultsOutput } from "../models/models_0"; import { de_OperationWithDefaultsCommand, se_OperationWithDefaultsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link OperationWithDefaultsCommand}. */ export interface OperationWithDefaultsCommandInput extends OperationWithDefaultsInput {} /** * @public * * The output of {@link OperationWithDefaultsCommand}. */ export interface OperationWithDefaultsCommandOutput extends OperationWithDefaultsOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, OperationWithDefaultsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, OperationWithDefaultsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // OperationWithDefaultsInput * defaults: { // Defaults * defaultString: "STRING_VALUE", * defaultBoolean: true || false, * defaultList: [ // TestStringList * "STRING_VALUE", * ], * defaultTimestamp: new Date("TIMESTAMP"), * defaultBlob: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * defaultByte: 0, // BYTE_VALUE * defaultShort: Number("short"), * defaultInteger: Number("int"), * defaultLong: Number("long"), * defaultFloat: Number("float"), * defaultDouble: Number("double"), * defaultMap: { // TestStringMap * "": "STRING_VALUE", * }, * defaultEnum: "FOO" || "BAR" || "BAZ", * defaultIntEnum: 1 || 2, * emptyString: "STRING_VALUE", * falseBoolean: true || false, * emptyBlob: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * zeroByte: 0, // BYTE_VALUE * zeroShort: Number("short"), * zeroInteger: Number("int"), * zeroLong: Number("long"), * zeroFloat: Number("float"), * zeroDouble: Number("double"), * }, * clientOptionalDefaults: { // ClientOptionalDefaults * member: Number("int"), * }, * topLevelDefault: "STRING_VALUE", * otherTopLevelDefault: Number("int"), * }; * const command = new OperationWithDefaultsCommand(input); * const response = await client.send(command); * // { // OperationWithDefaultsOutput * // defaultString: "STRING_VALUE", * // defaultBoolean: true || false, * // defaultList: [ // TestStringList * // "STRING_VALUE", * // ], * // defaultTimestamp: new Date("TIMESTAMP"), * // defaultBlob: new Uint8Array(), * // defaultByte: 0, // BYTE_VALUE * // defaultShort: Number("short"), * // defaultInteger: Number("int"), * // defaultLong: Number("long"), * // defaultFloat: Number("float"), * // defaultDouble: Number("double"), * // defaultMap: { // TestStringMap * // "": "STRING_VALUE", * // }, * // defaultEnum: "FOO" || "BAR" || "BAZ", * // defaultIntEnum: 1 || 2, * // emptyString: "STRING_VALUE", * // falseBoolean: true || false, * // emptyBlob: new Uint8Array(), * // zeroByte: 0, // BYTE_VALUE * // zeroShort: Number("short"), * // zeroInteger: Number("int"), * // zeroLong: Number("long"), * // zeroFloat: Number("float"), * // zeroDouble: Number("double"), * // }; * * ``` * * @param OperationWithDefaultsCommandInput - {@link OperationWithDefaultsCommandInput} * @returns {@link OperationWithDefaultsCommandOutput} * @see {@link OperationWithDefaultsCommandInput} for command's `input` shape. * @see {@link OperationWithDefaultsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class OperationWithDefaultsCommand extends $Command .classBuilder< OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "OperationWithDefaults", {}) .n("RpcV2ProtocolClient", "OperationWithDefaultsCommand") .f(void 0, void 0) .ser(se_OperationWithDefaultsCommand) .de(de_OperationWithDefaultsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: OperationWithDefaultsInput; output: OperationWithDefaultsOutput; }; sdk: { input: OperationWithDefaultsCommandInput; output: OperationWithDefaultsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/OptionalInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SimpleStructure } from "../models/models_0"; import { de_OptionalInputOutputCommand, se_OptionalInputOutputCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link OptionalInputOutputCommand}. */ export interface OptionalInputOutputCommandInput extends SimpleStructure {} /** * @public * * The output of {@link OptionalInputOutputCommand}. */ export interface OptionalInputOutputCommandOutput extends SimpleStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, OptionalInputOutputCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, OptionalInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SimpleStructure * value: "STRING_VALUE", * }; * const command = new OptionalInputOutputCommand(input); * const response = await client.send(command); * // { // SimpleStructure * // value: "STRING_VALUE", * // }; * * ``` * * @param OptionalInputOutputCommandInput - {@link OptionalInputOutputCommandInput} * @returns {@link OptionalInputOutputCommandOutput} * @see {@link OptionalInputOutputCommandInput} for command's `input` shape. * @see {@link OptionalInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class OptionalInputOutputCommand extends $Command .classBuilder< OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "OptionalInputOutput", {}) .n("RpcV2ProtocolClient", "OptionalInputOutputCommand") .f(void 0, void 0) .ser(se_OptionalInputOutputCommand) .de(de_OptionalInputOutputCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SimpleStructure; output: SimpleStructure; }; sdk: { input: OptionalInputOutputCommandInput; output: OptionalInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/RecursiveShapesCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RecursiveShapesInputOutput } from "../models/models_0"; import { de_RecursiveShapesCommand, se_RecursiveShapesCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RecursiveShapesCommand}. */ export interface RecursiveShapesCommandInput extends RecursiveShapesInputOutput {} /** * @public * * The output of {@link RecursiveShapesCommand}. */ export interface RecursiveShapesCommandOutput extends RecursiveShapesInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RecursiveShapesCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, RecursiveShapesCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RecursiveShapesInputOutput * nested: { // RecursiveShapesInputOutputNested1 * foo: "STRING_VALUE", * nested: { // RecursiveShapesInputOutputNested2 * bar: "STRING_VALUE", * recursiveMember: { * foo: "STRING_VALUE", * nested: { * bar: "STRING_VALUE", * recursiveMember: "", * }, * }, * }, * }, * }; * const command = new RecursiveShapesCommand(input); * const response = await client.send(command); * // { // RecursiveShapesInputOutput * // nested: { // RecursiveShapesInputOutputNested1 * // foo: "STRING_VALUE", * // nested: { // RecursiveShapesInputOutputNested2 * // bar: "STRING_VALUE", * // recursiveMember: { * // foo: "STRING_VALUE", * // nested: { * // bar: "STRING_VALUE", * // recursiveMember: "", * // }, * // }, * // }, * // }, * // }; * * ``` * * @param RecursiveShapesCommandInput - {@link RecursiveShapesCommandInput} * @returns {@link RecursiveShapesCommandOutput} * @see {@link RecursiveShapesCommandInput} for command's `input` shape. * @see {@link RecursiveShapesCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class RecursiveShapesCommand extends $Command .classBuilder< RecursiveShapesCommandInput, RecursiveShapesCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "RecursiveShapes", {}) .n("RpcV2ProtocolClient", "RecursiveShapesCommand") .f(void 0, void 0) .ser(se_RecursiveShapesCommand) .de(de_RecursiveShapesCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RecursiveShapesInputOutput; output: RecursiveShapesInputOutput; }; sdk: { input: RecursiveShapesCommandInput; output: RecursiveShapesCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/RpcV2CborDenseMapsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborDenseMapsInputOutput } from "../models/models_0"; import { de_RpcV2CborDenseMapsCommand, se_RpcV2CborDenseMapsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborDenseMapsCommand}. */ export interface RpcV2CborDenseMapsCommandInput extends RpcV2CborDenseMapsInputOutput {} /** * @public * * The output of {@link RpcV2CborDenseMapsCommand}. */ export interface RpcV2CborDenseMapsCommandOutput extends RpcV2CborDenseMapsInputOutput, __MetadataBearer {} /** * The example tests basic map serialization. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborDenseMapsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborDenseMapsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborDenseMapsInputOutput * denseStructMap: { // DenseStructMap * "": { // GreetingStruct * hi: "STRING_VALUE", * }, * }, * denseNumberMap: { // DenseNumberMap * "": Number("int"), * }, * denseBooleanMap: { // DenseBooleanMap * "": true || false, * }, * denseStringMap: { // DenseStringMap * "": "STRING_VALUE", * }, * denseSetMap: { // DenseSetMap * "": [ // StringSet * "STRING_VALUE", * ], * }, * }; * const command = new RpcV2CborDenseMapsCommand(input); * const response = await client.send(command); * // { // RpcV2CborDenseMapsInputOutput * // denseStructMap: { // DenseStructMap * // "": { // GreetingStruct * // hi: "STRING_VALUE", * // }, * // }, * // denseNumberMap: { // DenseNumberMap * // "": Number("int"), * // }, * // denseBooleanMap: { // DenseBooleanMap * // "": true || false, * // }, * // denseStringMap: { // DenseStringMap * // "": "STRING_VALUE", * // }, * // denseSetMap: { // DenseSetMap * // "": [ // StringSet * // "STRING_VALUE", * // ], * // }, * // }; * * ``` * * @param RpcV2CborDenseMapsCommandInput - {@link RpcV2CborDenseMapsCommandInput} * @returns {@link RpcV2CborDenseMapsCommandOutput} * @see {@link RpcV2CborDenseMapsCommandInput} for command's `input` shape. * @see {@link RpcV2CborDenseMapsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class RpcV2CborDenseMapsCommand extends $Command .classBuilder< RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "RpcV2CborDenseMaps", {}) .n("RpcV2ProtocolClient", "RpcV2CborDenseMapsCommand") .f(void 0, void 0) .ser(se_RpcV2CborDenseMapsCommand) .de(de_RpcV2CborDenseMapsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborDenseMapsInputOutput; output: RpcV2CborDenseMapsInputOutput; }; sdk: { input: RpcV2CborDenseMapsCommandInput; output: RpcV2CborDenseMapsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/RpcV2CborListsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborListInputOutput } from "../models/models_0"; import { de_RpcV2CborListsCommand, se_RpcV2CborListsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborListsCommand}. */ export interface RpcV2CborListsCommandInput extends RpcV2CborListInputOutput {} /** * @public * * The output of {@link RpcV2CborListsCommand}. */ export interface RpcV2CborListsCommandOutput extends RpcV2CborListInputOutput, __MetadataBearer {} /** * This test case serializes JSON lists for the following cases for both * input and output: * * 1. Normal lists. * 2. Normal sets. * 3. Lists of lists. * 4. Lists of structures. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborListsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborListsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborListInputOutput * stringList: [ // StringList * "STRING_VALUE", * ], * stringSet: [ // StringSet * "STRING_VALUE", * ], * integerList: [ // IntegerList * Number("int"), * ], * booleanList: [ // BooleanList * true || false, * ], * timestampList: [ // TimestampList * new Date("TIMESTAMP"), * ], * enumList: [ // FooEnumList * "Foo" || "Baz" || "Bar" || "1" || "0", * ], * intEnumList: [ // IntegerEnumList * 1 || 2 || 3, * ], * nestedStringList: [ // NestedStringList * [ * "STRING_VALUE", * ], * ], * structureList: [ // StructureList * { // StructureListMember * a: "STRING_VALUE", * b: "STRING_VALUE", * }, * ], * blobList: [ // BlobList * new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * ], * }; * const command = new RpcV2CborListsCommand(input); * const response = await client.send(command); * // { // RpcV2CborListInputOutput * // stringList: [ // StringList * // "STRING_VALUE", * // ], * // stringSet: [ // StringSet * // "STRING_VALUE", * // ], * // integerList: [ // IntegerList * // Number("int"), * // ], * // booleanList: [ // BooleanList * // true || false, * // ], * // timestampList: [ // TimestampList * // new Date("TIMESTAMP"), * // ], * // enumList: [ // FooEnumList * // "Foo" || "Baz" || "Bar" || "1" || "0", * // ], * // intEnumList: [ // IntegerEnumList * // 1 || 2 || 3, * // ], * // nestedStringList: [ // NestedStringList * // [ * // "STRING_VALUE", * // ], * // ], * // structureList: [ // StructureList * // { // StructureListMember * // a: "STRING_VALUE", * // b: "STRING_VALUE", * // }, * // ], * // blobList: [ // BlobList * // new Uint8Array(), * // ], * // }; * * ``` * * @param RpcV2CborListsCommandInput - {@link RpcV2CborListsCommandInput} * @returns {@link RpcV2CborListsCommandOutput} * @see {@link RpcV2CborListsCommandInput} for command's `input` shape. * @see {@link RpcV2CborListsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class RpcV2CborListsCommand extends $Command .classBuilder< RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "RpcV2CborLists", {}) .n("RpcV2ProtocolClient", "RpcV2CborListsCommand") .f(void 0, void 0) .ser(se_RpcV2CborListsCommand) .de(de_RpcV2CborListsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborListInputOutput; output: RpcV2CborListInputOutput; }; sdk: { input: RpcV2CborListsCommandInput; output: RpcV2CborListsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/RpcV2CborSparseMapsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborSparseMapsInputOutput } from "../models/models_0"; import { de_RpcV2CborSparseMapsCommand, se_RpcV2CborSparseMapsCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborSparseMapsCommand}. */ export interface RpcV2CborSparseMapsCommandInput extends RpcV2CborSparseMapsInputOutput {} /** * @public * * The output of {@link RpcV2CborSparseMapsCommand}. */ export interface RpcV2CborSparseMapsCommandOutput extends RpcV2CborSparseMapsInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborSparseMapsCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborSparseMapsCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborSparseMapsInputOutput * sparseStructMap: { // SparseStructMap * "": { // GreetingStruct * hi: "STRING_VALUE", * }, * }, * sparseNumberMap: { // SparseNumberMap * "": Number("int"), * }, * sparseBooleanMap: { // SparseBooleanMap * "": true || false, * }, * sparseStringMap: { // SparseStringMap * "": "STRING_VALUE", * }, * sparseSetMap: { // SparseSetMap * "": [ // StringSet * "STRING_VALUE", * ], * }, * }; * const command = new RpcV2CborSparseMapsCommand(input); * const response = await client.send(command); * // { // RpcV2CborSparseMapsInputOutput * // sparseStructMap: { // SparseStructMap * // "": { // GreetingStruct * // hi: "STRING_VALUE", * // }, * // }, * // sparseNumberMap: { // SparseNumberMap * // "": Number("int"), * // }, * // sparseBooleanMap: { // SparseBooleanMap * // "": true || false, * // }, * // sparseStringMap: { // SparseStringMap * // "": "STRING_VALUE", * // }, * // sparseSetMap: { // SparseSetMap * // "": [ // StringSet * // "STRING_VALUE", * // ], * // }, * // }; * * ``` * * @param RpcV2CborSparseMapsCommandInput - {@link RpcV2CborSparseMapsCommandInput} * @returns {@link RpcV2CborSparseMapsCommandOutput} * @see {@link RpcV2CborSparseMapsCommandInput} for command's `input` shape. * @see {@link RpcV2CborSparseMapsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class RpcV2CborSparseMapsCommand extends $Command .classBuilder< RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "RpcV2CborSparseMaps", {}) .n("RpcV2ProtocolClient", "RpcV2CborSparseMapsCommand") .f(void 0, void 0) .ser(se_RpcV2CborSparseMapsCommand) .de(de_RpcV2CborSparseMapsCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborSparseMapsInputOutput; output: RpcV2CborSparseMapsInputOutput; }; sdk: { input: RpcV2CborSparseMapsCommandInput; output: RpcV2CborSparseMapsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/SimpleScalarPropertiesCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SimpleScalarStructure } from "../models/models_0"; import { de_SimpleScalarPropertiesCommand, se_SimpleScalarPropertiesCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link SimpleScalarPropertiesCommand}. */ export interface SimpleScalarPropertiesCommandInput extends SimpleScalarStructure {} /** * @public * * The output of {@link SimpleScalarPropertiesCommand}. */ export interface SimpleScalarPropertiesCommandOutput extends SimpleScalarStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, SimpleScalarPropertiesCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, SimpleScalarPropertiesCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SimpleScalarStructure * trueBooleanValue: true || false, * falseBooleanValue: true || false, * byteValue: 0, // BYTE_VALUE * doubleValue: Number("double"), * floatValue: Number("float"), * integerValue: Number("int"), * longValue: Number("long"), * shortValue: Number("short"), * stringValue: "STRING_VALUE", * blobValue: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * }; * const command = new SimpleScalarPropertiesCommand(input); * const response = await client.send(command); * // { // SimpleScalarStructure * // trueBooleanValue: true || false, * // falseBooleanValue: true || false, * // byteValue: 0, // BYTE_VALUE * // doubleValue: Number("double"), * // floatValue: Number("float"), * // integerValue: Number("int"), * // longValue: Number("long"), * // shortValue: Number("short"), * // stringValue: "STRING_VALUE", * // blobValue: new Uint8Array(), * // }; * * ``` * * @param SimpleScalarPropertiesCommandInput - {@link SimpleScalarPropertiesCommandInput} * @returns {@link SimpleScalarPropertiesCommandOutput} * @see {@link SimpleScalarPropertiesCommandInput} for command's `input` shape. * @see {@link SimpleScalarPropertiesCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class SimpleScalarPropertiesCommand extends $Command .classBuilder< SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "SimpleScalarProperties", {}) .n("RpcV2ProtocolClient", "SimpleScalarPropertiesCommand") .f(void 0, void 0) .ser(se_SimpleScalarPropertiesCommand) .de(de_SimpleScalarPropertiesCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SimpleScalarStructure; output: SimpleScalarStructure; }; sdk: { input: SimpleScalarPropertiesCommandInput; output: SimpleScalarPropertiesCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/SparseNullsOperationCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import { getSerdePlugin } from "@smithy/core/serde"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SparseNullsOperationInputOutput } from "../models/models_0"; import { de_SparseNullsOperationCommand, se_SparseNullsOperationCommand } from "../protocols/Rpcv2cbor"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link SparseNullsOperationCommand}. */ export interface SparseNullsOperationCommandInput extends SparseNullsOperationInputOutput {} /** * @public * * The output of {@link SparseNullsOperationCommand}. */ export interface SparseNullsOperationCommandOutput extends SparseNullsOperationInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, SparseNullsOperationCommand } from "@smithy/smithy-rpcv2-cbor"; // ES Modules import * // const { RpcV2ProtocolClient, SparseNullsOperationCommand } = require("@smithy/smithy-rpcv2-cbor"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SparseNullsOperationInputOutput * sparseStringList: [ // SparseStringList * "STRING_VALUE", * ], * sparseStringMap: { // SparseStringMap * "": "STRING_VALUE", * }, * }; * const command = new SparseNullsOperationCommand(input); * const response = await client.send(command); * // { // SparseNullsOperationInputOutput * // sparseStringList: [ // SparseStringList * // "STRING_VALUE", * // ], * // sparseStringMap: { // SparseStringMap * // "": "STRING_VALUE", * // }, * // }; * * ``` * * @param SparseNullsOperationCommandInput - {@link SparseNullsOperationCommandInput} * @returns {@link SparseNullsOperationCommandOutput} * @see {@link SparseNullsOperationCommandInput} for command's `input` shape. * @see {@link SparseNullsOperationCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class SparseNullsOperationCommand extends $Command .classBuilder< SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [ getSerdePlugin(config, this.serialize, this.deserialize), getEndpointPlugin(config, Command.getEndpointParameterInstructions()), ]; }) .s("RpcV2Protocol", "SparseNullsOperation", {}) .n("RpcV2ProtocolClient", "SparseNullsOperationCommand") .f(void 0, void 0) .ser(se_SparseNullsOperationCommand) .de(de_SparseNullsOperationCommand) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SparseNullsOperationInputOutput; output: SparseNullsOperationInputOutput; }; sdk: { input: SparseNullsOperationCommandInput; output: SparseNullsOperationCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor/src/commands/index.ts ================================================ // smithy-typescript generated code export * from "./EmptyInputOutputCommand"; export * from "./Float16Command"; export * from "./FractionalSecondsCommand"; export * from "./GreetingWithErrorsCommand"; export * from "./NoInputOutputCommand"; export * from "./OperationWithDefaultsCommand"; export * from "./OptionalInputOutputCommand"; export * from "./RecursiveShapesCommand"; export * from "./RpcV2CborDenseMapsCommand"; export * from "./RpcV2CborListsCommand"; export * from "./RpcV2CborSparseMapsCommand"; export * from "./SimpleScalarPropertiesCommand"; export * from "./SparseNullsOperationCommand"; ================================================ FILE: private/smithy-rpcv2-cbor/src/endpoint/EndpointParameters.ts ================================================ // smithy-typescript generated code import type { Endpoint, EndpointParameters as __EndpointParameters, EndpointV2, Provider } from "@smithy/types"; /** * @public */ export interface ClientInputEndpointParameters { endpoint?: string | Provider | Endpoint | Provider | EndpointV2 | Provider; } /** * @public */ export type ClientResolvedEndpointParameters = Omit & { defaultSigningName: string; }; /** * @internal */ export const resolveClientEndpointParameters = ( options: T & ClientInputEndpointParameters ): T & ClientResolvedEndpointParameters => { return Object.assign(options, { defaultSigningName: "", }); }; /** * @internal */ export const commonParams = { endpoint: { type: "builtInParams", name: "endpoint" }, } as const; /** * @internal */ export interface EndpointParameters extends __EndpointParameters { endpoint?: string | undefined; } ================================================ FILE: private/smithy-rpcv2-cbor/src/endpoint/bdd.ts ================================================ // smithy-typescript generated code import { BinaryDecisionDiagram } from "@smithy/core/endpoints"; const a={"ref":"endpoint"}; const _data={ conditions: [ ["isSet",[a]] ], results: [ [-1], [a,{}], [-1,"(default endpointRuleSet) endpoint is not set - you must configure an endpoint."] ] }; const root = 2; const r = 100_000_000; const nodes = new Int32Array([ -1, 1, -1, 0, r + 1, r + 2, ]); export const bdd = BinaryDecisionDiagram.from( nodes, root, _data.conditions, _data.results ); ================================================ FILE: private/smithy-rpcv2-cbor/src/endpoint/endpointResolver.ts ================================================ // smithy-typescript generated code import { type EndpointParams, decideEndpoint, EndpointCache } from "@smithy/core/endpoints"; import type { EndpointV2, Logger } from "@smithy/types"; import { bdd } from "./bdd"; import type { EndpointParameters } from "./EndpointParameters"; const cache = new EndpointCache({ size: 50, params: ["endpoint"], }); /** * @internal */ export const defaultEndpointResolver = ( endpointParams: EndpointParameters, context: { logger?: Logger } = {} ): EndpointV2 => { return cache.get(endpointParams as EndpointParams, () => decideEndpoint(bdd, { endpointParams: endpointParams as EndpointParams, logger: context.logger, }) ); }; ================================================ FILE: private/smithy-rpcv2-cbor/src/extensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpHandlerExtensionConfiguration } from "@smithy/core/protocols"; import type { DefaultExtensionConfiguration } from "@smithy/types"; import type { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration"; /** * @internal */ export interface RpcV2ProtocolExtensionConfiguration extends HttpHandlerExtensionConfiguration, DefaultExtensionConfiguration, HttpAuthExtensionConfiguration {} ================================================ FILE: private/smithy-rpcv2-cbor/src/index.ts ================================================ // smithy-typescript generated code /* eslint-disable */ export * from "./RpcV2ProtocolClient"; export * from "./RpcV2Protocol"; export type { ClientInputEndpointParameters } from "./endpoint/EndpointParameters"; export type { RuntimeExtension } from "./runtimeExtensions"; export type { RpcV2ProtocolExtensionConfiguration } from "./extensionConfiguration"; export * from "./commands"; export * from "./models/enums"; export * from "./models/errors"; export * from "./models/models_0"; export { RpcV2ProtocolServiceException } from "./models/RpcV2ProtocolServiceException"; ================================================ FILE: private/smithy-rpcv2-cbor/src/models/RpcV2ProtocolServiceException.ts ================================================ // smithy-typescript generated code import { type ServiceExceptionOptions as __ServiceExceptionOptions, ServiceException as __ServiceException, } from "@smithy/core/client"; export type { __ServiceExceptionOptions }; export { __ServiceException }; /** * @public * * Base exception class for all service exceptions from RpcV2Protocol service. */ export class RpcV2ProtocolServiceException extends __ServiceException { /** * @internal */ constructor(options: __ServiceExceptionOptions) { super(options); Object.setPrototypeOf(this, RpcV2ProtocolServiceException.prototype); } } ================================================ FILE: private/smithy-rpcv2-cbor/src/models/enums.ts ================================================ // smithy-typescript generated code /** * @public * @enum */ export const TestEnum = { BAR: "BAR", BAZ: "BAZ", FOO: "FOO", } as const; /** * @public */ export type TestEnum = (typeof TestEnum)[keyof typeof TestEnum]; export enum TestIntEnum { ONE = 1, TWO = 2, } /** * @public * @enum */ export const FooEnum = { BAR: "Bar", BAZ: "Baz", FOO: "Foo", ONE: "1", ZERO: "0", } as const; /** * @public */ export type FooEnum = (typeof FooEnum)[keyof typeof FooEnum]; export enum IntegerEnum { A = 1, B = 2, C = 3, } ================================================ FILE: private/smithy-rpcv2-cbor/src/models/errors.ts ================================================ // smithy-typescript generated code import type { ExceptionOptionType as __ExceptionOptionType } from "@smithy/core/client"; import type { ComplexNestedErrorData, ValidationExceptionField } from "./models_0"; import { RpcV2ProtocolServiceException as __BaseException } from "./RpcV2ProtocolServiceException"; /** * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * @public */ export class ValidationException extends __BaseException { readonly name = "ValidationException" as const; readonly $fault = "client" as const; /** * A list of specific failures encountered while validating the input. * A member can appear in this list more than once if it failed to satisfy multiple constraints. * @public */ fieldList?: ValidationExceptionField[] | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "ValidationException", $fault: "client", ...opts, }); Object.setPrototypeOf(this, ValidationException.prototype); this.fieldList = opts.fieldList; } } /** * This error is thrown when a request is invalid. * @public */ export class ComplexError extends __BaseException { readonly name = "ComplexError" as const; readonly $fault = "client" as const; TopLevel?: string | undefined; Nested?: ComplexNestedErrorData | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "ComplexError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, ComplexError.prototype); this.TopLevel = opts.TopLevel; this.Nested = opts.Nested; } } /** * This error is thrown when an invalid greeting value is provided. * @public */ export class InvalidGreeting extends __BaseException { readonly name = "InvalidGreeting" as const; readonly $fault = "client" as const; Message?: string | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "InvalidGreeting", $fault: "client", ...opts, }); Object.setPrototypeOf(this, InvalidGreeting.prototype); this.Message = opts.Message; } } ================================================ FILE: private/smithy-rpcv2-cbor/src/models/models_0.ts ================================================ // smithy-typescript generated code import type { FooEnum, IntegerEnum, TestEnum, TestIntEnum } from "./enums"; /** * Describes one specific validation failure for an input member. * @public */ export interface ValidationExceptionField { /** * A JSONPointer expression to the structure member whose value failed to satisfy the modeled constraints. * @public */ path: string | undefined; /** * A detailed description of the validation failure. * @public */ message: string | undefined; } /** * @public */ export interface ClientOptionalDefaults { member?: number | undefined; } /** * @public */ export interface ComplexNestedErrorData { Foo?: string | undefined; } /** * @public */ export interface Defaults { defaultString?: string | undefined; defaultBoolean?: boolean | undefined; defaultList?: string[] | undefined; defaultTimestamp?: Date | undefined; defaultBlob?: Uint8Array | undefined; defaultByte?: number | undefined; defaultShort?: number | undefined; defaultInteger?: number | undefined; defaultLong?: number | undefined; defaultFloat?: number | undefined; defaultDouble?: number | undefined; defaultMap?: Record | undefined; defaultEnum?: TestEnum | undefined; defaultIntEnum?: TestIntEnum | undefined; emptyString?: string | undefined; falseBoolean?: boolean | undefined; emptyBlob?: Uint8Array | undefined; zeroByte?: number | undefined; zeroShort?: number | undefined; zeroInteger?: number | undefined; zeroLong?: number | undefined; zeroFloat?: number | undefined; zeroDouble?: number | undefined; } /** * @public */ export interface GreetingStruct { hi?: string | undefined; } /** * @public */ export interface EmptyStructure {} /** * @public */ export interface Float16Output { value?: number | undefined; } /** * @public */ export interface FractionalSecondsOutput { datetime?: Date | undefined; } /** * @public */ export interface GreetingWithErrorsOutput { greeting?: string | undefined; } /** * @public */ export interface OperationWithDefaultsInput { defaults?: Defaults | undefined; clientOptionalDefaults?: ClientOptionalDefaults | undefined; topLevelDefault?: string | undefined; otherTopLevelDefault?: number | undefined; } /** * @public */ export interface OperationWithDefaultsOutput { defaultString?: string | undefined; defaultBoolean?: boolean | undefined; defaultList?: string[] | undefined; defaultTimestamp?: Date | undefined; defaultBlob?: Uint8Array | undefined; defaultByte?: number | undefined; defaultShort?: number | undefined; defaultInteger?: number | undefined; defaultLong?: number | undefined; defaultFloat?: number | undefined; defaultDouble?: number | undefined; defaultMap?: Record | undefined; defaultEnum?: TestEnum | undefined; defaultIntEnum?: TestIntEnum | undefined; emptyString?: string | undefined; falseBoolean?: boolean | undefined; emptyBlob?: Uint8Array | undefined; zeroByte?: number | undefined; zeroShort?: number | undefined; zeroInteger?: number | undefined; zeroLong?: number | undefined; zeroFloat?: number | undefined; zeroDouble?: number | undefined; } /** * @public */ export interface SimpleStructure { value?: string | undefined; } /** * @public */ export interface RpcV2CborDenseMapsInputOutput { denseStructMap?: Record | undefined; denseNumberMap?: Record | undefined; denseBooleanMap?: Record | undefined; denseStringMap?: Record | undefined; denseSetMap?: Record | undefined; } /** * @public */ export interface StructureListMember { a?: string | undefined; b?: string | undefined; } /** * @public */ export interface RpcV2CborListInputOutput { stringList?: string[] | undefined; stringSet?: string[] | undefined; integerList?: number[] | undefined; booleanList?: boolean[] | undefined; timestampList?: Date[] | undefined; enumList?: FooEnum[] | undefined; intEnumList?: IntegerEnum[] | undefined; /** * A list of lists of strings. * @public */ nestedStringList?: string[][] | undefined; structureList?: StructureListMember[] | undefined; blobList?: Uint8Array[] | undefined; } /** * @public */ export interface RpcV2CborSparseMapsInputOutput { sparseStructMap?: Record | undefined; sparseNumberMap?: Record | undefined; sparseBooleanMap?: Record | undefined; sparseStringMap?: Record | undefined; sparseSetMap?: Record | undefined; } /** * @public */ export interface SimpleScalarStructure { trueBooleanValue?: boolean | undefined; falseBooleanValue?: boolean | undefined; byteValue?: number | undefined; doubleValue?: number | undefined; floatValue?: number | undefined; integerValue?: number | undefined; longValue?: number | undefined; shortValue?: number | undefined; stringValue?: string | undefined; blobValue?: Uint8Array | undefined; } /** * @public */ export interface SparseNullsOperationInputOutput { sparseStringList?: (string | null)[] | undefined; sparseStringMap?: Record | undefined; } /** * @public */ export interface RecursiveShapesInputOutputNested1 { foo?: string | undefined; nested?: RecursiveShapesInputOutputNested2 | undefined; } /** * @public */ export interface RecursiveShapesInputOutputNested2 { bar?: string | undefined; recursiveMember?: RecursiveShapesInputOutputNested1 | undefined; } /** * @public */ export interface RecursiveShapesInputOutput { nested?: RecursiveShapesInputOutputNested1 | undefined; } ================================================ FILE: private/smithy-rpcv2-cbor/src/protocols/Rpcv2cbor.ts ================================================ // smithy-typescript generated code import { buildHttpRpcRequest, cbor, checkCborResponse as cr, dateToTag as __dateToTag, loadSmithyRpcV2CborErrorCode, parseCborBody as parseBody, parseCborErrorBody as parseErrorBody, } from "@smithy/core/cbor"; import { _json, decorateServiceException as __decorateServiceException, take, withBaseException, } from "@smithy/core/client"; import { type HttpRequest as __HttpRequest, type HttpResponse as __HttpResponse, collectBody, } from "@smithy/core/protocols"; import { expectBoolean as __expectBoolean, expectByte as __expectByte, expectInt32 as __expectInt32, expectLong as __expectLong, expectNonNull as __expectNonNull, expectShort as __expectShort, expectString as __expectString, limitedParseDouble as __limitedParseDouble, limitedParseFloat32 as __limitedParseFloat32, parseEpochTimestamp as __parseEpochTimestamp, } from "@smithy/core/serde"; import type { Endpoint as __Endpoint, HeaderBag as __HeaderBag, ResponseMetadata as __ResponseMetadata, SerdeContext as __SerdeContext, } from "@smithy/types"; import type { EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput } from "../commands/EmptyInputOutputCommand"; import type { Float16CommandInput, Float16CommandOutput } from "../commands/Float16Command"; import type { FractionalSecondsCommandInput, FractionalSecondsCommandOutput, } from "../commands/FractionalSecondsCommand"; import type { GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, } from "../commands/GreetingWithErrorsCommand"; import type { NoInputOutputCommandInput, NoInputOutputCommandOutput } from "../commands/NoInputOutputCommand"; import type { OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, } from "../commands/OperationWithDefaultsCommand"; import type { OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, } from "../commands/OptionalInputOutputCommand"; import type { RecursiveShapesCommandInput, RecursiveShapesCommandOutput } from "../commands/RecursiveShapesCommand"; import type { RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, } from "../commands/RpcV2CborDenseMapsCommand"; import type { RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput } from "../commands/RpcV2CborListsCommand"; import type { RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, } from "../commands/RpcV2CborSparseMapsCommand"; import type { SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, } from "../commands/SimpleScalarPropertiesCommand"; import type { SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, } from "../commands/SparseNullsOperationCommand"; import type { FooEnum, IntegerEnum } from "../models/enums"; import { ComplexError, InvalidGreeting, ValidationException } from "../models/errors"; import type { ClientOptionalDefaults, Defaults, EmptyStructure, Float16Output, FractionalSecondsOutput, GreetingStruct, OperationWithDefaultsInput, OperationWithDefaultsOutput, RecursiveShapesInputOutput, RecursiveShapesInputOutputNested1, RecursiveShapesInputOutputNested2, RpcV2CborDenseMapsInputOutput, RpcV2CborListInputOutput, RpcV2CborSparseMapsInputOutput, SimpleScalarStructure, SimpleStructure, SparseNullsOperationInputOutput, StructureListMember, } from "../models/models_0"; import { RpcV2ProtocolServiceException as __BaseException } from "../models/RpcV2ProtocolServiceException"; /** * serializeRpcv2cborEmptyInputOutputCommand */ export const se_EmptyInputOutputCommand = async ( input: EmptyInputOutputCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(_json(input)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/EmptyInputOutput", undefined, body); }; /** * serializeRpcv2cborFloat16Command */ export const se_Float16Command = async ( input: Float16CommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = { ...SHARED_HEADERS }; delete headers["content-type"]; return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/Float16", undefined, undefined); }; /** * serializeRpcv2cborFractionalSecondsCommand */ export const se_FractionalSecondsCommand = async ( input: FractionalSecondsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = { ...SHARED_HEADERS }; delete headers["content-type"]; return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/FractionalSeconds", undefined, undefined); }; /** * serializeRpcv2cborGreetingWithErrorsCommand */ export const se_GreetingWithErrorsCommand = async ( input: GreetingWithErrorsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = { ...SHARED_HEADERS }; delete headers["content-type"]; return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/GreetingWithErrors", undefined, undefined); }; /** * serializeRpcv2cborNoInputOutputCommand */ export const se_NoInputOutputCommand = async ( input: NoInputOutputCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = { ...SHARED_HEADERS }; delete headers["content-type"]; return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/NoInputOutput", undefined, undefined); }; /** * serializeRpcv2cborOperationWithDefaultsCommand */ export const se_OperationWithDefaultsCommand = async ( input: OperationWithDefaultsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_OperationWithDefaultsInput(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/OperationWithDefaults", undefined, body); }; /** * serializeRpcv2cborOptionalInputOutputCommand */ export const se_OptionalInputOutputCommand = async ( input: OptionalInputOutputCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(_json(input)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/OptionalInputOutput", undefined, body); }; /** * serializeRpcv2cborRecursiveShapesCommand */ export const se_RecursiveShapesCommand = async ( input: RecursiveShapesCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_RecursiveShapesInputOutput(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/RecursiveShapes", undefined, body); }; /** * serializeRpcv2cborRpcV2CborDenseMapsCommand */ export const se_RpcV2CborDenseMapsCommand = async ( input: RpcV2CborDenseMapsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(_json(input)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/RpcV2CborDenseMaps", undefined, body); }; /** * serializeRpcv2cborRpcV2CborListsCommand */ export const se_RpcV2CborListsCommand = async ( input: RpcV2CborListsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_RpcV2CborListInputOutput(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/RpcV2CborLists", undefined, body); }; /** * serializeRpcv2cborRpcV2CborSparseMapsCommand */ export const se_RpcV2CborSparseMapsCommand = async ( input: RpcV2CborSparseMapsCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_RpcV2CborSparseMapsInputOutput(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/RpcV2CborSparseMaps", undefined, body); }; /** * serializeRpcv2cborSimpleScalarPropertiesCommand */ export const se_SimpleScalarPropertiesCommand = async ( input: SimpleScalarPropertiesCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_SimpleScalarStructure(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/SimpleScalarProperties", undefined, body); }; /** * serializeRpcv2cborSparseNullsOperationCommand */ export const se_SparseNullsOperationCommand = async ( input: SparseNullsOperationCommandInput, context: __SerdeContext ): Promise<__HttpRequest> => { const headers: __HeaderBag = SHARED_HEADERS; let body: any; body = cbor.serialize(se_SparseNullsOperationInputOutput(input, context)); return buildHttpRpcRequest(context, headers, "/service/RpcV2Protocol/operation/SparseNullsOperation", undefined, body); }; /** * deserializeRpcv2cborEmptyInputOutputCommand */ export const de_EmptyInputOutputCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = _json(data); const response: EmptyInputOutputCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborFloat16Command */ export const de_Float16Command = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_Float16Output(data, context); const response: Float16CommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborFractionalSecondsCommand */ export const de_FractionalSecondsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_FractionalSecondsOutput(data, context); const response: FractionalSecondsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborGreetingWithErrorsCommand */ export const de_GreetingWithErrorsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = _json(data); const response: GreetingWithErrorsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborNoInputOutputCommand */ export const de_NoInputOutputCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } await collectBody(output.body, context); const response: NoInputOutputCommandOutput = { $metadata: deserializeMetadata(output), }; return response; }; /** * deserializeRpcv2cborOperationWithDefaultsCommand */ export const de_OperationWithDefaultsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_OperationWithDefaultsOutput(data, context); const response: OperationWithDefaultsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborOptionalInputOutputCommand */ export const de_OptionalInputOutputCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = _json(data); const response: OptionalInputOutputCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborRecursiveShapesCommand */ export const de_RecursiveShapesCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_RecursiveShapesInputOutput(data, context); const response: RecursiveShapesCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborRpcV2CborDenseMapsCommand */ export const de_RpcV2CborDenseMapsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = _json(data); const response: RpcV2CborDenseMapsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborRpcV2CborListsCommand */ export const de_RpcV2CborListsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_RpcV2CborListInputOutput(data, context); const response: RpcV2CborListsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborRpcV2CborSparseMapsCommand */ export const de_RpcV2CborSparseMapsCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_RpcV2CborSparseMapsInputOutput(data, context); const response: RpcV2CborSparseMapsCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborSimpleScalarPropertiesCommand */ export const de_SimpleScalarPropertiesCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_SimpleScalarStructure(data, context); const response: SimpleScalarPropertiesCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserializeRpcv2cborSparseNullsOperationCommand */ export const de_SparseNullsOperationCommand = async ( output: __HttpResponse, context: __SerdeContext ): Promise => { cr(output); if (output.statusCode >= 300) { return de_CommandError(output, context); } const data: any = await parseBody(output.body, context) let contents: any = {}; contents = de_SparseNullsOperationInputOutput(data, context); const response: SparseNullsOperationCommandOutput = { $metadata: deserializeMetadata(output), ...contents, }; return response; }; /** * deserialize_Rpcv2cborCommandError */ const de_CommandError = async ( output: __HttpResponse, context: __SerdeContext, ): Promise => { const parsedOutput: any = { ...output, body: await parseErrorBody(output.body, context) }; const errorCode = loadSmithyRpcV2CborErrorCode(output, parsedOutput.body); switch (errorCode) { case "ComplexError": case "smithy.protocoltests.rpcv2Cbor#ComplexError": throw await de_ComplexErrorRes(parsedOutput, context); case "InvalidGreeting": case "smithy.protocoltests.rpcv2Cbor#InvalidGreeting": throw await de_InvalidGreetingRes(parsedOutput, context); case "ValidationException": case "smithy.framework#ValidationException": throw await de_ValidationExceptionRes(parsedOutput, context); default: const parsedBody = parsedOutput.body; return throwDefaultError({ output, parsedBody, errorCode }) as never; } } /** * deserializeRpcv2cborValidationExceptionRes */ const de_ValidationExceptionRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new ValidationException({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborComplexErrorRes */ const de_ComplexErrorRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new ComplexError({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; /** * deserializeRpcv2cborInvalidGreetingRes */ const de_InvalidGreetingRes = async ( parsedOutput: any, context: __SerdeContext ): Promise => { const body = parsedOutput.body const deserialized: any = _json(body); const exception = new InvalidGreeting({ $metadata: deserializeMetadata(parsedOutput), ...deserialized }); return __decorateServiceException(exception, body); }; // se_ClientOptionalDefaults omitted. /** * serializeRpcv2cborDefaults */ const se_Defaults = ( input: Defaults, context: __SerdeContext ): any => { return take(input, { 'defaultBlob': [], 'defaultBoolean': [], 'defaultByte': [], 'defaultDouble': [], 'defaultEnum': [], 'defaultFloat': [], 'defaultIntEnum': [], 'defaultInteger': [], 'defaultList': _json, 'defaultLong': [], 'defaultMap': _json, 'defaultShort': [], 'defaultString': [], 'defaultTimestamp': __dateToTag, 'emptyBlob': [], 'emptyString': [], 'falseBoolean': [], 'zeroByte': [], 'zeroDouble': [], 'zeroFloat': [], 'zeroInteger': [], 'zeroLong': [], 'zeroShort': [], }); } // se_DenseBooleanMap omitted. // se_DenseNumberMap omitted. // se_DenseSetMap omitted. // se_DenseStringMap omitted. // se_DenseStructMap omitted. // se_EmptyStructure omitted. /** * serializeRpcv2cborOperationWithDefaultsInput */ const se_OperationWithDefaultsInput = ( input: OperationWithDefaultsInput, context: __SerdeContext ): any => { return take(input, { 'clientOptionalDefaults': _json, 'defaults': _ => se_Defaults(_, context), 'otherTopLevelDefault': [], 'topLevelDefault': [], }); } /** * serializeRpcv2cborRecursiveShapesInputOutput */ const se_RecursiveShapesInputOutput = ( input: RecursiveShapesInputOutput, context: __SerdeContext ): any => { return take(input, { 'nested': _ => se_RecursiveShapesInputOutputNested1(_, context), }); } /** * serializeRpcv2cborRecursiveShapesInputOutputNested1 */ const se_RecursiveShapesInputOutputNested1 = ( input: RecursiveShapesInputOutputNested1, context: __SerdeContext ): any => { return take(input, { 'foo': [], 'nested': _ => se_RecursiveShapesInputOutputNested2(_, context), }); } /** * serializeRpcv2cborRecursiveShapesInputOutputNested2 */ const se_RecursiveShapesInputOutputNested2 = ( input: RecursiveShapesInputOutputNested2, context: __SerdeContext ): any => { return take(input, { 'bar': [], 'recursiveMember': _ => se_RecursiveShapesInputOutputNested1(_, context), }); } // se_RpcV2CborDenseMapsInputOutput omitted. /** * serializeRpcv2cborRpcV2CborListInputOutput */ const se_RpcV2CborListInputOutput = ( input: RpcV2CborListInputOutput, context: __SerdeContext ): any => { return take(input, { 'blobList': _ => se_BlobList(_, context), 'booleanList': _json, 'enumList': _json, 'intEnumList': _json, 'integerList': _json, 'nestedStringList': _json, 'stringList': _json, 'stringSet': _json, 'structureList': _json, 'timestampList': _ => se_TimestampList(_, context), }); } /** * serializeRpcv2cborRpcV2CborSparseMapsInputOutput */ const se_RpcV2CborSparseMapsInputOutput = ( input: RpcV2CborSparseMapsInputOutput, context: __SerdeContext ): any => { return take(input, { 'sparseBooleanMap': _ => se_SparseBooleanMap(_, context), 'sparseNumberMap': _ => se_SparseNumberMap(_, context), 'sparseSetMap': _ => se_SparseSetMap(_, context), 'sparseStringMap': _ => se_SparseStringMap(_, context), 'sparseStructMap': _ => se_SparseStructMap(_, context), }); } /** * serializeRpcv2cborSimpleScalarStructure */ const se_SimpleScalarStructure = ( input: SimpleScalarStructure, context: __SerdeContext ): any => { return take(input, { 'blobValue': [], 'byteValue': [], 'doubleValue': [], 'falseBooleanValue': [], 'floatValue': [], 'integerValue': [], 'longValue': [], 'shortValue': [], 'stringValue': [], 'trueBooleanValue': [], }); } // se_SimpleStructure omitted. /** * serializeRpcv2cborSparseBooleanMap */ const se_SparseBooleanMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = value; } else { acc[key] = null as any; } return acc; }, {}); } /** * serializeRpcv2cborSparseNullsOperationInputOutput */ const se_SparseNullsOperationInputOutput = ( input: SparseNullsOperationInputOutput, context: __SerdeContext ): any => { return take(input, { 'sparseStringList': _ => se_SparseStringList(_, context), 'sparseStringMap': _ => se_SparseStringMap(_, context), }); } /** * serializeRpcv2cborSparseNumberMap */ const se_SparseNumberMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = value; } else { acc[key] = null as any; } return acc; }, {}); } /** * serializeRpcv2cborSparseSetMap */ const se_SparseSetMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = _json(value); } else { acc[key] = null as any; } return acc; }, {}); } /** * serializeRpcv2cborSparseStructMap */ const se_SparseStructMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = _json(value); } else { acc[key] = null as any; } return acc; }, {}); } // se_StructureList omitted. // se_StructureListMember omitted. // se_TestStringList omitted. // se_TestStringMap omitted. /** * serializeRpcv2cborBlobList */ const se_BlobList = ( input: Uint8Array[], context: __SerdeContext ): any => { return input.filter((e: any) => e != null); } // se_BooleanList omitted. // se_FooEnumList omitted. // se_GreetingStruct omitted. // se_IntegerEnumList omitted. // se_IntegerList omitted. // se_NestedStringList omitted. /** * serializeRpcv2cborSparseStringList */ const se_SparseStringList = ( input: (string | null)[], context: __SerdeContext ): any => { return input; } /** * serializeRpcv2cborSparseStringMap */ const se_SparseStringMap = ( input: Record, context: __SerdeContext ): any => { return Object.entries(input).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key] = value; } else { acc[key] = null as any; } return acc; }, {}); } // se_StringList omitted. // se_StringSet omitted. /** * serializeRpcv2cborTimestampList */ const se_TimestampList = ( input: Date[], context: __SerdeContext ): any => { return input.filter((e: any) => e != null).map(entry => { return __dateToTag(entry); }); } // de_ValidationException omitted. // de_ValidationExceptionField omitted. // de_ValidationExceptionFieldList omitted. // de_ComplexError omitted. // de_ComplexNestedErrorData omitted. // de_DenseBooleanMap omitted. // de_DenseNumberMap omitted. // de_DenseSetMap omitted. // de_DenseStringMap omitted. // de_DenseStructMap omitted. // de_EmptyStructure omitted. /** * deserializeRpcv2cborFloat16Output */ const de_Float16Output = ( output: any, context: __SerdeContext ): Float16Output => { return take(output, { 'value': __limitedParseDouble, }) as any; } /** * deserializeRpcv2cborFractionalSecondsOutput */ const de_FractionalSecondsOutput = ( output: any, context: __SerdeContext ): FractionalSecondsOutput => { return take(output, { 'datetime': (_: any) => __expectNonNull(__parseEpochTimestamp(_)), }) as any; } // de_GreetingWithErrorsOutput omitted. // de_InvalidGreeting omitted. /** * deserializeRpcv2cborOperationWithDefaultsOutput */ const de_OperationWithDefaultsOutput = ( output: any, context: __SerdeContext ): OperationWithDefaultsOutput => { return take(output, { 'defaultBlob': [], 'defaultBoolean': __expectBoolean, 'defaultByte': __expectByte, 'defaultDouble': __limitedParseDouble, 'defaultEnum': __expectString, 'defaultFloat': __limitedParseFloat32, 'defaultIntEnum': __expectInt32, 'defaultInteger': __expectInt32, 'defaultList': _json, 'defaultLong': __expectLong, 'defaultMap': _json, 'defaultShort': __expectShort, 'defaultString': __expectString, 'defaultTimestamp': (_: any) => __expectNonNull(__parseEpochTimestamp(_)), 'emptyBlob': [], 'emptyString': __expectString, 'falseBoolean': __expectBoolean, 'zeroByte': __expectByte, 'zeroDouble': __limitedParseDouble, 'zeroFloat': __limitedParseFloat32, 'zeroInteger': __expectInt32, 'zeroLong': __expectLong, 'zeroShort': __expectShort, }) as any; } /** * deserializeRpcv2cborRecursiveShapesInputOutput */ const de_RecursiveShapesInputOutput = ( output: any, context: __SerdeContext ): RecursiveShapesInputOutput => { return take(output, { 'nested': (_: any) => de_RecursiveShapesInputOutputNested1(_, context), }) as any; } /** * deserializeRpcv2cborRecursiveShapesInputOutputNested1 */ const de_RecursiveShapesInputOutputNested1 = ( output: any, context: __SerdeContext ): RecursiveShapesInputOutputNested1 => { return take(output, { 'foo': __expectString, 'nested': (_: any) => de_RecursiveShapesInputOutputNested2(_, context), }) as any; } /** * deserializeRpcv2cborRecursiveShapesInputOutputNested2 */ const de_RecursiveShapesInputOutputNested2 = ( output: any, context: __SerdeContext ): RecursiveShapesInputOutputNested2 => { return take(output, { 'bar': __expectString, 'recursiveMember': (_: any) => de_RecursiveShapesInputOutputNested1(_, context), }) as any; } // de_RpcV2CborDenseMapsInputOutput omitted. /** * deserializeRpcv2cborRpcV2CborListInputOutput */ const de_RpcV2CborListInputOutput = ( output: any, context: __SerdeContext ): RpcV2CborListInputOutput => { return take(output, { 'blobList': (_: any) => de_BlobList(_, context), 'booleanList': _json, 'enumList': _json, 'intEnumList': _json, 'integerList': _json, 'nestedStringList': _json, 'stringList': _json, 'stringSet': _json, 'structureList': _json, 'timestampList': (_: any) => de_TimestampList(_, context), }) as any; } /** * deserializeRpcv2cborRpcV2CborSparseMapsInputOutput */ const de_RpcV2CborSparseMapsInputOutput = ( output: any, context: __SerdeContext ): RpcV2CborSparseMapsInputOutput => { return take(output, { 'sparseBooleanMap': (_: any) => de_SparseBooleanMap(_, context), 'sparseNumberMap': (_: any) => de_SparseNumberMap(_, context), 'sparseSetMap': (_: any) => de_SparseSetMap(_, context), 'sparseStringMap': (_: any) => de_SparseStringMap(_, context), 'sparseStructMap': (_: any) => de_SparseStructMap(_, context), }) as any; } /** * deserializeRpcv2cborSimpleScalarStructure */ const de_SimpleScalarStructure = ( output: any, context: __SerdeContext ): SimpleScalarStructure => { return take(output, { 'blobValue': [], 'byteValue': __expectByte, 'doubleValue': __limitedParseDouble, 'falseBooleanValue': __expectBoolean, 'floatValue': __limitedParseFloat32, 'integerValue': __expectInt32, 'longValue': __expectLong, 'shortValue': __expectShort, 'stringValue': __expectString, 'trueBooleanValue': __expectBoolean, }) as any; } // de_SimpleStructure omitted. /** * deserializeRpcv2cborSparseBooleanMap */ const de_SparseBooleanMap = ( output: any, context: __SerdeContext ): Record => { return Object.entries(output).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key as string] = __expectBoolean(value) as any; } else { acc[key as string] = null as any; } return acc; }, {} as Record);} /** * deserializeRpcv2cborSparseNullsOperationInputOutput */ const de_SparseNullsOperationInputOutput = ( output: any, context: __SerdeContext ): SparseNullsOperationInputOutput => { return take(output, { 'sparseStringList': (_: any) => de_SparseStringList(_, context), 'sparseStringMap': (_: any) => de_SparseStringMap(_, context), }) as any; } /** * deserializeRpcv2cborSparseNumberMap */ const de_SparseNumberMap = ( output: any, context: __SerdeContext ): Record => { return Object.entries(output).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key as string] = __expectInt32(value) as any; } else { acc[key as string] = null as any; } return acc; }, {} as Record);} /** * deserializeRpcv2cborSparseSetMap */ const de_SparseSetMap = ( output: any, context: __SerdeContext ): Record => { return Object.entries(output).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key as string] = _json(value); } else { acc[key as string] = null as any; } return acc; }, {} as Record);} /** * deserializeRpcv2cborSparseStructMap */ const de_SparseStructMap = ( output: any, context: __SerdeContext ): Record => { return Object.entries(output).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key as string] = _json(value); } else { acc[key as string] = null as any; } return acc; }, {} as Record);} // de_StructureList omitted. // de_StructureListMember omitted. // de_TestStringList omitted. // de_TestStringMap omitted. /** * deserializeRpcv2cborBlobList */ const de_BlobList = ( output: any, context: __SerdeContext ): Uint8Array[] => { const collection = (output || []).filter((e: any) => e != null) return collection; } // de_BooleanList omitted. // de_FooEnumList omitted. // de_GreetingStruct omitted. // de_IntegerEnumList omitted. // de_IntegerList omitted. // de_NestedStringList omitted. /** * deserializeRpcv2cborSparseStringList */ const de_SparseStringList = ( output: any, context: __SerdeContext ): (string | null)[] => { const collection = (output || []).map((entry: any) => { if (entry === null) { return null as any; } return __expectString(entry) as any; }); return collection; } /** * deserializeRpcv2cborSparseStringMap */ const de_SparseStringMap = ( output: any, context: __SerdeContext ): Record => { return Object.entries(output).reduce((acc: Record, [key, value]: [string, any]) => { if (value !== null) { acc[key as string] = __expectString(value) as any; } else { acc[key as string] = null as any; } return acc; }, {} as Record);} // de_StringList omitted. // de_StringSet omitted. /** * deserializeRpcv2cborTimestampList */ const de_TimestampList = ( output: any, context: __SerdeContext ): Date[] => { const collection = (output || []).filter((e: any) => e != null).map((entry: any) => { return __expectNonNull(__parseEpochTimestamp(entry)); }); return collection; } const deserializeMetadata = (output: __HttpResponse): __ResponseMetadata => ({ httpStatusCode: output.statusCode, requestId: output.headers["x-amzn-requestid"] ?? output.headers["x-amzn-request-id"] ?? output.headers["x-amz-request-id"], extendedRequestId: output.headers["x-amz-id-2"], cfId: output.headers["x-amz-cf-id"], }); const throwDefaultError = withBaseException(__BaseException); const SHARED_HEADERS: __HeaderBag = { 'content-type': "application/cbor", "smithy-protocol": "rpc-v2-cbor", "accept": "application/cbor", }; ================================================ FILE: private/smithy-rpcv2-cbor/src/runtimeConfig.browser.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-browser"; import { loadConfigsForDefaultMode } from "@smithy/core/client"; import { resolveDefaultsModeConfig } from "@smithy/core/config"; import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/core/retry"; import { calculateBodyLength } from "@smithy/core/serde"; import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "browser", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE), sha256: config?.sha256 ?? Sha256, streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/runtimeConfig.native.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-js"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getBrowserRuntimeConfig } from "./runtimeConfig.browser"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { const browserDefaults = getBrowserRuntimeConfig(config); return { ...browserDefaults, ...config, runtime: "react-native", sha256: config?.sha256 ?? Sha256, }; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/runtimeConfig.shared.ts ================================================ // smithy-typescript generated code import { NoAuthSigner } from "@smithy/core"; import { NoOpLogger } from "@smithy/core/client"; import { parseUrl } from "@smithy/core/protocols"; import { fromBase64, fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { IdentityProviderConfig } from "@smithy/types"; import { defaultRpcV2ProtocolHttpAuthSchemeProvider } from "./auth/httpAuthSchemeProvider"; import { defaultEndpointResolver } from "./endpoint/endpointResolver"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { return { apiVersion: "2020-07-14", base64Decoder: config?.base64Decoder ?? fromBase64, base64Encoder: config?.base64Encoder ?? toBase64, disableHostPrefix: config?.disableHostPrefix ?? false, endpointProvider: config?.endpointProvider ?? defaultEndpointResolver, extensions: config?.extensions ?? [], httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultRpcV2ProtocolHttpAuthSchemeProvider, httpAuthSchemes: config?.httpAuthSchemes ?? [ { schemeId: "smithy.api#noAuth", identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider("smithy.api#noAuth") || (async () => ({})), signer: new NoAuthSigner(), }, ], logger: config?.logger ?? new NoOpLogger(), urlParser: config?.urlParser ?? parseUrl, utf8Decoder: config?.utf8Decoder ?? fromUtf8, utf8Encoder: config?.utf8Encoder ?? toUtf8, }; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/runtimeConfig.ts ================================================ // smithy-typescript generated code import { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from "@smithy/core/client"; import { loadConfig as loadNodeConfig, resolveDefaultsModeConfig } from "@smithy/core/config"; import { DEFAULT_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, } from "@smithy/core/retry"; import { calculateBodyLength, Hash } from "@smithy/core/serde"; import { NodeHttpHandler as RequestHandler, streamCollector } from "@smithy/node-http-handler"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { emitWarningIfUnsupportedVersion(process.version); const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "node", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config), requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? loadNodeConfig( { ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE, }, config ), sha256: config?.sha256 ?? Hash.bind(null, "sha256"), streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/smithy-rpcv2-cbor/src/runtimeExtensions.ts ================================================ // smithy-typescript generated code import { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from "@smithy/core/client"; import { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from "@smithy/core/protocols"; import { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from "./auth/httpAuthExtensionConfiguration"; import type { RpcV2ProtocolExtensionConfiguration } from "./extensionConfiguration"; /** * @public */ export interface RuntimeExtension { configure(extensionConfiguration: RpcV2ProtocolExtensionConfiguration): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[]; } /** * @internal */ export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => { const extensionConfiguration: RpcV2ProtocolExtensionConfiguration = Object.assign( getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig) ); extensions.forEach((extension) => extension.configure(extensionConfiguration)); return Object.assign( runtimeConfig, resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration) ); }; ================================================ FILE: private/smithy-rpcv2-cbor/test/functional/rpcv2cbor.spec.ts ================================================ // smithy-typescript generated code import { cbor } from "@smithy/core/cbor"; import { expect, test as it } from "vitest"; import { EmptyInputOutputCommand } from "../../src/commands/EmptyInputOutputCommand"; import { Float16Command } from "../../src/commands/Float16Command"; import { FractionalSecondsCommand } from "../../src/commands/FractionalSecondsCommand"; import { GreetingWithErrorsCommand } from "../../src/commands/GreetingWithErrorsCommand"; import { NoInputOutputCommand } from "../../src/commands/NoInputOutputCommand"; import { OperationWithDefaultsCommand } from "../../src/commands/OperationWithDefaultsCommand"; import { OptionalInputOutputCommand } from "../../src/commands/OptionalInputOutputCommand"; import { RecursiveShapesCommand } from "../../src/commands/RecursiveShapesCommand"; import { RpcV2CborDenseMapsCommand } from "../../src/commands/RpcV2CborDenseMapsCommand"; import { RpcV2CborListsCommand } from "../../src/commands/RpcV2CborListsCommand"; import { RpcV2CborSparseMapsCommand } from "../../src/commands/RpcV2CborSparseMapsCommand"; import { SimpleScalarPropertiesCommand } from "../../src/commands/SimpleScalarPropertiesCommand"; import { SparseNullsOperationCommand } from "../../src/commands/SparseNullsOperationCommand"; import { RpcV2ProtocolClient } from "../../src/RpcV2ProtocolClient"; import { Readable } from "node:stream"; import { HttpRequest, HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import type { Endpoint, HeaderBag, HttpHandlerOptions } from "@smithy/types"; /** * Throws an expected exception that contains the serialized request. */ class EXPECTED_REQUEST_SERIALIZATION_ERROR extends Error { constructor(readonly request: HttpRequest) { super(); } } /** * Throws an EXPECTED_REQUEST_SERIALIZATION_ERROR error before sending a * request. The thrown exception contains the serialized request. */ class RequestSerializationTestHandler implements HttpHandler { handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.reject(new EXPECTED_REQUEST_SERIALIZATION_ERROR(request)); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } /** * Returns a resolved Promise of the specified response contents. */ class ResponseDeserializationTestHandler implements HttpHandler { isSuccess: boolean; code: number; headers: HeaderBag; body: string | Uint8Array; isBase64Body: boolean; constructor(isSuccess: boolean, code: number, headers?: HeaderBag, body?: string) { this.isSuccess = isSuccess; this.code = code; if (headers === undefined) { this.headers = {}; } else { this.headers = headers; } if (body === undefined) { body = ""; } this.body = body; this.isBase64Body = String(body).length > 0 && Buffer.from(String(body), "base64").toString("base64") === body; } handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.resolve({ response: new HttpResponse({ statusCode: this.code, headers: this.headers, body: this.isBase64Body ? toBytes(this.body as string) : Readable.from([this.body]), }), }); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } interface comparableParts { [key: string]: string; } /** * Generates a standard map of un-equal values given input parts. */ const compareParts = (expectedParts: comparableParts, generatedParts: comparableParts) => { const unequalParts: any = {}; Object.keys(expectedParts).forEach((key) => { if (generatedParts[key] === undefined) { unequalParts[key] = { exp: expectedParts[key], gen: undefined }; } else if (!equivalentContents(expectedParts[key], generatedParts[key])) { unequalParts[key] = { exp: expectedParts[key], gen: generatedParts[key] }; } }); Object.keys(generatedParts).forEach((key) => { if (expectedParts[key] === undefined) { unequalParts[key] = { exp: undefined, gen: generatedParts[key] }; } }); if (Object.keys(unequalParts).length !== 0) { return unequalParts; } return undefined; }; /** * Compares all types for equivalent contents, doing nested * equality checks based on non-`$metadata` * properties that have defined values. */ const equivalentContents = (expected: any, generated: any): boolean => { if (typeof (global as any).expect === "function") { expect(normalizeByteArrayType(generated)).toEqual(normalizeByteArrayType(expected)); return true; } let localExpected = expected; // Short circuit on equality. if (localExpected == generated) { return true; } if (typeof expected !== "object") { return expected === generated; } // If a test fails with an issue in the below 6 lines, it's likely // due to an issue in the nestedness or existence of the property // being compared. delete localExpected["$metadata"]; delete generated["$metadata"]; Object.keys(localExpected).forEach((key) => localExpected[key] === undefined && delete localExpected[key]); Object.keys(generated).forEach((key) => generated[key] === undefined && delete generated[key]); const expectedProperties = Object.getOwnPropertyNames(localExpected); const generatedProperties = Object.getOwnPropertyNames(generated); // Short circuit on different property counts. if (expectedProperties.length != generatedProperties.length) { return false; } // Compare properties directly. for (var index = 0; index < expectedProperties.length; index++) { const propertyName = expectedProperties[index]; if (!equivalentContents(localExpected[propertyName], generated[propertyName])) { return false; } } return true; }; const clientParams = { region: "us-west-2", credentials: { accessKeyId: "key", secretAccessKey: "secret" }, apiKey: { apiKey: "apiKey" }, endpoint: { url: new URL("https://localhost/"), headers: { "x-default-header": ["default-header-value"], }, }, }; /** * A wrapper function that shadows `fail` from jest-jasmine2 * (jasmine2 was replaced with circus in > v27 as the default test runner) */ const fail = (error?: any): never => { throw new Error(error); }; /** * Hexadecimal to byteArray. */ const toBytes = (hex: string) => { return Buffer.from(hex, "base64"); }; function normalizeByteArrayType(data: any) { // normalize float32 errors if (typeof data === "number") { const u = new Uint8Array(4); const dv = new DataView(u.buffer, u.byteOffset, u.byteLength); dv.setFloat32(0, data); return dv.getFloat32(0); } if (!data || typeof data !== "object") { return data; } if (data instanceof Uint8Array) { return Uint8Array.from(data); } if (data instanceof String || data instanceof Boolean || data instanceof Number) { return data.valueOf(); } const output = {} as any; for (const key of Object.getOwnPropertyNames(data)) { output[key] = normalizeByteArrayType(data[key]); } return output; } /** * When Input structure is empty we write CBOR equivalent of {} */ it("empty_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new EmptyInputOutputCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/EmptyInputOutput"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * When output structure is empty we write CBOR equivalent of {} */ it("empty_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new EmptyInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * When output structure is empty the client should accept an empty body */ it("empty_output_no_body:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `` ), }); const params: any = {}; const command = new EmptyInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Ensures that clients can correctly parse float16 +Inf. */ it("RpcV2CborFloat16Inf:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl8AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 -Inf. */ it("RpcV2CborFloat16NegInf:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfn8AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: -Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 NaN with high LSB. */ it("RpcV2CborFloat16LSBNaN:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl8AQ==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 NaN with high MSB. */ it("RpcV2CborFloat16MSBNaN:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl+AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse a subnormal float16. */ it("RpcV2CborFloat16Subnormal:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1ZfkAUA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: 4.76837158203125E-6, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse timestamps with fractional seconds */ it("RpcV2CborDateTimeWithFractionalSeconds:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2hkYXRldGltZcH7Qcw32zgPvnf/` ), }); const params: any = {}; const command = new FractionalSecondsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { datetime: new Date(9.46845296123E8 * 1000), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Parses simple RpcV2 Cbor errors */ it("RpcV2CborInvalidGreetingError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4LnNtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNJbnZhbGlkR3JlZXRpbmdnTWVzc2FnZWJIaf8=` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "InvalidGreeting") { console.log(err); fail(`Expected a InvalidGreeting to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); const paramsToValidate: any = [ { message: "Hi", }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); return; } fail("Expected an exception to be thrown from response"); }); /** * Parses a complex error with no message member */ it("RpcV2CborComplexError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4K3NtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNDb21wbGV4RXJyb3JoVG9wTGV2ZWxpVG9wIGxldmVsZk5lc3RlZL9jRm9vY2Jhcv//` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "ComplexError") { console.log(err); fail(`Expected a ComplexError to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); const paramsToValidate: any = [ { TopLevel: "Top level", Nested: { Foo: "bar", }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); return; } fail("Expected an exception to be thrown from response"); }); it("RpcV2CborEmptyComplexError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4K3NtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNDb21wbGV4RXJyb3L/` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "ComplexError") { console.log(err); fail(`Expected a ComplexError to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); return; } fail("Expected an exception to be thrown from response"); }); /** * Body is empty and no Content-Type header if no input */ it("no_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new NoInputOutputCommand({}); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/NoInputOutput"); expect( r.headers["content-type"], `Header key "content-type" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(!r.body || r.body === `{}`).toBeTruthy(); } }); /** * A `Content-Type` header should not be set if the response body is empty. */ it("no_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", }, `` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Clients should accept a CBOR empty struct if there is no output. */ it("NoOutputClientAllowsEmptyCbor:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Clients should accept an empty body if there is no output and * should not raise an error if the `Content-Type` header is set. */ it("NoOutputClientAllowsEmptyBody:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Client populates default values in input. */ it.skip("RpcV2CborClientPopulatesDefaultValuesInInput:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { defaults: { } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2hkZWZhdWx0c79tZGVmYXVsdFN0cmluZ2JoaW5kZWZhdWx0Qm9vbGVhbvVrZGVmYXVsdExpc3Sf/3BkZWZhdWx0VGltZXN0YW1wwQBrZGVmYXVsdEJsb2JDYWJja2RlZmF1bHRCeXRlAWxkZWZhdWx0U2hvcnQBbmRlZmF1bHRJbnRlZ2VyCmtkZWZhdWx0TG9uZxhkbGRlZmF1bHRGbG9hdPo/gAAAbWRlZmF1bHREb3VibGX6P4AAAGpkZWZhdWx0TWFwv/9rZGVmYXVsdEVudW1jRk9PbmRlZmF1bHRJbnRFbnVtAWtlbXB0eVN0cmluZ2BsZmFsc2VCb29sZWFu9GllbXB0eUJsb2JAaHplcm9CeXRlAGl6ZXJvU2hvcnQAa3plcm9JbnRlZ2VyAGh6ZXJvTG9uZwBpemVyb0Zsb2F0+gAAAABqemVyb0RvdWJsZfoAAAAA//8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client skips top level default values in input. */ it.skip("RpcV2CborClientSkipsTopLevelDefaultValuesInInput:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client uses explicitly provided member values over defaults */ it.skip("RpcV2CborClientUsesExplicitlyProvidedMemberValuesOverDefaults:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { defaults: { defaultString: "bye", defaultBoolean: true, defaultList: [ "a", ], defaultTimestamp: new Date(1000), defaultBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), defaultByte: 2, defaultShort: 2, defaultInteger: 20, defaultLong: 200, defaultFloat: 2.0, defaultDouble: 2.0, defaultMap: { name: "Jack", } as any, defaultEnum: "BAR", defaultIntEnum: 2, emptyString: "foo", falseBoolean: true, emptyBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), zeroByte: 1, zeroShort: 1, zeroInteger: 1, zeroLong: 1, zeroFloat: 1.0, zeroDouble: 1.0, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2hkZWZhdWx0c7dtZGVmYXVsdFN0cmluZ2NieWVuZGVmYXVsdEJvb2xlYW71a2RlZmF1bHRMaXN0gWFhcGRlZmF1bHRUaW1lc3RhbXDB+z/wAAAAAAAAa2RlZmF1bHRCbG9iQmhpa2RlZmF1bHRCeXRlAmxkZWZhdWx0U2hvcnQCbmRlZmF1bHRJbnRlZ2VyFGtkZWZhdWx0TG9uZxjIbGRlZmF1bHRGbG9hdPpAAAAAbWRlZmF1bHREb3VibGX7QAAAAAAAAABqZGVmYXVsdE1hcKFkbmFtZWRKYWNra2RlZmF1bHRFbnVtY0JBUm5kZWZhdWx0SW50RW51bQJrZW1wdHlTdHJpbmdjZm9vbGZhbHNlQm9vbGVhbvVpZW1wdHlCbG9iQmhpaHplcm9CeXRlAWl6ZXJvU2hvcnQBa3plcm9JbnRlZ2VyAWh6ZXJvTG9uZwFpemVyb0Zsb2F0+j+AAABqemVyb0RvdWJsZfs/8AAAAAAAAP8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Any time a value is provided for a member in the top level of input, it is used, regardless of if its the default. */ it.skip("RpcV2CborClientUsesExplicitlyProvidedValuesInTopLevel:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { topLevelDefault: "hi", otherTopLevelDefault: 0, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v290b3BMZXZlbERlZmF1bHRiaGl0b3RoZXJUb3BMZXZlbERlZmF1bHQA/w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Typically, non top-level members would have defaults filled in, but if they have the clientOptional trait, the defaults should be ignored. */ it.skip("RpcV2CborClientIgnoresNonTopLevelDefaultsOnMembersWithClientOptional:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { clientOptionalDefaults: { } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3ZjbGllbnRPcHRpb25hbERlZmF1bHRzoP8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client populates default values when missing in response. */ it.skip("RpcV2CborClientPopulatesDefaultsValuesWhenMissingInResponse:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new OperationWithDefaultsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { defaultString: "hi", defaultBoolean: true, defaultList: [ ], defaultTimestamp: new Date(0 * 1000), defaultBlob: Uint8Array.from("abc", (c) => c.charCodeAt(0)), defaultByte: 1, defaultShort: 1, defaultInteger: 10, defaultLong: 100, defaultFloat: 1.0, defaultDouble: 1.0, defaultMap: { }, defaultEnum: "FOO", defaultIntEnum: 1, emptyString: "", falseBoolean: false, emptyBlob: Uint8Array.from("", (c) => c.charCodeAt(0)), zeroByte: 0, zeroShort: 0, zeroInteger: 0, zeroLong: 0, zeroFloat: 0.0, zeroDouble: 0.0, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Client ignores default values if member values are present in the response. */ it.skip("RpcV2CborClientIgnoresDefaultValuesIfMemberValuesArePresentInResponse:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v21kZWZhdWx0U3RyaW5nY2J5ZW5kZWZhdWx0Qm9vbGVhbvRrZGVmYXVsdExpc3SBYWFwZGVmYXVsdFRpbWVzdGFtcMH7QAAAAAAAAABrZGVmYXVsdEJsb2JCaGlrZGVmYXVsdEJ5dGUCbGRlZmF1bHRTaG9ydAJuZGVmYXVsdEludGVnZXIUa2RlZmF1bHRMb25nGMhsZGVmYXVsdEZsb2F0+kAAAABtZGVmYXVsdERvdWJsZftAAAAAAAAAAGpkZWZhdWx0TWFwoWRuYW1lZEphY2trZGVmYXVsdEVudW1jQkFSbmRlZmF1bHRJbnRFbnVtAmtlbXB0eVN0cmluZ2Nmb29sZmFsc2VCb29sZWFu9WllbXB0eUJsb2JCaGloemVyb0J5dGUBaXplcm9TaG9ydAFremVyb0ludGVnZXIBaHplcm9Mb25nAWl6ZXJvRmxvYXT6P4AAAGp6ZXJvRG91Ymxl+z/wAAAAAAAA/w==` ), }); const params: any = {}; const command = new OperationWithDefaultsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { defaultString: "bye", defaultBoolean: false, defaultList: [ "a", ], defaultTimestamp: new Date(2 * 1000), defaultBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), defaultByte: 2, defaultShort: 2, defaultInteger: 20, defaultLong: 200, defaultFloat: 2.0, defaultDouble: 2.0, defaultMap: { name: "Jack", }, defaultEnum: "BAR", defaultIntEnum: 2, emptyString: "foo", falseBoolean: true, emptyBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), zeroByte: 1, zeroShort: 1, zeroInteger: 1, zeroLong: 1, zeroFloat: 1.0, zeroDouble: 1.0, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * When input is empty we write CBOR equivalent of {} */ it("optional_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OptionalInputOutputCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OptionalInputOutput"); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * When output is empty we write CBOR equivalent of {} */ it("optional_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new OptionalInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Serializes recursive structures */ it("RpcV2CborRecursiveShapes:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RecursiveShapesCommand( { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", } as any, } as any, } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RecursiveShapes"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2ZuZXN0ZWS/Y2Zvb2RGb28xZm5lc3RlZL9jYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyv2Nmb29kRm9vMmZuZXN0ZWS/Y2JhcmRCYXIy//////8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes recursive structures */ it("RpcV2CborRecursiveShapes:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZuZXN0ZWS/Y2Zvb2RGb28xZm5lc3RlZL9jYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyv2Nmb29kRm9vMmZuZXN0ZWS/Y2JhcmRCYXIy//////8=` ), }); const params: any = {}; const command = new RecursiveShapesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", }, }, }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes recursive structures encoded using a map with definite length */ it("RpcV2CborRecursiveShapesUsingDefiniteLength:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWZuZXN0ZWSiY2Zvb2RGb28xZm5lc3RlZKJjYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyomNmb29kRm9vMmZuZXN0ZWShY2JhcmRCYXIy` ), }); const params: any = {}; const command = new RecursiveShapesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", }, }, }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes maps */ it("RpcV2CborMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseStructMap: { foo: { hi: "there", } as any, baz: { hi: "bye", } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oW5kZW5zZVN0cnVjdE1hcKJjZm9voWJoaWV0aGVyZWNiYXqhYmhpY2J5ZQ==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborSerializesZeroValuesInMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseNumberMap: { x: 0, } as any, denseBooleanMap: { x: false, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `om5kZW5zZU51bWJlck1hcKFheABvZGVuc2VCb29sZWFuTWFwoWF49A==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a dense map of sets. */ it("RpcV2CborSerializesDenseSetMap:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseSetMap: { x: [ ], y: [ "a", "b", ], } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oWtkZW5zZVNldE1hcKJheIBheYJhYWFi`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes maps */ it("RpcV2CborMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oW5kZW5zZVN0cnVjdE1hcKJjZm9voWJoaWV0aGVyZWNiYXqhYmhpY2J5ZQ==` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseStructMap: { foo: { hi: "there", }, baz: { hi: "bye", }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborDeserializesZeroValuesInMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `om5kZW5zZU51bWJlck1hcKFheABvZGVuc2VCb29sZWFuTWFwoWF49A==` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseNumberMap: { x: 0, }, denseBooleanMap: { x: false, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a dense map of sets */ it("RpcV2CborDeserializesDenseSetMap:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWtkZW5zZVNldE1hcKJheIBheYJhYWFi` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseSetMap: { x: [ ], y: [ "a", "b", ], }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes RpcV2 Cbor lists */ it("RpcV2CborLists:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ "foo", "bar", ], stringSet: [ "foo", "bar", ], integerList: [ 1, 2, ], booleanList: [ true, false, ], timestampList: [ new Date(1398796238000), new Date(1398796238000), ], enumList: [ "Foo", "0", ], intEnumList: [ 1, 2, ], nestedStringList: [ [ "foo", "bar", ], [ "baz", "qux", ], ], structureList: [ { a: "1", b: "2", } as any, { a: "3", b: "4", } as any, ], blobList: [ Uint8Array.from("foo", (c) => c.charCodeAt(0)), Uint8Array.from("bar", (c) => c.charCodeAt(0)), ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2pzdHJpbmdMaXN0gmNmb29jYmFyaXN0cmluZ1NldIJjZm9vY2JhcmtpbnRlZ2VyTGlzdIIBAmtib29sZWFuTGlzdIL19G10aW1lc3RhbXBMaXN0gsH7QdTX+/OAAADB+0HU1/vzgAAAaGVudW1MaXN0gmNGb29hMGtpbnRFbnVtTGlzdIIBAnBuZXN0ZWRTdHJpbmdMaXN0goJjZm9vY2JhcoJjYmF6Y3F1eG1zdHJ1Y3R1cmVMaXN0gqJhYWExYWJhMqJhYWEzYWJhNGhibG9iTGlzdIJDZm9vQ2Jhcv8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes empty JSON lists */ it("RpcV2CborListsEmpty:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2pzdHJpbmdMaXN0n///`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes empty JSON definite length lists */ it("RpcV2CborListsEmptyUsingDefiniteLength:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oWpzdHJpbmdMaXN0gA==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes RpcV2 Cbor lists */ it("RpcV2CborLists:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n2Nmb29jYmFy/2lzdHJpbmdTZXSfY2Zvb2NiYXL/a2ludGVnZXJMaXN0nwEC/2tib29sZWFuTGlzdJ/19P9tdGltZXN0YW1wTGlzdJ/B+0HU1/vzgAAAwftB1Nf784AAAP9oZW51bUxpc3SfY0Zvb2Ew/2tpbnRFbnVtTGlzdJ8BAv9wbmVzdGVkU3RyaW5nTGlzdJ+fY2Zvb2NiYXL/n2NiYXpjcXV4//9tc3RydWN0dXJlTGlzdJ+/YWFhMWFiYTL/v2FhYTNhYmE0//9oYmxvYkxpc3SfQ2Zvb0NiYXL//w==` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "foo", "bar", ], stringSet: [ "foo", "bar", ], integerList: [ 1, 2, ], booleanList: [ true, false, ], timestampList: [ new Date(1398796238 * 1000), new Date(1398796238 * 1000), ], enumList: [ "Foo", "0", ], intEnumList: [ 1, 2, ], nestedStringList: [ [ "foo", "bar", ], [ "baz", "qux", ], ], structureList: [ { a: "1", b: "2", }, { a: "3", b: "4", }, ], blobList: [ Uint8Array.from("foo", (c) => c.charCodeAt(0)), Uint8Array.from("bar", (c) => c.charCodeAt(0)), ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes empty RpcV2 Cbor lists */ it("RpcV2CborListsEmpty:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n///` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Can deserialize indefinite length text strings inside an indefinite length list */ it("RpcV2CborIndefiniteStringInsideIndefiniteListCanDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n394HUFuIGV4YW1wbGUgaW5kZWZpbml0ZSBzdHJpbmcsdyB3aGljaCB3aWxsIGJlIGNodW5rZWQsbiBvbiBlYWNoIGNvbW1h/394NUFub3RoZXIgZXhhbXBsZSBpbmRlZmluaXRlIHN0cmluZyB3aXRoIG9ubHkgb25lIGNodW5r/3ZUaGlzIGlzIGEgcGxhaW4gc3RyaW5n//8=` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "An example indefinite string, which will be chunked, on each comma", "Another example indefinite string with only one chunk", "This is a plain string", ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Can deserialize indefinite length text strings inside a definite length list */ it("RpcV2CborIndefiniteStringInsideDefiniteListCanDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWpzdHJpbmdMaXN0g394HUFuIGV4YW1wbGUgaW5kZWZpbml0ZSBzdHJpbmcsdyB3aGljaCB3aWxsIGJlIGNodW5rZWQsbiBvbiBlYWNoIGNvbW1h/394NUFub3RoZXIgZXhhbXBsZSBpbmRlZmluaXRlIHN0cmluZyB3aXRoIG9ubHkgb25lIGNodW5r/3ZUaGlzIGlzIGEgcGxhaW4gc3RyaW5n` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "An example indefinite string, which will be chunked, on each comma", "Another example indefinite string with only one chunk", "This is a plain string", ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes sparse maps */ it("RpcV2CborSparseMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseStructMap: { foo: { hi: "there", } as any, baz: { hi: "bye", } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VTdHJ1Y3RNYXC/Y2Zvb79iaGlldGhlcmX/Y2Jher9iaGljYnll////`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes null map values in sparse maps */ it("RpcV2CborSerializesNullMapValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseBooleanMap: { x: null, } as any, sparseNumberMap: { x: null, } as any, sparseStringMap: { x: null, } as any, sparseStructMap: { x: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3BzcGFyc2VCb29sZWFuTWFwv2F49v9vc3BhcnNlTnVtYmVyTWFwv2F49v9vc3BhcnNlU3RyaW5nTWFwv2F49v9vc3BhcnNlU3RydWN0TWFwv2F49v//`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a sparse map of sets */ it("RpcV2CborSerializesSparseSetMap:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseSetMap: { x: [ ], y: [ "a", "b", ], } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL///8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a sparse map of sets. */ it("RpcV2CborSerializesSparseSetMapAndRetainsNull:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseSetMap: { x: [ ], y: [ "a", "b", ], z: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL/YXr2//8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborSerializesZeroValuesInSparseMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseNumberMap: { x: 0, } as any, sparseBooleanMap: { x: false, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VOdW1iZXJNYXC/YXgA/3BzcGFyc2VCb29sZWFuTWFwv2F49P//`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes sparse maps */ it("RpcV2CborSparseJsonMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VTdHJ1Y3RNYXC/Y2Zvb79iaGlldGhlcmX/Y2Jher9iaGljYnll////` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStructMap: { foo: { hi: "there", }, baz: { hi: "bye", }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes null map values */ it("RpcV2CborDeserializesNullMapValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3BzcGFyc2VCb29sZWFuTWFwv2F49v9vc3BhcnNlTnVtYmVyTWFwv2F49v9vc3BhcnNlU3RyaW5nTWFwv2F49v9vc3BhcnNlU3RydWN0TWFwv2F49v//` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseBooleanMap: { x: null, }, sparseNumberMap: { x: null, }, sparseStringMap: { x: null, }, sparseStructMap: { x: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a sparse map of sets */ it("RpcV2CborDeserializesSparseSetMap:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2xzcGFyc2VTZXRNYXC/YXmfYWFhYv9heJ////8=` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseSetMap: { x: [ ], y: [ "a", "b", ], }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a sparse map of sets with a null */ it("RpcV2CborDeserializesSparseSetMapAndRetainsNull:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL/YXr2//8=` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseSetMap: { x: [ ], y: [ "a", "b", ], z: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborDeserializesZeroValuesInSparseMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VOdW1iZXJNYXC/YXgA/3BzcGFyc2VCb29sZWFuTWFwv2F49P//` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseNumberMap: { x: 0, }, sparseBooleanMap: { x: false, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes simple scalar properties */ it("RpcV2CborSimpleScalarProperties:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { byteValue: 5, doubleValue: 1.889, falseBooleanValue: false, floatValue: 7.625, integerValue: 256, longValue: 9873, shortValue: 9898, stringValue: "simple", trueBooleanValue: true, blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2lieXRlVmFsdWUFa2RvdWJsZVZhbHVl+z/+OVgQYk3TcWZhbHNlQm9vbGVhblZhbHVl9GpmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAaWxvbmdWYWx1ZRkmkWpzaG9ydFZhbHVlGSaqa3N0cmluZ1ZhbHVlZnNpbXBsZXB0cnVlQm9vbGVhblZhbHVl9WlibG9iVmFsdWVDZm9v/w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * RpcV2 Cbor should not serialize null structure values */ it("RpcV2CborClientDoesntSerializeNullStructureValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { stringValue: null, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling NaN float values. */ it("RpcV2CborSupportsNaNFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: NaN, floatValue: NaN, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zft/+AAAAAAAAGpmbG9hdFZhbHVl+n/AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsInfinityFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: Infinity, floatValue: Infinity, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zft/8AAAAAAAAGpmbG9hdFZhbHVl+n+AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsNegativeInfinityFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: -Infinity, floatValue: -Infinity, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zfv/8AAAAAAAAGpmbG9hdFZhbHVl+v+AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes simple scalar properties */ it("RpcV2CborSimpleScalarProperties:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3B0cnVlQm9vbGVhblZhbHVl9XFmYWxzZUJvb2xlYW5WYWx1ZfRpYnl0ZVZhbHVlBWtkb3VibGVWYWx1Zfs//jlYEGJN02pmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAanNob3J0VmFsdWUZJqprc3RyaW5nVmFsdWVmc2ltcGxlaWJsb2JWYWx1ZUNmb2//` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { trueBooleanValue: true, falseBooleanValue: false, byteValue: 5, doubleValue: 1.889, floatValue: 7.625, integerValue: 256, shortValue: 9898, stringValue: "simple", blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes simple scalar properties encoded using a map with definite length */ it("RpcV2CborSimpleScalarPropertiesUsingDefiniteLength:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `qXB0cnVlQm9vbGVhblZhbHVl9XFmYWxzZUJvb2xlYW5WYWx1ZfRpYnl0ZVZhbHVlBWtkb3VibGVWYWx1Zfs//jlYEGJN02pmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAanNob3J0VmFsdWUZJqprc3RyaW5nVmFsdWVmc2ltcGxlaWJsb2JWYWx1ZUNmb28=` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { trueBooleanValue: true, falseBooleanValue: false, byteValue: 5, doubleValue: 1.889, floatValue: 7.625, integerValue: 256, shortValue: 9898, stringValue: "simple", blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * RpcV2 Cbor should not deserialize null structure values */ it("RpcV2CborClientDoesntDeserializeNullStructureValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tzdHJpbmdWYWx1Zfb/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Supports handling NaN float values. */ it("RpcV2CborSupportsNaNFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zft/+AAAAAAAAGpmbG9hdFZhbHVl+n/AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: NaN, floatValue: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsInfinityFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zft/8AAAAAAAAGpmbG9hdFZhbHVl+n+AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: Infinity, floatValue: Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports handling Negative Infinity float values. */ it("RpcV2CborSupportsNegativeInfinityFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zfv/8AAAAAAAAGpmbG9hdFZhbHVl+v+AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: -Infinity, floatValue: -Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports upcasting from a smaller byte representation of the same data type. */ it("RpcV2CborSupportsUpcastingDataOnDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zfk+AGpmbG9hdFZhbHVl+UegbGludGVnZXJWYWx1ZRg4aWxvbmdWYWx1ZRkBAGpzaG9ydFZhbHVlCv8=` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: 1.5, floatValue: 7.625, integerValue: 56, longValue: 256, shortValue: 10, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * The client should skip over additional fields that are not part of the structure. This allows a * client generated against an older Smithy model to be able to communicate with a server that is * generated against a newer Smithy model. */ it("RpcV2CborExtraFieldsInTheBodyShouldBeSkippedByClients:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2lieXRlVmFsdWUFa2RvdWJsZVZhbHVl+z/+OVgQYk3TcWZhbHNlQm9vbGVhblZhbHVl9GpmbG9hdFZhbHVl+kD0AABrZXh0cmFPYmplY3S/c2luZGVmaW5pdGVMZW5ndGhNYXC/a3dpdGhBbkFycmF5nwECA///cWRlZmluaXRlTGVuZ3RoTWFwo3J3aXRoQURlZmluaXRlQXJyYXmDAQIDeB1hbmRTb21lSW5kZWZpbml0ZUxlbmd0aFN0cmluZ3gfdGhhdCBoYXMsIGJlZW4gY2h1bmtlZCBvbiBjb21tYWxub3JtYWxTdHJpbmdjZm9vanNob3J0VmFsdWUZJw9uc29tZU90aGVyRmllbGR2dGhpcyBzaG91bGQgYmUgc2tpcHBlZP9saW50ZWdlclZhbHVlGQEAaWxvbmdWYWx1ZRkmkWpzaG9ydFZhbHVlGSaqa3N0cmluZ1ZhbHVlZnNpbXBsZXB0cnVlQm9vbGVhblZhbHVl9WlibG9iVmFsdWVDZm9v/w==` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { byteValue: 5, doubleValue: 1.889, falseBooleanValue: false, floatValue: 7.625, integerValue: 256, longValue: 9873, shortValue: 9898, stringValue: "simple", trueBooleanValue: true, blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes null values in maps */ it("RpcV2CborSparseMapsSerializeNullValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SparseNullsOperationCommand( { sparseStringMap: { foo: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SparseNullsOperation"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VTdHJpbmdNYXC/Y2Zvb/b//w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes null values in lists */ it("RpcV2CborSparseListsSerializeNull:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SparseNullsOperationCommand( { sparseStringList: [ null, ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SparseNullsOperation"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3BzcGFyc2VTdHJpbmdMaXN0n/b//w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes null values in maps */ it("RpcV2CborSparseMapsDeserializeNullValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VTdHJpbmdNYXC/Y2Zvb/b//w==` ), }); const params: any = {}; const command = new SparseNullsOperationCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStringMap: { foo: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes null values in lists */ it("RpcV2CborSparseListsDeserializeNull:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3BzcGFyc2VTdHJpbmdMaXN0n/b//w==` ), }); const params: any = {}; const command = new SparseNullsOperationCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStringList: [ null, ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); const compareEquivalentCborBodies = (expectedBody: string, generatedBody: string | Uint8Array): undefined => { expect( normalizeByteArrayType(cbor.deserialize(typeof generatedBody === "string" ? toBytes(generatedBody) : generatedBody)) ).toEqual(normalizeByteArrayType(cbor.deserialize(toBytes(expectedBody)))); return undefined; }; ================================================ FILE: private/smithy-rpcv2-cbor/test/index-objects.spec.mjs ================================================ import { ComplexError, EmptyInputOutputCommand, Float16Command, FooEnum, FractionalSecondsCommand, GreetingWithErrorsCommand, IntegerEnum, InvalidGreeting, NoInputOutputCommand, OperationWithDefaultsCommand, OptionalInputOutputCommand, RecursiveShapesCommand, RpcV2CborDenseMapsCommand, RpcV2CborListsCommand, RpcV2CborSparseMapsCommand, RpcV2Protocol, RpcV2ProtocolClient, RpcV2ProtocolServiceException, SimpleScalarPropertiesCommand, SparseNullsOperationCommand, TestEnum, TestIntEnum, ValidationException, } from "../dist-cjs/index.js"; import assert from "node:assert"; // clients assert(typeof RpcV2ProtocolClient === "function"); assert(typeof RpcV2Protocol === "function"); // commands assert(typeof EmptyInputOutputCommand === "function"); assert(typeof Float16Command === "function"); assert(typeof FractionalSecondsCommand === "function"); assert(typeof GreetingWithErrorsCommand === "function"); assert(typeof NoInputOutputCommand === "function"); assert(typeof OperationWithDefaultsCommand === "function"); assert(typeof OptionalInputOutputCommand === "function"); assert(typeof RecursiveShapesCommand === "function"); assert(typeof RpcV2CborDenseMapsCommand === "function"); assert(typeof RpcV2CborListsCommand === "function"); assert(typeof RpcV2CborSparseMapsCommand === "function"); assert(typeof SimpleScalarPropertiesCommand === "function"); assert(typeof SparseNullsOperationCommand === "function"); // structural schemas // enums assert(typeof TestEnum === "object"); assert(typeof TestIntEnum === "object"); assert(typeof FooEnum === "object"); assert(typeof IntegerEnum === "object"); // errors assert(ValidationException.prototype instanceof RpcV2ProtocolServiceException); assert(ComplexError.prototype instanceof RpcV2ProtocolServiceException); assert(InvalidGreeting.prototype instanceof RpcV2ProtocolServiceException); assert(RpcV2ProtocolServiceException.prototype instanceof Error); console.log(`RpcV2Protocol index test passed.`); ================================================ FILE: private/smithy-rpcv2-cbor/test/index-types.ts ================================================ // smithy-typescript generated code export type { RpcV2ProtocolClient, RpcV2Protocol, EmptyInputOutputCommand, EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput, Float16Command, Float16CommandInput, Float16CommandOutput, FractionalSecondsCommand, FractionalSecondsCommandInput, FractionalSecondsCommandOutput, GreetingWithErrorsCommand, GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, NoInputOutputCommand, NoInputOutputCommandInput, NoInputOutputCommandOutput, OperationWithDefaultsCommand, OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, OptionalInputOutputCommand, OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, RecursiveShapesCommand, RecursiveShapesCommandInput, RecursiveShapesCommandOutput, RpcV2CborDenseMapsCommand, RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, RpcV2CborListsCommand, RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput, RpcV2CborSparseMapsCommand, RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, SimpleScalarPropertiesCommand, SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, SparseNullsOperationCommand, SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, TestEnum, TestIntEnum, FooEnum, IntegerEnum, ValidationExceptionField, ClientOptionalDefaults, ComplexNestedErrorData, Defaults, EmptyStructure, Float16Output, FractionalSecondsOutput, GreetingWithErrorsOutput, OperationWithDefaultsInput, OperationWithDefaultsOutput, RecursiveShapesInputOutput, RecursiveShapesInputOutputNested1, RecursiveShapesInputOutputNested2, RpcV2CborDenseMapsInputOutput, RpcV2CborListInputOutput, RpcV2CborSparseMapsInputOutput, SimpleScalarStructure, SimpleStructure, SparseNullsOperationInputOutput, StructureListMember, GreetingStruct, ValidationException, ComplexError, InvalidGreeting, RpcV2ProtocolServiceException, } from "../dist-types/index.d"; ================================================ FILE: private/smithy-rpcv2-cbor/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist-cjs", "noCheck": true } } ================================================ FILE: private/smithy-rpcv2-cbor/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "lib": ["dom"], "module": "ESNext", "moduleResolution": "bundler", "outDir": "dist-es", "noCheck": true } } ================================================ FILE: private/smithy-rpcv2-cbor/tsconfig.json ================================================ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "downlevelIteration": true, "importHelpers": true, "incremental": true, "removeComments": true, "resolveJsonModule": true, "rootDir": "src", "useUnknownInCatchVariables": false }, "include": ["src"] } ================================================ FILE: private/smithy-rpcv2-cbor/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist-types", "emitDeclarationOnly": true, "noCheck": false } } ================================================ FILE: private/smithy-rpcv2-cbor/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: private/smithy-rpcv2-cbor/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ}.spec.ts"], include: ["**/*.spec.ts"], globals: true, }, }); ================================================ FILE: private/smithy-rpcv2-cbor-schema/package.json ================================================ { "name": "@smithy/smithy-rpcv2-cbor-schema", "description": "@smithy/smithy-rpcv2-cbor-schema client", "version": "1.0.0-alpha.1", "scripts": { "build": "concurrently 'npm:build:cjs' 'npm:build:es' 'npm:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "test:index": "tsc --noEmit ./test/index-types.ts && node ./test/index-objects.spec.mjs", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "prepack": "npm run clean && npm run build", "test": "npx vitest run --passWithNoTests", "test:watch": "npx vitest watch --passWithNoTests", "test:integration": "npx vitest run --passWithNoTests -c vitest.config.integ.mts", "test:integration:watch": "npx vitest watch --passWithNoTests -c vitest.config.integ.mts" }, "main": "./dist-cjs/index.js", "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@smithy/core": "workspace:^", "@smithy/fetch-http-handler": "workspace:^", "@smithy/node-http-handler": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "devDependencies": { "@smithy/snapshot-testing": "workspace:^", "@tsconfig/node20": "20.1.8", "@types/node": "^20.14.8", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typescript": "~5.8.3", "vitest": "^4.0.17" }, "engines": { "node": ">=20.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": [ "dist-types/ts3.4/*" ] } }, "files": [ "dist-*/**" ], "author": { "name": "Smithy team", "url": "https://smithy.io/" }, "license": "Apache-2.0", "browser": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.browser" }, "react-native": { "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.native" }, "private": true } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/RpcV2Protocol.ts ================================================ // smithy-typescript generated code import { createAggregatedClient } from "@smithy/core/client"; import type { HttpHandlerOptions as __HttpHandlerOptions } from "@smithy/types"; import { type EmptyInputOutputCommandInput, type EmptyInputOutputCommandOutput, EmptyInputOutputCommand, } from "./commands/EmptyInputOutputCommand"; import { type Float16CommandInput, type Float16CommandOutput, Float16Command } from "./commands/Float16Command"; import { type FractionalSecondsCommandInput, type FractionalSecondsCommandOutput, FractionalSecondsCommand, } from "./commands/FractionalSecondsCommand"; import { type GreetingWithErrorsCommandInput, type GreetingWithErrorsCommandOutput, GreetingWithErrorsCommand, } from "./commands/GreetingWithErrorsCommand"; import { type NoInputOutputCommandInput, type NoInputOutputCommandOutput, NoInputOutputCommand, } from "./commands/NoInputOutputCommand"; import { type OperationWithDefaultsCommandInput, type OperationWithDefaultsCommandOutput, OperationWithDefaultsCommand, } from "./commands/OperationWithDefaultsCommand"; import { type OptionalInputOutputCommandInput, type OptionalInputOutputCommandOutput, OptionalInputOutputCommand, } from "./commands/OptionalInputOutputCommand"; import { type RecursiveShapesCommandInput, type RecursiveShapesCommandOutput, RecursiveShapesCommand, } from "./commands/RecursiveShapesCommand"; import { type RpcV2CborDenseMapsCommandInput, type RpcV2CborDenseMapsCommandOutput, RpcV2CborDenseMapsCommand, } from "./commands/RpcV2CborDenseMapsCommand"; import { type RpcV2CborListsCommandInput, type RpcV2CborListsCommandOutput, RpcV2CborListsCommand, } from "./commands/RpcV2CborListsCommand"; import { type RpcV2CborSparseMapsCommandInput, type RpcV2CborSparseMapsCommandOutput, RpcV2CborSparseMapsCommand, } from "./commands/RpcV2CborSparseMapsCommand"; import { type SimpleScalarPropertiesCommandInput, type SimpleScalarPropertiesCommandOutput, SimpleScalarPropertiesCommand, } from "./commands/SimpleScalarPropertiesCommand"; import { type SparseNullsOperationCommandInput, type SparseNullsOperationCommandOutput, SparseNullsOperationCommand, } from "./commands/SparseNullsOperationCommand"; import { RpcV2ProtocolClient } from "./RpcV2ProtocolClient"; const commands = { EmptyInputOutputCommand, Float16Command, FractionalSecondsCommand, GreetingWithErrorsCommand, NoInputOutputCommand, OperationWithDefaultsCommand, OptionalInputOutputCommand, RecursiveShapesCommand, RpcV2CborDenseMapsCommand, RpcV2CborListsCommand, RpcV2CborSparseMapsCommand, SimpleScalarPropertiesCommand, SparseNullsOperationCommand, }; export interface RpcV2Protocol { /** * @see {@link EmptyInputOutputCommand} */ emptyInputOutput(): Promise; emptyInputOutput( args: EmptyInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; emptyInputOutput( args: EmptyInputOutputCommandInput, cb: (err: any, data?: EmptyInputOutputCommandOutput) => void ): void; emptyInputOutput( args: EmptyInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: EmptyInputOutputCommandOutput) => void ): void; /** * @see {@link Float16Command} */ float16(): Promise; float16( args: Float16CommandInput, options?: __HttpHandlerOptions ): Promise; float16( args: Float16CommandInput, cb: (err: any, data?: Float16CommandOutput) => void ): void; float16( args: Float16CommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: Float16CommandOutput) => void ): void; /** * @see {@link FractionalSecondsCommand} */ fractionalSeconds(): Promise; fractionalSeconds( args: FractionalSecondsCommandInput, options?: __HttpHandlerOptions ): Promise; fractionalSeconds( args: FractionalSecondsCommandInput, cb: (err: any, data?: FractionalSecondsCommandOutput) => void ): void; fractionalSeconds( args: FractionalSecondsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: FractionalSecondsCommandOutput) => void ): void; /** * @see {@link GreetingWithErrorsCommand} */ greetingWithErrors(): Promise; greetingWithErrors( args: GreetingWithErrorsCommandInput, options?: __HttpHandlerOptions ): Promise; greetingWithErrors( args: GreetingWithErrorsCommandInput, cb: (err: any, data?: GreetingWithErrorsCommandOutput) => void ): void; greetingWithErrors( args: GreetingWithErrorsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: GreetingWithErrorsCommandOutput) => void ): void; /** * @see {@link NoInputOutputCommand} */ noInputOutput(): Promise; noInputOutput( args: NoInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; noInputOutput( args: NoInputOutputCommandInput, cb: (err: any, data?: NoInputOutputCommandOutput) => void ): void; noInputOutput( args: NoInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: NoInputOutputCommandOutput) => void ): void; /** * @see {@link OperationWithDefaultsCommand} */ operationWithDefaults(): Promise; operationWithDefaults( args: OperationWithDefaultsCommandInput, options?: __HttpHandlerOptions ): Promise; operationWithDefaults( args: OperationWithDefaultsCommandInput, cb: (err: any, data?: OperationWithDefaultsCommandOutput) => void ): void; operationWithDefaults( args: OperationWithDefaultsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: OperationWithDefaultsCommandOutput) => void ): void; /** * @see {@link OptionalInputOutputCommand} */ optionalInputOutput(): Promise; optionalInputOutput( args: OptionalInputOutputCommandInput, options?: __HttpHandlerOptions ): Promise; optionalInputOutput( args: OptionalInputOutputCommandInput, cb: (err: any, data?: OptionalInputOutputCommandOutput) => void ): void; optionalInputOutput( args: OptionalInputOutputCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: OptionalInputOutputCommandOutput) => void ): void; /** * @see {@link RecursiveShapesCommand} */ recursiveShapes(): Promise; recursiveShapes( args: RecursiveShapesCommandInput, options?: __HttpHandlerOptions ): Promise; recursiveShapes( args: RecursiveShapesCommandInput, cb: (err: any, data?: RecursiveShapesCommandOutput) => void ): void; recursiveShapes( args: RecursiveShapesCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RecursiveShapesCommandOutput) => void ): void; /** * @see {@link RpcV2CborDenseMapsCommand} */ rpcV2CborDenseMaps(): Promise; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, cb: (err: any, data?: RpcV2CborDenseMapsCommandOutput) => void ): void; rpcV2CborDenseMaps( args: RpcV2CborDenseMapsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborDenseMapsCommandOutput) => void ): void; /** * @see {@link RpcV2CborListsCommand} */ rpcV2CborLists(): Promise; rpcV2CborLists( args: RpcV2CborListsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborLists( args: RpcV2CborListsCommandInput, cb: (err: any, data?: RpcV2CborListsCommandOutput) => void ): void; rpcV2CborLists( args: RpcV2CborListsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborListsCommandOutput) => void ): void; /** * @see {@link RpcV2CborSparseMapsCommand} */ rpcV2CborSparseMaps(): Promise; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, options?: __HttpHandlerOptions ): Promise; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, cb: (err: any, data?: RpcV2CborSparseMapsCommandOutput) => void ): void; rpcV2CborSparseMaps( args: RpcV2CborSparseMapsCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: RpcV2CborSparseMapsCommandOutput) => void ): void; /** * @see {@link SimpleScalarPropertiesCommand} */ simpleScalarProperties(): Promise; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, options?: __HttpHandlerOptions ): Promise; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, cb: (err: any, data?: SimpleScalarPropertiesCommandOutput) => void ): void; simpleScalarProperties( args: SimpleScalarPropertiesCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: SimpleScalarPropertiesCommandOutput) => void ): void; /** * @see {@link SparseNullsOperationCommand} */ sparseNullsOperation(): Promise; sparseNullsOperation( args: SparseNullsOperationCommandInput, options?: __HttpHandlerOptions ): Promise; sparseNullsOperation( args: SparseNullsOperationCommandInput, cb: (err: any, data?: SparseNullsOperationCommandOutput) => void ): void; sparseNullsOperation( args: SparseNullsOperationCommandInput, options: __HttpHandlerOptions, cb: (err: any, data?: SparseNullsOperationCommandOutput) => void ): void; } /** * @public */ export class RpcV2Protocol extends RpcV2ProtocolClient implements RpcV2Protocol {} createAggregatedClient(commands, RpcV2Protocol); ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/RpcV2ProtocolClient.ts ================================================ // smithy-typescript generated code import { DefaultIdentityProviderConfig, getHttpAuthSchemeEndpointRuleSetPlugin, getHttpSigningPlugin, } from "@smithy/core"; import { type DefaultsMode as __DefaultsMode, type SmithyConfiguration as __SmithyConfiguration, type SmithyResolvedConfiguration as __SmithyResolvedConfiguration, Client as __Client, } from "@smithy/core/client"; import { type EndpointInputConfig, type EndpointRequiredInputConfig, type EndpointRequiredResolvedConfig, type EndpointResolvedConfig, resolveEndpointConfig, resolveEndpointRequiredConfig, } from "@smithy/core/endpoints"; import { type HttpHandlerUserInput as __HttpHandlerUserInput, getContentLengthPlugin } from "@smithy/core/protocols"; import { type RetryInputConfig, type RetryResolvedConfig, getRetryPlugin, resolveRetryConfig, } from "@smithy/core/retry"; import { getSchemaSerdePlugin } from "@smithy/core/schema"; import type { BodyLengthCalculator as __BodyLengthCalculator, CheckOptionalClientConfig as __CheckOptionalClientConfig, ChecksumConstructor as __ChecksumConstructor, Decoder as __Decoder, Encoder as __Encoder, HashConstructor as __HashConstructor, HttpHandlerOptions as __HttpHandlerOptions, Logger as __Logger, Provider as __Provider, StreamCollector as __StreamCollector, UrlParser as __UrlParser, } from "@smithy/types"; import { type HttpAuthSchemeInputConfig, type HttpAuthSchemeResolvedConfig, defaultRpcV2ProtocolHttpAuthSchemeParametersProvider, resolveHttpAuthSchemeConfig, } from "./auth/httpAuthSchemeProvider"; import type { EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput } from "./commands/EmptyInputOutputCommand"; import type { Float16CommandInput, Float16CommandOutput } from "./commands/Float16Command"; import type { FractionalSecondsCommandInput, FractionalSecondsCommandOutput, } from "./commands/FractionalSecondsCommand"; import type { GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, } from "./commands/GreetingWithErrorsCommand"; import type { NoInputOutputCommandInput, NoInputOutputCommandOutput } from "./commands/NoInputOutputCommand"; import type { OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, } from "./commands/OperationWithDefaultsCommand"; import type { OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, } from "./commands/OptionalInputOutputCommand"; import type { RecursiveShapesCommandInput, RecursiveShapesCommandOutput } from "./commands/RecursiveShapesCommand"; import type { RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, } from "./commands/RpcV2CborDenseMapsCommand"; import type { RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput } from "./commands/RpcV2CborListsCommand"; import type { RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, } from "./commands/RpcV2CborSparseMapsCommand"; import type { SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, } from "./commands/SimpleScalarPropertiesCommand"; import type { SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, } from "./commands/SparseNullsOperationCommand"; import { type ClientInputEndpointParameters, type ClientResolvedEndpointParameters, type EndpointParameters, resolveClientEndpointParameters, } from "./endpoint/EndpointParameters"; import { getRuntimeConfig as __getRuntimeConfig } from "./runtimeConfig"; import { type RuntimeExtension, type RuntimeExtensionsConfig, resolveRuntimeExtensions } from "./runtimeExtensions"; export { __Client }; /** * @public */ export type ServiceInputTypes = | EmptyInputOutputCommandInput | Float16CommandInput | FractionalSecondsCommandInput | GreetingWithErrorsCommandInput | NoInputOutputCommandInput | OperationWithDefaultsCommandInput | OptionalInputOutputCommandInput | RecursiveShapesCommandInput | RpcV2CborDenseMapsCommandInput | RpcV2CborListsCommandInput | RpcV2CborSparseMapsCommandInput | SimpleScalarPropertiesCommandInput | SparseNullsOperationCommandInput; /** * @public */ export type ServiceOutputTypes = | EmptyInputOutputCommandOutput | Float16CommandOutput | FractionalSecondsCommandOutput | GreetingWithErrorsCommandOutput | NoInputOutputCommandOutput | OperationWithDefaultsCommandOutput | OptionalInputOutputCommandOutput | RecursiveShapesCommandOutput | RpcV2CborDenseMapsCommandOutput | RpcV2CborListsCommandOutput | RpcV2CborSparseMapsCommandOutput | SimpleScalarPropertiesCommandOutput | SparseNullsOperationCommandOutput; /** * @public */ export interface ClientDefaults extends Partial<__SmithyConfiguration<__HttpHandlerOptions>> { /** * The HTTP handler to use or its constructor options. Fetch in browser and Https in Nodejs. */ requestHandler?: __HttpHandlerUserInput; /** * A constructor for a class implementing the {@link @smithy/types#ChecksumConstructor} interface * that computes the SHA-256 HMAC or checksum of a string or binary buffer. * @internal */ sha256?: __ChecksumConstructor | __HashConstructor; /** * The function that will be used to convert strings into HTTP endpoints. * @internal */ urlParser?: __UrlParser; /** * A function that can calculate the length of a request body. * @internal */ bodyLengthChecker?: __BodyLengthCalculator; /** * A function that converts a stream into an array of bytes. * @internal */ streamCollector?: __StreamCollector; /** * The function that will be used to convert a base64-encoded string to a byte array. * @internal */ base64Decoder?: __Decoder; /** * The function that will be used to convert binary data to a base64-encoded string. * @internal */ base64Encoder?: __Encoder; /** * The function that will be used to convert a UTF8-encoded string to a byte array. * @internal */ utf8Decoder?: __Decoder; /** * The function that will be used to convert binary data to a UTF-8 encoded string. * @internal */ utf8Encoder?: __Encoder; /** * The runtime environment. * @internal */ runtime?: string; /** * Disable dynamically changing the endpoint of the client based on the hostPrefix * trait of an operation. */ disableHostPrefix?: boolean; /** * Value for how many times a request will be made at most in case of retry. */ maxAttempts?: number | __Provider; /** * Specifies which retry algorithm to use. * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-smithy-util-retry/Enum/RETRY_MODES/ * */ retryMode?: string | __Provider; /** * Optional logger for logging debug/info/warn/error. */ logger?: __Logger; /** * Optional extensions */ extensions?: RuntimeExtension[]; /** * The {@link @smithy/smithy-client#DefaultsMode} that will be used to determine how certain default configuration options are resolved in the SDK. */ defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>; } /** * @public */ export type RpcV2ProtocolClientConfigType = Partial<__SmithyConfiguration<__HttpHandlerOptions>> & ClientDefaults & RetryInputConfig & EndpointInputConfig & EndpointRequiredInputConfig & HttpAuthSchemeInputConfig & ClientInputEndpointParameters; /** * @public * * The configuration interface of RpcV2ProtocolClient class constructor that set the region, credentials and other options. */ export interface RpcV2ProtocolClientConfig extends RpcV2ProtocolClientConfigType {} /** * @public */ export type RpcV2ProtocolClientResolvedConfigType = __SmithyResolvedConfiguration<__HttpHandlerOptions> & Required & RuntimeExtensionsConfig & RetryResolvedConfig & EndpointResolvedConfig & EndpointRequiredResolvedConfig & HttpAuthSchemeResolvedConfig & ClientResolvedEndpointParameters; /** * @public * * The resolved configuration interface of RpcV2ProtocolClient class. This is resolved and normalized from the {@link RpcV2ProtocolClientConfig | constructor configuration interface}. */ export interface RpcV2ProtocolClientResolvedConfig extends RpcV2ProtocolClientResolvedConfigType {} /** * @public */ export class RpcV2ProtocolClient extends __Client< __HttpHandlerOptions, ServiceInputTypes, ServiceOutputTypes, RpcV2ProtocolClientResolvedConfig > { /** * The resolved configuration of RpcV2ProtocolClient class. This is resolved and normalized from the {@link RpcV2ProtocolClientConfig | constructor configuration interface}. */ readonly config: RpcV2ProtocolClientResolvedConfig; constructor(...[configuration]: __CheckOptionalClientConfig) { const _config_0 = __getRuntimeConfig(configuration || {}); super(_config_0 as any); this.initConfig = _config_0; const _config_1 = resolveClientEndpointParameters(_config_0); const _config_2 = resolveRetryConfig(_config_1); const _config_3 = resolveEndpointConfig(_config_2); const _config_4 = resolveEndpointRequiredConfig(_config_3); const _config_5 = resolveHttpAuthSchemeConfig(_config_4); const _config_6 = resolveRuntimeExtensions(_config_5, configuration?.extensions || []); this.config = _config_6; this.middlewareStack.use(getSchemaSerdePlugin(this.config)); this.middlewareStack.use(getRetryPlugin(this.config)); this.middlewareStack.use(getContentLengthPlugin(this.config)); this.middlewareStack.use( getHttpAuthSchemeEndpointRuleSetPlugin(this.config, { httpAuthSchemeParametersProvider: defaultRpcV2ProtocolHttpAuthSchemeParametersProvider, identityProviderConfigProvider: async (config: RpcV2ProtocolClientResolvedConfig) => new DefaultIdentityProviderConfig({}), }) ); this.middlewareStack.use(getHttpSigningPlugin(this.config)); } /** * Destroy underlying resources, like sockets. It's usually not necessary to do this. * However in Node.js, it's best to explicitly shut down the client's agent when it is no longer needed. * Otherwise, sockets might stay open for quite a long time before the server terminates them. */ destroy(): void { super.destroy(); } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/auth/httpAuthExtensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpAuthScheme } from "@smithy/types"; import type { RpcV2ProtocolHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; /** * @internal */ export interface HttpAuthExtensionConfiguration { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void; httpAuthSchemes(): HttpAuthScheme[]; setHttpAuthSchemeProvider(httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider): void; httpAuthSchemeProvider(): RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export type HttpAuthRuntimeConfig = Partial<{ httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider; }>; /** * @internal */ export const getHttpAuthExtensionConfiguration = ( runtimeConfig: HttpAuthRuntimeConfig ): HttpAuthExtensionConfiguration => { const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!; let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!; return { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex((scheme) => scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; }, setHttpAuthSchemeProvider(httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): RpcV2ProtocolHttpAuthSchemeProvider { return _httpAuthSchemeProvider; }, }; }; /** * @internal */ export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => { return { httpAuthSchemes: config.httpAuthSchemes(), httpAuthSchemeProvider: config.httpAuthSchemeProvider(), }; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/auth/httpAuthSchemeProvider.ts ================================================ // smithy-typescript generated code import { getSmithyContext, normalizeProvider } from "@smithy/core/client"; import type { HandlerExecutionContext, HttpAuthOption, HttpAuthScheme, HttpAuthSchemeParameters, HttpAuthSchemeParametersProvider, HttpAuthSchemeProvider, Provider, } from "@smithy/types"; import type { RpcV2ProtocolClientResolvedConfig } from "../RpcV2ProtocolClient"; /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeParameters extends HttpAuthSchemeParameters {} /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< RpcV2ProtocolClientResolvedConfig, HandlerExecutionContext, RpcV2ProtocolHttpAuthSchemeParameters, object > {} /** * @internal */ export const defaultRpcV2ProtocolHttpAuthSchemeParametersProvider = async ( config: RpcV2ProtocolClientResolvedConfig, context: HandlerExecutionContext, input: object ): Promise => { return { operation: getSmithyContext(context).operation as string, }; }; function createSmithyApiNoAuthHttpAuthOption(authParameters: RpcV2ProtocolHttpAuthSchemeParameters): HttpAuthOption { return { schemeId: "smithy.api#noAuth", }; } /** * @internal */ export interface RpcV2ProtocolHttpAuthSchemeProvider extends HttpAuthSchemeProvider {} /** * @internal */ export const defaultRpcV2ProtocolHttpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider = (authParameters) => { const options: HttpAuthOption[] = []; switch (authParameters.operation) { default: { options.push(createSmithyApiNoAuthHttpAuthOption(authParameters)); } } return options; }; /** * @public */ export interface HttpAuthSchemeInputConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ authSchemePreference?: string[] | Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ httpAuthSchemes?: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ httpAuthSchemeProvider?: RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export interface HttpAuthSchemeResolvedConfig { /** * A comma-separated list of case-sensitive auth scheme names. * An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. * For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. * @public */ readonly authSchemePreference: Provider; /** * Configuration of HttpAuthSchemes for a client which provides default identity providers and signers per auth scheme. * @internal */ readonly httpAuthSchemes: HttpAuthScheme[]; /** * Configuration of an HttpAuthSchemeProvider for a client which resolves which HttpAuthScheme to use. * @internal */ readonly httpAuthSchemeProvider: RpcV2ProtocolHttpAuthSchemeProvider; } /** * @internal */ export const resolveHttpAuthSchemeConfig = ( config: T & HttpAuthSchemeInputConfig ): T & HttpAuthSchemeResolvedConfig => { return Object.assign(config, { authSchemePreference: normalizeProvider(config.authSchemePreference ?? []), }) as T & HttpAuthSchemeResolvedConfig; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/EmptyInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { EmptyStructure } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { EmptyInputOutput$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link EmptyInputOutputCommand}. */ export interface EmptyInputOutputCommandInput extends EmptyStructure {} /** * @public * * The output of {@link EmptyInputOutputCommand}. */ export interface EmptyInputOutputCommandOutput extends EmptyStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, EmptyInputOutputCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, EmptyInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new EmptyInputOutputCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param EmptyInputOutputCommandInput - {@link EmptyInputOutputCommandInput} * @returns {@link EmptyInputOutputCommandOutput} * @see {@link EmptyInputOutputCommandInput} for command's `input` shape. * @see {@link EmptyInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class EmptyInputOutputCommand extends $Command .classBuilder< EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "EmptyInputOutput", {}) .n("RpcV2ProtocolClient", "EmptyInputOutputCommand") .sc(EmptyInputOutput$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: {}; }; sdk: { input: EmptyInputOutputCommandInput; output: EmptyInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/Float16Command.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { Float16Output } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { Float16$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link Float16Command}. */ export interface Float16CommandInput {} /** * @public * * The output of {@link Float16Command}. */ export interface Float16CommandOutput extends Float16Output, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, Float16Command } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, Float16Command } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new Float16Command(input); * const response = await client.send(command); * // { // Float16Output * // value: Number("double"), * // }; * * ``` * * @param Float16CommandInput - {@link Float16CommandInput} * @returns {@link Float16CommandOutput} * @see {@link Float16CommandInput} for command's `input` shape. * @see {@link Float16CommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class Float16Command extends $Command .classBuilder< Float16CommandInput, Float16CommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "Float16", {}) .n("RpcV2ProtocolClient", "Float16Command") .sc(Float16$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: Float16Output; }; sdk: { input: Float16CommandInput; output: Float16CommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/FractionalSecondsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { FractionalSecondsOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { FractionalSeconds$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link FractionalSecondsCommand}. */ export interface FractionalSecondsCommandInput {} /** * @public * * The output of {@link FractionalSecondsCommand}. */ export interface FractionalSecondsCommandOutput extends FractionalSecondsOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, FractionalSecondsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, FractionalSecondsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new FractionalSecondsCommand(input); * const response = await client.send(command); * // { // FractionalSecondsOutput * // datetime: new Date("TIMESTAMP"), * // }; * * ``` * * @param FractionalSecondsCommandInput - {@link FractionalSecondsCommandInput} * @returns {@link FractionalSecondsCommandOutput} * @see {@link FractionalSecondsCommandInput} for command's `input` shape. * @see {@link FractionalSecondsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class FractionalSecondsCommand extends $Command .classBuilder< FractionalSecondsCommandInput, FractionalSecondsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "FractionalSeconds", {}) .n("RpcV2ProtocolClient", "FractionalSecondsCommand") .sc(FractionalSeconds$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: FractionalSecondsOutput; }; sdk: { input: FractionalSecondsCommandInput; output: FractionalSecondsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/GreetingWithErrorsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { GreetingWithErrorsOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { GreetingWithErrors$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link GreetingWithErrorsCommand}. */ export interface GreetingWithErrorsCommandInput {} /** * @public * * The output of {@link GreetingWithErrorsCommand}. */ export interface GreetingWithErrorsCommandOutput extends GreetingWithErrorsOutput, __MetadataBearer {} /** * This operation has three possible return values: * * 1. A successful response in the form of GreetingWithErrorsOutput * 2. An InvalidGreeting error. * 3. A ComplexError error. * * Implementations must be able to successfully take a response and * properly deserialize successful and error responses. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, GreetingWithErrorsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, GreetingWithErrorsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new GreetingWithErrorsCommand(input); * const response = await client.send(command); * // { // GreetingWithErrorsOutput * // greeting: "STRING_VALUE", * // }; * * ``` * * @param GreetingWithErrorsCommandInput - {@link GreetingWithErrorsCommandInput} * @returns {@link GreetingWithErrorsCommandOutput} * @see {@link GreetingWithErrorsCommandInput} for command's `input` shape. * @see {@link GreetingWithErrorsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link InvalidGreeting} (client fault) * This error is thrown when an invalid greeting value is provided. * * @throws {@link ComplexError} (client fault) * This error is thrown when a request is invalid. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class GreetingWithErrorsCommand extends $Command .classBuilder< GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "GreetingWithErrors", {}) .n("RpcV2ProtocolClient", "GreetingWithErrorsCommand") .sc(GreetingWithErrors$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: GreetingWithErrorsOutput; }; sdk: { input: GreetingWithErrorsCommandInput; output: GreetingWithErrorsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/NoInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { NoInputOutput$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link NoInputOutputCommand}. */ export interface NoInputOutputCommandInput {} /** * @public * * The output of {@link NoInputOutputCommand}. */ export interface NoInputOutputCommandOutput extends __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, NoInputOutputCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, NoInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = {}; * const command = new NoInputOutputCommand(input); * const response = await client.send(command); * // {}; * * ``` * * @param NoInputOutputCommandInput - {@link NoInputOutputCommandInput} * @returns {@link NoInputOutputCommandOutput} * @see {@link NoInputOutputCommandInput} for command's `input` shape. * @see {@link NoInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class NoInputOutputCommand extends $Command .classBuilder< NoInputOutputCommandInput, NoInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "NoInputOutput", {}) .n("RpcV2ProtocolClient", "NoInputOutputCommand") .sc(NoInputOutput$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: {}; output: {}; }; sdk: { input: NoInputOutputCommandInput; output: NoInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/OperationWithDefaultsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { OperationWithDefaultsInput, OperationWithDefaultsOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { OperationWithDefaults$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link OperationWithDefaultsCommand}. */ export interface OperationWithDefaultsCommandInput extends OperationWithDefaultsInput {} /** * @public * * The output of {@link OperationWithDefaultsCommand}. */ export interface OperationWithDefaultsCommandOutput extends OperationWithDefaultsOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, OperationWithDefaultsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, OperationWithDefaultsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // OperationWithDefaultsInput * defaults: { // Defaults * defaultString: "STRING_VALUE", * defaultBoolean: true || false, * defaultList: [ // TestStringList * "STRING_VALUE", * ], * defaultTimestamp: new Date("TIMESTAMP"), * defaultBlob: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * defaultByte: 0, // BYTE_VALUE * defaultShort: Number("short"), * defaultInteger: Number("int"), * defaultLong: Number("long"), * defaultFloat: Number("float"), * defaultDouble: Number("double"), * defaultMap: { // TestStringMap * "": "STRING_VALUE", * }, * defaultEnum: "FOO" || "BAR" || "BAZ", * defaultIntEnum: 1 || 2, * emptyString: "STRING_VALUE", * falseBoolean: true || false, * emptyBlob: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * zeroByte: 0, // BYTE_VALUE * zeroShort: Number("short"), * zeroInteger: Number("int"), * zeroLong: Number("long"), * zeroFloat: Number("float"), * zeroDouble: Number("double"), * }, * clientOptionalDefaults: { // ClientOptionalDefaults * member: Number("int"), * }, * topLevelDefault: "STRING_VALUE", * otherTopLevelDefault: Number("int"), * }; * const command = new OperationWithDefaultsCommand(input); * const response = await client.send(command); * // { // OperationWithDefaultsOutput * // defaultString: "STRING_VALUE", * // defaultBoolean: true || false, * // defaultList: [ // TestStringList * // "STRING_VALUE", * // ], * // defaultTimestamp: new Date("TIMESTAMP"), * // defaultBlob: new Uint8Array(), * // defaultByte: 0, // BYTE_VALUE * // defaultShort: Number("short"), * // defaultInteger: Number("int"), * // defaultLong: Number("long"), * // defaultFloat: Number("float"), * // defaultDouble: Number("double"), * // defaultMap: { // TestStringMap * // "": "STRING_VALUE", * // }, * // defaultEnum: "FOO" || "BAR" || "BAZ", * // defaultIntEnum: 1 || 2, * // emptyString: "STRING_VALUE", * // falseBoolean: true || false, * // emptyBlob: new Uint8Array(), * // zeroByte: 0, // BYTE_VALUE * // zeroShort: Number("short"), * // zeroInteger: Number("int"), * // zeroLong: Number("long"), * // zeroFloat: Number("float"), * // zeroDouble: Number("double"), * // }; * * ``` * * @param OperationWithDefaultsCommandInput - {@link OperationWithDefaultsCommandInput} * @returns {@link OperationWithDefaultsCommandOutput} * @see {@link OperationWithDefaultsCommandInput} for command's `input` shape. * @see {@link OperationWithDefaultsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class OperationWithDefaultsCommand extends $Command .classBuilder< OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "OperationWithDefaults", {}) .n("RpcV2ProtocolClient", "OperationWithDefaultsCommand") .sc(OperationWithDefaults$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: OperationWithDefaultsInput; output: OperationWithDefaultsOutput; }; sdk: { input: OperationWithDefaultsCommandInput; output: OperationWithDefaultsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/OptionalInputOutputCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SimpleStructure } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { OptionalInputOutput$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link OptionalInputOutputCommand}. */ export interface OptionalInputOutputCommandInput extends SimpleStructure {} /** * @public * * The output of {@link OptionalInputOutputCommand}. */ export interface OptionalInputOutputCommandOutput extends SimpleStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, OptionalInputOutputCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, OptionalInputOutputCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SimpleStructure * value: "STRING_VALUE", * }; * const command = new OptionalInputOutputCommand(input); * const response = await client.send(command); * // { // SimpleStructure * // value: "STRING_VALUE", * // }; * * ``` * * @param OptionalInputOutputCommandInput - {@link OptionalInputOutputCommandInput} * @returns {@link OptionalInputOutputCommandOutput} * @see {@link OptionalInputOutputCommandInput} for command's `input` shape. * @see {@link OptionalInputOutputCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class OptionalInputOutputCommand extends $Command .classBuilder< OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "OptionalInputOutput", {}) .n("RpcV2ProtocolClient", "OptionalInputOutputCommand") .sc(OptionalInputOutput$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SimpleStructure; output: SimpleStructure; }; sdk: { input: OptionalInputOutputCommandInput; output: OptionalInputOutputCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/RecursiveShapesCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RecursiveShapesInputOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { RecursiveShapes$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RecursiveShapesCommand}. */ export interface RecursiveShapesCommandInput extends RecursiveShapesInputOutput {} /** * @public * * The output of {@link RecursiveShapesCommand}. */ export interface RecursiveShapesCommandOutput extends RecursiveShapesInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RecursiveShapesCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, RecursiveShapesCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RecursiveShapesInputOutput * nested: { // RecursiveShapesInputOutputNested1 * foo: "STRING_VALUE", * nested: { // RecursiveShapesInputOutputNested2 * bar: "STRING_VALUE", * recursiveMember: { * foo: "STRING_VALUE", * nested: { * bar: "STRING_VALUE", * recursiveMember: "", * }, * }, * }, * }, * }; * const command = new RecursiveShapesCommand(input); * const response = await client.send(command); * // { // RecursiveShapesInputOutput * // nested: { // RecursiveShapesInputOutputNested1 * // foo: "STRING_VALUE", * // nested: { // RecursiveShapesInputOutputNested2 * // bar: "STRING_VALUE", * // recursiveMember: { * // foo: "STRING_VALUE", * // nested: { * // bar: "STRING_VALUE", * // recursiveMember: "", * // }, * // }, * // }, * // }, * // }; * * ``` * * @param RecursiveShapesCommandInput - {@link RecursiveShapesCommandInput} * @returns {@link RecursiveShapesCommandOutput} * @see {@link RecursiveShapesCommandInput} for command's `input` shape. * @see {@link RecursiveShapesCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class RecursiveShapesCommand extends $Command .classBuilder< RecursiveShapesCommandInput, RecursiveShapesCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "RecursiveShapes", {}) .n("RpcV2ProtocolClient", "RecursiveShapesCommand") .sc(RecursiveShapes$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RecursiveShapesInputOutput; output: RecursiveShapesInputOutput; }; sdk: { input: RecursiveShapesCommandInput; output: RecursiveShapesCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/RpcV2CborDenseMapsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborDenseMapsInputOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { RpcV2CborDenseMaps$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborDenseMapsCommand}. */ export interface RpcV2CborDenseMapsCommandInput extends RpcV2CborDenseMapsInputOutput {} /** * @public * * The output of {@link RpcV2CborDenseMapsCommand}. */ export interface RpcV2CborDenseMapsCommandOutput extends RpcV2CborDenseMapsInputOutput, __MetadataBearer {} /** * The example tests basic map serialization. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborDenseMapsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborDenseMapsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborDenseMapsInputOutput * denseStructMap: { // DenseStructMap * "": { // GreetingStruct * hi: "STRING_VALUE", * }, * }, * denseNumberMap: { // DenseNumberMap * "": Number("int"), * }, * denseBooleanMap: { // DenseBooleanMap * "": true || false, * }, * denseStringMap: { // DenseStringMap * "": "STRING_VALUE", * }, * denseSetMap: { // DenseSetMap * "": [ // StringSet * "STRING_VALUE", * ], * }, * }; * const command = new RpcV2CborDenseMapsCommand(input); * const response = await client.send(command); * // { // RpcV2CborDenseMapsInputOutput * // denseStructMap: { // DenseStructMap * // "": { // GreetingStruct * // hi: "STRING_VALUE", * // }, * // }, * // denseNumberMap: { // DenseNumberMap * // "": Number("int"), * // }, * // denseBooleanMap: { // DenseBooleanMap * // "": true || false, * // }, * // denseStringMap: { // DenseStringMap * // "": "STRING_VALUE", * // }, * // denseSetMap: { // DenseSetMap * // "": [ // StringSet * // "STRING_VALUE", * // ], * // }, * // }; * * ``` * * @param RpcV2CborDenseMapsCommandInput - {@link RpcV2CborDenseMapsCommandInput} * @returns {@link RpcV2CborDenseMapsCommandOutput} * @see {@link RpcV2CborDenseMapsCommandInput} for command's `input` shape. * @see {@link RpcV2CborDenseMapsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class RpcV2CborDenseMapsCommand extends $Command .classBuilder< RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "RpcV2CborDenseMaps", {}) .n("RpcV2ProtocolClient", "RpcV2CborDenseMapsCommand") .sc(RpcV2CborDenseMaps$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborDenseMapsInputOutput; output: RpcV2CborDenseMapsInputOutput; }; sdk: { input: RpcV2CborDenseMapsCommandInput; output: RpcV2CborDenseMapsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/RpcV2CborListsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborListInputOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { RpcV2CborLists$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborListsCommand}. */ export interface RpcV2CborListsCommandInput extends RpcV2CborListInputOutput {} /** * @public * * The output of {@link RpcV2CborListsCommand}. */ export interface RpcV2CborListsCommandOutput extends RpcV2CborListInputOutput, __MetadataBearer {} /** * This test case serializes JSON lists for the following cases for both * input and output: * * 1. Normal lists. * 2. Normal sets. * 3. Lists of lists. * 4. Lists of structures. * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborListsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborListsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborListInputOutput * stringList: [ // StringList * "STRING_VALUE", * ], * stringSet: [ // StringSet * "STRING_VALUE", * ], * integerList: [ // IntegerList * Number("int"), * ], * booleanList: [ // BooleanList * true || false, * ], * timestampList: [ // TimestampList * new Date("TIMESTAMP"), * ], * enumList: [ // FooEnumList * "Foo" || "Baz" || "Bar" || "1" || "0", * ], * intEnumList: [ // IntegerEnumList * 1 || 2 || 3, * ], * nestedStringList: [ // NestedStringList * [ * "STRING_VALUE", * ], * ], * structureList: [ // StructureList * { // StructureListMember * a: "STRING_VALUE", * b: "STRING_VALUE", * }, * ], * blobList: [ // BlobList * new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * ], * }; * const command = new RpcV2CborListsCommand(input); * const response = await client.send(command); * // { // RpcV2CborListInputOutput * // stringList: [ // StringList * // "STRING_VALUE", * // ], * // stringSet: [ // StringSet * // "STRING_VALUE", * // ], * // integerList: [ // IntegerList * // Number("int"), * // ], * // booleanList: [ // BooleanList * // true || false, * // ], * // timestampList: [ // TimestampList * // new Date("TIMESTAMP"), * // ], * // enumList: [ // FooEnumList * // "Foo" || "Baz" || "Bar" || "1" || "0", * // ], * // intEnumList: [ // IntegerEnumList * // 1 || 2 || 3, * // ], * // nestedStringList: [ // NestedStringList * // [ * // "STRING_VALUE", * // ], * // ], * // structureList: [ // StructureList * // { // StructureListMember * // a: "STRING_VALUE", * // b: "STRING_VALUE", * // }, * // ], * // blobList: [ // BlobList * // new Uint8Array(), * // ], * // }; * * ``` * * @param RpcV2CborListsCommandInput - {@link RpcV2CborListsCommandInput} * @returns {@link RpcV2CborListsCommandOutput} * @see {@link RpcV2CborListsCommandInput} for command's `input` shape. * @see {@link RpcV2CborListsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * * @public */ export class RpcV2CborListsCommand extends $Command .classBuilder< RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "RpcV2CborLists", {}) .n("RpcV2ProtocolClient", "RpcV2CborListsCommand") .sc(RpcV2CborLists$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborListInputOutput; output: RpcV2CborListInputOutput; }; sdk: { input: RpcV2CborListsCommandInput; output: RpcV2CborListsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/RpcV2CborSparseMapsCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { RpcV2CborSparseMapsInputOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { RpcV2CborSparseMaps$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link RpcV2CborSparseMapsCommand}. */ export interface RpcV2CborSparseMapsCommandInput extends RpcV2CborSparseMapsInputOutput {} /** * @public * * The output of {@link RpcV2CborSparseMapsCommand}. */ export interface RpcV2CborSparseMapsCommandOutput extends RpcV2CborSparseMapsInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, RpcV2CborSparseMapsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, RpcV2CborSparseMapsCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // RpcV2CborSparseMapsInputOutput * sparseStructMap: { // SparseStructMap * "": { // GreetingStruct * hi: "STRING_VALUE", * }, * }, * sparseNumberMap: { // SparseNumberMap * "": Number("int"), * }, * sparseBooleanMap: { // SparseBooleanMap * "": true || false, * }, * sparseStringMap: { // SparseStringMap * "": "STRING_VALUE", * }, * sparseSetMap: { // SparseSetMap * "": [ // StringSet * "STRING_VALUE", * ], * }, * }; * const command = new RpcV2CborSparseMapsCommand(input); * const response = await client.send(command); * // { // RpcV2CborSparseMapsInputOutput * // sparseStructMap: { // SparseStructMap * // "": { // GreetingStruct * // hi: "STRING_VALUE", * // }, * // }, * // sparseNumberMap: { // SparseNumberMap * // "": Number("int"), * // }, * // sparseBooleanMap: { // SparseBooleanMap * // "": true || false, * // }, * // sparseStringMap: { // SparseStringMap * // "": "STRING_VALUE", * // }, * // sparseSetMap: { // SparseSetMap * // "": [ // StringSet * // "STRING_VALUE", * // ], * // }, * // }; * * ``` * * @param RpcV2CborSparseMapsCommandInput - {@link RpcV2CborSparseMapsCommandInput} * @returns {@link RpcV2CborSparseMapsCommandOutput} * @see {@link RpcV2CborSparseMapsCommandInput} for command's `input` shape. * @see {@link RpcV2CborSparseMapsCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link ValidationException} (client fault) * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class RpcV2CborSparseMapsCommand extends $Command .classBuilder< RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "RpcV2CborSparseMaps", {}) .n("RpcV2ProtocolClient", "RpcV2CborSparseMapsCommand") .sc(RpcV2CborSparseMaps$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: RpcV2CborSparseMapsInputOutput; output: RpcV2CborSparseMapsInputOutput; }; sdk: { input: RpcV2CborSparseMapsCommandInput; output: RpcV2CborSparseMapsCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/SimpleScalarPropertiesCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SimpleScalarStructure } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { SimpleScalarProperties$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link SimpleScalarPropertiesCommand}. */ export interface SimpleScalarPropertiesCommandInput extends SimpleScalarStructure {} /** * @public * * The output of {@link SimpleScalarPropertiesCommand}. */ export interface SimpleScalarPropertiesCommandOutput extends SimpleScalarStructure, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, SimpleScalarPropertiesCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, SimpleScalarPropertiesCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SimpleScalarStructure * trueBooleanValue: true || false, * falseBooleanValue: true || false, * byteValue: 0, // BYTE_VALUE * doubleValue: Number("double"), * floatValue: Number("float"), * integerValue: Number("int"), * longValue: Number("long"), * shortValue: Number("short"), * stringValue: "STRING_VALUE", * blobValue: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") * }; * const command = new SimpleScalarPropertiesCommand(input); * const response = await client.send(command); * // { // SimpleScalarStructure * // trueBooleanValue: true || false, * // falseBooleanValue: true || false, * // byteValue: 0, // BYTE_VALUE * // doubleValue: Number("double"), * // floatValue: Number("float"), * // integerValue: Number("int"), * // longValue: Number("long"), * // shortValue: Number("short"), * // stringValue: "STRING_VALUE", * // blobValue: new Uint8Array(), * // }; * * ``` * * @param SimpleScalarPropertiesCommandInput - {@link SimpleScalarPropertiesCommandInput} * @returns {@link SimpleScalarPropertiesCommandOutput} * @see {@link SimpleScalarPropertiesCommandInput} for command's `input` shape. * @see {@link SimpleScalarPropertiesCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class SimpleScalarPropertiesCommand extends $Command .classBuilder< SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "SimpleScalarProperties", {}) .n("RpcV2ProtocolClient", "SimpleScalarPropertiesCommand") .sc(SimpleScalarProperties$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SimpleScalarStructure; output: SimpleScalarStructure; }; sdk: { input: SimpleScalarPropertiesCommandInput; output: SimpleScalarPropertiesCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/SparseNullsOperationCommand.ts ================================================ // smithy-typescript generated code import { Command as $Command } from "@smithy/core/client"; import { getEndpointPlugin } from "@smithy/core/endpoints"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import { commonParams } from "../endpoint/EndpointParameters"; import type { SparseNullsOperationInputOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { SparseNullsOperation$ } from "../schemas/schemas_0"; /** * @public */ export type { __MetadataBearer }; export { $Command }; /** * @public * * The input for {@link SparseNullsOperationCommand}. */ export interface SparseNullsOperationCommandInput extends SparseNullsOperationInputOutput {} /** * @public * * The output of {@link SparseNullsOperationCommand}. */ export interface SparseNullsOperationCommandOutput extends SparseNullsOperationInputOutput, __MetadataBearer {} /** * @public * * @example * Use a bare-bones client and the command you need to make an API call. * ```javascript * import { RpcV2ProtocolClient, SparseNullsOperationCommand } from "@smithy/smithy-rpcv2-cbor-schema"; // ES Modules import * // const { RpcV2ProtocolClient, SparseNullsOperationCommand } = require("@smithy/smithy-rpcv2-cbor-schema"); // CommonJS import * // import type { RpcV2ProtocolClientConfig } from "@smithy/smithy-rpcv2-cbor-schema"; * const config = {}; // type is RpcV2ProtocolClientConfig * const client = new RpcV2ProtocolClient(config); * const input = { // SparseNullsOperationInputOutput * sparseStringList: [ // SparseStringList * "STRING_VALUE", * ], * sparseStringMap: { // SparseStringMap * "": "STRING_VALUE", * }, * }; * const command = new SparseNullsOperationCommand(input); * const response = await client.send(command); * // { // SparseNullsOperationInputOutput * // sparseStringList: [ // SparseStringList * // "STRING_VALUE", * // ], * // sparseStringMap: { // SparseStringMap * // "": "STRING_VALUE", * // }, * // }; * * ``` * * @param SparseNullsOperationCommandInput - {@link SparseNullsOperationCommandInput} * @returns {@link SparseNullsOperationCommandOutput} * @see {@link SparseNullsOperationCommandInput} for command's `input` shape. * @see {@link SparseNullsOperationCommandOutput} for command's `response` shape. * @see {@link RpcV2ProtocolClientResolvedConfig | config} for RpcV2ProtocolClient's `config` shape. * * @throws {@link RpcV2ProtocolServiceException} *

Base exception class for all service exceptions from RpcV2Protocol service.

* * */ export class SparseNullsOperationCommand extends $Command .classBuilder< SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes >() .ep(commonParams) .m(function (this: any, Command: any, cs: any, config: RpcV2ProtocolClientResolvedConfig, o: any) { return [getEndpointPlugin(config, Command.getEndpointParameterInstructions())]; }) .s("RpcV2Protocol", "SparseNullsOperation", {}) .n("RpcV2ProtocolClient", "SparseNullsOperationCommand") .sc(SparseNullsOperation$) .build() { /** @internal type navigation helper, not in runtime. */ protected declare static __types: { api: { input: SparseNullsOperationInputOutput; output: SparseNullsOperationInputOutput; }; sdk: { input: SparseNullsOperationCommandInput; output: SparseNullsOperationCommandOutput; }; }; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/commands/index.ts ================================================ // smithy-typescript generated code export * from "./EmptyInputOutputCommand"; export * from "./Float16Command"; export * from "./FractionalSecondsCommand"; export * from "./GreetingWithErrorsCommand"; export * from "./NoInputOutputCommand"; export * from "./OperationWithDefaultsCommand"; export * from "./OptionalInputOutputCommand"; export * from "./RecursiveShapesCommand"; export * from "./RpcV2CborDenseMapsCommand"; export * from "./RpcV2CborListsCommand"; export * from "./RpcV2CborSparseMapsCommand"; export * from "./SimpleScalarPropertiesCommand"; export * from "./SparseNullsOperationCommand"; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/endpoint/EndpointParameters.ts ================================================ // smithy-typescript generated code import type { Endpoint, EndpointParameters as __EndpointParameters, EndpointV2, Provider } from "@smithy/types"; /** * @public */ export interface ClientInputEndpointParameters { endpoint?: string | Provider | Endpoint | Provider | EndpointV2 | Provider; } /** * @public */ export type ClientResolvedEndpointParameters = Omit & { defaultSigningName: string; }; /** * @internal */ export const resolveClientEndpointParameters = ( options: T & ClientInputEndpointParameters ): T & ClientResolvedEndpointParameters => { return Object.assign(options, { defaultSigningName: "", }); }; /** * @internal */ export const commonParams = { endpoint: { type: "builtInParams", name: "endpoint" }, } as const; /** * @internal */ export interface EndpointParameters extends __EndpointParameters { endpoint?: string | undefined; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/endpoint/bdd.ts ================================================ // smithy-typescript generated code import { BinaryDecisionDiagram } from "@smithy/core/endpoints"; const a={"ref":"endpoint"}; const _data={ conditions: [ ["isSet",[a]] ], results: [ [-1], [a,{}], [-1,"(default endpointRuleSet) endpoint is not set - you must configure an endpoint."] ] }; const root = 2; const r = 100_000_000; const nodes = new Int32Array([ -1, 1, -1, 0, r + 1, r + 2, ]); export const bdd = BinaryDecisionDiagram.from( nodes, root, _data.conditions, _data.results ); ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/endpoint/endpointResolver.ts ================================================ // smithy-typescript generated code import { type EndpointParams, decideEndpoint, EndpointCache } from "@smithy/core/endpoints"; import type { EndpointV2, Logger } from "@smithy/types"; import { bdd } from "./bdd"; import type { EndpointParameters } from "./EndpointParameters"; const cache = new EndpointCache({ size: 50, params: ["endpoint"], }); /** * @internal */ export const defaultEndpointResolver = ( endpointParams: EndpointParameters, context: { logger?: Logger } = {} ): EndpointV2 => { return cache.get(endpointParams as EndpointParams, () => decideEndpoint(bdd, { endpointParams: endpointParams as EndpointParams, logger: context.logger, }) ); }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/extensionConfiguration.ts ================================================ // smithy-typescript generated code import type { HttpHandlerExtensionConfiguration } from "@smithy/core/protocols"; import type { DefaultExtensionConfiguration } from "@smithy/types"; import type { HttpAuthExtensionConfiguration } from "./auth/httpAuthExtensionConfiguration"; /** * @internal */ export interface RpcV2ProtocolExtensionConfiguration extends HttpHandlerExtensionConfiguration, DefaultExtensionConfiguration, HttpAuthExtensionConfiguration {} ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/index.ts ================================================ // smithy-typescript generated code /* eslint-disable */ export * from "./RpcV2ProtocolClient"; export * from "./RpcV2Protocol"; export type { ClientInputEndpointParameters } from "./endpoint/EndpointParameters"; export type { RuntimeExtension } from "./runtimeExtensions"; export type { RpcV2ProtocolExtensionConfiguration } from "./extensionConfiguration"; export * from "./commands"; export * from "./schemas/schemas_0"; export * from "./models/enums"; export * from "./models/errors"; export * from "./models/models_0"; export { RpcV2ProtocolServiceException } from "./models/RpcV2ProtocolServiceException"; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/models/RpcV2ProtocolServiceException.ts ================================================ // smithy-typescript generated code import { type ServiceExceptionOptions as __ServiceExceptionOptions, ServiceException as __ServiceException, } from "@smithy/core/client"; export type { __ServiceExceptionOptions }; export { __ServiceException }; /** * @public * * Base exception class for all service exceptions from RpcV2Protocol service. */ export class RpcV2ProtocolServiceException extends __ServiceException { /** * @internal */ constructor(options: __ServiceExceptionOptions) { super(options); Object.setPrototypeOf(this, RpcV2ProtocolServiceException.prototype); } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/models/enums.ts ================================================ // smithy-typescript generated code /** * @public * @enum */ export const TestEnum = { BAR: "BAR", BAZ: "BAZ", FOO: "FOO", } as const; /** * @public */ export type TestEnum = (typeof TestEnum)[keyof typeof TestEnum]; export enum TestIntEnum { ONE = 1, TWO = 2, } /** * @public * @enum */ export const FooEnum = { BAR: "Bar", BAZ: "Baz", FOO: "Foo", ONE: "1", ZERO: "0", } as const; /** * @public */ export type FooEnum = (typeof FooEnum)[keyof typeof FooEnum]; export enum IntegerEnum { A = 1, B = 2, C = 3, } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/models/errors.ts ================================================ // smithy-typescript generated code import type { ExceptionOptionType as __ExceptionOptionType } from "@smithy/core/client"; import type { ComplexNestedErrorData, ValidationExceptionField } from "./models_0"; import { RpcV2ProtocolServiceException as __BaseException } from "./RpcV2ProtocolServiceException"; /** * A standard error for input validation failures. * This should be thrown by services when a member of the input structure * falls outside of the modeled or documented constraints. * @public */ export class ValidationException extends __BaseException { readonly name = "ValidationException" as const; readonly $fault = "client" as const; /** * A list of specific failures encountered while validating the input. * A member can appear in this list more than once if it failed to satisfy multiple constraints. * @public */ fieldList?: ValidationExceptionField[] | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "ValidationException", $fault: "client", ...opts, }); Object.setPrototypeOf(this, ValidationException.prototype); this.fieldList = opts.fieldList; } } /** * This error is thrown when a request is invalid. * @public */ export class ComplexError extends __BaseException { readonly name = "ComplexError" as const; readonly $fault = "client" as const; TopLevel?: string | undefined; Nested?: ComplexNestedErrorData | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "ComplexError", $fault: "client", ...opts, }); Object.setPrototypeOf(this, ComplexError.prototype); this.TopLevel = opts.TopLevel; this.Nested = opts.Nested; } } /** * This error is thrown when an invalid greeting value is provided. * @public */ export class InvalidGreeting extends __BaseException { readonly name = "InvalidGreeting" as const; readonly $fault = "client" as const; Message?: string | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "InvalidGreeting", $fault: "client", ...opts, }); Object.setPrototypeOf(this, InvalidGreeting.prototype); this.Message = opts.Message; } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/models/models_0.ts ================================================ // smithy-typescript generated code import type { FooEnum, IntegerEnum, TestEnum, TestIntEnum } from "./enums"; /** * Describes one specific validation failure for an input member. * @public */ export interface ValidationExceptionField { /** * A JSONPointer expression to the structure member whose value failed to satisfy the modeled constraints. * @public */ path: string | undefined; /** * A detailed description of the validation failure. * @public */ message: string | undefined; } /** * @public */ export interface ClientOptionalDefaults { member?: number | undefined; } /** * @public */ export interface ComplexNestedErrorData { Foo?: string | undefined; } /** * @public */ export interface Defaults { defaultString?: string | undefined; defaultBoolean?: boolean | undefined; defaultList?: string[] | undefined; defaultTimestamp?: Date | undefined; defaultBlob?: Uint8Array | undefined; defaultByte?: number | undefined; defaultShort?: number | undefined; defaultInteger?: number | undefined; defaultLong?: number | undefined; defaultFloat?: number | undefined; defaultDouble?: number | undefined; defaultMap?: Record | undefined; defaultEnum?: TestEnum | undefined; defaultIntEnum?: TestIntEnum | undefined; emptyString?: string | undefined; falseBoolean?: boolean | undefined; emptyBlob?: Uint8Array | undefined; zeroByte?: number | undefined; zeroShort?: number | undefined; zeroInteger?: number | undefined; zeroLong?: number | undefined; zeroFloat?: number | undefined; zeroDouble?: number | undefined; } /** * @public */ export interface GreetingStruct { hi?: string | undefined; } /** * @public */ export interface EmptyStructure {} /** * @public */ export interface Float16Output { value?: number | undefined; } /** * @public */ export interface FractionalSecondsOutput { datetime?: Date | undefined; } /** * @public */ export interface GreetingWithErrorsOutput { greeting?: string | undefined; } /** * @public */ export interface OperationWithDefaultsInput { defaults?: Defaults | undefined; clientOptionalDefaults?: ClientOptionalDefaults | undefined; topLevelDefault?: string | undefined; otherTopLevelDefault?: number | undefined; } /** * @public */ export interface OperationWithDefaultsOutput { defaultString?: string | undefined; defaultBoolean?: boolean | undefined; defaultList?: string[] | undefined; defaultTimestamp?: Date | undefined; defaultBlob?: Uint8Array | undefined; defaultByte?: number | undefined; defaultShort?: number | undefined; defaultInteger?: number | undefined; defaultLong?: number | undefined; defaultFloat?: number | undefined; defaultDouble?: number | undefined; defaultMap?: Record | undefined; defaultEnum?: TestEnum | undefined; defaultIntEnum?: TestIntEnum | undefined; emptyString?: string | undefined; falseBoolean?: boolean | undefined; emptyBlob?: Uint8Array | undefined; zeroByte?: number | undefined; zeroShort?: number | undefined; zeroInteger?: number | undefined; zeroLong?: number | undefined; zeroFloat?: number | undefined; zeroDouble?: number | undefined; } /** * @public */ export interface SimpleStructure { value?: string | undefined; } /** * @public */ export interface RpcV2CborDenseMapsInputOutput { denseStructMap?: Record | undefined; denseNumberMap?: Record | undefined; denseBooleanMap?: Record | undefined; denseStringMap?: Record | undefined; denseSetMap?: Record | undefined; } /** * @public */ export interface StructureListMember { a?: string | undefined; b?: string | undefined; } /** * @public */ export interface RpcV2CborListInputOutput { stringList?: string[] | undefined; stringSet?: string[] | undefined; integerList?: number[] | undefined; booleanList?: boolean[] | undefined; timestampList?: Date[] | undefined; enumList?: FooEnum[] | undefined; intEnumList?: IntegerEnum[] | undefined; /** * A list of lists of strings. * @public */ nestedStringList?: string[][] | undefined; structureList?: StructureListMember[] | undefined; blobList?: Uint8Array[] | undefined; } /** * @public */ export interface RpcV2CborSparseMapsInputOutput { sparseStructMap?: Record | undefined; sparseNumberMap?: Record | undefined; sparseBooleanMap?: Record | undefined; sparseStringMap?: Record | undefined; sparseSetMap?: Record | undefined; } /** * @public */ export interface SimpleScalarStructure { trueBooleanValue?: boolean | undefined; falseBooleanValue?: boolean | undefined; byteValue?: number | undefined; doubleValue?: number | undefined; floatValue?: number | undefined; integerValue?: number | undefined; longValue?: number | undefined; shortValue?: number | undefined; stringValue?: string | undefined; blobValue?: Uint8Array | undefined; } /** * @public */ export interface SparseNullsOperationInputOutput { sparseStringList?: (string | null)[] | undefined; sparseStringMap?: Record | undefined; } /** * @public */ export interface RecursiveShapesInputOutputNested1 { foo?: string | undefined; nested?: RecursiveShapesInputOutputNested2 | undefined; } /** * @public */ export interface RecursiveShapesInputOutputNested2 { bar?: string | undefined; recursiveMember?: RecursiveShapesInputOutputNested1 | undefined; } /** * @public */ export interface RecursiveShapesInputOutput { nested?: RecursiveShapesInputOutputNested1 | undefined; } ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/runtimeConfig.browser.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-browser"; import { loadConfigsForDefaultMode } from "@smithy/core/client"; import { resolveDefaultsModeConfig } from "@smithy/core/config"; import { DEFAULT_MAX_ATTEMPTS, DEFAULT_RETRY_MODE } from "@smithy/core/retry"; import { calculateBodyLength } from "@smithy/core/serde"; import { FetchHttpHandler as RequestHandler, streamCollector } from "@smithy/fetch-http-handler"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "browser", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, maxAttempts: config?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS, requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? (async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE), sha256: config?.sha256 ?? Sha256, streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/runtimeConfig.native.ts ================================================ // smithy-typescript generated code import { Sha256 } from "@aws-crypto/sha256-js"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getBrowserRuntimeConfig } from "./runtimeConfig.browser"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { const browserDefaults = getBrowserRuntimeConfig(config); return { ...browserDefaults, ...config, runtime: "react-native", sha256: config?.sha256 ?? Sha256, }; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/runtimeConfig.shared.ts ================================================ // smithy-typescript generated code import { NoAuthSigner } from "@smithy/core"; import { SmithyRpcV2CborProtocol } from "@smithy/core/cbor"; import { NoOpLogger } from "@smithy/core/client"; import { parseUrl } from "@smithy/core/protocols"; import { fromBase64, fromUtf8, toBase64, toUtf8 } from "@smithy/core/serde"; import type { IdentityProviderConfig } from "@smithy/types"; import { defaultRpcV2ProtocolHttpAuthSchemeProvider } from "./auth/httpAuthSchemeProvider"; import { defaultEndpointResolver } from "./endpoint/endpointResolver"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { errorTypeRegistries } from "./schemas/schemas_0"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { return { apiVersion: "2020-07-14", base64Decoder: config?.base64Decoder ?? fromBase64, base64Encoder: config?.base64Encoder ?? toBase64, disableHostPrefix: config?.disableHostPrefix ?? false, endpointProvider: config?.endpointProvider ?? defaultEndpointResolver, extensions: config?.extensions ?? [], httpAuthSchemeProvider: config?.httpAuthSchemeProvider ?? defaultRpcV2ProtocolHttpAuthSchemeProvider, httpAuthSchemes: config?.httpAuthSchemes ?? [ { schemeId: "smithy.api#noAuth", identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider("smithy.api#noAuth") || (async () => ({})), signer: new NoAuthSigner(), }, ], logger: config?.logger ?? new NoOpLogger(), protocol: config?.protocol ?? SmithyRpcV2CborProtocol, protocolSettings: config?.protocolSettings ?? { defaultNamespace: "smithy.protocoltests.rpcv2Cbor", errorTypeRegistries, }, urlParser: config?.urlParser ?? parseUrl, utf8Decoder: config?.utf8Decoder ?? fromUtf8, utf8Encoder: config?.utf8Encoder ?? toUtf8, }; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/runtimeConfig.ts ================================================ // smithy-typescript generated code import { emitWarningIfUnsupportedVersion, loadConfigsForDefaultMode } from "@smithy/core/client"; import { loadConfig as loadNodeConfig, resolveDefaultsModeConfig } from "@smithy/core/config"; import { DEFAULT_RETRY_MODE, NODE_MAX_ATTEMPT_CONFIG_OPTIONS, NODE_RETRY_MODE_CONFIG_OPTIONS, } from "@smithy/core/retry"; import { calculateBodyLength, Hash } from "@smithy/core/serde"; import { NodeHttpHandler as RequestHandler, streamCollector } from "@smithy/node-http-handler"; import type { RpcV2ProtocolClientConfig } from "./RpcV2ProtocolClient"; import { getRuntimeConfig as getSharedRuntimeConfig } from "./runtimeConfig.shared"; /** * @internal */ export const getRuntimeConfig = (config: RpcV2ProtocolClientConfig) => { emitWarningIfUnsupportedVersion(process.version); const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); return { ...clientSharedValues, ...config, runtime: "node", defaultsMode, bodyLengthChecker: config?.bodyLengthChecker ?? calculateBodyLength, maxAttempts: config?.maxAttempts ?? loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config), requestHandler: RequestHandler.create(config?.requestHandler ?? defaultConfigProvider), retryMode: config?.retryMode ?? loadNodeConfig( { ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE, }, config ), sha256: config?.sha256 ?? Hash.bind(null, "sha256"), streamCollector: config?.streamCollector ?? streamCollector, }; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/runtimeExtensions.ts ================================================ // smithy-typescript generated code import { getDefaultExtensionConfiguration, resolveDefaultRuntimeConfig } from "@smithy/core/client"; import { getHttpHandlerExtensionConfiguration, resolveHttpHandlerRuntimeConfig } from "@smithy/core/protocols"; import { getHttpAuthExtensionConfiguration, resolveHttpAuthRuntimeConfig } from "./auth/httpAuthExtensionConfiguration"; import type { RpcV2ProtocolExtensionConfiguration } from "./extensionConfiguration"; /** * @public */ export interface RuntimeExtension { configure(extensionConfiguration: RpcV2ProtocolExtensionConfiguration): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[]; } /** * @internal */ export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => { const extensionConfiguration: RpcV2ProtocolExtensionConfiguration = Object.assign( getDefaultExtensionConfiguration(runtimeConfig), getHttpHandlerExtensionConfiguration(runtimeConfig), getHttpAuthExtensionConfiguration(runtimeConfig) ); extensions.forEach((extension) => extension.configure(extensionConfiguration)); return Object.assign( runtimeConfig, resolveDefaultRuntimeConfig(extensionConfiguration), resolveHttpHandlerRuntimeConfig(extensionConfiguration), resolveHttpAuthRuntimeConfig(extensionConfiguration) ); }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/src/schemas/schemas_0.ts ================================================ const _CE = "ComplexError"; const _CNED = "ComplexNestedErrorData"; const _COD = "ClientOptionalDefaults"; const _D = "Defaults"; const _DSM = "DenseSetMap"; const _DSMe = "DenseStructMap"; const _EIO = "EmptyInputOutput"; const _ES = "EmptyStructure"; const _F = "Foo"; const _FO = "Float16Output"; const _FS = "FractionalSeconds"; const _FSO = "FractionalSecondsOutput"; const _Fl = "Float16"; const _GS = "GreetingStruct"; const _GWE = "GreetingWithErrors"; const _GWEO = "GreetingWithErrorsOutput"; const _IG = "InvalidGreeting"; const _M = "Message"; const _N = "Nested"; const _NIO = "NoInputOutput"; const _NSL = "NestedStringList"; const _OIO = "OptionalInputOutput"; const _OWD = "OperationWithDefaults"; const _OWDI = "OperationWithDefaultsInput"; const _OWDO = "OperationWithDefaultsOutput"; const _RS = "RecursiveShapes"; const _RSIO = "RecursiveShapesInputOutput"; const _RSION = "RecursiveShapesInputOutputNested1"; const _RSIONe = "RecursiveShapesInputOutputNested2"; const _RVCDM = "RpcV2CborDenseMaps"; const _RVCDMIO = "RpcV2CborDenseMapsInputOutput"; const _RVCL = "RpcV2CborLists"; const _RVCLIO = "RpcV2CborListInputOutput"; const _RVCSM = "RpcV2CborSparseMaps"; const _RVCSMIO = "RpcV2CborSparseMapsInputOutput"; const _SBM = "SparseBooleanMap"; const _SL = "StructureList"; const _SLM = "StructureListMember"; const _SNM = "SparseNumberMap"; const _SNO = "SparseNullsOperation"; const _SNOIO = "SparseNullsOperationInputOutput"; const _SS = "SimpleStructure"; const _SSL = "SparseStringList"; const _SSM = "SparseSetMap"; const _SSMp = "SparseStructMap"; const _SSMpa = "SparseStringMap"; const _SSP = "SimpleScalarProperties"; const _SSS = "SimpleScalarStructure"; const _TL = "TopLevel"; const _VE = "ValidationException"; const _VEF = "ValidationExceptionField"; const _VEFL = "ValidationExceptionFieldList"; const _a = "a"; const _b = "bar"; const _bL = "booleanList"; const _bLl = "blobList"; const _bV = "byteValue"; const _bVl = "blobValue"; const _b_ = "b"; const _c = "client"; const _cOD = "clientOptionalDefaults"; const _d = "datetime"; const _dB = "defaultBoolean"; const _dBM = "denseBooleanMap"; const _dBe = "defaultBlob"; const _dBef = "defaultByte"; const _dD = "defaultDouble"; const _dE = "defaultEnum"; const _dF = "defaultFloat"; const _dI = "defaultInteger"; const _dIE = "defaultIntEnum"; const _dL = "defaultList"; const _dLe = "defaultLong"; const _dM = "defaultMap"; const _dNM = "denseNumberMap"; const _dS = "defaultString"; const _dSM = "denseStructMap"; const _dSMe = "denseStringMap"; const _dSMen = "denseSetMap"; const _dSe = "defaultShort"; const _dT = "defaultTimestamp"; const _dV = "doubleValue"; const _de = "defaults"; const _e = "error"; const _eB = "emptyBlob"; const _eL = "enumList"; const _eS = "emptyString"; const _f = "foo"; const _fB = "falseBoolean"; const _fBV = "falseBooleanValue"; const _fL = "fieldList"; const _fV = "floatValue"; const _g = "greeting"; const _h = "hi"; const _iEL = "intEnumList"; const _iL = "integerList"; const _iV = "integerValue"; const _lV = "longValue"; const _m = "message"; const _me = "member"; const _n = "nested"; const _nSL = "nestedStringList"; const _oTLD = "otherTopLevelDefault"; const _p = "path"; const _rM = "recursiveMember"; const _s = "sparse"; const _sBM = "sparseBooleanMap"; const _sC = "smithy.ts.sdk.synthetic.smithy.protocoltests.rpcv2Cbor"; const _sL = "stringList"; const _sLt = "structureList"; const _sNM = "sparseNumberMap"; const _sS = "stringSet"; const _sSL = "sparseStringList"; const _sSM = "sparseStructMap"; const _sSMp = "sparseStringMap"; const _sSMpa = "sparseSetMap"; const _sV = "shortValue"; const _sVt = "stringValue"; const _tBV = "trueBooleanValue"; const _tL = "timestampList"; const _tLD = "topLevelDefault"; const _v = "value"; const _zB = "zeroByte"; const _zD = "zeroDouble"; const _zF = "zeroFloat"; const _zI = "zeroInteger"; const _zL = "zeroLong"; const _zS = "zeroShort"; const n0 = "smithy.framework"; const n1 = "smithy.protocoltests.rpcv2Cbor"; const n2 = "smithy.protocoltests.shared"; // smithy-typescript generated code import { TypeRegistry } from "@smithy/core/schema"; import type { StaticErrorSchema, StaticListSchema, StaticMapSchema, StaticOperationSchema, StaticStructureSchema, } from "@smithy/types"; import { ComplexError, InvalidGreeting, ValidationException } from "../models/errors"; import { RpcV2ProtocolServiceException } from "../models/RpcV2ProtocolServiceException"; /* eslint no-var: 0 */ const _sC_registry = TypeRegistry.for(_sC); export var RpcV2ProtocolServiceException$: StaticErrorSchema = [-3, _sC, "RpcV2ProtocolServiceException", 0, [], []]; _sC_registry.registerError(RpcV2ProtocolServiceException$, RpcV2ProtocolServiceException); const n0_registry = TypeRegistry.for(n0); const n1_registry = TypeRegistry.for(n1); export var ValidationException$: StaticErrorSchema = [-3, n0, _VE, { [_e]: _c }, [_m, _fL], [0, () => ValidationExceptionFieldList], 1 ]; n0_registry.registerError(ValidationException$, ValidationException); export var ComplexError$: StaticErrorSchema = [-3, n1, _CE, { [_e]: _c }, [_TL, _N], [0, () => ComplexNestedErrorData$] ]; n1_registry.registerError(ComplexError$, ComplexError); export var InvalidGreeting$: StaticErrorSchema = [-3, n1, _IG, { [_e]: _c }, [_M], [0] ]; n1_registry.registerError(InvalidGreeting$, InvalidGreeting); /** * TypeRegistry instances containing modeled errors. * @internal * */ export const errorTypeRegistries = [ _sC_registry, n0_registry, n1_registry, ] var __Unit = "unit" as const; export var ValidationExceptionField$: StaticStructureSchema = [3, n0, _VEF, 0, [_p, _m], [0, 0], 2 ]; export var ClientOptionalDefaults$: StaticStructureSchema = [3, n1, _COD, 0, [_me], [1] ]; export var ComplexNestedErrorData$: StaticStructureSchema = [3, n1, _CNED, 0, [_F], [0] ]; export var Defaults$: StaticStructureSchema = [3, n1, _D, 0, [_dS, _dB, _dL, _dT, _dBe, _dBef, _dSe, _dI, _dLe, _dF, _dD, _dM, _dE, _dIE, _eS, _fB, _eB, _zB, _zS, _zI, _zL, _zF, _zD], [0, 2, 64 | 0, 4, 21, 1, 1, 1, 1, 1, 1, 128 | 0, 0, 1, 0, 2, 21, 1, 1, 1, 1, 1, 1] ]; export var EmptyStructure$: StaticStructureSchema = [3, n1, _ES, 0, [], [] ]; export var Float16Output$: StaticStructureSchema = [3, n1, _FO, 0, [_v], [1] ]; export var FractionalSecondsOutput$: StaticStructureSchema = [3, n1, _FSO, 0, [_d], [5] ]; export var GreetingWithErrorsOutput$: StaticStructureSchema = [3, n1, _GWEO, 0, [_g], [0] ]; export var OperationWithDefaultsInput$: StaticStructureSchema = [3, n1, _OWDI, 0, [_de, _cOD, _tLD, _oTLD], [() => Defaults$, () => ClientOptionalDefaults$, 0, 1] ]; export var OperationWithDefaultsOutput$: StaticStructureSchema = [3, n1, _OWDO, 0, [_dS, _dB, _dL, _dT, _dBe, _dBef, _dSe, _dI, _dLe, _dF, _dD, _dM, _dE, _dIE, _eS, _fB, _eB, _zB, _zS, _zI, _zL, _zF, _zD], [0, 2, 64 | 0, 4, 21, 1, 1, 1, 1, 1, 1, 128 | 0, 0, 1, 0, 2, 21, 1, 1, 1, 1, 1, 1] ]; export var RecursiveShapesInputOutput$: StaticStructureSchema = [3, n1, _RSIO, 0, [_n], [() => RecursiveShapesInputOutputNested1$] ]; export var RecursiveShapesInputOutputNested1$: StaticStructureSchema = [3, n1, _RSION, 0, [_f, _n], [0, () => RecursiveShapesInputOutputNested2$] ]; export var RecursiveShapesInputOutputNested2$: StaticStructureSchema = [3, n1, _RSIONe, 0, [_b, _rM], [0, () => RecursiveShapesInputOutputNested1$] ]; export var RpcV2CborDenseMapsInputOutput$: StaticStructureSchema = [3, n1, _RVCDMIO, 0, [_dSM, _dNM, _dBM, _dSMe, _dSMen], [() => DenseStructMap, 128 | 1, 128 | 2, 128 | 0, [2, n1, _DSM, 0, 0, 64 | 0]] ]; export var RpcV2CborListInputOutput$: StaticStructureSchema = [3, n1, _RVCLIO, 0, [_sL, _sS, _iL, _bL, _tL, _eL, _iEL, _nSL, _sLt, _bLl], [64 | 0, 64 | 0, 64 | 1, 64 | 2, 64 | 4, 64 | 0, 64 | 1, [1, n2, _NSL, 0, 64 | 0], () => StructureList, 64 | 21] ]; export var RpcV2CborSparseMapsInputOutput$: StaticStructureSchema = [3, n1, _RVCSMIO, 0, [_sSM, _sNM, _sBM, _sSMp, _sSMpa], [[() => SparseStructMap, 0], [() => SparseNumberMap, 0], [() => SparseBooleanMap, 0], [() => SparseStringMap, 0], [() => SparseSetMap, 0]] ]; export var SimpleScalarStructure$: StaticStructureSchema = [3, n1, _SSS, 0, [_tBV, _fBV, _bV, _dV, _fV, _iV, _lV, _sV, _sVt, _bVl], [2, 2, 1, 1, 1, 1, 1, 1, 0, 21] ]; export var SimpleStructure$: StaticStructureSchema = [3, n1, _SS, 0, [_v], [0] ]; export var SparseNullsOperationInputOutput$: StaticStructureSchema = [3, n1, _SNOIO, 0, [_sSL, _sSMp], [[() => SparseStringList, 0], [() => SparseStringMap, 0]] ]; export var StructureListMember$: StaticStructureSchema = [3, n1, _SLM, 0, [_a, _b_], [0, 0] ]; export var GreetingStruct$: StaticStructureSchema = [3, n2, _GS, 0, [_h], [0] ]; var ValidationExceptionFieldList: StaticListSchema = [1, n0, _VEFL, 0, () => ValidationExceptionField$ ]; var StructureList: StaticListSchema = [1, n1, _SL, 0, () => StructureListMember$ ]; var TestStringList = 64 | 0; var BlobList = 64 | 21; var BooleanList = 64 | 2; var FooEnumList = 64 | 0; var IntegerEnumList = 64 | 1; var IntegerList = 64 | 1; var NestedStringList: StaticListSchema = [1, n2, _NSL, 0, 64 | 0 ]; var SparseStringList: StaticListSchema = [1, n2, _SSL, { [_s]: 1 }, 0 ]; var StringList = 64 | 0; var StringSet = 64 | 0; var TimestampList = 64 | 4; var DenseBooleanMap = 128 | 2; var DenseNumberMap = 128 | 1; var DenseSetMap: StaticMapSchema = [2, n1, _DSM, 0, 0, 64 | 0 ]; var DenseStringMap = 128 | 0; var DenseStructMap: StaticMapSchema = [2, n1, _DSMe, 0, 0, () => GreetingStruct$ ]; var SparseBooleanMap: StaticMapSchema = [2, n1, _SBM, { [_s]: 1 }, 0, 2 ]; var SparseNumberMap: StaticMapSchema = [2, n1, _SNM, { [_s]: 1 }, 0, 1 ]; var SparseSetMap: StaticMapSchema = [2, n1, _SSM, { [_s]: 1 }, 0, 64 | 0 ]; var SparseStructMap: StaticMapSchema = [2, n1, _SSMp, { [_s]: 1 }, 0, () => GreetingStruct$ ]; var TestStringMap = 128 | 0; var SparseStringMap: StaticMapSchema = [2, n2, _SSMpa, { [_s]: 1 }, 0, 0 ]; export var EmptyInputOutput$: StaticOperationSchema = [9, n1, _EIO, 0, () => EmptyStructure$, () => EmptyStructure$ ]; export var Float16$: StaticOperationSchema = [9, n1, _Fl, 0, () => __Unit, () => Float16Output$ ]; export var FractionalSeconds$: StaticOperationSchema = [9, n1, _FS, 0, () => __Unit, () => FractionalSecondsOutput$ ]; export var GreetingWithErrors$: StaticOperationSchema = [9, n1, _GWE, 2, () => __Unit, () => GreetingWithErrorsOutput$ ]; export var NoInputOutput$: StaticOperationSchema = [9, n1, _NIO, 0, () => __Unit, () => __Unit ]; export var OperationWithDefaults$: StaticOperationSchema = [9, n1, _OWD, 0, () => OperationWithDefaultsInput$, () => OperationWithDefaultsOutput$ ]; export var OptionalInputOutput$: StaticOperationSchema = [9, n1, _OIO, 0, () => SimpleStructure$, () => SimpleStructure$ ]; export var RecursiveShapes$: StaticOperationSchema = [9, n1, _RS, 0, () => RecursiveShapesInputOutput$, () => RecursiveShapesInputOutput$ ]; export var RpcV2CborDenseMaps$: StaticOperationSchema = [9, n1, _RVCDM, 0, () => RpcV2CborDenseMapsInputOutput$, () => RpcV2CborDenseMapsInputOutput$ ]; export var RpcV2CborLists$: StaticOperationSchema = [9, n1, _RVCL, 2, () => RpcV2CborListInputOutput$, () => RpcV2CborListInputOutput$ ]; export var RpcV2CborSparseMaps$: StaticOperationSchema = [9, n1, _RVCSM, 0, () => RpcV2CborSparseMapsInputOutput$, () => RpcV2CborSparseMapsInputOutput$ ]; export var SimpleScalarProperties$: StaticOperationSchema = [9, n1, _SSP, 0, () => SimpleScalarStructure$, () => SimpleScalarStructure$ ]; export var SparseNullsOperation$: StaticOperationSchema = [9, n1, _SNO, 0, () => SparseNullsOperationInputOutput$, () => SparseNullsOperationInputOutput$ ]; ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/functional/rpcv2cbor.spec.ts ================================================ // smithy-typescript generated code import { cbor } from "@smithy/core/cbor"; import { expect, test as it } from "vitest"; import { EmptyInputOutputCommand } from "../../src/commands/EmptyInputOutputCommand"; import { Float16Command } from "../../src/commands/Float16Command"; import { FractionalSecondsCommand } from "../../src/commands/FractionalSecondsCommand"; import { GreetingWithErrorsCommand } from "../../src/commands/GreetingWithErrorsCommand"; import { NoInputOutputCommand } from "../../src/commands/NoInputOutputCommand"; import { OperationWithDefaultsCommand } from "../../src/commands/OperationWithDefaultsCommand"; import { OptionalInputOutputCommand } from "../../src/commands/OptionalInputOutputCommand"; import { RecursiveShapesCommand } from "../../src/commands/RecursiveShapesCommand"; import { RpcV2CborDenseMapsCommand } from "../../src/commands/RpcV2CborDenseMapsCommand"; import { RpcV2CborListsCommand } from "../../src/commands/RpcV2CborListsCommand"; import { RpcV2CborSparseMapsCommand } from "../../src/commands/RpcV2CborSparseMapsCommand"; import { SimpleScalarPropertiesCommand } from "../../src/commands/SimpleScalarPropertiesCommand"; import { SparseNullsOperationCommand } from "../../src/commands/SparseNullsOperationCommand"; import { RpcV2ProtocolClient } from "../../src/RpcV2ProtocolClient"; import { Readable } from "node:stream"; import { HttpRequest, HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import type { Endpoint, HeaderBag, HttpHandlerOptions } from "@smithy/types"; /** * Throws an expected exception that contains the serialized request. */ class EXPECTED_REQUEST_SERIALIZATION_ERROR extends Error { constructor(readonly request: HttpRequest) { super(); } } /** * Throws an EXPECTED_REQUEST_SERIALIZATION_ERROR error before sending a * request. The thrown exception contains the serialized request. */ class RequestSerializationTestHandler implements HttpHandler { handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.reject(new EXPECTED_REQUEST_SERIALIZATION_ERROR(request)); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } /** * Returns a resolved Promise of the specified response contents. */ class ResponseDeserializationTestHandler implements HttpHandler { isSuccess: boolean; code: number; headers: HeaderBag; body: string | Uint8Array; isBase64Body: boolean; constructor(isSuccess: boolean, code: number, headers?: HeaderBag, body?: string) { this.isSuccess = isSuccess; this.code = code; if (headers === undefined) { this.headers = {}; } else { this.headers = headers; } if (body === undefined) { body = ""; } this.body = body; this.isBase64Body = String(body).length > 0 && Buffer.from(String(body), "base64").toString("base64") === body; } handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.resolve({ response: new HttpResponse({ statusCode: this.code, headers: this.headers, body: this.isBase64Body ? toBytes(this.body as string) : Readable.from([this.body]), }), }); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } interface comparableParts { [key: string]: string; } /** * Generates a standard map of un-equal values given input parts. */ const compareParts = (expectedParts: comparableParts, generatedParts: comparableParts) => { const unequalParts: any = {}; Object.keys(expectedParts).forEach((key) => { if (generatedParts[key] === undefined) { unequalParts[key] = { exp: expectedParts[key], gen: undefined }; } else if (!equivalentContents(expectedParts[key], generatedParts[key])) { unequalParts[key] = { exp: expectedParts[key], gen: generatedParts[key] }; } }); Object.keys(generatedParts).forEach((key) => { if (expectedParts[key] === undefined) { unequalParts[key] = { exp: undefined, gen: generatedParts[key] }; } }); if (Object.keys(unequalParts).length !== 0) { return unequalParts; } return undefined; }; /** * Compares all types for equivalent contents, doing nested * equality checks based on non-`$metadata` * properties that have defined values. */ const equivalentContents = (expected: any, generated: any): boolean => { if (typeof (global as any).expect === "function") { expect(normalizeByteArrayType(generated)).toEqual(normalizeByteArrayType(expected)); return true; } let localExpected = expected; // Short circuit on equality. if (localExpected == generated) { return true; } if (typeof expected !== "object") { return expected === generated; } // If a test fails with an issue in the below 6 lines, it's likely // due to an issue in the nestedness or existence of the property // being compared. delete localExpected["$metadata"]; delete generated["$metadata"]; Object.keys(localExpected).forEach((key) => localExpected[key] === undefined && delete localExpected[key]); Object.keys(generated).forEach((key) => generated[key] === undefined && delete generated[key]); const expectedProperties = Object.getOwnPropertyNames(localExpected); const generatedProperties = Object.getOwnPropertyNames(generated); // Short circuit on different property counts. if (expectedProperties.length != generatedProperties.length) { return false; } // Compare properties directly. for (var index = 0; index < expectedProperties.length; index++) { const propertyName = expectedProperties[index]; if (!equivalentContents(localExpected[propertyName], generated[propertyName])) { return false; } } return true; }; const clientParams = { region: "us-west-2", credentials: { accessKeyId: "key", secretAccessKey: "secret" }, apiKey: { apiKey: "apiKey" }, endpoint: { url: new URL("https://localhost/"), headers: { "x-default-header": ["default-header-value"], }, }, }; /** * A wrapper function that shadows `fail` from jest-jasmine2 * (jasmine2 was replaced with circus in > v27 as the default test runner) */ const fail = (error?: any): never => { throw new Error(error); }; /** * Hexadecimal to byteArray. */ const toBytes = (hex: string) => { return Buffer.from(hex, "base64"); }; function normalizeByteArrayType(data: any) { // normalize float32 errors if (typeof data === "number") { const u = new Uint8Array(4); const dv = new DataView(u.buffer, u.byteOffset, u.byteLength); dv.setFloat32(0, data); return dv.getFloat32(0); } if (!data || typeof data !== "object") { return data; } if (data instanceof Uint8Array) { return Uint8Array.from(data); } if (data instanceof String || data instanceof Boolean || data instanceof Number) { return data.valueOf(); } const output = {} as any; for (const key of Object.getOwnPropertyNames(data)) { output[key] = normalizeByteArrayType(data[key]); } return output; } /** * When Input structure is empty we write CBOR equivalent of {} */ it("empty_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new EmptyInputOutputCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/EmptyInputOutput"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * When output structure is empty we write CBOR equivalent of {} */ it("empty_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new EmptyInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * When output structure is empty the client should accept an empty body */ it("empty_output_no_body:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `` ), }); const params: any = {}; const command = new EmptyInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Ensures that clients can correctly parse float16 +Inf. */ it("RpcV2CborFloat16Inf:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl8AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 -Inf. */ it("RpcV2CborFloat16NegInf:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfn8AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: -Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 NaN with high LSB. */ it("RpcV2CborFloat16LSBNaN:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl8AQ==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse float16 NaN with high MSB. */ it("RpcV2CborFloat16MSBNaN:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1Zfl+AA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse a subnormal float16. */ it("RpcV2CborFloat16Subnormal:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWV2YWx1ZfkAUA==` ), }); const params: any = {}; const command = new Float16Command(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { value: 4.76837158203125E-6, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensures that clients can correctly parse timestamps with fractional seconds */ it("RpcV2CborDateTimeWithFractionalSeconds:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2hkYXRldGltZcH7Qcw32zgPvnf/` ), }); const params: any = {}; const command = new FractionalSecondsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { datetime: new Date(9.46845296123E8 * 1000), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Parses simple RpcV2 Cbor errors */ it.skip("RpcV2CborInvalidGreetingError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4LnNtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNJbnZhbGlkR3JlZXRpbmdnTWVzc2FnZWJIaf8=` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "InvalidGreeting") { console.log(err); fail(`Expected a InvalidGreeting to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); const paramsToValidate: any = [ { message: "Hi", }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); return; } fail("Expected an exception to be thrown from response"); }); /** * Parses a complex error with no message member */ it.skip("RpcV2CborComplexError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4K3NtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNDb21wbGV4RXJyb3JoVG9wTGV2ZWxpVG9wIGxldmVsZk5lc3RlZL9jRm9vY2Jhcv//` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "ComplexError") { console.log(err); fail(`Expected a ComplexError to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); const paramsToValidate: any = [ { TopLevel: "Top level", Nested: { Foo: "bar", }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); return; } fail("Expected an exception to be thrown from response"); }); it.skip("RpcV2CborEmptyComplexError:Error:GreetingWithErrors", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( false, 400, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZfX3R5cGV4K3NtaXRoeS5wcm90b2NvbHRlc3RzLnJwY3YyQ2JvciNDb21wbGV4RXJyb3L/` ), }); const params: any = {}; const command = new GreetingWithErrorsCommand(params); try { await client.send(command); } catch (err) { if (err.name !== "ComplexError") { console.log(err); fail(`Expected a ComplexError to be thrown, got ${err.name} instead`); return; } const r: any = err; expect(r.$metadata.httpStatusCode).toBe(400); return; } fail("Expected an exception to be thrown from response"); }); /** * Body is empty and no Content-Type header if no input */ it("no_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new NoInputOutputCommand({}); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/NoInputOutput"); expect( r.headers["content-type"], `Header key "content-type" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(!r.body || r.body === `{}`).toBeTruthy(); } }); /** * A `Content-Type` header should not be set if the response body is empty. */ it("no_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", }, `` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Clients should accept a CBOR empty struct if there is no output. */ it("NoOutputClientAllowsEmptyCbor:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Clients should accept an empty body if there is no output and * should not raise an error if the `Content-Type` header is set. */ it("NoOutputClientAllowsEmptyBody:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `` ), }); const params: any = {}; const command = new NoInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Client populates default values in input. */ it.skip("RpcV2CborClientPopulatesDefaultValuesInInput:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { defaults: { } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2hkZWZhdWx0c79tZGVmYXVsdFN0cmluZ2JoaW5kZWZhdWx0Qm9vbGVhbvVrZGVmYXVsdExpc3Sf/3BkZWZhdWx0VGltZXN0YW1wwQBrZGVmYXVsdEJsb2JDYWJja2RlZmF1bHRCeXRlAWxkZWZhdWx0U2hvcnQBbmRlZmF1bHRJbnRlZ2VyCmtkZWZhdWx0TG9uZxhkbGRlZmF1bHRGbG9hdPo/gAAAbWRlZmF1bHREb3VibGX6P4AAAGpkZWZhdWx0TWFwv/9rZGVmYXVsdEVudW1jRk9PbmRlZmF1bHRJbnRFbnVtAWtlbXB0eVN0cmluZ2BsZmFsc2VCb29sZWFu9GllbXB0eUJsb2JAaHplcm9CeXRlAGl6ZXJvU2hvcnQAa3plcm9JbnRlZ2VyAGh6ZXJvTG9uZwBpemVyb0Zsb2F0+gAAAABqemVyb0RvdWJsZfoAAAAA//8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client skips top level default values in input. */ it.skip("RpcV2CborClientSkipsTopLevelDefaultValuesInInput:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client uses explicitly provided member values over defaults */ it.skip("RpcV2CborClientUsesExplicitlyProvidedMemberValuesOverDefaults:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { defaults: { defaultString: "bye", defaultBoolean: true, defaultList: [ "a", ], defaultTimestamp: new Date(1000), defaultBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), defaultByte: 2, defaultShort: 2, defaultInteger: 20, defaultLong: 200, defaultFloat: 2.0, defaultDouble: 2.0, defaultMap: { name: "Jack", } as any, defaultEnum: "BAR", defaultIntEnum: 2, emptyString: "foo", falseBoolean: true, emptyBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), zeroByte: 1, zeroShort: 1, zeroInteger: 1, zeroLong: 1, zeroFloat: 1.0, zeroDouble: 1.0, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2hkZWZhdWx0c7dtZGVmYXVsdFN0cmluZ2NieWVuZGVmYXVsdEJvb2xlYW71a2RlZmF1bHRMaXN0gWFhcGRlZmF1bHRUaW1lc3RhbXDB+z/wAAAAAAAAa2RlZmF1bHRCbG9iQmhpa2RlZmF1bHRCeXRlAmxkZWZhdWx0U2hvcnQCbmRlZmF1bHRJbnRlZ2VyFGtkZWZhdWx0TG9uZxjIbGRlZmF1bHRGbG9hdPpAAAAAbWRlZmF1bHREb3VibGX7QAAAAAAAAABqZGVmYXVsdE1hcKFkbmFtZWRKYWNra2RlZmF1bHRFbnVtY0JBUm5kZWZhdWx0SW50RW51bQJrZW1wdHlTdHJpbmdjZm9vbGZhbHNlQm9vbGVhbvVpZW1wdHlCbG9iQmhpaHplcm9CeXRlAWl6ZXJvU2hvcnQBa3plcm9JbnRlZ2VyAWh6ZXJvTG9uZwFpemVyb0Zsb2F0+j+AAABqemVyb0RvdWJsZfs/8AAAAAAAAP8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Any time a value is provided for a member in the top level of input, it is used, regardless of if its the default. */ it.skip("RpcV2CborClientUsesExplicitlyProvidedValuesInTopLevel:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { topLevelDefault: "hi", otherTopLevelDefault: 0, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v290b3BMZXZlbERlZmF1bHRiaGl0b3RoZXJUb3BMZXZlbERlZmF1bHQA/w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Typically, non top-level members would have defaults filled in, but if they have the clientOptional trait, the defaults should be ignored. */ it.skip("RpcV2CborClientIgnoresNonTopLevelDefaultsOnMembersWithClientOptional:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OperationWithDefaultsCommand( { clientOptionalDefaults: { } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OperationWithDefaults"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3ZjbGllbnRPcHRpb25hbERlZmF1bHRzoP8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Client populates default values when missing in response. */ it.skip("RpcV2CborClientPopulatesDefaultsValuesWhenMissingInResponse:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new OperationWithDefaultsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { defaultString: "hi", defaultBoolean: true, defaultList: [ ], defaultTimestamp: new Date(0 * 1000), defaultBlob: Uint8Array.from("abc", (c) => c.charCodeAt(0)), defaultByte: 1, defaultShort: 1, defaultInteger: 10, defaultLong: 100, defaultFloat: 1.0, defaultDouble: 1.0, defaultMap: { }, defaultEnum: "FOO", defaultIntEnum: 1, emptyString: "", falseBoolean: false, emptyBlob: Uint8Array.from("", (c) => c.charCodeAt(0)), zeroByte: 0, zeroShort: 0, zeroInteger: 0, zeroLong: 0, zeroFloat: 0.0, zeroDouble: 0.0, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Client ignores default values if member values are present in the response. */ it.skip("RpcV2CborClientIgnoresDefaultValuesIfMemberValuesArePresentInResponse:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v21kZWZhdWx0U3RyaW5nY2J5ZW5kZWZhdWx0Qm9vbGVhbvRrZGVmYXVsdExpc3SBYWFwZGVmYXVsdFRpbWVzdGFtcMH7QAAAAAAAAABrZGVmYXVsdEJsb2JCaGlrZGVmYXVsdEJ5dGUCbGRlZmF1bHRTaG9ydAJuZGVmYXVsdEludGVnZXIUa2RlZmF1bHRMb25nGMhsZGVmYXVsdEZsb2F0+kAAAABtZGVmYXVsdERvdWJsZftAAAAAAAAAAGpkZWZhdWx0TWFwoWRuYW1lZEphY2trZGVmYXVsdEVudW1jQkFSbmRlZmF1bHRJbnRFbnVtAmtlbXB0eVN0cmluZ2Nmb29sZmFsc2VCb29sZWFu9WllbXB0eUJsb2JCaGloemVyb0J5dGUBaXplcm9TaG9ydAFremVyb0ludGVnZXIBaHplcm9Mb25nAWl6ZXJvRmxvYXT6P4AAAGp6ZXJvRG91Ymxl+z/wAAAAAAAA/w==` ), }); const params: any = {}; const command = new OperationWithDefaultsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { defaultString: "bye", defaultBoolean: false, defaultList: [ "a", ], defaultTimestamp: new Date(2 * 1000), defaultBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), defaultByte: 2, defaultShort: 2, defaultInteger: 20, defaultLong: 200, defaultFloat: 2.0, defaultDouble: 2.0, defaultMap: { name: "Jack", }, defaultEnum: "BAR", defaultIntEnum: 2, emptyString: "foo", falseBoolean: true, emptyBlob: Uint8Array.from("hi", (c) => c.charCodeAt(0)), zeroByte: 1, zeroShort: 1, zeroInteger: 1, zeroLong: 1, zeroFloat: 1.0, zeroDouble: 1.0, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * When input is empty we write CBOR equivalent of {} */ it("optional_input:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new OptionalInputOutputCommand( { } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/OptionalInputOutput"); expect( r.headers["x-amz-target"], `Header key "x-amz-target" should have been undefined in ${JSON.stringify(r.headers)}` ).toBeUndefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * When output is empty we write CBOR equivalent of {} */ it("optional_output:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v/8=` ), }); const params: any = {}; const command = new OptionalInputOutputCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Serializes recursive structures */ it("RpcV2CborRecursiveShapes:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RecursiveShapesCommand( { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", } as any, } as any, } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RecursiveShapes"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2ZuZXN0ZWS/Y2Zvb2RGb28xZm5lc3RlZL9jYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyv2Nmb29kRm9vMmZuZXN0ZWS/Y2JhcmRCYXIy//////8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes recursive structures */ it("RpcV2CborRecursiveShapes:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2ZuZXN0ZWS/Y2Zvb2RGb28xZm5lc3RlZL9jYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyv2Nmb29kRm9vMmZuZXN0ZWS/Y2JhcmRCYXIy//////8=` ), }); const params: any = {}; const command = new RecursiveShapesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", }, }, }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes recursive structures encoded using a map with definite length */ it("RpcV2CborRecursiveShapesUsingDefiniteLength:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWZuZXN0ZWSiY2Zvb2RGb28xZm5lc3RlZKJjYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyomNmb29kRm9vMmZuZXN0ZWShY2JhcmRCYXIy` ), }); const params: any = {}; const command = new RecursiveShapesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { nested: { foo: "Foo1", nested: { bar: "Bar1", recursiveMember: { foo: "Foo2", nested: { bar: "Bar2", }, }, }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes maps */ it("RpcV2CborMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseStructMap: { foo: { hi: "there", } as any, baz: { hi: "bye", } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oW5kZW5zZVN0cnVjdE1hcKJjZm9voWJoaWV0aGVyZWNiYXqhYmhpY2J5ZQ==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborSerializesZeroValuesInMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseNumberMap: { x: 0, } as any, denseBooleanMap: { x: false, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `om5kZW5zZU51bWJlck1hcKFheABvZGVuc2VCb29sZWFuTWFwoWF49A==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a dense map of sets. */ it("RpcV2CborSerializesDenseSetMap:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborDenseMapsCommand( { denseSetMap: { x: [ ], y: [ "a", "b", ], } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborDenseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oWtkZW5zZVNldE1hcKJheIBheYJhYWFi`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes maps */ it("RpcV2CborMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oW5kZW5zZVN0cnVjdE1hcKJjZm9voWJoaWV0aGVyZWNiYXqhYmhpY2J5ZQ==` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseStructMap: { foo: { hi: "there", }, baz: { hi: "bye", }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborDeserializesZeroValuesInMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `om5kZW5zZU51bWJlck1hcKFheABvZGVuc2VCb29sZWFuTWFwoWF49A==` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseNumberMap: { x: 0, }, denseBooleanMap: { x: false, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a dense map of sets */ it("RpcV2CborDeserializesDenseSetMap:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWtkZW5zZVNldE1hcKJheIBheYJhYWFi` ), }); const params: any = {}; const command = new RpcV2CborDenseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { denseSetMap: { x: [ ], y: [ "a", "b", ], }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes RpcV2 Cbor lists */ it("RpcV2CborLists:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ "foo", "bar", ], stringSet: [ "foo", "bar", ], integerList: [ 1, 2, ], booleanList: [ true, false, ], timestampList: [ new Date(1398796238000), new Date(1398796238000), ], enumList: [ "Foo", "0", ], intEnumList: [ 1, 2, ], nestedStringList: [ [ "foo", "bar", ], [ "baz", "qux", ], ], structureList: [ { a: "1", b: "2", } as any, { a: "3", b: "4", } as any, ], blobList: [ Uint8Array.from("foo", (c) => c.charCodeAt(0)), Uint8Array.from("bar", (c) => c.charCodeAt(0)), ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2pzdHJpbmdMaXN0gmNmb29jYmFyaXN0cmluZ1NldIJjZm9vY2JhcmtpbnRlZ2VyTGlzdIIBAmtib29sZWFuTGlzdIL19G10aW1lc3RhbXBMaXN0gsH7QdTX+/OAAADB+0HU1/vzgAAAaGVudW1MaXN0gmNGb29hMGtpbnRFbnVtTGlzdIIBAnBuZXN0ZWRTdHJpbmdMaXN0goJjZm9vY2JhcoJjYmF6Y3F1eG1zdHJ1Y3R1cmVMaXN0gqJhYWExYWJhMqJhYWEzYWJhNGhibG9iTGlzdIJDZm9vQ2Jhcv8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes empty JSON lists */ it("RpcV2CborListsEmpty:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2pzdHJpbmdMaXN0n///`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes empty JSON definite length lists */ it("RpcV2CborListsEmptyUsingDefiniteLength:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborListsCommand( { stringList: [ ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborLists"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `oWpzdHJpbmdMaXN0gA==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes RpcV2 Cbor lists */ it("RpcV2CborLists:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n2Nmb29jYmFy/2lzdHJpbmdTZXSfY2Zvb2NiYXL/a2ludGVnZXJMaXN0nwEC/2tib29sZWFuTGlzdJ/19P9tdGltZXN0YW1wTGlzdJ/B+0HU1/vzgAAAwftB1Nf784AAAP9oZW51bUxpc3SfY0Zvb2Ew/2tpbnRFbnVtTGlzdJ8BAv9wbmVzdGVkU3RyaW5nTGlzdJ+fY2Zvb2NiYXL/n2NiYXpjcXV4//9tc3RydWN0dXJlTGlzdJ+/YWFhMWFiYTL/v2FhYTNhYmE0//9oYmxvYkxpc3SfQ2Zvb0NiYXL//w==` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "foo", "bar", ], stringSet: [ "foo", "bar", ], integerList: [ 1, 2, ], booleanList: [ true, false, ], timestampList: [ new Date(1398796238 * 1000), new Date(1398796238 * 1000), ], enumList: [ "Foo", "0", ], intEnumList: [ 1, 2, ], nestedStringList: [ [ "foo", "bar", ], [ "baz", "qux", ], ], structureList: [ { a: "1", b: "2", }, { a: "3", b: "4", }, ], blobList: [ Uint8Array.from("foo", (c) => c.charCodeAt(0)), Uint8Array.from("bar", (c) => c.charCodeAt(0)), ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes empty RpcV2 Cbor lists */ it("RpcV2CborListsEmpty:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n///` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Can deserialize indefinite length text strings inside an indefinite length list */ it("RpcV2CborIndefiniteStringInsideIndefiniteListCanDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2pzdHJpbmdMaXN0n394HUFuIGV4YW1wbGUgaW5kZWZpbml0ZSBzdHJpbmcsdyB3aGljaCB3aWxsIGJlIGNodW5rZWQsbiBvbiBlYWNoIGNvbW1h/394NUFub3RoZXIgZXhhbXBsZSBpbmRlZmluaXRlIHN0cmluZyB3aXRoIG9ubHkgb25lIGNodW5r/3ZUaGlzIGlzIGEgcGxhaW4gc3RyaW5n//8=` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "An example indefinite string, which will be chunked, on each comma", "Another example indefinite string with only one chunk", "This is a plain string", ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Can deserialize indefinite length text strings inside a definite length list */ it("RpcV2CborIndefiniteStringInsideDefiniteListCanDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `oWpzdHJpbmdMaXN0g394HUFuIGV4YW1wbGUgaW5kZWZpbml0ZSBzdHJpbmcsdyB3aGljaCB3aWxsIGJlIGNodW5rZWQsbiBvbiBlYWNoIGNvbW1h/394NUFub3RoZXIgZXhhbXBsZSBpbmRlZmluaXRlIHN0cmluZyB3aXRoIG9ubHkgb25lIGNodW5r/3ZUaGlzIGlzIGEgcGxhaW4gc3RyaW5n` ), }); const params: any = {}; const command = new RpcV2CborListsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { stringList: [ "An example indefinite string, which will be chunked, on each comma", "Another example indefinite string with only one chunk", "This is a plain string", ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes sparse maps */ it("RpcV2CborSparseMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseStructMap: { foo: { hi: "there", } as any, baz: { hi: "bye", } as any, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VTdHJ1Y3RNYXC/Y2Zvb79iaGlldGhlcmX/Y2Jher9iaGljYnll////`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes null map values in sparse maps */ it("RpcV2CborSerializesNullMapValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseBooleanMap: { x: null, } as any, sparseNumberMap: { x: null, } as any, sparseStringMap: { x: null, } as any, sparseStructMap: { x: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3BzcGFyc2VCb29sZWFuTWFwv2F49v9vc3BhcnNlTnVtYmVyTWFwv2F49v9vc3BhcnNlU3RyaW5nTWFwv2F49v9vc3BhcnNlU3RydWN0TWFwv2F49v//`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a sparse map of sets */ it("RpcV2CborSerializesSparseSetMap:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseSetMap: { x: [ ], y: [ "a", "b", ], } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL///8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * A request that contains a sparse map of sets. */ it("RpcV2CborSerializesSparseSetMapAndRetainsNull:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseSetMap: { x: [ ], y: [ "a", "b", ], z: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL/YXr2//8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborSerializesZeroValuesInSparseMaps:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new RpcV2CborSparseMapsCommand( { sparseNumberMap: { x: 0, } as any, sparseBooleanMap: { x: false, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/RpcV2CborSparseMaps"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VOdW1iZXJNYXC/YXgA/3BzcGFyc2VCb29sZWFuTWFwv2F49P//`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes sparse maps */ it("RpcV2CborSparseJsonMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VTdHJ1Y3RNYXC/Y2Zvb79iaGlldGhlcmX/Y2Jher9iaGljYnll////` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStructMap: { foo: { hi: "there", }, baz: { hi: "bye", }, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes null map values */ it("RpcV2CborDeserializesNullMapValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3BzcGFyc2VCb29sZWFuTWFwv2F49v9vc3BhcnNlTnVtYmVyTWFwv2F49v9vc3BhcnNlU3RyaW5nTWFwv2F49v9vc3BhcnNlU3RydWN0TWFwv2F49v//` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseBooleanMap: { x: null, }, sparseNumberMap: { x: null, }, sparseStringMap: { x: null, }, sparseStructMap: { x: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a sparse map of sets */ it("RpcV2CborDeserializesSparseSetMap:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2xzcGFyc2VTZXRNYXC/YXmfYWFhYv9heJ////8=` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseSetMap: { x: [ ], y: [ "a", "b", ], }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * A response that contains a sparse map of sets with a null */ it("RpcV2CborDeserializesSparseSetMapAndRetainsNull:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2xzcGFyc2VTZXRNYXC/YXif/2F5n2FhYWL/YXr2//8=` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseSetMap: { x: [ ], y: [ "a", "b", ], z: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Ensure that 0 and false are sent over the wire in all maps and lists */ it("RpcV2CborDeserializesZeroValuesInSparseMaps:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VOdW1iZXJNYXC/YXgA/3BzcGFyc2VCb29sZWFuTWFwv2F49P//` ), }); const params: any = {}; const command = new RpcV2CborSparseMapsCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseNumberMap: { x: 0, }, sparseBooleanMap: { x: false, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes simple scalar properties */ it("RpcV2CborSimpleScalarProperties:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { byteValue: 5, doubleValue: 1.889, falseBooleanValue: false, floatValue: 7.625, integerValue: 256, longValue: 9873, shortValue: 9898, stringValue: "simple", trueBooleanValue: true, blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2lieXRlVmFsdWUFa2RvdWJsZVZhbHVl+z/+OVgQYk3TcWZhbHNlQm9vbGVhblZhbHVl9GpmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAaWxvbmdWYWx1ZRkmkWpzaG9ydFZhbHVlGSaqa3N0cmluZ1ZhbHVlZnNpbXBsZXB0cnVlQm9vbGVhblZhbHVl9WlibG9iVmFsdWVDZm9v/w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * RpcV2 Cbor should not serialize null structure values */ it("RpcV2CborClientDoesntSerializeNullStructureValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { stringValue: null, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v/8=`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling NaN float values. */ it("RpcV2CborSupportsNaNFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: NaN, floatValue: NaN, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zft/+AAAAAAAAGpmbG9hdFZhbHVl+n/AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsInfinityFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: Infinity, floatValue: Infinity, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zft/8AAAAAAAAGpmbG9hdFZhbHVl+n+AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsNegativeInfinityFloatInputs:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SimpleScalarPropertiesCommand( { doubleValue: -Infinity, floatValue: -Infinity, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SimpleScalarProperties"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v2tkb3VibGVWYWx1Zfv/8AAAAAAAAGpmbG9hdFZhbHVl+v+AAAD/`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes simple scalar properties */ it("RpcV2CborSimpleScalarProperties:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3B0cnVlQm9vbGVhblZhbHVl9XFmYWxzZUJvb2xlYW5WYWx1ZfRpYnl0ZVZhbHVlBWtkb3VibGVWYWx1Zfs//jlYEGJN02pmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAanNob3J0VmFsdWUZJqprc3RyaW5nVmFsdWVmc2ltcGxlaWJsb2JWYWx1ZUNmb2//` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { trueBooleanValue: true, falseBooleanValue: false, byteValue: 5, doubleValue: 1.889, floatValue: 7.625, integerValue: 256, shortValue: 9898, stringValue: "simple", blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes simple scalar properties encoded using a map with definite length */ it("RpcV2CborSimpleScalarPropertiesUsingDefiniteLength:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `qXB0cnVlQm9vbGVhblZhbHVl9XFmYWxzZUJvb2xlYW5WYWx1ZfRpYnl0ZVZhbHVlBWtkb3VibGVWYWx1Zfs//jlYEGJN02pmbG9hdFZhbHVl+kD0AABsaW50ZWdlclZhbHVlGQEAanNob3J0VmFsdWUZJqprc3RyaW5nVmFsdWVmc2ltcGxlaWJsb2JWYWx1ZUNmb28=` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { trueBooleanValue: true, falseBooleanValue: false, byteValue: 5, doubleValue: 1.889, floatValue: 7.625, integerValue: 256, shortValue: 9898, stringValue: "simple", blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * RpcV2 Cbor should not deserialize null structure values */ it("RpcV2CborClientDoesntDeserializeNullStructureValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tzdHJpbmdWYWx1Zfb/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); }); /** * Supports handling NaN float values. */ it("RpcV2CborSupportsNaNFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zft/+AAAAAAAAGpmbG9hdFZhbHVl+n/AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: NaN, floatValue: NaN, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports handling Infinity float values. */ it("RpcV2CborSupportsInfinityFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zft/8AAAAAAAAGpmbG9hdFZhbHVl+n+AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: Infinity, floatValue: Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports handling Negative Infinity float values. */ it("RpcV2CborSupportsNegativeInfinityFloatOutputs:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zfv/8AAAAAAAAGpmbG9hdFZhbHVl+v+AAAD/` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: -Infinity, floatValue: -Infinity, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Supports upcasting from a smaller byte representation of the same data type. */ it("RpcV2CborSupportsUpcastingDataOnDeserialize:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2tkb3VibGVWYWx1Zfk+AGpmbG9hdFZhbHVl+UegbGludGVnZXJWYWx1ZRg4aWxvbmdWYWx1ZRkBAGpzaG9ydFZhbHVlCv8=` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { doubleValue: 1.5, floatValue: 7.625, integerValue: 56, longValue: 256, shortValue: 10, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * The client should skip over additional fields that are not part of the structure. This allows a * client generated against an older Smithy model to be able to communicate with a server that is * generated against a newer Smithy model. */ it("RpcV2CborExtraFieldsInTheBodyShouldBeSkippedByClients:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v2lieXRlVmFsdWUFa2RvdWJsZVZhbHVl+z/+OVgQYk3TcWZhbHNlQm9vbGVhblZhbHVl9GpmbG9hdFZhbHVl+kD0AABrZXh0cmFPYmplY3S/c2luZGVmaW5pdGVMZW5ndGhNYXC/a3dpdGhBbkFycmF5nwECA///cWRlZmluaXRlTGVuZ3RoTWFwo3J3aXRoQURlZmluaXRlQXJyYXmDAQIDeB1hbmRTb21lSW5kZWZpbml0ZUxlbmd0aFN0cmluZ3gfdGhhdCBoYXMsIGJlZW4gY2h1bmtlZCBvbiBjb21tYWxub3JtYWxTdHJpbmdjZm9vanNob3J0VmFsdWUZJw9uc29tZU90aGVyRmllbGR2dGhpcyBzaG91bGQgYmUgc2tpcHBlZP9saW50ZWdlclZhbHVlGQEAaWxvbmdWYWx1ZRkmkWpzaG9ydFZhbHVlGSaqa3N0cmluZ1ZhbHVlZnNpbXBsZXB0cnVlQm9vbGVhblZhbHVl9WlibG9iVmFsdWVDZm9v/w==` ), }); const params: any = {}; const command = new SimpleScalarPropertiesCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { byteValue: 5, doubleValue: 1.889, falseBooleanValue: false, floatValue: 7.625, integerValue: 256, longValue: 9873, shortValue: 9898, stringValue: "simple", trueBooleanValue: true, blobValue: Uint8Array.from("foo", (c) => c.charCodeAt(0)), }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Serializes null values in maps */ it("RpcV2CborSparseMapsSerializeNullValues:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SparseNullsOperationCommand( { sparseStringMap: { foo: null, } as any, } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SparseNullsOperation"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v29zcGFyc2VTdHJpbmdNYXC/Y2Zvb/b//w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Serializes null values in lists */ it("RpcV2CborSparseListsSerializeNull:Request", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new RequestSerializationTestHandler(), }); const command = new SparseNullsOperationCommand( { sparseStringList: [ null, ], } as any, ); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; expect(r.method).toBe("POST"); expect(r.path).toBe("/service/RpcV2Protocol/operation/SparseNullsOperation"); expect( r.headers["content-length"], `Header key "content-length" should have been defined in ${JSON.stringify(r.headers)}` ).toBeDefined(); expect(r.headers["accept"]).toBe("application/cbor"); expect(r.headers["content-type"]).toBe("application/cbor"); expect(r.headers["smithy-protocol"]).toBe("rpc-v2-cbor"); expect(r.body, `Body was undefined.`).toBeDefined(); const bodyString = `v3BzcGFyc2VTdHJpbmdMaXN0n/b//w==`; const unequalParts: any = compareEquivalentCborBodies(bodyString, r.body); expect(unequalParts).toBeUndefined(); } }); /** * Deserializes null values in maps */ it("RpcV2CborSparseMapsDeserializeNullValues:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v29zcGFyc2VTdHJpbmdNYXC/Y2Zvb/b//w==` ), }); const params: any = {}; const command = new SparseNullsOperationCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStringMap: { foo: null, }, }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); /** * Deserializes null values in lists */ it("RpcV2CborSparseListsDeserializeNull:Response", async () => { const client = new RpcV2ProtocolClient({ ...clientParams, requestHandler: new ResponseDeserializationTestHandler( true, 200, { "smithy-protocol": "rpc-v2-cbor", "content-type": "application/cbor", }, `v3BzcGFyc2VTdHJpbmdMaXN0n/b//w==` ), }); const params: any = {}; const command = new SparseNullsOperationCommand(params); let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } expect(r.$metadata.httpStatusCode).toBe(200); const paramsToValidate: any = [ { sparseStringList: [ null, ], }, ][0]; Object.keys(paramsToValidate).forEach((param) => { expect( r[param], `The output field ${param} should have been defined in ${JSON.stringify(r, null, 2)}` ).toBeDefined(); expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true); }); }); const compareEquivalentCborBodies = (expectedBody: string, generatedBody: string | Uint8Array): undefined => { expect( normalizeByteArrayType(cbor.deserialize(typeof generatedBody === "string" ? toBytes(generatedBody) : generatedBody)) ).toEqual(normalizeByteArrayType(cbor.deserialize(toBytes(expectedBody)))); return undefined; }; ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/index-objects.spec.mjs ================================================ import { ClientOptionalDefaults$, ComplexError, ComplexError$, ComplexNestedErrorData$, Defaults$, EmptyInputOutput$, EmptyInputOutputCommand, EmptyStructure$, Float16$, Float16Command, Float16Output$, FooEnum, FractionalSeconds$, FractionalSecondsCommand, FractionalSecondsOutput$, GreetingStruct$, GreetingWithErrors$, GreetingWithErrorsCommand, GreetingWithErrorsOutput$, IntegerEnum, InvalidGreeting, InvalidGreeting$, NoInputOutput$, NoInputOutputCommand, OperationWithDefaults$, OperationWithDefaultsCommand, OperationWithDefaultsInput$, OperationWithDefaultsOutput$, OptionalInputOutput$, OptionalInputOutputCommand, RecursiveShapes$, RecursiveShapesCommand, RecursiveShapesInputOutput$, RecursiveShapesInputOutputNested1$, RecursiveShapesInputOutputNested2$, RpcV2CborDenseMaps$, RpcV2CborDenseMapsCommand, RpcV2CborDenseMapsInputOutput$, RpcV2CborListInputOutput$, RpcV2CborLists$, RpcV2CborListsCommand, RpcV2CborSparseMaps$, RpcV2CborSparseMapsCommand, RpcV2CborSparseMapsInputOutput$, RpcV2Protocol, RpcV2ProtocolClient, RpcV2ProtocolServiceException, SimpleScalarProperties$, SimpleScalarPropertiesCommand, SimpleScalarStructure$, SimpleStructure$, SparseNullsOperation$, SparseNullsOperationCommand, SparseNullsOperationInputOutput$, StructureListMember$, TestEnum, TestIntEnum, ValidationException, ValidationException$, ValidationExceptionField$, } from "../dist-cjs/index.js"; import assert from "node:assert"; // clients assert(typeof RpcV2ProtocolClient === "function"); assert(typeof RpcV2Protocol === "function"); // commands assert(typeof EmptyInputOutputCommand === "function"); assert(typeof EmptyInputOutput$ === "object"); assert(typeof Float16Command === "function"); assert(typeof Float16$ === "object"); assert(typeof FractionalSecondsCommand === "function"); assert(typeof FractionalSeconds$ === "object"); assert(typeof GreetingWithErrorsCommand === "function"); assert(typeof GreetingWithErrors$ === "object"); assert(typeof NoInputOutputCommand === "function"); assert(typeof NoInputOutput$ === "object"); assert(typeof OperationWithDefaultsCommand === "function"); assert(typeof OperationWithDefaults$ === "object"); assert(typeof OptionalInputOutputCommand === "function"); assert(typeof OptionalInputOutput$ === "object"); assert(typeof RecursiveShapesCommand === "function"); assert(typeof RecursiveShapes$ === "object"); assert(typeof RpcV2CborDenseMapsCommand === "function"); assert(typeof RpcV2CborDenseMaps$ === "object"); assert(typeof RpcV2CborListsCommand === "function"); assert(typeof RpcV2CborLists$ === "object"); assert(typeof RpcV2CborSparseMapsCommand === "function"); assert(typeof RpcV2CborSparseMaps$ === "object"); assert(typeof SimpleScalarPropertiesCommand === "function"); assert(typeof SimpleScalarProperties$ === "object"); assert(typeof SparseNullsOperationCommand === "function"); assert(typeof SparseNullsOperation$ === "object"); // structural schemas assert(typeof ValidationExceptionField$ === "object"); assert(typeof ClientOptionalDefaults$ === "object"); assert(typeof ComplexNestedErrorData$ === "object"); assert(typeof Defaults$ === "object"); assert(typeof EmptyStructure$ === "object"); assert(typeof Float16Output$ === "object"); assert(typeof FractionalSecondsOutput$ === "object"); assert(typeof GreetingWithErrorsOutput$ === "object"); assert(typeof OperationWithDefaultsInput$ === "object"); assert(typeof OperationWithDefaultsOutput$ === "object"); assert(typeof RecursiveShapesInputOutput$ === "object"); assert(typeof RecursiveShapesInputOutputNested1$ === "object"); assert(typeof RecursiveShapesInputOutputNested2$ === "object"); assert(typeof RpcV2CborDenseMapsInputOutput$ === "object"); assert(typeof RpcV2CborListInputOutput$ === "object"); assert(typeof RpcV2CborSparseMapsInputOutput$ === "object"); assert(typeof SimpleScalarStructure$ === "object"); assert(typeof SimpleStructure$ === "object"); assert(typeof SparseNullsOperationInputOutput$ === "object"); assert(typeof StructureListMember$ === "object"); assert(typeof GreetingStruct$ === "object"); // enums assert(typeof TestEnum === "object"); assert(typeof TestIntEnum === "object"); assert(typeof FooEnum === "object"); assert(typeof IntegerEnum === "object"); // errors assert(ValidationException.prototype instanceof RpcV2ProtocolServiceException); assert(typeof ValidationException$ === "object"); assert(ComplexError.prototype instanceof RpcV2ProtocolServiceException); assert(typeof ComplexError$ === "object"); assert(InvalidGreeting.prototype instanceof RpcV2ProtocolServiceException); assert(typeof InvalidGreeting$ === "object"); assert(RpcV2ProtocolServiceException.prototype instanceof Error); console.log(`RpcV2Protocol index test passed.`); ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/index-types.ts ================================================ // smithy-typescript generated code export type { RpcV2ProtocolClient, RpcV2Protocol, EmptyInputOutputCommand, EmptyInputOutputCommandInput, EmptyInputOutputCommandOutput, Float16Command, Float16CommandInput, Float16CommandOutput, FractionalSecondsCommand, FractionalSecondsCommandInput, FractionalSecondsCommandOutput, GreetingWithErrorsCommand, GreetingWithErrorsCommandInput, GreetingWithErrorsCommandOutput, NoInputOutputCommand, NoInputOutputCommandInput, NoInputOutputCommandOutput, OperationWithDefaultsCommand, OperationWithDefaultsCommandInput, OperationWithDefaultsCommandOutput, OptionalInputOutputCommand, OptionalInputOutputCommandInput, OptionalInputOutputCommandOutput, RecursiveShapesCommand, RecursiveShapesCommandInput, RecursiveShapesCommandOutput, RpcV2CborDenseMapsCommand, RpcV2CborDenseMapsCommandInput, RpcV2CborDenseMapsCommandOutput, RpcV2CborListsCommand, RpcV2CborListsCommandInput, RpcV2CborListsCommandOutput, RpcV2CborSparseMapsCommand, RpcV2CborSparseMapsCommandInput, RpcV2CborSparseMapsCommandOutput, SimpleScalarPropertiesCommand, SimpleScalarPropertiesCommandInput, SimpleScalarPropertiesCommandOutput, SparseNullsOperationCommand, SparseNullsOperationCommandInput, SparseNullsOperationCommandOutput, TestEnum, TestIntEnum, FooEnum, IntegerEnum, ValidationExceptionField, ClientOptionalDefaults, ComplexNestedErrorData, Defaults, EmptyStructure, Float16Output, FractionalSecondsOutput, GreetingWithErrorsOutput, OperationWithDefaultsInput, OperationWithDefaultsOutput, RecursiveShapesInputOutput, RecursiveShapesInputOutputNested1, RecursiveShapesInputOutputNested2, RpcV2CborDenseMapsInputOutput, RpcV2CborListInputOutput, RpcV2CborSparseMapsInputOutput, SimpleScalarStructure, SimpleStructure, SparseNullsOperationInputOutput, StructureListMember, GreetingStruct, ValidationException, ComplexError, InvalidGreeting, RpcV2ProtocolServiceException, } from "../dist-types/index.d"; ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/EmptyInputOutput.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/EmptyInputOutput content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 1 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] {} [actual bytes] 160 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/Float16.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/Float16 smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/FractionalSeconds.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/FractionalSeconds smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/GreetingWithErrors.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/GreetingWithErrors smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/NoInputOutput.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/NoInputOutput smithy-protocol: rpc-v2-cbor accept: application/cbor amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [no body] ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/OperationWithDefaults.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/OperationWithDefaults content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 549 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "defaults": { "defaultString": "__defaultString__", "defaultBoolean": false, "defaultList": [ "__member__", "__member__", "__member__" ], "defaultTimestamp": { "tag": 1, "value": 946702799.999 }, "defaultBlob": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, "defaultByte": 0, "defaultShort": 0, "defaultInteger": 0, "defaultLong": 0, "defaultFloat": 0, "defaultDouble": 0, "defaultMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__" }, "defaultEnum": "__defaultEnum__", "defaultIntEnum": 0, "emptyString": "__emptyString__", "falseBoolean": false, "emptyBlob": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, "zeroByte": 0, "zeroShort": 0, "zeroInteger": 0, "zeroLong": 0, "zeroFloat": 0, "zeroDouble": 0 }, "clientOptionalDefaults": { "member": 0 }, "topLevelDefault": "__topLevelDefault__", "otherTopLevelDefault": 0 } [actual bytes] 164, 104, 100, 101, 102, 97, 117, 108, 116, 115, 183, 109, 100, 101, 102, 97, 117, 108, 116, 83, 116, 114, 105, 110, 103, 113, 95, 95, 100, 101, 102, 97, 117, 108, 116, 83, 116, 114, 105, 110, 103, 95, 95, 110, 100, 101, 102, 97, 117, 108, 116, 66, 111, 111, 108, 101, 97, 110, 244, 107, 100, 101, 102, 97, 117, 108, 116, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 112, 100, 101, 102, 97, 117, 108, 116, 84, 105, 109, 101, 115, 116, 97, 109, 112, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 107, 100, 101, 102, 97, 117, 108, 116, 66, 108, 111, 98, 68, 1, 0, 0, 1, 107, 100, 101, 102, 97, 117, 108, 116, 66, 121, 116, 101, 0, 108, 100, 101, 102, 97, 117, 108, 116, 83, 104, 111, 114, 116, 0, 110, 100, 101, 102, 97, 117, 108, 116, 73, 110, 116, 101, 103, 101, 114, 0, 107, 100, 101, 102, 97, 117, 108, 116, 76, 111, 110, 103, 0, 108, 100, 101, 102, 97, 117, 108, 116, 70, 108, 111, 97, 116, 0, 109, 100, 101, 102, 97, 117, 108, 116, 68, 111, 117, 98, 108, 101, 0, 106, 100, 101, 102, 97, 117, 108, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 107, 100, 101, 102, 97, 117, 108, 116, 69, 110, 117, 109, 111, 95, 95, 100, 101, 102, 97, 117, 108, 116, 69, 110, 117, 109, 95, 95, 110, 100, 101, 102, 97, 117, 108, 116, 73, 110, 116, 69, 110, 117, 109, 0, 107, 101, 109, 112, 116, 121, 83, 116, 114, 105, 110, 103, 111, 95, 95, 101, 109, 112, 116, 121, 83, 116, 114, 105, 110, 103, 95, 95, 108, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 244, 105, 101, 109, 112, 116, 121, 66, 108, 111, 98, 68, 1, 0, 0, 1, 104, 122, 101, 114, 111, 66, 121, 116, 101, 0, 105, 122, 101, 114, 111, 83, 104, 111, 114, 116, 0, 107, 122, 101, 114, 111, 73, 110, 116, 101, 103, 101, 114, 0, 104, 122, 101, 114, 111, 76, 111, 110, 103, 0, 105, 122, 101, 114, 111, 70, 108, 111, 97, 116, 0, 106, 122, 101, 114, 111, 68, 111, 117, 98, 108, 101, 0, 118, 99, 108, 105, 101, 110, 116, 79, 112, 116, 105, 111, 110, 97, 108, 68, 101, 102, 97, 117, 108, 116, 115, 161, 102, 109, 101, 109, 98, 101, 114, 0, 111, 116, 111, 112, 76, 101, 118, 101, 108, 68, 101, 102, 97, 117, 108, 116, 115, 95, 95, 116, 111, 112, 76, 101, 118, 101, 108, 68, 101, 102, 97, 117, 108, 116, 95, 95, 116, 111, 116, 104, 101, 114, 84, 111, 112, 76, 101, 118, 101, 108, 68, 101, 102, 97, 117, 108, 116, 0 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/OptionalInputOutput.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/OptionalInputOutput content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 17 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "value": "__value__" } [actual bytes] 161, 101, 118, 97, 108, 117, 101, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/RecursiveShapes.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RecursiveShapes content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 107 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "nested": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": {} } } } } } [actual bytes] 161, 102, 110, 101, 115, 116, 101, 100, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 160 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/RpcV2CborDenseMaps.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RpcV2CborDenseMaps content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 325 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "denseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" } }, "denseNumberMap": { "key1": 0, "key2": 0, "key3": 0 }, "denseBooleanMap": { "key1": false, "key2": false, "key3": false }, "denseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__" }, "denseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ] } } [actual bytes] 165, 110, 100, 101, 110, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 110, 100, 101, 110, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 163, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 111, 100, 101, 110, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 163, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 110, 100, 101, 110, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 163, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 107, 100, 101, 110, 115, 101, 83, 101, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/RpcV2CborLists.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RpcV2CborLists content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 437 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "stringList": [ "__member__", "__member__", "__member__" ], "stringSet": [ "__member__", "__member__", "__member__" ], "integerList": [ 0, 0, 0 ], "booleanList": [ false, false, false ], "timestampList": [ { "tag": 1, "value": 946702799.999 }, { "tag": 1, "value": 946702799.999 }, { "tag": 1, "value": 946702799.999 } ], "enumList": [ "__member__", "__member__", "__member__" ], "intEnumList": [ 0, 0, 0 ], "nestedStringList": [ [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ] ], "structureList": [ { "a": "__a__", "b": "__b__" }, { "a": "__a__", "b": "__b__" }, { "a": "__a__", "b": "__b__" } ], "blobList": [ { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } ] } [actual bytes] 170, 106, 115, 116, 114, 105, 110, 103, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 105, 115, 116, 114, 105, 110, 103, 83, 101, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 107, 105, 110, 116, 101, 103, 101, 114, 76, 105, 115, 116, 131, 0, 0, 0, 107, 98, 111, 111, 108, 101, 97, 110, 76, 105, 115, 116, 131, 244, 244, 244, 109, 116, 105, 109, 101, 115, 116, 97, 109, 112, 76, 105, 115, 116, 131, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 104, 101, 110, 117, 109, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 107, 105, 110, 116, 69, 110, 117, 109, 76, 105, 115, 116, 131, 0, 0, 0, 112, 110, 101, 115, 116, 101, 100, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 131, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 109, 115, 116, 114, 117, 99, 116, 117, 114, 101, 76, 105, 115, 116, 131, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 104, 98, 108, 111, 98, 76, 105, 115, 116, 131, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/RpcV2CborSparseMaps.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/RpcV2CborSparseMaps content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 370 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "sparseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" }, "sparse": null }, "sparseNumberMap": { "key1": 0, "key2": 0, "key3": 0, "sparse": null }, "sparseBooleanMap": { "key1": false, "key2": false, "key3": false, "sparse": null }, "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null }, "sparseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ], "sparse": null } } [actual bytes] 165, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 164, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 102, 115, 112, 97, 114, 115, 101, 246, 112, 115, 112, 97, 114, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 164, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 108, 115, 112, 97, 114, 115, 101, 83, 101, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/SimpleScalarProperties.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/SimpleScalarProperties content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 154 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "trueBooleanValue": false, "falseBooleanValue": false, "byteValue": 0, "doubleValue": 0, "floatValue": 0, "integerValue": 0, "longValue": 0, "shortValue": 0, "stringValue": "__stringValue__", "blobValue": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } } [actual bytes] 170, 112, 116, 114, 117, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 113, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 105, 98, 121, 116, 101, 86, 97, 108, 117, 101, 0, 107, 100, 111, 117, 98, 108, 101, 86, 97, 108, 117, 101, 0, 106, 102, 108, 111, 97, 116, 86, 97, 108, 117, 101, 0, 108, 105, 110, 116, 101, 103, 101, 114, 86, 97, 108, 117, 101, 0, 105, 108, 111, 110, 103, 86, 97, 108, 117, 101, 0, 106, 115, 104, 111, 114, 116, 86, 97, 108, 117, 101, 0, 107, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 111, 95, 95, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 95, 95, 105, 98, 108, 111, 98, 86, 97, 108, 117, 101, 68, 1, 0, 0, 1 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/req/SparseNullsOperation.txt ================================================ POST https://localhost /mock-required-endpoint/service/RpcV2Protocol/operation/SparseNullsOperation content-type: application/cbor smithy-protocol: rpc-v2-cbor accept: application/cbor content-length: 123 amz-sdk-invocation-id: 1111abcd-uuid-uuid-uuid-000000001111 amz-sdk-request: attempt=1; max=3 [Uint8Array (cbor object view)] { "sparseStringList": [ "__member__", "__member__", "__member__", null ], "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null } } [actual bytes] 162, 112, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 132, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/EmptyInputOutput.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/Float16.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "value": 0 } [actual bytes] 161, 101, 118, 97, 108, 117, 101, 0 --- [output object] --- { value: (number) 0, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/FractionalSeconds.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "datetime": { "tag": 1, "value": 946702799.999 } } [actual bytes] 161, 104, 100, 97, 116, 101, 116, 105, 109, 101, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59 --- [output object] --- { datetime: (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/GreetingWithErrors.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "greeting": "__greeting__" } [actual bytes] 161, 104, 103, 114, 101, 101, 116, 105, 110, 103, 108, 95, 95, 103, 114, 101, 101, 116, 105, 110, 103, 95, 95 --- [output object] --- { greeting: "__greeting__", $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/NoInputOutput.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/OperationWithDefaults.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "defaultString": "__defaultString__", "defaultBoolean": false, "defaultList": [ "__member__", "__member__", "__member__" ], "defaultTimestamp": { "tag": 1, "value": 946702799.999 }, "defaultBlob": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, "defaultByte": 0, "defaultShort": 0, "defaultInteger": 0, "defaultLong": 0, "defaultFloat": 0, "defaultDouble": 0, "defaultMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__" }, "defaultEnum": "__defaultEnum__", "defaultIntEnum": 0, "emptyString": "__emptyString__", "falseBoolean": false, "emptyBlob": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, "zeroByte": 0, "zeroShort": 0, "zeroInteger": 0, "zeroLong": 0, "zeroFloat": 0, "zeroDouble": 0 } [actual bytes] 183, 109, 100, 101, 102, 97, 117, 108, 116, 83, 116, 114, 105, 110, 103, 113, 95, 95, 100, 101, 102, 97, 117, 108, 116, 83, 116, 114, 105, 110, 103, 95, 95, 110, 100, 101, 102, 97, 117, 108, 116, 66, 111, 111, 108, 101, 97, 110, 244, 107, 100, 101, 102, 97, 117, 108, 116, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 112, 100, 101, 102, 97, 117, 108, 116, 84, 105, 109, 101, 115, 116, 97, 109, 112, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 107, 100, 101, 102, 97, 117, 108, 116, 66, 108, 111, 98, 68, 1, 0, 0, 1, 107, 100, 101, 102, 97, 117, 108, 116, 66, 121, 116, 101, 0, 108, 100, 101, 102, 97, 117, 108, 116, 83, 104, 111, 114, 116, 0, 110, 100, 101, 102, 97, 117, 108, 116, 73, 110, 116, 101, 103, 101, 114, 0, 107, 100, 101, 102, 97, 117, 108, 116, 76, 111, 110, 103, 0, 108, 100, 101, 102, 97, 117, 108, 116, 70, 108, 111, 97, 116, 0, 109, 100, 101, 102, 97, 117, 108, 116, 68, 111, 117, 98, 108, 101, 0, 106, 100, 101, 102, 97, 117, 108, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 107, 100, 101, 102, 97, 117, 108, 116, 69, 110, 117, 109, 111, 95, 95, 100, 101, 102, 97, 117, 108, 116, 69, 110, 117, 109, 95, 95, 110, 100, 101, 102, 97, 117, 108, 116, 73, 110, 116, 69, 110, 117, 109, 0, 107, 101, 109, 112, 116, 121, 83, 116, 114, 105, 110, 103, 111, 95, 95, 101, 109, 112, 116, 121, 83, 116, 114, 105, 110, 103, 95, 95, 108, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 244, 105, 101, 109, 112, 116, 121, 66, 108, 111, 98, 68, 1, 0, 0, 1, 104, 122, 101, 114, 111, 66, 121, 116, 101, 0, 105, 122, 101, 114, 111, 83, 104, 111, 114, 116, 0, 107, 122, 101, 114, 111, 73, 110, 116, 101, 103, 101, 114, 0, 104, 122, 101, 114, 111, 76, 111, 110, 103, 0, 105, 122, 101, 114, 111, 70, 108, 111, 97, 116, 0, 106, 122, 101, 114, 111, 68, 111, 117, 98, 108, 101, 0 --- [output object] --- { defaultString: "__defaultString__", defaultBoolean: (boolean) false, defaultList: [ "__member__", "__member__", "__member__" ], defaultTimestamp: (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time, defaultBlob: (Uint8Array) bytes[1, 0, 0, 1], defaultByte: (number) 0, defaultShort: (number) 0, defaultInteger: (number) 0, defaultLong: (number) 0, defaultFloat: (number) 0, defaultDouble: (number) 0, defaultMap: { key1: "__value__", key2: "__value__", key3: "__value__" }, defaultEnum: "__defaultEnum__", defaultIntEnum: (number) 0, emptyString: "__emptyString__", falseBoolean: (boolean) false, emptyBlob: (Uint8Array) bytes[1, 0, 0, 1], zeroByte: (number) 0, zeroShort: (number) 0, zeroInteger: (number) 0, zeroLong: (number) 0, zeroFloat: (number) 0, zeroDouble: (number) 0, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/OptionalInputOutput.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "value": "__value__" } [actual bytes] 161, 101, 118, 97, 108, 117, 101, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95 --- [output object] --- { value: "__value__", $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/RecursiveShapes.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "nested": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": { "foo": "__foo__", "nested": { "bar": "__bar__", "recursiveMember": {} } } } } } [actual bytes] 161, 102, 110, 101, 115, 116, 101, 100, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 162, 99, 102, 111, 111, 103, 95, 95, 102, 111, 111, 95, 95, 102, 110, 101, 115, 116, 101, 100, 162, 99, 98, 97, 114, 103, 95, 95, 98, 97, 114, 95, 95, 111, 114, 101, 99, 117, 114, 115, 105, 118, 101, 77, 101, 109, 98, 101, 114, 160 --- [output object] --- { nested: { foo: "__foo__", nested: { bar: "__bar__", recursiveMember: { foo: "__foo__", nested: { bar: "__bar__", recursiveMember: {} } } } }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/RpcV2CborDenseMaps.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "denseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" } }, "denseNumberMap": { "key1": 0, "key2": 0, "key3": 0 }, "denseBooleanMap": { "key1": false, "key2": false, "key3": false }, "denseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__" }, "denseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ] } } [actual bytes] 165, 110, 100, 101, 110, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 110, 100, 101, 110, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 163, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 111, 100, 101, 110, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 163, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 110, 100, 101, 110, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 163, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 107, 100, 101, 110, 115, 101, 83, 101, 116, 77, 97, 112, 163, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95 --- [output object] --- { denseStructMap: { key1: { hi: "__hi__" }, key2: { hi: "__hi__" }, key3: { hi: "__hi__" } }, denseNumberMap: { key1: (number) 0, key2: (number) 0, key3: (number) 0 }, denseBooleanMap: { key1: (boolean) false, key2: (boolean) false, key3: (boolean) false }, denseStringMap: { key1: "__value__", key2: "__value__", key3: "__value__" }, denseSetMap: { key1: [ "__member__", "__member__", "__member__" ], key2: [ "__member__", "__member__", "__member__" ], key3: [ "__member__", "__member__", "__member__" ] }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/RpcV2CborLists.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "stringList": [ "__member__", "__member__", "__member__" ], "stringSet": [ "__member__", "__member__", "__member__" ], "integerList": [ 0, 0, 0 ], "booleanList": [ false, false, false ], "timestampList": [ { "tag": 1, "value": 946702799.999 }, { "tag": 1, "value": 946702799.999 }, { "tag": 1, "value": 946702799.999 } ], "enumList": [ "__member__", "__member__", "__member__" ], "intEnumList": [ 0, 0, 0 ], "nestedStringList": [ [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ] ], "structureList": [ { "a": "__a__", "b": "__b__" }, { "a": "__a__", "b": "__b__" }, { "a": "__a__", "b": "__b__" } ], "blobList": [ { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] }, { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } ] } [actual bytes] 170, 106, 115, 116, 114, 105, 110, 103, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 105, 115, 116, 114, 105, 110, 103, 83, 101, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 107, 105, 110, 116, 101, 103, 101, 114, 76, 105, 115, 116, 131, 0, 0, 0, 107, 98, 111, 111, 108, 101, 97, 110, 76, 105, 115, 116, 131, 244, 244, 244, 109, 116, 105, 109, 101, 115, 116, 97, 109, 112, 76, 105, 115, 116, 131, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 193, 251, 65, 204, 54, 196, 231, 255, 223, 59, 104, 101, 110, 117, 109, 76, 105, 115, 116, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 107, 105, 110, 116, 69, 110, 117, 109, 76, 105, 115, 116, 131, 0, 0, 0, 112, 110, 101, 115, 116, 101, 100, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 131, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 109, 115, 116, 114, 117, 99, 116, 117, 114, 101, 76, 105, 115, 116, 131, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 162, 97, 97, 101, 95, 95, 97, 95, 95, 97, 98, 101, 95, 95, 98, 95, 95, 104, 98, 108, 111, 98, 76, 105, 115, 116, 131, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1, 68, 1, 0, 0, 1 --- [output object] --- { stringList: [ "__member__", "__member__", "__member__" ], stringSet: [ "__member__", "__member__", "__member__" ], integerList: [ (number) 0, (number) 0, (number) 0 ], booleanList: [ (boolean) false, (boolean) false, (boolean) false ], timestampList: [ (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time, (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time, (Date) Fri, Dec 31, 1999, 20:59:59 Pacific Standard Time ], enumList: [ "__member__", "__member__", "__member__" ], intEnumList: [ (number) 0, (number) 0, (number) 0 ], nestedStringList: [ [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ], [ "__member__", "__member__", "__member__" ] ], structureList: [ { a: "__a__", b: "__b__" }, { a: "__a__", b: "__b__" }, { a: "__a__", b: "__b__" } ], blobList: [ (Uint8Array) bytes[1, 0, 0, 1], (Uint8Array) bytes[1, 0, 0, 1], (Uint8Array) bytes[1, 0, 0, 1] ], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/RpcV2CborSparseMaps.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "sparseStructMap": { "key1": { "hi": "__hi__" }, "key2": { "hi": "__hi__" }, "key3": { "hi": "__hi__" }, "sparse": null }, "sparseNumberMap": { "key1": 0, "key2": 0, "key3": 0, "sparse": null }, "sparseBooleanMap": { "key1": false, "key2": false, "key3": false, "sparse": null }, "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null }, "sparseSetMap": { "key1": [ "__member__", "__member__", "__member__" ], "key2": [ "__member__", "__member__", "__member__" ], "key3": [ "__member__", "__member__", "__member__" ], "sparse": null } } [actual bytes] 165, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 117, 99, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 50, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 100, 107, 101, 121, 51, 161, 98, 104, 105, 102, 95, 95, 104, 105, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 78, 117, 109, 98, 101, 114, 77, 97, 112, 164, 100, 107, 101, 121, 49, 0, 100, 107, 101, 121, 50, 0, 100, 107, 101, 121, 51, 0, 102, 115, 112, 97, 114, 115, 101, 246, 112, 115, 112, 97, 114, 115, 101, 66, 111, 111, 108, 101, 97, 110, 77, 97, 112, 164, 100, 107, 101, 121, 49, 244, 100, 107, 101, 121, 50, 244, 100, 107, 101, 121, 51, 244, 102, 115, 112, 97, 114, 115, 101, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246, 108, 115, 112, 97, 114, 115, 101, 83, 101, 116, 77, 97, 112, 164, 100, 107, 101, 121, 49, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 50, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 100, 107, 101, 121, 51, 131, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 --- [output object] --- { sparseStructMap: { key1: { hi: "__hi__" }, key2: { hi: "__hi__" }, key3: { hi: "__hi__" }, sparse: (null) }, sparseNumberMap: { key1: (number) 0, key2: (number) 0, key3: (number) 0, sparse: (null) }, sparseBooleanMap: { key1: (boolean) false, key2: (boolean) false, key3: (boolean) false, sparse: (null) }, sparseStringMap: { key1: "__value__", key2: "__value__", key3: "__value__", sparse: (null) }, sparseSetMap: { key1: [ "__member__", "__member__", "__member__" ], key2: [ "__member__", "__member__", "__member__" ], key3: [ "__member__", "__member__", "__member__" ], sparse: (null) }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/SimpleScalarProperties.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "trueBooleanValue": false, "falseBooleanValue": false, "byteValue": 0, "doubleValue": 0, "floatValue": 0, "integerValue": 0, "longValue": 0, "shortValue": 0, "stringValue": "__stringValue__", "blobValue": { "type": "Buffer", "data": [ 1, 0, 0, 1 ] } } [actual bytes] 170, 112, 116, 114, 117, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 113, 102, 97, 108, 115, 101, 66, 111, 111, 108, 101, 97, 110, 86, 97, 108, 117, 101, 244, 105, 98, 121, 116, 101, 86, 97, 108, 117, 101, 0, 107, 100, 111, 117, 98, 108, 101, 86, 97, 108, 117, 101, 0, 106, 102, 108, 111, 97, 116, 86, 97, 108, 117, 101, 0, 108, 105, 110, 116, 101, 103, 101, 114, 86, 97, 108, 117, 101, 0, 105, 108, 111, 110, 103, 86, 97, 108, 117, 101, 0, 106, 115, 104, 111, 114, 116, 86, 97, 108, 117, 101, 0, 107, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 111, 95, 95, 115, 116, 114, 105, 110, 103, 86, 97, 108, 117, 101, 95, 95, 105, 98, 108, 111, 98, 86, 97, 108, 117, 101, 68, 1, 0, 0, 1 --- [output object] --- { trueBooleanValue: (boolean) false, falseBooleanValue: (boolean) false, byteValue: (number) 0, doubleValue: (number) 0, floatValue: (number) 0, integerValue: (number) 0, longValue: (number) 0, shortValue: (number) 0, stringValue: "__stringValue__", blobValue: (Uint8Array) bytes[1, 0, 0, 1], $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res/SparseNullsOperation.txt ================================================ ======================== minimal response ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] {} [actual bytes] 160 --- [output object] --- { $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ======================== w/ optional fields ======================== [status] 200 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "sparseStringList": [ "__member__", "__member__", "__member__", null ], "sparseStringMap": { "key1": "__value__", "key2": "__value__", "key3": "__value__", "sparse": null } } [actual bytes] 162, 112, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 76, 105, 115, 116, 132, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 106, 95, 95, 109, 101, 109, 98, 101, 114, 95, 95, 246, 111, 115, 112, 97, 114, 115, 101, 83, 116, 114, 105, 110, 103, 77, 97, 112, 164, 100, 107, 101, 121, 49, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 50, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 100, 107, 101, 121, 51, 105, 95, 95, 118, 97, 108, 117, 101, 95, 95, 102, 115, 112, 97, 114, 115, 101, 246 --- [output object] --- { sparseStringList: [ "__member__", "__member__", "__member__", (null) ], sparseStringMap: { key1: "__value__", key2: "__value__", key3: "__value__", sparse: (null) }, $metadata: { httpStatusCode: (number) 200, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res-err/ComplexError.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#ComplexError" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 43, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 67, 111, 109, 112, 108, 101, 120, 69, 114, 114, 111, 114 --- [error name & message] --- ComplexError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ComplexError", TopLevel: (undefined), Nested: (undefined), message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "TopLevel": "__TopLevel__", "Nested": { "Foo": "__Foo__" }, "__type": "smithy.protocoltests.rpcv2Cbor#ComplexError" } [actual bytes] 163, 104, 84, 111, 112, 76, 101, 118, 101, 108, 108, 95, 95, 84, 111, 112, 76, 101, 118, 101, 108, 95, 95, 102, 78, 101, 115, 116, 101, 100, 161, 99, 70, 111, 111, 103, 95, 95, 70, 111, 111, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 43, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 67, 111, 109, 112, 108, 101, 120, 69, 114, 114, 111, 114 --- [error name & message] --- ComplexError: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ComplexError", TopLevel: "__TopLevel__", Nested: { Foo: "__Foo__" }, message: "Unknown" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res-err/InvalidGreeting.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#InvalidGreeting" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 73, 110, 118, 97, 108, 105, 100, 71, 114, 101, 101, 116, 105, 110, 103 --- [error name & message] --- InvalidGreeting: Unknown --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "InvalidGreeting", Message: (undefined), message: "Unknown" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "Message": "__Message__", "__type": "smithy.protocoltests.rpcv2Cbor#InvalidGreeting" } [actual bytes] 162, 103, 77, 101, 115, 115, 97, 103, 101, 107, 95, 95, 77, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 46, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 73, 110, 118, 97, 108, 105, 100, 71, 114, 101, 101, 116, 105, 110, 103 --- [error name & message] --- InvalidGreeting: __Message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "InvalidGreeting", Message: "__Message__", message: "__Message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res-err/UnmodeledServiceException.txt ================================================ ======================== minimal response ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "__type": "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } [actual bytes] 161, 102, 95, 95, 116, 121, 112, 101, 120, 56, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", __type: "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } ======================== w/ optional fields ======================== [status] 500 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "Message": "__Message__", "__type": "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException" } [actual bytes] 162, 103, 77, 101, 115, 115, 97, 103, 101, 107, 95, 95, 77, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 56, 115, 109, 105, 116, 104, 121, 46, 112, 114, 111, 116, 111, 99, 111, 108, 116, 101, 115, 116, 115, 46, 114, 112, 99, 118, 50, 67, 98, 111, 114, 35, 85, 110, 109, 111, 100, 101, 108, 101, 100, 83, 101, 114, 118, 105, 99, 101, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- UnmodeledServiceException: __Message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "UnmodeledServiceException", Message: "__Message__", __type: "smithy.protocoltests.rpcv2Cbor#UnmodeledServiceException", message: "__Message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots/res-err/ValidationException.txt ================================================ ======================== minimal response ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "fieldList": [ { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" } ], "__type": "smithy.framework#ValidationException" } [actual bytes] 163, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 105, 102, 105, 101, 108, 100, 76, 105, 115, 116, 131, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 36, 115, 109, 105, 116, 104, 121, 46, 102, 114, 97, 109, 101, 119, 111, 114, 107, 35, 86, 97, 108, 105, 100, 97, 116, 105, 111, 110, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- ValidationException: __message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ValidationException", fieldList: [ { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" } ], message: "__message__" } ======================== w/ optional fields ======================== [status] 400 smithy-protocol: rpc-v2-cbor content-type: application/cbor [Uint8Array (cbor object view)] { "message": "__message__", "fieldList": [ { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" }, { "path": "__path__", "message": "__message__" } ], "__type": "smithy.framework#ValidationException" } [actual bytes] 163, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 105, 102, 105, 101, 108, 100, 76, 105, 115, 116, 131, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 162, 100, 112, 97, 116, 104, 104, 95, 95, 112, 97, 116, 104, 95, 95, 103, 109, 101, 115, 115, 97, 103, 101, 107, 95, 95, 109, 101, 115, 115, 97, 103, 101, 95, 95, 102, 95, 95, 116, 121, 112, 101, 120, 36, 115, 109, 105, 116, 104, 121, 46, 102, 114, 97, 109, 101, 119, 111, 114, 107, 35, 86, 97, 108, 105, 100, 97, 116, 105, 111, 110, 69, 120, 99, 101, 112, 116, 105, 111, 110 --- [error name & message] --- ValidationException: __message__ --- [error object] --- { $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 400, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "ValidationException", fieldList: [ { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" }, { path: "__path__", message: "__message__" } ], message: "__message__" } ======================== frontend error ======================== [status] 500 content-type: text/html [Uint8Array (text)] An unmodeled error occurred in a front end layer. --- [error name & message] --- Unknown: --- [error object] --- { 0: (number) 110, $fault: "client", $retryable: (undefined), $metadata: { httpStatusCode: (number) 500, requestId: (undefined), extendedRequestId: (undefined), cfId: (undefined), attempts: (number) 1, totalRetryDelay: (number) 0 }, name: "Unknown" } ================================================ FILE: private/smithy-rpcv2-cbor-schema/test/snapshots.integ.spec.ts ================================================ // smithy-typescript generated code import { SnapshotRunner } from "@smithy/snapshot-testing"; import { join } from "node:path"; import { describe, expect, test as it, vi } from "vitest"; import { ComplexError$, EmptyInputOutput$, EmptyInputOutputCommand, Float16$, Float16Command, FractionalSeconds$, FractionalSecondsCommand, GreetingWithErrors$, GreetingWithErrorsCommand, InvalidGreeting$, NoInputOutput$, NoInputOutputCommand, OperationWithDefaults$, OperationWithDefaultsCommand, OptionalInputOutput$, OptionalInputOutputCommand, RecursiveShapes$, RecursiveShapesCommand, RpcV2CborDenseMaps$, RpcV2CborDenseMapsCommand, RpcV2CborLists$, RpcV2CborListsCommand, RpcV2CborSparseMaps$, RpcV2CborSparseMapsCommand, RpcV2ProtocolClient, SimpleScalarProperties$, SimpleScalarPropertiesCommand, SparseNullsOperation$, SparseNullsOperationCommand, ValidationException$, } from "../src"; vi.setSystemTime(new Date(946702799999)); const Client = RpcV2ProtocolClient; const mode = (process.env.SNAPSHOT_MODE as "write" | "compare") ?? "write"; describe("RpcV2ProtocolClient" + ` (${mode})`, () => { const runner = new SnapshotRunner({ snapshotDirPath: join(__dirname, "snapshots"), Client, mode, testCase(caseName: string, run: () => Promise) { it(caseName, run); }, assertions(caseName: string, expected: string, actual: string): Promise { expect(actual).toEqual(expected); return Promise.resolve(); }, schemas: new Map([ [EmptyInputOutput$, EmptyInputOutputCommand], [Float16$, Float16Command], [FractionalSeconds$, FractionalSecondsCommand], [GreetingWithErrors$, GreetingWithErrorsCommand], [NoInputOutput$, NoInputOutputCommand], [OperationWithDefaults$, OperationWithDefaultsCommand], [OptionalInputOutput$, OptionalInputOutputCommand], [RecursiveShapes$, RecursiveShapesCommand], [RpcV2CborDenseMaps$, RpcV2CborDenseMapsCommand], [RpcV2CborLists$, RpcV2CborListsCommand], [RpcV2CborSparseMaps$, RpcV2CborSparseMapsCommand], [SimpleScalarProperties$, SimpleScalarPropertiesCommand], [SparseNullsOperation$, SparseNullsOperationCommand], ]), errors: [ ValidationException$, ComplexError$, InvalidGreeting$, ], }); runner.run(); }, 30_000); ================================================ FILE: private/smithy-rpcv2-cbor-schema/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist-cjs", "noCheck": true } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "lib": ["dom"], "module": "ESNext", "moduleResolution": "bundler", "outDir": "dist-es", "noCheck": true } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/tsconfig.json ================================================ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "downlevelIteration": true, "importHelpers": true, "incremental": true, "removeComments": true, "resolveJsonModule": true, "rootDir": "src", "useUnknownInCatchVariables": false }, "include": ["src"] } ================================================ FILE: private/smithy-rpcv2-cbor-schema/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist-types", "emitDeclarationOnly": true, "noCheck": false } } ================================================ FILE: private/smithy-rpcv2-cbor-schema/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: private/smithy-rpcv2-cbor-schema/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ}.spec.ts"], include: ["**/*.spec.ts"], globals: true, }, }); ================================================ FILE: private/util-test/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json ================================================ FILE: private/util-test/CHANGELOG.md ================================================ # @smithy/util-test ## 0.2.8 ### Patch Changes - Updated dependencies [cf9257e] - @smithy/types@3.4.1 - @smithy/protocol-http@4.1.2 ## 0.2.7 ### Patch Changes - Updated dependencies [2dad138] - Updated dependencies [9f3f2f5] - @smithy/types@3.4.0 - @smithy/protocol-http@4.1.1 ## 0.2.6 ### Patch Changes - Updated dependencies [86862ea] - @smithy/protocol-http@4.1.0 ## 0.2.5 ### Patch Changes - Updated dependencies [796567d] - @smithy/protocol-http@4.0.4 ## 0.2.4 ### Patch Changes - Updated dependencies [4784fb9] - @smithy/types@3.3.0 - @smithy/protocol-http@4.0.3 ## 0.2.3 ### Patch Changes - Updated dependencies [c16e014] - Updated dependencies [c2a5595] - @smithy/types@3.2.0 - @smithy/protocol-http@4.0.2 ## 0.2.2 ### Patch Changes - Updated dependencies [38da9009] - @smithy/types@3.1.0 - @smithy/protocol-http@4.0.1 ## 0.2.1 ### Patch Changes - Updated dependencies [7a7c84d3] - Updated dependencies [671aa704] - @smithy/types@3.0.0 - @smithy/protocol-http@4.0.0 ## 0.2.0 ### Minor Changes - 38f9a61f: Update package dependencies ### Patch Changes - Updated dependencies [38f9a61f] - Updated dependencies [661f1d60] - @smithy/protocol-http@3.3.0 - @smithy/types@2.12.0 ## 0.1.17 ### Patch Changes - Updated dependencies [43f3e1e2] - @smithy/types@2.11.0 - @smithy/protocol-http@3.2.2 ## 0.1.16 ### Patch Changes - Updated dependencies [dd0d9b4b] - @smithy/types@2.10.1 - @smithy/protocol-http@3.2.1 ## 0.1.15 ### Patch Changes - Updated dependencies [d70a00ac] - Updated dependencies [1e23f967] - Updated dependencies [929801bc] - @smithy/types@2.10.0 - @smithy/protocol-http@3.2.0 ## 0.1.14 ### Patch Changes - 2b1bf055: generate dist-cjs with runtime list of export names for esm - Updated dependencies [2b1bf055] - @smithy/protocol-http@3.1.1 - @smithy/types@2.9.1 ## 0.1.13 ### Patch Changes - Updated dependencies [9939f823] - @smithy/protocol-http@3.1.0 - @smithy/types@2.9.0 ## 0.1.12 ### Patch Changes - Updated dependencies [590af6b7] - @smithy/types@2.8.0 - @smithy/protocol-http@3.0.12 ## 0.1.11 ### Patch Changes - Updated dependencies [340634a5] - @smithy/types@2.7.0 - @smithy/protocol-http@3.0.11 ## 0.1.10 ### Patch Changes - Updated dependencies [9bfc64ed] - Updated dependencies [9579a9a0] - @smithy/types@2.6.0 - @smithy/protocol-http@3.0.10 ## 0.1.9 ### Patch Changes - Updated dependencies [8044a814] - @smithy/types@2.5.0 - @smithy/protocol-http@3.0.9 ## 0.1.8 ### Patch Changes - Updated dependencies [5e9fd6ce] - Updated dependencies [05f5d42c] - @smithy/types@2.4.0 - @smithy/protocol-http@3.0.8 ## 0.1.7 ### Patch Changes - Updated dependencies [d6b4c090] - @smithy/types@2.3.5 - @smithy/protocol-http@3.0.7 ## 0.1.6 ### Patch Changes - Updated dependencies [2f70f105] - Updated dependencies [9a562d37] - @smithy/types@2.3.4 - @smithy/protocol-http@3.0.6 ## 0.1.5 ### Patch Changes - Updated dependencies [ea0635d6] - @smithy/types@2.3.3 - @smithy/protocol-http@3.0.5 ## 0.1.4 ### Patch Changes - Updated dependencies [fbfeebee] - Updated dependencies [c0b17a13] - @smithy/types@2.3.2 - @smithy/protocol-http@3.0.4 ## 0.1.3 ### Patch Changes - Updated dependencies [b9265813] - Updated dependencies [6d1c2fb1] - @smithy/types@2.3.1 - @smithy/protocol-http@3.0.3 ## 0.1.2 ### Patch Changes - Updated dependencies [5b3fec37] - @smithy/protocol-http@3.0.2 ## 0.1.1 ### Patch Changes - Updated dependencies [5db648a6] - @smithy/protocol-http@3.0.1 ## 0.1.0 ### Minor Changes - a03026e3: Add http client component to runtime extension ### Patch Changes - Updated dependencies [88bcec3d] - Updated dependencies [a03026e3] - @smithy/types@2.3.0 - @smithy/protocol-http@3.0.0 ## null ### Patch Changes - Updated dependencies [b753dd4c] - Updated dependencies [6c8ffa27] - @smithy/types@2.2.2 - @smithy/protocol-http@2.0.5 ================================================ FILE: private/util-test/package.json ================================================ { "name": "@smithy/util-test", "version": "0.2.8", "private": true, "main": "./dist-cjs/index.js", "module": "./dist-es/index.js", "types": "./dist-types/index.d.ts", "scripts": { "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "format": "prettier --config ../../prettier.config.js --ignore-path ../.prettierignore --write \"**/*.{ts,md,json}\"" }, "dependencies": { "@smithy/core": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" }, "devDependencies": { "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typedoc": "0.23.23", "typescript": "~5.8.3" } } ================================================ FILE: private/util-test/src/index.ts ================================================ export * from "./test-http-handler"; ================================================ FILE: private/util-test/src/test-http-handler.ts ================================================ import type { HttpHandler, HttpRequest, HttpResponse } from "@smithy/core/protocols"; import type { Client, HttpHandlerOptions, RequestHandler, RequestHandlerOutput } from "@smithy/types"; import { expect } from "vitest"; /** * Instructs {@link TestHttpHandler} how to match the handled request and the expected request. * @internal */ export type Matcher = string | number | boolean | RegExp | null | undefined | ((value: any) => void); /** * @internal */ export type HttpRequestMatcher = { // endpoint protocol?: Matcher; hostname?: Matcher; port?: Matcher; path?: Matcher; query?: Record | Map; // message headers?: Record | Map; body?: Matcher; method?: Matcher; // debug option log?: boolean; }; /** * Supplied to test clients to assert correct requests. * @internal */ export class TestHttpHandler implements HttpHandler { private static WATCHER = Symbol("TestHttpHandler_WATCHER"); public readonly matchers: HttpRequestMatcher[]; private originalSend?: Function; private originalRequestHandler?: RequestHandler; private client?: Client; private responseQueue: HttpResponse[] = []; private assertions = 0; public constructor(...matchers: HttpRequestMatcher[]) { this.matchers = matchers; const RESERVED_ENVIRONMENT_VARIABLES = { AWS_DEFAULT_REGION: 1, AWS_REGION: 1, AWS_PROFILE: 1, AWS_ACCESS_KEY_ID: 1, AWS_SECRET_ACCESS_KEY: 1, AWS_SESSION_TOKEN: 1, AWS_CREDENTIAL_EXPIRATION: 1, AWS_CREDENTIAL_SCOPE: 1, AWS_EC2_METADATA_DISABLED: 1, AWS_WEB_IDENTITY_TOKEN_FILE: 1, AWS_ROLE_ARN: 1, AWS_CONTAINER_CREDENTIALS_FULL_URI: 1, AWS_CONTAINER_CREDENTIALS_RELATIVE_URI: 1, AWS_CONTAINER_AUTHORIZATION_TOKEN: 1, AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE: 1, }; for (const key in RESERVED_ENVIRONMENT_VARIABLES) { delete process.env[key]; } process.env.AWS_ACCESS_KEY_ID = "INTEGRATION_TEST_MOCK"; process.env.AWS_SECRET_ACCESS_KEY = "INTEGRATION_TEST_MOCK"; } /** * @param client - to watch for requests. * @param matchers - optional override of this instance's matchers. * * Temporarily hooks the client.send call to check the outgoing request. */ public watch(client: Client): TestHttpHandler { this.client = client; this.originalRequestHandler = client.config.requestHandler; client.config.requestHandler = this; if (!(client as any)[TestHttpHandler.WATCHER]) { (client as any)[TestHttpHandler.WATCHER] = true; const originalSend = (this.originalSend = client.send as any); client.send = async function (...args: any[]) { return originalSend.apply(client, args).catch((e: unknown) => { if ((e as any).id === TestHttpHandlerSuccess.ID) { } else { throw e; } }); }; } return this; } /** * @param httpResponses - to enqueue for mock responses. */ public respondWith(...httpResponses: HttpResponse[]): TestHttpHandler { this.responseQueue.push(...httpResponses); return this; } /** * @throws TestHttpHandlerSuccess to indicate success (only way to control it). * @throws Error any other exception to indicate failure. */ public async handle( request: HttpRequest, handlerOptions?: HttpHandlerOptions ): Promise> { const m = this.matchers.length > 1 ? this.matchers.shift()! : this.matchers[0]; if (m.log) { console.log(request); } this.check(m.protocol, request.protocol); this.check(m.hostname, request.hostname); this.check(m.port, request.port); this.check(m.path, request.path); this.checkAll(m.query ?? {}, request.query, "query"); this.checkAll(m.headers ?? {}, request.headers, "header"); this.check(m.body, request.body); this.check(m.method, request.method); if (this.assertions === 0) { throw new Error("Request handled with no assertions, empty matcher?"); } if (this.responseQueue.length > 1) { return { response: this.responseQueue.shift()!, }; } else { if (this.responseQueue.length === 1) { return { response: this.responseQueue[0], }; } } throw new TestHttpHandlerSuccess(); } public async destroy(): Promise { (this.client as any).config.requestHandler = this.originalRequestHandler; (this.client as any).send = this.originalSend as any; } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } private check(matcher?: Matcher, observed?: any) { if (matcher === undefined) { return; } switch (typeof matcher) { case "string": if (matcher.startsWith("/") && matcher.endsWith("/")) { expect(String(observed)).toMatch(new RegExp(matcher)); } else { expect(observed).toEqual(matcher); } break; case "number": case "bigint": case "boolean": expect(observed).toEqual(matcher); break; case "object": if (matcher instanceof RegExp) { expect(String(observed)).toMatch(matcher); } break; case "function": matcher(observed); break; default: throw new Error("Matcher did not create assertion"); } this.assertions++; } private checkAll( matchers: Record | Map, observed: any, type: "header" | "query" ) { if (matchers == null) { return; } let key: string | RegExp; for (const [_key, matcher] of matchers instanceof Map ? matchers : Object.entries(matchers)) { key = _key; if (typeof key === "string") { if (key.startsWith("/") && key.endsWith("/")) { key = new RegExp(key); } else { const matchingValue = type === "header" ? observed[Object.keys(observed).find((k) => k.toLowerCase() === String(key).toLowerCase()) ?? ""] : observed[key]; this.check(matcher, matchingValue); } } if (key instanceof RegExp) { for (const [observedKey, observedValue] of Object.entries(observed)) { if (key.test(observedKey)) { this.check(matcher, observedValue); } } } } } } /** * This is used as an interrupt signal for success. * It does not indicate a true error. * * @internal */ export class TestHttpHandlerSuccess extends Error { public static readonly ID = Symbol("TestHttpHandlerSuccess"); public readonly id = TestHttpHandlerSuccess.ID; } /** * @internal */ export const requireRequestsFrom = (client: Client) => { return { toMatch(...matchers: HttpRequestMatcher[]) { return new TestHttpHandler(...matchers).watch(client); }, }; }; ================================================ FILE: private/util-test/tsconfig.cjs.json ================================================ { "compilerOptions": { "baseUrl": ".", "outDir": "dist-cjs", "rootDir": "src", "stripInternal": true, "skipLibCheck": true }, "extends": "../../tsconfig.cjs.json", "include": ["src/"] } ================================================ FILE: private/util-test/tsconfig.es.json ================================================ { "compilerOptions": { "baseUrl": ".", "lib": [], "outDir": "dist-es", "rootDir": "src", "stripInternal": true, "skipLibCheck": true }, "extends": "../../tsconfig.es.json", "include": ["src/"] } ================================================ FILE: private/util-test/tsconfig.types.json ================================================ { "compilerOptions": { "baseUrl": ".", "declarationDir": "dist-types", "rootDir": "src", "skipLibCheck": true }, "extends": "../../tsconfig.types.json", "include": ["src/"] } ================================================ FILE: scripts/build-generated-test-packages.js ================================================ /** * * This script builds the generated weather and weather-ssdk test packages * and copies them into node_modules for use by integration tests. */ const path = require("node:path"); const fs = require("node:fs"); const { spawnProcess } = require("./utils/spawn-process"); const root = path.join(__dirname, ".."); const testProjectDir = path.join(root, "smithy-typescript-codegen-test"); const codegenTestDir = path.join(testProjectDir, "build", "smithyprojections", "smithy-typescript-codegen-test"); const weatherClientDir = path.join(codegenTestDir, "source", "typescript-client-codegen"); // Build generic legacy auth client for integration tests const weatherLegacyAuthClientDir = path.join(codegenTestDir, "client-legacy-auth", "typescript-client-codegen"); const weatherSsdkDir = path.join(codegenTestDir, "ssdk-test", "typescript-server-codegen"); // Build `@httpApiKeyAuth` client for integration tests const httpApiKeyAuthClientDir = path.join( codegenTestDir, "identity-and-auth-http-api-key-auth", "typescript-client-codegen" ); // Build `@httpBearerAuth` client for integration tests const httpBearerAuthClientDir = path.join( codegenTestDir, "identity-and-auth-http-bearer-auth", "typescript-client-codegen" ); const nodeModulesDir = path.join(root, "node_modules"); const buildAndCopyToNodeModules = async (packageName, codegenDir, nodeModulesDir) => { try { console.log(`Building and copying package \`${packageName}\` in \`${codegenDir}\` to \`${nodeModulesDir}\``); // Yarn detects that the generated TypeScript package is nested beneath the // top-level package.json. Adding an empty lock file allows it to be treated // as its own package. await spawnProcess("touch", ["yarn.lock"], { cwd: codegenDir }); await spawnProcess("yarn", { cwd: codegenDir }); const smithyPackages = path.join(__dirname, "..", "packages"); const node_modules = path.join(codegenDir, "node_modules"); const localSmithyPkgs = fs.readdirSync(smithyPackages); for (const smithyPkg of localSmithyPkgs) { if (!fs.existsSync(path.join(smithyPackages, smithyPkg, "dist-cjs"))) { continue; } await Promise.all( ["dist-cjs", "dist-types", "dist-es", "package.json"].map((folder) => spawnProcess("cp", [ "-r", path.join(smithyPackages, smithyPkg, folder), path.join(node_modules, "@smithy", smithyPkg), ]) ) ); } await spawnProcess("yarn", ["build"], { cwd: codegenDir }); // Optionally, after building the package, it's packed and copied to node_modules so that // it can be used in integration tests by other packages within the monorepo. if (nodeModulesDir != undefined) { await spawnProcess("yarn", ["pack"], { cwd: codegenDir }); await spawnProcess("rm", ["-rf", packageName], { cwd: nodeModulesDir }); await spawnProcess("mkdir", ["-p", packageName], { cwd: nodeModulesDir }); const targetPackageDir = path.join(nodeModulesDir, packageName); await spawnProcess("tar", ["-xf", "package.tgz", "-C", targetPackageDir, "--strip-components", "1"], { cwd: codegenDir, }); } } catch (e) { console.log( `Building and copying package \`${packageName}\` in \`${codegenDir}\` to \`${nodeModulesDir}\` failed:` ); console.log(e); process.exit(1); } }; (async () => { await buildAndCopyToNodeModules("weather", weatherClientDir, nodeModulesDir); await buildAndCopyToNodeModules("weather-ssdk", weatherSsdkDir, nodeModulesDir); await buildAndCopyToNodeModules("@smithy/weather-legacy-auth", weatherLegacyAuthClientDir, nodeModulesDir); await buildAndCopyToNodeModules( "@smithy/identity-and-auth-http-api-key-auth-service", httpApiKeyAuthClientDir, nodeModulesDir ); await buildAndCopyToNodeModules( "@smithy/identity-and-auth-http-bearer-auth-service", httpBearerAuthClientDir, nodeModulesDir ); // TODO(released-version-test): Test released version of smithy-typescript codegenerators, but currently is not working /* const releasedClientDir = path.join( testProjectDir, "released-version-test", "build", "smithyprojections", "released-version-test", "source", "typescript-codegen" ); */ // await buildAndCopyToNodeModules("released", releasedClientDir, undefined); })(); ================================================ FILE: scripts/check-dependencies.js ================================================ /** * Checks devDependency declarations for runtime packages. * They should be moved to the dependencies section even if only imported for types. */ const fs = require("node:fs"); const path = require("node:path"); const root = path.join(__dirname, ".."); const packages = path.join(root, "packages"); const walk = require("./utils/walk"); const pkgJsonEnforcement = require("./package-json-enforcement"); const node_libraries = [ "buffer", "child_process", "crypto", "dns", "dns/promises", "events", "fs", "fs/promises", "http", "http2", "https", "net", "os", "path", "path/posix", "path/win32", "process", "stream", "stream/consumers", "stream/promises", "stream/web", "tls", "url", "util", "zlib", ]; (async () => { const errors = []; for (const packageFolder of fs.readdirSync(packages)) { const pkgJsonPath = path.join(packages, packageFolder, "package.json"); errors.push(...pkgJsonEnforcement(pkgJsonPath, true)); const srcPath = path.join(packages, packageFolder, "src"); const pkgJson = require(pkgJsonPath); for await (const file of walk(srcPath, ["node_modules"])) { const contents = fs.readFileSync(file); if (file.endsWith(".spec.ts")) { continue; } if (!file.endsWith(".ts")) { continue; } const importedDependencies = []; importedDependencies.push( ...new Set( [...(contents.toString().match(/(from |import\()"(.*?)";/g) || [])] .map((_) => _.replace(/from "/g, "").replace(/";$/, "")) .filter((_) => !_.startsWith(".") && !node_libraries.includes(_) && !_.startsWith("node:")) ) ); for (const dependency of importedDependencies) { const dependencyPackageName = dependency.startsWith("@") ? dependency.split("/").slice(0, 2).join("/") : dependency.split("/")[0]; if ( !(dependencyPackageName in (pkgJson.dependencies ?? {})) && !(dependencyPackageName in (pkgJson.peerDependencies ?? {})) && dependencyPackageName !== pkgJson.name ) { errors.push(`${dependency} undeclared but imported in ${pkgJson.name} ${file}}`); } } for (const [dep, version] of Object.entries(pkgJson.devDependencies ?? {})) { if ((dep.startsWith("@smithy") || dep.startsWith("@aws-sdk")) && contents.includes(`from "${dep}";`)) { errors.push(`${dep} incorrectly declared in devDependencies of ${packageFolder}`); delete pkgJson.devDependencies[dep]; if (!pkgJson.dependencies) { pkgJson.dependencies = {}; } pkgJson.dependencies[dep] = version; fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n"); } } } } if (errors.length) { throw new Error(errors.join("\n")); } })(); ================================================ FILE: scripts/cli-dispatcher/index.js ================================================ #!/usr/bin/env node const path = require("path"); const readline = require("readline"); const findFolders = require("./lib/findFolders"); const findScripts = require("./lib/findScripts"); const Package = require("./lib/Package"); const { listFolders } = require("../utils/list-folders"); /** * This script takes your command line arguments and infers the * package in which to execute them. * * It is supposed to save time moving among packages/private folders * for building and running other test commands. */ async function main() { console.log("CLI dispatcher"); const root = path.join(__dirname, "..", ".."); const argv = process.argv; const packages = listFolders(path.join(root, "packages")); const _private = listFolders(path.join(root, "private")); const allPackages = [ ...packages.map((p) => new Package(p, path.join(root, "packages", p))), ..._private.map((p) => new Package(p, path.join(root, "private", p))), ]; const [node, dispatcher, ...rest] = argv; const flags = rest.filter((f) => f.startsWith("--")); const options = { help: flags.includes("--help") || rest.length === 0, }; if (options.help) { console.info(` Usage: b [package query words] - [command query words] b cor - build,test matches to: (cd packages/core && yarn build && yarn test) Query words are substrings that match against the package name and npm scripts. The substrings must appear in order for a match. Match priority goes to whole-word matching and initial matching. `); return 0; } const nonFlags = rest.filter((_) => !_.startsWith("--")); const separatorIndex = rest.indexOf("-") !== -1 ? rest.indexOf("-") : rest.length; const query = nonFlags.slice(0, separatorIndex); const commands = nonFlags.slice(separatorIndex + 1); const multiCommands = commands .join(" ") .split(/,\s?/) .map((c) => c.split(" ")); const matchedPackages = findFolders(allPackages, ...query); if (matchedPackages.length === 0) { console.error("No matching packages for query:", query); return 0; } console.log("query:", ...query); console.log( "matches:", matchedPackages.map((_) => _.name) ); const [target] = matchedPackages; const targetPkgJson = require(path.join(target.location, "package.json")); for (const commands of multiCommands) { const matchedScripts = findScripts(Object.keys(targetPkgJson.scripts || {}), ...commands); if (commands.length === 0) { console.info("No commands entered"); return 0; } if (matchedScripts.length === 0) { console.error("No matching scripts for command query:", commands); return 0; } console.log("commands:", ...commands); console.log("matched commands:", matchedScripts); } for (const commands of multiCommands) { const matchedScripts = findScripts(Object.keys(targetPkgJson.scripts || {}), ...commands); const [script] = matchedScripts; const execute = async () => { const { spawnProcess } = require("../utils/spawn-process"); console.info("Running:", "yarn", script); console.info("Location:", target.location); await spawnProcess("yarn", [script], { cwd: target.location, stdio: "inherit", }); }; await execute(); } return 0; } main().catch(console.error); ================================================ FILE: scripts/cli-dispatcher/lib/Package.js ================================================ module.exports = class Package { constructor(name, location) { this.name = name; this.location = location; } }; ================================================ FILE: scripts/cli-dispatcher/lib/findFolders.js ================================================ const matcher = require("./matcher"); const matchSorter = require("./matchSorter"); /** * @param allPackages {Package[]} - list of all packages. * @param query {string} - query for the package list. * @returns the folders matching the args. */ module.exports = function findFolders(allPackages, ...query) { const folders = []; for (const pkg of allPackages) { const { name } = pkg; const isMatch = matcher(name, ...query); if (isMatch) { folders.push(pkg); } } return matchSorter(folders, ...query); }; ================================================ FILE: scripts/cli-dispatcher/lib/findScripts.js ================================================ const matcher = require("./matcher"); const matchSorter = require("./matchSorter"); /** * @param scripts {string[]} - scripts entry from a package.json file. * @param query {string} - query for the script names. * @returns the scripts matching the args. */ module.exports = function findScripts(scripts, ...query) { const matches = []; for (const script of scripts) { const isMatch = matcher(script, ...query); if (isMatch) { matches.push(script); } } return matchSorter(matches, ...query); }; ================================================ FILE: scripts/cli-dispatcher/lib/matchSorter.js ================================================ /** * @param {string[]} matches - unordered list of matches. * @param {...string} query - original query that generated matches * @returns {string[]} matches sorted by estimated priority. * * matches that start with the first query component are prioritized. * @example * (["build:types", "test"], "t") -> ["test", "build:types"] * * Matches that contain a full word match with the query are prioritized. * @example * (["presigner", "signer"], "signer") -> ["signer", "presigner"] * * Shorter matches are prioritized. */ module.exports = function matchSorter(matches, ...query) { return matches.sort((a, b) => { a = a.name || a; b = b.name || b; let score = 0; if (wholeWordMatch(a, ...query)) { score -= 100; } if (wholeWordMatch(b, ...query)) { score += 100; } if (wordInitialMatch(a, ...query)) { score -= 10; } if (wordInitialMatch(b, ...query)) { score += 10; } if (a.length < b.length) { score -= 1; } if (a.length > b.length) { score += 1; } return score; }); }; /** * @returns {boolean} subject has a word that starts with a query component. */ function wordInitialMatch(subject, ...query) { const _words = words(subject); return _words.filter((w) => undefined !== query.find((q) => w.startsWith(q))).length > 0; } /** * @returns {boolean} subject has a whole word match with part of the query. */ function wholeWordMatch(subject, ...query) { const _words = words(subject); return _words.filter((w) => query.includes(w)).length > 0; } /** * Splits the search subject into words. */ function words(subject) { return subject.split(/:|\s+|-|_/); } ================================================ FILE: scripts/cli-dispatcher/lib/matcher.js ================================================ /** * @param {string} subject - the string to test. * @param {string} query - the query. * @returns {boolean} whether all elements of query appear in-order in the subject string. * * @example * ("client-s3-control", "c s3 c") -> true */ module.exports = function matcher(subject, ...query) { let cursor = undefined; for (const q of query) { const searchString = subject.slice(cursor + 1); const index = searchString.indexOf(q); if (index === -1) { return false; } cursor = index; } return true; }; ================================================ FILE: scripts/cli-dispatcher/readme.md ================================================ ## CLI dispatcher These scripts provide CLI helpers to send shorthand commands to a matching package. ### Usage First, alias the script entry point. An example is provided in `./set-alias.sh`. Then, run the script with the new alias `b` with no arguments to see the help message detailing usage. ================================================ FILE: scripts/cli-dispatcher/set-alias.sh ================================================ #!/bin/bash # Set a command line alias to make running the dispatcher easier. alias b="node ./scripts/cli-dispatcher/index.js" alias r="node ./scripts/cli-dispatcher/workspace.js" ================================================ FILE: scripts/cli-dispatcher/workspace.js ================================================ #!/usr/bin/env node /** * This script runs files by filename in the root/workspace (unversioned) directory. * * @example * r dyn test * * would match to a file in /workspace/dynamodb/test.ts and execute it with esbuild runner. * * @example * r ssec * * would run "node /workspace/s3/ssec.mjs" * * The workspace directory is meant as a place to test short scripts * that make use of the packages built in the root monorepo workspace. */ const path = require("path"); const walk = require("../utils/walk"); const matcher = require("./lib/matcher"); const matchSorter = require("./lib/matchSorter"); const root = path.join(__dirname, "..", ".."); const workspaceFolder = path.join(root, "workspace"); const USE_NODE = 1; const USE_TYPESCRIPT = 2; const runnable = { ".js": USE_NODE, ".ts": USE_TYPESCRIPT, ".cjs": USE_NODE, ".mjs": USE_NODE }; const execute = async (cwd, exe, commands) => { const { spawnProcess } = require("../utils/spawn-process"); await spawnProcess(exe, [...commands], { cwd, stdio: "inherit", }); return; }; const [node, dispatcher, ...query] = process.argv; (async () => { if (query.length === 0) { console.log("No query given, use `r [substring words]`."); return; } const matches = []; for await (const f of walk(workspaceFolder, ["node_modules", ".yarn", ".git"])) { const ext = path.extname(f); if (ext in runnable) { if (matcher(f, ...query)) { matches.push(f); } } } if (matches.length === 0) { console.log("No matching workspace scripts."); return; } const selection = matchSorter(matches, ...query)[0]; const ext = path.extname(selection); console.log("Exec script:", selection); if (runnable[ext] === USE_NODE) { await execute(path.dirname(selection), "node", [selection]); } if (runnable[ext] === USE_TYPESCRIPT) { await execute(path.dirname(selection), "npx", ["esbuild-runner", selection]); } })(); ================================================ FILE: scripts/compilation/Inliner.js ================================================ const fs = require("node:fs"); const path = require("node:path"); const { spawnProcess } = require("./../utils/spawn-process"); const walk = require("./../utils/walk"); const rollup = require("rollup"); const { nodeResolve } = require("@rollup/plugin-node-resolve"); const json = require("@rollup/plugin-json"); const root = path.join(__dirname, "..", ".."); /** * * Inline a package as one dist file, preserves other files as re-export stubs, * preserves files with react-native variants as externals. * */ module.exports = class Inliner { constructor(pkg) { this.package = pkg; this.platform = "node"; this.submodulePackages = ["core"]; this.hasSubmodules = this.submodulePackages.includes(pkg); this.subfolder = "packages"; this.verbose = process.env.DEBUG || process.argv.includes("--debug"); this.packageDirectory = path.join(root, this.subfolder, pkg); this.outfile = path.join(root, this.subfolder, pkg, "dist-cjs", "index.js"); this.pkgJson = require(path.join(root, this.subfolder, this.package, "package.json")); /** * If the react entrypoint is another file entirely, then bail out of inlining. */ this.bailout = typeof this.pkgJson["react-native"] === "string"; } /** * step 0: delete the dist-cjs folder. */ async clean() { await spawnProcess("yarn", ["premove", "./dist-cjs", "tsconfig.cjs.tsbuildinfo"], { cwd: this.packageDirectory }); if (this.verbose) { console.log("Deleted ./dist-cjs in " + this.package); } return this; } /** * step 1: build the default tsc dist-cjs output with dispersed files. * we will need the files to be in place for stubbing. */ async tsc() { await spawnProcess("yarn", ["g:tsc", "-p", "tsconfig.cjs.json"], { cwd: this.packageDirectory }); if (this.verbose) { console.log("Finished recompiling ./dist-cjs in " + this.package); } this.canonicalExports = Object.keys(require(this.outfile)); return this; } /** * step 2: detect all variant files. * For submodule packages, we collect variant mappings per submodule to produce * fully-inlined browser/native bundles. * For non-submodule packages, we collect variant externals as before. */ async discoverVariants() { if (this.bailout) { console.log("Inliner bailout."); return this; } if (this.hasSubmodules) { // Submodule variant indexes are source files (index.browser.ts, index.native.ts). // No variant externals needed. this.variantExternals = []; this.variantMap = {}; return this; } // Non-submodule packages: original behavior. this.variantEntries = Object.entries(this.pkgJson["react-native"] ?? {}); for await (const file of walk(path.join(this.packageDirectory, "dist-cjs"))) { if (file.endsWith(".js") && fs.existsSync(file.replace(/\.js$/, ".native.js"))) { console.log("detected undeclared auto-variant", file); const canonical = file.replace(/(.*?)dist-cjs\//, "./dist-cjs/").replace(/\.js$/, ""); const variant = canonical.replace(/(.*?)(\.js)?$/, "$1.native$2"); this.variantEntries.push([canonical, variant]); } if ( file.endsWith(".js") && !file.endsWith(".browser.js") && fs.existsSync(file.replace(/\.js$/, ".browser.js")) ) { const canonical = file.replace(/(.*?)dist-cjs\//, "./dist-cjs/").replace(/\.js$/, ""); const variant = canonical.replace(/(.*?)(\.js)?$/, "$1.browser$2"); this.variantEntries.push([canonical, variant]); } } this.transitiveVariants = []; for (const [k, v] of this.variantEntries) { for (const variantFile of [k, String(v)]) { if (!variantFile.includes("dist-cjs/")) { continue; } const keyFile = path.join( this.packageDirectory, "dist-cjs", variantFile.replace(/(.*?)dist-cjs\//, "") + (variantFile.endsWith(".js") ? "" : ".js") ); const keyFileContents = fs.readFileSync(keyFile, "utf-8"); const requireStatements = keyFileContents.matchAll(/require\("(.*?)"\)/g); for (const requireStatement of requireStatements) { if (requireStatement[1]?.startsWith(".")) { const key = path .normalize(path.join(path.dirname(keyFile), requireStatement[1])) .replace(/(.*?)dist-cjs\//, "./dist-cjs/"); if (this.verbose) { console.log("Transitive variant file:", key); } const transitiveVariant = key.replace(/(.*?)dist-cjs\//, "").replace(/(\.js)?$/, ""); if (!this.transitiveVariants.includes(transitiveVariant)) { this.variantEntries.push([key, key]); this.transitiveVariants.push(transitiveVariant); } } } } } this.variantExternals = []; this.variantMap = {}; for (const [k, v] of this.variantEntries) { const prefix = "dist-cjs/"; const keyPrefixIndex = k.indexOf(prefix); if (keyPrefixIndex === -1) { continue; } const keyRelativePath = k.slice(keyPrefixIndex + prefix.length); const valuePrefixIndex = String(v).indexOf(prefix); const addJsExtension = (file) => (file.endsWith(".js") ? file : file + ".js"); if (valuePrefixIndex !== -1) { const valueRelativePath = String(v).slice(valuePrefixIndex + prefix.length); this.variantExternals.push(...[keyRelativePath, valueRelativePath].map(addJsExtension)); this.variantMap[keyRelativePath] = valueRelativePath; } else { this.variantExternals.push(addJsExtension(keyRelativePath)); this.variantMap[keyRelativePath] = v; } } this.variantExternals = [...new Set(this.variantExternals)]; return this; } /** * step 3: bundle the package index into dist-cjs/index.js except for node_modules * and also excluding any local files that have variants for react-native. * * For submodule packages, produces fully-inlined bundles per submodule: * - index.js (node/default) * - index.browser.js (with browser variants resolved) * - index.native.js (with native variants resolved, only if native variants exist) */ async bundle() { if (this.bailout) { return this; } const variantExternalsForRollup = this.variantExternals.map((variant) => variant.replace(/.js$/, "")); const entryPoint = path.join(root, this.subfolder, this.package, "dist-es", "index.js"); const makeInputOptions = (entry, externals, plugins = []) => { const externalityAssessments = {}; return { input: [entry], plugins: [...plugins, nodeResolve(), json()], onwarn(warning) { /* Circular imports are not an error in the language spec, but reasoning about the program and bundling becomes easier. For that reason let's avoid them. */ if (warning.code === "CIRCULAR_DEPENDENCY") { throw Error(warning.message); } }, external: (id) => { if (undefined !== externalityAssessments[id]) { return externalityAssessments[id]; } const relative = !!id.match(/^\.?\.?\//); if (!relative) { if (this.verbose) { console.log("EXTERN (pkg)", id); } return (externalityAssessments[id] = true); } if (id === entry) { return (externalityAssessments[id] = false); } const local = id.includes(`/dist-es/`) && ((id.includes(`/packages/`) && !id.includes(`packages/${this.package}/`)) || (id.includes(`/packages-internal/`) && !id.includes(`packages-internal/${this.package}/`))); if (local) { if (this.verbose) { console.log("EXTERN (local)", id); } return (externalityAssessments[id] = true); } for (const file of externals) { const idWithoutExtension = id.replace(/\.[tj]s$/, ""); const idBasename = path.basename(idWithoutExtension); if (idBasename === path.basename(file)) { if (this.verbose) { console.log("EXTERN (variant)", id); } return (externalityAssessments[id] = true); } } return (externalityAssessments[id] = false); }, }; }; const outputOptions = (dir) => ({ dir, format: "cjs", exports: "named", preserveModules: false, externalLiveBindings: false, }); // Bundle main index.js (no variants externalized for submodule packages). const mainExternals = this.hasSubmodules ? [] : variantExternalsForRollup; const bundle = await rollup.rollup(makeInputOptions(entryPoint, mainExternals)); await bundle.write(outputOptions(path.dirname(this.outfile))); await bundle.close(); if (this.hasSubmodules) { const submodulesDir = path.join(root, this.subfolder, this.package, "src", "submodules"); const submodules = fs .readdirSync(submodulesDir) .filter((d) => fs.lstatSync(path.join(submodulesDir, d)).isDirectory()); for (const submodule of submodules) { const distEsSubmoduleDir = path.join(root, this.subfolder, this.package, "dist-es", "submodules", submodule); const submoduleOutDir = path.join(root, this.subfolder, this.package, "dist-cjs", "submodules", submodule); // Remove all tsc-generated files in this submodule's dist-cjs folder. if (fs.existsSync(submoduleOutDir)) { fs.rmSync(submoduleOutDir, { recursive: true }); } fs.mkdirSync(submoduleOutDir, { recursive: true }); // Bundle index.js (node/default). const nodeBundle = await rollup.rollup(makeInputOptions(path.join(distEsSubmoduleDir, "index.js"), [])); await nodeBundle.write(outputOptions(submoduleOutDir)); await nodeBundle.close(); // Bundle index.browser.js if the source file exists. const browserEntry = path.join(distEsSubmoduleDir, "index.browser.js"); if (fs.existsSync(browserEntry)) { const browserBundle = await rollup.rollup(makeInputOptions(browserEntry, [])); await browserBundle.write({ ...outputOptions(submoduleOutDir), entryFileNames: "index.browser.js", }); await browserBundle.close(); } // Bundle index.native.js if the source file exists. const nativeEntry = path.join(distEsSubmoduleDir, "index.native.js"); if (fs.existsSync(nativeEntry)) { const nativeBundle = await rollup.rollup(makeInputOptions(nativeEntry, [])); await nativeBundle.write({ ...outputOptions(submoduleOutDir), entryFileNames: "index.native.js", }); await nativeBundle.close(); } } } return this; } /** * step 4: delete all existing dist-cjs files except the index.js file * and variant externals. These files were inlined into the bundle. */ async cleanupInlinedFiles() { if (this.bailout || this.hasSubmodules) { return this; } for await (const file of walk(path.join(this.packageDirectory, "dist-cjs"))) { const relativePath = file.replace(path.join(this.packageDirectory, "dist-cjs"), "").slice(1); if (relativePath.includes("submodules")) { continue; } if (!file.endsWith(".js")) { continue; } if (relativePath === "index.js") { continue; } if (this.variantExternals.find((external) => relativePath.endsWith(external))) { continue; } if (fs.readFileSync(file, "utf-8").includes(`Object.defineProperty(exports, "__esModule", { value: true });`)) { fs.rmSync(file); } const files = fs.readdirSync(path.dirname(file)); if (files.length === 0) { fs.rmdirSync(path.dirname(file)); } } return this; } /** * step 5: rewrite variant external imports to correct path. * For submodule packages, this is a no-op since all variants are fully inlined. */ async fixVariantImportPaths() { if (this.bailout || this.hasSubmodules) { return this; } this.indexContents = fs.readFileSync(this.outfile, "utf-8"); const fixImportsForFile = (contents, remove = "") => { for (const variant of Object.keys(this.variantMap)) { const basename = path.basename(variant).replace(/.js$/, ""); const dirname = path.dirname(variant); const find = new RegExp(`require\\("\\.(.*?)/${basename}"\\)`, "g"); const replace = `require("./${dirname}/${basename}")`.replace(remove, ""); contents = contents.replace(find, replace); if (this.verbose) { console.log("Replacing", find, "with", replace, "removed=", remove); } } return contents; }; if (this.verbose) { console.log("Fixing imports for main file", path.dirname(this.outfile)); } this.indexContents = fixImportsForFile(this.indexContents); fs.writeFileSync(this.outfile, this.indexContents, "utf-8"); return this; } /** * step 6: validate the output. * For submodule packages, validates that each submodule index.js is requireable * and that variant bundles exist where expected. */ async validate() { if (this.bailout) { return this; } if (this.hasSubmodules) { const submodulesDir = path.join(this.packageDirectory, "dist-cjs", "submodules"); const submodules = fs.readdirSync(submodulesDir); for (const submodule of submodules) { const submoduleDir = path.join(submodulesDir, submodule); for (const file of fs.readdirSync(submoduleDir)) { if (!file.endsWith(".js")) continue; const filePath = path.join(submoduleDir, file); try { require(filePath); } catch (e) { console.error(`File ${filePath} has import errors.`); throw e; } } } // Validate main index.js is requireable. try { require(this.outfile); } catch (e) { console.error(`File ${this.outfile} has import errors.`); throw e; } return this; } // Non-submodule validation (original behavior). this.indexContents = fs.readFileSync(this.outfile, "utf-8"); const externalsToCheck = new Set( Object.keys(this.variantMap) .filter((variant) => !this.transitiveVariants.includes(variant) && !variant.endsWith("index")) .map((variant) => path.basename(variant).replace(/.js$/, "")) ); const inspect = (contents) => { for (const line of contents.split("\n")) { if (line.includes("require(")) { const checkOrder = [...externalsToCheck].sort().reverse(); for (const external of checkOrder) { if (line.includes(external)) { if (this.verbose) { console.log("Inline index confirmed require() for variant external:", external); } externalsToCheck.delete(external); } } } } }; inspect(this.indexContents); if (externalsToCheck.size) { throw new Error( "require() statements for the following variant externals: " + [...externalsToCheck].join(", ") + " were not found in the index." ); } // check ESM compat. const tmpFileContents = `import assert from "node:assert";\n \n const namingExceptions = [\n "paginateOperation", // name for all paginators.\n "blobReader" // name collision between chunked-blob-reader and chunked-blob-reader-native.\n ];\n ` + this.canonicalExports .filter((sym) => !sym.includes(":")) .map((sym) => { if ( [ "getDefaultClientConfiguration", // renamed as an alias "generateIdempotencyToken", // sometimes called v4 "expectInt", // aliased to expectLong "handleFloat", // aliased to limitedParseDouble "limitedParseFloat", // aliased to limitedParseDouble "strictParseFloat", // aliased to strictParseDouble "strictParseInt", // aliased to strictParseLong "randomUUID", // bound function from crypto.randomUUID.bind(crypto) "blobReaderNative", // re-exported alias of blobReader from chunked-blob-reader-native "blobReader", // name collision in bundle between chunked-blob-reader variants ].includes(sym) ) { return `import { ${sym} } from "${this.pkgJson.name}";`; } return `import { ${sym} } from "${this.pkgJson.name}";\nif (typeof ${sym} === "function") {\n if (${sym}.name !== "${sym}" && !namingExceptions.includes(${sym}.name)) {\n throw new Error(${sym}.name + " does not equal expected ${sym}.")\n }\n} \n `; }) .join("\n"); fs.writeFileSync(path.join(__dirname, "tmp", this.package + ".mjs"), tmpFileContents, "utf-8"); await spawnProcess("node", [path.join(__dirname, "tmp", this.package + ".mjs")]); if (this.verbose) { console.log("ESM compatibility verified."); } fs.rmSync(path.join(__dirname, "tmp", this.package + ".mjs")); return this; } }; ================================================ FILE: scripts/compilation/tmp/.gitignore ================================================ *.mjs ================================================ FILE: scripts/example.js ================================================ /** * Example script for iterating packages. */ const fs = require("node:fs"); const path = require("node:path"); const root = path.join(__dirname, ".."); const packages = path.join(root, "packages"); for (const folder of fs.readdirSync(packages)) { const pkgJson = require(path.join(packages, folder, "package.json")); } ================================================ FILE: scripts/inline.js ================================================ /** * * Inline a package as one dist file. * */ const fs = require("fs"); const path = require("path"); const Inliner = require("./compilation/Inliner"); const root = path.join(__dirname, ".."); const package = process.argv[2]; if (!package) { /** * If no package is selected, this script sets all build:cjs scripts to * use this inliner script instead of only tsc. */ const packages = fs.readdirSync(path.join(root, "packages")); for (const pkg of packages) { const pkgJsonFilePath = path.join(root, "packages", pkg, "package.json"); const pkgJson = require(pkgJsonFilePath); delete pkgJson.scripts["build:cjs"]; delete pkgJson.scripts["build:es"]; pkgJson.scripts["build:es:cjs"] = `yarn g:tsc -p tsconfig.es.json && node ../../scripts/inline ${pkg}`; pkgJson.scripts.build = `concurrently 'yarn:build:types' 'yarn:build:es:cjs'`; const scripts = {}; const keys = Object.keys(pkgJson.scripts); for (const key of keys.sort()) { scripts[key] = pkgJson.scripts[key]; } pkgJson.scripts = scripts; fs.writeFileSync(pkgJsonFilePath, JSON.stringify(pkgJson, null, 2)); } } else { (async () => { const inliner = new Inliner(package); await inliner.clean(); await inliner.tsc(); await inliner.discoverVariants(); await inliner.bundle(); await inliner.cleanupInlinedFiles(); await inliner.fixVariantImportPaths(); await inliner.validate(); })(); } ================================================ FILE: scripts/package-json-enforcement.js ================================================ const { error } = require("console"); const fs = require("fs"); const path = require("path"); /** * This enforcement is not here to prevent adoption of newer * package standards such as "exports". It is to ensure consistency in the * monorepo until the time comes for those changes. * ---- * * The script will enforce several things on a package json object: * * - main and module must be defined. * In the future this may change. Browser is more standard than module, and * exports may be used for ESM (.mjs) support. * * - If a react-native entry exists, browser and react native entries must be of the * same type (object replacement directives or string entry point). * If either is not defined, both must not be defined. * * - when react-native has file replacement directives, it must include both * CJS and ESM dist replacements. * * - exports must not be defined unless the package name is core. */ module.exports = function (pkgJsonFilePath, overwrite = false) { const errors = []; const pkgJson = require(pkgJsonFilePath); if (!pkgJson.name.endsWith("/core")) { if ("exports" in pkgJson) { errors.push(`${pkgJson.name} must not have an 'exports' field.`); if (overwrite) { delete pkgJson.exports; } } } for (const requiredField of ["main", "module"]) { if (!(requiredField in pkgJson)) { errors.push(`${requiredField} field missing in ${pkgJson.name}`); if (overwrite) { switch (requiredField) { case "main": pkgJson[requiredField] = "./dist-cjs/index.js"; break; case "module": pkgJson[requiredField] = pkgJson.main.replace("dist-cjs", "dist-es"); break; } } } } if (typeof pkgJson.browser !== typeof pkgJson["react-native"]) { errors.push(`browser and react-native fields are different in ${pkgJson.name}`); } if (!pkgJson.files) { errors.push(`no files entry in ${pkgJson.name}`); } if (typeof pkgJson.browser === "object" && typeof pkgJson["react-native"] === "object") { // Skip canonicalization for packages with submodules — they manage their own fields. const pkgDirEarly = path.dirname(pkgJsonFilePath); const hasSubmodulesEarly = fs.existsSync(path.join(pkgDirEarly, "src", "submodules")); if (!hasSubmodulesEarly) { const browserCanonical = Object.entries(pkgJson.browser).reduce((acc, [k, v]) => { if (!k.includes("dist-cjs/") || typeof v === "boolean") { acc[k] = v; } return acc; }, {}); if (Object.keys(browserCanonical).length !== Object.keys(pkgJson.browser).length) { errors.push(`${pkgJson.name} browser field is incomplete.`); if (overwrite) { pkgJson.browser = browserCanonical; } } const reactNativeCanonical = [ ...new Set([ ...Object.entries(pkgJson["react-native"]).map(([k, v]) => [ k.replace("dist-cjs", "dist-es"), typeof v === "string" ? v.replace("dist-cjs", "dist-es") : v, ]), ...Object.entries(pkgJson["react-native"]).map(([k, v]) => [ k.replace("dist-es", "dist-cjs"), typeof v === "string" ? v.replace("dist-es", "dist-cjs") : v, ]), ]), ].reduce((acc, [k, v]) => { acc[k] = v; return acc; }, {}); if (Object.keys(reactNativeCanonical).length !== Object.keys(pkgJson["react-native"]).length) { errors.push(`${pkgJson.name} react-native field is incomplete.`); if (overwrite) { pkgJson["react-native"] = reactNativeCanonical; } } } else { // For submodule packages, validate that index.browser.ts/index.native.ts are declared. const submodulesDir = path.join(pkgDirEarly, "src", "submodules"); const browserField = pkgJson.browser || {}; const reactNativeField = pkgJson["react-native"] || {}; let didModify = false; for (const sub of fs.readdirSync(submodulesDir)) { const subPath = path.join(submodulesDir, sub); if (!fs.lstatSync(subPath).isDirectory()) { continue; } const esIndex = `./dist-es/submodules/${sub}/index.js`; const cjsIndex = `./dist-cjs/submodules/${sub}/index.js`; if (fs.existsSync(path.join(subPath, "index.browser.ts"))) { const esBrowserExpected = `./dist-es/submodules/${sub}/index.browser.js`; // browser field: re-path dist-es only. if (browserField[esIndex] !== esBrowserExpected) { errors.push(`${pkgJson.name} browser["${esIndex}"] should be "${esBrowserExpected}"`); if (overwrite) { browserField[esIndex] = esBrowserExpected; didModify = true; } } // Conditional exports must have "browser" condition pointing to dist-es. const exportEntry = pkgJson.exports?.[`./${sub}`]; if (exportEntry) { const esBrowser = esBrowserExpected; const cjsBrowser = esBrowser.replace("dist-es", "dist-cjs"); const expectedBrowser = { import: esBrowser, require: cjsBrowser }; if (JSON.stringify(exportEntry.browser) !== JSON.stringify(expectedBrowser)) { errors.push(`${pkgJson.name} exports["./${sub}"].browser should be ${JSON.stringify(expectedBrowser)}`); if (overwrite) { exportEntry.browser = expectedBrowser; } } // react-native condition: native variant if exists, otherwise browser fallback. const hasNative = fs.existsSync(path.join(subPath, "index.native.ts")); const esRn = hasNative ? `./dist-es/submodules/${sub}/index.native.js` : esBrowser; const cjsRn = esRn.replace("dist-es", "dist-cjs"); const expectedRn = { import: esRn, require: cjsRn }; if (JSON.stringify(exportEntry["react-native"]) !== JSON.stringify(expectedRn)) { errors.push(`${pkgJson.name} exports["./${sub}"]["react-native"] should be ${JSON.stringify(expectedRn)}`); if (overwrite) { exportEntry["react-native"] = expectedRn; } } } } if (fs.existsSync(path.join(subPath, "index.native.ts"))) { const esNativeExpected = `./dist-es/submodules/${sub}/index.native.js`; const cjsNativeExpected = `./dist-cjs/submodules/${sub}/index.native.js`; // react-native field: re-path both dist-es and dist-cjs. if (reactNativeField[esIndex] !== esNativeExpected) { errors.push(`${pkgJson.name} react-native["${esIndex}"] should be "${esNativeExpected}"`); if (overwrite) { reactNativeField[esIndex] = esNativeExpected; didModify = true; } } if (reactNativeField[cjsIndex] !== cjsNativeExpected) { errors.push(`${pkgJson.name} react-native["${cjsIndex}"] should be "${cjsNativeExpected}"`); if (overwrite) { reactNativeField[cjsIndex] = cjsNativeExpected; didModify = true; } } } else if (fs.existsSync(path.join(subPath, "index.browser.ts"))) { // No native variant — react-native falls back to browser for both dist-es and dist-cjs. const esBrowserExpected = `./dist-es/submodules/${sub}/index.browser.js`; const cjsBrowserExpected = `./dist-cjs/submodules/${sub}/index.browser.js`; if (reactNativeField[esIndex] !== esBrowserExpected) { errors.push(`${pkgJson.name} react-native["${esIndex}"] should be "${esBrowserExpected}" (fallback to browser)`); if (overwrite) { reactNativeField[esIndex] = esBrowserExpected; didModify = true; } } if (reactNativeField[cjsIndex] !== cjsBrowserExpected) { errors.push(`${pkgJson.name} react-native["${cjsIndex}"] should be "${cjsBrowserExpected}" (fallback to browser)`); if (overwrite) { reactNativeField[cjsIndex] = cjsBrowserExpected; didModify = true; } } } } // Enforce condition key ordering in exports. const expectedOrder = ["types", "react-native", "browser", "module", "node", "import", "require", "default"]; for (const [exportPath, exportEntry] of Object.entries(pkgJson.exports)) { if (typeof exportEntry !== "object" || exportEntry === null) { continue; } const keys = Object.keys(exportEntry); const ordered = keys.slice().sort((a, b) => { const ai = expectedOrder.indexOf(a); const bi = expectedOrder.indexOf(b); return (ai === -1 ? 999 : ai) - (bi === -1 ? 999 : bi); }); if (JSON.stringify(keys) !== JSON.stringify(ordered)) { errors.push(`${pkgJson.name} exports["${exportPath}"] keys should be ordered: ${ordered.join(", ")}`); if (overwrite) { const reordered = {}; for (const k of ordered) { reordered[k] = exportEntry[k]; } pkgJson.exports[exportPath] = reordered; } } } if (didModify) { pkgJson.browser = browserField; pkgJson["react-native"] = reactNativeField; } } } // Validate variant replacement directives match source files. // Skip for packages with submodules — they use index-level variant files instead. const pkgDir = path.dirname(pkgJsonFilePath); const srcDir = path.join(pkgDir, "src"); const hasSubmodules = fs.existsSync(path.join(srcDir, "submodules")); if (fs.existsSync(srcDir) && !hasSubmodules) { const browserField = pkgJson.browser || {}; const reactNativeField = pkgJson["react-native"] || {}; let didModify = false; // Check that every .browser.ts / .native.ts source file has directives. const walkSync = (dir) => { const results = []; for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { const fullPath = path.join(dir, entry.name); if (entry.isDirectory()) { results.push(...walkSync(fullPath)); } else { results.push(fullPath); } } return results; }; for (const file of walkSync(srcDir)) { if (file.match(/\.(browser|native)\.ts$/) && !file.match(/\.spec\.|\.integ\./)) { const relativePath = file.replace(srcDir, "").replace(/\.ts$/, ""); const canonicalPath = relativePath.replace(/\.(browser|native)$/, ""); const variant = relativePath.match(/\.(browser|native)$/)[1]; const esCanonical = `./dist-es${canonicalPath}`; const esVariant = `./dist-es${relativePath}`; const cjsCanonical = `./dist-cjs${canonicalPath}`; const cjsVariant = `./dist-cjs${relativePath}`; // For react-native, .native takes precedence over .browser. const hasNativeVariant = variant === "browser" && fs.existsSync(file.replace(/\.browser\.ts$/, ".native.ts")); if (variant === "browser") { if (browserField[esCanonical] !== esVariant) { errors.push(`${pkgJson.name} browser["${esCanonical}"] should be "${esVariant}"`); if (overwrite) { browserField[esCanonical] = esVariant; didModify = true; } } if (!hasNativeVariant) { if (reactNativeField[esCanonical] !== esVariant) { errors.push(`${pkgJson.name} react-native["${esCanonical}"] should be "${esVariant}"`); if (overwrite) { reactNativeField[esCanonical] = esVariant; didModify = true; } } if (reactNativeField[cjsCanonical] !== cjsVariant) { errors.push(`${pkgJson.name} react-native["${cjsCanonical}"] should be "${cjsVariant}"`); if (overwrite) { reactNativeField[cjsCanonical] = cjsVariant; didModify = true; } } } } else if (variant === "native") { if (reactNativeField[esCanonical] !== esVariant) { errors.push(`${pkgJson.name} react-native["${esCanonical}"] should be "${esVariant}"`); if (overwrite) { reactNativeField[esCanonical] = esVariant; didModify = true; } } if (reactNativeField[cjsCanonical] !== cjsVariant) { errors.push(`${pkgJson.name} react-native["${cjsCanonical}"] should be "${cjsVariant}"`); if (overwrite) { reactNativeField[cjsCanonical] = cjsVariant; didModify = true; } } } } } if (didModify) { if (Object.keys(browserField).length) { pkgJson.browser = browserField; } if (Object.keys(reactNativeField).length) { pkgJson["react-native"] = reactNativeField; } } // Verify each existing directive points to an actual source file. for (const [field, directives] of [ ["browser", pkgJson.browser], ["react-native", pkgJson["react-native"]], ]) { if (typeof directives !== "object" || directives === null) { continue; } for (const [canonical, variant] of Object.entries(directives)) { if (typeof variant === "boolean") { continue; } if (!variant.startsWith("./")) { continue; } const variantSrcFile = path.join( pkgDir, variant.replace(/^\.\/dist-(es|cjs)/, "src").replace(/(\.js)?$/, ".ts") ); if (!fs.existsSync(variantSrcFile)) { errors.push( `${pkgJson.name} ${field}["${canonical}"] -> "${variant}" has no corresponding source file (expected ${variantSrcFile})` ); } } } } if (overwrite && errors.length) { fs.writeFileSync(pkgJsonFilePath, JSON.stringify(pkgJson, null, 2) + "\n"); } return errors; }; ================================================ FILE: scripts/post-protocol-test-codegen.js ================================================ /** * * Script to be run after protocol test codegen to set the smithy dependencies * to workspace:^ * */ const path = require("node:path"); const fs = require("node:fs"); const root = path.join(__dirname, ".."); const private = path.join(root, "private"); const privatePackages = fs.readdirSync(private); for (const dir of privatePackages) { const pkgJsonPath = path.join(private, dir, "package.json"); if (fs.existsSync(pkgJsonPath)) { const pkgJson = require(pkgJsonPath); for (const dep in pkgJson.dependencies ?? {}) { if (dep.startsWith("@smithy/")) { pkgJson.dependencies[dep] = "workspace:^"; } } for (const dep in pkgJson.devDependencies ?? {}) { if (dep.startsWith("@smithy/")) { pkgJson.devDependencies[dep] = "workspace:^"; } } fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n"); } } ================================================ FILE: scripts/retry.js ================================================ #!/usr/bin/env node const path = require("node:path"); const { spawnProcess } = require("./utils/spawn-process"); const [command, ...args] = process.argv.slice(process.argv.indexOf("--") + 1); (async () => { const maxAttempts = 3; let attempt = 1; while (attempt++ <= maxAttempts) { try { await spawnProcess(command, args, { stdio: "inherit", cwd: path.join(__dirname, ".."), }); return; } catch (e) { console.error("Command exited non-zero:", command, ...args); console.error(e); console.log(`Starting attempt: ${attempt}`); } } process.exit(1); })(); ================================================ FILE: scripts/runtime-dep-version-check.js ================================================ #!/usr/bin/env node /** * This script checks the declared dependencies throughout the entire repo * and throws an error if there is are more than one version of a dependency. * * @example * ``` * There is more than one version of a declared dependency * @smithy/middleware-endpoint { * '^1.0.2': '350 locations', * '^1.0.1': [ * '@aws-sdk/lib-storage', * '@aws-sdk/middleware-sdk-ec2', * '@aws-sdk/middleware-sdk-rds', * '@aws-sdk/s3-presigned-post', * '@aws-sdk/s3-request-presigner' * ] * } * ``` */ const fs = require("fs"); const path = require("path"); const root = path.join(__dirname, ".."); const packages = fs.readdirSync(path.join(root, "packages")); const nonClientPackages = [...packages.map((p) => path.join(root, "packages", p))]; const deps = { /* @namespace/name: { [version]: [location, location] } */ }; readPackages(nonClientPackages); checkVersions(); function checkVersions() { const errors = []; for (const [pkg, versions] of Object.entries(deps)) { const versionCount = Object.keys(versions).length; if (versionCount > 1) { console.error("There is more than one version of a declared dependency."); console.error( pkg, Object.entries(versions).reduce((acc, [version, locations]) => { acc[version] = locations.length > 20 ? `${locations.length} locations` : locations; return acc; }, {}) ); errors.push(pkg); } } if (errors.length) { const violations = errors.join(", "); throw new Error(violations + " have inconsistent declared versions."); } } function readPackages(packages) { for (const pkg of packages) { const pkgJson = require(path.join(pkg, "package.json")); const { dependencies = {}, devDependencies = {} } = pkgJson; for (const [name, version] of Object.entries(dependencies)) { if (version.startsWith("file:")) { continue; } deps[name] = deps[name] ?? {}; deps[name][version] = deps[name][version] ?? []; deps[name][version].push(pkgJson.name); } for (const [name, version] of Object.entries(devDependencies)) { if (version.startsWith("file:")) { continue; } deps[name] = deps[name] ?? {}; deps[name][version] = deps[name][version] ?? []; deps[name][version].push(pkgJson.name); } } } ================================================ FILE: scripts/set-engines.js ================================================ const fs = require("node:fs"); const path = require("node:path"); const packages = fs.readdirSync(path.join(__dirname, "..", "packages")); for (const pkgFolder of packages) { const pkgJsonPath = path.join(__dirname, "..", "packages", pkgFolder, "package.json"); const pkgJson = require(pkgJsonPath); pkgJson["engines"] = { node: ">=18.0.0", }; fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n"); } ================================================ FILE: scripts/utils/list-folders.js ================================================ const fs = require("node:fs"); const path = require("node:path"); /** * @param dir - directory. * @param basenameOnly - if true, return only the basename of the subdirectories * @returns {string[]} list of full-paths of subdirectories (not files) in the given directory. */ function listFolders(dir, basenameOnly = true) { const folders = []; for (const fileSystemEntry of fs.readdirSync(dir, { withFileTypes: true })) { if (fileSystemEntry.isDirectory()) { if (basenameOnly) { folders.push(fileSystemEntry.name); } else { folders.push(path.join(dir, fileSystemEntry.name)); } } } return folders; } module.exports = { listFolders, }; ================================================ FILE: scripts/utils/spawn-process.js ================================================ // @ts-check const { spawn } = require("child_process"); const spawnProcess = async (command, args = [], options = {}) => { const childProcess = spawn(command, args, options); childProcess.stdout?.pipe(process.stdout); childProcess.stderr?.pipe(process.stderr); return new Promise((resolve, reject) => { childProcess.on("error", reject); childProcess.on("exit", (code, signal) => code === 0 ? resolve(0) : reject(`${command} failed with { code: ${code}, signal: ${signal} }`) ); }); }; module.exports = { spawnProcess }; ================================================ FILE: scripts/utils/walk.js ================================================ const fs = require("node:fs"); const path = require("node:path"); module.exports = async function* walk(dir, ignore = []) { for await (const d of await fs.promises.opendir(dir)) { const entry = path.join(dir, d.name); if (ignore.find((ignored) => entry.includes(ignored))) { continue; } if (d.isDirectory()) { yield* walk(entry, ignore); } else if (d.isFile()) { yield entry; } } }; ================================================ FILE: scripts/validation/api-snapshot-validation.js ================================================ #!/usr/bin/env node /** This script uses the JSON file api-snapshot/api.json to validate that previously present symbols are still exported by the packages within the assessed group. Data may only be deleted from api.json in an intentional backwards-incompatible change. */ const fs = require("node:fs"); const path = require("node:path"); const ts = require("typescript"); const root = path.join(__dirname, "..", ".."); const dataPath = path.join(root, "api-snapshot", "api.json"); const api = require(dataPath); api.$schema = "https://json-schema.org/draft/2020-12/schema"; const packageDirs = fs.readdirSync(path.join(root, "packages")).map((f) => path.join(root, "packages", f)); const errors = []; // Collect all .d.ts entry points upfront. const dtsEntries = []; // { dtsPath, name, version, cjsPath, exportConfig? } for (const packageRoot of packageDirs) { const pkgJsonPath = path.join(packageRoot, "package.json"); const cjsPath = path.join(packageRoot, "dist-cjs", "index.js"); if (fs.existsSync(pkgJsonPath) && fs.existsSync(cjsPath)) { const packageJson = require(pkgJsonPath); const { name, version } = packageJson; const dtsPath = path.join(packageRoot, packageJson.types || "dist-types/index.d.ts"); if (fs.existsSync(dtsPath)) { dtsEntries.push({ dtsPath, name, version, cjsPath }); } if (packageJson.exports) { for (const [exportPath, exportConfig] of Object.entries(packageJson.exports)) { if (exportPath === "." || exportPath === "./package.json") continue; const subCjsPath = path.join(packageRoot, exportConfig.require || exportConfig.node); const subDtsPath = path.join(packageRoot, exportConfig.types || ""); if (fs.existsSync(subCjsPath) && fs.existsSync(subDtsPath)) { const subName = `${name}/${exportPath.replace("./", "")}`; dtsEntries.push({ dtsPath: subDtsPath, name: subName, version, cjsPath: subCjsPath }); } } } } } // Create a single TypeScript program with all entry points. const submodulesDir = path.join(root, "packages", "core", "src", "submodules"); const submodulePaths = {}; for (const dir of fs.readdirSync(submodulesDir, { withFileTypes: true })) { if (dir.isDirectory()) { submodulePaths[`@smithy/core/${dir.name}`] = [`packages/core/dist-types/submodules/${dir.name}/index.d.ts`]; } } const allDtsPaths = dtsEntries.map((e) => e.dtsPath); const program = ts.createProgram(allDtsPaths, { moduleResolution: ts.ModuleResolutionKind.NodeJs, baseUrl: root, paths: { ...submodulePaths, "@smithy/*": ["packages/*/dist-types"], }, }); const checker = program.getTypeChecker(); /** * Extract type-only exports from a .d.ts entry point using the shared program. */ function getTypeExports(dtsPath) { const typeExports = new Map(); const sourceFile = program.getSourceFile(dtsPath); if (!sourceFile) return typeExports; const moduleSymbol = checker.getSymbolAtLocation(sourceFile); if (!moduleSymbol) return typeExports; const exports = checker.getExportsOfModule(moduleSymbol); for (const sym of exports) { let resolved = sym; if (resolved.flags & ts.SymbolFlags.Alias) { resolved = checker.getAliasedSymbol(resolved); } const flags = resolved.flags; const isTypeOnly = !!(flags & ts.SymbolFlags.Interface) || !!(flags & ts.SymbolFlags.TypeAlias) || (!!(flags & ts.SymbolFlags.Enum) && !(flags & ts.SymbolFlags.RegularEnum)); if (isTypeOnly) { let kind = "type"; if (flags & ts.SymbolFlags.Interface) { kind = "type(interface)"; } else if (flags & ts.SymbolFlags.TypeAlias) { const type = checker.getDeclaredTypeOfSymbol(resolved); if (type.isUnion()) kind = "type(union)"; else if (type.isIntersection()) kind = "type(intersection)"; else if (type.flags & ts.TypeFlags.String) kind = "type(string)"; else if (type.flags & ts.TypeFlags.Number) kind = "type(number)"; else if (type.flags & ts.TypeFlags.Boolean) kind = "type(boolean)"; else if (type.flags & ts.TypeFlags.Object) kind = "type(object)"; else kind = "type(alias)"; } else { kind = "type(?)"; } typeExports.set(sym.getName(), kind); } } return typeExports; } // Process each entry. for (const { dtsPath, name, version, cjsPath } of dtsEntries) { const module = require(cjsPath); const typeExports = getTypeExports(dtsPath); checkModule(name, version, module, typeExports); } function checkModule(name, version, module, typeExports) { for (const key of Object.keys(module)) { if (module[key] === undefined) { console.warn(`symbol ${key} in ${name}@${version} has a value of undefined.`); } } // Merge runtime keys and type-only keys into a combined snapshot. const allSymbols = new Set([...Object.keys(module), ...typeExports.keys()]); if (!api[name]) { api[name] = {}; for (const key of allSymbols) { api[name][key] = key in module ? typeof module[key] : typeExports.get(key); } } else { for (const symbol of [...new Set([...Object.keys(api[name]), ...allSymbols])]) { const inRuntime = symbol in module; const inTypes = typeExports.has(symbol); const inSnapshot = symbol in api[name]; const inCurrent = inRuntime || inTypes; if (inCurrent && !inSnapshot) { const kind = inRuntime ? typeof module[symbol] : typeExports.get(symbol); errors.push(`You must commit changes in api.json adding ${symbol} (${kind}) to ${name}.`); api[name][symbol] = kind; } if (!inCurrent && inSnapshot) { errors.push(`Symbol [${symbol}] is missing from ${name}, (${api[name][symbol]}).`); } if (inCurrent && inSnapshot) { const expectedKind = api[name][symbol]; const actualKind = inRuntime ? typeof module[symbol] : typeExports.get(symbol); const baseExpectedKind = expectedKind.replace("(node-only)", ""); if (baseExpectedKind !== actualKind) { errors.push( `Symbol [${symbol}] has a different type than expected in ${name}, actual=${actualKind} expected=${expectedKind}.` ); } } } } } // Validate submodule variant indexes export the same symbols as the node canonical. const coreDir = path.join(root, "packages", "core"); // Create separate TS programs for browser and native variant type checking. function createVariantProgram(variant) { const variantDtsPaths = []; for (const dir of fs.readdirSync(submodulesDir, { withFileTypes: true })) { if (!dir.isDirectory()) continue; const variantDts = path.join(coreDir, "dist-types", "submodules", dir.name, `index.${variant}.d.ts`); const nodeDts = path.join(coreDir, "dist-types", "submodules", dir.name, "index.d.ts"); variantDtsPaths.push(fs.existsSync(variantDts) ? variantDts : nodeDts); } return ts.createProgram(variantDtsPaths, { moduleResolution: ts.ModuleResolutionKind.NodeJs, baseUrl: root, paths: { ...submodulePaths, "@smithy/*": ["packages/*/dist-types"], }, }); } const variantPrograms = { browser: createVariantProgram("browser"), native: createVariantProgram("native"), }; for (const dir of fs.readdirSync(submodulesDir, { withFileTypes: true })) { if (!dir.isDirectory()) continue; const sub = dir.name; const nodeIndex = path.join(coreDir, "dist-cjs", "submodules", sub, "index.js"); if (!fs.existsSync(nodeIndex)) continue; const nodeModule = require(nodeIndex); const snapshotName = `@smithy/core/${sub}`; const nodeTypeExports = getTypeExports(path.join(coreDir, "dist-types", "submodules", sub, "index.d.ts")); for (const variant of ["browser", "native"]) { const variantIndex = path.join(coreDir, "dist-cjs", "submodules", sub, `index.${variant}.js`); if (!fs.existsSync(variantIndex)) continue; const variantModule = require(variantIndex); // Check runtime exports match 1:1. for (const key of Object.keys(nodeModule)) { if (!(key in variantModule)) { errors.push(`Symbol [${key}] is missing from ${snapshotName} index.${variant}.js`); } } for (const key of Object.keys(variantModule)) { if (!(key in nodeModule)) { errors.push(`Symbol [${key}] in ${snapshotName} index.${variant}.js is not in the node index`); } } // Check type exports match 1:1. const variantDts = path.join(coreDir, "dist-types", "submodules", sub, `index.${variant}.d.ts`); if (fs.existsSync(variantDts)) { const variantChecker = variantPrograms[variant].getTypeChecker(); const variantSourceFile = variantPrograms[variant].getSourceFile(variantDts); if (variantSourceFile) { const variantModuleSymbol = variantChecker.getSymbolAtLocation(variantSourceFile); const variantTypeNames = new Set( variantModuleSymbol ? variantChecker.getExportsOfModule(variantModuleSymbol).map((s) => s.getName()) : [] ); for (const [typeName] of nodeTypeExports) { if (!variantTypeNames.has(typeName)) { errors.push(`Type [${typeName}] is missing from ${snapshotName} index.${variant}.d.ts`); } } for (const typeName of variantTypeNames) { if (!nodeTypeExports.has(typeName) && !(typeName in nodeModule)) { errors.push(`Type [${typeName}] in ${snapshotName} index.${variant}.d.ts is not in the node index`); } } } } // Mark node-only symbols (Symbol.for("node-only") in variant) in the snapshot. const nodeOnlySymbol = Symbol.for("node-only"); for (const key of Object.keys(variantModule)) { if (variantModule[key] === nodeOnlySymbol && nodeModule[key] != null && api[snapshotName]) { const baseKind = typeof nodeModule[key]; const nodeOnlyKind = `${baseKind}(node-only)`; api[snapshotName][key] = nodeOnlyKind; } } } } const sorted = Object.fromEntries( Object.entries(api) .sort(([a], [b]) => a.localeCompare(b)) .map(([k, v]) => [k, typeof v === "object" && v !== null ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b))) : v] ) ); fs.writeFileSync(dataPath, JSON.stringify(sorted, null, 2)); if (errors.length) { throw new Error(errors.join("\n")); } else { console.log(`✅ API snapshot test passed.`); } ================================================ FILE: scripts/validation/no-generic-byte-arrays.js ================================================ #!/usr/bin/env node /** * Runs after a full build to assert that Uint8Array was not generated with a type parameter * by TypeScript, which is only compatible with TypeScript 5.7. */ const walk = require("../utils/walk"); const fs = require("node:fs"); const path = require("node:path"); const root = path.join(__dirname, "..", ".."); const packages = path.join(root, "packages"); (async () => { const errors = []; for (const folder of fs.readdirSync(packages)) { const packagePath = path.join(packages, folder); const distTypes = path.join(packagePath, "dist-types"); if (fs.existsSync(distTypes)) { for await (const file of walk(distTypes)) { const contents = fs.readFileSync(file, "utf-8"); if (contents.includes("Uint8Array<")) { errors.push(file); } } } } if (errors.length > 0) { throw new Error( `The following files used Uint8Array in a generic way, only compatible with TypeScript 5.7:\n\t${errors.join( "\n\t" )}` ); } else { console.log(`✅ No Uint8Arrays with type parameters.`); } })(); ================================================ FILE: settings.gradle.kts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import java.io.FileInputStream import java.nio.charset.StandardCharsets.UTF_8 rootProject.name = "smithy-typescript" include(":smithy-typescript-codegen") include(":smithy-typescript-codegen-test") include(":smithy-typescript-protocol-test-codegen") include(":smithy-typescript-codegen-test:example-weather-customizations") include(":smithy-typescript-codegen-test:released-version-test") include(":smithy-typescript-ssdk-codegen-test-utils") file( java.nio.file.Paths .get(rootProject.projectDir.absolutePath, "local.properties"), ).takeIf { it.isFile } ?.let { f -> java.util.Properties().apply { load(java.io.InputStreamReader(FileInputStream(f), UTF_8)) } }?.run { listOf("smithy") .map { it to getProperty(it) } .filterNot { it.second.isNullOrEmpty() } .onEach { println("Found property `${it.first}`: ${it.second}") } .map { file(it.second) } .filter { it.isDirectory } .forEach { includeBuild(it.absolutePath) } } pluginManagement { val smithyGradleVersion: String by settings plugins { id("software.amazon.smithy.gradle.smithy-jar").version(smithyGradleVersion) id("software.amazon.smithy.gradle.smithy-base").version(smithyGradleVersion) } repositories { mavenLocal() mavenCentral() gradlePluginPortal() } } ================================================ FILE: smithy-typescript-codegen/build.gradle.kts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import software.amazon.smithy.model.node.Node description = "Generates TypeScript code from Smithy models" extra["displayName"] = "Smithy :: Typescript :: Codegen" extra["moduleName"] = "software.amazon.smithy.typescript.codegen" val smithyVersion: String by project buildscript { val smithyVersion: String by project repositories { mavenCentral() } dependencies { classpath("software.amazon.smithy:smithy-model:$smithyVersion") } } dependencies { val smithyVersion: String by project // Smithy generic dependencies api("software.amazon.smithy:smithy-codegen-core:$smithyVersion") api("software.amazon.smithy:smithy-model:$smithyVersion") api("software.amazon.smithy:smithy-protocol-traits:$smithyVersion") api("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") api("software.amazon.smithy:smithy-rules-engine:$smithyVersion") api("software.amazon.smithy:smithy-waiters:$smithyVersion") } sourceSets { main { resources { setSrcDirs( listOf( "src/main/resources", layout.buildDirectory .dir("generated/resources") .get() .asFile, ), ) } } } abstract class SetDependencyVersionsTask : DefaultTask() { @get:InputDirectory abstract val packagesDir: DirectoryProperty @get:InputDirectory abstract val smithyTsSsdkLibs: DirectoryProperty @get:OutputFile abstract val versionsFile: RegularFileProperty @TaskAction fun execute() { val outputFile = versionsFile.get().asFile outputFile.parentFile.mkdirs() outputFile.printWriter().close() val roots = packagesDir .get() .asFile .listFiles() .toMutableList() + smithyTsSsdkLibs .get() .asFile .listFiles() .toList() roots.forEach { packageDir -> val packageJsonFile = File(packageDir, "package.json") if (packageJsonFile.isFile()) { val packageJson = Node.parse(packageJsonFile.readText()).expectObjectNode() val packageName = packageJson.expectStringMember("name").getValue() val packageVersion = packageJson.expectStringMember("version").getValue() val isPrivate = packageJson.getBooleanMemberOrDefault("private", false) if (!isPrivate) { outputFile.appendText("$packageName=$packageVersion\n") } } } } } tasks.register("set-dependency-versions") { packagesDir.set(project.file("../packages")) smithyTsSsdkLibs.set(project.file("../smithy-typescript-ssdk-libs")) versionsFile.set( layout.buildDirectory.file("generated/resources/software/amazon/smithy/typescript/codegen/dependencyVersions.properties"), ) } tasks["processResources"].dependsOn(tasks["set-dependency-versions"]) tasks["sourcesJar"].dependsOn(tasks["set-dependency-versions"]) ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ApplicationProtocol.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.Objects; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Represents the resolves {@link Symbol}s and references for an * application protocol (e.g., "http", "mqtt", etc). */ @SmithyUnstableApi public final class ApplicationProtocol { private final String name; private final SymbolReference optionsType; private final SymbolReference requestType; private final SymbolReference responseType; /** * Creates a resolved application protocol. * * @param name The protocol name (e.g., http, mqtt, etc). * @param optionsType The type used to provide options to clients and commands. * @param requestType The type used to represent request messages for the protocol. * @param responseType The type used to represent response messages for the protocol. */ public ApplicationProtocol( String name, SymbolReference optionsType, SymbolReference requestType, SymbolReference responseType ) { this.name = name; this.optionsType = optionsType; this.requestType = requestType; this.responseType = responseType; } /** * Creates a default HTTP application protocol. * * @return Returns the created application protocol. */ public static ApplicationProtocol createDefaultHttpApplicationProtocol() { return new ApplicationProtocol( "http", SymbolReference.builder() .symbol(createHttpSymbol(TypeScriptDependency.SMITHY_TYPES, "HttpHandlerOptions", true)) .alias("__HttpHandlerOptions") .build(), SymbolReference.builder() .symbol( createHttpSymbol(TypeScriptDependency.SMITHY_CORE, "@smithy/core/protocols", "HttpRequest", true) ) .alias("__HttpRequest") .build(), SymbolReference.builder() .symbol( createHttpSymbol(TypeScriptDependency.SMITHY_CORE, "@smithy/core/protocols", "HttpResponse", true) ) .alias("__HttpResponse") .build() ); } private static Symbol createHttpSymbol(TypeScriptDependency dependency, String symbolName, boolean typeOnly) { return createHttpSymbol(dependency, dependency.packageName, symbolName, typeOnly); } private static Symbol createHttpSymbol( TypeScriptDependency dependency, String namespace, String symbolName, boolean typeOnly ) { Symbol.Builder builder = Symbol.builder() .namespace(namespace, "/") .name(symbolName) .addDependency(dependency) .addDependency(TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER) .addDependency(TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER); if (typeOnly) { builder.putProperty("typeOnly", true); } return builder.build(); } /** * Gets the protocol name. * *

All HTTP protocols should start with "http". * All MQTT protocols should start with "mqtt". * * @return Returns the protocol name. */ public String getName() { return name; } /** * Checks if the protocol is an HTTP based protocol. * * @return Returns true if it is HTTP based. */ public boolean isHttpProtocol() { return getName().startsWith("http"); } /** * Checks if the protocol is an MQTT based protocol. * * @return Returns true if it is MQTT based. */ public boolean isMqttProtocol() { return getName().startsWith("mqtt"); } /** * Gets the symbol used to refer to options for this protocol. * * @return Returns the protocol options. */ public SymbolReference getOptionsType() { return optionsType; } /** * Gets the symbol used to refer to the request type for this protocol. * * @return Returns the protocol request type. */ public SymbolReference getRequestType() { return requestType; } /** * Gets the symbol used to refer to the response type for this protocol. * * @return Returns the protocol response type. */ public SymbolReference getResponseType() { return responseType; } @Override public boolean equals(Object o) { if (this == o) { return true; } else if (!(o instanceof ApplicationProtocol)) { return false; } ApplicationProtocol that = (ApplicationProtocol) o; return (optionsType.equals(that.optionsType) && requestType.equals(that.requestType) && responseType.equals(that.responseType)); } @Override public int hashCode() { return Objects.hash(optionsType, requestType, responseType); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CodegenUtils.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.EventStreamIndex; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.HttpPayloadTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.typescript.codegen.integration.AddSdkStreamMixinDependency; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Utility methods needed across Java packages. */ @SmithyUnstableApi public final class CodegenUtils { public static final String SOURCE_FOLDER = "src"; public static final String TEST_FOLDER = "test"; private CodegenUtils() {} /** * Detects if an annotated mediatype indicates JSON contents. * * @param mediaType The media type to inspect. * @return If the media type indicates JSON contents. */ public static boolean isJsonMediaType(String mediaType) { return mediaType.equals("application/json") || mediaType.endsWith("+json"); } /** * Get context type for command serializer functions. * @param writer The code writer. * @param model The model for the service containing the given command. * @param operation The operation shape for given command. * @return The TypeScript type for the serializer context */ public static String getOperationSerializerContextType( TypeScriptWriter writer, Model model, OperationShape operation ) { // Get default SerdeContext. List contextInterfaceList = getDefaultOperationSerdeContextTypes(writer); // If event stream trait exists, add corresponding serde context type to the intersection type. EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); if (eventStreamIndex.getInputInfo(operation).isPresent()) { writer.addTypeImport( "EventStreamSerdeContext", "__EventStreamSerdeContext", TypeScriptDependency.SMITHY_TYPES ); contextInterfaceList.add("__EventStreamSerdeContext"); } return String.join(" & ", contextInterfaceList); } /** * Get context type for command deserializer function. * @param settings The TypeScript settings * @param writer The code writer. * @param model The model for the service containing the given command. * @param operation The operation shape for given command. * @return The TypeScript type for the deserializer context */ public static String getOperationDeserializerContextType( TypeScriptSettings settings, TypeScriptWriter writer, Model model, OperationShape operation ) { // Get default SerdeContext. List contextInterfaceList = getDefaultOperationSerdeContextTypes(writer); // If event stream trait exists, add corresponding serde context type to the intersection type. EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); if (eventStreamIndex.getOutputInfo(operation).isPresent()) { writer.addTypeImport( "EventStreamSerdeContext", "__EventStreamSerdeContext", TypeScriptDependency.SMITHY_TYPES ); contextInterfaceList.add("__EventStreamSerdeContext"); } if (AddSdkStreamMixinDependency.hasStreamingBlobDeser(settings, model, operation)) { writer.addTypeImport("SdkStreamSerdeContext", "__SdkStreamSerdeContext", TypeScriptDependency.SMITHY_TYPES); contextInterfaceList.add("__SdkStreamSerdeContext"); } return String.join(" & ", contextInterfaceList); } private static List getDefaultOperationSerdeContextTypes(TypeScriptWriter writer) { List contextInterfaceList = new ArrayList<>(); // Get default SerdeContext. writer.addTypeImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); contextInterfaceList.add("__SerdeContext"); return contextInterfaceList; } static List getBlobStreamingMembers(Model model, StructureShape shape) { return shape .getAllMembers() .values() .stream() .filter(memberShape -> { // Streaming blobs need to have their types modified // See `writeClientCommandStreamingInputType` Shape target = model.expectShape(memberShape.getTarget()); return target.isBlobShape() && target.hasTrait(StreamingTrait.class); }) .collect(Collectors.toList()); } /** * Generate the type of the command input of the client sdk given the streaming blob * member of the shape. The generated type eases the streaming member requirement so that users don't need to * construct a stream every time. * This type decoration is allowed in Smithy because it makes, for the same member, the type to be serialized is * more permissive than the type to be deserialized. * Refer here for more rationales: https://github.com/aws/aws-sdk-js-v3/issues/843 */ static void writeClientCommandStreamingInputType( TypeScriptWriter writer, Symbol containerSymbol, String typeName, MemberShape streamingMember, String commandName ) { writer.addTypeImport("StreamingBlobPayloadInputTypes", null, TypeScriptDependency.SMITHY_TYPES); String memberName = streamingMember.getMemberName(); String optionalSuffix = streamingMember.isRequired() ? "" : "?"; writer.writeDocs("@public\n\nThe input for {@link " + commandName + "}."); writer.write( """ export interface $L extends Omit<$T, $S> { $L$L: StreamingBlobPayloadInputTypes; } """, typeName, containerSymbol, memberName, memberName, optionalSuffix ); } /** * Generate the type of the command output of the client sdk given the streaming blob * member of the shape. The type marks the streaming blob member to contain the utility methods to transform the * stream to string, buffer or WHATWG stream API. */ static void writeClientCommandStreamingOutputType( TypeScriptWriter writer, Symbol containerSymbol, String typeName, MemberShape streamingMember, String commandName ) { String memberName = streamingMember.getMemberName(); String optionalSuffix = streamingMember.isRequired() ? "" : "?"; writer.addTypeImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("StreamingBlobPayloadOutputTypes", null, TypeScriptDependency.SMITHY_TYPES); writer.writeDocs("@public\n\nThe output of {@link " + commandName + "}."); writer.write( """ export interface $L extends Omit<$T, $S>, __MetadataBearer { $L$L: StreamingBlobPayloadOutputTypes; } """, typeName, containerSymbol, memberName, memberName, optionalSuffix ); } static List getBlobPayloadMembers(Model model, StructureShape shape) { return shape .getAllMembers() .values() .stream() .filter(memberShape -> { Shape target = model.expectShape(memberShape.getTarget()); return (target.isBlobShape() && memberShape.hasTrait(HttpPayloadTrait.class) && !target.hasTrait(StreamingTrait.class)); }) .collect(Collectors.toList()); } static void writeClientCommandBlobPayloadInputType( TypeScriptWriter writer, Symbol containerSymbol, String typeName, MemberShape payloadMember, String commandName ) { String memberName = payloadMember.getMemberName(); String optionalSuffix = payloadMember.isRequired() ? "" : "?"; writer.addTypeImport("BlobPayloadInputTypes", null, TypeScriptDependency.SMITHY_TYPES); writer.writeDocs("@public"); writer.write( """ export type $LType = Omit<$T, $S> & { $L: BlobPayloadInputTypes; }; """, typeName, containerSymbol, memberName, memberName + optionalSuffix ); writer.writeDocs("@public\n\nThe input for {@link " + commandName + "}."); writer.write("export interface $1L extends $1LType {}", typeName); } static void writeClientCommandBlobPayloadOutputType( TypeScriptWriter writer, Symbol containerSymbol, String typeName, MemberShape payloadMember, String commandName ) { String memberName = payloadMember.getMemberName(); String optionalSuffix = payloadMember.isRequired() ? "" : "?"; writer.addImportSubmodule( "Uint8ArrayBlobAdapter", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.writeDocs("@public"); writer.write( """ export type $LType = Omit<$T, $S> & { $L: Uint8ArrayBlobAdapter; }; """, typeName, containerSymbol, memberName, memberName + optionalSuffix ); writer.writeDocs("@public\n\nThe output of {@link " + commandName + "}."); writer.write("export interface $1L extends $1LType, __MetadataBearer {}", typeName); } /** * Returns the list of function parameter key-value pairs to be written for * provided parameters map. * * @param paramsMap Map of parameters to generate a parameters string for. * @return The list of parameters to be written. */ static List getFunctionParametersList(Map paramsMap) { List functionParametersList = new ArrayList(); List> sortedParamsMap = paramsMap .entrySet() .stream() .sorted(Map.Entry.comparingByKey()) .toList(); if (!sortedParamsMap.isEmpty()) { for (Map.Entry param : sortedParamsMap) { String key = param.getKey(); Object value = param.getValue(); if (value instanceof Symbol) { String symbolName = ((Symbol) value).getName(); if (key.equals(symbolName)) { functionParametersList.add(String.format("$%s:T", symbolName)); } else { functionParametersList.add(String.format("%s: $%s:T", key, key)); } } else if (value instanceof String) { functionParametersList.add(String.format("%s: '%s'", key, value)); } else if (value instanceof Boolean) { functionParametersList.add(String.format("%s: %s", key, value)); } else if (value instanceof List) { List valueList = (List) value; if (!valueList.isEmpty() && !(valueList.get(0) instanceof String)) { throw new CodegenException("Plugin function parameters list must be List"); } List valueStringList = valueList .stream() .map(item -> String.format("'%s'", item)) .collect(Collectors.toList()); functionParametersList.add( String.format( "'%s': [%s]", key, valueStringList.stream().collect(Collectors.joining(", ")) ) ); } else if (value instanceof Map) { Map valueMap = (Map) value; if ( !valueMap.isEmpty() && valueMap .keySet() .stream() .anyMatch(k -> !(k instanceof String)) && valueMap .values() .stream() .anyMatch(v -> !(v instanceof String)) ) { throw new CodegenException("Plugin function parameters map must be Map"); } List valueStringList = valueMap .entrySet() .stream() .map(entry -> String.format("'%s': '%s'", entry.getKey(), entry.getValue())) .collect(Collectors.toList()); functionParametersList.add( String.format("%s: {%s}", key, valueStringList.stream().collect(Collectors.joining(", "))) ); } else { // Future support for param type should be added in else if. throw new CodegenException("Plugin function parameters not supported for type " + value.getClass()); } } } return functionParametersList; } /** * Ease the input streaming member restriction so that users don't need to construct a stream every time. * This is used for inline type declarations (such as parameters) that need to take more permissive inputs * Refer here for more rationales: https://github.com/aws/aws-sdk-js-v3/issues/843 */ static void writeInlineStreamingMemberType( TypeScriptWriter writer, Symbol containerSymbol, MemberShape streamingMember ) { String memberName = streamingMember.getMemberName(); String optionalSuffix = streamingMember.isRequired() ? "" : "?"; writer.writeInline( "Omit<$1T, $2S> & { $2L$3L: $1T[$2S]|string|Uint8Array|Buffer }", containerSymbol, memberName, optionalSuffix ); } public static String getServiceName(TypeScriptSettings settings, Model model, SymbolProvider symbolProvider) { ServiceShape service = settings.getService(model); return symbolProvider.toSymbol(service).getName().replaceAll("(Client)$", ""); } /** * The alternative should be used because the base exception may have been renamed * due to a collision in the model. * * @deprecated use {@link #getSyntheticBaseExceptionName}. */ @Deprecated public static String getServiceExceptionName(String serviceName) { return serviceName + "ServiceException"; } /** * If the service unfortunately defines a ServiceNameBaseException error, * we still generate a synthetic base error for uniformity, but it must be renamed. */ public static String getSyntheticBaseExceptionName(String serviceName, Model model) { String serviceExceptionName = getServiceExceptionName(serviceName); while (true) { String finalServiceExceptionName = serviceExceptionName; boolean namingCollision = model .getStructureShapes() .stream() .anyMatch(structureShape -> structureShape.getId().getName().equals(finalServiceExceptionName)); if (namingCollision) { serviceExceptionName = serviceExceptionName.replaceAll( "ServiceException$", "SyntheticServiceException" ); } else { break; } } return serviceExceptionName; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/CommandGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobPayloadMembers; import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers; import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeClientCommandBlobPayloadInputType; import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeClientCommandBlobPayloadOutputType; import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeClientCommandStreamingInputType; import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeClientCommandStreamingOutputType; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.DeprecatedTrait; import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.ExamplesTrait; import software.amazon.smithy.model.traits.InternalTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.typescript.codegen.documentation.DocumentationExampleGenerator; import software.amazon.smithy.typescript.codegen.documentation.StructureExampleGenerator; import software.amazon.smithy.typescript.codegen.endpointsV2.RuleSetParameterFinder; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.typescript.codegen.sections.CommandBodyExtraCodeSection; import software.amazon.smithy.typescript.codegen.sections.CommandConstructorCodeSection; import software.amazon.smithy.typescript.codegen.sections.CommandPropertiesCodeSection; import software.amazon.smithy.typescript.codegen.sections.PreCommandClassCodeSection; import software.amazon.smithy.typescript.codegen.sections.SmithyContextCodeSection; import software.amazon.smithy.typescript.codegen.util.CommandWriterConsumer; import software.amazon.smithy.typescript.codegen.util.PropertyAccessor; import software.amazon.smithy.typescript.codegen.validation.SensitiveDataFinder; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates a client command using plugins. */ @SmithyInternalApi final class CommandGenerator implements Runnable { static final String COMMANDS_FOLDER = "commands"; static final String SCHEMAS_FOLDER = "schemas"; private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final Symbol symbol; private final List runtimePlugins; private final OperationIndex operationIndex; private final Symbol inputType; private final Symbol outputType; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private final SensitiveDataFinder sensitiveDataFinder; private final ServiceClosure closure; CommandGenerator( TypeScriptSettings settings, Model model, OperationShape operation, SymbolProvider symbolProvider, TypeScriptWriter writer, List runtimePlugins, ProtocolGenerator protocolGenerator, ApplicationProtocol applicationProtocol ) { this.settings = settings; this.model = model; this.service = settings.getService(model); this.operation = operation; this.symbolProvider = symbolProvider; this.writer = writer; this.runtimePlugins = runtimePlugins .stream() .filter(plugin -> plugin.matchesOperation(model, service, operation)) .collect(Collectors.toList()); this.protocolGenerator = protocolGenerator; this.applicationProtocol = applicationProtocol; this.closure = ServiceClosure.of(model, service); sensitiveDataFinder = new SensitiveDataFinder(model); symbol = symbolProvider.toSymbol(operation); operationIndex = OperationIndex.of(model); inputType = symbol.expectProperty("inputType", Symbol.class); outputType = symbol.expectProperty("outputType", Symbol.class); } @Override public void run() { addInputAndOutputTypes(); generateClientCommand(); } private void generateClientCommand() { Symbol serviceSymbol = symbolProvider.toSymbol(service); String configType = ServiceBareBonesClientGenerator.getResolvedConfigTypeName(serviceSymbol); // Add required imports. Path servicePath = Paths.get(".", serviceSymbol.getNamespace()); writer.addRelativeTypeImport(configType, null, servicePath); writer.addRelativeTypeImport("ServiceInputTypes", null, servicePath); writer.addRelativeTypeImport("ServiceOutputTypes", null, servicePath); writer.addImportSubmodule("Command", "$Command", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); String name = symbol.getName(); StringBuilder additionalDocs = new StringBuilder() .append("\n") .append( getCommandExample( serviceSymbol .getName(), configType, name, inputType.getName(), outputType.getName() ) ) .append("\n") .append(getThrownExceptions()) .append("\n") .append(getCuratedExamples(name)); boolean operationHasDocumentation = operation.hasTrait(DocumentationTrait.class); if (operationHasDocumentation) { writer.writeShapeDocs(operation, shapeDoc -> shapeDoc + additionalDocs); } else { boolean isPublic = !operation.hasTrait(InternalTrait.class); boolean isDeprecated = operation.hasTrait(DeprecatedTrait.class); String deprecatedTag = ""; if (isDeprecated) { DeprecatedTrait deprecatedTrait = operation.expectTrait(DeprecatedTrait.class); deprecatedTag = TypeScriptWriter.buildDeprecationAnnotation(deprecatedTrait) + "\n"; } writer.writeDocs( (isPublic ? "@public\n" : "@internal\n") + deprecatedTag + additionalDocs ); } // Section of items like TypeScript @ts-ignore writer.injectSection( PreCommandClassCodeSection.builder() .settings(settings) .model(model) .service(service) .operation(operation) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .build() ); writer.openBlock(""" export class $L extends $$Command .classBuilder< $T, $T, $L, ServiceInputTypes, ServiceOutputTypes >()""", " .build() {", name, inputType, outputType, configType, () -> { // class open bracket. generateEndpointParameterInstructionProvider(); generateCommandMiddlewareResolver(configType); writeSerde(); }); // Ctor section. writer.injectSection( CommandConstructorCodeSection.builder() .settings(settings) .model(model) .service(service) .operation(operation) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .build() ); // Section for adding custom command properties. writer.injectSection( CommandPropertiesCodeSection.builder() .settings(settings) .model(model) .service(service) .operation(operation) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .build() ); // Hook for adding more methods to the command. writer.injectSection( CommandBodyExtraCodeSection.builder() .settings(settings) .model(model) .service(service) .operation(operation) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .build() ); { // This block places the most commonly sought type definitions // closer to the command definition, for navigation assistance // in IDEs. Shape operationInputShape = model.expectShape(operation.getInputShape()); Symbol baseInput = symbolProvider.toSymbol(operationInputShape); Shape operationOutputShape = model.expectShape(operation.getOutputShape()); Symbol baseOutput = symbolProvider.toSymbol(operationOutputShape); if (!operationInputShape.getAllMembers().isEmpty()) { writer.addRelativeTypeImport(baseInput.getName(), null, Path.of(baseInput.getNamespace())); } if (!operationOutputShape.getAllMembers().isEmpty()) { writer.addRelativeTypeImport(baseOutput.getName(), null, Path.of(baseOutput.getNamespace())); } writer.indent(); writer.write("/** @internal type navigation helper, not in runtime. */"); writer.openBlock("protected declare static __types: {", "};", () -> { String baseInputStr = operationInputShape.getAllMembers().isEmpty() ? "{}" : baseInput.getName(); String baseOutputStr = operationOutputShape.getAllMembers().isEmpty() ? "{}" : baseOutput.getName(); writer.write( """ api: { input: $L; output: $L; };""", baseInputStr, baseOutputStr ); writer.write( """ sdk: { input: $T; output: $T; };""", inputType, outputType ); }); writer.dedent(); } writer.write("}"); // class close bracket. } private String getCommandExample( String serviceName, String configName, String commandName, String commandInput, String commandOutput ) { String packageName = settings.getPackageName(); String exampleDoc = "@example\n" + "Use a bare-bones client and the command you need to make an API call.\n" + "```javascript\n" + String.format( "import { %s, %s } from \"%s\"; // ES Modules import%n", serviceName, commandName, packageName ) + String.format( "// const { %s, %s } = require(\"%s\"); // CommonJS import%n", serviceName, commandName, packageName ) + String.format("// import type { %sConfig } from \"%s\";%n", serviceName, packageName) + String.format("const config = {}; // type is %sConfig%n", serviceName) + String.format("const client = new %s(config);%n", serviceName) + String.format( "const input = %s%n", StructureExampleGenerator.generateStructuralHintDocumentation( model.getShape(operation.getInputShape()).get(), model, false, true ) ) + String.format("const command = new %s(input);%n", commandName) + "const response = await client.send(command);" + getStreamingBlobOutputAddendum() + "\n" + String.format( "%s%n", StructureExampleGenerator.generateStructuralHintDocumentation( model.getShape(operation.getOutputShape()).get(), model, true, false ) ) + "\n```\n" + "\n" + String.format("@param %s - {@link %s}%n", commandInput, commandInput) + String.format("@returns {@link %s}%n", commandOutput) + String.format("@see {@link %s} for command's `input` shape.%n", commandInput) + String.format("@see {@link %s} for command's `response` shape.%n", commandOutput) + String.format("@see {@link %s | config} for %s's `config` shape.%n", configName, serviceName); return exampleDoc; } /** * Handwritten examples from the operation ExamplesTrait. */ private String getCuratedExamples(String commandName) { String exampleDoc = ""; if (operation.getTrait(ExamplesTrait.class).isPresent()) { List examples = operation.getTrait(ExamplesTrait.class).get().getExamples(); StringBuilder buffer = new StringBuilder(); for (ExamplesTrait.Example example : examples) { ObjectNode input = example.getInput(); Optional output = example.getOutput(); buffer .append("\n") .append(String.format("@example %s%n", example.getTitle())) .append("```javascript\n") .append(String.format("// %s%n", example.getDocumentation().orElse(""))) .append( """ const input = %s; const command = new %s(input); const response = await client.send(command);%s /* response is %s */ """.formatted( DocumentationExampleGenerator.inputToJavaScriptObject(input), commandName, getStreamingBlobOutputAddendum(), DocumentationExampleGenerator.outputToJavaScriptObject(output.orElse(null)) ) ) .append("```") .append("\n"); } exampleDoc += buffer.toString(); } return exampleDoc; } /** * @param operation - to query. * @return member name of the streaming blob http payload, or empty string. */ private String getStreamingBlobOutputMember(OperationShape operation) { return (model.expectShape(operation.getOutputShape())).getAllMembers() .values() .stream() .filter(memberShape -> { Shape target = model.expectShape(memberShape.getTarget()); return (target.isBlobShape() && (target.hasTrait(StreamingTrait.class) || memberShape.hasTrait(StreamingTrait.class))); }) .map(MemberShape::getMemberName) .findFirst() .orElse(""); } /** * @return e.g. appendable "const bytes = await response.Body.transformToByteArray();". */ private String getStreamingBlobOutputAddendum() { String streamingBlobAddendum = ""; String streamingBlobMemberName = getStreamingBlobOutputMember(operation); if (!streamingBlobMemberName.isEmpty()) { String propAccess = PropertyAccessor.getFrom("response", streamingBlobMemberName); streamingBlobAddendum = """ \n// consume or destroy the stream to free the socket. const bytes = await %s.transformToByteArray(); // const str = await %s.transformToString(); // %s.destroy(); // only applicable to Node.js Readable streams. """.formatted(propAccess, propAccess, propAccess); } return streamingBlobAddendum; } private String getThrownExceptions() { List errors = operation.getErrors(); StringBuilder buffer = new StringBuilder(); for (ShapeId error : errors) { Shape errorShape = model.getShape(error).get(); Optional doc = errorShape.getTrait(DocumentationTrait.class); ErrorTrait errorTrait = errorShape.getTrait(ErrorTrait.class).get(); if (doc.isPresent()) { buffer.append( String.format( "@throws {@link %s} (%s fault)%n %s", error.getName(), errorTrait.getValue(), doc.get().getValue() ) ); } else { buffer.append(String.format("@throws {@link %s} (%s fault)", error.getName(), errorTrait.getValue())); } buffer.append("\n\n"); } String name = CodegenUtils.getServiceName(settings, model, symbolProvider); buffer.append(String.format("@throws {@link %s}%n", CodegenUtils.getSyntheticBaseExceptionName(name, model))); buffer.append(String.format("

Base exception class for all service exceptions from %s service.

%n", name)); return buffer.toString(); } private void generateEndpointParameterInstructionProvider() { writer.addImport( "commonParams", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, "endpoint/EndpointParameters").toString() ); RuleSetParameterFinder parameterFinder = new RuleSetParameterFinder(service); Map staticContextParamValues = parameterFinder.getStaticContextParamValues(operation); Map contextParams = parameterFinder.getContextParams( model.getShape(operation.getInputShape()).get() ); Map operationContextParamValues = parameterFinder.getOperationContextParamValues(operation); if (staticContextParamValues.isEmpty() && contextParams.isEmpty() && operationContextParamValues.isEmpty()) { writer.write(".ep(commonParams)"); return; } writer.write(".ep({").indent(); { writer.write("...commonParams,"); Set paramNames = new HashSet<>(); staticContextParamValues.forEach((name, value) -> { paramNames.add(name); writer.write("$L: { type: \"staticContextParams\", value: $L },", name, value); }); contextParams.forEach((name, memberName) -> { if (!paramNames.contains(name)) { writer.write("$L: { type: \"contextParams\", name: \"$L\" },", name, memberName); } paramNames.add(name); }); operationContextParamValues.forEach((name, jmesPathForInputInJs) -> { writer.write( """ $L: { type: "operationContextParams", get: (input?: any) => $L }, """, name, jmesPathForInputInJs ); }); } writer.dedent().write("})"); } private void generateCommandMiddlewareResolver(String configType) { Symbol serde = Symbol.builder() .namespace(TypeScriptDependency.SMITHY_CORE.packageName + SmithyCoreSubmodules.SERDE, "/") .name("getSerdePlugin") .addDependency(TypeScriptDependency.SMITHY_CORE) .build(); boolean schemaMode = SchemaGenerationAllowlist.allows(service.getId(), settings); Function getFilterFunctionName = input -> { if (sensitiveDataFinder.findsSensitiveDataIn(input) && !schemaMode) { Symbol inputSymbol = symbolProvider.toSymbol(input); String filterFunctionName = inputSymbol.getName() + "FilterSensitiveLog"; writer.addRelativeImport(filterFunctionName, null, Paths.get(".", inputSymbol.getNamespace())); return filterFunctionName; } return "void 0"; }; String inputFilterFn = operationIndex.getInput(operation).map(getFilterFunctionName).orElse("void 0"); String outputFilterFn = operationIndex.getOutput(operation).map(getFilterFunctionName).orElse("void 0"); writer .pushState() .putContext("client", symbolProvider.toSymbol(service).getName()) .putContext("command", symbolProvider.toSymbol(operation).getName()) .putContext("service", service.toShapeId().getName()) .putContext("operation", operation.toShapeId().getName()) .putContext("inputFilter", inputFilterFn) .putContext("outputFilter", outputFilterFn) .putContext("configType", configType) .putContext("optionsType", applicationProtocol.getOptionsType()) .putContext("inputType", inputType) .putContext("outputType", outputType); writer.writeInline( """ .m(function (this: any, Command: any, cs: any, config: $configType:L, o: any) { return [""" ); { boolean multiplePlugins = !schemaMode || runtimePlugins.stream() .map(RuntimeClientPlugin::getPluginFunction) .anyMatch(Optional::isPresent); writer.addImportSubmodule( "getEndpointPlugin", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); if (multiplePlugins) { writer.write(""); writer.indent(); // Add serialization and deserialization plugin. if (!schemaMode) { writer.indent(); writer.write("$T(config, this.serialize, this.deserialize),", serde); writer.dedent(); } writer .indent() .write( """ getEndpointPlugin(config, Command.getEndpointParameterInstructions()),""" ); // Add customizations. addCommandSpecificPlugins(); writer.dedent(); writer.write("];"); // end middleware list. writer.dedent(); } else { writer.writeInline( """ getEndpointPlugin(config, Command.getEndpointParameterInstructions())""" ); writer.write("];"); // end middleware list. } } writer.write("})"); // end middleware block. String filters = schemaMode ? "" : ".f($inputFilter:L, $outputFilter:L)"; // context, filters writer .writeInline( """ .s($service:S, $operation:S, {""" ) .pushState( SmithyContextCodeSection.builder() .settings(settings) .model(model) .service(service) .operation(operation) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .build() ) .popState() .write("})") .write( """ .n($client:S, $command:S)""" ); if (!filters.isEmpty()) { writer.write(filters); } } private void addInputAndOutputTypes() { writer.writeDocs("@public"); writer.write("export type { __MetadataBearer };"); writer.write("export { $$Command };"); writeInputType(inputType.getName(), operationIndex.getInput(operation), symbol.getName()); writeOutputType(outputType.getName(), operationIndex.getOutput(operation), symbol.getName()); writer.write(""); } private void writeInputType(String typeName, Optional inputShape, String commandName) { if (inputShape.isPresent()) { StructureShape input = inputShape.get(); List blobStreamingMembers = getBlobStreamingMembers(model, input); List blobPayloadMembers = getBlobPayloadMembers(model, input); if (!blobStreamingMembers.isEmpty()) { writeClientCommandStreamingInputType( writer, symbolProvider.toSymbol(input), typeName, blobStreamingMembers.get(0), commandName ); } else if (!blobPayloadMembers.isEmpty()) { writeClientCommandBlobPayloadInputType( writer, symbolProvider.toSymbol(input), typeName, blobPayloadMembers.get(0), commandName ); } else { writer.writeDocs("@public\n\nThe input for {@link " + commandName + "}."); Symbol inputSymbol = symbolProvider.toSymbol(input); writer.addRelativeTypeImport(inputSymbol.getName(), null, Path.of(inputSymbol.getNamespace())); writer.write("export interface $L extends $L {}", typeName, inputSymbol.getName()); } } else { // If the input is non-existent, then use an empty object. writer.writeDocs("@public\n\nThe input for {@link " + commandName + "}."); writer.write("export interface $L {}", typeName); } } private void writeOutputType(String typeName, Optional outputShape, String commandName) { // Output types should always be MetadataBearers, possibly in addition // to a defined output shape. writer.addTypeImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.SMITHY_TYPES); if (outputShape.isPresent()) { StructureShape output = outputShape.get(); List blobStreamingMembers = getBlobStreamingMembers(model, output); List blobPayloadMembers = getBlobPayloadMembers(model, output); if (!blobStreamingMembers.isEmpty()) { writeClientCommandStreamingOutputType( writer, symbolProvider.toSymbol(output), typeName, blobStreamingMembers.get(0), commandName ); } else if (!blobPayloadMembers.isEmpty()) { writeClientCommandBlobPayloadOutputType( writer, symbolProvider.toSymbol(output), typeName, blobPayloadMembers.get(0), commandName ); } else { writer.writeDocs("@public\n\nThe output of {@link " + commandName + "}."); Symbol outputSymbol = symbolProvider.toSymbol(output); writer.addRelativeTypeImport(outputSymbol.getName(), null, Path.of(outputSymbol.getNamespace())); writer.write("export interface $L extends $L, __MetadataBearer {}", typeName, outputSymbol.getName()); } } else { writer.writeDocs("@public\n\nThe output of {@link " + commandName + "}."); writer.write("export interface $L extends __MetadataBearer {}", typeName); } } private void addCommandSpecificPlugins() { // Some plugins might only apply to specific commands. They are added to the // command's middleware stack here. Plugins that apply to all commands are // applied automatically when the Command's middleware stack is copied from // the service's middleware stack. for (RuntimeClientPlugin plugin : runtimePlugins) { plugin .getPluginFunction() .ifPresent(pluginSymbol -> { // Construct additional parameters string Map paramsMap = plugin.getAdditionalPluginFunctionParameters( model, service, operation ); // Construct writer context Map symbolMap = new HashMap<>(); symbolMap.put("pluginFn", pluginSymbol); for (Map.Entry entry : paramsMap.entrySet()) { if (entry.getValue() instanceof Symbol) { symbolMap.put(entry.getKey(), entry.getValue()); } } writer.pushState(); writer.putContext(symbolMap); List additionalParameters = CodegenUtils.getFunctionParametersList(paramsMap); Map clientAddParamsWriterConsumers = plugin.getOperationAddParamsWriterConsumers(); boolean hasAddParams = !additionalParameters.isEmpty() || !clientAddParamsWriterConsumers.isEmpty(); if (!hasAddParams) { writer.write("$pluginFn:T(config),"); } else { writer.openBlock("$pluginFn:T(config, {", "}),", () -> { if (!additionalParameters.isEmpty()) { // caution: using String.join instead of templating // because additionalParameters may contain Smithy syntax. writer.write(String.join(",\n", additionalParameters) + ","); } clientAddParamsWriterConsumers.forEach((key, consumer) -> { writer.write( "$L: $C,", key, (Consumer) (w -> { consumer.accept( w, CommandConstructorCodeSection.builder() .settings(settings) .model(model) .service(service) .symbolProvider(symbolProvider) .runtimeClientPlugins(runtimePlugins) .applicationProtocol(applicationProtocol) .build() ); }) ); }); }); } writer.popState(); }); } } private void writeSchemaSerde() { String operationSchema = closure.getShapeSchemaVariableName(operation, null); writer.addRelativeImport( operationSchema, null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, SCHEMAS_FOLDER, "schemas_0") ); writer.write( """ .sc($L)""", operationSchema ); } private void writeSerde() { if (SchemaGenerationAllowlist.allows(service.getId(), settings)) { writeSchemaSerde(); } else { writer.write(".ser($L)", getSerdeDispatcher(true)).write(".de($L)", getSerdeDispatcher(false)); } } private String getSerdeDispatcher(boolean isInput) { if (protocolGenerator == null) { return "() => { throw new Error(\"No supported protocol was found\"); }"; } else { String serdeFunctionName = isInput ? ProtocolGenerator.getSerFunctionShortName(symbol) : ProtocolGenerator.getDeserFunctionShortName(symbol); writer.addRelativeImport( serdeFunctionName, null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) ) ); return serdeFunctionName; } } static void writeIndex( Model model, ServiceShape service, SymbolProvider symbolProvider, FileManifest fileManifest ) { TypeScriptWriter writer = new TypeScriptWriter(""); TopDownIndex topDownIndex = TopDownIndex.of(model); Set containedOperations = new TreeSet<>( Comparator.comparing(opShape -> symbolProvider.toSymbol(opShape).getName()) ); containedOperations.addAll( topDownIndex.getContainedOperations(service) ); if (containedOperations.isEmpty()) { writer.write("export {};"); } else { for (OperationShape operation : containedOperations) { writer.write("export * from \"./$L\";", symbolProvider.toSymbol(operation).getName()); } } fileManifest.writeFile( Paths.get(CodegenUtils.SOURCE_FOLDER, CommandGenerator.COMMANDS_FOLDER, "index.ts").toString(), writer.toString() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/Dependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.codegen.core.SymbolDependencyContainer; public interface Dependency extends PackageContainer, SymbolDependencyContainer {} ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/DirectedTypeScriptCodegen.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.directed.CreateContextDirective; import software.amazon.smithy.codegen.core.directed.CreateSymbolProviderDirective; import software.amazon.smithy.codegen.core.directed.CustomizeDirective; import software.amazon.smithy.codegen.core.directed.DirectedCodegen; import software.amazon.smithy.codegen.core.directed.GenerateEnumDirective; import software.amazon.smithy.codegen.core.directed.GenerateErrorDirective; import software.amazon.smithy.codegen.core.directed.GenerateIntEnumDirective; import software.amazon.smithy.codegen.core.directed.GenerateServiceDirective; import software.amazon.smithy.codegen.core.directed.GenerateStructureDirective; import software.amazon.smithy.codegen.core.directed.GenerateUnionDirective; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.model.validation.ValidationEvent; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthSchemeProviderGenerator; import software.amazon.smithy.typescript.codegen.endpointsV2.EndpointsV2Generator; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerator; import software.amazon.smithy.typescript.codegen.validation.LongValidator; import software.amazon.smithy.typescript.codegen.validation.ReplaceLast; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.waiters.WaitableTrait; import software.amazon.smithy.waiters.Waiter; @SmithyUnstableApi final class DirectedTypeScriptCodegen implements DirectedCodegen { static { // too many redundant logs like dozens of lines of // "Reserved word: Error is a reserved word for a name. Converting to _Error" Logger.getLogger("software.amazon.smithy.codegen.core.ReservedWordSymbolProvider").setLevel(Level.SEVERE); // TypeScriptIntegration::matchesSettings causes too many logs from toposort. Logger.getLogger("software.amazon.smithy.codegen.core.IntegrationTopologicalSort").setLevel(Level.SEVERE); } private static final Logger LOGGER = Logger.getLogger(DirectedTypeScriptCodegen.class.getName()); /** * A mapping of static resource files to copy over to a new filename. */ private static final Map STATIC_FILE_COPIES = MapUtils.of( "tsconfig.json", "tsconfig.json", "tsconfig.cjs.json", "tsconfig.cjs.json", "tsconfig.es.json", "tsconfig.es.json", "tsconfig.types.json", "tsconfig.types.json" ); private static final ShapeId VALIDATION_EXCEPTION_SHAPE = ShapeId.fromParts( "smithy.framework", "ValidationException" ); @Override public SymbolProvider createSymbolProvider(CreateSymbolProviderDirective directive) { return directive.settings().getArtifactType().createSymbolProvider(directive.model(), directive.settings()); } @Override public TypeScriptCodegenContext createContext( CreateContextDirective directive ) { List runtimePlugins = new ArrayList<>(); directive .integrations() .forEach(integration -> { LOGGER.fine(() -> "Adding TypeScriptIntegration: " + integration.getClass().getName()); integration .getClientPlugins() .forEach(runtimePlugin -> { if ( runtimePlugin.matchesSettings( directive.model(), directive.service(), directive.settings() ) ) { LOGGER.fine(() -> "Adding TypeScript runtime plugin: " + runtimePlugin); runtimePlugins.add(runtimePlugin); } else { LOGGER.fine( () -> "Skipping TypeScript runtime plugin based on settings: " + runtimePlugin ); } }); }); directive .integrations() .forEach(integration -> { LOGGER.fine(() -> "Mutating plugins from TypeScriptIntegration: " + integration.name()); integration.mutateClientPlugins(runtimePlugins); }); ProtocolGenerator protocolGenerator = resolveProtocolGenerator( directive.integrations(), directive.model(), directive.service(), directive.settings() ); ApplicationProtocol applicationProtocol = protocolGenerator == null ? ApplicationProtocol.createDefaultHttpApplicationProtocol() : protocolGenerator.getApplicationProtocol(); if (null != protocolGenerator) { directive.settings().setProtocol(protocolGenerator.getProtocol()); } return TypeScriptCodegenContext.builder() .model(directive.model()) .settings(directive.settings()) .symbolProvider(directive.symbolProvider()) .fileManifest(directive.fileManifest()) .integrations(directive.integrations()) .runtimePlugins(runtimePlugins) .protocolGenerator(protocolGenerator) .applicationProtocol(applicationProtocol) .writerDelegator(new TypeScriptDelegator(directive.fileManifest(), directive.symbolProvider())) .build(); } private ProtocolGenerator resolveProtocolGenerator( Collection integrations, Model model, ServiceShape service, TypeScriptSettings settings ) { // Collect all the supported protocol generators. // Preserve insertion order as default priority order. Map generators = new LinkedHashMap<>(); for (TypeScriptIntegration integration : integrations) { for (ProtocolGenerator generator : integration.getProtocolGenerators()) { // allow overrides of the same protocol ShapeId to change the order. generators.remove(generator.getProtocol()); generators.put(generator.getProtocol(), generator); } } ShapeId protocolName; try { protocolName = settings.resolveServiceProtocol(model, service, generators.keySet()); } catch (UnresolvableProtocolException e) { LOGGER.warning("Unable to find a protocol generator for " + service.getId() + ": " + e.getMessage()); protocolName = null; } return protocolName != null ? generators.get(protocolName) : null; } @Override public void generateService(GenerateServiceDirective directive) { TypeScriptSettings settings = directive.settings(); Model model = directive.model(); ServiceShape service = directive.shape(); TypeScriptDelegator delegator = directive.context().writerDelegator(); if (settings.generateServerSdk()) { checkValidationSettings(settings, model, service); LongValidator validator = new LongValidator(settings); List events = validator.validate(model); System.err.println( "Model contained SSDK-specific validation events: \n" + events.stream().map(ValidationEvent::toString).sorted().collect(Collectors.joining("\n")) ); } if (settings.generateClient()) { generateClient(directive); } if (settings.generateClient() || settings.generateServerSdk()) { generateCommands(directive); generateEndpointV2(directive); } if (settings.generateServerSdk()) { generateServiceInterface(directive); } ProtocolGenerator protocolGenerator = directive.context().protocolGenerator(); SymbolProvider symbolProvider = directive.symbolProvider(); if (protocolGenerator != null) { if (SchemaGenerationAllowlist.allows(service.getId(), settings)) { return; } LOGGER.info("Generating serde for protocol " + protocolGenerator.getName() + " on " + service.getId()); String fileName = Paths.get( CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) + ".ts" ).toString(); delegator.useFileWriter(fileName, writer -> { ProtocolGenerator.GenerationContext context = new ProtocolGenerator.GenerationContext(); context.setProtocolName(protocolGenerator.getName()); context.setModel(model); context.setService(service); context.setSettings(settings); context.setSymbolProvider(symbolProvider); context.setWriter(writer); if (context.getSettings().generateClient()) { protocolGenerator.generateRequestSerializers(context); protocolGenerator.generateResponseDeserializers(context); } if (context.getSettings().generateServerSdk()) { protocolGenerator.generateRequestDeserializers(context); protocolGenerator.generateResponseSerializers(context); protocolGenerator.generateFrameworkErrorSerializer(context); delegator.useShapeWriter(service, w -> { protocolGenerator.generateServiceHandlerFactory(context.withWriter(w)); }); for (OperationShape operation : TopDownIndex.of(model).getContainedOperations(service)) { delegator.useShapeWriter(operation, w -> { protocolGenerator.generateOperationHandlerFactory(context.withWriter(w), operation); }); } } protocolGenerator.generateSharedComponents(context); }); } if (settings.generateServerSdk()) { for (OperationShape operation : directive.operations()) { delegator.useShapeWriter(operation, w -> { ServerGenerator.generateOperationHandler(symbolProvider, service, operation, w); }); } } } @Override public void generateStructure(GenerateStructureDirective directive) { directive .context() .writerDelegator() .useShapeWriter(directive.shape(), writer -> { StructureGenerator generator = new StructureGenerator( directive.model(), directive.settings(), directive.symbolProvider(), writer, directive.shape(), directive.settings().generateServerSdk(), directive.settings().getRequiredMemberMode(), SchemaGenerationAllowlist.allows(directive.settings().getService(), directive.settings()) ); generator.run(); }); } @Override public void generateError(GenerateErrorDirective directive) { directive .context() .writerDelegator() .useShapeWriter(directive.shape(), writer -> { StructureGenerator generator = new StructureGenerator( directive.model(), directive.settings(), directive.symbolProvider(), writer, directive.shape(), directive.settings().generateServerSdk(), directive.settings().getRequiredMemberMode(), SchemaGenerationAllowlist.allows(directive.settings().getService(), directive.settings()) ); generator.run(); }); } @Override public void generateUnion(GenerateUnionDirective directive) { directive .context() .writerDelegator() .useShapeWriter(directive.shape(), writer -> { UnionGenerator generator = new UnionGenerator( directive.model(), directive.settings(), directive.symbolProvider(), writer, directive.shape(), directive.settings().generateServerSdk(), SchemaGenerationAllowlist.allows(directive.settings().getService(), directive.settings()) ); generator.run(); }); } @Override public void generateEnumShape(GenerateEnumDirective directive) { directive .context() .writerDelegator() .useShapeWriter(directive.shape(), writer -> { EnumGenerator generator = new EnumGenerator( directive.shape().asStringShape().get(), directive.symbolProvider().toSymbol(directive.shape()), writer ); generator.run(); }); } @Override public void generateIntEnumShape(GenerateIntEnumDirective directive) { directive .context() .writerDelegator() .useShapeWriter(directive.shape(), writer -> { IntEnumGenerator generator = new IntEnumGenerator( directive.shape().asIntEnumShape().get(), directive.symbolProvider().toSymbol(directive.shape()), writer ); generator.run(); }); } @Override public void customizeBeforeIntegrations( CustomizeDirective directive ) { // Write shared / static content. STATIC_FILE_COPIES.forEach((from, to) -> { LOGGER.fine(() -> "Writing contents of `" + from + "` to `" + to + "`"); directive.fileManifest().writeFile(from, getClass(), to); }); TypeScriptWriter modelIndexer = SymbolVisitor.modelIndexer( directive.connectedShapes().values(), directive.symbolProvider() ); // Generate the client Node and Browser configuration files. These // files are switched between in package.json based on the targeted // environment. if (directive.settings().generateClient()) { // For now these are only generated for clients. // TODO: generate ssdk config RuntimeConfigGenerator configGenerator = new RuntimeConfigGenerator( directive.settings(), directive.model(), directive.symbolProvider(), directive.context().writerDelegator(), directive.context().integrations(), directive.context().applicationProtocol() ); for (LanguageTarget target : LanguageTarget.values()) { LOGGER.fine("Generating " + target + " runtime configuration"); configGenerator.generate(target); } new ExtensionConfigurationGenerator( directive.model(), directive.settings(), directive.service(), directive.symbolProvider(), directive.context().writerDelegator(), directive.context().integrations() ).generate(); new RuntimeExtensionsGenerator( directive.model(), directive.settings(), directive.service(), directive.symbolProvider(), directive.context().writerDelegator(), directive.context().integrations() ).generate(); } // Generate index for client. BiConsumer> writerFactory = directive .context() .writerDelegator()::useFileWriter; writerFactory.accept(Paths.get(CodegenUtils.SOURCE_FOLDER, "index.ts").toString(), writer -> { IndexGenerator.writeIndex( directive.settings(), directive.model(), directive.symbolProvider(), directive.context().protocolGenerator(), writer, modelIndexer ); }); if (directive.settings().generateClient() && directive.settings().generateIndexTests()) { writerFactory.accept(Paths.get(CodegenUtils.TEST_FOLDER, "index-types.ts").toString(), writer -> { new PackageApiValidationGenerator( writer, directive.settings(), directive.model(), directive.symbolProvider() ).writeTypeIndexTest(); }); writerFactory.accept(Paths.get(CodegenUtils.TEST_FOLDER, "index-objects.spec.mjs").toString(), writer -> { new PackageApiValidationGenerator( writer, directive.settings(), directive.model(), directive.symbolProvider() ).writeRuntimeIndexTest(); }); } // snapshot tests require schema mode and client codegen. if ( directive.settings().generateClient() && directive.settings().generateSnapshotTests() && SchemaGenerationAllowlist.allows( directive.settings().getService(), directive.settings() ) ) { writerFactory.accept(Paths.get(CodegenUtils.TEST_FOLDER, "snapshots.integ.spec.ts").toString(), writer -> { new PackageApiValidationGenerator( writer, directive.settings(), directive.model(), directive.symbolProvider() ).writeSnapshotTest(); }); } if (directive.settings().generateServerSdk()) { // Generate index for server IndexGenerator.writeServerIndex( directive.settings(), directive.model(), directive.symbolProvider(), directive.fileManifest() ); } // Generate protocol tests IFF found in the model. ProtocolGenerator protocolGenerator = directive.context().protocolGenerator(); if (protocolGenerator != null) { ProtocolGenerator.GenerationContext context = new ProtocolGenerator.GenerationContext(); context.setProtocolName(protocolGenerator.getName()); context.setModel(directive.model()); context.setService(directive.service()); context.setSettings(directive.settings()); context.setSymbolProvider(directive.symbolProvider()); context.setWriterDelegator(directive.context().writerDelegator()); protocolGenerator.generateProtocolTests(context); } } @Override public void customizeAfterIntegrations(CustomizeDirective directive) { LOGGER.fine("Generating package.json files"); PackageJsonGenerator.writePackageJson( directive.settings(), directive.fileManifest(), SymbolDependency.gatherDependencies(directive.context().writerDelegator().getDependencies().stream()) ); } private void checkValidationSettings(TypeScriptSettings settings, Model model, ServiceShape service) { if (settings.isDisableDefaultValidation()) { return; } final OperationIndex operationIndex = OperationIndex.of(model); List unvalidatedOperations = TopDownIndex.of(model) .getContainedOperations(service) .stream() .filter( o -> operationIndex .getErrors(o, service) .stream() .noneMatch(e -> e.getId().equals(VALIDATION_EXCEPTION_SHAPE)) ) .map(s -> s.getId().toString()) .sorted() .collect(Collectors.toList()); if (!unvalidatedOperations.isEmpty()) { throw new CodegenException( String.format( "Every operation must have the %s error attached unless %s is set " + "to 'true' in the plugin settings. Operations without %s " + "errors attached: %s", VALIDATION_EXCEPTION_SHAPE, TypeScriptSettings.DISABLE_DEFAULT_VALIDATION, VALIDATION_EXCEPTION_SHAPE, unvalidatedOperations ) ); } } private void generateClient(GenerateServiceDirective directive) { TypeScriptDelegator delegator = directive.context().writerDelegator(); TypeScriptSettings settings = directive.settings(); ServiceShape service = directive.shape(); Model model = directive.model(); SymbolProvider symbolProvider = directive.symbolProvider(); FileManifest fileManifest = directive.fileManifest(); List integrations = directive.context().integrations(); List runtimePlugins = directive.context().runtimePlugins(); ApplicationProtocol applicationProtocol = directive.context().applicationProtocol(); // Generate the bare-bones service client. delegator.useShapeWriter( service, writer -> new ServiceBareBonesClientGenerator( settings, model, symbolProvider, writer, integrations, runtimePlugins, applicationProtocol ).run() ); if (!directive.settings().useLegacyAuth()) { new HttpAuthSchemeProviderGenerator( delegator, settings, model, symbolProvider, directive.context().integrations() ).run(); } // Generate the aggregated service client. Symbol serviceSymbol = symbolProvider.toSymbol(service); String aggregatedClientName = ReplaceLast.in(serviceSymbol.getName(), "Client", ""); String filename = ReplaceLast.in(serviceSymbol.getDefinitionFile(), "Client", ""); delegator.useFileWriter( filename, writer -> new ServiceAggregatedClientGenerator( settings, model, symbolProvider, aggregatedClientName, writer, applicationProtocol ).run() ); // Generate each operation for the service. Set containedOperations = directive.operations(); for (OperationShape operation : containedOperations) { if (operation.hasTrait(PaginatedTrait.ID)) { String outputFilename = PaginationGenerator.getOutputFileLocation(operation); delegator.useFileWriter( outputFilename, paginationWriter -> new PaginationGenerator( model, service, operation, symbolProvider, paginationWriter, aggregatedClientName ).run() ); } if (operation.hasTrait(WaitableTrait.ID)) { WaitableTrait waitableTrait = operation.expectTrait(WaitableTrait.class); waitableTrait .getWaiters() .forEach((String waiterName, Waiter waiter) -> { String outputFilename = WaiterGenerator.getOutputFileLocation(waiterName); delegator.useFileWriter( outputFilename, waiterWriter -> new WaiterGenerator( waiterName, waiter, service, operation, waiterWriter, symbolProvider, settings, model ).run() ); }); } } new SchemaGenerator(model, fileManifest, settings, symbolProvider).run(); if (containedOperations.stream().anyMatch(operation -> operation.hasTrait(PaginatedTrait.ID))) { PaginationGenerator.writeIndex(model, service, fileManifest); delegator.useFileWriter( PaginationGenerator.PAGINATION_INTERFACE_FILE, paginationWriter -> PaginationGenerator.generateServicePaginationInterfaces( aggregatedClientName, serviceSymbol, paginationWriter ) ); } if (containedOperations.stream().anyMatch(operation -> operation.hasTrait(WaitableTrait.ID))) { WaiterGenerator.writeIndex(model, service, fileManifest); } } private void generateCommands(GenerateServiceDirective directive) { TypeScriptDelegator delegator = directive.context().writerDelegator(); TypeScriptSettings settings = directive.settings(); ServiceShape service = directive.shape(); Model model = directive.model(); SymbolProvider symbolProvider = directive.symbolProvider(); FileManifest fileManifest = directive.fileManifest(); List runtimePlugins = directive.context().runtimePlugins(); ProtocolGenerator protocolGenerator = directive.context().protocolGenerator(); ApplicationProtocol applicationProtocol = directive.context().applicationProtocol(); // Write operation index files if (settings.generateClient()) { CommandGenerator.writeIndex(model, service, symbolProvider, fileManifest); } if (settings.generateServerSdk()) { ServerCommandGenerator.writeIndex(model, service, symbolProvider, fileManifest); } // Generate each operation for the service. for (OperationShape operation : directive.operations()) { // Right now this only generates stubs if (settings.generateClient()) { delegator.useShapeWriter( operation, commandWriter -> new CommandGenerator( settings, model, operation, symbolProvider, commandWriter, runtimePlugins, protocolGenerator, applicationProtocol ).run() ); } if (settings.generateServerSdk()) { delegator.useShapeWriter( operation, commandWriter -> new ServerCommandGenerator( settings, model, operation, symbolProvider, commandWriter, protocolGenerator, applicationProtocol ).run() ); } } } private void generateEndpointV2(GenerateServiceDirective directive) { new EndpointsV2Generator(directive.context().writerDelegator(), directive.settings(), directive.model()).run(); } private void generateServiceInterface( GenerateServiceDirective directive ) { ServiceShape service = directive.shape(); SymbolProvider symbolProvider = directive.symbolProvider(); Set operations = directive.operations(); directive .context() .writerDelegator() .useShapeWriter(service, writer -> { ServerGenerator.generateOperationsType(symbolProvider, service, operations, writer); ServerGenerator.generateServerInterfaces(symbolProvider, service, operations, writer); ServerGenerator.generateServiceHandler(symbolProvider, service, operations, writer); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/EnumGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.Comparator; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.traits.EnumDefinition; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates an appropriate TypeScript type from a Smithy enum string. * *

For example, given the following Smithy model: * *

{@code
 * @enum("YES": {name: "YEP"}, "NO": {name: "NOPE"})
 * string TypedYesNo
 * }
* *

We will generate the following: * *

{@code
 * export const TypedYesNo = {
 *   YES: "YEP",
 *   NO: "NOPE",
 * } as const;
 * type TypedYesNo = typeof TypedYesNo[keyof typeof TypedYesNo];
 * }
* *

Shapes that refer to this string as a member will use the following * generated code: * *

{@code
 * import { TypedYesNo } from "./TypedYesNo";
 *
 * interface MyStructure {
 *   "yesNo": TypedYesNo;
 * }
 * }
*/ @SmithyInternalApi final class EnumGenerator implements Runnable { private final Symbol symbol; private final StringShape shape; private final TypeScriptWriter writer; private final EnumTrait enumTrait; EnumGenerator(StringShape shape, Symbol symbol, TypeScriptWriter writer) { assert shape.getTrait(EnumTrait.class).isPresent(); this.shape = shape; this.symbol = symbol; this.writer = writer; enumTrait = shape.getTrait(EnumTrait.class).get(); } @Override public void run() { if (!enumTrait.hasNames()) { generateUnnamedEnum(); } else { generateNamedEnum(); } } // Unnamed enums generate a union of string literals. private void generateUnnamedEnum() { String variants = TypeScriptUtils.getEnumVariants(enumTrait.getEnumDefinitionValues()); writer.writeDocs("@public").write("export type $L = $L", symbol.getName(), variants); } // Named enums generate an actual enum type. private void generateNamedEnum() { writer .writeDocs("@public\n@enum") .openBlock("export const $L = {", "} as const;", symbol.getName(), () -> { // Sort the named values to ensure a stable order and sane diffs. // TODO: Should we just sort these in the trait itself? enumTrait .getValues() .stream() .sorted(Comparator.comparing(e -> e.getName().get())) .forEach(this::writeNamedEnumConstant); }); String inline = """ export type %s = (typeof %s)[keyof typeof %s];""".formatted( symbol.getName(), symbol.getName(), symbol.getName() ); String breakline = inline.replace("= ", "=\n "); writer .writeDocs("@public") .write( inline.length() <= TypeScriptWriter.LINE_WIDTH ? inline : breakline ); } private void writeNamedEnumConstant(EnumDefinition body) { assert body.getName().isPresent(); String name = body.getName().get(); body.getDocumentation().ifPresent(writer::writeDocs); writer.write("$L: $S,", TypeScriptUtils.sanitizePropertyName(name), body.getValue()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ExtensionConfigurationGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.typescript.codegen.validation.ReplaceLast; public class ExtensionConfigurationGenerator { private static final String CLIENT_CONFIGURATION_TEMPLATE = "extensionConfiguration.template"; private static final String FILENAME = "extensionConfiguration.ts"; private final Model model; private final TypeScriptSettings settings; private final ServiceShape service; private final SymbolProvider symbolProvider; private final TypeScriptDelegator delegator; private final List integrations; public ExtensionConfigurationGenerator( Model model, TypeScriptSettings settings, ServiceShape service, SymbolProvider symbolProvider, TypeScriptDelegator delegator, List integrations ) { this.model = model; this.settings = settings; this.service = service; this.symbolProvider = symbolProvider; this.delegator = delegator; this.integrations = integrations; } void generate() { Map interfaces = new HashMap<>(); Map submodules = new HashMap<>(); for (TypeScriptIntegration integration : integrations) { integration .getExtensionConfigurationInterfaces(model, settings) .forEach(configurationInterface -> { interfaces.put(configurationInterface.name().left, configurationInterface.name().right); if (configurationInterface.submodule() != null) { submodules.put(configurationInterface.name().left, configurationInterface.submodule()); } }); } String clientName = ReplaceLast.in( ReplaceLast.in(symbolProvider.toSymbol(service).getName(), "Client", ""), "client", "" ); String clientConfigurationContent = TypeScriptUtils.loadResourceAsString(CLIENT_CONFIGURATION_TEMPLATE) .replace("${extensionConfigName}", clientName + "ExtensionConfiguration") .replace("${extensionConfigInterfaces}", String.join(",\n ", interfaces.keySet())); delegator.useFileWriter(Paths.get(CodegenUtils.SOURCE_FOLDER, FILENAME).toString(), writer -> { interfaces .entrySet() .forEach(entry -> { writer.addDependency(entry.getValue()); if ( submodules.containsKey(entry.getKey()) && entry.getValue().getPackageName().equals("@smithy/core") ) { writer.addTypeImportSubmodule( entry.getKey(), null, entry.getValue(), submodules.get(entry.getKey()) ); } else { writer.addTypeImport(entry.getKey(), null, entry.getValue()); } }); writer.write(clientConfigurationContent); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/FrameworkErrorModel.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.model.Model; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public enum FrameworkErrorModel { INSTANCE; private final Model model = Model.assembler() .addImport(FrameworkErrorModel.class.getResource("framework-errors.smithy")) .assemble() .unwrap(); public Model getModel() { return model; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/HttpProtocolTestGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static java.lang.String.format; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.nio.file.Paths; import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.logging.Logger; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.HttpBinding; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.knowledge.HttpBindingIndex; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.NodeVisitor; import software.amazon.smithy.model.node.NullNode; import software.amazon.smithy.model.node.NumberNode; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.HttpLabelTrait; import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.protocoltests.traits.AppliesTo; import software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestCase; import software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestsTrait; import software.amazon.smithy.protocoltests.traits.HttpMalformedResponseDefinition; import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase; import software.amazon.smithy.protocoltests.traits.HttpRequestTestCase; import software.amazon.smithy.protocoltests.traits.HttpRequestTestsTrait; import software.amazon.smithy.protocoltests.traits.HttpResponseTestCase; import software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.util.PropertyAccessor; import software.amazon.smithy.utils.IoUtils; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates HTTP protocol test cases to be run using Vitest. * *

Protocol tests are defined for HTTP protocols using the * {@code smithy.test#httpRequestTests}, {@code smithy.test#httpResponseTests} * and {@code smithy.test#httpMalformedRequestTests} traits. When found on * operations or errors attached to operations, a protocol test case will be * generated that asserts that the protocol serialization and deserialization * code creates the correct HTTP requests and responses for a specific set of * parameters. * * TODO: try/catch and if/else are still cumbersome with TypeScriptWriter. */ @SmithyInternalApi public final class HttpProtocolTestGenerator implements Runnable { private static final Logger LOGGER = Logger.getLogger(HttpProtocolTestGenerator.class.getName()); private static final String TEST_CASE_FILE_TEMPLATE = "test/functional/%s.spec.ts"; private static final String SERDE_BENCHMARK_TAG = "serde-benchmark"; private static final String WARMUP_ITERATIONS = "10_000"; private static final String BENCHMARK_ITERATIONS = "10_000"; private static final String BENCHMARK_TIMEOUT = "60_000"; private final TypeScriptSettings settings; private final Model model; private final ShapeId protocol; private final ServiceShape service; private final SymbolProvider symbolProvider; private final Symbol serviceSymbol; private final Set additionalStubs = new TreeSet<>(); private final ProtocolGenerator protocolGenerator; private final TestFilter testFilter; private final MalformedRequestTestFilter malformedRequestTestFilter; private final GenerationContext context; private final ServiceClosure closure; private TypeScriptWriter writer; public HttpProtocolTestGenerator( GenerationContext context, ProtocolGenerator protocolGenerator, TestFilter testFilter, MalformedRequestTestFilter malformedRequestTestFilter ) { this.settings = context.getSettings(); this.model = context.getModel(); this.protocol = protocolGenerator.getProtocol(); this.service = settings.getService(model); this.symbolProvider = context.getSymbolProvider(); this.protocolGenerator = protocolGenerator; serviceSymbol = symbolProvider.toSymbol(service).toBuilder().putProperty("typeOnly", false).build(); this.testFilter = testFilter; this.malformedRequestTestFilter = malformedRequestTestFilter; this.context = context; this.closure = ServiceClosure.of(model, settings.getService(model)); } @Override public void run() { OperationIndex operationIndex = OperationIndex.of(model); TopDownIndex topDownIndex = TopDownIndex.of(model); boolean hasSerdeBenchmarks = closure.getOperationShapes() .stream() .anyMatch(o -> { if (o.hasTag("server-only")) { return false; } return o.getTrait(HttpRequestTestsTrait.class) .map( r -> r.getTestCases() .stream() .anyMatch(c -> c.hasTag(SERDE_BENCHMARK_TAG)) ) .orElse(false) || o.getTrait(HttpRequestTestsTrait.class) .map(r -> r.getTestCases().stream().anyMatch(c -> c.hasTag(SERDE_BENCHMARK_TAG))) .orElse(false); }); if (hasSerdeBenchmarks) { initializeWriterIfNeeded(); writer.write( """ const WARMUP_ITERATIONS = $L; const BENCHMARK_ITERATIONS = $L; const BENCHMARK_TIMEOUT = $L; /** * Test name to benchmark data. */ const benchmarks = {} as Record< string, { n: string; p50: string; p90: string; p95: string; p99: string; mean: string; stdDev: string; } >; function logBenchmarks() { console.table(benchmarks); } function logBenchmark(name: string, timings: number[]) { const n = timings.length; const p50 = timings[(n - 1) * 0.50 | 0] | 0; const p90 = timings[(n - 1) * 0.90 | 0] | 0; const p95 = timings[(n - 1) * 0.95 | 0] | 0; const p99 = timings[(n - 1) * 0.99 | 0] | 0; const mean = timings.reduce((a, b) => a + b, 0) / timings.length | 0; const stdDev = Math.sqrt(timings.reduce((a, b) => a + (b - mean) ** 2, 0) / timings.length) | 0; const fmt = (n: number) => String(n.toLocaleString()).padStart(10, ' '); benchmarks[name] = { n: fmt(n), p50: fmt(p50), p90: fmt(p90), p95: fmt(p95), p99: fmt(p99), mean: fmt(mean), stdDev: fmt(stdDev), }; return { name, p95, n, timings }; } function vizBenchmark({ name, p95, n, timings }: { name: string, p95: number, n: number, timings: number[] }) { const decile = p95 / 10; let d = 1; const centIndex = (n / 100) | 0; let line = ""; console.info(name); console.info("=".repeat(31), "Distribution Viz", "=".repeat(31)); for (let i = 0; i < n; i += centIndex) { const t = timings[i]; if (t < decile * d) { line += "."; } else { line += ` <= $${(decile * d) | 0}`; console.info(line); d += 1; line = "."; } } console.info(line + ` > $${(decile * (d - 1)) | 0}`); console.info("=".repeat(80)); } """, WARMUP_ITERATIONS, BENCHMARK_ITERATIONS, BENCHMARK_TIMEOUT ); } // Use a TreeSet to have a fixed ordering of tests. for (OperationShape operation : new TreeSet<>(topDownIndex.getContainedOperations(service))) { if (settings.generateClient()) { generateClientOperationTests(operation, operationIndex); } if (settings.generateServerSdk()) { generateServerOperationTests(operation, operationIndex); } } // Include any additional stubs required. for (String additionalStub : additionalStubs) { writer.write(IoUtils.readUtf8Resource(getClass(), additionalStub)); } if (hasSerdeBenchmarks) { writer.addImport("afterAll", null, TypeScriptDependency.VITEST); writer.write(""" afterAll(() => { logBenchmarks(); }); """); } } private void generateClientOperationTests(OperationShape operation, OperationIndex operationIndex) { if (!operation.hasTag("server-only")) { // 1. Generate test cases for each request. operation .getTrait(HttpRequestTestsTrait.class) .ifPresent(trait -> { for (HttpRequestTestCase testCase : trait.getTestCasesFor(AppliesTo.CLIENT)) { onlyIfProtocolMatches(testCase, () -> { if (testCase.hasTag(SERDE_BENCHMARK_TAG)) { generateClientRequestBenchmark(operation, testCase); } else { generateClientRequestTest(operation, testCase); } }); } }); // 2. Generate test cases for each response. operation .getTrait(HttpResponseTestsTrait.class) .ifPresent(trait -> { for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.CLIENT)) { onlyIfProtocolMatches(testCase, () -> { if (testCase.hasTag(SERDE_BENCHMARK_TAG)) { generateResponseBenchmark(operation, testCase); } else { generateResponseTest(operation, testCase); } }); } }); // 3. Generate test cases for each error on each operation. for (StructureShape error : operationIndex.getErrors(operation, service)) { if (!error.hasTag("server-only")) { error .getTrait(HttpResponseTestsTrait.class) .ifPresent(trait -> { for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.CLIENT)) { onlyIfProtocolMatches( testCase, () -> generateErrorResponseTest(operation, error, testCase) ); } }); } } } } private void generateServerOperationTests(OperationShape operation, OperationIndex operationIndex) { if (!operation.hasTag("client-only")) { // 1. Generate test cases for each request. operation .getTrait(HttpRequestTestsTrait.class) .ifPresent(trait -> { for (HttpRequestTestCase testCase : trait.getTestCasesFor(AppliesTo.SERVER)) { onlyIfProtocolMatches(testCase, () -> generateServerRequestTest(operation, testCase)); } }); // 2. Generate test cases for each response. operation .getTrait(HttpResponseTestsTrait.class) .ifPresent(trait -> { for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.SERVER)) { onlyIfProtocolMatches(testCase, () -> generateServerResponseTest(operation, testCase)); } }); // 3. Generate malformed request test cases operation .getTrait(HttpMalformedRequestTestsTrait.class) .ifPresent(trait -> { for (HttpMalformedRequestTestCase testCase : trait.getTestCases()) { onlyIfProtocolMatches(testCase, () -> generateMalformedRequestTest(operation, testCase)); } }); // 3. Generate test cases for each error on each operation. for (StructureShape error : operationIndex.getErrors(operation, service)) { if (!error.hasTag("client-only")) { error .getTrait(HttpResponseTestsTrait.class) .ifPresent(trait -> { for (HttpResponseTestCase testCase : trait.getTestCasesFor(AppliesTo.SERVER)) { onlyIfProtocolMatches( testCase, () -> generateServerErrorResponseTest(operation, error, testCase) ); } }); } } } } // Only generate test cases when its protocol matches the target protocol. private void onlyIfProtocolMatches(T testCase, Runnable runnable) { if (testCase.getProtocol().equals(protocol)) { LOGGER.fine(() -> format("Generating protocol test case for %s.%s", service.getId(), testCase.getId())); initializeWriterIfNeeded(); runnable.run(); } } // Only generate test cases when its protocol matches the target protocol. private void onlyIfProtocolMatches(HttpMalformedRequestTestCase testCase, Runnable runnable) { if (testCase.getProtocol().equals(protocol)) { LOGGER.fine( () -> format( "Generating malformed request test case for %s.%s", service.getId(), testCase.getId() ) ); initializeWriterIfNeeded(); runnable.run(); } } private void initializeWriterIfNeeded() { if (writer == null) { context.getWriterDelegator().useFileWriter(createTestCaseFilename(), writer -> this.writer = writer); writer.addDependency(TypeScriptDependency.SMITHY_TYPES); writer.addDependency(TypeScriptDependency.SMITHY_CORE); // Add the template to each generated test. writer.write(IoUtils.readUtf8Resource(getClass(), "protocol-test-stub.ts")); writer.addImport("test", "it", TypeScriptDependency.VITEST); writer.addImport("expect", null, TypeScriptDependency.VITEST); } } private String createTestCaseFilename() { String baseName = protocol.getName().toLowerCase(Locale.US).replace("-", "_").replace(".", "_"); return TEST_CASE_FILE_TEMPLATE.replace("%s", baseName); } private void generateClientRequestTest(OperationShape operation, HttpRequestTestCase testCase) { Symbol operationSymbol = symbolProvider.toSymbol(operation); String testName = testCase.getId() + ":Request"; testCase.getDocumentation().ifPresent(writer::writeDocs); openTestBlock(operation, testCase, testName, () -> { // Create a client with a custom request handler that intercepts requests. writer.openBlock("const client = new $T({", "});\n", serviceSymbol, () -> { writer.write("...clientParams,"); testCase .getHost() .ifPresent(host -> { writer.write("endpoint: \"https://$L\",", host); }); writer.write("requestHandler: new RequestSerializationTestHandler(),"); }); // Run the parameters through a visitor to adjust for TS specific inputs. ObjectNode params = testCase.getParams(); Optional inputOptional = operation.getInput(); if (inputOptional.isPresent()) { StructureShape inputShape = model.expectShape(inputOptional.get(), StructureShape.class); writer .write("const command = new $T(", operationSymbol) .indent() .call(() -> params.accept(new CommandInputNodeVisitor(inputShape))) .dedent() .write(");"); } else { writer.write("const command = new $T({});", operationSymbol); } // Send the request and look for the expected exception to then perform assertions. writer .write( """ try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request;""" ) .indent() .call(() -> writeHttpRequestAssertions(testCase)) .dedent() .write("}"); }); } private void generateServerRequestTest(OperationShape operation, HttpRequestTestCase testCase) { Symbol operationSymbol = symbolProvider.toSymbol(operation); // Lowercase all the headers we're expecting as this is what we'll get. Map headers = testCase .getHeaders() .entrySet() .stream() .map(entry -> new Pair<>(entry.getKey().toLowerCase(Locale.US), entry.getValue())) .collect(MapUtils.toUnmodifiableMap(Pair::getLeft, Pair::getRight)); String queryParameters = Node.prettyPrintJson(buildQueryBag(testCase.getQueryParams())); String headerParameters = Node.prettyPrintJson(ObjectNode.fromStringMap(headers)); String body = testCase.getBody().orElse(null); String testName = testCase.getId() + ":ServerRequest"; testCase.getDocumentation().ifPresent(writer::writeDocs); openTestBlock(operation, testCase, testName, () -> { Symbol serviceSymbol = symbolProvider.toSymbol(service); Symbol handlerSymbol = serviceSymbol.expectProperty("handler", Symbol.class); // Create a mock function to set in place of the server operation function so we can capture // input and other information. writer.write("const testFunction = vi.fn();"); writer.write("testFunction.mockReturnValue(Promise.resolve({}));"); boolean usesDefaultValidation = !context.getSettings().isDisableDefaultValidation(); setupStubService(operationSymbol, serviceSymbol, handlerSymbol, usesDefaultValidation); // Construct a new http request according to the test case definition. writer.openBlock("const request = new HttpRequest({", "});", () -> { writer.write("method: $S,", testCase.getMethod()); writer.write("hostname: $S,", testCase.getHost().orElse("foo.example.com")); writer.write("path: $S,", testCase.getUri()); writer.write("query: $L,", queryParameters); writer.write("headers: $L,", headerParameters); if (body != null) { writer.write("body: Readable.from([$S]),", body); } }); writer.write("await handler.handle(request, {});").write(""); // Assert that the function has been called exactly once. writer.write("expect(testFunction.mock.calls.length).toBe(1);"); // Capture the input. We need to cast this to any so we can index into it. writer.write("let r: any = testFunction.mock.calls[0][0];").write(""); writeRequestParamAssertions(operation, testCase); }); } private void generateMalformedRequestTest(OperationShape operation, HttpMalformedRequestTestCase testCase) { Symbol operationSymbol = symbolProvider.toSymbol(operation); Map requestHeaders = testCase .getRequest() .getHeaders() .entrySet() .stream() .map(entry -> new Pair<>(entry.getKey().toLowerCase(Locale.US), entry.getValue())) .collect(MapUtils.toUnmodifiableMap(Pair::getLeft, Pair::getRight)); String queryParameters = Node.prettyPrintJson(buildQueryBag(testCase.getRequest().getQueryParams())); String requestHeaderParameters = Node.prettyPrintJson(ObjectNode.fromStringMap(requestHeaders)); String requestBody = testCase.getRequest().getBody().orElse(null); String testName = testCase.getId() + ":MalformedRequest"; testCase.getDocumentation().ifPresent(writer::writeDocs); openTestBlock(operation, testCase, testName, () -> { Symbol serviceSymbol = symbolProvider.toSymbol(service); Symbol handlerSymbol = serviceSymbol.expectProperty("handler", Symbol.class); // Create a mock function to set in place of the server operation function so we can capture // input and other information. writer.write("const testFunction = vi.fn();"); writer.openBlock("testFunction.mockImplementation(() => {", "});", () -> { writer.write("throw new Error($S);", "This request should have been rejected."); }); boolean usesDefaultValidation = !context.getSettings().isDisableDefaultValidation(); setupStubService(operationSymbol, serviceSymbol, handlerSymbol, usesDefaultValidation); // Construct a new http request according to the test case definition. writer.openBlock("const request = new HttpRequest({", "});", () -> { writer.write("method: $S,", testCase.getRequest().getMethod()); writer.write("hostname: $S,", testCase.getRequest().getHost().orElse("foo.example.com")); writer.write("path: $S,", testCase.getRequest().getUri()); writer.write("query: $L,", queryParameters); writer.write("headers: $L,", requestHeaderParameters); if (requestBody != null) { writer.write("body: Readable.from([$S]),", requestBody); } }); writer.write("const r = await handler.handle(request, {});").write(""); writer.write("expect(testFunction.mock.calls.length).toBe(0);"); writeHttpResponseAssertions(testCase.getResponse()); }); } private void setupStubService( Symbol operationSymbol, Symbol serviceSymbol, Symbol handlerSymbol, boolean usesDefaultValidation ) { // We use a partial here so that we don't have to define the entire service, but still get the advantages // the type checker, including excess property checking. Later on we'll use `as` to cast this to the // full service so that we can actually use it. writer.openBlock("const testService: Partial<$T<{}>> = {", "};", serviceSymbol, () -> { writer.write("$L: testFunction as $T<{}>,", operationSymbol.getName(), operationSymbol); }); String getHandlerName = "get" + handlerSymbol.getName(); writer.addRelativeImport( getHandlerName, null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, ServerSymbolVisitor.SERVER_FOLDER) ); if (!usesDefaultValidation) { writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); // Cast the service as any so TS will ignore the fact that the type being passed in is incomplete. writer.openBlock( "const handler = $L(testService as $T<{}>, (ctx: {}, failures: __ValidationFailure[]) => {", "});", getHandlerName, serviceSymbol, () -> writer.write("if (failures) { throw failures; } return undefined;") ); } else { writer.write("const handler = $L(testService as $T<{}>);", getHandlerName, serviceSymbol); } } private ObjectNode buildQueryBag(List queryParams) { // The query params in the test definition is a list of strings that looks like // "Foo=Bar", so we need to split the keys from the values. Map> query = queryParams .stream() .map(pair -> { String[] split = pair.split("="); String key; String value = ""; try { // The strings we're given are url encoded, so we need to decode them. In an actual implementation // the request we're given will have already decoded these. key = URLDecoder.decode(split[0], StandardCharsets.UTF_8.toString()); if (split.length > 1) { value = URLDecoder.decode(split[1], StandardCharsets.UTF_8.toString()); } } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return Pair.of(key, value); }) // Query lists/sets will just use the same key repeatedly, so here we collect all the values that // share a key. .collect(Collectors.groupingBy(Pair::getKey, Collectors.mapping(Pair::getValue, Collectors.toList()))); ObjectNode.Builder nodeBuilder = ObjectNode.objectNodeBuilder(); for (Map.Entry> entry : query.entrySet()) { nodeBuilder.withMember(entry.getKey(), ArrayNode.fromStrings(entry.getValue())); } return nodeBuilder.build(); } // Ensure that the serialized request matches the expected request. private void writeHttpRequestAssertions(HttpRequestTestCase testCase) { writer.write("expect(r.method).toBe($S);", testCase.getMethod()); writer.write("expect(r.path).toBe($S);", testCase.getUri()); writeHttpHeaderAssertions(testCase); writeHttpQueryAssertions(testCase); writeHttpHostAssertion(testCase); testCase .getBody() .ifPresent(body -> { writeHttpBodyAssertions(body, testCase.getBodyMediaType().orElse("UNKNOWN"), true); }); } private void writeHttpResponseAssertions(HttpResponseTestCase testCase) { writer.write("expect(r.statusCode).toBe($L);", testCase.getCode()); writeHttpHeaderAssertions(testCase); testCase .getBody() .ifPresent(body -> { writeHttpBodyAssertions(body, testCase.getBodyMediaType().orElse("UNKNOWN"), false); }); } private void writeHttpResponseAssertions(HttpMalformedResponseDefinition responseDefinition) { writer.write("expect(r.statusCode).toBe($L);", responseDefinition.getCode()); responseDefinition .getHeaders() .forEach((header, value) -> { header = header.toLowerCase(); writer.write("expect(r.headers[$S]).toBe($S);", header, value); }); writer.write(""); responseDefinition .getBody() .ifPresent(body -> { // only one of messageRegex or contents can be present, as it's modeled as a union // so only one of these will execute in practice body .getMessageRegex() .ifPresent(regex -> { writeHttpBodyMessageAssertion(regex, body.getMediaType()); }); body .getContents() .ifPresent(contents -> { writeHttpBodyAssertions(contents, body.getMediaType(), false); }); }); } private void writeHttpQueryAssertions(HttpRequestTestCase testCase) { testCase .getRequireQueryParams() .forEach( requiredQueryParam -> writer.write( """ expect( r.query[$1S], `Query key $1S should have been defined in $${JSON.stringify(r.query)}` ).toBeDefined();""", requiredQueryParam ) ); writer.write(""); testCase .getForbidQueryParams() .forEach( forbidQueryParam -> writer.write( """ expect( r.query[$1S], `Query key $1S should have been undefined in $${JSON.stringify(r.query)}` ).toBeUndefined();""", forbidQueryParam ) ); writer.write(""); List explicitQueryValues = testCase.getQueryParams(); if (!explicitQueryValues.isEmpty()) { // Use buildQueryString like the fetch handler will. writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "buildQueryString", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.write("const queryString = buildQueryString(r.query);"); explicitQueryValues.forEach( explicitQueryValue -> writer.write("expect(queryString).toContain($S);", explicitQueryValue) ); } writer.write(""); } private void writeHttpHeaderAssertions(HttpMessageTestCase testCase) { testCase .getRequireHeaders() .forEach(requiredHeader -> { writer.write( """ expect( r.headers[$1S], `Header key $1S should have been defined in $${JSON.stringify(r.headers)}` ).toBeDefined();""", requiredHeader.toLowerCase() ); }); writer.write(""); testCase .getForbidHeaders() .forEach( forbidHeader -> writer.write( """ expect( r.headers[$1S], `Header key $1S should have been undefined in $${JSON.stringify(r.headers)}` ).toBeUndefined();""", forbidHeader.toLowerCase() ) ); writer.write(""); testCase .getHeaders() .forEach((header, value) -> { header = header.toLowerCase(); writer.write("expect(r.headers[$S]).toBe($S);", header, value); }); writer.write(""); } private void writeHttpHostAssertion(HttpRequestTestCase testCase) { testCase .getResolvedHost() .ifPresent(resolvedHost -> { writer.write("expect(r.headers[\"host\"]).toBe($S);", resolvedHost); writer.write(""); }); } private void writeHttpBodyAssertions(String body, String mediaType, boolean isClientTest) { if (body.isEmpty()) { // If we expect an empty body, expect it to be falsy. // Or, for JSON an empty object represents an empty body. // mediaType is often UNKNOWN here. writer.write("expect(!r.body || r.body === `{}`).toBeTruthy();"); return; } // Fast fail if we don't have a body. writer.write("expect(r.body, `Body was undefined.`).toBeDefined();"); // Otherwise load a media type specific comparator and do a comparison. String comparatorInvoke = registerBodyComparatorStub(mediaType); // If this is a request case then we know we're generating a client test, // because a request case for servers would be comparing parsed objects. We // need to know which is which here to be able to grab the utf8Encoder from // the right place. if (!mediaType.equals("application/cbor")) { if (isClientTest) { writer.write("const utf8Encoder = client.config.utf8Encoder;"); } else { writer.addImportSubmodule( "toUtf8", "__utf8Encoder", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("const utf8Encoder = __utf8Encoder;"); } } // Handle escaping strings with quotes inside them. writer.write("const bodyString = `$L`;", body.replace("\"", "\\\"")); writer.write("const unequalParts: any = $L;", comparatorInvoke); writer.write("expect(unequalParts).toBeUndefined();"); } private void writeHttpBodyMessageAssertion(String messageRegex, String mediaType) { // Fast fail if we don't have a body. writer.write("expect(r.body, `Body was undefined`).toBeDefined();"); // Otherwise load a media type specific matcher String comparatorInvoke = registerMessageRegexStub(mediaType); writer.writeInline("expect(").writeInline(comparatorInvoke, messageRegex).write(").toEqual(true);"); } private String registerBodyComparatorStub(String mediaType) { // Load an additional stub to handle body comparisons for the // set of bodyMediaType values we know of. switch (mediaType) { case "application/x-www-form-urlencoded": additionalStubs.add("protocol-test-form-urlencoded-stub.ts"); return "compareEquivalentFormUrlencodedBodies(bodyString, r.body.toString())"; case "application/json": additionalStubs.add("protocol-test-json-stub.ts"); return "compareEquivalentJsonBodies(bodyString, r.body.toString())"; case "application/xml": writer.addDependency(TypeScriptDependency.XML_PARSER); writer.addDependency(TypeScriptDependency.HTML_ENTITIES); writer.addImport("XMLParser", null, TypeScriptDependency.XML_PARSER); writer.addImport("decodeHTML", null, TypeScriptDependency.HTML_ENTITIES); additionalStubs.add("protocol-test-xml-stub.ts"); return "compareEquivalentXmlBodies(bodyString, r.body.toString())"; case "application/octet-stream": writer.addTypeImport("Encoder", "__Encoder", TypeScriptDependency.SMITHY_TYPES); additionalStubs.add("protocol-test-octet-stream-stub.ts"); return "compareEquivalentOctetStreamBodies(utf8Encoder, bodyString, r.body)"; case "text/plain": additionalStubs.add("protocol-test-text-stub.ts"); return "compareEquivalentTextBodies(bodyString, r.body)"; case "application/cbor": writer.addImportSubmodule("cbor", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR); additionalStubs.add("protocol-test-cbor-stub.ts"); return "compareEquivalentCborBodies(bodyString, r.body)"; default: LOGGER.warning( "Unable to compare bodies with unknown media type `" + mediaType + "`, defaulting to direct comparison." ); writer.addTypeImport("Encoder", "__Encoder", TypeScriptDependency.SMITHY_TYPES); additionalStubs.add("protocol-test-unknown-type-stub.ts"); return "compareEquivalentUnknownTypeBodies(utf8Encoder, bodyString, r.body)"; } } private String registerMessageRegexStub(String mediaType) { // Load an additional stub to handle body comparisons for the // set of bodyMediaType values we know of. switch (mediaType) { case "application/json": additionalStubs.add("malformed-request-test-regex-json-stub.ts"); return "matchMessageInJsonBody(r.body.toString(), $S)"; default: throw new IllegalArgumentException("Unsupported media type for message body regex check: " + mediaType); } } public void generateServerResponseTest(OperationShape operation, HttpResponseTestCase testCase) { Symbol serviceSymbol = symbolProvider.toSymbol(service); Symbol operationSymbol = symbolProvider.toSymbol(operation); testCase.getDocumentation().ifPresent(writer::writeDocs); String testName = testCase.getId() + ":ServerResponse"; openTestBlock(operation, testCase, testName, () -> { Symbol outputType = operationSymbol.expectProperty("outputType", Symbol.class); writer.openBlock("class TestService implements Partial<$T<{}>> {", "}", serviceSymbol, () -> { writer.openBlock( "$L(input: any, ctx: {}): Promise<$T> {", "}", operationSymbol.getName(), outputType, () -> { Optional outputOptional = operation.getOutput(); if (outputOptional.isPresent()) { StructureShape outputShape = model.expectShape(outputOptional.get(), StructureShape.class); writer.writeInline("let response = "); testCase.getParams().accept(new CommandInputNodeVisitor(outputShape, true)); writer.write("return Promise.resolve({ ...response, '$$metadata': {} });"); } else { writer.write("return Promise.resolve({ '$$metadata': {} });"); } } ); }); writeServerResponseTest(operation, testCase); }); } private void generateResponseTest(OperationShape operation, HttpResponseTestCase testCase) { testCase.getDocumentation().ifPresent(writer::writeDocs); String testName = testCase.getId() + ":Response"; openTestBlock(operation, testCase, testName, () -> { writeResponseTestSetup(operation, testCase, true); // Invoke the handler and look for the expected response to then perform assertions. writer.write("let r: any;"); writer.write( """ try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; }""" ); writeResponseAssertions(operation, testCase); }); } private void generateClientRequestBenchmark(OperationShape operation, HttpRequestTestCase testCase) { Symbol operationSymbol = symbolProvider.toSymbol(operation); String testName = testCase.getId() + ":SerdeBenchmark:Request"; testCase.getDocumentation().ifPresent(writer::writeDocs); openTestBlock(operation, testCase, testName, () -> { writer.openBlock("const client = new $T({", "});\n", serviceSymbol, () -> { writer.write("...clientParams,"); testCase .getHost() .ifPresent(host -> { writer.write("endpoint: \"https://$L\",", host); }); writer.write("requestHandler: new RequestSerializationTestHandler(),"); }); ObjectNode params = testCase.getParams(); Optional inputOptional = operation.getInput(); if (inputOptional.isPresent()) { StructureShape inputShape = model.expectShape(inputOptional.get(), StructureShape.class); writer .write("const command = new $T(", operationSymbol) .indent() .call(() -> params.accept(new CommandInputNodeVisitor(inputShape))) .dedent() .write(");"); } else { writer.write("const command = new $T({});", operationSymbol); } // Send the request and look for the expected exception to then perform assertions. writer .write( """ const name = $S; const timings = [] as number[]; const testStart = performance.now(); const numeric = (a: number, b: number) => a - b; let i = 0; while (++i) { const preSerialize = performance.now(); try { await client.send(command); fail("Expected an EXPECTED_REQUEST_SERIALIZATION_ERROR to be thrown"); return; } catch (err) { if (!(err instanceof EXPECTED_REQUEST_SERIALIZATION_ERROR)) { fail(err); return; } const r = err.request; }; const postSerialize = performance.now(); if (i >= WARMUP_ITERATIONS) { // allow warmup timings.push(postSerialize * 1_000_000 - preSerialize * 1_000_000); } if (timings.length >= BENCHMARK_ITERATIONS) { timings.length = BENCHMARK_ITERATIONS; break; } else if (testStart + 30_000 < preSerialize) { break; } } timings.sort(numeric); vizBenchmark(logBenchmark(name, timings)); """, testName ); }); } private void generateResponseBenchmark(OperationShape operation, HttpResponseTestCase testCase) { testCase.getDocumentation().ifPresent(writer::writeDocs); String testName = testCase.getId() + ":SerdeBenchmark:Response"; openTestBlock(operation, testCase, testName, () -> { writeResponseTestSetup(operation, testCase, true); writer.write( """ const name = $S; const timings = [] as number[]; const numeric = (a: number, b: number) => a - b; let i = 0; client.middlewareStack.addRelativeTo( (next: any) => async (args: any) => { const preDeserialize = performance.now(); const r = await next(args); const postDeserialize = performance.now(); if (i >= WARMUP_ITERATIONS) { timings.push(postDeserialize * 1_000_000 - preDeserialize * 1_000_000); } return r; }, { name: "deserializerBenchmarkMiddleware", toMiddleware: "deserializerMiddleware", relation: "before", override: true, } ); const benchmarkStart = performance.now(); while (++i) { let r: any; try { r = await client.send(command); } catch (err) { fail("Expected a valid response to be returned, got " + err); return; } if (i >= WARMUP_ITERATIONS + BENCHMARK_ITERATIONS) { break; } else if (benchmarkStart + 30_000 < performance.now()) { break; } } timings.sort(numeric); timings.length = Math.min(timings.length, BENCHMARK_ITERATIONS); vizBenchmark(logBenchmark(name, timings)); """, testName ); }); } private void generateServerErrorResponseTest( OperationShape operation, StructureShape error, HttpResponseTestCase testCase ) { Symbol serviceSymbol = symbolProvider.toSymbol(service); Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol outputType = operationSymbol.expectProperty("outputType", Symbol.class); Symbol errorSymbol = symbolProvider.toSymbol(error); ErrorTrait errorTrait = error.expectTrait(ErrorTrait.class); testCase.getDocumentation().ifPresent(writer::writeDocs); String testName = testCase.getId() + ":ServerErrorResponse"; openTestBlock(operation, testCase, testName, () -> { // Generates a Partial implementation of the service type that only includes // the specific operation under test. Later we'll have to "cast" this with an "as", // but using the partial in the meantime will give us proper type checking on the // operation we want. writer.openBlock("class TestService implements Partial<$T<{}>> {", "}", serviceSymbol, () -> { writer.openBlock( "$L(input: any, ctx: {}): Promise<$T> {", "}", operationSymbol.getName(), outputType, () -> { // Write out an object according to what's defined in the test case. writer.writeInline("const response = "); testCase.getParams().accept(new CommandInputNodeVisitor(error, true)); // Add in the necessary wrapping information to make the error satisfy its interface. // TODO: having proper constructors for these errors would be really nice so we don't // have to do this. writer.openBlock("const error: $T = {", "};", errorSymbol, () -> { writer.write("...response,"); writer.write("name: $S,", error.getId().getName()); writer.write("$$fault: $S,", errorTrait.isClientError() ? "client" : "server"); writer.write("$$metadata: {},"); }); writer.write("throw error;"); } ); }); writeServerResponseTest(operation, testCase); }); } private void writeServerResponseTest(OperationShape operation, HttpResponseTestCase testCase) { Symbol serviceSymbol = symbolProvider.toSymbol(service); Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol handlerSymbol = serviceSymbol.expectProperty("handler", Symbol.class); Symbol serializerSymbol = operationSymbol.expectProperty("serializerType", Symbol.class); Symbol serviceOperationsSymbol = serviceSymbol.expectProperty("operations", Symbol.class); writer.write("const service: any = new TestService()"); // There's a lot of setup here, including creating our own mux, serializers list, and ultimately // our own service handler. This is largely in service of avoiding having to go through the // request deserializer writer.addImport("httpbinding", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "const testMux = new httpbinding.HttpBindingMux<$S, keyof $T<{}>>([", "]);", service.getId().getName(), serviceSymbol, () -> { writer.openBlock( "new httpbinding.UriSpec<$S, $S>('POST', [], [], {", "}),", service.getId().getName(), operation.getId().getName(), () -> { writer.write("service: $S,", service.getId().getName()); writer.write("operation: $S,", operation.getId().getName()); } ); } ); // Extend the existing serializer and replace the deserialize with a noop so we don't have to // worry about trying to construct something that matches. writer.openBlock("class TestSerializer extends $T {", "}", serializerSymbol, () -> { writer.openBlock("deserialize = (output: any, context: any): Promise => {", "};", () -> { writer.write("return Promise.resolve({});"); }); }); // Since we aren't going through the deserializer, we don't have to put much in the fake request. // Just enough to get it through our test mux. writer.write("const request = new HttpRequest({method: 'POST', hostname: 'example.com'});"); // Create a new serializer factory that always returns our test serializer. writer.addImport("ServiceException", "__ServiceException", TypeScriptDependency.SERVER_COMMON); writer.addImport("OperationSerializer", "__OperationSerializer", TypeScriptDependency.SERVER_COMMON); writer.openBlock( "const serFn: (op: $1T) => __OperationSerializer<$2T<{}>, $1T, __ServiceException> = (op) =>" + " { return new TestSerializer(); };", serviceOperationsSymbol, serviceSymbol ); writer.addRelativeImport( "serializeFrameworkException", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) ) ); writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.write( "const handler = new $T(service, testMux, serFn, serializeFrameworkException, " + "(ctx: {}, f: __ValidationFailure[]) => { if (f) { throw f; } return undefined;});", handlerSymbol ); writer.write("let r = await handler.handle(request, {})").write(""); writeHttpResponseAssertions(testCase); } private void generateErrorResponseTest( OperationShape operation, StructureShape error, HttpResponseTestCase testCase ) { // Use a compound test_case name so we generate unique tests // for each error on each operation safely. This is useful in validating // that operation parsers are all correctly identifying errors and that // we can test for any operation specific values properly. String testName = testCase.getId() + ":Error:" + operation.getId().getName(); testCase.getDocumentation().ifPresent(writer::writeDocs); openTestBlock(operation, testCase, testName, () -> { writeResponseTestSetup(operation, testCase, false); // Invoke the handler and look for the expected exception to then perform assertions. writer .write( """ try { await client.send(command); } catch (err) { if (err.name !== "$1L") { console.log(err); fail(`Expected a $1L to be thrown, got $${err.name} instead`); return; } const r: any = err;""", error.getId().getName() ) .indent() .call(() -> writeResponseAssertions(error, testCase)) .write("return;") .dedent() .write("}"); writer.write("fail(\"Expected an exception to be thrown from response\");"); }); } private void writeResponseTestSetup(OperationShape operation, HttpResponseTestCase testCase, boolean isSuccess) { Symbol operationSymbol = symbolProvider.toSymbol(operation); // Lowercase all the headers we're expecting as this is what we'll get. Map headers = testCase .getHeaders() .entrySet() .stream() .map(entry -> new Pair<>(entry.getKey().toLowerCase(Locale.US), entry.getValue())) .collect(MapUtils.toUnmodifiableMap(Pair::getLeft, Pair::getRight)); String body = testCase.getBody().orElse(null); // Create a client with a custom request handler that intercepts requests. writer.openBlock("const client = new $T({", "});\n", serviceSymbol, () -> { writer.write("...clientParams,"); writer.openBlock("requestHandler: new ResponseDeserializationTestHandler(", "),", () -> { writer.write("$L,", isSuccess); writer.write("$L,", testCase.getCode()); if (headers.isEmpty()) { writer.write("undefined,"); } else { writer.openBlock("{", "},", () -> { for (Map.Entry entry : headers.entrySet()) { String key = entry.getKey().toLowerCase(Locale.US); String value = entry.getValue(); writer.write("$L: $S,", PropertyAccessor.inlineKey(key), value); } }); } if (body != null) { writer.write("`$L`,", body); } writer.unwrite(",\n").write(""); }); }); Collection httpLabelMembers = model.expectShape(operation.getInputShape()) .getAllMembers() .values() .stream() .filter(m -> m.hasTrait(HttpLabelTrait.ID)) .toList(); // HTTP bindings are validated client-side in HttpBindingProtocol, but not RpcProtocol. // They do not apply for non-http binding protocols, but it doesn't harm // anything to generate the placeholder. writer.openCollapsibleBlock("const params: any = {", "};", !httpLabelMembers.isEmpty(), () -> { for (MemberShape httpLabelMember : httpLabelMembers) { writer.write( """ $L: "placeholder",""", PropertyAccessor.inlineKey(httpLabelMember.getMemberName()) ); } }); writer.write("const command = new $T(params);\n", operationSymbol); } // Ensure that the serialized response matches the expected response. private void writeResponseAssertions(Shape operationOrError, HttpResponseTestCase testCase) { writer.write("expect(r.$$metadata.httpStatusCode).toBe($L);", testCase.getCode()); writeResponseParamAssertions(operationOrError, testCase); } private void writeRequestParamAssertions(OperationShape operation, HttpRequestTestCase testCase) { ObjectNode params = testCase.getParams(); if (!params.isEmpty()) { StructureShape testInputShape = model.expectShape( operation.getInput().orElseThrow(() -> new CodegenException("Foo")), StructureShape.class ); // Use this trick wrapper to not need more complex trailing comma handling. writer .write("const paramsToValidate: any = [") .indent() .call(() -> params.accept(new CommandOutputNodeVisitor(testInputShape))) .dedent() .write("][0];"); // Extract a payload binding if present. Optional pb = Optional.empty(); HttpBindingIndex index = HttpBindingIndex.of(model); List payloadBindings = index.getRequestBindings(operation, Location.PAYLOAD); if (!payloadBindings.isEmpty()) { pb = Optional.of(payloadBindings.get(0)); } final Optional payloadBinding = pb; writeParamAssertions(writer, payloadBinding, () -> { // TODO: replace this with a collector from the server config once it's available writer.addImport( "streamCollector", "__streamCollector", TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER ); writer.write( "const comparableBlob = await __streamCollector(r[$S]);", payloadBinding.get().getMemberName() ); }); } } private void writeResponseParamAssertions(Shape operationOrError, HttpResponseTestCase testCase) { ObjectNode params = testCase.getParams(); if (!params.isEmpty()) { StructureShape testOutputShape; if (operationOrError.isStructureShape()) { testOutputShape = operationOrError.asStructureShape().get(); } else { testOutputShape = model.expectShape( operationOrError .asOperationShape() .get() .getOutput() .orElseThrow(() -> new CodegenException("Foo")), StructureShape.class ); } // Use this trick wrapper to not need more complex trailing comma handling. writer .write("const paramsToValidate: any = [") .indent() .call(() -> params.accept(new CommandOutputNodeVisitor(testOutputShape))) .dedent() .write("][0];"); // Extract a payload binding if present. Optional payloadBinding = operationOrError .asOperationShape() .map(operationShape -> { HttpBindingIndex index = HttpBindingIndex.of(model); List payloadBindings = index.getResponseBindings(operationOrError, Location.PAYLOAD); if (!payloadBindings.isEmpty()) { return payloadBindings.get(0); } return null; }); writeParamAssertions(writer, payloadBinding, () -> { writer.write( "const comparableBlob = await client.config.streamCollector(r[$S]);", payloadBinding.get().getMemberName() ); }); } } private void writeParamAssertions( TypeScriptWriter writer, Optional payloadBinding, Runnable writeComparableBlob ) { // If we have a streaming payload blob, we need to collect it to something that // can be compared with the test contents. This emulates the customer experience. boolean hasStreamingPayloadBlob = payloadBinding .map( binding -> model .getShape(binding.getMember().getTarget()) .filter(Shape::isBlobShape) .filter(s -> s.hasTrait(StreamingTrait.ID)) .isPresent() ) .orElse(false); if (hasStreamingPayloadBlob) { writeComparableBlob.run(); } // Perform parameter comparisons. writer.openBlock("Object.keys(paramsToValidate).forEach((param) => {", "});", () -> { writer.write( """ expect( r[param], `The output field $${param} should have been defined in $${JSON.stringify(r, null, 2)}` ).toBeDefined();""" ); if (hasStreamingPayloadBlob) { writer.openBlock( "if (param === $S) {", "} else {", payloadBinding.get().getMemberName(), () -> writer.write( """ expect(equivalentContents(paramsToValidate[param], \ comparableBlob)).toBe(true); """ ) ); writer.indent(); } writer.write("expect(equivalentContents(paramsToValidate[param], r[param])).toBe(true);"); if (hasStreamingPayloadBlob) { writer.dedent(); writer.write("}"); } }); } private void openTestBlock(OperationShape operation, HttpMessageTestCase testCase, String testName, Runnable f) { String timeout = testCase.hasTag(SERDE_BENCHMARK_TAG) ? ", BENCHMARK_TIMEOUT" : ""; // Skipped tests are still generated, just not run. if (testFilter.skip(service, operation, testCase, settings)) { writer.openBlock("it.skip($S, async () => {", testName); } else { writer.openBlock("it($S, async () => {", testName); } f.run(); writer.closeBlock("}$L);\n", timeout); } private void openTestBlock( OperationShape operation, HttpMalformedRequestTestCase testCase, String testName, Runnable f ) { String timeout = testCase.hasTag(SERDE_BENCHMARK_TAG) ? ", BENCHMARK_TIMEOUT" : ""; // Skipped tests are still generated, just not run. if (malformedRequestTestFilter.skip(service, operation, testCase, settings)) { writer.openBlock("it.skip($S, async () => {", testName); } else { writer.openBlock("it($S, async () => {", testName); } f.run(); writer.closeBlock("}$L);\n", timeout); } /** * Supports writing out TS specific input types in the generated code * through visiting the target shape at the same time as the node. If * instead we just printed out the node, many values would not match on * type signatures. * * This handles properly generating Set types for Set shapes, Date types * for numbers that are Timestamp shapes, "undefined" for nulls, boolean * values, and auto-filling idempotency token Structure members. */ private final class CommandInputNodeVisitor implements NodeVisitor { private final StructureShape inputShape; private Shape workingShape; private boolean appendSemicolon; private CommandInputNodeVisitor(StructureShape inputShape) { this(inputShape, false); } private CommandInputNodeVisitor(StructureShape inputShape, boolean appendSemicolon) { this.inputShape = inputShape; this.workingShape = inputShape; this.appendSemicolon = appendSemicolon; } @Override public Void arrayNode(ArrayNode node) { String openElement = "["; String closeElement = "]"; // Write the value out directly. writer.openBlock("$L", closeElement + ",", openElement, () -> { Shape wrapperShape = this.workingShape; node .getElements() .forEach(element -> { // Swap the working shape to the member of the collection. // This isn't necessary if the shape is a document. if (wrapperShape instanceof CollectionShape) { this.workingShape = model.expectShape( ((CollectionShape) wrapperShape).getMember().getTarget() ); } writer.call(() -> element.accept(this)); }); this.workingShape = wrapperShape; }); return null; } @Override public Void booleanNode(BooleanNode node) { // Handle needing to write the boolean's value properly. writer.write(node.getValue() ? "true," : "false,"); return null; } @Override public Void nullNode(NullNode node) { writer.write("null,"); return null; } @Override public Void numberNode(NumberNode node) { // Handle timestamps needing to be converted from numbers to their input type of Date. // Also handle that a Date in TS takes milliseconds, so add 000 to the end. if (workingShape.isTimestampShape()) { writer.write("new Date($L000),", node.getValue()); } else { writer.write("$L,", node.getValue().toString()); } return null; } @Override public Void objectNode(ObjectNode node) { // Short circuit document types, as the direct value is what we want. if (workingShape.isDocumentShape()) { writer.writeInline(Node.prettyPrintJson(node)).writeInline(","); return null; } // Both objects and maps can use a majority of the same logic. // Use "as any" to have TS complain less about undefined entries. String suffix = "} as any"; // When generating a server response test, we need the top level structure to have a semicolon // rather than a comma. if (appendSemicolon) { suffix += ";"; appendSemicolon = false; } else { suffix += ","; } writer.openBlock("{", suffix, () -> { Shape wrapperShape = this.workingShape; node .getMembers() .forEach((keyNode, valueNode) -> { writer.writeInline("$L: ", PropertyAccessor.inlineKey(keyNode.getValue())); // Grab the correct member related to the node member we have. MemberShape memberShape; if (wrapperShape.isStructureShape()) { memberShape = wrapperShape.asStructureShape().get().getMember(keyNode.getValue()).get(); } else if (wrapperShape.isUnionShape()) { memberShape = wrapperShape.asUnionShape().get().getMember(keyNode.getValue()).get(); } else if (wrapperShape.isMapShape()) { memberShape = wrapperShape.asMapShape().get().getValue(); } else { throw new CodegenException( "Unknown shape type for object node when " + "generating protocol test input: " + wrapperShape.getType() ); } // Handle auto-filling idempotency token values to the explicit value. if (isIdempotencyTokenWithoutValue(memberShape, valueNode)) { writer.write("\"00000000-0000-4000-8000-000000000000\","); } else { this.workingShape = model.expectShape(memberShape.getTarget()); writer.call(() -> valueNode.accept(this)); } }); // Check for setting a potentially unspecified member value for the // idempotency token. if (node.getMembers().isEmpty() && wrapperShape.isStructureShape()) { StructureShape structureShape = wrapperShape.asStructureShape().get(); for (Map.Entry entry : structureShape.getAllMembers().entrySet()) { if (entry.getValue().hasTrait(IdempotencyTokenTrait.class)) { writer.write("$L: \"00000000-0000-4000-8000-000000000000\",", entry.getKey()); } } } this.workingShape = wrapperShape; }); return null; } private boolean isIdempotencyTokenWithoutValue(MemberShape memberShape, Node valueNode) { // Short circuit non-tokens. if (!memberShape.hasTrait(IdempotencyTokenTrait.class)) { return false; } // Return if the token has a test-specific value. return valueNode.expectStringNode().getValue().isEmpty(); } @Override public Void stringNode(StringNode node) { // Handle blobs needing to be converted from strings to their input type of UInt8Array. if (workingShape.isBlobShape()) { writer.write("Uint8Array.from($S, (c) => c.charCodeAt(0)),", node.getValue()); } else if (workingShape.isFloatShape() || workingShape.isDoubleShape()) { switch (node.getValue()) { case "NaN": writer.write("NaN,"); break; case "Infinity": writer.write("Infinity,"); break; case "-Infinity": writer.write("-Infinity,"); break; default: throw new CodegenException( String.format( "Unexpected string value for `%s`: \"%s\"", workingShape.getId(), node.getValue() ) ); } } else { writer.write("$S,", node.getValue()); } return null; } } /** * Functional interface for skipping tests. */ @FunctionalInterface public interface TestFilter { /** * A function that determines whether or not to skip a test. * *

A test might be temporarily skipped if it's a known failure that * will be addressed later, or if the test in question asserts a * serialized message that can have multiple valid forms. * * @param service The service for which tests are being generated. * @param operation The operation for which tests are being generated. * @param testCase The test case in question. * @param settings The settings being used to generate the test service. * @return True if the test should be skipped, false otherwise. */ boolean skip( ServiceShape service, OperationShape operation, HttpMessageTestCase testCase, TypeScriptSettings settings ); } /** * Functional interface for skipping malformed request tests. */ @FunctionalInterface public interface MalformedRequestTestFilter { /** * A function that determines whether or not to skip a malformed request test. * *

A test might be temporarily skipped if it's a known failure that * will be addressed later, or if the test in question asserts a * serialized message that can have multiple valid forms. * * @param service The service for which tests are being generated. * @param operation The operation for which tests are being generated. * @param testCase The malformed request test case in question. * @param settings The settings being used to generate the test service. * @return True if the test should be skipped, false otherwise. */ boolean skip( ServiceShape service, OperationShape operation, HttpMalformedRequestTestCase testCase, TypeScriptSettings settings ); } /** * Supports writing out TS specific output types in the generated code * through visiting the target shape at the same time as the node. If * instead we just printed out the node, many values would not match on * type signatures. * * This handles properly generating Date types for numbers that are * Timestamp shapes, downcasing prefix headers, boolean values, Uint8Array * types for blobs, and error Message field standardization. */ private final class CommandOutputNodeVisitor implements NodeVisitor { private final StructureShape outputShape; private Shape workingShape; private CommandOutputNodeVisitor(StructureShape outputShape) { this.outputShape = outputShape; this.workingShape = outputShape; } @Override public Void arrayNode(ArrayNode node) { String openElement = "["; String closeElement = "]"; // Write the value out directly. writer.openBlock("$L", closeElement + ",", openElement, () -> { Shape wrapperShape = this.workingShape; node .getElements() .forEach(element -> { // Swap the working shape to the member of the collection. // This isn't necessary if the shape is a document. if (wrapperShape instanceof CollectionShape) { this.workingShape = model.expectShape( ((CollectionShape) wrapperShape).getMember().getTarget() ); } writer.call(() -> element.accept(this)); }); this.workingShape = wrapperShape; }); return null; } @Override public Void booleanNode(BooleanNode node) { // Handle needing to write the boolean's value properly. writer.write(node.getValue() ? "true," : "false,"); return null; } @Override public Void nullNode(NullNode node) { // Nulls on the wire are nulls in parsed content. writer.write("null,"); return null; } @Override public Void numberNode(NumberNode node) { // Handle timestamps needing to be converted from numbers to their input type of Date. // Also handle that a Date in TS takes milliseconds, so add * 1000 to the end. if (workingShape.isTimestampShape()) { writer.write("new Date($L * 1000),", node.getValue()); } else { writer.write("$L,", node.getValue().toString()); } return null; } @Override public Void objectNode(ObjectNode node) { // Short circuit document types, as the direct value is what we want. if (workingShape.isDocumentShape()) { writer.writeInline(Node.prettyPrintJson(node)).writeInline(","); return null; } // Both objects and maps can use a majority of the same logic. // Use "as any" to have TS complain less about undefined entries. writer.openBlock("{", "},", () -> { Shape wrapperShape = this.workingShape; node .getMembers() .forEach((keyNode, valueNode) -> { // Grab the correct member related to the node member we have. MemberShape memberShape; if (wrapperShape.isStructureShape()) { memberShape = wrapperShape.asStructureShape().get().getMember(keyNode.getValue()).get(); } else if (wrapperShape.isUnionShape()) { memberShape = wrapperShape.asUnionShape().get().getMember(keyNode.getValue()).get(); } else if (wrapperShape.isMapShape()) { memberShape = wrapperShape.asMapShape().get().getValue(); } else { throw new CodegenException( "Unknown shape type for object node when " + "generating protocol test output: " + wrapperShape.getType() ); } // Handle error standardization to the down-cased "message". String validationName = keyNode.getValue(); if (wrapperShape.hasTrait(ErrorTrait.class) && validationName.equals("Message")) { validationName = "message"; } writer.writeInline("$L: ", PropertyAccessor.inlineKey(validationName)); this.workingShape = model.expectShape(memberShape.getTarget()); // Alter valueNode to downcase keys if it's a map for prefixHeaders. // This is an enforced behavior of the fetch handler. Node renderNode = memberShape.hasTrait(HttpPrefixHeadersTrait.class) ? downcaseNodeKeys(valueNode.expectObjectNode()) : valueNode; writer.call(() -> renderNode.accept(this)); }); this.workingShape = wrapperShape; }); return null; } private ObjectNode downcaseNodeKeys(ObjectNode startingNode) { ObjectNode downcasedNode = Node.objectNode(); for (Map.Entry entry : startingNode.getMembers().entrySet()) { downcasedNode = downcasedNode.withMember( entry.getKey().getValue().toLowerCase(Locale.US), entry.getValue() ); } return downcasedNode; } @Override public Void stringNode(StringNode node) { // Handle blobs needing to be converted from strings to their input type of UInt8Array. if (workingShape.isBlobShape()) { writer.write("Uint8Array.from($S, (c) => c.charCodeAt(0)),", node.getValue()); } else if (workingShape.isFloatShape() || workingShape.isDoubleShape()) { switch (node.getValue()) { case "NaN": writer.write("NaN,"); break; case "Infinity": writer.write("Infinity,"); break; case "-Infinity": writer.write("-Infinity,"); break; default: throw new CodegenException( String.format( "Unexpected string value for `%s`: \"%s\"", workingShape.getId(), node.getValue() ) ); } } else { writer.write("$S,", node.getValue()); } return null; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ImportDeclarations.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.Comparator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.ImportContainer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SmithyInternalApi; /** * Internal class used for aggregating imports of a file. */ @SmithyInternalApi final class ImportDeclarations implements ImportContainer { /** * External package first, relative last, otherwise by case-insensitive alphabetical ordering. */ private static final Comparator MODULES_ORDERING = (a, b) -> { if (a.startsWith(".") && !b.startsWith(".")) { return 1; } if (!a.startsWith(".") && b.startsWith(".")) { return -1; } if (a.equalsIgnoreCase(b)) { return a.compareTo(b); } return a.toLowerCase().compareTo(b.toLowerCase()); }; /** * Type imports first, otherwise by symbol name, case-insensitively, ignoring alias. */ private static final Comparator IMPORTS_ORDERING = (a, b) -> { boolean aType = a.startsWith("type "); boolean bType = b.startsWith("type "); if (aType && !bType) { return -1; } if (!aType && bType) { return 1; } String normalA = a.replaceAll("(^type )|( as (.*?)$)", "").toLowerCase(); String normalB = b.replaceAll("(^type )|( as (.*?)$)", "").toLowerCase(); if (normalA.equals(normalB)) { return a.compareTo(b); } return normalA.compareTo(normalB); }; private final String moduleNameString; private final String relativize; private final Map> defaultImports = new TreeMap<>(); private final Map> namedImports = new TreeMap<>(); private final Map> namedTypeImports = new TreeMap<>(); ImportDeclarations(String relativize) { relativize = relativize.replace(File.separatorChar, '/'); if (!relativize.startsWith("./")) { relativize = "./" + relativize; } this.moduleNameString = relativize; // Strip off the filename of what's being relativized since it isn't needed. Path relativizePath = Paths.get(relativize).getParent(); if (relativizePath == null) { this.relativize = null; } else { this.relativize = relativizePath.toString().replace(File.separatorChar, '/'); } } ImportDeclarations addDefaultImport(String name, String module) { return addDefaultImport(name, module, Ignore.notIgnored()); } ImportDeclarations addIgnoredDefaultImport(String name, String module, String reason) { return addDefaultImport(name, module, Ignore.ignored(reason)); } private ImportDeclarations addDefaultImport(String name, String module, Ignore ignore) { module = getRelativizedModule(relativize, module); if (!module.isEmpty() && (relativize == null || !module.equals(relativize.toString()))) { defaultImports.put(module, new Pair<>(name, ignore)); } return this; } ImportDeclarations addImport(String name, String alias, String module) { if (alias == null || alias.isEmpty()) { alias = name; } module = getRelativizedModule(relativize, module); if (!module.isEmpty() && (relativize == null || !module.equals(relativize.toString()))) { namedImports.computeIfAbsent(module, m -> new TreeMap<>()).put(alias, name); } return this; } ImportDeclarations addTypeImport(String name, String alias, String module) { if (alias == null || alias.isEmpty()) { alias = name; } module = getRelativizedModule(relativize, module); if (!module.isEmpty() && (relativize == null || !module.equals(relativize.toString()))) { namedTypeImports.computeIfAbsent(module, m -> new TreeMap<>()).put(alias, name); } return this; } @Override public void importSymbol(Symbol symbol, String alias) { if (!symbol.getNamespace().isEmpty() && !symbol.getNamespace().equals(moduleNameString)) { if ( symbol .getProperty("typeOnly") .map(o -> (Boolean) o) .orElse(false) ) { addTypeImport(symbol.getName(), alias, symbol.getNamespace()); } else { addImport(symbol.getName(), alias, symbol.getNamespace()); } } } @Override public String toString() { StringBuilder result = new StringBuilder(); if (!defaultImports.isEmpty()) { for (Map.Entry> importEntry : defaultImports.entrySet()) { boolean ignore = importEntry.getValue().getRight().ignore; if (ignore) { result.append("// @ts-ignore: ").append(importEntry.getValue().getRight().reason).append("\n"); } result .append("import ") .append(importEntry.getValue().getLeft()) .append(" from \"") .append(importEntry.getKey()) .append("\";"); if (ignore) { result.append(" // eslint-disable-line"); } result.append('\n'); } result.append('\n'); } createImports(namedImports, namedTypeImports, result); return result.toString(); } private static void createImports( Map> namedImports, Map> namedTypeImports, StringBuilder buffer ) { TreeSet mergedModuleKeys = new TreeSet<>(MODULES_ORDERING); mergedModuleKeys.addAll(namedImports.keySet()); mergedModuleKeys.addAll(namedTypeImports.keySet()); // separate non-relative and relative imports. long separatorIndex = mergedModuleKeys .stream() .filter(k -> !k.startsWith(".")) .count(); int i = 0; boolean needsSeparator = separatorIndex > 0 && separatorIndex < mergedModuleKeys.size(); for (String module : mergedModuleKeys) { if (i++ == separatorIndex && needsSeparator) { buffer.append("\n"); } Map moduleImports = namedImports.getOrDefault(module, Collections.emptyMap()); Map typeImports = namedTypeImports.getOrDefault(module, Collections.emptyMap()); TreeSet mergedSymbolKeys = new TreeSet<>(); mergedSymbolKeys.addAll(moduleImports.keySet()); mergedSymbolKeys.addAll(typeImports.keySet()); Set imports = new TreeSet<>(IMPORTS_ORDERING); for (String alias : mergedSymbolKeys) { String runtimeSymbol = moduleImports.get(alias); String typeSymbol = typeImports.get(alias); // "*" imports are not supported https://github.com/smithy-lang/smithy-typescript/issues/211 if ("*".equals(runtimeSymbol) || "*".equals(typeSymbol)) { throw new CodegenException( "Star imports are not supported, attempted for " + module + ". Use default import instead." ); } if (runtimeSymbol != null) { if (!alias.equals(runtimeSymbol)) { imports.add("%s as %s".formatted(runtimeSymbol, alias)); } else { imports.add(runtimeSymbol); } } else if (typeSymbol != null) { if (!alias.equals(typeSymbol)) { imports.add("type %s as %s".formatted(typeSymbol, alias)); } else { imports.add("type " + typeSymbol); } } } if (!imports.isEmpty()) { String inline; String multiline; String head; String symbols; String tail = "\";\n"; boolean allImportsAreTypes = imports.stream().allMatch(s -> s.startsWith("type ")); { head = "import { "; symbols = String.join(", ", imports); String source = " } from \"" + module; if (allImportsAreTypes) { head = head.replace("import ", "import type "); symbols = symbols.replaceAll("type ", ""); } inline = head + symbols + source + tail; } { head = "import {\n "; symbols = String.join(",\n ", imports); String source = ",\n} from \"" + module; if (allImportsAreTypes) { head = head.replace("import ", "import type "); symbols = symbols.replaceAll("type ", ""); } multiline = head + symbols + source + tail; } if (inline.trim().length() <= TypeScriptWriter.LINE_WIDTH) { buffer.append(inline); } else { buffer.append(multiline); } } } if (!namedImports.isEmpty() || !namedTypeImports.isEmpty()) { buffer.append("\n"); } } private static String getRelativizedModule(String relativize, String module) { if (relativize != null && module.startsWith(".")) { // A relative import is resolved against the current file. Path relativizePath = Paths.get(relativize); module = relativizePath.relativize(Paths.get(module)).toString().replace(File.separatorChar, '/'); if (!module.startsWith(".")) { module = "./" + module; } } return module; } private static final class Ignore { final boolean ignore; final String reason; private Ignore(boolean ignore, String reason) { this.ignore = ignore; this.reason = reason; } static Ignore notIgnored() { return new Ignore(false, null); } static Ignore ignored(String reason) { return new Ignore(true, reason); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/IndexGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.typescript.codegen.validation.ReplaceLast; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.waiters.WaitableTrait; /** * Generates an index to export the service client and each command. */ @SmithyInternalApi final class IndexGenerator { private IndexGenerator() {} static void writeIndex( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, ProtocolGenerator protocolGenerator, TypeScriptWriter writer, TypeScriptWriter modelIndexer ) { writer.write("/* eslint-disable */"); settings .getService(model) .getTrait(DocumentationTrait.class) .ifPresent(trait -> writer.writeDocs(trait.getValue() + "\n\n" + "@packageDocumentation")); if (settings.generateClient()) { writeClientExports(settings, model, symbolProvider, writer); } if (settings.generateServerSdk() && protocolGenerator != null) { writeProtocolExports(protocolGenerator, writer); writer.write("export * from \"./server/index\";"); } // write export statement for models writer.write( // the header comment is already present in the upper writer. modelIndexer.toString().replace("// smithy-typescript generated code", "") ); } private static void writeProtocolExports(ProtocolGenerator protocolGenerator, TypeScriptWriter writer) { String protocolName = ProtocolGenerator.getSanitizedName(protocolGenerator.getName()); writer.write("export * as $L from \"./protocols/$L\";", protocolName, protocolName); } static void writeServerIndex( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, FileManifest fileManifest ) { TypeScriptWriter writer = new TypeScriptWriter(""); ServiceShape service = settings.getService(model); Symbol symbol = symbolProvider.toSymbol(service); // Write export statement for operations. writer.write("export * from \"./operations\";"); writer.write("export * from \"./$L\"", symbol.getName()); fileManifest.writeFile( Paths.get(CodegenUtils.SOURCE_FOLDER, ServerSymbolVisitor.SERVER_FOLDER, "index.ts").toString(), writer.toString() ); } private static void writeClientExports( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { ServiceShape service = settings.getService(model); Symbol symbol = symbolProvider.toSymbol(service); // Normalizes client name, e.g. WeatherClient => Weather String normalizedClientName = ReplaceLast.in(symbol.getName(), "Client", ""); // Write export statement for bare-bones client. writer.write("export * from \"./$L\";", symbol.getName()); // Write export statement for aggregated client. writer.write("export * from \"./$L\";", normalizedClientName); // export endpoints config interface writer.write("export type { ClientInputEndpointParameters } from \"./endpoint/EndpointParameters\";"); // Export Runtime Extension and Client ExtensionConfiguration interfaces writer.write("export type { RuntimeExtension } from \"./runtimeExtensions\";"); writer.write( "export type { $LExtensionConfiguration } from \"./extensionConfiguration\";", normalizedClientName ); // Write export statement for commands. writer.write( """ export * from "./commands";""" ); if (SchemaGenerationAllowlist.allows(service.getId(), settings)) { writer.write( """ export * from "./schemas/schemas_0";""" ); } TopDownIndex topDownIndex = TopDownIndex.of(model); List operations = new ArrayList(); operations.addAll(topDownIndex.getContainedOperations(service)); // Export pagination, if present. if (operations.stream().anyMatch(operation -> operation.hasTrait(PaginatedTrait.ID))) { writer.write("export * from \"./pagination\";"); } // Export waiters, if present. if (operations.stream().anyMatch(operation -> operation.hasTrait(WaitableTrait.ID))) { writer.write("export * from \"./waiters\";"); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/IntEnumGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.Comparator; import java.util.Map; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates an appropriate TypeScript type from a Smithy intEnum shape. * *

For example, given the following Smithy model:

* *
{@code
 * intEnum FaceCard {
 *     JACK = 1
 *     QUEEN = 2
 *     KING = 3
 * }
 * }
* *

We will generate the following: * *

{@code
 * export enum FaceCard {
 *   JACK = 1,
 *   QUEEN = 2,
 *   KING = 3,
 * }
 * }
* *

Shapes that refer to this intEnum as a member will use the following * generated code: * *

{@code
 * import { FaceCard } from "./FaceCard";
 *
 * interface MyStructure {
 *   "facecard": FaceCard;
 * }
 * }
*/ @SmithyInternalApi final class IntEnumGenerator implements Runnable { private final Symbol symbol; private final IntEnumShape shape; private final TypeScriptWriter writer; IntEnumGenerator(IntEnumShape shape, Symbol symbol, TypeScriptWriter writer) { this.shape = shape; this.symbol = symbol; this.writer = writer; } @Override public void run() { generateIntEnum(); } private void generateIntEnum() { writer.openBlock("export enum $L {", "}", symbol.getName(), () -> { // Sort by the values to ensure a stable order and sane diffs. shape .getEnumValues() .entrySet() .stream() .sorted(Comparator.comparing(e -> e.getValue())) .forEach(this::writeIntEnumEntry); }); } private void writeIntEnumEntry(Map.Entry entry) { writer.write("$L = $L,", TypeScriptUtils.sanitizePropertyName(entry.getKey()), entry.getValue()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/LanguageTarget.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Represents a possible language target that can be generated. */ @SmithyUnstableApi public enum LanguageTarget { /** * Node-specific language target. */ NODE { @Override String getTemplateFileName() { return "runtimeConfig.ts.template"; } }, /** * Browser-specific language target. */ BROWSER { @Override String getTemplateFileName() { return "runtimeConfig.browser.ts.template"; } }, /** * ReactNative-specific language target. * Note: ReactNative target extends from Browser target. You only need to add * ReactNative dependencies if they are different to Browser dependencies. */ REACT_NATIVE { @Override String getTemplateFileName() { return "runtimeConfig.native.ts.template"; } }, /** * A language target that shares configuration that is shared across all * runtimes. */ SHARED { @Override String getTemplateFileName() { return "runtimeConfig.shared.ts.template"; } }; abstract String getTemplateFileName(); String getTargetFilename() { return Paths.get(CodegenUtils.SOURCE_FOLDER, getTemplateFileName().replace(".template", "")).toString(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PackageApiValidationGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * This class generates a runnable pair of test files * that demonstrates the exportable components of the generated client * are accounted for. */ @SmithyInternalApi public final class PackageApiValidationGenerator { private final TypeScriptWriter writer; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final ServiceClosure closure; public PackageApiValidationGenerator( TypeScriptWriter writer, TypeScriptSettings settings, Model model, SymbolProvider symbolProvider ) { this.writer = writer; this.settings = settings; this.model = model; this.symbolProvider = symbolProvider; closure = ServiceClosure.of(model, settings.getService(model)); } /** * Code written by this method is types-only TypeScript. */ public void writeTypeIndexTest() { writer.openBlock(""" export type {""", """ } from "../dist-types/index.d";""", () -> { // exportable types include: // the barebones client String aggregateClientName = CodegenUtils.getServiceName(settings, model, symbolProvider); writer.write("$L", aggregateClientName + "Client,"); // the aggregate client writer.write(aggregateClientName + ","); // all commands Set containedOperations = TopDownIndex.of(model) .getContainedOperations( settings.getService() ); for (OperationShape operation : containedOperations) { String commandName = symbolProvider.toSymbol(operation).getName(); writer.write("$L,", commandName); writer.write("$LInput,", commandName); writer.write("$LOutput,", commandName); } // enums TreeSet enumShapes = closure.getEnums(); for (Shape enumShape : enumShapes) { writer.write("$L,", symbolProvider.toSymbol(enumShape).getName()); } // structure & union types & modeled errors TreeSet structuralShapes = closure.getStructuralNonErrorShapes(); for (Shape structuralShape : structuralShapes) { writer.write("$L,", symbolProvider.toSymbol(structuralShape).getName()); } TreeSet errorShapes = closure.getErrorShapes(); for (Shape errorShape : errorShapes) { writer.write("$L,", symbolProvider.toSymbol(errorShape).getName()); } // synthetic base exception String baseExceptionName = CodegenUtils.getSyntheticBaseExceptionName(aggregateClientName, model); writer.write("$L,", baseExceptionName); // waiters closure .getWaiterNames() .forEach(waiter -> { writer.write("$L,", waiter); }); // paginators closure .getPaginatorNames() .forEach(paginator -> { writer.write("$L,", paginator); }); }); } /** * Code written by this method is pure JavaScript (CJS). */ public void writeRuntimeIndexTest() { boolean schemaMode = SchemaGenerationAllowlist.allows(settings.getService(), settings); writer.write( """ import assert from "node:assert";""" ); // runtime components include: Path cjsIndex = Paths.get("./dist-cjs/index.js"); // the barebones client String aggregateClientName = CodegenUtils.getServiceName(settings, model, symbolProvider); writer.addRelativeImport(aggregateClientName + "Client", null, cjsIndex); writer.addRelativeImport(aggregateClientName, null, cjsIndex); // the aggregate client writer.write("// clients"); writer.write( """ assert(typeof $L === "function");""", aggregateClientName + "Client" ); writer.write( """ assert(typeof $L === "function");""", aggregateClientName ); // all commands writer.write("// commands"); Set containedOperations = TopDownIndex.of(model).getContainedOperations(settings.getService()); for (OperationShape operation : containedOperations) { Symbol operationSymbol = symbolProvider.toSymbol(operation); writer.addRelativeImport(operationSymbol.getName(), null, cjsIndex); writer.write( """ assert(typeof $L === "function");""", operationSymbol.getName() ); if (schemaMode) { String schemaVarName = closure.getShapeSchemaVariableName(operation, null); writer.addRelativeImport(schemaVarName, null, cjsIndex); writer.write( """ assert(typeof $L === "object");""", schemaVarName ); } } // structure & union types & modeled errors writer.write("// structural schemas"); TreeSet structuralShapes = closure.getStructuralNonErrorShapes(); for (Shape structuralShape : structuralShapes) { if (schemaMode) { String schemaVarName = closure.getShapeSchemaVariableName(structuralShape, null); writer.addRelativeImport(schemaVarName, null, cjsIndex); writer.write( """ assert(typeof $L === "object");""", schemaVarName ); } } // enums // string shapes with enum trait do not generate anything if // any enum value does not have a name. TreeSet enumShapes = closure .getEnums() .stream() .filter(shape -> shape.getTrait(EnumTrait.class).map(EnumTrait::hasNames).orElse(true)) .collect(TreeSet::new, Set::add, Set::addAll); if (!enumShapes.isEmpty()) { writer.write("// enums"); } for (Shape enumShape : enumShapes) { Symbol enumSymbol = symbolProvider.toSymbol(enumShape); writer.addRelativeImport(enumSymbol.getName(), null, cjsIndex); writer.write( """ assert(typeof $L === "object");""", enumSymbol.getName() ); } String baseExceptionName = CodegenUtils.getSyntheticBaseExceptionName(aggregateClientName, model); // modeled errors and synthetic base error writer.write("// errors"); TreeSet errors = closure.getErrorShapes(); for (Shape error : errors) { Symbol errorSymbol = symbolProvider.toSymbol(error); writer.addRelativeImport(errorSymbol.getName(), null, cjsIndex); writer.write("assert($L.prototype instanceof $L);", errorSymbol.getName(), baseExceptionName); if (schemaMode) { String schemaVarName = closure.getShapeSchemaVariableName(error, null); writer.addRelativeImport(schemaVarName, null, cjsIndex); writer.write( """ assert(typeof $L === "object");""", schemaVarName ); } } writer.addRelativeImport(baseExceptionName, null, cjsIndex); writer.write("assert($L.prototype instanceof Error);", baseExceptionName); // waiters & paginators TreeSet waiterNames = closure.getWaiterNames(); if (!waiterNames.isEmpty()) { writer.write("// waiters"); } waiterNames.forEach(waiter -> { writer.addRelativeImport(waiter, null, cjsIndex); writer.write( """ assert(typeof $L === "function");""", waiter ); }); TreeSet paginatorNames = closure.getPaginatorNames(); if (!paginatorNames.isEmpty()) { writer.write("// paginators"); } paginatorNames.forEach(paginator -> { writer.addRelativeImport(paginator, null, cjsIndex); writer.write( """ assert(typeof $L === "function");""", paginator ); }); writer.write("console.log(`$L index test passed.`);", aggregateClientName); } /** * Creates a vitest framework snapshot test for an SDK client. */ @SmithyInternalApi public void writeSnapshotTest() { writer.addImport("SnapshotRunner", null, TypeScriptDependency.SNAPSHOTS); writer.addImport("describe", null, TypeScriptDependency.VITEST); writer.addImport("vi", null, TypeScriptDependency.VITEST); writer.addImport("test", "it", TypeScriptDependency.VITEST); writer.addImport("expect", null, TypeScriptDependency.VITEST); writer.addImport("join", null, "node:path"); String aggregateClientName = CodegenUtils.getServiceName(settings, model, symbolProvider); String clientName = aggregateClientName + "Client"; Path srcIndex = Paths.get(".", CodegenUtils.SOURCE_FOLDER); writer.addRelativeImport( clientName, null, srcIndex ); writer.write(""" vi.setSystemTime(new Date(946702799999)); const Client = $L; """, clientName); writer.openBlock( """ const mode = (process.env.SNAPSHOT_MODE as "write" | "compare") ?? "write"; describe($S + ` ($${mode})`, () => { const runner = new SnapshotRunner({ snapshotDirPath: join(__dirname, "snapshots"), Client, mode, testCase(caseName: string, run: () => Promise) { it(caseName, run); }, assertions(caseName: string, expected: string, actual: string): Promise { expect(actual).toEqual(expected); return Promise.resolve(); },""", """ }); runner.run(); }, 30_000); """, clientName, () -> { writer.indent(); writer.openBlock( """ schemas: new Map([""", """ ]),""", () -> { for (OperationShape operationShape : closure.getOperationShapes()) { String operationSchema = closure.getShapeSchemaVariableName(operationShape, null); writer.addRelativeImport( operationSchema, null, srcIndex ); String commandName = StringUtils.capitalize(operationShape.toShapeId().getName(settings.getService(model))) + "Command"; writer.addRelativeImport( commandName, null, srcIndex ); writer.write( """ [$L, $L],""", operationSchema, commandName ); } } ); writer.openBlock( """ errors: [""", """ ],""", () -> { for (Shape errorShape : closure.getErrorShapes()) { String schemaName = closure.getShapeSchemaVariableName(errorShape, null); writer.addRelativeImport( schemaName, null, srcIndex ); writer.write( """ $L,""", schemaName ); } } ); writer.dedent(); } ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PackageContainer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; /** * A container for packages. */ public interface PackageContainer { /** * Gets the name of the contained package. * * @return Returns the name of the package. */ String getPackageName(); } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PackageJsonGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.io.InputStream; import java.util.Map; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.utils.IoUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Private class used to generates a package.json file for the project. */ @SmithyInternalApi final class PackageJsonGenerator { public static final String PACKAGE_JSON_FILENAME = "package.json"; public static final String TYPEDOC_FILE_NAME = "typedoc.json"; public static final String VITEST_CONFIG_FILENAME = "vitest.config.mts"; public static final String VITEST_CONFIG_INTEG_FILENAME = "vitest.config.integ.mts"; private PackageJsonGenerator() {} static void writePackageJson( TypeScriptSettings settings, FileManifest manifest, Map> dependencies ) { // Write the package.json file. InputStream resource = PackageJsonGenerator.class.getResourceAsStream("base-package.json"); ObjectNode userSuppliedPackageJson = settings.getPackageJson(); ObjectNode defaultPackageJson = Node.parse(IoUtils.toUtf8String(resource)).expectObjectNode(); ObjectNode mergedScripts = defaultPackageJson .expectObjectMember("scripts") .merge(userSuppliedPackageJson.getObjectMember("scripts").orElse(ObjectNode.builder().build())); ObjectNode node = defaultPackageJson.merge(userSuppliedPackageJson).withMember("scripts", mergedScripts); // Merge TypeScript dependencies into the package.json file. for (Map.Entry> depEntry : dependencies.entrySet()) { ObjectNode currentValue = node.getObjectMember(depEntry.getKey()).orElse(Node.objectNode()); ObjectNode.Builder builder = currentValue.toBuilder(); for (Map.Entry entry : depEntry.getValue().entrySet()) { builder.withMember(entry.getKey(), entry.getValue().getVersion()); } node = node.withMember(depEntry.getKey(), builder.build()); } // Add test script and vitest.config.mts if specs and their devDependency on vitest has been generated. ObjectNode devDeps = node.getObjectMember("devDependencies").orElse(Node.objectNode()); if (devDeps.containsMember(TypeScriptDependency.VITEST.packageName)) { ObjectNode scripts = node.getObjectMember("scripts").orElse(Node.objectNode()); String pkgManagerExec = settings.getPackageManager().getExecCommand(); scripts = scripts .withMember("test", "%s vitest run --passWithNoTests".formatted(pkgManagerExec)) .withMember("test:watch", "%s vitest watch --passWithNoTests".formatted(pkgManagerExec)) .withMember( "test:integration", "%s vitest run --passWithNoTests -c vitest.config.integ.mts".formatted(pkgManagerExec) ) .withMember( "test:integration:watch", "%s vitest watch --passWithNoTests -c vitest.config.integ.mts".formatted(pkgManagerExec) ); node = node.withMember("scripts", scripts); manifest.writeFile( VITEST_CONFIG_FILENAME, IoUtils.toUtf8String(PackageJsonGenerator.class.getResourceAsStream(VITEST_CONFIG_FILENAME)) ); manifest.writeFile( VITEST_CONFIG_INTEG_FILENAME, IoUtils.toUtf8String(PackageJsonGenerator.class.getResourceAsStream(VITEST_CONFIG_INTEG_FILENAME)) ); } if (settings.generateTypeDoc()) { // Add typedoc to the "devDependencies" if not present if (devDeps.getMember(TypeScriptDependency.TYPEDOC.packageName).isEmpty()) { devDeps = devDeps.withMember( TypeScriptDependency.TYPEDOC.packageName, TypeScriptDependency.TYPEDOC.version ); node = node.withMember("devDependencies", devDeps); } // Add @smithy/service-client-documentation-generator to the "devDependencies" if not present if (devDeps.getMember(TypeScriptDependency.AWS_SDK_CLIENT_DOCGEN.packageName).isEmpty()) { devDeps = devDeps.withMember( TypeScriptDependency.AWS_SDK_CLIENT_DOCGEN.packageName, TypeScriptDependency.AWS_SDK_CLIENT_DOCGEN.version ); node = node.withMember("devDependencies", devDeps); } // Add build:docs script ObjectNode scripts = node.getObjectMember("scripts").orElse(Node.objectNode()); scripts = scripts.withMember("build:docs", "typedoc"); node = node.withMember("scripts", scripts); // Write typedoc.json manifest.writeFile(TYPEDOC_FILE_NAME, PackageJsonGenerator.class, TYPEDOC_FILE_NAME); } // These are currently only generated for clients, but they may be needed for ssdk as well. if (settings.generateClient()) { // Add the Node vs Browser hook. node = node.withMember( "browser", node .getObjectMember("browser") .orElse(Node.objectNode()) .withMember("./dist-es/runtimeConfig", "./dist-es/runtimeConfig.browser") ); // Add the ReactNative hook. node = node.withMember( "react-native", node .getObjectMember("react-native") .orElse(Node.objectNode()) .withMember("./dist-es/runtimeConfig", "./dist-es/runtimeConfig.native") ); } // Set the package to private if required. if (settings.isPrivate()) { node = node.withMember("private", true); } if (!settings.generateIndexTests()) { node = node.withMember("scripts", node.getObjectMember("scripts").get().withoutMember("test:index")); } // Expand template parameters. String template = Node.prettyPrintJson(node); template = template.replace("${package}", settings.getPackageName()); template = template.replace("${packageDescription}", settings.getPackageDescription()); if (settings.getVersioningScheme().equals("@smithy/core")) { settings.setPackageVersion(TypeScriptDependency.getSmithyCoreVersion()); } if (settings.getVersioningScheme().equals("@aws-sdk/client")) { settings.setPackageVersion(TypeScriptDependency.getAwsSdkLeadingClientVersion()); } template = template.replace("${packageVersion}", settings.getPackageVersion()); template = template.replace("${packageManager}", settings.getPackageManager().getCommand()); manifest.writeFile(PACKAGE_JSON_FILENAME, template); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/PaginationGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.PaginatedIndex; import software.amazon.smithy.model.knowledge.PaginationInfo; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi final class PaginationGenerator implements Runnable { static final String PAGINATION_FOLDER = "pagination"; static final String PAGINATION_INTERFACE_FILE = Paths.get( CodegenUtils.SOURCE_FOLDER, PAGINATION_FOLDER, "Interfaces.ts" ).toString(); private final TypeScriptWriter writer; private final String aggregatedClientName; private final PaginationInfo paginatedInfo; private final Symbol serviceSymbol; private final Symbol operationSymbol; private final Symbol inputSymbol; private final Symbol outputSymbol; private final String operationName; private final String paginationType; PaginationGenerator( Model model, ServiceShape service, OperationShape operation, SymbolProvider symbolProvider, TypeScriptWriter writer, String aggregatedClientName ) { this.writer = writer; this.aggregatedClientName = aggregatedClientName; this.serviceSymbol = symbolProvider.toSymbol(service); this.operationSymbol = symbolProvider.toSymbol(operation); this.inputSymbol = symbolProvider.toSymbol(operation).expectProperty("inputType", Symbol.class); this.outputSymbol = symbolProvider.toSymbol(operation).expectProperty("outputType", Symbol.class); this.operationName = operation.getId().getName(); this.paginationType = aggregatedClientName + "PaginationConfiguration"; PaginatedIndex paginatedIndex = PaginatedIndex.of(model); Optional paginationInfo = paginatedIndex.getPaginationInfo(service, operation); this.paginatedInfo = paginationInfo.orElseThrow(() -> { return new CodegenException("Expected Paginator to have pagination information."); }); } @Override public void run() { // Import Service Types writer.addRelativeImport( operationSymbol.getName(), operationSymbol.getName(), Paths.get(".", operationSymbol.getNamespace()) ); writer.addRelativeImport( inputSymbol.getName(), inputSymbol.getName(), Paths.get(".", inputSymbol.getNamespace()) ); writer.addRelativeImport( outputSymbol.getName(), outputSymbol.getName(), Paths.get(".", outputSymbol.getNamespace()) ); writer.addRelativeImport( serviceSymbol.getName(), serviceSymbol.getName(), Paths.get(".", serviceSymbol.getNamespace()) ); // Import Pagination types writer.addTypeImport("Paginator", null, TypeScriptDependency.SMITHY_TYPES); writer.addRelativeTypeImport( paginationType, paginationType, Paths.get(".", PAGINATION_INTERFACE_FILE.replace(".ts", "")) ); writePager(); } static String getOutputFileLocation(OperationShape operation) { return Paths.get( CodegenUtils.SOURCE_FOLDER, PAGINATION_FOLDER, operation.getId().getName() + "Paginator.ts" ).toString(); } static void generateServicePaginationInterfaces( String aggregatedClientName, Symbol service, TypeScriptWriter writer ) { writer.addTypeImport("PaginationConfiguration", null, TypeScriptDependency.SMITHY_TYPES); writer.addRelativeImport(service.getName(), service.getName(), Paths.get(".", service.getNamespace())); writer .writeDocs("@public") .openBlock( "export interface $LPaginationConfiguration extends PaginationConfiguration {", "}", aggregatedClientName, () -> { writer.write("client: $L;", service.getName()); } ); } private static String getModulePath(String fileLocation) { return fileLocation.substring(fileLocation.lastIndexOf("/") + 1, fileLocation.length()).replace(".ts", ""); } static void writeIndex(Model model, ServiceShape service, FileManifest fileManifest) { TypeScriptWriter writer = new TypeScriptWriter(""); writer.write("export * from \"./$L\";", getModulePath(PAGINATION_INTERFACE_FILE)); TopDownIndex topDownIndex = TopDownIndex.of(model); Set containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(service)); for (OperationShape operation : containedOperations) { if (operation.hasTrait(PaginatedTrait.ID)) { String outputFilepath = PaginationGenerator.getOutputFileLocation(operation); writer.write("export * from \"./$L\";", getModulePath(outputFilepath)); } } fileManifest.writeFile( Paths.get(CodegenUtils.SOURCE_FOLDER, PAGINATION_FOLDER, "index.ts").toString(), writer.toString() ); } private void writePager() { String serviceTypeName = serviceSymbol.getName(); String inputTypeName = inputSymbol.getName(); String outputTypeName = outputSymbol.getName(); String inputTokenName = paginatedInfo.getPaginatedTrait().getInputToken().get(); String outputTokenName = paginatedInfo.getPaginatedTrait().getOutputToken().get(); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImport("createPaginator", null, TypeScriptDependency.SMITHY_CORE); writer.writeDocs("@public"); writer .pushState() .putContext("operation", operationName) .putContext("aggClient", aggregatedClientName) .putContext("inputType", inputTypeName) .putContext("outputType", outputTypeName) .putContext("paginationType", paginationType) .putContext("serviceTypeName", serviceTypeName) .putContext("operationName", operationSymbol.getName()) .putContext("inputToken", inputTokenName) .putContext("outputToken", outputTokenName) .putContext( "pageSizeMember", paginatedInfo.getPageSizeMember().map(MemberShape::getMemberName).orElse("") ) .write( """ export const paginate${operation:L}: ( config: ${aggClient:L}PaginationConfiguration, input: ${inputType:L}, ...rest: any[] ) => Paginator<${outputType:L}> = createPaginator< ${paginationType:L}, ${inputType:L}, ${outputType:L} >(${serviceTypeName:L}, ${operationName:L}, ${inputToken:S}, ${outputToken:S}, ${pageSizeMember:S}); """ ) .popState(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.TreeMap; import java.util.function.Consumer; import software.amazon.smithy.build.SmithyBuildException; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.auth.AuthUtils; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates runtime configuration files, files that are used to * supply different default values based on the targeted language * environment of the SDK (e.g., Node vs Browser). */ @SmithyInternalApi final class RuntimeConfigGenerator { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final TypeScriptDelegator delegator; private final List integrations; private final ApplicationProtocol applicationProtocol; private final Map> nodeRuntimeConfigDefaults = MapUtils.of( "requestHandler", writer -> { writer.addImport("NodeHttpHandler", "RequestHandler", TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER); writer.write("RequestHandler.create(config?.requestHandler ?? defaultConfigProvider)"); }, "sha256", writer -> { writer.addImportSubmodule("Hash", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.write("Hash.bind(null, \"sha256\")"); }, "bodyLengthChecker", writer -> { writer.addImportSubmodule( "calculateBodyLength", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("calculateBodyLength"); }, "streamCollector", writer -> { writer.addImport("streamCollector", null, TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER); writer.write("streamCollector"); } ); private final Map> browserRuntimeConfigDefaults = MapUtils.of( "requestHandler", writer -> { writer.addImport("FetchHttpHandler", "RequestHandler", TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER); writer.write("RequestHandler.create(config?.requestHandler ?? defaultConfigProvider)"); }, "sha256", writer -> { writer.addImport("Sha256", null, TypeScriptDependency.AWS_CRYPTO_SHA256_BROWSER); writer.write("Sha256"); }, "bodyLengthChecker", writer -> { writer.addImportSubmodule( "calculateBodyLength", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("calculateBodyLength"); }, "streamCollector", writer -> { writer.addImport("streamCollector", null, TypeScriptDependency.AWS_SDK_FETCH_HTTP_HANDLER); writer.write("streamCollector"); } ); private final Map> reactNativeRuntimeConfigDefaults = MapUtils.of( "sha256", writer -> { writer.addImport("Sha256", null, TypeScriptDependency.AWS_CRYPTO_SHA256_JS); writer.write("Sha256"); } ); private final Map> sharedRuntimeConfigDefaults = MapUtils.of( "base64Decoder", writer -> { writer.addImportSubmodule("fromBase64", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.write("fromBase64"); }, "base64Encoder", writer -> { writer.addImportSubmodule("toBase64", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.write("toBase64"); }, "disableHostPrefix", writer -> { writer.write("false"); }, "urlParser", writer -> { writer .addImportSubmodule("parseUrl", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS); writer.write("parseUrl"); }, "utf8Decoder", writer -> { writer.addImportSubmodule("fromUtf8", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.write("fromUtf8"); }, "utf8Encoder", writer -> { writer.addImportSubmodule("toUtf8", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.write("toUtf8"); }, "extensions", writer -> { writer.write("[]"); } ); private final Map runtimeConfigDefaultValuePrefixes = MapUtils.of("requestHandler", ""); RuntimeConfigGenerator( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptDelegator delegator, List integrations, ApplicationProtocol applicationProtocol ) { this.settings = settings; this.model = model; this.service = settings.getService(model); this.symbolProvider = symbolProvider; this.delegator = delegator; this.integrations = integrations; this.applicationProtocol = applicationProtocol; } void generate(LanguageTarget target) { String clientConfigName = symbolProvider.toSymbol(service).getName() + "Config"; String clientModuleName = symbolProvider .toSymbol(service) .getNamespace() .replaceFirst(CodegenUtils.SOURCE_FOLDER + "/", ""); String template = TypeScriptUtils.loadResourceAsString(target.getTemplateFileName()); String contents = template .replace("${clientConfigName}", clientConfigName) .replace("${apiVersion}", service.getVersion()) .replace("${", "$${") // sanitize template place holders. .replace("$${customizations}", "${L@customizations}") .replace("$${prepareCustomizations}", "${L@prepareCustomizations}"); delegator.useFileWriter(target.getTargetFilename(), writer -> { writer.trimBlankLines(0); // Inject customizations into the ~template. writer.onSection("prepareCustomizations", original -> { for (TypeScriptIntegration integration : integrations) { integration.prepareCustomizations(writer, target, settings, model); } }); writer .indent() .onSection("customizations", original -> { // Start with defaults, use a TreeMap for keeping entries sorted. Map> configs = new TreeMap<>(getDefaultRuntimeConfigs(target)); // Add any integration supplied runtime config writers. for (TypeScriptIntegration integration : integrations) { configs.putAll( integration.getRuntimeConfigWriters(settings, model, symbolProvider, target) ); } // Needs a separate integration point since not all the information is accessible in // {@link TypeScriptIntegration#getRuntimeConfigWriters()} if (applicationProtocol.isHttpProtocol() && !settings.useLegacyAuth()) { generateHttpAuthSchemeConfig(configs, writer, target); } configs.forEach((key, value) -> { String valuePrefix = runtimeConfigDefaultValuePrefixes.getOrDefault(key, "config?.$1L ?? "); if (key.equals("retryMode") && target.equals(LanguageTarget.NODE)) { valuePrefix = """ \n config?.retryMode ?? """; } writer.indent(2).writeInline("$1L: " + valuePrefix, key); value.accept(writer); writer.unwrite("\n"); writer.dedent(2); writer.write(","); }); }); writer.dedent(); writer.addRelativeTypeImport( clientConfigName, null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, clientModuleName) ); switch (target) { case NODE: case BROWSER: writer.addRelativeImport( "getRuntimeConfig", "getSharedRuntimeConfig", Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeConfig.shared") ); writer.addImportSubmodule( "loadConfigsForDefaultMode", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); break; default: break; } switch (target) { case NODE -> { writer.addImportSubmodule( "emitWarningIfUnsupportedVersion", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.addImportSubmodule( "resolveDefaultsModeConfig", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); } case BROWSER -> { writer.addImportSubmodule( "resolveDefaultsModeConfig", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); } case REACT_NATIVE -> { writer.addRelativeImport( "getRuntimeConfig", "getBrowserRuntimeConfig", Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeConfig.browser") ); } default -> { // checkstyle } } writer.write(contents, "", ""); }); } private void generateHttpAuthSchemeConfig( Map> configs, TypeScriptWriter writer, LanguageTarget target ) { SupportedHttpAuthSchemesIndex authIndex = new SupportedHttpAuthSchemesIndex(integrations, model, settings); if (target.equals(LanguageTarget.SHARED)) { configs.put("httpAuthSchemeProvider", w -> { w.write( "$T", Symbol.builder() .name( "default" + CodegenUtils.getServiceName(settings, model, symbolProvider) + "HttpAuthSchemeProvider" ) .namespace(AuthUtils.AUTH_HTTP_PROVIDER_DEPENDENCY.getPackageName(), "/") .build() ); }); } ServiceIndex serviceIndex = ServiceIndex.of(model); TopDownIndex topDownIndex = TopDownIndex.of(model); Map allEffectiveHttpAuthSchemes = AuthUtils.getAllEffectiveNoAuthAwareAuthSchemes( service, serviceIndex, authIndex, topDownIndex ); List targetAuthSchemes = getHttpAuthSchemeTargets(target, allEffectiveHttpAuthSchemes); // Generate only if the "inherited" target is different from the current target List inheritedAuthSchemes = Collections.emptyList(); // Always generated the SHARED target if (target.equals(LanguageTarget.SHARED)) { // no-op // NODE and BROWSER inherit from SHARED } else if (target.equals(LanguageTarget.NODE) || target.equals(LanguageTarget.BROWSER)) { inheritedAuthSchemes = getHttpAuthSchemeTargets(LanguageTarget.SHARED, allEffectiveHttpAuthSchemes); // REACT_NATIVE inherits from BROWSER } else if (target.equals(LanguageTarget.REACT_NATIVE)) { inheritedAuthSchemes = getHttpAuthSchemeTargets(LanguageTarget.BROWSER, allEffectiveHttpAuthSchemes); } else { throw new CodegenException("Unhandled Language Target: " + target); } // If target and inherited auth schemes are equal, then don't generate target auth schemes. if (targetAuthSchemes.equals(inheritedAuthSchemes)) { return; } configs.put("httpAuthSchemes", w -> { w.addTypeImport("IdentityProviderConfig", null, TypeScriptDependency.SMITHY_TYPES); w.writeInline("["); Iterator iter = targetAuthSchemes.iterator(); if (iter.hasNext()) { w.write(""); } while (iter.hasNext()) { HttpAuthSchemeTarget entry = iter.next(); w.indent(); if (entry.identityProvider == null) { w.writeInline( """ { schemeId: $S, identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider($S), signer: $C, }""", entry.httpAuthScheme.getSchemeId(), entry.httpAuthScheme.getSchemeId(), entry.signer ); } else { w.writeInline( """ { schemeId: $S, identityProvider: (ipc: IdentityProviderConfig) => ipc.getIdentityProvider($S) || ($C), signer: $C, }""", entry.httpAuthScheme.getSchemeId(), entry.httpAuthScheme.getSchemeId(), entry.identityProvider, entry.signer ); } w.write(","); w.dedent(); } w.write("]"); }); } private static class HttpAuthSchemeTarget { public HttpAuthScheme httpAuthScheme; public Consumer identityProvider; public Consumer signer; HttpAuthSchemeTarget( HttpAuthScheme httpAuthScheme, Consumer identityProvider, Consumer signer ) { this.httpAuthScheme = httpAuthScheme; this.identityProvider = identityProvider; this.signer = signer; } @Override public boolean equals(Object other) { if (!(other instanceof HttpAuthSchemeTarget)) { return false; } HttpAuthSchemeTarget o = (HttpAuthSchemeTarget) other; return (Objects.equals(httpAuthScheme, o.httpAuthScheme) && Objects.equals(identityProvider, o.identityProvider) && Objects.equals(signer, o.signer)); } @Override public int hashCode() { return super.hashCode(); } } private List getHttpAuthSchemeTargets( LanguageTarget target, Map httpAuthSchemes ) { return getPartialHttpAuthSchemeTargets(target, httpAuthSchemes) .values() .stream() .filter(httpAuthSchemeTarget -> httpAuthSchemeTarget.signer != null) .toList(); } private Map getPartialHttpAuthSchemeTargets( LanguageTarget target, Map httpAuthSchemes ) { LanguageTarget inherited; if (target.equals(LanguageTarget.SHARED)) { // SHARED doesn't inherit any target, so inherited is null inherited = null; } else if (target.equals(LanguageTarget.NODE) || target.equals(LanguageTarget.BROWSER)) { inherited = LanguageTarget.SHARED; } else if (target.equals(LanguageTarget.REACT_NATIVE)) { inherited = LanguageTarget.BROWSER; } else { throw new CodegenException("Unsupported Language Target: " + target); } Map httpAuthSchemeTargets = inherited == null ? // SHARED inherits no HttpAuthSchemeTargets new TreeMap<>() : // Otherwise, get inherited HttpAuthSchemeTargets getPartialHttpAuthSchemeTargets(inherited, httpAuthSchemes); for (HttpAuthScheme httpAuthScheme : httpAuthSchemes.values()) { // If HttpAuthScheme is not registered, skip code generation if (httpAuthScheme == null) { continue; } // Get identity provider and signer for the current target Consumer identityProvider = httpAuthScheme.getDefaultIdentityProviders().get(target); Consumer signer = httpAuthScheme.getDefaultSigners().get(target); HttpAuthSchemeTarget existingEntry = httpAuthSchemeTargets.get(httpAuthScheme.getSchemeId()); // If HttpAuthScheme is not added yet, add the entry if (existingEntry == null) { httpAuthSchemeTargets.put( httpAuthScheme.getSchemeId(), new HttpAuthSchemeTarget(httpAuthScheme, identityProvider, signer) ); continue; } // Mutate existing entry for identity provider and signer if available if (identityProvider != null) { existingEntry.identityProvider = identityProvider; } if (signer != null) { existingEntry.signer = signer; } } return httpAuthSchemeTargets; } private Map> getDefaultRuntimeConfigs(LanguageTarget target) { switch (target) { case NODE: return nodeRuntimeConfigDefaults; case BROWSER: return browserRuntimeConfigDefaults; case REACT_NATIVE: return reactNativeRuntimeConfigDefaults; case SHARED: return sharedRuntimeConfigDefaults; default: throw new SmithyBuildException("Unknown target: " + target); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/RuntimeExtensionsGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.List; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.typescript.codegen.validation.ReplaceLast; public class RuntimeExtensionsGenerator { private static final String TEMPLATE_1 = "resolveRuntimeExtensions1.template"; private static final String TEMPLATE_2 = "resolveRuntimeExtensions2.template"; private static final String FILENAME = "runtimeExtensions.ts"; private final Model model; private final TypeScriptSettings settings; private final ServiceShape service; private final SymbolProvider symbolProvider; private final TypeScriptDelegator delegator; private final List integrations; public RuntimeExtensionsGenerator( Model model, TypeScriptSettings settings, ServiceShape service, SymbolProvider symbolProvider, TypeScriptDelegator delegator, List integrations ) { this.model = model; this.settings = settings; this.service = service; this.symbolProvider = symbolProvider; this.delegator = delegator; this.integrations = integrations; } void generate() { String clientName = ReplaceLast.in( ReplaceLast.in(symbolProvider.toSymbol(service).getName(), "Client", ""), "client", "" ); String template1Contents = TypeScriptUtils.loadResourceAsString(TEMPLATE_1) .replace("${extensionConfigName}", clientName + "ExtensionConfiguration") .replace("$", "$$") // sanitize template place holders. .replace("$${getPartialExtensionConfigurations}", "${L@getPartialExtensionConfigurations}"); String template2Contents = TypeScriptUtils.loadResourceAsString(TEMPLATE_2) .replace("$", "$$") // sanitize template place holders. .replace("$${resolvePartialRuntimeConfigs}", "${L@resolvePartialRuntimeConfigs}"); delegator.useFileWriter(Paths.get(CodegenUtils.SOURCE_FOLDER, FILENAME).toString(), writer -> { for (TypeScriptIntegration integration : integrations) { integration .getExtensionConfigurationInterfaces(model, settings) .forEach(configurationInterface -> { writer.addDependency(configurationInterface.getExtensionConfigurationFn().right); writer.addDependency(configurationInterface.resolveRuntimeConfigFn().right); if (configurationInterface.submodule() != null) { writer.addImportSubmodule( configurationInterface.getExtensionConfigurationFn().left, null, configurationInterface.getExtensionConfigurationFn().right, configurationInterface.submodule() ); writer.addImportSubmodule( configurationInterface.resolveRuntimeConfigFn().left, null, configurationInterface.resolveRuntimeConfigFn().right, configurationInterface.submodule() ); } else { writer.addImport( configurationInterface.getExtensionConfigurationFn().left, null, configurationInterface.getExtensionConfigurationFn().right ); writer.addImport( configurationInterface.resolveRuntimeConfigFn().left, null, configurationInterface.resolveRuntimeConfigFn().right ); } }); } writer .indent() .onSection("getPartialExtensionConfigurations", original -> { for (TypeScriptIntegration integration : integrations) { integration .getExtensionConfigurationInterfaces(model, settings) .forEach(configurationInterface -> { writer .indent(2) .write( "$L(runtimeConfig),", configurationInterface.getExtensionConfigurationFn().left ); writer.dedent(2); }); } writer.unwrite(",\n").write(""); }); writer.dedent().write(template1Contents, ""); writer .indent() .onSection("resolvePartialRuntimeConfigs", original -> { for (TypeScriptIntegration integration : integrations) { integration .getExtensionConfigurationInterfaces(model, settings) .forEach(configurationInterface -> { writer .indent(2) .write( "$L(extensionConfiguration),", configurationInterface.resolveRuntimeConfigFn().left ); writer.dedent(2); }); } writer.unwrite(",\n").write(""); }); writer.dedent().write(template2Contents, ""); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerCommandGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates server operation types. */ @SmithyInternalApi final class ServerCommandGenerator implements Runnable { static final String COMMANDS_FOLDER = "operations"; private static final String NO_PROTOCOL_FOUND_SERDE_FUNCTION = "(async (...args: any[]) => { throw new Error(\"No supported protocol was found\"); })"; private final TypeScriptSettings settings; private final Model model; private final OperationShape operation; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final OperationIndex operationIndex; private final Symbol inputType; private final Symbol outputType; private final Symbol errorsType; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private final List errors; ServerCommandGenerator( TypeScriptSettings settings, Model model, OperationShape operation, SymbolProvider symbolProvider, TypeScriptWriter writer, ProtocolGenerator protocolGenerator, ApplicationProtocol applicationProtocol ) { this.settings = settings; this.model = model; this.operation = operation; this.symbolProvider = symbolProvider; this.writer = writer; this.protocolGenerator = protocolGenerator; this.applicationProtocol = applicationProtocol; Symbol operationSymbol = symbolProvider.toSymbol(operation); operationIndex = OperationIndex.of(model); inputType = operationSymbol.expectProperty("inputType", Symbol.class); outputType = operationSymbol.expectProperty("outputType", Symbol.class); errorsType = operationSymbol.expectProperty("errorsType", Symbol.class); errors = Collections.unmodifiableList(operationIndex.getErrors(operation, settings.getService())); } @Override public void run() { writeOperationType(); addInputAndOutputTypes(); writeErrorType(); writeOperationSerializer(); } private void addInputAndOutputTypes() { writeInputType(inputType.getName(), operationIndex.getInput(operation)); writeOutputType(outputType.getName(), operationIndex.getOutput(operation)); writer.write(""); } private void writeInputType(String typeName, Optional inputShape) { if (inputShape.isPresent()) { StructureShape input = inputShape.get(); writer.write("export interface $L extends $T {}", typeName, symbolProvider.toSymbol(inputShape.get())); renderNamespace(typeName, input); } else { // If the input is non-existent, then use an empty object. writer.write("export interface $L {}", typeName); writer.openBlock("export namespace $L {", "}", typeName, () -> { writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.writeDocs("@internal"); writer.write("export const validate: () => __ValidationFailure[] = () => [];"); }); } } private void renderNamespace(String typeName, StructureShape input) { Symbol symbol = symbolProvider.toSymbol(input); writer.openBlock("export namespace $L {", "}", typeName, () -> { writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.writeDocs("@internal"); // Streaming makes the type of the object being validated weird on occasion. // Using `Parameters` here means we don't have to try to derive the weird type twice writer.write( "export const validate: (obj: Parameters[0]) => " + "__ValidationFailure[] = $1T.validate;", symbol ); }); } private void writeOutputType(String typeName, Optional outputShape) { if (outputShape.isPresent()) { writer.write("export interface $L extends $T {}", typeName, symbolProvider.toSymbol(outputShape.get())); } else { writer.write("export interface $L {}", typeName); } } private void writeErrorType() { if (errors.isEmpty()) { writer.write("export type $L = never;", errorsType.getName()); } else { writer.writeInline("export type $L = ", errorsType.getName()); for (Iterator iter = errors.iterator(); iter.hasNext();) { writer.writeInline("$T", symbolProvider.toSymbol(iter.next())); if (iter.hasNext()) { writer.writeInline(" | "); } } writer.write(""); } writer.write(""); } private void writeOperationType() { Symbol operationSymbol = symbolProvider.toSymbol(operation); writer.addImport("Operation", "__Operation", TypeScriptDependency.SERVER_COMMON); writer.write( "export type $L = __Operation<$T, $T, Context>", operationSymbol.getName(), inputType, outputType ); writer.write(""); } private void writeOperationSerializer() { Symbol operationSymbol = symbolProvider.toSymbol(operation); String serializerName = operationSymbol.expectProperty("serializerType", Symbol.class).getName(); Symbol serverSymbol = symbolProvider.toSymbol(model.expectShape(settings.getService())); writer.addImport("OperationSerializer", "__OperationSerializer", TypeScriptDependency.SERVER_COMMON); writer.openBlock( "export class $L implements __OperationSerializer<$T, $S, $T> {", "}", serializerName, serverSymbol, operationSymbol.getName(), errorsType, () -> { if (protocolGenerator == null) { writer.write("serialize = $L as any;", NO_PROTOCOL_FOUND_SERDE_FUNCTION); writer.write("deserialize = $L as any;", NO_PROTOCOL_FOUND_SERDE_FUNCTION); } else { String serializerFunction = ProtocolGenerator.getGenericSerFunctionName(operationSymbol) + "Response"; writer.addRelativeImport( serializerFunction, null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) ) ); writer.write("serialize = $L;", serializerFunction); String deserializerFunction = ProtocolGenerator.getGenericDeserFunctionName(operationSymbol) + "Request"; writer.addRelativeImport( deserializerFunction, null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) ) ); writer.write("deserialize = $L;", deserializerFunction); } writer.write(""); writeErrorChecker(); writeErrorHandler(); } ); writer.write(""); } private void writeErrorChecker() { writer.openBlock("isOperationError(error: any): error is $T {", "};", errorsType, () -> { if (errors.isEmpty()) { writer.write("return false;"); } else { writer.writeInline("const names: $T['name'][] = [", errorsType); for (Iterator iter = errors.iterator(); iter.hasNext();) { writer.writeInline("$S", iter.next().getId().getName()); if (iter.hasNext()) { writer.writeInline(", "); } } writer.write("];"); writer.write("return names.includes(error.name);"); } }); writer.write(""); } private void writeErrorHandler() { writer.addImport("ServerSerdeContext", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "serializeError(error: $T, ctx: ServerSerdeContext): Promise<$T> {", "}", errorsType, applicationProtocol.getResponseType(), () -> { if (errors.isEmpty()) { writer.write("throw error;"); } else { writer.openBlock("switch (error.name) {", "}", () -> { for (StructureShape error : errors) { writeErrorHandlerCase(error); } writer.openBlock("default: {", "}", () -> writer.write("throw error;")); }); } } ); writer.write(""); } private void writeErrorHandlerCase(StructureShape error) { Symbol errorSymbol = symbolProvider.toSymbol(error); writer.openBlock("case $S: {", "}", error.getId().getName(), () -> { if (protocolGenerator == null) { writer.write("return $L(error, ctx);", NO_PROTOCOL_FOUND_SERDE_FUNCTION); } else { String serializerFunction = ProtocolGenerator.getGenericSerFunctionName(errorSymbol) + "Error"; writer.addRelativeImport( serializerFunction, null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ProtocolGenerator.PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(protocolGenerator.getName()) ) ); writer.write("return $L(error, ctx);", serializerFunction); } }); } static void writeIndex( Model model, ServiceShape service, SymbolProvider symbolProvider, FileManifest fileManifest ) { TypeScriptWriter writer = new TypeScriptWriter(""); TopDownIndex topDownIndex = TopDownIndex.of(model); Set containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(service)); if (containedOperations.isEmpty()) { writer.write("export {};"); } else { for (OperationShape operation : containedOperations) { writer.write("export * from \"./$L\";", symbolProvider.toSymbol(operation).getName()); } } fileManifest.writeFile( Paths.get( CodegenUtils.SOURCE_FOLDER, ServerSymbolVisitor.SERVER_FOLDER, COMMANDS_FOLDER, "index.ts" ).toString(), writer.toString() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.Iterator; import java.util.Set; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi final class ServerGenerator { private ServerGenerator() {} static void generateOperationsType( SymbolProvider symbolProvider, Shape serviceShape, Set operations, TypeScriptWriter writer ) { Symbol serviceSymbol = symbolProvider.toSymbol(serviceShape); writer.writeInline("export type $L = ", serviceSymbol.expectProperty("operations", Symbol.class).getName()); for (Iterator iter = operations.iterator(); iter.hasNext();) { writer.writeInline("$S", symbolProvider.toSymbol(iter.next()).getName()); if (iter.hasNext()) { writer.writeInline(" | "); } } writer.write(";"); } static void generateServiceHandler( SymbolProvider symbolProvider, Shape serviceShape, Set operations, TypeScriptWriter writer ) { addCommonHandlerImports(writer); writer.addImport( "UnknownOperationException", "__UnknownOperationException", TypeScriptDependency.SERVER_COMMON ); Symbol serviceSymbol = symbolProvider.toSymbol(serviceShape); Symbol handlerSymbol = serviceSymbol.expectProperty("handler", Symbol.class); Symbol operationsType = serviceSymbol.expectProperty("operations", Symbol.class); writeSerdeContextBase(writer); writeHandleFunction(writer); String classDeclaration = "export class $L implements __ServiceHandler {"; writer.openBlock(classDeclaration, "}", handlerSymbol.getName(), () -> { writer.write("private readonly service: $T;", serviceSymbol); writer.write("private readonly mux: __Mux<$S, $T>;", serviceShape.getId().getName(), operationsType); writer.write( "private readonly serializerFactory: (operation: T) => " + "__OperationSerializer<$T, T, __ServiceException>;", operationsType, serviceSymbol ); writer.write( "private readonly serializeFrameworkException: (e: __SmithyFrameworkException, " + "ctx: __ServerSerdeContext) => Promise<__HttpResponse>;" ); writer.write("private readonly validationCustomizer: __ValidationCustomizer<$T>;", operationsType); writer.writeDocs(() -> { writer.write("Construct a $T handler.", serviceSymbol); writer.write( "@param service The {@link $1T} implementation that supplies the business logic for $1T", serviceSymbol ); writer.writeInline("@param mux The {@link __Mux} that determines which service and operation are "); writer.write("being invoked by a given {@link __HttpRequest}"); writer.writeInline("@param serializerFactory A factory for an {@link __OperationSerializer} for each "); writer.write("operation in $T that ", serviceSymbol); writer .writeInline(" ") .write("handles deserialization of requests and serialization of responses"); writer.write( "@param serializeFrameworkException A function that can serialize " + "{@link __SmithyFrameworkException}s" ); writer.write( "@param validationCustomizer A {@link __ValidationCustomizer} for turning validation " + "failures into {@link __SmithyFrameworkException}s" ); }); writer.openBlock("constructor(", ") {", () -> { writer.write("service: $T,", serviceSymbol); writer.write("mux: __Mux<$S, $T>,", serviceShape.getId().getName(), operationsType); writer.write( "serializerFactory:(op: T) => " + "__OperationSerializer<$T, T, __ServiceException>,", operationsType, serviceSymbol ); writer.write( "serializeFrameworkException: (e: __SmithyFrameworkException, ctx: __ServerSerdeContext) " + "=> Promise<__HttpResponse>," ); writer.write("validationCustomizer: __ValidationCustomizer<$T>", operationsType); }); writer.indent(); writer.write("this.service = service;"); writer.write("this.mux = mux;"); writer.write("this.serializerFactory = serializerFactory;"); writer.write("this.serializeFrameworkException = serializeFrameworkException;"); writer.write("this.validationCustomizer = validationCustomizer;"); writer.closeBlock("}"); String handleDecl = "async handle(request: __HttpRequest, context: Context): Promise<__HttpResponse> {"; writer.openBlock(handleDecl, "}", () -> { writer.write("const target = this.mux.match(request);"); writer.openBlock("if (target === undefined) {", "}", () -> { writer.write( "return this.serializeFrameworkException(new __UnknownOperationException(), " + "serdeContextBase);" ); }); writer.openBlock("switch (target.operation) {", "}", () -> { for (OperationShape operation : operations) { Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol inputSymbol = operationSymbol.expectProperty("inputType", Symbol.class); writer.openBlock("case $S : {", "}", operationSymbol.getName(), () -> { writer.write( "return handle(request, context, $1S, this.serializerFactory($1S), " + "this.service.$1L, this.serializeFrameworkException, $2T.validate, " + "this.validationCustomizer);", operationSymbol.getName(), inputSymbol ); }); } }); }); }); } static void generateOperationHandler( SymbolProvider symbolProvider, Shape serviceShape, OperationShape operation, TypeScriptWriter writer ) { addCommonHandlerImports(writer); writeSerdeContextBase(writer); writeHandleFunction(writer); Symbol serviceSymbol = symbolProvider.toSymbol(serviceShape); Symbol operationSymbol = symbolProvider.toSymbol(operation); String operationName = operationSymbol.getName(); Symbol inputSymbol = operationSymbol.expectProperty("inputType", Symbol.class); Symbol outputSymbol = operationSymbol.expectProperty("outputType", Symbol.class); Symbol handlerSymbol = operationSymbol.expectProperty("handler", Symbol.class); Symbol errorsSymbol = operationSymbol.expectProperty("errorsType", Symbol.class); String declaration = "export class $L implements __ServiceHandler {"; writer.openBlock(declaration, "}", handlerSymbol.getName(), () -> { writer.write("private readonly operation: __Operation<$T, $T, Context>;", inputSymbol, outputSymbol); writer.write("private readonly mux: __Mux<$S, $S>;", serviceShape.getId().getName(), operationName); writer.write( "private readonly serializer: __OperationSerializer<$T, $S, $T>;", serviceSymbol, operationName, errorsSymbol ); writer.write( "private readonly serializeFrameworkException: (e: __SmithyFrameworkException, " + "ctx: __ServerSerdeContext) => Promise<__HttpResponse>;" ); writer.write("private readonly validationCustomizer: __ValidationCustomizer<$S>;", operationName); writer.writeDocs(() -> { writer.write("Construct a $T handler.", operationSymbol); writer.write( "@param operation The {@link __Operation} implementation that supplies the business " + "logic for $1T", operationSymbol ); writer.writeInline("@param mux The {@link __Mux} that verifies which service and operation are being "); writer.write("invoked by a given {@link __HttpRequest}"); writer.write("@param serializer An {@link __OperationSerializer} for $T that ", operationSymbol); writer .writeInline(" ") .write("handles deserialization of requests and serialization of responses"); writer.write( "@param serializeFrameworkException A function that can serialize " + "{@link __SmithyFrameworkException}s" ); writer.write( "@param validationCustomizer A {@link __ValidationCustomizer} for turning validation " + "failures into {@link __SmithyFrameworkException}s" ); }); writer.openBlock("constructor(", ") {", () -> { writer.write("operation: __Operation<$T, $T, Context>,", inputSymbol, outputSymbol); writer.write("mux: __Mux<$S, $S>,", serviceShape.getId().getName(), operationName); writer.write( "serializer: __OperationSerializer<$T, $S, $T>,", serviceSymbol, operationName, errorsSymbol ); writer.write( "serializeFrameworkException: (e: __SmithyFrameworkException, ctx: __ServerSerdeContext) " + "=> Promise<__HttpResponse>," ); writer.write("validationCustomizer: __ValidationCustomizer<$S>", operationName); }); writer.indent(); writer.write("this.operation = operation;"); writer.write("this.mux = mux;"); writer.write("this.serializer = serializer;"); writer.write("this.serializeFrameworkException = serializeFrameworkException;"); writer.write("this.validationCustomizer = validationCustomizer;"); writer.closeBlock("}"); writer.openBlock( "async handle(request: __HttpRequest, context: Context): Promise<__HttpResponse> {", "}", () -> { writer.write("const target = this.mux.match(request);"); writer.openBlock("if (target === undefined) {", "}", () -> { writer.write( "console.log('Received a request that did not match $L.$L. This indicates a " + "misconfiguration.');", serviceShape.getId(), operation.getId().getName() ); writer.write( "return this.serializeFrameworkException(new __InternalFailureException(), " + "serdeContextBase);" ); }); writer.write( "return handle(request, context, $S, this.serializer, this.operation, " + "this.serializeFrameworkException, $T.validate, this.validationCustomizer);", operationName, inputSymbol ); } ); }); } private static void addCommonHandlerImports(TypeScriptWriter writer) { writer.addImport("Operation", "__Operation", TypeScriptDependency.SERVER_COMMON); writer.addImport("ServiceHandler", "__ServiceHandler", TypeScriptDependency.SERVER_COMMON); writer.addImport("Mux", "__Mux", TypeScriptDependency.SERVER_COMMON); writer.addImport("OperationSerializer", "__OperationSerializer", TypeScriptDependency.SERVER_COMMON); writer.addImport("InternalFailureException", "__InternalFailureException", TypeScriptDependency.SERVER_COMMON); writer.addImport("SerializationException", "__SerializationException", TypeScriptDependency.SERVER_COMMON); writer.addImport("SmithyFrameworkException", "__SmithyFrameworkException", TypeScriptDependency.SERVER_COMMON); writer.addImportSubmodule( "HttpRequest", "__HttpRequest", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImportSubmodule( "HttpResponse", "__HttpResponse", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImport("ServiceException", "__ServiceException", TypeScriptDependency.SERVER_COMMON); writer.addImport("ValidationCustomizer", "__ValidationCustomizer", TypeScriptDependency.SERVER_COMMON); } private static void writeHandleFunction(TypeScriptWriter writer) { writer.addImport("Operation", "__Operation", TypeScriptDependency.SERVER_COMMON); writer.addImport("OperationInput", "__OperationInput", TypeScriptDependency.SERVER_COMMON); writer.addImport("OperationOutput", "__OperationOutput", TypeScriptDependency.SERVER_COMMON); writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.addImport("ValidationCustomizer", "__ValidationCustomizer", TypeScriptDependency.SERVER_COMMON); writer.addImport("isFrameworkException", "__isFrameworkException", TypeScriptDependency.SERVER_COMMON); writer.openBlock( "async function handle(", "): Promise<__HttpResponse> {", () -> { writer.write("request: __HttpRequest,"); writer.write("context: Context,"); writer.write("operationName: O,"); writer.write("serializer: __OperationSerializer,"); writer.write("operation: __Operation<__OperationInput, __OperationOutput, Context>,"); writer.write( "serializeFrameworkException: (e: __SmithyFrameworkException, " + "ctx: __ServerSerdeContext) => Promise<__HttpResponse>," ); writer.write("validationFn: (input: __OperationInput) => __ValidationFailure[],"); writer.write("validationCustomizer: __ValidationCustomizer"); } ); writer.indent(); writer.write("let input;"); writer.openBlock("try {", "} catch (error: unknown) {", () -> { writer.openBlock("input = await serializer.deserialize(request, {", "});", () -> { writer.write("endpoint: () => Promise.resolve(request), ...serdeContextBase"); }); }); writer.indent(); writer.openBlock("if (__isFrameworkException(error)) {", "};", () -> { writer.write("return serializeFrameworkException(error, serdeContextBase);"); }); writer.write("return serializeFrameworkException(new __SerializationException(), " + "serdeContextBase);"); writer.closeBlock("}"); writer.openBlock("try {", "} catch(error: unknown) {", () -> { writer.write("let validationFailures = validationFn(input);"); writer.openBlock("if (validationFailures && validationFailures.length > 0) {", "}", () -> { writer.write( "let validationException = validationCustomizer({ operation: operationName }, " + "validationFailures);" ); writer.openBlock("if (validationException) {", "}", () -> { writer.write("return serializer.serializeError(validationException, serdeContextBase);"); }); }); writer.write("let output = await operation(input, context);"); writer.write("return serializer.serialize(output, serdeContextBase);"); }); writer.indent(); writer.openBlock("if (serializer.isOperationError(error)) {", "}", () -> { writer.write("return serializer.serializeError(error, serdeContextBase);"); }); writer.write("console.log('Received an unexpected error', error);"); writer.write("return serializeFrameworkException(new __InternalFailureException(), " + "serdeContextBase);"); writer.closeBlock("}"); writer.closeBlock("}"); } private static void writeSerdeContextBase(TypeScriptWriter writer) { writer.addImport("ServerSerdeContext", "__ServerSerdeContext", TypeScriptDependency.SERVER_COMMON); writer.addImport("NodeHttpHandler", null, TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER); writer.addImport("streamCollector", null, TypeScriptDependency.AWS_SDK_NODE_HTTP_HANDLER); writer.addImportSubmodule("fromBase64", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.addImportSubmodule("toBase64", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.addImportSubmodule("fromUtf8", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.addImportSubmodule("toUtf8", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE); writer.openBlock("const serdeContextBase = {", "};", () -> { writer.write("base64Encoder: toBase64,"); writer.write("base64Decoder: fromBase64,"); writer.write("utf8Encoder: toUtf8,"); writer.write("utf8Decoder: fromUtf8,"); writer.write("streamCollector: streamCollector,"); writer.write("requestHandler: new NodeHttpHandler(),"); writer.write("disableHostPrefix: true"); }); } static void generateServerInterfaces( SymbolProvider symbolProvider, ServiceShape service, Set operations, TypeScriptWriter writer ) { writer.addImport("Operation", "__Operation", TypeScriptDependency.SERVER_COMMON); String serviceInterfaceName = symbolProvider.toSymbol(service).getName(); writer.openCollapsibleBlock( "export interface $L {", "}", !operations.isEmpty(), serviceInterfaceName, () -> { for (OperationShape operation : operations) { Symbol symbol = symbolProvider.toSymbol(operation); writer.write("$L: $T", symbol.getName(), symbol); } } ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServerSymbolVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static software.amazon.smithy.typescript.codegen.TypeScriptDependency.SERVER_COMMON; import java.nio.file.Paths; import java.util.logging.Logger; import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider; import software.amazon.smithy.codegen.core.ReservedWords; import software.amazon.smithy.codegen.core.ReservedWordsBuilder; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.ToShapeId; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * Wraps a client SymbolProvider and generates substitute shapes for server-specific symbols. */ @SmithyInternalApi final class ServerSymbolVisitor extends ShapeVisitor.Default implements SymbolProvider { static final String SERVER_FOLDER = "server"; private static final Logger LOGGER = Logger.getLogger(ServerSymbolVisitor.class.getName()); private final Model model; private final SymbolProvider delegate; private final ReservedWordSymbolProvider.Escaper escaper; private final ModuleNameDelegator moduleNameDelegator; ServerSymbolVisitor(Model model, SymbolProvider delegate) { this.model = model; this.delegate = delegate; // Load reserved words from a new-line delimited file. ReservedWords reservedWords = new ReservedWordsBuilder() .loadWords(TypeScriptCodegenPlugin.class.getResource("reserved-words.txt")) .build(); escaper = ReservedWordSymbolProvider.builder() .nameReservedWords(reservedWords) // Only escape words when the symbol has a definition file to // prevent escaping intentional references to built-in types. .escapePredicate((shape, symbol) -> !StringUtils.isEmpty(symbol.getDefinitionFile())) .buildEscaper(); moduleNameDelegator = new ModuleNameDelegator(); } @Override public Symbol toSymbol(Shape shape) { if (shape.getType() == ShapeType.SERVICE || shape.getType() == ShapeType.OPERATION) { Symbol symbol = shape.accept(this); LOGGER.fine(() -> "Creating symbol from " + shape + ": " + symbol); return escaper.escapeSymbol(shape, symbol); } return delegate.toSymbol(shape); } @Override public Symbol operationShape(OperationShape shape) { String shapeName = flattenShapeName(shape); String moduleName = moduleNameDelegator.formatModuleName(shape, shapeName); Symbol intermediate = createGeneratedSymbolBuilder(shape, shapeName, moduleName).build(); Symbol.Builder builder = intermediate.toBuilder(); //TODO: these names suck but otherwise they clash with the names in models builder.putProperty("inputType", intermediate.toBuilder().name(shapeName + "ServerInput").build()); builder.putProperty("outputType", intermediate.toBuilder().name(shapeName + "ServerOutput").build()); builder.putProperty("errorsType", intermediate.toBuilder().name(shapeName + "Errors").build()); builder.putProperty("serializerType", intermediate.toBuilder().name(shapeName + "Serializer").build()); builder.putProperty("handler", intermediate.toBuilder().name(shapeName + "Handler").build()); return builder.build(); } @Override public Symbol serviceShape(ServiceShape shape) { String baseName = flattenShapeName(shape); String serviceName = baseName + "Service"; String moduleName = moduleNameDelegator.formatModuleName(shape, serviceName); Symbol intermediate = createGeneratedSymbolBuilder(shape, serviceName, moduleName).build(); Symbol.Builder builder = intermediate.toBuilder().addDependency(SERVER_COMMON); builder.putProperty("operations", intermediate.toBuilder().name(serviceName + "Operations").build()); builder.putProperty("handler", intermediate.toBuilder().name(serviceName + "Handler").build()); return builder.build(); } @Override protected Symbol getDefault(Shape shape) { return delegate.toSymbol(shape); } // TODO: Can probably share these statically with SymbolVisitor private String flattenShapeName(ToShapeId id) { return StringUtils.capitalize(id.toShapeId().getName()); } private Symbol.Builder createGeneratedSymbolBuilder(Shape shape, String typeName, String namespace) { String prefixedNamespace = Paths.get( ".", CodegenUtils.SOURCE_FOLDER, (namespace.startsWith(".") ? namespace.substring(1) : namespace) ).toString(); return createSymbolBuilder(shape, typeName, prefixedNamespace).definitionFile(toFilename(prefixedNamespace)); } private Symbol.Builder createSymbolBuilder(Shape shape, String typeName, String namespace) { return Symbol.builder().putProperty("shape", shape).name(typeName).namespace(namespace, "/"); } private String toFilename(String namespace) { return namespace + ".ts"; } static final class ModuleNameDelegator { public String formatModuleName(Shape shape, String name) { if (shape.getType() == ShapeType.SERVICE) { return Paths.get(SERVER_FOLDER, name).toString(); } else if (shape.getType() == ShapeType.OPERATION) { return Paths.get(SERVER_FOLDER, ServerCommandGenerator.COMMANDS_FOLDER, name).toString(); } throw new IllegalArgumentException("Unsupported shape type: " + shape.getType()); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServiceAggregatedClientGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; import software.amazon.smithy.waiters.WaitableTrait; import software.amazon.smithy.waiters.Waiter; /** * Generates aggregated client for service. * *

This client extends from the bare-bones client and provides named methods * for every operation in the service. Using this client means that all * operations of a service are considered referenced, meaning they will * not be removed by tree-shaking. */ @SmithyInternalApi final class ServiceAggregatedClientGenerator implements Runnable { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final String aggregateClientName; private final Symbol serviceSymbol; private final ApplicationProtocol applicationProtocol; private final ServiceClosure closure; ServiceAggregatedClientGenerator( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, String aggregateClientName, TypeScriptWriter writer, ApplicationProtocol applicationProtocol ) { this.settings = settings; this.model = model; this.service = settings.getService(model); this.symbolProvider = symbolProvider; this.writer = writer; this.aggregateClientName = aggregateClientName; this.applicationProtocol = applicationProtocol; serviceSymbol = symbolProvider.toSymbol(service).toBuilder().putProperty("typeOnly", false).build(); closure = ServiceClosure.of(model, settings.getService(model)); } @Override public void run() { TopDownIndex topDownIndex = TopDownIndex.of(model); final Set containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(service)); boolean hasPaginators = !closure.getPaginatedOperationShapes().isEmpty(); boolean hasWaiters = !closure.getWaitableOperationShapes().isEmpty(); writer.openBlock("const commands = {"); for (OperationShape operation : containedOperations) { Symbol operationSymbol = symbolProvider .toSymbol(operation) .toBuilder() .putProperty("typeOnly", false) .build(); writer.write("$T,", operationSymbol); if (operation.hasTrait(PaginatedTrait.ID)) { hasPaginators = true; } if (operation.hasTrait(WaitableTrait.ID)) { hasWaiters = true; } } writer.closeBlock("};"); if (hasPaginators) { writer.openBlock("const paginators = {"); for (OperationShape operation : closure.getPaginatedOperationShapes()) { String paginatorFnName = "paginate" + operation.getId().getName(); String paginatorLocalName = "paginate" + StringUtils.capitalize(operation.getId().getName()); writer.addRelativeImport( paginatorFnName, paginatorLocalName, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, PaginationGenerator.getOutputFileLocation(operation) .replaceFirst("(.*?)pagination(.*?)\\.ts$", "pagination$2") ) ); writer.write("$L,", paginatorLocalName); } writer.closeBlock("};"); } if (hasWaiters) { writer.openBlock("const waiters = {"); for (OperationShape operation : closure.getWaitableOperationShapes()) { WaitableTrait waitableTrait = operation.expectTrait(WaitableTrait.class); waitableTrait .getWaiters() .forEach((String waiterName, Waiter waiter) -> { String waiterFnName = "waitUntil" + waiterName; // note: this should never differ since smithy validation requires TitleCase waiter names. String waiterLocalName = "waitUntil" + StringUtils.capitalize(waiterName); writer.addRelativeImport( waiterFnName, waiterLocalName, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, WaiterGenerator.getOutputFileLocation(waiterName) .replaceFirst("(.*?)waiters(.*?)\\.ts$", "waiters$2") ) ); writer.write("$L,", waiterLocalName); }); } writer.closeBlock("};"); } writer.write(""); // Generate an aggregated client interface. writer.openBlock("export interface $L {", "}", aggregateClientName, () -> { for (OperationShape operation : containedOperations) { Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol input = operationSymbol.expectProperty("inputType", Symbol.class); Symbol output = operationSymbol.expectProperty("outputType", Symbol.class); writer.addUseImports(operationSymbol); String methodName = StringUtils.uncapitalize(operationSymbol.getName().replaceAll("Command$", "")); // Generate a multiple overloaded methods for each command. writer.writeDocs("@see {@link " + operationSymbol.getName() + "}"); boolean inputOptional = model .getShape(operation.getInputShape()) .map(shape -> shape.getAllMembers().values().stream().noneMatch(MemberShape::isRequired)) .orElse(true); if (inputOptional) { writer.write("$L(): Promise<$T>;", methodName, output); } writer.write( """ $1L( args: $2T, options?: $3T ): Promise<$4T>; $1L( args: $2T, cb: (err: any, data?: $4T) => void ): void; $1L( args: $2T, options: $3T, cb: (err: any, data?: $4T) => void ): void;""", methodName, input, applicationProtocol.getOptionsType(), output ); writer.write(""); } for (OperationShape operation : closure.getPaginatedOperationShapes()) { if (operation.hasTrait(PaginatedTrait.ID)) { String paginatorLocalName = "paginate" + StringUtils.capitalize(operation.getId().getName()); Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol input = operationSymbol.expectProperty("inputType", Symbol.class); Symbol output = operationSymbol.expectProperty("outputType", Symbol.class); writer.addTypeImport("Paginator", null, TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("PaginationConfiguration", null, TypeScriptDependency.SMITHY_TYPES); boolean inputOptional = model .getShape(operation.getInputShape()) .map(shape -> shape.getAllMembers().values().stream().noneMatch(MemberShape::isRequired)) .orElse(true); String inputOptionality = inputOptional ? "?" : ""; writer.writeDocs( """ @see {@link %s} @param args - command input. @param paginationConfig - optional pagination config. @returns AsyncIterable of {@link %s}.""".formatted(operationSymbol.getName(), output.getName()) ); writer.write( """ $1L( args$5L: $2T, paginationConfig?: Omit<$3L, "client"> ): Paginator<$4T>; """, paginatorLocalName, input, "PaginationConfiguration", output, inputOptionality ); } } for (OperationShape operation : closure.getWaitableOperationShapes()) { if (operation.hasTrait(WaitableTrait.ID)) { WaitableTrait waitableTrait = operation.expectTrait(WaitableTrait.class); Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol input = operationSymbol.expectProperty("inputType", Symbol.class); Symbol output = operationSymbol.expectProperty("outputType", Symbol.class); String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String syntheticBaseExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); writer.addRelativeTypeImport( syntheticBaseExceptionName, null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, "models", syntheticBaseExceptionName ) ); String waiterResultType = output.getName() + " | " + syntheticBaseExceptionName; waitableTrait .getWaiters() .forEach((String waiterName, Waiter waiter) -> { String waiterLocalName = "waitUntil" + StringUtils.capitalize(waiterName); writer.addTypeImport("WaiterConfiguration", null, TypeScriptDependency.SMITHY_TYPES); writer.addTypeImportSubmodule( "WaiterResult", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); String waitUntilResultType = WaiterGenerator.computeWaitUntilResultType( waiter, output.getName(), syntheticBaseExceptionName, settings, model, symbolProvider, writer ); writer.writeDocs( """ @see {@link %s} @param args - command input. @param waiterConfig - `maxWaitTime` in seconds or waiter config object.""" .formatted(operationSymbol.getName()) ); writer.write( """ $1L( args: $2T, waiterConfig: number | Omit<$3L, "client"> ): Promise>; """, waiterLocalName, input, "WaiterConfiguration<" + aggregateClientName + ">", waitUntilResultType ); }); } } writer.unwrite("\n"); }); writer.write(""); // Generate the client and extend from the bare-bones client. writer.writeShapeDocs(service); writer.write( "export class $L extends $T implements $L {}", aggregateClientName, serviceSymbol, aggregateClientName ); writer.addImportSubmodule( "createAggregatedClient", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); if (hasPaginators && hasWaiters) { writer.write("createAggregatedClient(commands, $L, { paginators, waiters });", aggregateClientName); } else if (hasPaginators) { writer.write("createAggregatedClient(commands, $L, { paginators });", aggregateClientName); } else if (hasWaiters) { writer.write("createAggregatedClient(commands, $L, { waiters });", aggregateClientName); } else { writer.write("createAggregatedClient(commands, $L);", aggregateClientName); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/ServiceBareBonesClientGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.endpointsV2.EndpointsV2Generator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.typescript.codegen.sections.ClientBodyExtraCodeSection; import software.amazon.smithy.typescript.codegen.sections.ClientConfigCodeSection; import software.amazon.smithy.typescript.codegen.sections.ClientConstructorCodeSection; import software.amazon.smithy.typescript.codegen.sections.ClientDestroyCodeSection; import software.amazon.smithy.typescript.codegen.sections.ClientPropertiesCodeSection; import software.amazon.smithy.typescript.codegen.util.ClientWriterConsumer; import software.amazon.smithy.utils.OptionalUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates a bare-bones client and configuration for service using plugins. */ @SmithyInternalApi public final class ServiceBareBonesClientGenerator implements Runnable { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final Symbol symbol; private final String configType; private final String resolvedConfigType; private final List integrations; private final List runtimePlugins; private final ApplicationProtocol applicationProtocol; ServiceBareBonesClientGenerator( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer, List integrations, List runtimePlugins, ApplicationProtocol applicationProtocol ) { this.settings = settings; this.model = model; this.service = settings.getService(model); this.symbolProvider = symbolProvider; this.writer = writer; this.integrations = integrations; this.runtimePlugins = runtimePlugins .stream() // Only apply plugins that target the entire client. .filter(plugin -> plugin.matchesService(model, service)) .collect(Collectors.toList()); this.applicationProtocol = applicationProtocol; symbol = symbolProvider.toSymbol(service); configType = getConfigTypeName(symbol); resolvedConfigType = getResolvedConfigTypeName(symbol); } public static String getConfigTypeName(Symbol symbol) { return symbol.getName() + "Config"; } public static String getResolvedConfigTypeName(Symbol symbol) { return symbol.getName() + "ResolvedConfig"; } @Override public void run() { writer.addImportSubmodule("Client", "__Client", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); writer.write("export { __Client };\n"); writer.addRelativeImport( "getRuntimeConfig", "__getRuntimeConfig", Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeConfig") ); // Normalize the input and output types of the command to account for // things like an operation adding input where there once wasn't any // input, adding output, naming differences between services, etc. writeInputOutputTypeUnion( "ServiceInputTypes", writer, operationSymbol -> operationSymbol.getProperty("inputType", Symbol.class), writer -> { // Use an empty object if an operation doesn't define input. writer.write("| {}"); } ); writeInputOutputTypeUnion( "ServiceOutputTypes", writer, operationSymbol -> operationSymbol.getProperty("outputType", Symbol.class), writer -> { // Use a MetadataBearer if an operation doesn't define output. writer.addTypeImport("MetadataBearer", "__MetadataBearer", TypeScriptDependency.SMITHY_TYPES); writer.write("| __MetadataBearer"); } ); generateConfig(); writer.write(""); generateService(); } private void writeInputOutputTypeUnion( String typeName, TypeScriptWriter writer, Function> mapper, Consumer defaultTypeGenerator ) { TopDownIndex topDownIndex = TopDownIndex.of(model); Set containedOperations = topDownIndex.getContainedOperations(service); List symbols = containedOperations .stream() .map(symbolProvider::toSymbol) .flatMap(operation -> OptionalUtils.stream(mapper.apply(operation))) .sorted(Comparator.comparing(Symbol::getName)) .collect(Collectors.toList()); writer.writeDocs("@public"); writer.write("export type $L = ", typeName); writer.indent(); // If we have less symbols than operations, at least one doesn't have a type, so add the default. if (containedOperations.size() != symbols.size() || containedOperations.isEmpty()) { defaultTypeGenerator.accept(writer); } for (int i = 0; i < symbols.size(); i++) { Symbol symbol = symbols.get(i); writer.write("| $T$L", symbol, i == symbols.size() - 1 ? ";" : ""); } writer.dedent(); writer.write(""); } private void generateConfig() { writer.addRelativeTypeImport( "RuntimeExtensionsConfig", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeExtensions") ); writer.addTypeImportSubmodule( "SmithyConfiguration", "__SmithyConfiguration", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.addTypeImportSubmodule( "SmithyResolvedConfiguration", "__SmithyResolvedConfiguration", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); // Hook for intercepting the client configuration. writer.pushState( ClientConfigCodeSection.builder() .settings(settings) .model(model) .service(service) .symbolProvider(symbolProvider) .integrations(integrations) .runtimeClientPlugins(runtimePlugins) .applicationProtocol(applicationProtocol) .build() ); generateClientDefaults(); writer.writeDocs("@public"); // The default configuration type is always just the base-level // Smithy configuration requirements. writer.write( "export type $LType = Partial<__SmithyConfiguration<$T>> &", configType, applicationProtocol.getOptionsType() ); writer.indent(); writer.write("ClientDefaults &"); // Get the configuration symbol types to reference in code. These are // all "&"'d together to create a big configuration type that aggregates // more modular configuration types. List inputTypes = runtimePlugins .stream() .flatMap(p -> OptionalUtils.stream(p.getInputConfig())) .collect(Collectors.toList()); if (!inputTypes.isEmpty()) { for (SymbolReference symbolReference : inputTypes) { if (symbolReference.getAlias().equals("EndpointInputConfig")) { writer.addTypeImport( "EndpointParameters", null, EndpointsV2Generator.ENDPOINT_PARAMETERS_DEPENDENCY ); writer.write("$T<$L> &", symbolReference, "EndpointParameters"); } else { writer.write("$T &", symbolReference); } } writer.addTypeImport( "ClientInputEndpointParameters", null, EndpointsV2Generator.ENDPOINT_PARAMETERS_DEPENDENCY ); writer.write("ClientInputEndpointParameters;"); writer.dedent(); } writer.writeDocs( String.format( "%s The configuration interface of %s class constructor that set the region, " + "credentials and other options.", "@public\n\n", symbol.getName() ) ); writer.write("export interface $1L extends $1LType {}", configType); // Generate the corresponding "Resolved" configuration type to account for // each "Input" configuration type. writer.write(""); writer.writeDocs("@public"); writer.write( "export type $LType = __SmithyResolvedConfiguration<$T> &", resolvedConfigType, applicationProtocol.getOptionsType() ); writer.indent(); writer.write("Required &"); writer.write("RuntimeExtensionsConfig &"); if (!inputTypes.isEmpty()) { runtimePlugins .stream() .flatMap(p -> OptionalUtils.stream(p.getResolvedConfig())) .forEach(symbol -> { if (symbol.getAlias().equals("EndpointResolvedConfig")) { writer.addTypeImport( "EndpointParameters", null, EndpointsV2Generator.ENDPOINT_PARAMETERS_DEPENDENCY ); writer.write("$T<$L> &", symbol, "EndpointParameters"); } else { writer.write("$T &", symbol); } }); writer.addTypeImport( "ClientResolvedEndpointParameters", null, EndpointsV2Generator.ENDPOINT_PARAMETERS_DEPENDENCY ); writer.write("ClientResolvedEndpointParameters;"); writer.dedent(); } writer.writeDocs( String.format( "%s The resolved configuration interface of %s class. This is resolved and" + " normalized from the {@link %s | constructor configuration interface}.", "@public\n\n", symbol.getName(), configType ) ); writer.write("export interface $1L extends $1LType {}", resolvedConfigType); writer.popState(); } private void generateClientDefaults() { if (!applicationProtocol.isHttpProtocol()) { throw new UnsupportedOperationException( "Protocols other than HTTP are not yet implemented: " + applicationProtocol ); } Runnable innerContent = () -> { writer.addTypeImportSubmodule( "HttpHandlerUserInput", "__HttpHandlerUserInput", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.writeDocs( "The HTTP handler to use or its constructor options. Fetch in browser and Https in Nodejs." ); writer.write("requestHandler?: __HttpHandlerUserInput;\n"); writer.addTypeImport("HashConstructor", "__HashConstructor", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("ChecksumConstructor", "__ChecksumConstructor", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( """ A constructor for a class implementing the {@link @smithy/types#ChecksumConstructor} interface that computes the SHA-256 HMAC or checksum of a string or binary buffer. @internal""" ); writer.write("sha256?: __ChecksumConstructor | __HashConstructor;\n"); writer.addTypeImport("UrlParser", "__UrlParser", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs("The function that will be used to convert strings into HTTP endpoints.\n" + "@internal"); writer.write("urlParser?: __UrlParser;\n"); writer.addTypeImport("BodyLengthCalculator", "__BodyLengthCalculator", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs("A function that can calculate the length of a request body.\n" + "@internal"); writer.write("bodyLengthChecker?: __BodyLengthCalculator;\n"); writer.addTypeImport("StreamCollector", "__StreamCollector", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs("A function that converts a stream into an array of bytes.\n" + "@internal"); writer.write("streamCollector?: __StreamCollector;\n"); // Note: Encoder and Decoder are both used for base64 and UTF. writer.addTypeImport("Encoder", "__Encoder", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Decoder", "__Decoder", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( "The function that will be used to convert a base64-encoded string to a byte array.\n" + "@internal" ); writer.write("base64Decoder?: __Decoder;\n"); writer.writeDocs( "The function that will be used to convert binary data to a base64-encoded string.\n" + "@internal" ); writer.write("base64Encoder?: __Encoder;\n"); writer.writeDocs( "The function that will be used to convert a UTF8-encoded string to a byte array.\n" + "@internal" ); writer.write("utf8Decoder?: __Decoder;\n"); writer.writeDocs( "The function that will be used to convert binary data to a UTF-8 encoded string.\n" + "@internal" ); writer.write("utf8Encoder?: __Encoder;\n"); writer.writeDocs("The runtime environment.\n" + "@internal"); writer.write("runtime?: string;\n"); writer.writeDocs( "Disable dynamically changing the endpoint of the client based on the hostPrefix \n" + "trait of an operation." ); writer.write("disableHostPrefix?: boolean;\n"); // Write custom configuration dependencies. for (TypeScriptIntegration integration : integrations) { integration.addConfigInterfaceFields(settings, model, symbolProvider, writer); } }; writer .writeDocs("@public") .openBlock( "export interface ClientDefaults extends Partial<__SmithyConfiguration<$T>> {", "}\n", applicationProtocol.getOptionsType(), innerContent ); } private void generateService() { // Write out the service. writer.writeShapeDocs(service); writer .openBlock(""" export class $L extends __Client< $T, ServiceInputTypes, ServiceOutputTypes, $L > {""", "}", symbol.getName(), applicationProtocol.getOptionsType(), resolvedConfigType, () -> { generateClientProperties(); generateConstructor(); writer.write(""); generateDestroyMethod(); // Hook for adding more methods to the client. writer.injectSection( ClientBodyExtraCodeSection.builder() .settings(settings) .model(model) .service(service) .symbolProvider(symbolProvider) .integrations(integrations) .runtimeClientPlugins(runtimePlugins) .applicationProtocol(applicationProtocol) .build() ); }); } private void generateClientProperties() { // Hook for adding/changing client properties. writer.pushState( ClientPropertiesCodeSection.builder() .settings(settings) .model(model) .service(service) .symbolProvider(symbolProvider) .integrations(integrations) .applicationProtocol(applicationProtocol) .build() ); writer.writeDocs( String.format( "The resolved configuration of %s class. This is resolved and normalized from " + "the {@link %s | constructor configuration interface}.", symbol.getName(), configType ) ); writer.write("readonly config: $L;\n", resolvedConfigType); writer.popState(); } private void generateConstructor() { writer.addTypeImport( "CheckOptionalClientConfig", "__CheckOptionalClientConfig", TypeScriptDependency.SMITHY_TYPES ); writer.openBlock("constructor(...[configuration]: __CheckOptionalClientConfig<$L>) {", "}", configType, () -> { // Hook for adding/changing the client constructor. writer.pushState( ClientConstructorCodeSection.builder() .service(service) .runtimeClientPlugins(runtimePlugins) .model(model) .build() ); int configVariable = 0; String initialConfigVar = generateConfigVariable(configVariable); writer.write("const $L = __getRuntimeConfig(configuration || {});", initialConfigVar); writer.write("super($L as any);", initialConfigVar); writer.write("this.initConfig = $L;", initialConfigVar); configVariable++; writer.addImport( "resolveClientEndpointParameters", null, EndpointsV2Generator.ENDPOINT_PARAMETERS_DEPENDENCY ); writer.write( "const $L = $L($L);", generateConfigVariable(configVariable), "resolveClientEndpointParameters", generateConfigVariable(configVariable - 1) ); // Add runtime plugin "resolve" method calls. These are invoked one // after the other until all the runtime plugins have been called. // Only plugins that have configuration are called. Each time the // configuration is updated, the configuration variable is incremented // (e.g., _config_0, _config_1, etc.). for (RuntimeClientPlugin plugin : runtimePlugins) { if (plugin.getResolveFunction().isPresent()) { configVariable++; // Construct additional parameters string Map paramsMap = plugin.getAdditionalResolveFunctionParameters(model, service, null); List additionalParameters = CodegenUtils.getFunctionParametersList(paramsMap); String additionalParamsString = additionalParameters.isEmpty() ? "" : ", { " + String.join(", ", additionalParameters) + " }"; // Construct writer context Map symbolMap = new HashMap<>(); symbolMap.put("newConfig", generateConfigVariable(configVariable)); symbolMap.put("resolveFn", plugin.getResolveFunction().get()); symbolMap.put("oldConfig", generateConfigVariable(configVariable - 1)); for (Map.Entry entry : paramsMap.entrySet()) { if (entry.getValue() instanceof Symbol) { symbolMap.put(entry.getKey(), entry.getValue()); } } writer.pushState(); writer.putContext(symbolMap); writer.write("const $newConfig:L = $resolveFn:T($oldConfig:L" + additionalParamsString + ");"); writer.popState(); } } writer.addRelativeImport( "resolveRuntimeExtensions", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeExtensions") ); configVariable++; writer.write( "const $L = resolveRuntimeExtensions($L, configuration?.extensions || []);", generateConfigVariable(configVariable), generateConfigVariable(configVariable - 1) ); writer.write("this.config = $L;", generateConfigVariable(configVariable)); if (SchemaGenerationAllowlist.allows(service.getId(), settings)) { writer.addImportSubmodule("getSchemaSerdePlugin", null, TypeScriptDependency.SMITHY_CORE, "/schema"); writer.write( """ this.middlewareStack.use(getSchemaSerdePlugin(this.config));""" ); } // Add runtime plugins that contain middleware to the middleware stack // of the client. for (RuntimeClientPlugin plugin : runtimePlugins) { plugin .getPluginFunction() .ifPresent(pluginSymbol -> { // Construct additional parameters string Map paramsMap = plugin.getAdditionalPluginFunctionParameters( model, service, null ); // Construct writer context Map symbolMap = new HashMap<>(); symbolMap.put("pluginFn", pluginSymbol); for (Map.Entry entry : paramsMap.entrySet()) { if (entry.getValue() instanceof Symbol) { symbolMap.put(entry.getKey(), entry.getValue()); } } writer.pushState(); writer.putContext(symbolMap); boolean isAuthSchemeEndpointRuleSetPlugin = pluginSymbol .getAlias() .equals("getHttpAuthSchemeEndpointRuleSetPlugin"); if (isAuthSchemeEndpointRuleSetPlugin) { writer.openBlock("this.middlewareStack.use("); writer.ensureNewline(); writer.writeInline("$pluginFn:T(this.config"); } else { writer.writeInline("this.middlewareStack.use($pluginFn:T(this.config"); } List additionalParameters = CodegenUtils.getFunctionParametersList(paramsMap); Map clientAddParamsWriterConsumers = plugin.getClientAddParamsWriterConsumers(); boolean noAdditionalParams = additionalParameters.isEmpty() && clientAddParamsWriterConsumers.isEmpty(); if (!noAdditionalParams) { writer.writeInline(", "); boolean hasInnerContent = !clientAddParamsWriterConsumers.isEmpty() || !additionalParameters.isEmpty(); if (!hasInnerContent) { writer.writeInline("{}"); } else { writer.write("{").indent(); // caution: using String.join instead of templating // because additionalParameters may contain Smithy syntax. if (!additionalParameters.isEmpty()) { writer.writeInline(String.join(", ", additionalParameters) + ", "); } clientAddParamsWriterConsumers.forEach((key, consumer) -> { writer.write( "$L: $C,", key, (Consumer) (w2 -> { consumer.accept( w2, ClientBodyExtraCodeSection.builder() .settings(settings) .model(model) .service(service) .symbolProvider(symbolProvider) .integrations(integrations) .runtimeClientPlugins(runtimePlugins) .applicationProtocol(applicationProtocol) .build() ); }) ); }); writer.dedent(); writer.writeInline("}"); } } if (isAuthSchemeEndpointRuleSetPlugin) { writer.write(")"); writer.closeBlock(");"); } else { writer.write("));"); } writer.popState(); }); } writer.popState(); }); } private String generateConfigVariable(int number) { return "_config_" + number; } private void generateDestroyMethod() { // Generates the destroy() method, and calls the destroy() method of // any runtime plugin that claims to have a destroy method. if (applicationProtocol.isHttpProtocol()) { writer.writeDocs( "Destroy underlying resources, like sockets. It's usually not necessary to do this.\n" + "However in Node.js, it's best to explicitly shut down the client's agent when it is no longer " + "needed.\nOtherwise, sockets might stay open for quite a long time before the server terminates " + "them." ); } writer.openBlock("destroy(): void {", "}", () -> { writer.pushState(ClientDestroyCodeSection.builder().runtimeClientPlugins(runtimePlugins).build()); for (RuntimeClientPlugin plugin : runtimePlugins) { plugin .getDestroyFunction() .ifPresent(destroy -> { writer.write("$T(this.config);", destroy); }); } writer.popState(); // Always call destroy() in SmithyClient class. By default, it's optional. writer.write("super.destroy();"); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SmithyCoreSubmodules.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; /** * This is an enum-like submodule list to be used with * * TypeScriptWriter::addImportSubmodule( * Dependency == "cbor", * null (no alias), * PackageContainer == "@smithy/core", * SmithyCoreSubmodules.CBOR == "/cbor" * ); * * The intended result is e.g. * ```ts * import { cbor } from "@smithy/core/cbor"; * ``` */ public final class SmithyCoreSubmodules { public static final String CBOR = "/cbor"; public static final String CHECKSUM = "/checksum"; public static final String CLIENT = "/client"; public static final String CONFIG = "/config"; public static final String ENDPOINTS = "/endpoints"; public static final String EVENT_STREAMS = "/event-streams"; public static final String RETRY = "/retry"; public static final String PROTOCOLS = "/protocols"; public static final String SERDE = "/serde"; private SmithyCoreSubmodules() {} } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructureGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static software.amazon.smithy.typescript.codegen.CodegenUtils.getBlobStreamingMembers; import static software.amazon.smithy.typescript.codegen.CodegenUtils.writeInlineStreamingMemberType; import java.util.List; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.typescript.codegen.TypeScriptSettings.RequiredMemberMode; import software.amazon.smithy.typescript.codegen.integration.HttpProtocolGeneratorUtils; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.validation.SensitiveDataFinder; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates normal structures and error structures. * * Renders structures as interfaces. * *

* A namespace is created with the same name as the structure to * provide helper functionality for checking if a given value is * known to be of the same type as the structure. This will be * even more useful if/when inheritance is added to Smithy. * *

* Note that the {@code required} trait on structures is used to * determine whether or not a generated TypeScript interface uses * required members. This is typically not recommended in other languages * since it's documented as backward-compatible for a model to migrate a * required property to optional. This becomes an issue when an older * client consumes a service that has relaxed a member to become optional. * In the case of sending data from the client to the server, the client * likely either is still operating under the assumption that the property * is required, or the client can set a property explicitly to * {@code undefined} to fix any TypeScript compilation errors. In the * case of deserializing a value from a service to the client, the * deserializers will need to set previously required properties to * undefined too. * *

* The generator will explicitly state that a required property can * be set to {@code undefined}. This makes it clear that undefined checks * need to be made when using {@code --strictNullChecks}, but has no * effect otherwise. */ @SmithyInternalApi final class StructureGenerator implements Runnable { private final Model model; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final StructureShape shape; private final boolean includeValidation; private final RequiredMemberMode requiredMemberMode; private final SensitiveDataFinder sensitiveDataFinder; private final boolean schemaMode; private final ServiceClosure closure; /** * sets 'includeValidation' to 'false' and requiredMemberMode * to {@link RequiredMemberMode#NULLABLE}. */ StructureGenerator( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider, TypeScriptWriter writer, StructureShape shape ) { this(model, settings, symbolProvider, writer, shape, false, RequiredMemberMode.NULLABLE, false); } StructureGenerator( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider, TypeScriptWriter writer, StructureShape shape, boolean includeValidation, RequiredMemberMode requiredMemberMode, boolean schemaMode ) { this.model = model; this.symbolProvider = symbolProvider; this.writer = writer; this.shape = shape; this.includeValidation = includeValidation; this.requiredMemberMode = requiredMemberMode; sensitiveDataFinder = new SensitiveDataFinder(model); this.schemaMode = schemaMode; closure = ServiceClosure.of(model, settings.getService(model)); } @Override public void run() { if (shape.hasTrait(ErrorTrait.class)) { renderErrorStructure(); } else { renderNonErrorStructure(); } } /** * Renders a normal, non-error structure. * *

* For example, given the following Smithy model: * *

     * {@code
     * namespace smithy.example
     *
     * structure Person {
     *     @required
     *     name: String,
     *     @range(min: 1)
     *     age: Integer,
     * }
     * }
     * 
* *

* The following TypeScript is rendered: * *

{@code
     * export interface Person {
     *   name: string | undefined;
     *   age?: number | null;
     * }
     *
     * export const PersonFilterSensitiveLog = (obj: Person): any => ({...obj});
     * }
* *

* If validation is enabled, it generates the following: * *

{@code
     * export interface Person {
     *   name: string | undefined;
     *   age?: number | null;
     * }
     *
     * export const PersonFilterSensitiveLog = (obj: Person): any => ({...obj});
     *
     * export namespace Person {
     *   export const validate = (obj: Person): ValidationFailure[] => {
     *       // validation
     *   }
     * }
     *
     * }
*/ private void renderNonErrorStructure() { Symbol symbol = symbolProvider.toSymbol(shape); writer.writeShapeDocs(shape); // Find symbol references with the "extends" property. String extendsFrom = symbol .getReferences() .stream() .filter(ref -> ref.getProperty(SymbolVisitor.IMPLEMENTS_INTERFACE_PROPERTY).isPresent()) .map(SymbolReference::getAlias) .collect(Collectors.joining(", ")); StructuredMemberWriter config = new StructuredMemberWriter( model, closure, symbolProvider, shape.getAllMembers().values(), this.requiredMemberMode, sensitiveDataFinder ); if (config.members.isEmpty()) { writer.write("export interface $L {}", symbol.getName()); } else { if (extendsFrom.isEmpty()) { writer.openBlock("export interface $L {", symbol.getName()); } else { writer.openBlock("export interface $L extends $L {", symbol.getName(), extendsFrom); } config.writeMembers(writer, shape); writer.closeBlock("}"); } writer.write(""); renderStructureNamespace(config, includeValidation); } private void renderStructureNamespace(StructuredMemberWriter structuredMemberWriter, boolean includeValidation) { Symbol symbol = symbolProvider.toSymbol(shape); String objectParam = "obj"; if (sensitiveDataFinder.findsSensitiveDataIn(shape) && !schemaMode) { writer.writeDocs("@internal"); writer.openBlock( "export const $LFilterSensitiveLog = ($L: $L): any => ({", "})", symbol.getName(), objectParam, symbol.getName(), () -> { structuredMemberWriter.writeFilterSensitiveLog(writer, objectParam); } ); } if (!includeValidation) { return; } writer.openBlock("export namespace $L {", "}", symbol.getName(), () -> { structuredMemberWriter.writeMemberValidatorCache(writer, "memberValidators"); writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.writeDocs("@internal"); List blobStreamingMembers = getBlobStreamingMembers(model, shape); writer.writeInline("export const validate = ($L: ", objectParam); if (blobStreamingMembers.isEmpty()) { writer.writeInline("$L", symbol.getName()); } else { writeInlineStreamingMemberType(writer, symbol, blobStreamingMembers.get(0)); } writer.openBlock(", path: string = \"\"): __ValidationFailure[] => {", "}", () -> { structuredMemberWriter.writeMemberValidatorFactory(writer, "memberValidators"); structuredMemberWriter.writeValidateMethodContents(writer, objectParam); }); }); } /** * Error structures generate classes that extend from service base exception * (ServiceException in case of server SDK), and add the appropriate fault * property. * *

* Given the following Smithy structure: * *

     * {@code
     * namespace smithy.example
     *
     * @error("client")
     * structure NoSuchResource {
     *     @required
     *     resourceType: String
     * }
     * }
     * 
* *

* The following TypeScript is generated: * *

{@code
     * import { ExceptionOptionType as __ExceptionOptionType } from "@smithy/smithy-client";
     * import { FooServiceException as __BaseException } from "./FooServiceException";
     * // In server SDK:
     * // import { ServiceException as __BaseException } from "@aws-smithy/server-common";
     *
     * export class NoSuchResource extends __BaseException {
     *   name: "NoSuchResource";
     *   $fault: "client";
     *   resourceType: string | undefined;
     *   // @internal
     *   constructor(opts: __ExceptionOptionType) {
     *     super({
     *       name: "NoSuchResource",
     *       $fault: "client",
     *       ...opts
     *     });
     *     Object.setPrototypeOf(this, NoSuchResource.prototype);
     *     this.resourceType = opts.resourceType;
     *   }
     * }
     * }
*/ private void renderErrorStructure() { ErrorTrait errorTrait = shape.getTrait(ErrorTrait.class).orElseThrow(IllegalStateException::new); Symbol symbol = symbolProvider.toSymbol(shape); writer.writeShapeDocs(shape); boolean isServerSdk = this.includeValidation; writer.openBlock("export class $T extends $L {", symbol, "__BaseException"); writer.write("readonly name = $1S as const;", shape.getId().getName()); writer.write("readonly $$fault = $1S as const;", errorTrait.getValue()); if (!isServerSdk) { HttpProtocolGeneratorUtils.writeRetryableTrait(writer, shape, ";"); } StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter( model, closure, symbolProvider, shape.getAllMembers().values(), this.requiredMemberMode, sensitiveDataFinder ); // since any error interface must extend from JavaScript Error interface, // message member is already // required in the JavaScript Error interface structuredMemberWriter.skipMembers.add("message"); structuredMemberWriter.writeMembers(writer, shape); structuredMemberWriter.writeErrorConstructor(writer, shape, isServerSdk); writer.closeBlock("}"); writer.write(""); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.SimpleShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.EnumDefinition; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.model.traits.EnumValueTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.InternalTrait; import software.amazon.smithy.model.traits.LengthTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.PatternTrait; import software.amazon.smithy.model.traits.RangeTrait; import software.amazon.smithy.model.traits.RequiredTrait; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.traits.UniqueItemsTrait; import software.amazon.smithy.typescript.codegen.TypeScriptSettings.RequiredMemberMode; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.validation.SensitiveDataFinder; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates objects, interfaces, enums, etc. */ @SmithyInternalApi final class StructuredMemberWriter { Model model; SymbolProvider symbolProvider; Collection members; String memberPrefix = ""; boolean noDocs; RequiredMemberMode requiredMemberMode; final Set skipMembers = new HashSet<>(); private final SensitiveDataFinder sensitiveDataFinder; private final ServiceClosure closure; StructuredMemberWriter( Model model, ServiceClosure closure, SymbolProvider symbolProvider, Collection members ) { this(model, closure, symbolProvider, members, RequiredMemberMode.NULLABLE); } StructuredMemberWriter( Model model, ServiceClosure closure, SymbolProvider symbolProvider, Collection members, RequiredMemberMode requiredMemberMode ) { this(model, closure, symbolProvider, members, requiredMemberMode, new SensitiveDataFinder(model)); } StructuredMemberWriter( Model model, ServiceClosure closure, SymbolProvider symbolProvider, Collection members, RequiredMemberMode requiredMemberMode, SensitiveDataFinder sensitiveDataFinder ) { this.model = model; this.symbolProvider = symbolProvider; this.members = new LinkedHashSet<>(members); this.requiredMemberMode = requiredMemberMode; this.sensitiveDataFinder = sensitiveDataFinder; this.closure = closure; } void writeMembers(TypeScriptWriter writer, Shape shape) { int position = -1; for (MemberShape member : members) { if (skipMembers.contains(member.getMemberName())) { continue; } position++; boolean wroteDocs = !noDocs && writer.writeMemberDocs(model, member); String memberName = getSanitizedMemberName(member); String optionalSuffix = shape.isUnionShape() || !closure.isMemberRequiredInClient(member) ? "?" : ""; String typeSuffix = requiredMemberMode == RequiredMemberMode.NULLABLE && closure.isMemberRequiredInClient(member) ? " | undefined" : ""; if (optionalSuffix.equals("?")) { typeSuffix = " | undefined"; // support exactOptionalPropertyTypes. } writer.write( "${L}${L}${L}: ${T}${L};", memberPrefix, memberName, optionalSuffix, symbolProvider.toSymbol(member).toBuilder().putProperty("typeOnly", true).build(), typeSuffix ); if (wroteDocs && position < members.size() - 1) { writer.write(""); } } } void writeFilterSensitiveLog(TypeScriptWriter writer, String objectParam) { writer.write("...$L,", objectParam); for (MemberShape member : members) { if (isMemberOverwriteRequired(member, new HashSet())) { String memberName = getSanitizedMemberName(member); writer.openBlock("...($1L.$2L && { $2L: ", "}),", objectParam, memberName, () -> { String memberParam = String.format("%s.%s", objectParam, memberName); writeMemberFilterSensitiveLog(writer, member, memberParam); }); } } } void writeMemberFilterSensitiveLog(TypeScriptWriter writer, MemberShape member, String memberParam) { Shape memberTarget = model.expectShape(member.getTarget()); if (member.getMemberTrait(model, SensitiveTrait.class).isPresent()) { writeSensitiveString(writer); } else if (memberTarget instanceof SimpleShape) { writer.write(memberParam); } else if (memberTarget.isStructureShape() || memberTarget.isUnionShape()) { writeStructureFilterSensitiveLog(writer, memberTarget, memberParam); } else if (memberTarget instanceof CollectionShape) { MemberShape collectionMember = ((CollectionShape) memberTarget).getMember(); writeCollectionFilterSensitiveLog(writer, collectionMember, memberParam); } else if (memberTarget instanceof MapShape) { MemberShape mapMember = ((MapShape) memberTarget).getValue(); writeMapFilterSensitiveLog(writer, mapMember, memberParam); } else { throw new CodegenException( String.format("MemberFilterSensitiveLog attempted for %s", memberTarget.getType()) ); } } /** * Writes constructor of SDK exception classes. */ void writeErrorConstructor(TypeScriptWriter writer, Shape shape, boolean isServerSdk) { ErrorTrait errorTrait = shape.getTrait(ErrorTrait.class).orElseThrow(IllegalStateException::new); Symbol symbol = symbolProvider.toSymbol(shape); if (!isServerSdk) { writer.writeDocs("@internal"); } writer.addTypeImportSubmodule( "ExceptionOptionType", "__ExceptionOptionType", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.openBlock("constructor(opts: __ExceptionOptionType<$L, __BaseException>) {", symbol.getName()); writer.openBlock("super({", "});", () -> { writer.write("name: $S,", shape.getId().getName()); writer.write("$$fault: $S,", errorTrait.getValue()); writer.write("...opts,"); }); writer.write("Object.setPrototypeOf(this, $L.prototype);", symbol.getName()); for (MemberShape member : members) { if (skipMembers.contains(member.getMemberName())) { continue; } writer.write("this.${1L} = opts.${1L};", getSanitizedMemberName(member)); } writer.closeBlock("}"); } /** * Writes SENSITIVE_STRING to hide the value of sensitive members. */ private void writeSensitiveString(TypeScriptWriter writer) { writer.addImportSubmodule( "SENSITIVE_STRING", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("SENSITIVE_STRING"); } /** * Recursively writes filterSensitiveLog for StructureShape. */ private void writeStructureFilterSensitiveLog( TypeScriptWriter writer, Shape structureTarget, String structureParam ) { if (structureTarget.hasTrait(SensitiveTrait.class)) { writeSensitiveString(writer); } else if (structureTarget.hasTrait(StreamingTrait.class) && structureTarget.isUnionShape()) { // disable logging for StreamingTrait writer.write("'STREAMING_CONTENT'"); } else if (structureTarget.hasTrait(ErrorTrait.class)) { // Sensitive logs are not filtered from errors. writer.write("$L", structureParam); } else { if (sensitiveDataFinder.findsSensitiveDataIn(structureTarget)) { // Call filterSensitiveLog on Structure. Symbol symbol = symbolProvider.toSymbol(structureTarget); String filterFunctionName = symbol.getName() + "FilterSensitiveLog"; if (!symbol.getNamespace().contains(writer.getModuleName())) { writer.addRelativeImport(filterFunctionName, null, Paths.get(".", symbol.getNamespace())); } writer.write("$L($L)", filterFunctionName, structureParam); } else { writer.write("$L", structureParam); } } } /** * Recursively writes filterSensitiveLog for CollectionShape. */ private void writeCollectionFilterSensitiveLog( TypeScriptWriter writer, MemberShape collectionMember, String collectionParam ) { if (collectionMember.getMemberTrait(model, SensitiveTrait.class).isPresent()) { writeSensitiveString(writer); } else if (model.expectShape(collectionMember.getTarget()) instanceof SimpleShape) { writer.write(collectionParam); } else { writer.openBlock("$L.map(", ")", collectionParam, () -> { String itemParam = "item"; writer.write("$L => ", itemParam); writeMemberFilterSensitiveLog(writer, collectionMember, itemParam); }); } } /** * Recursively writes filterSensitiveLog for MapShape. */ private void writeMapFilterSensitiveLog(TypeScriptWriter writer, MemberShape mapMember, String mapParam) { if (mapMember.getMemberTrait(model, SensitiveTrait.class).isPresent()) { writeSensitiveString(writer); } else if (model.expectShape(mapMember.getTarget()) instanceof SimpleShape) { writer.write(mapParam); } else { String accParam = "acc"; // accumulator for the reducer String keyParam = "key"; // key of the Object.entries() key-value pair String valueParam = "value"; // value of the Object.entries() key-value pair // Reducer is common to all shapes. writer.openBlock( "Object.entries($L).reduce(($L: any, [$L, $L]: [string, $T]) => (", "), {})", mapParam, accParam, keyParam, valueParam, symbolProvider.toSymbol(mapMember), () -> { writer.openBlock("$L[$L] =", "", accParam, keyParam, () -> { writeMemberFilterSensitiveLog(writer, mapMember, valueParam); writer.writeInline(","); }); writer.write(accParam); } ); } } /** * Identifies if member needs to be overwritten in filterSensitiveLog. * * @param member a {@link MemberShape} to check if overwrite is required. * @param parents a set of membernames which are parents of existing member to * avoid unending recursion. * @return Returns true if the overwrite is required on member. */ private boolean isMemberOverwriteRequired(MemberShape member, Set parents) { if (member.getMemberTrait(model, SensitiveTrait.class).isPresent()) { return true; } Shape memberTarget = model.expectShape(member.getTarget()); if (memberTarget.isUnionShape()) { // always call filterSensitiveLog for UnionShape return true; } else if (memberTarget.isStructureShape()) { if (!parents.contains(symbolProvider.toMemberName(member))) { parents.add(symbolProvider.toMemberName(member)); Collection structureMemberList = ((StructureShape) memberTarget).getAllMembers().values(); for (MemberShape structureMember : structureMemberList) { if ( !parents.contains(symbolProvider.toMemberName(structureMember)) && isMemberOverwriteRequired(structureMember, parents) ) { return true; } } } } else if (memberTarget instanceof CollectionShape) { MemberShape collectionMember = ((CollectionShape) memberTarget).getMember(); return isMemberOverwriteRequired(collectionMember, parents); } else if (memberTarget instanceof MapShape) { MemberShape mapMember = ((MapShape) memberTarget).getValue(); return isMemberOverwriteRequired(mapMember, parents); } return false; } /** * Returns the member name to be used in generation. * * @param member a {@link MemberShape} to be sanitized. * @return Returns the member name to be used in generation. */ private String getSanitizedMemberName(MemberShape member) { return TypeScriptUtils.sanitizePropertyName(symbolProvider.toMemberName(member)); } /** * Writes an empty cache into the namespace for use by the member validator * factory. * * Due to the fact that validation references can be circular, we need to defer * retrieval of validators * to runtime, but we do not want to reinstantiate each validator every time it * is needed. * * @param writer the writer for the type, currently positioned in the type's * exported namespace * @param cacheName the name of the in-scope cache for the validators */ void writeMemberValidatorCache(TypeScriptWriter writer, String cacheName) { writer.openBlock("const $L : {", "} = {};", cacheName, () -> { for (MemberShape member : members) { writer.addImport( "MultiConstraintValidator", "__MultiConstraintValidator", TypeScriptDependency.SERVER_COMMON ); final Shape targetShape = model.expectShape(member.getTarget()); writer.writeInline("$L?: ", getSanitizedMemberName(member)); writer.writeInline("__MultiConstraintValidator<"); writeConstraintValidatorType(writer, targetShape); writer.write(">,"); } }); } /** * Writes a member validator factory method that will reuse cached validators, * or create new ones if this is * the first instance of validation. * * @param writer the writer for the type, currently positioned in the type's * validate method * @param cacheName the name of the in-scope cache for the validators */ void writeMemberValidatorFactory(TypeScriptWriter writer, String cacheName) { writer.openBlock( "function getMemberValidator(member: T): " + "NonNullable {", "}", cacheName, () -> { writer.openBlock("if ($L[member] === undefined) {", "}", cacheName, () -> { writer.openBlock("switch (member) {", "}", () -> { for (MemberShape member : members) { final Shape targetShape = model.expectShape(member.getTarget()); Collection constraintTraits = getConstraintTraits(member); writer.openBlock("case $S: {", "}", getSanitizedMemberName(member), () -> { writer.writeInline("$L[$S] = ", cacheName, getSanitizedMemberName(member)); if (member.getMemberTrait(model, SensitiveTrait.class).isPresent()) { writeSensitiveWrappedMemberValidator(writer, targetShape, constraintTraits); } else { writeMemberValidator(writer, targetShape, constraintTraits, ";"); } writer.write("break;"); }); } }); }); writer.write("return $L[member]!!;", cacheName); } ); } /** * Writes the validate method contents. * * @param writer the writer, positioned within the validate method * @param param the parameter name of the object being validated */ void writeValidateMethodContents(TypeScriptWriter writer, String param) { writer.openBlock("return [", "];", () -> { for (MemberShape member : members) { String optionalSuffix = ""; if ( member.getMemberTrait(model, MediaTypeTrait.class).isPresent() && model.expectShape(member.getTarget()) instanceof StringShape ) { // lazy JSON wrapper validation should be done based on the serialized form of // the object optionalSuffix = "?.toString()"; } Shape memberTarget = model.expectShape(member.getTarget()); if (memberTarget.isUnionShape() && memberTarget.hasTrait(StreamingTrait.class)) { // todo: validating event streams in unsupported. writer.write("// unsupported event stream validation"); writer.write( "// ...getMemberValidator($1S).validate($2L.$1L$4L, `$${path}/$3L`),", getSanitizedMemberName(member), param, member.getMemberName(), optionalSuffix ); } else { writer.write( "...getMemberValidator($1S).validate($2L.$1L$4L, `$${path}/$3L`),", getSanitizedMemberName(member), param, member.getMemberName(), optionalSuffix ); } } }); } /** * Writes a SensitiveConstraintValidator enclosing the shape validator for a * sensitive member. */ private void writeSensitiveWrappedMemberValidator( TypeScriptWriter writer, Shape targetShape, Collection constraintTraits ) { writer.addImport( "SensitiveConstraintValidator", "__SensitiveConstraintValidator", TypeScriptDependency.SERVER_COMMON ); writer.writeInline("new __SensitiveConstraintValidator<"); writeConstraintValidatorType(writer, targetShape); writer.openBlock(">(", ");", () -> writeMemberValidator(writer, targetShape, constraintTraits, "")); } /** * Writes the validator for the member of a structure or union. * * @param writer the writer * @param shape the shape targeted by the member * @param constraintTraits the traits applied to the targeted shape and the * member * @param trailer what to append to the output (such as a comma or * semicolon) */ private void writeMemberValidator( TypeScriptWriter writer, Shape shape, Collection constraintTraits, String trailer ) { if (shape instanceof SimpleShape) { writeShapeValidator(writer, shape, constraintTraits, trailer); return; } boolean sparse = shape.hasTrait(SparseTrait.ID); if (shape.isStructureShape() || shape.isUnionShape()) { writer.addImport( "CompositeStructureValidator", "__CompositeStructureValidator", TypeScriptDependency.SERVER_COMMON ); writer.openBlock( "new __CompositeStructureValidator<$T>(", ")" + trailer, getValidatorValueType(shape), () -> { writeShapeValidator(writer, shape, constraintTraits, ","); if (!shape.hasTrait(ErrorTrait.class)) { writer.write("$T.validate", symbolProvider.toSymbol(shape)); } else { // todo: unsupported // Error classes have no static validator. writer.write( """ () => [/*Error validator unsupported*/]""" ); } } ); } else if (shape.isListShape() || shape.isSetShape()) { writer.addImport( "CompositeCollectionValidator", "__CompositeCollectionValidator", TypeScriptDependency.SERVER_COMMON ); MemberShape collectionMemberShape = ((CollectionShape) shape).getMember(); Shape collectionMemberTargetShape = model.expectShape(collectionMemberShape.getTarget()); writer.openBlock( "new __CompositeCollectionValidator<$T" + (sparse ? " | null>(" : ">("), ")" + trailer, getValidatorValueType(shape), () -> { writeShapeValidator(writer, shape, constraintTraits, ","); writeMemberValidator( writer, collectionMemberTargetShape, getConstraintTraits(collectionMemberShape), "" ); } ); } else if (shape.isMapShape()) { writer.addImport("CompositeMapValidator", "__CompositeMapValidator", TypeScriptDependency.SERVER_COMMON); MapShape mapShape = (MapShape) shape; final MemberShape keyShape = mapShape.getKey(); final MemberShape valueShape = mapShape.getValue(); writer.openBlock( "new __CompositeMapValidator<$T" + (sparse ? " | null>(" : ">("), ")" + trailer, getValidatorValueType(shape), () -> { writeShapeValidator(writer, mapShape, constraintTraits, ","); writeMemberValidator( writer, model.expectShape(keyShape.getTarget()), getConstraintTraits(keyShape), "," ); writeMemberValidator( writer, model.expectShape(valueShape.getTarget()), getConstraintTraits(valueShape), "" ); } ); } else { throw new IllegalArgumentException( String.format("Unsupported shape found when generating validator: %s", shape) ); } } /** * Writes a validator for a shape, aggregating all of the constraints applied to * it. This shape could be a member * target, or the target of a shape (such as the member of a list or the value * of a map). * * @param writer the writer * @param shape the shape being validated * @param constraints the constraints relevant to this shape (includes member * traits for member targets) * @param trailer what to append to the output (for instance, a comma or * semicolon) */ private void writeShapeValidator( TypeScriptWriter writer, Shape shape, Collection constraints, String trailer ) { boolean shouldWriteIntEnumValidator = shape.isIntEnumShape(); if (constraints.isEmpty() && !shouldWriteIntEnumValidator) { writer.addImport("NoOpValidator", "__NoOpValidator", TypeScriptDependency.SERVER_COMMON); writer.write("new __NoOpValidator()" + trailer); return; } writer.addImport("CompositeValidator", "__CompositeValidator", TypeScriptDependency.SERVER_COMMON); writer.openBlock("new __CompositeValidator<$T>([", "])" + trailer, getSymbolForValidatedType(shape), () -> { if (shouldWriteIntEnumValidator) { writer.addImport("IntegerEnumValidator", "__IntegerEnumValidator", TypeScriptDependency.SERVER_COMMON); writer.openBlock("new __IntegerEnumValidator([", "]),", () -> { for (int i : ((IntEnumShape) shape).getEnumValues().values()) { writer.write("$L,", i); } }); } if (shape.isEnumShape()) { writer.addImport("EnumValidator", "__EnumValidator", TypeScriptDependency.SERVER_COMMON); Collection enumValues = shape.asEnumShape().get().getAllMembers().values(); writer.openBlock("new __EnumValidator([", "]),", () -> { for (MemberShape member : enumValues) { writer.write("$S,", member.expectTrait(EnumValueTrait.class).expectStringValue()); } writer.write("], ["); for (MemberShape member : shape.asEnumShape().get().getAllMembers().values()) { if (!member.hasTrait((InternalTrait.class))) { writer.write("$S,", member.expectTrait(EnumValueTrait.class).expectStringValue()); } } }); } for (Trait t : constraints) { writeSingleConstraintValidator(writer, t); } }); } /** * Writes a validator for one constraint of one member. */ private void writeSingleConstraintValidator(TypeScriptWriter writer, Trait trait) { if (trait instanceof RequiredTrait) { writer.addImport("RequiredValidator", "__RequiredValidator", TypeScriptDependency.SERVER_COMMON); writer.write("new __RequiredValidator(),"); } else if (trait instanceof EnumTrait && !trait.isSynthetic()) { writer.addImport("EnumValidator", "__EnumValidator", TypeScriptDependency.SERVER_COMMON); writer.openBlock("new __EnumValidator([", "]),", () -> { for (String e : ((EnumTrait) trait).getEnumDefinitionValues()) { writer.write("$S,", e); } writer.write("], ["); for (EnumDefinition enumDefinition : ((EnumTrait) trait).getValues()) { if (!enumDefinition.hasTag("internal")) { writer.write("$S, ", enumDefinition.getValue()); } } }); } else if (trait instanceof LengthTrait) { LengthTrait lengthTrait = (LengthTrait) trait; writer.addImport("LengthValidator", "__LengthValidator", TypeScriptDependency.SERVER_COMMON); writer.write( "new __LengthValidator($L, $L),", lengthTrait.getMin().map(Object::toString).orElse("undefined"), lengthTrait.getMax().map(Object::toString).orElse("undefined") ); } else if (trait instanceof PatternTrait) { writer.addImport("PatternValidator", "__PatternValidator", TypeScriptDependency.SERVER_COMMON); writer.write("new __PatternValidator($S),", ((PatternTrait) trait).getValue()); } else if (trait instanceof RangeTrait) { RangeTrait rangeTrait = (RangeTrait) trait; writer.addImport("RangeValidator", "__RangeValidator", TypeScriptDependency.SERVER_COMMON); writer.write( "new __RangeValidator($L, $L),", rangeTrait.getMin().map(Object::toString).orElse("undefined"), rangeTrait.getMax().map(Object::toString).orElse("undefined") ); } else if (trait instanceof UniqueItemsTrait) { writer.addImport("UniqueItemsValidator", "__UniqueItemsValidator", TypeScriptDependency.SERVER_COMMON); writer.write("new __UniqueItemsValidator(),"); } } /** * Writes the type that is being validated (the TS type corresponding to the * target shape) that is used as a * type arg for MultiConstraintValidator. */ private void writeConstraintValidatorType(TypeScriptWriter writer, Shape shape) { boolean sparse = shape.hasTrait(SparseTrait.ID); if (shape.isStructureShape() || shape.isUnionShape()) { writer.writeInline("$T", symbolProvider.toSymbol(shape)); } else if (shape.isListShape() || shape.isSetShape()) { MemberShape collectionMemberShape = ((CollectionShape) shape).getMember(); Shape collectionMemberTargetShape = model.expectShape(collectionMemberShape.getTarget()); writer.writeInline( "Iterable<$T" + (sparse ? " | null>" : ">"), getSymbolForValidatedType(collectionMemberTargetShape) ); } else if (shape.isMapShape()) { MapShape mapShape = shape.asMapShape().get(); String keyType = getSymbolForValidatedType(mapShape.getKey()).toString(); if (keyType.equals("string")) { writer.writeInline( "Record<$T, $T" + (sparse ? " | null>" : ">"), getSymbolForValidatedType(mapShape.getKey()), getSymbolForValidatedType(mapShape.getValue()) ); } else { writer.writeInline( "Partial>" : ">>"), getSymbolForValidatedType(mapShape.getKey()), getSymbolForValidatedType(mapShape.getValue()) ); } } else if (shape instanceof SimpleShape) { writer.writeInline("$T", getSymbolForValidatedType(shape)); } else { throw new IllegalArgumentException( String.format("Unsupported shape found when generating validator: %s", shape) ); } } /** * @return returns the value type for a validator. For maps, this is the type of * the value; for lists, this is * the member type. This type is loosened by * {@link #getSymbolForValidatedType(Shape)} */ private Symbol getValidatorValueType(Shape shape) { if (shape.isStructureShape() || shape.isUnionShape()) { return symbolProvider.toSymbol(shape); } else if (shape.isListShape() || shape.isSetShape()) { MemberShape collectionMemberShape = ((CollectionShape) shape).getMember(); Shape collectionMemberTargetShape = model.expectShape(collectionMemberShape.getTarget()); return getSymbolForValidatedType(collectionMemberTargetShape); } else if (shape.isMapShape()) { return getSymbolForValidatedType(((MapShape) shape).getValue()); } else if (shape instanceof SimpleShape) { return getSymbolForValidatedType(shape); } else { throw new IllegalArgumentException( String.format("Unsupported shape found when generating validator: %s", shape) ); } } /** * If we return the direct symbol for the validated type, then TypeScript will * not pass type checks when we pass * raw deserialized values into our validators. This is particularly problematic * for enums. * * @return a looser supertype of the modeled value type (generally, string * instead of a subtype of string) */ private Symbol getSymbolForValidatedType(Shape shape) { if (shape instanceof StringShape) { return symbolProvider.toSymbol(model.expectShape(ShapeId.from("smithy.api#String"))); } else if (shape instanceof IntEnumShape) { return symbolProvider.toSymbol(model.expectShape(ShapeId.from("smithy.api#Integer"))); } // Streaming blob inputs can also take string, Uint8Array and Buffer, so we // widen the symbol if (shape.isBlobShape() && shape.hasTrait(StreamingTrait.class)) { return symbolProvider .toSymbol(shape) .toBuilder() .addReference(Symbol.builder().name("Readable").namespace("stream", "/").build()) .name("Readable | ReadableStream | Blob | string | Uint8Array | Buffer") .build(); } return symbolProvider.toSymbol(shape); } private Collection getConstraintTraits(MemberShape member) { List traits = new ArrayList<>(); member.getTrait(RequiredTrait.class).ifPresent(traits::add); member.getMemberTrait(model, EnumTrait.class).ifPresent(traits::add); member.getMemberTrait(model, LengthTrait.class).ifPresent(traits::add); member.getMemberTrait(model, PatternTrait.class).ifPresent(traits::add); member.getMemberTrait(model, RangeTrait.class).ifPresent(traits::add); member.getMemberTrait(model, UniqueItemsTrait.class).ifPresent(traits::add); return traits; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/SymbolVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static java.lang.String.format; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.logging.Logger; import java.util.regex.Matcher; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.ReservedWordSymbolProvider; import software.amazon.smithy.codegen.core.ReservedWords; import software.amazon.smithy.codegen.core.ReservedWordsBuilder; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.ByteShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.EnumShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.model.shapes.IntegerShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.ShortShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.shapes.ToShapeId; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.UnitTypeTrait; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * This class is responsible for type mapping and file/identifier formatting. * *

Reserved words for TypeScript are automatically escaped so that they are * prefixed with "_". See "reserved-words.txt" for the list of words. */ @SmithyInternalApi final class SymbolVisitor implements SymbolProvider, ShapeVisitor { static final String IMPLEMENTS_INTERFACE_PROPERTY = "implementsInterface"; private static final Logger LOGGER = Logger.getLogger(SymbolVisitor.class.getName()); private final Model model; private final TypeScriptSettings settings; private final ReservedWordSymbolProvider.Escaper escaper; private final Set errorShapes = new HashSet<>(); private final ModuleNameDelegator moduleNameDelegator; private final boolean createTypeOnlySymbols; SymbolVisitor(Model model, TypeScriptSettings settings) { this(model, settings, ModuleNameDelegator.DEFAULT_CHUNK_SIZE); } SymbolVisitor(Model model, TypeScriptSettings settings, int shapeChunkSize) { this.model = model; this.settings = settings; createTypeOnlySymbols = settings.generateClient(); // Load reserved words from a new-line delimited file. ReservedWords reservedWords = new ReservedWordsBuilder() .loadWords(TypeScriptCodegenPlugin.class.getResource("reserved-words.txt")) .build(); ReservedWords memberReservedWords = new ReservedWordsBuilder() .loadWords(TypeScriptCodegenPlugin.class.getResource("reserved-words-members.txt")) .build(); escaper = ReservedWordSymbolProvider.builder() .nameReservedWords(reservedWords) .memberReservedWords(memberReservedWords) // Only escape words when the symbol has a definition file to // prevent escaping intentional references to built-in types. .escapePredicate((shape, symbol) -> !StringUtils.isEmpty(symbol.getDefinitionFile())) .buildEscaper(); // Get each structure that's used an error. OperationIndex operationIndex = OperationIndex.of(model); model .shapes(OperationShape.class) .forEach(operationShape -> { errorShapes.addAll(operationIndex.getErrors(operationShape, settings.getService())); }); moduleNameDelegator = new ModuleNameDelegator(shapeChunkSize); } static TypeScriptWriter modelIndexer(Collection shapes, SymbolProvider symbolProvider) { return ModuleNameDelegator.modelIndexer(shapes, symbolProvider); } @Override public Symbol toSymbol(Shape shape) { boolean typeOnly = createTypeOnlySymbols; boolean isError = shape.asStructureShape().isPresent() && shape.hasTrait(ErrorTrait.class); if (shape.isOperationShape() || shape.isResourceShape() || isError || shape.isServiceShape()) { typeOnly = false; } Symbol symbol = shape.accept(this).toBuilder().putProperty("typeOnly", typeOnly).build(); LOGGER.fine(() -> "Creating symbol from " + shape + ": " + symbol); return escaper.escapeSymbol(shape, symbol); } @Override public String toMemberName(MemberShape shape) { return escaper.escapeMemberName(shape.getMemberName()); } @Override public Symbol blobShape(BlobShape shape) { if (shape.hasTrait(StreamingTrait.class)) { // Note: `Readable` needs an import and a dependency. return createSymbolBuilder(shape, "StreamingBlobTypes", null) .addReference( Symbol.builder() .addDependency(TypeScriptDependency.SMITHY_TYPES) .name("StreamingBlobTypes") .namespace("@smithy/types", "/") .putProperty("typeOnly", createTypeOnlySymbols) .build() ) .build(); } return createSymbolBuilder(shape, "Uint8Array").build(); } @Override public Symbol booleanShape(BooleanShape shape) { return createSymbolBuilder(shape, "boolean").build(); } @Override public Symbol listShape(ListShape shape) { boolean sparse = shape.hasTrait(SparseTrait.ID); Symbol reference = toSymbol(shape.getMember()); String valueType = (sparse ? "(" : "") + reference.getName() + (sparse ? " | null)" : ""); return createSymbolBuilder(shape, format("%s[]", valueType), null) .addReference(reference) .putProperty("typeOnly", createTypeOnlySymbols) .build(); } @Override public Symbol setShape(SetShape shape) { Symbol reference = toSymbol(shape.getMember()); return createSymbolBuilder(shape, format("%s[]", reference.getName()), null) .addReference(reference) .putProperty("typeOnly", createTypeOnlySymbols) .build(); } /** * Maps get generated as an inline interface with a fixed value type. * *

For example: * *

{@code
     * interface MyStructureShape {
     *   memberPointingToMap: Record;
     * }
     * }
* * @inheritDoc */ @Override public Symbol mapShape(MapShape shape) { Symbol key = toSymbol(shape.getKey()); Symbol value = toSymbol(shape.getValue()); boolean stringKey = key.toString().equals("string"); boolean sparse = shape.hasTrait(SparseTrait.ID); String valueType = value.getName() + (sparse ? " | null" : ""); return createSymbolBuilder( shape, format(stringKey ? "Record<%s, %s>" : "Partial>", key.getName(), valueType), null ) .addReference(key) .addReference(value) .putProperty("typeOnly", createTypeOnlySymbols) .build(); } @Override public Symbol byteShape(ByteShape shape) { return createNumber(shape); } @Override public Symbol shortShape(ShortShape shape) { return createNumber(shape); } @Override public Symbol integerShape(IntegerShape shape) { return createNumber(shape); } @Override public Symbol longShape(LongShape shape) { return createNumber(shape); } @Override public Symbol floatShape(FloatShape shape) { return createNumber(shape); } @Override public Symbol doubleShape(DoubleShape shape) { return createNumber(shape); } private Symbol createNumber(Shape shape) { return createSymbolBuilder(shape, "number").build(); } @Override public Symbol bigIntegerShape(BigIntegerShape shape) { if ("native".equals(settings.getBigNumberMode())) { return createSymbolBuilder(shape, "bigint").build(); } return createBigJsSymbol(shape); } @Override public Symbol bigDecimalShape(BigDecimalShape shape) { if ("native".equals(settings.getBigNumberMode())) { return createSymbolBuilder(shape, "NumericValue", null) .addReference( Symbol.builder() .addDependency(TypeScriptDependency.SMITHY_CORE) .name("NumericValue") .putProperty("typeOnly", createTypeOnlySymbols) .namespace("@smithy/core/serde", "/") .build() ) .build(); } return createBigJsSymbol(shape); } private Symbol createBigJsSymbol(Shape shape) { return createSymbolBuilder(shape, "Big", TypeScriptDependency.BIG_JS.packageName) .addDependency(TypeScriptDependency.TYPES_BIG_JS) .addDependency(TypeScriptDependency.BIG_JS) .build(); } @Override public Symbol documentShape(DocumentShape shape) { Symbol.Builder builder = createSymbolBuilder(shape, "__DocumentType"); Symbol importSymbol = Symbol.builder() .name("DocumentType") .namespace(TypeScriptDependency.SMITHY_TYPES.packageName, "/") .putProperty("typeOnly", createTypeOnlySymbols) .build(); SymbolReference reference = SymbolReference.builder() .symbol(importSymbol) .alias("__DocumentType") .options(SymbolReference.ContextOption.USE) .putProperty("typeOnly", createTypeOnlySymbols) .build(); return builder.addReference(reference).build(); } @Override public Symbol operationShape(OperationShape shape) { String commandName = flattenShapeName(shape) + "Command"; String moduleName = moduleNameDelegator.formatModuleName(shape, commandName); Symbol intermediate = createGeneratedSymbolBuilder(shape, commandName, moduleName).build(); Symbol.Builder builder = intermediate.toBuilder().putProperty("typeOnly", false); // Add input and output type symbols (XCommandInput / XCommandOutput). builder.putProperty( "inputType", intermediate.toBuilder().putProperty("typeOnly", createTypeOnlySymbols).name(commandName + "Input").build() ); builder.putProperty( "outputType", intermediate.toBuilder().putProperty("typeOnly", createTypeOnlySymbols).name(commandName + "Output").build() ); return builder.build(); } @Override public Symbol stringShape(StringShape shape) { // Enums that provide a name for each variant create an actual enum type. Optional enumTrait = shape.getTrait(EnumTrait.class); if (enumTrait.isPresent()) { return createEnumSymbol(shape, enumTrait.get()); } // Handle media type generation, defaulting to a string. Optional mediaTypeTrait = shape.getTrait(MediaTypeTrait.class); if (mediaTypeTrait.isPresent()) { String mediaType = mediaTypeTrait.get().getValue(); if (CodegenUtils.isJsonMediaType(mediaType)) { Symbol.Builder builder = createSymbolBuilder(shape, "__AutomaticJsonStringConversion | string"); return addSmithyUseImport( builder, "AutomaticJsonStringConversion", "__AutomaticJsonStringConversion" ).build(); } else { LOGGER.warning(() -> "Found unsupported mediatype " + mediaType + " on String shape: " + shape); } } return createSymbolBuilder(shape, "string").build(); } @Override public Symbol enumShape(EnumShape shape) { return stringShape(shape).toBuilder().putProperty("typeOnly", true).build(); } @Override public Symbol intEnumShape(IntEnumShape shape) { return createObjectSymbolBuilder(shape).putProperty("typeOnly", true).build(); } private Symbol createEnumSymbol(StringShape shape, EnumTrait enumTrait) { return createObjectSymbolBuilder(shape) .putProperty(EnumTrait.class.getName(), enumTrait) .putProperty("typeOnly", true) .build(); } @Override public Symbol resourceShape(ResourceShape shape) { return createObjectSymbolBuilder(shape).build(); } @Override public Symbol serviceShape(ServiceShape shape) { String name = StringUtils.capitalize(shape.getId().getName(shape)) + "Client"; String moduleName = moduleNameDelegator.formatModuleName(shape, name); return createGeneratedSymbolBuilder(shape, name, moduleName).putProperty("typeOnly", false).build(); } @Override public Symbol structureShape(StructureShape shape) { return createObjectSymbolBuilder(shape).build(); } private Symbol.Builder addSmithyUseImport(Symbol.Builder builder, String name, String as) { Symbol importSymbol = Symbol.builder().name(name).namespace("@smithy/core/serde", "/").build(); SymbolReference reference = SymbolReference.builder() .symbol(importSymbol) .alias(as) .options(SymbolReference.ContextOption.USE) .build(); return builder.addReference(reference); } @Override public Symbol unionShape(UnionShape shape) { return createObjectSymbolBuilder(shape).build(); } @Override public Symbol memberShape(MemberShape shape) { Shape targetShape = model .getShape(shape.getTarget()) .orElseThrow(() -> new CodegenException("Shape not found: " + shape.getTarget())); Symbol targetSymbol = toSymbol(targetShape); if (targetSymbol.getProperties().containsKey(EnumTrait.class.getName()) || targetShape.isIntEnumShape()) { return createMemberSymbolWithEnumTarget(targetSymbol); } // While unions are targeted with the streaming trait to make them event streams, // we don't want to generate a unique type for event streams but instead make // member references to them AsyncIterable of the union we generate. if (targetShape.hasTrait(StreamingTrait.class) && targetShape.isUnionShape()) { return createMemberSymbolWithEventStream(targetSymbol); } return targetSymbol; } // Enums were considered "open" with the union `| string` or `| number`, meaning it was a backwards // compatible change to add new members. This behavior was later removed to improve the helpfulness // of closed enumerated union types. // For overrides, users should use available type system overrides such as "as any" or // pragma comments. private Symbol createMemberSymbolWithEnumTarget(Symbol targetSymbol) { return targetSymbol .toBuilder() .namespace(null, "/") .name(targetSymbol.getName()) .addReference(targetSymbol) .build(); } private Symbol createMemberSymbolWithEventStream(Symbol targetSymbol) { return targetSymbol .toBuilder() .putProperty("typeOnly", createTypeOnlySymbols) .namespace(null, "/") .name(String.format("AsyncIterable<%s>", targetSymbol.getName())) .addReference(targetSymbol) .build(); } @Override public Symbol timestampShape(TimestampShape shape) { return createSymbolBuilder(shape, "Date").build(); } private String flattenShapeName(ToShapeId id) { ServiceShape serviceShape = model.expectShape(settings.getService(), ServiceShape.class); return StringUtils.capitalize(id.toShapeId().getName(serviceShape)); } private Symbol.Builder createObjectSymbolBuilder(Shape shape) { String name = flattenShapeName(shape); String moduleName = moduleNameDelegator.formatModuleName(shape, name); return createGeneratedSymbolBuilder(shape, name, moduleName); } private Symbol.Builder createSymbolBuilder(Shape shape, String typeName) { return Symbol.builder().putProperty("shape", shape).name(typeName); } private Symbol.Builder createSymbolBuilder(Shape shape, String typeName, String namespace) { return Symbol.builder().putProperty("shape", shape).name(typeName).namespace(namespace, "/"); } private Symbol.Builder createGeneratedSymbolBuilder(Shape shape, String typeName, String namespace) { String trimmedNamespace = namespace.startsWith("./") ? namespace.substring(2) : namespace; String prefixedNamespace = String.join("/", ".", CodegenUtils.SOURCE_FOLDER, trimmedNamespace); return createSymbolBuilder(shape, typeName, prefixedNamespace).definitionFile(toFilename(prefixedNamespace)); } private String toFilename(String namespace) { return namespace + ".ts"; } /** * Utility class to locate which path should the symbol be generated into. * It will break the models into multiple files to prevent it getting too big. */ static final class ModuleNameDelegator { static final int DEFAULT_CHUNK_SIZE = 300; static final String SHAPE_NAMESPACE_PREFIX = "models"; private final Map visitedModels = new HashMap<>(); private int bucketCount = 0; private int currentBucketSize = 0; private final int chunkSize; ModuleNameDelegator(int shapeChunkSize) { chunkSize = shapeChunkSize; } public String formatModuleName(Shape shape, String name) { // All shapes except for the service and operations are stored in models. if (shape.getType() == ShapeType.SERVICE) { return String.join("/", ".", name); } else if (shape.getType() == ShapeType.OPERATION) { return String.join("/", ".", CommandGenerator.COMMANDS_FOLDER, name); } else if (visitedModels.containsKey(shape)) { return visitedModels.get(shape); } String path; if (shape.isEnumShape() || shape.isIntEnumShape() || shape.hasTrait(EnumTrait.class)) { path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "enums"); } else if (shape.isStructureShape() && shape.hasTrait(ErrorTrait.class)) { path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "errors"); } else if (shape.getId().equals(UnitTypeTrait.UNIT) || shape.isResourceShape()) { // Unit or Resource shapes should only be put in the zero bucket, since they do not // generate anything. They also do not contribute to bucket size. path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "models_0"); } else { path = String.join("/", ".", SHAPE_NAMESPACE_PREFIX, "models_" + bucketCount); currentBucketSize++; if (currentBucketSize == chunkSize) { bucketCount++; currentBucketSize = 0; } } visitedModels.put(shape, path); return path; } static TypeScriptWriter modelIndexer(Collection shapes, SymbolProvider symbolProvider) { TypeScriptWriter writer = new TypeScriptWriter(""); String modelPrefix = String.join("/", ".", CodegenUtils.SOURCE_FOLDER, SHAPE_NAMESPACE_PREFIX); List collectedModelNamespaces = shapes .stream() .map(shape -> symbolProvider.toSymbol(shape).getNamespace()) .filter(namespace -> namespace.startsWith(modelPrefix)) .distinct() .sorted(Comparator.naturalOrder()) .map( namespace -> namespace.replaceFirst( Matcher.quoteReplacement(modelPrefix), String.join("/", ".", SHAPE_NAMESPACE_PREFIX) ) ) .toList(); // Export empty model index if no other files are present. if (collectedModelNamespaces.isEmpty()) { writer.write("export {};"); } else { for (String namespace : collectedModelNamespaces) { boolean typesOnly = namespace.contains("models_"); if (!typesOnly) { writer.write("export * from $S;", namespace); } } } // export types by name only Map> namespaceToShapes = new TreeMap<>(); for (Shape shape : shapes) { if (shape.isStructureShape() && !shape.hasTrait(ErrorTrait.class)) { Symbol symbol = symbolProvider.toSymbol(shape); String namespace = symbol .getNamespace() .replaceFirst( Matcher.quoteReplacement(String.join("/", ".", CodegenUtils.SOURCE_FOLDER)), "." ); namespaceToShapes.computeIfAbsent(namespace, k -> new TreeSet<>()); namespaceToShapes.get(namespace).add(symbol.getName()); } } for (Map.Entry> entry : namespaceToShapes.entrySet()) { String namespace = entry.getKey(); // server models have runtime components and should therefore be // exported as is, rather than types-only. writer.write( """ export * from $S;""", namespace ); } return writer; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptClientCodegenPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; import java.util.logging.Logger; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.build.SmithyBuildPlugin; import software.amazon.smithy.codegen.core.directed.CodegenDirector; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; /** * Plugin to trigger TypeScript client code generation. */ @SmithyInternalApi public class TypeScriptClientCodegenPlugin implements SmithyBuildPlugin { private static final Logger LOGGER = Logger.getLogger(TypeScriptClientCodegenPlugin.class.getName()); @Override public String getName() { return "typescript-client-codegen"; } @Override public void execute(PluginContext context) { CodegenDirector runner = new CodegenDirector<>(); runner.directedCodegen(new DirectedTypeScriptCodegen()); // Set the SmithyIntegration class to look for and apply using SPI. runner.integrationClass(TypeScriptIntegration.class); // Set the FileManifest and Model from the plugin. runner.fileManifest(context.getFileManifest()); runner.model(context.getModel()); // Create the TypeScriptSettings object from the plugin settings. TypeScriptSettings settings = TypeScriptSettings.from( context.getModel(), context.getSettings(), TypeScriptSettings.ArtifactType.CLIENT ); runner.settings(settings); // Only add integrations if the integrations match the settings // This uses {@link TypeScriptIntegration#matchesSettings}, which is a // Smithy internal API. This may be removed at any point. runner.integrationFinder( () -> () -> ServiceLoader.load(TypeScriptIntegration.class, CodegenDirector.class.getClassLoader()) .stream() .map(Provider::get) .filter(integration -> { boolean matchesSettings = integration.matchesSettings(settings); if (!matchesSettings) { LOGGER.fine( () -> "Skipping TypeScript integration based on settings: " + integration.name() ); } return matchesSettings; }) .iterator() ); runner.service(settings.getService()); // Configure the director to perform some common model transforms. runner.performDefaultCodegenTransforms(); // TODO: Not using below because it would break existing AWS SDKs. Maybe it should be configurable // so generic SDKs call this by default, but AWS SDKs can opt-out of it via a setting. // runner.createDedicatedInputsAndOutputs(); // Run it! runner.run(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptCodegenContext.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ArrayList; import java.util.List; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.CodegenContext; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Holds context related to code generation. */ @SmithyUnstableApi public final class TypeScriptCodegenContext implements CodegenContext { private final Model model; private final TypeScriptSettings settings; private final SymbolProvider symbolProvider; private final FileManifest fileManifest; private final TypeScriptDelegator writerDelegator; private final List integrations; private final List runtimePlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private TypeScriptCodegenContext(Builder builder) { model = SmithyBuilder.requiredState("model", builder.model); settings = SmithyBuilder.requiredState("settings", builder.settings); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); fileManifest = SmithyBuilder.requiredState("fileManifest", builder.fileManifest); writerDelegator = SmithyBuilder.requiredState("writerDelegator", builder.writerDelegator); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); runtimePlugins = SmithyBuilder.requiredState("runtimePlugins", builder.runtimePlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } @Override public Model model() { return model; } @Override public TypeScriptSettings settings() { return settings; } @Override public SymbolProvider symbolProvider() { return symbolProvider; } @Override public FileManifest fileManifest() { return fileManifest; } @Override public TypeScriptDelegator writerDelegator() { return writerDelegator; } @Override public List integrations() { return integrations; } public List runtimePlugins() { return runtimePlugins; } public ProtocolGenerator protocolGenerator() { return protocolGenerator; } public ApplicationProtocol applicationProtocol() { return applicationProtocol; } /** * @return Returns a builder. */ public static Builder builder() { return new Builder(); } /** * Builds {@link TypeScriptCodegenContext}s. */ public static final class Builder implements SmithyBuilder { private Model model; private TypeScriptSettings settings; private SymbolProvider symbolProvider; private FileManifest fileManifest; private TypeScriptDelegator writerDelegator; private List integrations = new ArrayList<>(); private List runtimePlugins = new ArrayList<>(); private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public TypeScriptCodegenContext build() { return new TypeScriptCodegenContext(this); } /** * @param model The model being generated. * @return Returns the builder. */ public Builder model(Model model) { this.model = model; return this; } /** * @param settings The resolved settings for the generator. * @return Returns the builder. */ public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } /** * @param symbolProvider The finalized symbol provider for the generator. * @return Returns the builder. */ public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } /** * @param fileManifest The file manifest being used in the generator. * @return Returns the builder. */ public Builder fileManifest(FileManifest fileManifest) { this.fileManifest = fileManifest; return this; } /** * @param writerDelegator The writer delegator to use in the generator. * @return Returns the builder. */ public Builder writerDelegator(TypeScriptDelegator writerDelegator) { this.writerDelegator = writerDelegator; return this; } /** * @param integrations The integrations to use in the generator. * @return Returns the builder. */ public Builder integrations(List integrations) { this.integrations.clear(); this.integrations.addAll(integrations); return this; } /** * @param runtimePlugins The runtime plugins to use in the generator. * @return Returns the builder. */ public Builder runtimePlugins(List runtimePlugins) { this.runtimePlugins.clear(); this.runtimePlugins.addAll(runtimePlugins); return this; } /** * @param protocolGenerator The protocol generator to use in the generator. * @return Returns the builder. */ public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } /** * @param applicationProtocol The application protocol to use in the generator. * @return Returns the builder. */ public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptCodegenPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.utils.SmithyInternalApi; /** * Plugin to trigger TypeScript code generation. * @deprecated Use {@link TypeScriptClientCodegenPlugin} instead. */ @SmithyInternalApi @Deprecated public final class TypeScriptCodegenPlugin extends TypeScriptClientCodegenPlugin { @Override public String getName() { return "typescript-codegen"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDelegator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ArrayList; import java.util.List; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.WriterDelegator; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class TypeScriptDelegator extends WriterDelegator { TypeScriptDelegator(FileManifest fileManifest, SymbolProvider symbolProvider) { super(fileManifest, symbolProvider, new TypeScriptWriter.TypeScriptWriterFactory()); } /** * Gets all of the dependencies that have been registered in writers owned by the delegator, along with any * unconditional dependencies. * * @return Returns all the dependencies. */ @Override public List getDependencies() { // Always add unconditional dependencies. List resolved = new ArrayList<>(TypeScriptDependency.getUnconditionalDependencies()); resolved.addAll(super.getDependencies()); return resolved; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Logger; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.utils.SmithyUnstableApi; /** * An enum of all of the built-in dependencies managed by this package. */ @SmithyUnstableApi public enum TypeScriptDependency implements Dependency { SMITHY_TYPES("dependencies", "@smithy/types", true), SMITHY_CORE("dependencies", "@smithy/core", false), AWS_CRYPTO_SHA256_BROWSER("dependencies", "@aws-crypto/sha256-browser", "5.2.0", true), AWS_CRYPTO_SHA256_JS("dependencies", "@aws-crypto/sha256-js", "5.2.0", true), AWS_SDK_CLIENT_DOCGEN("devDependencies", "@smithy/service-client-documentation-generator", false), AWS_SDK_FETCH_HTTP_HANDLER("dependencies", "@smithy/fetch-http-handler", false), AWS_SDK_NODE_HTTP_HANDLER("dependencies", "@smithy/node-http-handler", false), BIG_JS("dependencies", "big.js", "^6.0.0", false), BODY_CHECKSUM("dependencies", "@smithy/middleware-apply-body-checksum", false), HTML_ENTITIES("dependencies", "entities", "2.2.0", false), MIDDLEWARE_COMPRESSION("dependencies", "@smithy/middleware-compression", false), SIGNATURE_V4("dependencies", "@smithy/signature-v4", false), TYPES_BIG_JS("devDependencies", "@types/big.js", "^6.0.0", false), TYPES_NODE("devDependencies", "@types/node", "^20.14.8", true), XML_PARSER("dependencies", "fast-xml-parser", "5.7.1", false), // todo: core/endpoints @Deprecated MIDDLEWARE_ENDPOINTS_V2("dependencies", "@smithy/middleware-endpoint", "0.0.0", false), @Deprecated UTIL_ENDPOINTS("dependencies", "@smithy/util-endpoints", "0.0.0", false), // todo: core/retry @Deprecated MIDDLEWARE_RETRY("dependencies", "@smithy/middleware-retry", "0.0.0", false), @Deprecated UTIL_RETRY("dependencies", "@smithy/util-retry", "0.0.0", false), // devtools @Deprecated EXPERIMENTAL_IDENTITY_AND_AUTH("dependencies", "@smithy/experimental-identity-and-auth", false), SERVER_COMMON("dependencies", "@aws-smithy/server-common", false), SNAPSHOTS("devDependencies", "@smithy/snapshot-testing", false), TYPEDOC("devDependencies", "typedoc", "0.23.23", false), VITEST("devDependencies", "vitest", "^4.0.17", false), // Deprecated: consolidated into @smithy/core submodules. // Retained for backward compatibility with downstream codegen. @Deprecated AWS_SDK_HASH_NODE("dependencies", "@smithy/hash-node", "0.0.0", false), @Deprecated AWS_SDK_QUERYSTRING_BUILDER("dependencies", "@smithy/querystring-builder", "0.0.0", false), @Deprecated AWS_SDK_TYPES("dependencies", "@aws-sdk/types", "0.0.0", false), @Deprecated AWS_SDK_URL_PARSER("dependencies", "@smithy/url-parser", "0.0.0", false), @Deprecated AWS_SDK_UTIL_BODY_LENGTH_BROWSER("dependencies", "@smithy/util-body-length-browser", "0.0.0", false), @Deprecated AWS_SDK_UTIL_BODY_LENGTH_NODE("dependencies", "@smithy/util-body-length-node", "0.0.0", false), @Deprecated AWS_SDK_UTIL_DEFAULTS_MODE_BROWSER("dependencies", "@smithy/util-defaults-mode-browser", "0.0.0", false), @Deprecated AWS_SDK_UTIL_DEFAULTS_MODE_NODE("dependencies", "@smithy/util-defaults-mode-node", "0.0.0", false), @Deprecated AWS_SDK_UTIL_ENDPOINTS("dependencies", "@aws-sdk/util-endpoints", "0.0.0", false), @Deprecated AWS_SDK_UTIL_MIDDLEWARE("dependencies", "@smithy/util-middleware", "0.0.0", false), @Deprecated AWS_SDK_UTIL_WAITERS("dependencies", "@smithy/util-waiter", "0.0.0", false), @Deprecated AWS_SMITHY_CLIENT("dependencies", "@smithy/smithy-client", "0.0.0", false), @Deprecated CONFIG_RESOLVER("dependencies", "@smithy/config-resolver", "0.0.0", false), @Deprecated INVALID_DEPENDENCY("dependencies", "@smithy/invalid-dependency", "0.0.0", false), @Deprecated MD5_BROWSER("dependencies", "@smithy/md5-js", "0.0.0", false), @Deprecated MIDDLEWARE_CONTENT_LENGTH("dependencies", "@smithy/middleware-content-length", "0.0.0", false), @Deprecated MIDDLEWARE_SERDE("dependencies", "@smithy/middleware-serde", "0.0.0", false), @Deprecated MIDDLEWARE_STACK("dependencies", "@smithy/middleware-stack", "0.0.0", false), @Deprecated NODE_CONFIG_PROVIDER("dependencies", "@smithy/node-config-provider", "0.0.0", false), @Deprecated PROTOCOL_HTTP("dependencies", "@smithy/protocol-http", "0.0.0", false), @Deprecated SMITHY_UUID("dependencies", "@smithy/uuid", "0.0.0", false), @Deprecated STREAM_HASHER_BROWSER("dependencies", "@smithy/hash-blob-browser", "0.0.0", false), @Deprecated STREAM_HASHER_NODE("dependencies", "@smithy/hash-stream-node", "0.0.0", false), @Deprecated UTIL_MIDDLEWARE("dependencies", "@smithy/util-middleware", "0.0.0", false), @Deprecated UTIL_STREAM("dependencies", "@smithy/util-stream", "0.0.0", false), @Deprecated UTIL_STREAM_BROWSER("dependencies", "@smithy/util-stream-browser", "0.0.0", false), @Deprecated UTIL_STREAM_NODE("dependencies", "@smithy/util-stream-node", "0.0.0", false), @Deprecated UUID("dependencies", "uuid", "0.0.0", false), @Deprecated UUID_TYPES("dependencies", "@types/uuid", "0.0.0", false), @Deprecated AWS_SDK_EVENTSTREAM_CODEC("dependencies", "@smithy/eventstream-codec", "0.0.0", false), @Deprecated AWS_SDK_EVENTSTREAM_SERDE_BROWSER("dependencies", "@smithy/eventstream-serde-browser", "0.0.0", false), @Deprecated AWS_SDK_EVENTSTREAM_SERDE_CONFIG_RESOLVER( "dependencies", "@smithy/eventstream-serde-config-resolver", "0.0.0", false ), @Deprecated AWS_SDK_EVENTSTREAM_SERDE_NODE("dependencies", "@smithy/eventstream-serde-node", "0.0.0", false); public static final String NORMAL_DEPENDENCY = "dependencies"; public static final String DEV_DEPENDENCY = "devDependencies"; public static final String PEER_DEPENDENCY = "peerDependencies"; public static final String BUNDLED_DEPENDENCY = "bundledDependencies"; public static final String OPTIONAL_DEPENDENCY = "optionalDependencies"; public final String packageName; public final String version; public final SymbolDependency dependency; TypeScriptDependency(String type, String name, boolean unconditional) { String version; if (name.startsWith("@aws-sdk/")) { version = SdkVersion.getVersion(name); } else { version = DependencyVersion.getVersion(name); } if (version == null) { version = "latest"; } if (name.startsWith("@smithy/") || name.startsWith("@aws-sdk/")) { if (!version.startsWith("^") && version.matches("^\\d+\\.\\d+\\.\\d+$")) { version = "^" + version; } } this.dependency = SymbolDependency.builder() .dependencyType(type) .packageName(name) .version(version) .putProperty("unconditional", unconditional) .build(); this.packageName = name; this.version = version; } TypeScriptDependency(String type, String name, String version, boolean unconditional) { this.dependency = SymbolDependency.builder() .dependencyType(type) .packageName(name) .version(version) .putProperty("unconditional", unconditional) .build(); this.packageName = name; this.version = version; } /** * Get all dependencies that are always added to the generated * package.json file. * * @return Returns all of the unconditional dependencies. */ public static List getUnconditionalDependencies() { List resolved = new ArrayList<>(); for (TypeScriptDependency dependency : TypeScriptDependency.values()) { if (dependency.isUnconditional()) { resolved.add(dependency.dependency); } } return resolved; } /** * @return the smithy core version, used in @smithy/core versioning scheme. */ public static String getSmithyCoreVersion() { return DependencyVersion.VERSIONS.get("@smithy/core"); } /** * Note: if AWS SDK codegen is not loaded, then this will not work correctly. * * @return the leading AWS SDK client version, used in @aws-sdk/ckient versioning scheme. */ public static String getAwsSdkLeadingClientVersion() { return SdkVersion.getLeadingAwsSdkClientVersion(); } @Override public List getDependencies() { return Collections.singletonList(dependency); } @Override public String getPackageName() { return this.packageName; } /** * Creates a Symbol from the dependency of the enum, using the package * name and version of the dependency and the provided {@code name}. * *

The created Symbol will have a dependency on the enum's * dependency. * * @param name Name to attach to the symbol. * @return Returns the created Symbol. */ public Symbol createSymbol(String name) { return Symbol.builder() .namespace(dependency.getPackageName(), "/") .name(name) .addDependency(dependency) .build(); } private boolean isUnconditional() { return dependency.expectProperty("unconditional", Boolean.class); } /** * Reads the versions of AWS-published libraries from smithy-aws-typescript-codegen, if it's available * on the classpath. */ private static final class SdkVersion { private static final Logger LOGGER = Logger.getLogger(SdkVersion.class.getName()); private static final String PROPERTIES_PATH = "/software/amazon/smithy/aws/typescript/codegen/sdkVersions.properties"; private static final Map VERSIONS; static { Map tmpVersions; try { URL versionsUrl = SdkVersion.class.getResource(PROPERTIES_PATH); if (versionsUrl == null) { throw new IOException(); } Properties p = new Properties(); try ( Reader r = new BufferedReader( new InputStreamReader(versionsUrl.openStream(), StandardCharsets.UTF_8) ) ) { p.load(r); } final Map versions = new HashMap<>(p.size()); p.forEach((k, v) -> { if (versions.put(k.toString(), v.toString()) != null) { throw new IllegalArgumentException(String.format("Multiple versions defined for %s", k)); } }); tmpVersions = Collections.unmodifiableMap(versions); } catch (IOException e) { LOGGER.fine( "Could not read AWS dependency versions from smithy-aws-typescript-codegen, " + "will use 'latest' for AWS dependencies" ); tmpVersions = Collections.emptyMap(); } VERSIONS = tmpVersions; } /** * @return highest client version in the sdkVersions.properties file. */ public static String getLeadingAwsSdkClientVersion() { int major = 0; int minor = 0; int patch = 0; for (Map.Entry entry : VERSIONS.entrySet()) { String packageName = entry.getKey(); String version = entry.getValue(); boolean isClient = packageName.startsWith("@aws-sdk/client-"); if (isClient) { boolean isSemverTrinumeric = version.matches("^\\d+\\.\\d+\\.\\d+$"); if (isSemverTrinumeric) { String[] semver = version.split("\\."); major = Math.max(Integer.parseInt(semver[0]), major); minor = Math.max(Integer.parseInt(semver[1]), minor); patch = Math.max(Integer.parseInt(semver[2]), patch); } } } return "%s.%s.%s".formatted(major, minor, patch); } private static String getVersion(String packageName) { return VERSIONS.getOrDefault(packageName, "latest"); } } /** * Reads the version of smithy-typescript published libraries. */ private static final class DependencyVersion { private static final Logger LOGGER = Logger.getLogger(DependencyVersion.class.getName()); private static final Map VERSIONS; static { Map tmpVersions; try { URL versionsUrl = DependencyVersion.class.getResource("dependencyVersions.properties"); if (versionsUrl == null) { throw new IOException(); } Properties p = new Properties(); try ( Reader r = new BufferedReader( new InputStreamReader(versionsUrl.openStream(), StandardCharsets.UTF_8) ) ) { p.load(r); } final Map versions = new HashMap<>(p.size()); p.forEach((k, v) -> { if (versions.put(k.toString(), v.toString()) != null) { throw new IllegalArgumentException(String.format("Multiple versions defined for %s", k)); } }); tmpVersions = Collections.unmodifiableMap(versions); } catch (IOException e) { LOGGER.warning("Could not read dependency versions from smithy-typescript-codegen"); tmpVersions = Collections.emptyMap(); } VERSIONS = tmpVersions; } private static String getVersion(String packageName) { return VERSIONS.get(packageName); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptJmesPathVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.jmespath.ExpressionVisitor; import software.amazon.smithy.jmespath.JmespathExpression; import software.amazon.smithy.jmespath.ast.AndExpression; import software.amazon.smithy.jmespath.ast.ComparatorExpression; import software.amazon.smithy.jmespath.ast.CurrentExpression; import software.amazon.smithy.jmespath.ast.ExpressionTypeExpression; import software.amazon.smithy.jmespath.ast.FieldExpression; import software.amazon.smithy.jmespath.ast.FilterProjectionExpression; import software.amazon.smithy.jmespath.ast.FlattenExpression; import software.amazon.smithy.jmespath.ast.FunctionExpression; import software.amazon.smithy.jmespath.ast.IndexExpression; import software.amazon.smithy.jmespath.ast.LiteralExpression; import software.amazon.smithy.jmespath.ast.MultiSelectHashExpression; import software.amazon.smithy.jmespath.ast.MultiSelectListExpression; import software.amazon.smithy.jmespath.ast.NotExpression; import software.amazon.smithy.jmespath.ast.ObjectProjectionExpression; import software.amazon.smithy.jmespath.ast.OrExpression; import software.amazon.smithy.jmespath.ast.ProjectionExpression; import software.amazon.smithy.jmespath.ast.SliceExpression; import software.amazon.smithy.jmespath.ast.Subexpression; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi class TypeScriptJmesPathVisitor implements ExpressionVisitor { // Execution context is the current "head" of the execution. This is scope on which the expression // is currently operating across. It is imperative that this is kept up to date on expression.accept and return. private String executionContext; private int scopeCount; private String accessor; private TypeScriptWriter writer; private JmespathExpression jmesExpression; TypeScriptJmesPathVisitor(TypeScriptWriter writer, String accessor, JmespathExpression expression) { this.writer = writer; this.accessor = accessor; executionContext = accessor; jmesExpression = expression; scopeCount = 0; } public void run() { writer.openBlock("const returnComparator = () => {", "}", () -> { executionContext = accessor; jmesExpression.accept(this); writer.write("return $L;", executionContext); }); executionContext = "returnComparator()"; } @Override public Void visitComparator(ComparatorExpression expression) { String executionContextInital = executionContext; String comparator = expression.getComparator().toString(); expression.getLeft().accept(this); String leftContext = executionContext; executionContext = executionContextInital; expression.getRight().accept(this); String rightContext = executionContext; executionContext = String.format("(%s %s %s)", leftContext, comparator, rightContext); return null; } @Override public Void visitCurrentNode(CurrentExpression expression) { // Fall through as visitCurrentNode is saying that there is a noop here. Execution context does not change. return null; } @Override public Void visitExpressionType(ExpressionTypeExpression expression) { throw new CodegenException("TypeScriptJmesPath visitor not implemented ExpressionTypeExpression"); } @Override public Void visitFlatten(FlattenExpression expression) { expression.getExpression().accept(this); String flatScope = makeNewScope("flat_"); writer.write("let $L: any[] = [].concat(...$L);", flatScope, executionContext); executionContext = flatScope; return null; } @Override public Void visitFunction(FunctionExpression expression) { ArrayList executionContexts = new ArrayList<>(); String orginalExecutionContext = this.executionContext; expression.arguments.forEach((JmespathExpression argExpression) -> { argExpression.accept(this); switch (expression.getName()) { case "length": executionContext = executionContext + ".length"; break; case "contains": executionContexts.add(executionContext); this.executionContext = orginalExecutionContext; break; default: throw new CodegenException( "TypeScriptJmesPath visitor has not implemented function: " + expression.getName() ); } }); if (expression.getName().equals("contains")) { executionContext = String.join(".includes(", executionContexts) + ")"; } return null; } @Override public Void visitField(FieldExpression expression) { executionContext += "."; executionContext += expression.getName(); return null; } @Override public Void visitIndex(IndexExpression expression) { if (expression.getIndex() >= 0) { executionContext += ("[" + expression.getIndex() + "]"); } else { executionContext += "[" + executionContext + ".length"; executionContext += " - " + Math.abs(expression.getIndex()) + "]"; } return null; } @Override public Void visitLiteral(LiteralExpression expression) { switch (expression.getType()) { case STRING: executionContext = "\"" + expression.getValue().toString() + "\""; break; case OBJECT: executionContext = serializeObject(expression.expectObjectValue()); break; case ARRAY: executionContext = serializeArray(expression.expectArrayValue()); break; default: // All other options are already valid js literials. // (BOOLEAN, ANY, NULL, NUMBER, EXPRESSION) executionContext = expression.getValue().toString(); break; } return null; } @Override public Void visitMultiSelectList(MultiSelectListExpression expression) { ArrayList evaluators = new ArrayList(); String executionContextInital = executionContext; expression .getExpressions() .forEach((JmespathExpression exp) -> { exp.accept(this); evaluators.add(executionContext); executionContext = executionContextInital; }); String resultScope = makeNewScope("result_"); writer.write("let $L = [];", resultScope); for (String evaluator : evaluators) { writer.write("$L.push($L);", resultScope, evaluator); } writer.write("$L = $L;", executionContext, resultScope); return null; } @Override public Void visitMultiSelectHash(MultiSelectHashExpression expression) { throw new CodegenException("TypeScriptJmesPath visitor not implemented MultiSelectHashExpression"); } @Override public Void visitAnd(AndExpression expression) { String initialContext = executionContext; expression.getLeft().accept(this); String leftContext = executionContext; executionContext = initialContext; expression.getRight().accept(this); String rightContext = executionContext; executionContext = String.format("(%s && %s)", leftContext, rightContext); return null; } @Override public Void visitOr(OrExpression expression) { String initialContext = executionContext; expression.getLeft().accept(this); String leftContext = executionContext; executionContext = initialContext; expression.getRight().accept(this); String rightContext = executionContext; executionContext = String.format( "((%s || %s) && (%s || %s)) ", leftContext, rightContext, rightContext, leftContext ); return null; } @Override public Void visitNot(NotExpression expression) { expression.getExpression().accept(this); executionContext = String.format("(!%s)", executionContext); return null; } @Override public Void visitObjectProjection(ObjectProjectionExpression expression) { expression.getLeft().accept(this); String element = makeNewScope("element_"); String result = makeNewScope("objectProjection_"); writer.openBlock( "let $L = Object.values($L).map(($L: any) => {", "});", result, executionContext, element, () -> { executionContext = element; expression.getRight().accept(this); writer.write("return $L;", executionContext); } ); executionContext = result; return null; } @Override public Void visitProjection(ProjectionExpression expression) { expression.getLeft().accept(this); if (!(expression.getRight() instanceof CurrentExpression)) { String element = makeNewScope("element_"); String result = makeNewScope("projection_"); writer.openBlock("let $L = $L.map(($L: any) => {", "});", result, executionContext, element, () -> { executionContext = element; expression.getRight().accept(this); writer.write("return $L;", executionContext); }); executionContext = result; } return null; } @Override public Void visitFilterProjection(FilterProjectionExpression expression) { expression.getLeft().accept(this); expression.getRight().accept(this); String elementScope = makeNewScope("element_"); String resultScope = makeNewScope("filterRes_"); writer.openBlock( "let $L = $L.filter(($L: any) => {", "});", resultScope, executionContext, elementScope, () -> { executionContext = elementScope; expression.getComparison().accept(this); writer.write("return $L;", executionContext); } ); executionContext = resultScope; return null; } @Override public Void visitSlice(SliceExpression expression) { throw new CodegenException("TypeScriptJmesPath visitor not implemented SliceExpression"); } @Override public Void visitSubexpression(Subexpression expression) { expression.getLeft().accept(this); expression.getRight().accept(this); return null; } void writeBooleanExpectation(String expectedValue, String returnValue) { writer.openBlock("if ($L == $L) {", "}", executionContext, expectedValue, () -> { writer.write("return $L;", returnValue); }); } void writeAnyStringEqualsExpectation(String expectedValue, String returnValue) { String element = makeNewScope("anyStringEq_"); writer.openBlock("for (let $L of $L) {", "}", element, executionContext, () -> { writer.openBlock("if ($L == $S) {", "}", element, expectedValue, () -> { writer.write("return $L;", returnValue); }); }); } void writeAllStringEqualsExpectation(String expectedValue, String returnValue) { String element = makeNewScope("element_"); String result = makeNewScope("allStringEq_"); writer.write("let $L = ($L.length > 0);", result, executionContext); writer.openBlock("for (let $L of $L) {", "}", element, executionContext, () -> { writer.write("$L = $L && ($L == $S)", result, result, element, expectedValue); }); writer.openBlock("if ($L) {", "}", result, () -> { writer.write("return $L;", returnValue); }); } void writeStringExpectation(String expectedValue, String returnValue) { writer.openBlock("if ($L === $S) {", "}", executionContext, expectedValue, () -> { writer.write("return $L;", returnValue); }); } private String makeNewScope(String prefix) { scopeCount += 1; return prefix + scopeCount; } private String serializeObject(Map obj) { return ("{" + obj .entrySet() .stream() .map(entry -> "\"" + entry.getKey() + "\":" + serializeValue(entry.getValue())) .collect(Collectors.joining(",")) + "}"); } private String serializeArray(List array) { return "[" + array.stream().map(this::serializeValue).collect(Collectors.joining(",")) + "]"; } @SuppressWarnings("unchecked") private String serializeValue(Object value) { if (value == null) { return "null"; } else if (value instanceof String) { return "\"" + value + "\""; } else if (value instanceof Number || value instanceof Boolean) { return value.toString(); } else if (value instanceof Map) { return serializeObject((Map) value); } else if (value instanceof ArrayList) { return serializeArray((List) value); } throw new CodegenException("Unsupported literal type: " + value.getClass()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptSSDKCodegenPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.utils.SmithyInternalApi; /** * Plugin to trigger TypeScript SSDK code generation. * @deprecated Use {@link TypeScriptServerCodegenPlugin} instead. */ @SmithyInternalApi @Deprecated @SuppressWarnings("AbbreviationAsWordInName") public class TypeScriptSSDKCodegenPlugin extends TypeScriptServerCodegenPlugin { @Override public String getName() { return "typescript-ssdk-codegen"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptServerCodegenPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ServiceLoader; import java.util.ServiceLoader.Provider; import java.util.logging.Logger; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.build.SmithyBuildPlugin; import software.amazon.smithy.codegen.core.directed.CodegenDirector; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; /** * Plugin to trigger TypeScript SSDK code generation. */ @SmithyInternalApi public class TypeScriptServerCodegenPlugin implements SmithyBuildPlugin { private static final Logger LOGGER = Logger.getLogger(TypeScriptServerCodegenPlugin.class.getName()); @Override public String getName() { return "typescript-server-codegen"; } @Override public void execute(PluginContext context) { CodegenDirector runner = new CodegenDirector<>(); runner.directedCodegen(new DirectedTypeScriptCodegen()); // Set the SmithyIntegration class to look for and apply using SPI. runner.integrationClass(TypeScriptIntegration.class); // Set the FileManifest and Model from the plugin. runner.fileManifest(context.getFileManifest()); runner.model(context.getModel()); // Create the TypeScriptSettings object from the plugin settings. TypeScriptSettings settings = TypeScriptSettings.from( context.getModel(), context.getSettings(), TypeScriptSettings.ArtifactType.SSDK ); runner.settings(settings); // Only add integrations if the integrations match the settings // This uses {@link TypeScriptIntegration#matchesSettings}, which is a // Smithy internal API. This may be removed at any point. runner.integrationFinder( () -> () -> ServiceLoader.load(TypeScriptIntegration.class, CodegenDirector.class.getClassLoader()) .stream() .map(Provider::get) .filter(integration -> { boolean matchesSettings = integration.matchesSettings(settings); if (!matchesSettings) { LOGGER.fine( () -> "Skipping TypeScript integration based on settings: " + integration.name() ); } return matchesSettings; }) .iterator() ); runner.service(settings.getService()); // Configure the director to perform some common model transforms. runner.performDefaultCodegenTransforms(); // TODO: Not using below because it would break existing AWS SDKs. Maybe it should be configurable // so generic SDKs call this by default, but AWS SDKs can opt-out of it via a setting. // runner.createDedicatedInputsAndOutputs(); // Run it! runner.run(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptSettings.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.BiFunction; import java.util.logging.Logger; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.DefaultTrait; import software.amazon.smithy.model.traits.RequiredTrait; import software.amazon.smithy.typescript.codegen.protocols.ProtocolPriorityConfig; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Settings used by {@link TypeScriptCodegenPlugin}. */ @SmithyUnstableApi public final class TypeScriptSettings { static final String DISABLE_DEFAULT_VALIDATION = "disableDefaultValidation"; static final String REQUIRED_MEMBER_MODE = "requiredMemberMode"; private static final Logger LOGGER = Logger.getLogger(TypeScriptSettings.class.getName()); private static final String PACKAGE = "package"; private static final String PACKAGE_DESCRIPTION = "packageDescription"; private static final String PACKAGE_VERSION = "packageVersion"; private static final String PACKAGE_JSON = "packageJson"; private static final String SERVICE = "service"; private static final String PROTOCOL = "protocol"; private static final String PRIVATE = "private"; private static final String PACKAGE_MANAGER = "packageManager"; private static final String CREATE_DEFAULT_README = "createDefaultReadme"; private static final String USE_LEGACY_AUTH = "useLegacyAuth"; private static final String GENERATE_TYPEDOC = "generateTypeDoc"; private static final String GENERATE_INDEX_TESTS = "generateIndexTests"; private static final String GENERATE_SNAPSHOT_TESTS = "generateSnapshotTests"; private static final String SERVICE_PROTOCOL_PRIORITY = "serviceProtocolPriority"; private static final String DEFAULT_PROTOCOL_PRIORITY = "defaultProtocolPriority"; private static final String BIG_NUMBER_MODE = "bigNumberMode"; private static final String GENERATE_SCHEMAS = "generateSchemas"; private static final String GENERATE_ENDPOINT_BDD = "generateEndpointBdd"; private static final String VERSIONING_SCHEME = "versioningScheme"; private String packageName; private String packageDescription = ""; private String packageVersion; private ObjectNode packageJson = Node.objectNode(); private ShapeId service; private ObjectNode pluginSettings = Node.objectNode(); private ShapeId protocol; private String defaultSigningName = ""; private boolean isPrivate; private ArtifactType artifactType = ArtifactType.CLIENT; private boolean disableDefaultValidation = false; private RequiredMemberMode requiredMemberMode = RequiredMemberMode.NULLABLE; private PackageManager packageManager = PackageManager.YARN; private boolean createDefaultReadme = false; private boolean useLegacyAuth = false; private boolean generateTypeDoc = false; private ProtocolPriorityConfig protocolPriorityConfig = new ProtocolPriorityConfig(null, null); private String bigNumberMode = "native"; private boolean generateSchemas = true; private boolean generateEndpointBdd = true; private boolean generateIndexTests = false; private boolean generateSnapshotTests = false; private String versioningScheme = ""; @Deprecated public static TypeScriptSettings from(Model model, ObjectNode config) { return from(model, config, ArtifactType.CLIENT); } /** * Create a settings object from a configuration object node. * * @param model Model to infer the service to generate if not explicitly provided. * @param config Config object to load. * @param artifactType The type of artifact being generated. * @return Returns the extracted settings. */ public static TypeScriptSettings from(Model model, ObjectNode config, ArtifactType artifactType) { TypeScriptSettings settings = new TypeScriptSettings(); settings.setArtifactType(artifactType); config.warnIfAdditionalProperties(artifactType.configProperties); // Get the service from the settings or infer one from the given model. settings.setService( config .getStringMember(SERVICE) .map(StringNode::expectShapeId) .orElseGet(() -> inferService(model)) ); settings.setPackageName(config.expectStringMember(PACKAGE).getValue()); settings.setPackageVersion(config.expectStringMember(PACKAGE_VERSION).getValue()); settings.setPackageDescription( config.getStringMemberOrDefault(PACKAGE_DESCRIPTION, settings.getDefaultDescription()) ); settings.packageJson = config.getObjectMember(PACKAGE_JSON).orElse(Node.objectNode()); config.getStringMember(PROTOCOL).map(StringNode::getValue).map(ShapeId::from).ifPresent(settings::setProtocol); settings.setPrivate(config.getBooleanMember(PRIVATE).map(BooleanNode::getValue).orElse(false)); settings.setCreateDefaultReadme( config.getBooleanMember(CREATE_DEFAULT_README).map(BooleanNode::getValue).orElse(false) ); settings.useLegacyAuth(config.getBooleanMemberOrDefault(USE_LEGACY_AUTH, false)); settings.setGenerateTypeDoc(config.getBooleanMember(GENERATE_TYPEDOC).map(BooleanNode::getValue).orElse(false)); settings.setPackageManager( config .getStringMember(PACKAGE_MANAGER) .map(s -> PackageManager.fromString(s.getValue())) .orElse(PackageManager.YARN) ); if (artifactType == ArtifactType.SSDK) { settings.setDisableDefaultValidation(config.getBooleanMemberOrDefault(DISABLE_DEFAULT_VALIDATION)); } settings.setRequiredMemberMode( config .getStringMember(REQUIRED_MEMBER_MODE) .map(s -> RequiredMemberMode.fromString(s.getValue())) .orElse(RequiredMemberMode.NULLABLE) ); settings.setPluginSettings(config); settings.readProtocolPriorityConfiguration(config); settings.setBigNumberMode(config.getStringMemberOrDefault(BIG_NUMBER_MODE, "native")); // Internal undocumented configuration used to control rollout of schemas. // `true` will eventually be the only available option, and this should not be set by users. settings.setGenerateSchemas(config.getBooleanMemberOrDefault(GENERATE_SCHEMAS, true)); // Internal undocumented configuration used to control rollout of endpoint BDD. // `true` will eventually be the only available option, and this should not be set by users. settings.setGenerateEndpointBdd(config.getBooleanMemberOrDefault(GENERATE_ENDPOINT_BDD, true)); settings.setGenerateIndexTests(config.getBooleanMemberOrDefault(GENERATE_INDEX_TESTS, false)); settings.setGenerateSnapshotTests(config.getBooleanMemberOrDefault(GENERATE_SNAPSHOT_TESTS, false)); settings.setVersioningScheme(config.getStringMemberOrDefault(VERSIONING_SCHEME, "")); return settings; } private String getDefaultDescription() { String description = getPackageName(); switch (artifactType) { case CLIENT: description += " client"; break; case SSDK: description += " server"; break; default: } return description; } // TODO: this seems reusable across generators. private static ShapeId inferService(Model model) { List services = model .shapes(ServiceShape.class) .map(Shape::getId) .sorted() .collect(Collectors.toList()); if (services.isEmpty()) { throw new CodegenException( "Cannot infer a service to generate because the model does not " + "contain any service shapes" ); } else if (services.size() > 1) { throw new CodegenException( "Cannot infer a service to generate because the model contains " + "multiple service shapes: " + services ); } else { LOGGER.fine("Inferring service to generate as " + services.get(0)); return services.get(0); } } /** * Gets the required package name that is going to be generated. * * @return Returns the package name. * @throws NullPointerException if the service has not been set. */ public String getPackageName() { return Objects.requireNonNull(packageName, PACKAGE + " not set"); } public void setPackageName(String packageName) { this.packageName = packageName; } /** * Gets the description of the package that will be placed in the * "description" field of the generated package.json. * * @return Returns the description or an empty string if not set. */ public String getPackageDescription() { return packageDescription; } public void setPackageDescription(String packageDescription) { this.packageDescription = Objects.requireNonNull(packageDescription); } /** * Gets the version of the generated package that will be used with the * generated package.json file. * * @return Returns the package version. */ public String getPackageVersion() { return packageVersion; } public void setPackageVersion(String packageVersion) { this.packageVersion = packageVersion; } /** * @return whether to use native (BigInt + NumericValue) or big.js for BigInteger/BigDecimal. */ public String getBigNumberMode() { return bigNumberMode; } public void setBigNumberMode(String mode) { if (!mode.equals("big.js") && !mode.equals("native")) { throw new IllegalArgumentException( """ bigNumberMode must be one of ["native", "big.js"]""" ); } this.bigNumberMode = mode; } /** * Internal API, do not use. */ @SmithyInternalApi public void setGenerateSchemas(boolean generateSchemas) { this.generateSchemas = generateSchemas; } /** * Internal API, do not use. */ @SmithyInternalApi public boolean generateSchemas() { return generateSchemas; } @SmithyInternalApi public void setGenerateEndpointBdd(boolean generateEndpointBdd) { this.generateEndpointBdd = generateEndpointBdd; } @SmithyInternalApi public boolean generateEndpointBdd() { return generateEndpointBdd; } public void setGenerateIndexTests(boolean generateIndexTests) { this.generateIndexTests = generateIndexTests; } public boolean generateIndexTests() { return generateIndexTests; } public void setGenerateSnapshotTests(boolean generateSnapshotTests) { this.generateSnapshotTests = generateSnapshotTests; } public boolean generateSnapshotTests() { return generateSnapshotTests; } public void setVersioningScheme(String scheme) { this.versioningScheme = scheme; } public String getVersioningScheme() { return this.versioningScheme; } /** * Gets a chunk of custom properties to merge into the generated * package.json file. * *

This JSON is used to provide any property present in the * package.json file that isn't captured by any other settings. * This value will never be {@code null}. * * @return Returns the custom package JSON. */ public ObjectNode getPackageJson() { return packageJson; } /** * Sets the custom package.json properties. * * @param packageJson package.json properties to merge in. */ public void setPackageJson(ObjectNode packageJson) { this.packageJson = Objects.requireNonNull(packageJson); } /** * Gets the optional name of the service that is being generated. * * @return Returns the package name. * @throws NullPointerException if the service has not been set. */ public ShapeId getService() { return Objects.requireNonNull(service, SERVICE + " not set"); } public void setService(ShapeId service) { this.service = Objects.requireNonNull(service); } /** * Gets additional plugin settings. * *

This value will never throw or return {@code null}. * * @return Returns the entire settings object. */ public ObjectNode getPluginSettings() { return pluginSettings; } public void setPluginSettings(ObjectNode pluginSettings) { this.pluginSettings = Objects.requireNonNull(pluginSettings); } /** * Returns if the generated package will be made private. * * @return If the package will be private. */ public boolean isPrivate() { return isPrivate; } public void setPrivate(boolean isPrivate) { this.isPrivate = isPrivate; } public boolean createDefaultReadme() { return createDefaultReadme; } public void setCreateDefaultReadme(boolean createDefaultReadme) { this.createDefaultReadme = createDefaultReadme; } /** * Returns if the generated package will be a client. * * @return If the package will include a client. */ public boolean generateClient() { return artifactType.equals(ArtifactType.CLIENT); } /** * Returns if the generated package will be a server sdk. * * @return If the package will include a server sdk. */ public boolean generateServerSdk() { return artifactType.equals(ArtifactType.SSDK); } /** * Returns the type of artifact being generated, such as a client or ssdk. * * @return The artifact type. */ public ArtifactType getArtifactType() { return artifactType; } public void setArtifactType(ArtifactType artifactType) { this.artifactType = artifactType; } /** * Returns whether or not default validation is disabled. This setting is only relevant for the SSDK. * * @return true if default validation is disabled. Default: false */ public boolean isDisableDefaultValidation() { return disableDefaultValidation; } public void setDisableDefaultValidation(boolean disableDefaultValidation) { this.disableDefaultValidation = disableDefaultValidation; } /** * Returns the code generation mode for required members. * * @return the configured mode for required members. * Defaults to {@link RequiredMemberMode#NULLABLE} */ public RequiredMemberMode getRequiredMemberMode() { return requiredMemberMode; } public void setRequiredMemberMode(RequiredMemberMode requiredMemberMode) { if (requiredMemberMode != RequiredMemberMode.NULLABLE) { LOGGER.warning( String.format( "By setting the required member mode to '%s', a" + " member that has the '@required' trait applied CANNOT be 'undefined'." + " It will be considered a BACKWARDS INCOMPATIBLE change for" + " Smithy services even when the required constraint is dropped from a member.", requiredMemberMode.mode, RequiredMemberMode.NULLABLE.mode ) ); } this.requiredMemberMode = requiredMemberMode; } /** * Returns the package manager used by the generated package. * * @return the configured package manager. Defaults to {@link PackageManager#YARN} */ public PackageManager getPackageManager() { return packageManager; } public void setPackageManager(PackageManager packageManager) { this.packageManager = packageManager; } /** * Returns whether to use legacy auth integrations. * * @return if legacy auth should used. Default: false */ public boolean useLegacyAuth() { return useLegacyAuth; } /** * Sets whether legacy auth should be used. * * @param useLegacyAuth whether legacy auth should be used. */ public void useLegacyAuth(boolean useLegacyAuth) { if (useLegacyAuth) { LOGGER.warning( """ Legacy auth is considered deprecated and is no longer in development, and should only be used for backward compatibility concerns. Consider migrating to the default identity and auth behavior.""" ); } this.useLegacyAuth = useLegacyAuth; } /** * Returns whether to generate typedoc support. * * @return whether to generate typedoc support. Default: false */ public boolean generateTypeDoc() { return generateTypeDoc; } /** * Sets whether to generate typedoc support. * * @param generateTypeDoc whether to generate typedoc support */ public void setGenerateTypeDoc(boolean generateTypeDoc) { this.generateTypeDoc = generateTypeDoc; } /** * Gets the corresponding {@link ServiceShape} from a model. * * @param model Model to search for the service shape by ID. * @return Returns the found {@code Service}. * @throws NullPointerException if the service has not been set. * @throws CodegenException if the service is invalid or not found. */ public ServiceShape getService(Model model) { return model .getShape(getService()) .orElseThrow(() -> new CodegenException("Service shape not found: " + getService())) .asServiceShape() .orElseThrow(() -> new CodegenException("Shape is not a Service: " + getService())); } /** * Gets the configured protocol to generate. * * @return Returns the configured protocol. */ public ShapeId getProtocol() { return protocol; } /** * Resolves the highest priority protocol from a service shape that is * supported by the generator. * * @param model Model to enable finding protocols on the service. * @param service Service to get the protocols from if "protocols" is not set. * @param supportedProtocols The set of protocol names supported by the generator. * @return Returns the resolved protocol name. * @throws UnresolvableProtocolException if no protocol could be resolved. */ public ShapeId resolveServiceProtocol(Model model, ServiceShape service, Set supportedProtocols) { if (protocol != null) { return protocol; } ServiceIndex serviceIndex = ServiceIndex.of(model); Set resolvedProtocols = serviceIndex.getProtocols(service).keySet(); if (resolvedProtocols.isEmpty()) { throw new UnresolvableProtocolException( "Unable to derive the protocol setting of the service `" + service.getId() + "` because no " + "protocol definition traits were present. You need to set an explicit `protocol` to " + "generate in smithy-build.json to generate this service." ); } List protocolPriority = this.protocolPriorityConfig.getProtocolPriority(service.toShapeId()); List protocolPriorityList = protocolPriority != null && !protocolPriority.isEmpty() ? protocolPriority : new ArrayList<>(supportedProtocols); return protocolPriorityList .stream() .filter(resolvedProtocols::contains) .findFirst() .orElseThrow( () -> new UnresolvableProtocolException( String.format( "The %s service supports the following unsupported protocols %s. The following protocol " + "generators were found on the class path: %s", service.getId(), resolvedProtocols, supportedProtocols ) ) ); } /** * Sets the protocol to generate. * * @param protocol Protocols to generate. */ public void setProtocol(ShapeId protocol) { this.protocol = Objects.requireNonNull(protocol); } /** * @param name - used as the signing service name when no explicit value from endpoints AuthScheme is present. */ public void setDefaultSigningName(String name) { defaultSigningName = name; } /** * @return signing service name when no explicit value from endpoints AuthScheme is present. */ public String getDefaultSigningName() { return defaultSigningName; } /** * @return config container for service and/or default protocol selection priority overrides. */ public ProtocolPriorityConfig getProtocolPriority() { return protocolPriorityConfig; } public void setProtocolPriority(ProtocolPriorityConfig protocolPriorityConfig) { this.protocolPriorityConfig = protocolPriorityConfig; } /** * An enum indicating the type of artifact the code generator will produce. */ public enum ArtifactType { CLIENT( SymbolVisitor::new, Arrays.asList( PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER, SERVICE, PROTOCOL, PRIVATE, REQUIRED_MEMBER_MODE, CREATE_DEFAULT_README, USE_LEGACY_AUTH, GENERATE_TYPEDOC, GENERATE_INDEX_TESTS, GENERATE_SNAPSHOT_TESTS, BIG_NUMBER_MODE, GENERATE_SCHEMAS, GENERATE_ENDPOINT_BDD, VERSIONING_SCHEME ) ), SSDK( (m, s) -> new ServerSymbolVisitor(m, new SymbolVisitor(m, s)), Arrays.asList( PACKAGE, PACKAGE_DESCRIPTION, PACKAGE_JSON, PACKAGE_VERSION, PACKAGE_MANAGER, SERVICE, PROTOCOL, PRIVATE, REQUIRED_MEMBER_MODE, DISABLE_DEFAULT_VALIDATION, CREATE_DEFAULT_README, GENERATE_TYPEDOC, GENERATE_INDEX_TESTS, GENERATE_SNAPSHOT_TESTS, BIG_NUMBER_MODE, GENERATE_SCHEMAS, GENERATE_ENDPOINT_BDD, VERSIONING_SCHEME ) ); private final BiFunction symbolProviderFactory; private final List configProperties; ArtifactType( BiFunction symbolProviderFactory, List configProperties ) { this.symbolProviderFactory = symbolProviderFactory; this.configProperties = Collections.unmodifiableList(configProperties); } /** * Creates a TypeScript symbol provider suited to the artifact type. * * @param model Model to generate symbols for. * @param settings Settings used by the symbol provider. * @return Returns the created provider. */ public SymbolProvider createSymbolProvider(Model model, TypeScriptSettings settings) { return symbolProviderFactory.apply(model, settings); } } /** * An enum indicating the code generation mode for required members. */ public enum RequiredMemberMode { /** * This is the current behavior and it will be the default. When set, * it allows a member that has the {@link RequiredTrait} applied to be {@code undefined}. * By doing so it can still be considered a backwards compatible change fo * Smithy services even when the required constraint is dropped from a member. */ NULLABLE("nullable"), /** * This will disallow members marked as {@link RequiredTrait} to be {@code undefined}. * Use this mode with CAUTION because it comes with certain risks. When a server drops * {@link RequiredTrait} from an output shape (and it is replaced with {@link DefaultTrait} * as defined by the spec), if the server does not always serialize a value, * customer code consuming the client and trying to access this member, may get a * NullPointerException. Smithy spec says: "Authoritative model consumers like servers * SHOULD always serialize default values to remove any ambiguity about the value of * the most up to default value." So one should use this mode on the client, only if * the server is following the approach proposed by the spec. */ STRICT("strict"); private final String mode; RequiredMemberMode(String mode) { this.mode = mode; } public String getMode() { return mode; } public static RequiredMemberMode fromString(String s) { if ("nullable".equals(s)) { return NULLABLE; } if ("strict".equals(s)) { return STRICT; } throw new CodegenException(String.format("Unsupported required member mode: %s", s)); } } public enum PackageManager { YARN("yarn", "yarn dlx"), NPM("npm", "npx"), PNPM("pnpm", "pnpm dlx"); private final String command; private final String execCommand; PackageManager(String command, String execCommand) { this.command = command; this.execCommand = execCommand; } public String getCommand() { return command; } public String getExecCommand() { return execCommand; } public static PackageManager fromString(String s) { if ("yarn".equals(s)) { return YARN; } if ("npm".equals(s)) { return NPM; } if ("pnpm".equals(s)) { return PNPM; } throw new CodegenException(String.format("Unsupported package manager: %s", s)); } } /** * Reads serviceProtocolPriority and defaultProtocolPriority configuration fields. * { * serviceProtocolPriority: { * "namespace#Service": ["namespace#Protocol1", "namespace#Protocol2"] * }, * defaultProtocolPriority: ["namespace#Protocol"] * } */ private void readProtocolPriorityConfiguration(ObjectNode config) { Map> serviceProtocolPriorityCustomizations = new HashMap<>(); List customDefaultPriority = new LinkedList<>(); try { Optional protocolPriorityNode = config.getObjectMember(SERVICE_PROTOCOL_PRIORITY); if (protocolPriorityNode.isPresent()) { ObjectNode objectNode = protocolPriorityNode.get(); objectNode .getMembers() .forEach((StringNode k, Node v) -> { ShapeId serviceShapeId = ShapeId.from(k.getValue()); List protocolList = v .asArrayNode() .get() .getElementsAs(e -> ShapeId.from(e.asStringNode().get().getValue())); serviceProtocolPriorityCustomizations.put(serviceShapeId, protocolList); }); } Optional defaultProtocolPriorityOpt = config.getArrayMember(DEFAULT_PROTOCOL_PRIORITY); if (defaultProtocolPriorityOpt.isPresent()) { ArrayNode defaultProtocolPriorityStringArr = defaultProtocolPriorityOpt.get(); customDefaultPriority.addAll( defaultProtocolPriorityStringArr .getElementsAs(e -> ShapeId.from(e.asStringNode().get().getValue())) ); } } catch (Exception e) { throw new IllegalArgumentException( "Error while parsing serviceProtocolPriority or defaultProtocolPriority configuration fields", e ); } protocolPriorityConfig = new ProtocolPriorityConfig( serviceProtocolPriorityCustomizations, customDefaultPriority.isEmpty() ? null : customDefaultPriority ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptUtils.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.io.IOException; import java.io.InputStream; import java.io.UncheckedIOException; import java.util.Collection; import java.util.regex.Pattern; import java.util.stream.Collectors; import software.amazon.smithy.utils.IoUtils; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * Utility methods for TypeScript / JavaScript. */ @SmithyInternalApi final class TypeScriptUtils { private static final Pattern PROPERTY_NAME_REGEX = Pattern.compile("^(?![0-9])[a-zA-Z0-9$_]+$"); private TypeScriptUtils() {} /** * Adds quotes to the given string if quotes are needed to make it a * valid JavaScript property name. * * @param memberName Member name to check. * @return Returns the sanitized member name. */ static String sanitizePropertyName(String memberName) { return isValidPropertyName(memberName) ? memberName : StringUtils.escapeJavaString(memberName, ""); } /** * Checks if the given string is a valid JavaScript property name. * *

This check is pretty simplistic, and the rules around property names * are much more complex than this according to ECMA-262, but the primary * purpose of this method is to make the generated code syntactically * valid. * * @param value Value to check. * @return Returns true if the value is ok to be an unquoted property. */ private static boolean isValidPropertyName(String value) { return PROPERTY_NAME_REGEX.matcher(value).matches(); } /** * Creates a list of sorted, pipe separated enum variants as a union. * *

For example, `"foo" | "baz"`. Note: special characters * and quotes are escaped as needed. * * @param values Values to create into a union. * @return Returns the union of string literals. */ static String getEnumVariants(Collection values) { return values .stream() .sorted() .map(value -> StringUtils.escapeJavaString(value, "")) .collect(Collectors.joining(" | ")); } /** * Loads the contents of a resource into a string. * * @param name Relative path of the resource to load. * @return Returns the loaded contents. * TODO: this should be a shared feature in smithy-utils */ static String loadResourceAsString(String name) { try (InputStream is = TypeScriptUtils.class.getResourceAsStream(name)) { return IoUtils.toUtf8String(is); } catch (IOException e) { throw new UncheckedIOException(e); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/TypeScriptWriter.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Path; import java.util.function.BiFunction; import java.util.function.UnaryOperator; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.codegen.core.SymbolWriter; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.loader.Prelude; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.traits.DeprecatedTrait; import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.model.traits.InternalTrait; import software.amazon.smithy.typescript.codegen.validation.ImportFrom; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.StringUtils; /** * Specialized code writer for managing TypeScript dependencies. * *

Use the {@code $T} formatter to refer to {@link Symbol}s. These symbols * are automatically imported into the writer and relativized if necessary. * *

When adding imports, start the module name with "./" to resolve relative * module paths against the moduleName of the writer. Module names that * start with anything other than "." (e.g., "@", "/", etc.) are never * relativized. * *

Dependencies introduced via a TypeScriptWriter are added to the package.json * file if the writer is a part of the {@link TypeScriptDelegator} of the {@link DirectedTypeScriptCodegen}. */ @SmithyUnstableApi public final class TypeScriptWriter extends SymbolWriter { public static final String CODEGEN_INDICATOR = "// smithy-typescript generated code\n"; public static final int LINE_WIDTH = 120; private final String moduleName; private final boolean withAttribution; public TypeScriptWriter(String moduleName) { this(moduleName, true); } private TypeScriptWriter(String moduleName, boolean withAttribution) { super(new ImportDeclarations(moduleName)); this.moduleName = moduleName; setIndentText(" "); trimTrailingSpaces(true); trimBlankLines(); putFormatter('T', new TypeScriptSymbolFormatter()); this.withAttribution = withAttribution; } public static final class TypeScriptWriterFactory implements SymbolWriter.Factory { @Override public TypeScriptWriter apply(String filename, String namespace) { boolean withAttribution = filename.endsWith(".ts"); String moduleName = filename.endsWith(".ts") ? filename.substring(0, filename.length() - 3) : filename; return new TypeScriptWriter(moduleName, withAttribution); } } /** * Get the module name that is generated by the writer. * * @return Returns the module name. */ public String getModuleName() { return moduleName; } /** * default import from a module, annotated with @ts-ignore. * * @param name Name of default import. * @param from Module to default import from. * @param reason The reason for ignoring the import * @return Returns the writer. */ public TypeScriptWriter addIgnoredDefaultImport(String name, String from, String reason) { getImportContainer().addIgnoredDefaultImport(name, from, reason); return this; } /** * Imports a type using an alias from a module only if necessary. * * @param name Type to import. * @param as Alias to refer to the type as. * @param from Module to import the type from. * * @return Returns the writer. * * @deprecated Use {@link TypeScriptWriter#addImport(String, String, TypeScriptDependency)} addImport} */ @Deprecated public TypeScriptWriter addImport(String name, String as, String from) { ImportFrom importFrom = new ImportFrom(from); checkImport(importFrom, from); getImportContainer().addImport(name, as, from); return this; } /** * Imports a type using an alias from a module only if necessary. * Adds the dependency. * * @param name Type to import. * @param as Alias to refer to the type as. * @param from PackageContainer to import the type from. * @return Returns the writer. */ public TypeScriptWriter addImport(String name, String as, PackageContainer from) { if (from instanceof Dependency) { addDependency((Dependency) from); } return this.addImport(name, as, from.getPackageName()); } /** * Type-only version of {@link #addImport}. */ public TypeScriptWriter addTypeImport(String name, String as, Dependency from) { addDependency(from); return addTypeImport(name, as, from.getPackageName()); } /** * Same as {@link #addImport(String, String, PackageContainer)} but appends a * submodule path, for example "@smithy/core/cbor". */ public TypeScriptWriter addImportSubmodule(String name, String as, PackageContainer from, String submodule) { if (from instanceof Dependency dependency) { addDependency(dependency); } return this.addImport(name, as, from.getPackageName() + submodule); } /** * Type-only version of {@link #addImportSubmodule}. */ public TypeScriptWriter addTypeImportSubmodule(String name, String as, PackageContainer from, String submodule) { if (from instanceof Dependency dependency) { addDependency(dependency); } return this.addTypeImport(name, as, from.getPackageName() + submodule); } /** * Imports a type using an alias from a relative Path. * * @param name Type to import. * @param as Alias to refer to the type as. * @param from Path to import the type from. * @return Returns the writer. */ public TypeScriptWriter addRelativeImport(String name, String as, Path from) { return this.addImport(name, as, from.toString()); } /** * Type-only version of {@link #addRelativeImport}. */ public TypeScriptWriter addRelativeTypeImport(String name, String as, Path from) { return this.addTypeImport(name, as, from.toString()); } /** * Writes documentation comments. * * @param runnable Runnable that handles actually writing docs with the writer. * @return Returns the writer. */ public TypeScriptWriter writeDocs(Runnable runnable) { pushState("docs"); write("/**"); setNewlinePrefix(" * "); runnable.run(); setNewlinePrefix(""); write(" */"); popState(); return this; } /** * Writes documentation comments from a string. * *

This function escapes "$" characters so formatters are not run. * * @param docs Documentation to write. * @return Returns the writer. */ public TypeScriptWriter writeDocs(String docs) { // Docs can have valid $ characters that shouldn't run through formatters. // Escapes multi-line comment closings. writeDocs(() -> write(docs.replace("$", "$$").replace("*/", "*\\/"))); return this; } /** * As openBlock, but collapses all space between open and close strings * if the condition is not met. */ public TypeScriptWriter openCollapsibleBlock( String open, String close, boolean condition, Object[] args, Runnable runnable ) { if (condition) { openBlock(open, close, args, runnable); } else { write(open + close, args); } return this; } public TypeScriptWriter openCollapsibleBlock(String open, String close, boolean condition, Runnable runnable) { return openCollapsibleBlock(open, close, condition, new Object[] {}, runnable); } public TypeScriptWriter openCollapsibleBlock( String open, String close, boolean condition, Object arg1, Runnable runnable ) { return openCollapsibleBlock(open, close, condition, new Object[] {arg1}, runnable); } public TypeScriptWriter openCollapsibleBlock( String open, String close, boolean condition, Object arg1, Object arg2, Runnable runnable ) { return openCollapsibleBlock(open, close, condition, new Object[] {arg1, arg2}, runnable); } public TypeScriptWriter openCollapsibleBlock( String open, String close, boolean condition, Object arg1, Object arg2, Object arg3, Runnable runnable ) { return openCollapsibleBlock(open, close, condition, new Object[] {arg1, arg2, arg3}, runnable); } /** * Modifies and writes shape documentation comments if docs are present. * * @param shape Shape to write the documentation of. * @param preprocessor UnaryOperator that takes documentation and returns modified one. * @return Returns true if docs were written. */ boolean writeShapeDocs(Shape shape, UnaryOperator preprocessor) { boolean hasDocumentation = shape.getTrait(DocumentationTrait.class).isPresent(); boolean hasDeprecation = shape.getTrait(DeprecatedTrait.class).isPresent(); if (hasDocumentation || hasDeprecation) { String docs = hasDocumentation ? shape.getTrait(DocumentationTrait.class).get().getValue() : ""; docs = docs.replace("{", "\\{").replace("}", "\\}"); if (hasDeprecation) { DeprecatedTrait deprecatedTrait = shape.expectTrait(DeprecatedTrait.class); String deprecationAnnotation = buildDeprecationAnnotation(deprecatedTrait); if (hasDocumentation) { docs = punctuate(docs) + "\n\n" + deprecationAnnotation; } else { docs = deprecationAnnotation; } } docs = preprocessor.apply(docs); docs = addReleaseTag(shape, docs); writeDocs(docs); return true; } return false; } /** * Writes shape documentation comments if docs are present. * * @param shape Shape to write the documentation of. * @return Returns true if docs were written. */ boolean writeShapeDocs(Shape shape) { boolean didWrite = writeShapeDocs(shape, docs -> docs); if (!didWrite) { writeDocs("@public"); } return didWrite; } /** * Writes member shape documentation comments if docs are present. * * @param model Model used to dereference targets. * @param member Shape to write the documentation of. * @return Returns true if docs were written. */ boolean writeMemberDocs(Model model, MemberShape member) { boolean hasDocumentation = member.getMemberTrait(model, DocumentationTrait.class).isPresent(); boolean hasDeprecation = member.getTrait(DeprecatedTrait.class).isPresent() || isTargetDeprecated(model, member); if (hasDocumentation || hasDeprecation) { String docs = hasDocumentation ? member.getMemberTrait(model, DocumentationTrait.class).get().getValue() : ""; docs = docs.replace("{", "\\{").replace("}", "\\}"); if (hasDeprecation) { DeprecatedTrait deprecatedTrait = member .getTrait(DeprecatedTrait.class) .or(() -> model.expectShape(member.getTarget()).getTrait(DeprecatedTrait.class)) .orElseThrow(); String deprecationAnnotation = buildDeprecationAnnotation(deprecatedTrait); if (hasDocumentation) { docs = punctuate(docs) + "\n\n" + deprecationAnnotation; } else { docs = deprecationAnnotation; } } docs = addReleaseTag(member, docs); writeDocs(docs); return true; } return false; } private boolean isTargetDeprecated(Model model, MemberShape member) { return (model.expectShape(member.getTarget()).getTrait(DeprecatedTrait.class).isPresent() && // don't consider deprecated prelude shapes (like PrimitiveBoolean) !Prelude.isPreludeShape(member.getTarget())); } /** * Builds a JSDoc {@code @deprecated} annotation from a {@link DeprecatedTrait}, * synthesizing the {@code message} and {@code since} fields into the deprecation text. */ static String buildDeprecationAnnotation(DeprecatedTrait trait) { StringBuilder annotation = new StringBuilder("@deprecated"); String message = trait.getMessage().orElse(null); String since = trait.getSince().orElse(null); if (message != null && since != null) { annotation .append(" (since %s) ".formatted(since)) .append(message); } else if (message != null) { annotation.append(" ").append(message); } else if (since != null) { annotation.append(" since %s".formatted(since)); } else { annotation.append(" deprecated"); } return punctuate(annotation.toString()); } /** * Adds a period to the end of the string if no punctuation is present. * It doesn't matter if it's not a grammatical sentence, since the period * serves as a visual separator in code comments. */ static String punctuate(String s) { String state = s.trim(); if (state.matches("(.*?)\\w$")) { return state + "."; } return s; } private String addReleaseTag(Shape shape, String docs) { if (shape.getTrait(InternalTrait.class).isPresent()) { docs = docs + "\n@internal"; } else { docs = docs + "\n@public"; } return docs; } /** * This is private because the string-value [from] signature is * deprecated for the corresponding addImport() signature. Importing a string * makes it difficult to ensure the package is added to the dependency manifest, * so package imports should be by package object, and relative imports by path object. */ private TypeScriptWriter addTypeImport(String name, String as, String from) { ImportFrom importFrom = new ImportFrom(from); checkImport(importFrom, from); getImportContainer().addTypeImport(name, as, from); return this; } /** * Check that the import source string has been registered with the dependency manifest * if it is a package, not a node package, and not a relative path. */ private void checkImport(ImportFrom importFrom, String from) { if (importFrom.isDeclarablePackageImport()) { String packageName = importFrom.getPackageName(); if (getDependencies().stream().map(SymbolDependency::getPackageName).noneMatch(packageName::equals)) { throw new CodegenException( """ The import %s does not correspond to a registered dependency. TypeScriptWriter::addDependency() is required before ::addImport(). """.formatted(from) ); } } } @Override public String toString() { String contents = super.toString(); String importString = getImportContainer().toString(); String strippedContents = StringUtils.stripStart(contents, null); String strippedImportString = StringUtils.strip(importString, null); String attribution = withAttribution ? CODEGEN_INDICATOR : ""; // Don't add an additional new line between explicit imports and managed imports. if (!strippedImportString.isEmpty() && strippedContents.startsWith("import ")) { return attribution + strippedImportString + "\n" + strippedContents; } return attribution + importString + contents; } /** * Adds TypeScript symbols for the "$T" formatter. */ private final class TypeScriptSymbolFormatter implements BiFunction { @Override public String apply(Object type, String indent) { if (type instanceof Symbol) { Symbol typeSymbol = (Symbol) type; addUseImports(typeSymbol); return typeSymbol.getName(); } else if (type instanceof SymbolReference) { SymbolReference typeSymbol = (SymbolReference) type; addImport(typeSymbol.getSymbol(), typeSymbol.getAlias(), SymbolReference.ContextOption.USE); return typeSymbol.getAlias(); } else { throw new CodegenException( "Invalid type provided to $T. Expected a Symbol or SymbolReference, but found `" + type + "`" ); } } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnionGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.util.Map; import java.util.TreeMap; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings.RequiredMemberMode; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.validation.SensitiveDataFinder; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * Renders a TypeScript union. * *

* Smithy tagged unions are rendered as a set of TypeScript interfaces * and functionality used to visit each variant. Only a single member * can be set at any given time. A member that contains unknown variants * is automatically added to each tagged union. If set, it contains the * name of the property that was set and its value stored as an * {@code any}. * *

* A {@code Visitor} interface and a method used to dispatch to the * visitor is generated for each tagged union. This allows for working * with tagged unions functionally and account for each variant in a * typed way. * *

* For example, given the following Smithy model: * *

{@code
 * union Attacker {
 *     lion: Lion,
 *     tiger: Tiger,
 *     bear: Bear,
 * }
 * }
* *

* The following code is generated: * *

{@code
 * export type Attacker =
 *   | Attacker.LionMember
 *   | Attacker.TigerMember
 *   | Attacker.BearMember
 *   | Attacker.$UnknownMember;
 *
 * export namespace Attacker {
 *
 *   export interface LionMember {
 *     lion: Lion;
 *     tiger?: never;
 *     bear?: never;
 *     $unknown?: never;
 *   }
 *
 *   export interface TigerMember {
 *     lion?: never;
 *     tiger?: Tiger;
 *     bear?: never;
 *     $unknown?: never;
 *   }
 *
 *   export interface BearMember {
 *     lion?: never;
 *     tiger?: never;
 *     bear: Bear;
 *     $unknown: never;
 *   }
 *
 *   export interface $UnknownMember {
 *     lion?: never;
 *     tiger?: never;
 *     bear?: never;
 *     $unknown: [string, any];
 *   }
 *
 *   export interface Visitor {
 *     lion: (value: Lion) => T;
 *     tiger: (value: Tiger) => T;
 *     bear: (value: Bear) => T;
 *     _: (name: string, value: any) => T;
 *   }
 *
 *   export const visit = (
 *     value: Attacker,
 *     visitor: Visitor
 *   ): T => {
 *     if (value.lion !== undefined) return visitor.lion(value.lion);
 *     if (value.tiger !== undefined) return visitor.tiger(value.tiger);
 *     if (value.bear !== undefined) return visitor.bear(value.bear);
 *     return visitor._(value.$unknown[0], value.$unknown[1]);
 *   }
 * }
 *
 * export const AttackerFilterSensitiveLog = (obj: Attacker) => {
 *   if (obj.lion !== undefined)
 *     return { lion: Lion.filterSensitiveLog(obj.lion) };
 *   if (obj.tiger !== undefined)
 *     return { tiger: Tiger.filterSensitiveLog(obj.tiger) };
 *   if (obj.bear !== undefined)
 *     return { bear: Bear.filterSensitiveLog(obj.bear) };
 *   if (obj.$unknown !== undefined)
 *     return { [obj.$unknown[0]]: 'UNKNOWN' };
 * }
 *
 * }
* *

* Important: Tagged unions in TypeScript are intentionally designed * so that it is forward-compatible to change a structure with optional * and mutually exclusive members to a tagged union. */ @SmithyInternalApi final class UnionGenerator implements Runnable { private final Model model; private final SymbolProvider symbolProvider; private final TypeScriptWriter writer; private final Symbol symbol; private final UnionShape shape; private final Map variantMap; private final boolean includeValidation; private final SensitiveDataFinder sensitiveDataFinder; private final boolean schemaMode; private final ServiceClosure closure; /** * sets 'includeValidation' to 'false' for backwards compatibility. */ UnionGenerator( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider, TypeScriptWriter writer, UnionShape shape ) { this(model, settings, symbolProvider, writer, shape, false, false); } UnionGenerator( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider, TypeScriptWriter writer, UnionShape shape, boolean includeValidation, boolean schemaMode ) { this.shape = shape; this.symbol = symbolProvider.toSymbol(shape); this.model = model; this.symbolProvider = symbolProvider; this.writer = writer; this.includeValidation = includeValidation; sensitiveDataFinder = new SensitiveDataFinder(model); variantMap = new TreeMap<>(); for (MemberShape member : shape.getAllMembers().values()) { String variant = StringUtils.capitalize(symbolProvider.toMemberName(member)) + "Member"; variantMap.put(member.getMemberName(), variant); } this.schemaMode = schemaMode; this.closure = ServiceClosure.of(model, settings.getService(model)); } @Override public void run() { // Write out the union type of all variants. writer.writeShapeDocs(shape); writer.openBlock("export type $L = ", "", symbol.getName(), () -> { for (String variant : variantMap.values()) { writer.write("| $L.$L", symbol.getName(), variant); } writer.write("| $L.$$UnknownMember;", symbol.getName()); }); // Write out the namespace that contains each variant and visitor. writer .writeDocs("@public") .openBlock("export namespace $L {", "}", symbol.getName(), () -> { writeUnionMemberInterfaces(); writeVisitorType(); writeVisitorFunction(); if (includeValidation) { writeValidate(); } writer.unwrite("\n"); }); writeFilterSensitiveLog(symbol.getName()); } private void writeUnionMemberInterfaces() { for (MemberShape member : shape.getAllMembers().values()) { String name = variantMap.get(member.getMemberName()); writer.writeMemberDocs(model, member); writer.openBlock("export interface $L {", "}", name, () -> { for (MemberShape variantMember : shape.getAllMembers().values()) { if (variantMember.getMemberName().equals(member.getMemberName())) { writer.write( "$L: $T;", symbolProvider.toMemberName(variantMember), symbolProvider.toSymbol(variantMember) ); } else { writer.write("$L?: never;", symbolProvider.toMemberName(variantMember)); } } writer.write("$$unknown?: never;"); }); writer.write(""); } // Write out the unknown variant. writer.writeDocs("@public"); writer.openBlock("export interface $$UnknownMember {", "}", () -> { for (MemberShape member : shape.getAllMembers().values()) { writer.write("$L?: never;", symbolProvider.toMemberName(member)); } writer.write("$$unknown: [string, any];"); }); writer.write(""); } private void writeVisitorType() { if (schemaMode) { writer.writeDocs( """ @deprecated unused in schema-serde mode. """ ); } writer.openBlock("export interface Visitor {", "}", () -> { for (MemberShape member : shape.getAllMembers().values()) { writer.write( "$L: (value: $T) => T;", symbolProvider.toMemberName(member), symbolProvider.toSymbol(member) ); } writer.write("_: (name: string, value: any) => T;"); }); writer.write(""); } private void writeVisitorFunction() { if (!schemaMode) { // Create the visitor dispatcher for the union. writer.writeInline("export const visit = ("); writer.writeInline("value: $L, ", symbol.getName()); writer.writeInline("visitor: Visitor"); writer.write("): T => {").indent(); for (MemberShape member : shape.getAllMembers().values()) { String memberName = symbolProvider.toMemberName(member); writer.write("if (value.${1L} !== undefined) return visitor.$1L(value.${1L});", memberName); } writer.write("return visitor._(value.$$unknown[0], value.$$unknown[1]);"); writer.dedent().write("};"); writer.write(""); } } private void writeFilterSensitiveLog(String namespace) { if (sensitiveDataFinder.findsSensitiveDataIn(shape) && !schemaMode) { String objectParam = "obj"; writer.writeDocs("@internal"); writer.openBlock( "export const $LFilterSensitiveLog = ($L: $L): any => {", "}", namespace, objectParam, symbol.getName(), () -> { for (MemberShape member : shape.getAllMembers().values()) { String memberName = symbolProvider.toMemberName(member); StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter( model, closure, symbolProvider, shape.getAllMembers().values(), RequiredMemberMode.NULLABLE, sensitiveDataFinder ); writer.writeInline( """ if (${1L}.${2L} !== undefined) { return { ${2L}:\s""", objectParam, memberName ); String memberParam = String.format("%s.%s", objectParam, memberName); writer.indent(2); structuredMemberWriter.writeMemberFilterSensitiveLog(writer, member, memberParam); writer.dedent(1); writer.write("};"); writer.dedent(1); writer.write("}"); } writer.write( "if (${1L}.$$unknown !== undefined) return { [${1L}.$$unknown[0]]: \"UNKNOWN\" };", objectParam ); } ); } } private void writeValidate() { StructuredMemberWriter structuredMemberWriter = new StructuredMemberWriter( model, closure, symbolProvider, shape.getAllMembers().values(), RequiredMemberMode.NULLABLE, sensitiveDataFinder ); structuredMemberWriter.writeMemberValidatorCache(writer, "memberValidators"); writer.addImport("ValidationFailure", "__ValidationFailure", TypeScriptDependency.SERVER_COMMON); writer.writeDocs("@internal"); writer.openBlock( "export const validate = ($L: $L, path: string = \"\"): __ValidationFailure[] => {", "}", "obj", symbol.getName(), () -> { structuredMemberWriter.writeMemberValidatorFactory(writer, "memberValidators"); structuredMemberWriter.writeValidateMethodContents(writer, "obj"); } ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/UnresolvableProtocolException.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public class UnresolvableProtocolException extends CodegenException { public UnresolvableProtocolException(String message) { super(message); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/WaiterGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.jmespath.JmespathExpression; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.waiters.Acceptor; import software.amazon.smithy.waiters.AcceptorState; import software.amazon.smithy.waiters.Matcher; import software.amazon.smithy.waiters.PathMatcher; import software.amazon.smithy.waiters.WaitableTrait; import software.amazon.smithy.waiters.Waiter; @SmithyInternalApi class WaiterGenerator implements Runnable { static final String WAITERS_FOLDER = "waiters"; static final String WAITER_SUBMODULE = SmithyCoreSubmodules.CLIENT; private final String waiterName; private final Waiter waiter; private final TypeScriptWriter writer; private final Symbol serviceSymbol; private final Symbol operationSymbol; private final Symbol inputSymbol; private final Symbol outputSymbol; private final String waiterResultType; private final String waitUntilResultType; WaiterGenerator( String waiterName, Waiter waiter, ServiceShape service, OperationShape operation, TypeScriptWriter writer, SymbolProvider symbolProvider, TypeScriptSettings settings, Model model ) { this.waiterName = waiterName; this.waiter = waiter; this.writer = writer; this.operationSymbol = symbolProvider.toSymbol(operation); this.serviceSymbol = symbolProvider.toSymbol(service) .toBuilder() .putProperty("typeOnly", true) .build(); this.inputSymbol = operationSymbol.expectProperty("inputType", Symbol.class); this.outputSymbol = operationSymbol.expectProperty("outputType", Symbol.class); String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String syntheticBaseExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); writer.addRelativeTypeImport( syntheticBaseExceptionName, null, Path.of(".", "src", "models", syntheticBaseExceptionName) ); waiterResultType = outputSymbol.getName() + " | " + syntheticBaseExceptionName; waitUntilResultType = computeWaitUntilResultType( waiter, outputSymbol.getName(), syntheticBaseExceptionName, settings, model, symbolProvider, writer ); } @Override public void run() { writer.addDependency(TypeScriptDependency.SMITHY_CORE); this.generateAcceptors(); this.generateWaiter(); } public static String getOutputFileLocation(String waiterName) { return Paths.get(CodegenUtils.SOURCE_FOLDER, WAITERS_FOLDER, "waitFor" + waiterName + ".ts").toString(); } private void generateWaiter() { writer.addImportSubmodule("createWaiter", null, TypeScriptDependency.SMITHY_CORE, WAITER_SUBMODULE); writer.addTypeImportSubmodule("WaiterResult", null, TypeScriptDependency.SMITHY_CORE, WAITER_SUBMODULE); writer.addImportSubmodule("WaiterState", null, TypeScriptDependency.SMITHY_CORE, WAITER_SUBMODULE); writer.addImportSubmodule("checkExceptions", null, TypeScriptDependency.SMITHY_CORE, WAITER_SUBMODULE); writer.addTypeImportSubmodule("WaiterConfiguration", null, TypeScriptDependency.SMITHY_CORE, WAITER_SUBMODULE); // generates (deprecated) WaitFor.... writer.writeDocs( waiter.getDocumentation().orElse("") + " \n" + " @deprecated Use waitUntil" + waiterName + " instead. " + "waitFor" + waiterName + " does not throw error in non-success cases." ); writer.openBlock( """ export const waitFor$L = async ( params: WaiterConfiguration<$T>, input: $T ): Promise> => {""", "};", waiterName, serviceSymbol, inputSymbol, waiterResultType, () -> { writer.write( "const serviceDefaults = { minDelay: $L, maxDelay: $L };", waiter.getMinDelay(), waiter.getMaxDelay() ); writer.write("return createWaiter({ ...serviceDefaults, ...params }, input, checkState);"); } ); // generates WaitUtil.... writer.writeDocs( waiter.getDocumentation().orElse("") + " \n" + " @param params - Waiter configuration options.\n" + " @param input - The input to " + operationSymbol.getName() + " for polling." ); writer.openBlock( """ export const waitUntil$L = async ( params: WaiterConfiguration<$T>, input: $T ): Promise> => {""", "};", waiterName, serviceSymbol, inputSymbol, waitUntilResultType, () -> { writer.write( "const serviceDefaults = { minDelay: $L, maxDelay: $L };", waiter.getMinDelay(), waiter.getMaxDelay() ); writer.write( "const result = await createWaiter({ ...serviceDefaults, ...params }, input, checkState);" ); // as WaiterResult is needed because createWaiter is the union type // whereas checkExceptions narrows to only the success type. writer.write("return checkExceptions(result) as WaiterResult<$L>;", waitUntilResultType); } ); } private void generateAcceptors() { writer.openBlock( "const checkState = async (client: $T, input: $T): Promise> => {", "};", serviceSymbol, inputSymbol, waiterResultType, () -> { writer.write("let reason;"); writer.write("try {").indent(); { writer.write( "let result: $T & any = await client.send(new $T(input));", outputSymbol, operationSymbol ); writer.write("reason = result;"); writeAcceptors("result", false); } writer.dedent().write("} catch (exception) {").indent(); { writer.write("reason = exception;"); writeAcceptors("exception", true); } writer.dedent().write("}"); writer.write("return $L;", makeWaiterResult(AcceptorState.RETRY)); } ); } private void writeAcceptors(String accessor, boolean isException) { waiter .getAcceptors() .forEach((Acceptor acceptor) -> { if (acceptor.getMatcher() instanceof Matcher.SuccessMember) { Matcher.SuccessMember successMember = (Matcher.SuccessMember) acceptor.getMatcher(); if (successMember.getValue() != isException) { generateSuccessMatcher(successMember, acceptor.getState()); } } else if (acceptor.getMatcher() instanceof Matcher.ErrorTypeMember) { if (isException) { generateErrorMatcher( accessor, (Matcher.ErrorTypeMember) acceptor.getMatcher(), acceptor.getState() ); } } else if (acceptor.getMatcher() instanceof Matcher.InputOutputMember) { if (!isException) { Matcher.InputOutputMember member = (Matcher.InputOutputMember) acceptor.getMatcher(); generatePathMatcher(accessor, member.getValue(), acceptor.getState()); generatePathMatcher("input", member.getValue(), acceptor.getState()); } } else if (acceptor.getMatcher() instanceof Matcher.OutputMember) { if (!isException) { Matcher.OutputMember member = (Matcher.OutputMember) acceptor.getMatcher(); generatePathMatcher(accessor, member.getValue(), acceptor.getState()); } } else { throw new CodegenException( "Unknown matcher member name: " + acceptor.getMatcher().getMemberName() ); } }); } private void generateSuccessMatcher(Matcher.SuccessMember member, AcceptorState state) { writer.write("return $L;", makeWaiterResult(state)); } private void generateErrorMatcher(String accessor, Matcher.ErrorTypeMember member, AcceptorState state) { writer.openBlock("if ($L.name === $S) {", "}", accessor, member.getValue(), () -> { writer.write("return $L;", makeWaiterResult(state)); }); } private void generatePathMatcher(String accessor, PathMatcher pathMatcher, AcceptorState state) { writer.openBlock("try {", "} catch (e) {}", () -> { JmespathExpression expression = JmespathExpression.parse(pathMatcher.getPath()); TypeScriptJmesPathVisitor expressionVisitor = new TypeScriptJmesPathVisitor(writer, accessor, expression); String expectedState = makeWaiterResult(state); expressionVisitor.run(); switch (pathMatcher.getComparator()) { case ALL_STRING_EQUALS: expressionVisitor.writeAllStringEqualsExpectation(pathMatcher.getExpected(), expectedState); break; case ANY_STRING_EQUALS: expressionVisitor.writeAnyStringEqualsExpectation(pathMatcher.getExpected(), expectedState); break; case STRING_EQUALS: expressionVisitor.writeStringExpectation(pathMatcher.getExpected(), expectedState); break; case BOOLEAN_EQUALS: expressionVisitor.writeBooleanExpectation(pathMatcher.getExpected(), expectedState); break; default: throw new CodegenException("Invalid Matcher Comparator"); } }); } private String makeWaiterResult(AcceptorState resultantState) { if (resultantState == AcceptorState.SUCCESS) { return "{ state: WaiterState.SUCCESS, reason }"; } else if (resultantState == AcceptorState.FAILURE) { return "{ state: WaiterState.FAILURE, reason }"; } else if (resultantState == AcceptorState.RETRY) { return "{ state: WaiterState.RETRY, reason }"; } throw new CodegenException("Hit an invalid acceptor state to codegen " + resultantState.toString()); } private static String getModulePath(String fileLocation) { return fileLocation.substring(fileLocation.lastIndexOf("/") + 1, fileLocation.length()).replace(".ts", ""); } /** * Determines the narrowest result type for waitUntil based on which acceptors * produce a SUCCESS state. * * - If success only comes from successful responses: OutputType only. * - If success only comes from errors: the specific modeled exception if there * is exactly one ErrorType success acceptor matching a modeled error, otherwise * the synthetic base exception. * - If success can come from both: OutputType | exception type. */ static String computeWaitUntilResultType( Waiter waiter, String outputTypeName, String exceptionTypeName, TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { boolean waiterSuccessTerminalOnSuccessfulResponse = false; boolean waiterSuccessTerminalOnErrorResponse = false; Set successErrorTypeNames = new TreeSet<>(); for (Acceptor acceptor : waiter.getAcceptors()) { if (acceptor.getState() != AcceptorState.SUCCESS) { continue; } Matcher matcher = acceptor.getMatcher(); if (matcher instanceof Matcher.SuccessMember successMember) { if (successMember.getValue()) { waiterSuccessTerminalOnSuccessfulResponse = true; } else { waiterSuccessTerminalOnErrorResponse = true; } } else if (matcher instanceof Matcher.ErrorTypeMember errorTypeMember) { waiterSuccessTerminalOnErrorResponse = true; successErrorTypeNames.add(errorTypeMember.getValue()); } else if ( matcher instanceof Matcher.OutputMember || matcher instanceof Matcher.InputOutputMember ) { waiterSuccessTerminalOnSuccessfulResponse = true; } } String resolvedExceptionType = exceptionTypeName; if (successErrorTypeNames.size() == 1) { String errorName = successErrorTypeNames.iterator().next(); boolean errorTypeQualifiedName = errorName.contains("#"); // Check if this error is a modeled error shape on the operation. resolvedExceptionType = ServiceClosure.of(model, settings.getService(model)) .getErrorShapes() .stream() .filter( shape -> errorTypeQualifiedName ? ShapeId.from(errorName).equals(shape.getId()) : shape.getId().getName().equals(errorName) ) .findFirst() .map(shape -> { String typeName = symbolProvider.toSymbol(shape).getName(); writer.addRelativeTypeImport( typeName, null, Path.of(".", "src", "models", "errors") ); return typeName; }) .orElse(exceptionTypeName); } if (waiterSuccessTerminalOnSuccessfulResponse && waiterSuccessTerminalOnErrorResponse) { return outputTypeName + " | " + resolvedExceptionType; } else if (waiterSuccessTerminalOnErrorResponse) { return resolvedExceptionType; } return outputTypeName; } static void writeIndex(Model model, ServiceShape service, FileManifest fileManifest) { TypeScriptWriter writer = new TypeScriptWriter(""); TopDownIndex topDownIndex = TopDownIndex.of(model); Set containedOperations = new TreeSet<>(topDownIndex.getContainedOperations(service)); for (OperationShape operation : containedOperations) { if (operation.hasTrait(WaitableTrait.ID)) { WaitableTrait waitableTrait = operation.expectTrait(WaitableTrait.class); waitableTrait .getWaiters() .forEach((String waiterName, Waiter waiter) -> { String outputFilepath = WaiterGenerator.getOutputFileLocation(waiterName); writer.write("export * from \"./$L\";", getModulePath(outputFilepath)); }); } } fileManifest.writeFile( Paths.get(CodegenUtils.SOURCE_FOLDER, WAITERS_FOLDER, "index.ts").toString(), writer.toString() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/AuthUtils.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth; import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.ServiceIndex.AuthSchemeMode; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthSchemeParameter; import software.amazon.smithy.typescript.codegen.auth.http.ResolveConfigFunction; import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex; import software.amazon.smithy.utils.SmithyInternalApi; /** * Auth utility methods needed across Java packages. */ @SmithyInternalApi public final class AuthUtils { public static final String HTTP_AUTH_FOLDER = "auth"; public static final String HTTP_AUTH_SCHEME_PROVIDER_MODULE = Paths.get( ".", CodegenUtils.SOURCE_FOLDER, HTTP_AUTH_FOLDER, "httpAuthSchemeProvider" ).toString(); public static final String HTTP_AUTH_SCHEME_PROVIDER_PATH = HTTP_AUTH_SCHEME_PROVIDER_MODULE + ".ts"; public static final Dependency AUTH_HTTP_PROVIDER_DEPENDENCY = new Dependency() { @Override public String getPackageName() { return HTTP_AUTH_SCHEME_PROVIDER_MODULE; } @Override public List getDependencies() { return Collections.emptyList(); } }; public static final String HTTP_AUTH_SCHEME_EXTENSION_MODULE = Paths.get( ".", CodegenUtils.SOURCE_FOLDER, HTTP_AUTH_FOLDER, "httpAuthExtensionConfiguration" ).toString(); public static final String HTTP_AUTH_SCHEME_EXTENSION_PATH = HTTP_AUTH_SCHEME_EXTENSION_MODULE + ".ts"; public static final Dependency AUTH_HTTP_EXTENSION_DEPENDENCY = new Dependency() { @Override public String getPackageName() { return HTTP_AUTH_SCHEME_EXTENSION_MODULE; } @Override public List getDependencies() { return Collections.emptyList(); } }; private AuthUtils() {} public static Map getAllEffectiveNoAuthAwareAuthSchemes( ServiceShape serviceShape, ServiceIndex serviceIndex, SupportedHttpAuthSchemesIndex authIndex, TopDownIndex topDownIndex ) { Map effectiveAuthSchemes = new TreeMap<>(); var serviceEffectiveAuthSchemes = serviceIndex.getEffectiveAuthSchemes( serviceShape, AuthSchemeMode.NO_AUTH_AWARE ); for (ShapeId shapeId : serviceEffectiveAuthSchemes.keySet()) { effectiveAuthSchemes.put(shapeId, authIndex.getHttpAuthScheme(shapeId)); } for (var operation : topDownIndex.getContainedOperations(serviceShape)) { var operationEffectiveAuthSchemes = serviceIndex.getEffectiveAuthSchemes( serviceShape, operation, AuthSchemeMode.NO_AUTH_AWARE ); for (ShapeId shapeId : operationEffectiveAuthSchemes.keySet()) { effectiveAuthSchemes.put(shapeId, authIndex.getHttpAuthScheme(shapeId)); } } // TODO(experimentalIdentityAndAuth): remove after @aws.auth#sigv4a is fully supported // BEGIN HttpAuthScheme effectiveSigv4Scheme = effectiveAuthSchemes.get(ShapeId.from("aws.auth#sigv4")); HttpAuthScheme effectiveSigv4aScheme = effectiveAuthSchemes.get(ShapeId.from("aws.auth#sigv4a")); HttpAuthScheme supportedSigv4aScheme = authIndex.getHttpAuthScheme(ShapeId.from("aws.auth#sigv4a")); if (effectiveSigv4Scheme != null && effectiveSigv4aScheme == null && supportedSigv4aScheme != null) { effectiveAuthSchemes.put(supportedSigv4aScheme.getSchemeId(), supportedSigv4aScheme); } // END return effectiveAuthSchemes; } public static Map collectConfigFields(Collection httpAuthSchemes) { Map configFields = new HashMap<>(); for (HttpAuthScheme authScheme : httpAuthSchemes) { if (authScheme == null) { continue; } for (ConfigField configField : authScheme.getConfigFields()) { if (configFields.containsKey(configField.name())) { ConfigField existingConfigField = configFields.get(configField.name()); if (!configField.equals(existingConfigField)) { throw new CodegenException( "Contradicting `ConfigField` definitions for `" + configField.name() + "`; existing: " + existingConfigField + ", conflict: " + configField ); } } else { configFields.put(configField.name(), configField); } } } return configFields; } public static Map collectResolveConfigFunctions( Collection httpAuthSchemes ) { Map resolveConfigFunctions = new HashMap<>(); for (HttpAuthScheme authScheme : httpAuthSchemes) { if (authScheme == null) { continue; } for (ResolveConfigFunction fn : authScheme.getResolveConfigFunctions()) { if (resolveConfigFunctions.containsKey(fn.resolveConfigFunction())) { ResolveConfigFunction existingFn = resolveConfigFunctions.get(fn.resolveConfigFunction()); if (!fn.equals(existingFn)) { throw new CodegenException( "Contradicting `ResolveConfigFunction` definitions for `" + fn.resolveConfigFunction() + "`; existing: " + existingFn + ", conflict: " + fn ); } } else { resolveConfigFunctions.put(fn.resolveConfigFunction(), fn); } } } return resolveConfigFunctions; } public static Map collectHttpAuthSchemeParameters( Collection httpAuthSchemes ) { Map httpAuthSchemeParameters = new HashMap<>(); for (HttpAuthScheme authScheme : httpAuthSchemes) { if (authScheme == null) { continue; } for (HttpAuthSchemeParameter param : authScheme.getHttpAuthSchemeParameters()) { if (httpAuthSchemeParameters.containsKey(param.name())) { HttpAuthSchemeParameter existingParam = httpAuthSchemeParameters.get(param.name()); if (!param.equals(existingParam)) { throw new CodegenException( "Contradicting `HttpAuthSchemeParameter` definitions for `" + param.name() + "`; existing: " + existingParam + ", conflict: " + param ); } } else { httpAuthSchemeParameters.put(param.name(), param); } } } return httpAuthSchemeParameters; } public static boolean areHttpAuthSchemesEqual( Map httpAuthSchemes1, Map httpAuthSchemes2 ) { if (httpAuthSchemes1.size() != httpAuthSchemes2.size()) { return false; } var iter1 = httpAuthSchemes1.entrySet().iterator(); var iter2 = httpAuthSchemes2.entrySet().iterator(); while (iter1.hasNext() && iter2.hasNext()) { var entry1 = iter1.next(); var entry2 = iter2.next(); if (!entry1.equals(entry2)) { return false; } } return true; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/ConfigField.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.ToSmithyBuilder; /** * Definition of a Config field. * * Currently used to populate the ClientDefaults interface. * * @param name name of the config field * @param type whether the config field is main or auxiliary * @param inputType writer for the input type of the config field * @param resolvedType writer for the resolved type of the config field * @param docs writer for the docs of the config field */ @SmithyUnstableApi public record ConfigField( String name, Type type, Symbol inputType, Symbol resolvedType, Optional> configFieldWriter, Optional> docs ) implements ToSmithyBuilder { /** * Defines the type of the config field. */ @SmithyUnstableApi public enum Type { /** * Specifies the property is important, e.g. {@code apiKey} for {@code @httpApiKeyAuth} */ MAIN, /** * Specifies the property is auxiliary, e.g. {@code region} for {@code @aws.auth#sigv4} */ AUXILIARY, } public static Builder builder() { return new Builder(); } @Override public Builder toBuilder() { return builder() .name(name) .type(type) .inputType(inputType) .resolvedType(resolvedType) .configFieldWriter(configFieldWriter.orElse(null)) .docs(docs.orElse(null)); } public static final class Builder implements SmithyBuilder { private String name; private Type type; private Symbol inputType; private Symbol resolvedType; private Consumer docs; private BiConsumer configFieldWriter; @Override public ConfigField build() { return new ConfigField( SmithyBuilder.requiredState("name", name), SmithyBuilder.requiredState("type", type), SmithyBuilder.requiredState("inputType", inputType), SmithyBuilder.requiredState("resolvedType", resolvedType), Optional.ofNullable(configFieldWriter), Optional.ofNullable(docs) ); } public Builder name(String name) { this.name = name; return this; } public Builder type(Type type) { this.type = type; return this; } public Builder inputType(Symbol inputType) { this.inputType = inputType; return this; } public Builder resolvedType(Symbol resolvedType) { this.resolvedType = resolvedType; return this; } public Builder docs(Consumer docs) { this.docs = docs; return this; } public Builder configFieldWriter(BiConsumer configFieldWriter) { this.configFieldWriter = configFieldWriter; return this; } } @SmithyInternalApi public static void defaultMainConfigFieldWriter(TypeScriptWriter w, ConfigField configField) { w.addDependency(TypeScriptDependency.SMITHY_CORE); w.addImport("memoizeIdentityProvider", null, TypeScriptDependency.SMITHY_CORE); w.addImport("isIdentityExpired", null, TypeScriptDependency.SMITHY_CORE); w.addImport("doesIdentityRequireRefresh", null, TypeScriptDependency.SMITHY_CORE); w.write( """ const $L = memoizeIdentityProvider(config.$L, isIdentityExpired, \ doesIdentityRequireRefresh);""", configField.name(), configField.name() ); } @SmithyInternalApi public static void defaultAuxiliaryConfigFieldWriter(TypeScriptWriter w, ConfigField configField) { w.addDependency(TypeScriptDependency.SMITHY_CORE); w.addImportSubmodule("normalizeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); w.write( "const $L = config.$L ? normalizeProvider(config.$L) : undefined;", configField.name(), configField.name(), configField.name() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/HttpAuthOptionProperty.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.function.Consumer; import java.util.function.Function; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.ToSmithyBuilder; /** * Definition of an HttpAuthOptionProperty. * * @param name name of the auth option property * @param type the type of {@link Type} * @param source a function that provides the auth trait to a writer, and writes * properties from the trait or from {@code authParameters}. */ @SmithyUnstableApi public record HttpAuthOptionProperty( String name, Type type, Function> source ) implements ToSmithyBuilder { /** * Defines the type of the auth option property. */ public enum Type { /** * Specifies the property should be included in {@code identityProperties}. */ IDENTITY, /** * Specifies the property should be included in {@code signingProperties}. */ SIGNING, } public record Source(HttpAuthScheme httpAuthScheme, Trait trait) implements ToSmithyBuilder { public static Builder builder() { return new Builder(); } @Override public Builder toBuilder() { return builder().httpAuthScheme(httpAuthScheme).trait(trait); } public static final class Builder implements SmithyBuilder { HttpAuthScheme httpAuthScheme; Trait trait; @Override public Source build() { return new Source( SmithyBuilder.requiredState("httpAuthScheme", httpAuthScheme), SmithyBuilder.requiredState("trait", trait) ); } public Builder httpAuthScheme(HttpAuthScheme httpAuthScheme) { this.httpAuthScheme = httpAuthScheme; return this; } public Builder trait(Trait trait) { this.trait = trait; return this; } } } public static Builder builder() { return new Builder(); } @Override public Builder toBuilder() { return builder().name(name).type(type).source(source); } public static final class Builder implements SmithyBuilder { private String name; private Type type; private Function> source; @Override public HttpAuthOptionProperty build() { return new HttpAuthOptionProperty( SmithyBuilder.requiredState("name", name), SmithyBuilder.requiredState("type", type), SmithyBuilder.requiredState("source", source) ); } public Builder name(String name) { this.name = name; return this; } public Builder type(Type type) { this.type = type; return this; } public Builder source(Function> source) { this.source = source; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/HttpAuthScheme.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Consumer; import java.util.function.Function; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthOptionProperty.Type; import software.amazon.smithy.utils.BuilderRef; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.ToSmithyBuilder; /** * Defines an HttpAuthScheme used in code generation. * * HttpAuthScheme defines everything needed to generate an HttpAuthSchemeProvider, * HttpAuthOptions, and registered HttpAuthSchemes in the IdentityProviderConfiguration. */ @SmithyUnstableApi public final class HttpAuthScheme implements ToSmithyBuilder { private final ShapeId schemeId; private final ShapeId traitId; private final ApplicationProtocol applicationProtocol; private final Map> defaultIdentityProviders; private final Map> defaultSigners; private final List configFields; private final List resolveConfigFunctions; private final List httpAuthSchemeParameters; private final List httpAuthOptionProperties; private final Function> propertiesExtractor; private HttpAuthScheme(Builder builder) { this.schemeId = SmithyBuilder.requiredState("schemeId", builder.schemeId); this.traitId = builder.traitId != null ? builder.traitId : schemeId; this.applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); this.defaultIdentityProviders = SmithyBuilder.requiredState( "defaultIdentityProviders", builder.defaultIdentityProviders.copy() ); this.defaultSigners = SmithyBuilder.requiredState("defaultSigners", builder.defaultSigners.copy()); this.configFields = SmithyBuilder.requiredState("configFields", builder.configFields.copy()); this.resolveConfigFunctions = SmithyBuilder.requiredState( "resolveConfigFunctions", builder.resolveConfigFunctions.copy() ); this.httpAuthSchemeParameters = SmithyBuilder.requiredState( "httpAuthSchemeParameters", builder.httpAuthSchemeParameters.copy() ); this.httpAuthOptionProperties = SmithyBuilder.requiredState( "httpAuthOptionProperties", builder.httpAuthOptionProperties.copy() ); this.propertiesExtractor = builder.propertiesExtractor; } /** * Gets the scheme ID. * @return schemeId */ public ShapeId getSchemeId() { return schemeId; } /** * Gets the trait ID. * @return traitId */ public ShapeId getTraitId() { return traitId; } /** * Gets the application protocol. * @return applicationProtocol */ public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } /** * Gets the map of default {@code IdentityProvider}s for an auth scheme. * @return defaultIdentityProviders */ public Map> getDefaultIdentityProviders() { return defaultIdentityProviders; } /** * Gets the map of default {@code HttpSigner}s for an auth scheme. * @return defaultSigners */ public Map> getDefaultSigners() { return defaultSigners; } /** * Gets the list of config fields for an auth scheme. * @return configFields */ public List getConfigFields() { return configFields; } public List getResolveConfigFunctions() { return resolveConfigFunctions; } /** * Gets the list of auth scheme parameters for an auth scheme. * @return httpAuthSchemeParameters */ public List getHttpAuthSchemeParameters() { return httpAuthSchemeParameters; } /** * Gets the list of auth option properties for an auth scheme. * @return httpAuthOptionProperties */ public List getHttpAuthOptionProperties() { return httpAuthOptionProperties; } /** * Gets the list of auth option properties by type for an auth scheme. * @param type type of auth option property * @return httpAuthOptionProperties filtered by type */ public List getHttpAuthSchemeOptionParametersByType(Type type) { return httpAuthOptionProperties .stream() .filter(p -> p.type().equals(type)) .toList(); } /** * Gets the writer for the config properties extractor. * @return optional of config properties extractor */ public Optional>> getPropertiesExtractor() { return Optional.ofNullable(propertiesExtractor); } /** * Creates a {@link Builder}. * @return a builder */ public static Builder builder() { return new Builder(); } /** * Converts an HttpAuthScheme to a {@link Builder}. * @return a builder */ @Override public Builder toBuilder() { return builder() .schemeId(schemeId) .traitId(traitId) .applicationProtocol(applicationProtocol) .defaultIdentityProviders(defaultIdentityProviders) .defaultSigners(defaultSigners) .configFields(configFields) .resolveConfigFunctions(resolveConfigFunctions) .httpAuthSchemeParameters(httpAuthSchemeParameters) .httpAuthOptionProperties(httpAuthOptionProperties) .propertiesExtractor(propertiesExtractor); } /** * Builder for {@link HttpAuthScheme}. */ public static final class Builder implements SmithyBuilder { private ShapeId schemeId; private ShapeId traitId; private ApplicationProtocol applicationProtocol; private BuilderRef>> defaultIdentityProviders = BuilderRef.forOrderedMap(); private BuilderRef>> defaultSigners = BuilderRef.forOrderedMap(); private BuilderRef> configFields = BuilderRef.forList(); private BuilderRef> resolveConfigFunctions = BuilderRef.forList(); private BuilderRef> httpAuthSchemeParameters = BuilderRef.forList(); private BuilderRef> httpAuthOptionProperties = BuilderRef.forList(); private Function> propertiesExtractor; private Builder() {} @Override public HttpAuthScheme build() { return new HttpAuthScheme(this); } /** * Sets the schemeId. * @param schemeId scheme ID to set * @return the builder */ public Builder schemeId(ShapeId schemeId) { this.schemeId = schemeId; return this; } /** * Sets the traitId. * @param traitId trait ID to set * @return the builder */ public Builder traitId(ShapeId traitId) { this.traitId = traitId; return this; } /** * Sets the applicationProtocol. * @param applicationProtocol application protocol to set * @return the builder */ public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } /** * Sets the defaultIdentityProviders. * @param defaultIdentityProviders IdentityProviders to set * @return the builder */ public Builder defaultIdentityProviders( Map> defaultIdentityProviders ) { this.defaultIdentityProviders.clear(); this.defaultIdentityProviders.get().putAll(defaultIdentityProviders); return this; } /** * Puts a single default identityProvider for a language target. * @param languageTarget target to add identityProvider to * @param identityProvider identityProvider to add * @return the builder */ public Builder putDefaultIdentityProvider( LanguageTarget languageTarget, Consumer identityProvider ) { this.defaultIdentityProviders.get().put(languageTarget, identityProvider); return this; } /** * Removes a single default identityProvider for a language target. * @param languageTarget target to remove the identityProvider from * @return the builder */ public Builder removeDefaultIdentityProvider(LanguageTarget languageTarget) { this.defaultIdentityProviders.get().remove(languageTarget); return this; } /** * Sets the defaultSigners. * @param defaultSigners HttpSigners to set * @return the builder */ public Builder defaultSigners(Map> defaultSigners) { this.defaultSigners.clear(); this.defaultSigners.get().putAll(defaultSigners); return this; } /** * Puts a single default signer for a language target. * @param languageTarget target to add signer to * @param signer signer to add * @return the builder */ public Builder putDefaultSigner(LanguageTarget languageTarget, Consumer signer) { this.defaultSigners.get().put(languageTarget, signer); return this; } /** * Removes a single default signer for a language target. * @param languageTarget target to remove the signer from * @return the builder */ public Builder removeDefaultSigner(LanguageTarget languageTarget) { this.defaultSigners.get().remove(languageTarget); return this; } /** * Sets the configFields. * @param configFields config fields to set * @return the builder */ public Builder configFields(List configFields) { this.configFields.clear(); this.configFields.get().addAll(configFields); return this; } /** * Adds a config field. * @param configField config field to add * @return the builder */ public Builder addConfigField(ConfigField configField) { this.configFields.get().add(configField); return this; } /** * Removes a config field by name. * @param configField name of the config field to remove * @return the builder */ public Builder removeConfigField(String configField) { this.configFields.get().removeIf(c -> c.name().equals(configField)); return this; } public Builder resolveConfigFunctions(List resolveConfigFunctions) { this.resolveConfigFunctions.clear(); this.resolveConfigFunctions.get().addAll(resolveConfigFunctions); return this; } public Builder addResolveConfigFunction(ResolveConfigFunction resolveConfigFunction) { this.resolveConfigFunctions.get().add(resolveConfigFunction); return this; } public Builder removeResolveConfigFunction(Symbol resolveConfigFunction) { this.resolveConfigFunctions.get().removeIf(c -> c.resolveConfigFunction().equals(resolveConfigFunction)); return this; } /** * Sets the httpAuthSchemeParameters. * @param httpAuthSchemeParameters auth scheme parameters to set * @return the builder */ public Builder httpAuthSchemeParameters(List httpAuthSchemeParameters) { this.httpAuthSchemeParameters.clear(); this.httpAuthSchemeParameters.get().addAll(httpAuthSchemeParameters); return this; } /** * Adds an auth scheme parameter. * @param httpAuthSchemeParameter parameter to add * @return the builder */ public Builder addHttpAuthSchemeParameter(HttpAuthSchemeParameter httpAuthSchemeParameter) { this.httpAuthSchemeParameters.get().add(httpAuthSchemeParameter); return this; } /** * Removes an auth scheme parameter by name. * @param httpAuthSchemeParameter name of the auth scheme parameter to remove * @return the builder */ public Builder removeHttpAuthSchemeParameter(String httpAuthSchemeParameter) { this.httpAuthSchemeParameters.get().removeIf(p -> p.name().equals(httpAuthSchemeParameter)); return this; } /** * Sets the httpAuthOptionProperties. * @param httpAuthOptionProperties properties to set * @return the builder */ public Builder httpAuthOptionProperties(List httpAuthOptionProperties) { this.httpAuthOptionProperties.clear(); this.httpAuthOptionProperties.get().addAll(httpAuthOptionProperties); return this; } /** * Adds an auth option property. * @param httpAuthOptionProperty property to add * @return the builder */ public Builder addHttpAuthOptionProperty(HttpAuthOptionProperty httpAuthOptionProperty) { this.httpAuthOptionProperties.get().add(httpAuthOptionProperty); return this; } /** * Removes an auth option property. * @param httpAuthOptionProperty name of the auth option property to remove * @return the builder */ public Builder removeHttpAuthOptionProperty(String httpAuthOptionProperty) { this.httpAuthOptionProperties.get().removeIf(p -> p.name().equals(httpAuthOptionProperty)); return this; } /** * Sets the propertiesExtractor. * @param propertiesExtractor writer for properties extractor * @return the builder */ public Builder propertiesExtractor(Function> propertiesExtractor) { this.propertiesExtractor = propertiesExtractor; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/HttpAuthSchemeParameter.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.function.Consumer; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.ToSmithyBuilder; /** * Definition of an HttpAuthSchemeParameter. * * Currently this is used to generate the the HttpAuthSchemeParameters interface. * * @param name name of the auth scheme parameter * @param type writer for the type of the auth scheme parameter * @param source writer for the value of the auth scheme parameter, typically from {@code context} or {@code config} */ @SmithyUnstableApi public record HttpAuthSchemeParameter( String name, Consumer type, Consumer source ) implements ToSmithyBuilder { public static Builder builder() { return new Builder(); } @Override public SmithyBuilder toBuilder() { return builder().name(name).type(type).source(source); } public static final class Builder implements SmithyBuilder { private String name; private Consumer type; private Consumer source; @Override public HttpAuthSchemeParameter build() { return new HttpAuthSchemeParameter( SmithyBuilder.requiredState("name", name), SmithyBuilder.requiredState("type", type), SmithyBuilder.requiredState("source", source) ); } public Builder name(String name) { this.name = name; return this; } public Builder type(Consumer type) { this.type = type; return this; } public Builder source(Consumer source) { this.source = source; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/HttpAuthSchemeProviderGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.nio.file.Paths; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.ServiceIndex.AuthSchemeMode; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.ServiceBareBonesClientGenerator; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDelegator; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.AuthUtils; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthOptionProperty.Type; import software.amazon.smithy.typescript.codegen.auth.http.sections.DefaultHttpAuthSchemeParametersProviderFunctionCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.DefaultHttpAuthSchemeProviderFunctionCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthOptionFunctionCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthOptionFunctionsCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthSchemeParametersInterfaceCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthSchemeParametersProviderInterfaceCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthSchemeProviderInterfaceCodeSection; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * Generator for {@code HttpAuthSchemeProvider} and corresponding interfaces. * * Code generated includes: * * - {@code $ServiceHttpAuthSchemeParameters} * - {@code default$ServiceHttpAuthSchemeParametersProvider} * - {@code create$AuthSchemeIdHttpAuthOption} * - {@code $ServiceHttpAuthSchemeProvider} * - {@code default$ServiceHttpAuthSchemeProvider} */ @SmithyInternalApi public class HttpAuthSchemeProviderGenerator implements Runnable { private final TypeScriptDelegator delegator; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final SupportedHttpAuthSchemesIndex authIndex; private final ServiceIndex serviceIndex; private final TopDownIndex topDownIndex; private final ServiceShape serviceShape; private final Symbol serviceSymbol; private final String serviceName; private final Map effectiveHttpAuthSchemes; private final Map httpAuthSchemeParameters; /** * Create an HttpAuthSchemeProviderGenerator. * @param delegator delegator * @param settings settings * @param model model * @param symbolProvider symbolProvider * @param integrations integrations */ public HttpAuthSchemeProviderGenerator( TypeScriptDelegator delegator, TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, List integrations ) { this.delegator = delegator; this.settings = settings; this.model = model; this.symbolProvider = symbolProvider; this.integrations = integrations; this.authIndex = new SupportedHttpAuthSchemesIndex(integrations, model, settings); this.serviceIndex = ServiceIndex.of(model); this.topDownIndex = TopDownIndex.of(model); this.serviceShape = settings.getService(model); this.serviceSymbol = symbolProvider.toSymbol(serviceShape); this.serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); this.effectiveHttpAuthSchemes = AuthUtils.getAllEffectiveNoAuthAwareAuthSchemes( serviceShape, serviceIndex, authIndex, topDownIndex ); this.httpAuthSchemeParameters = AuthUtils.collectHttpAuthSchemeParameters(effectiveHttpAuthSchemes.values()); } @Override public void run() { generateHttpAuthSchemeParametersInterface(); generateHttpAuthSchemeParametersProviderInterface(); generateDefaultHttpAuthSchemeParametersProviderFunction(); generateHttpAuthOptionFunctions(); generateHttpAuthSchemeProviderInterface(); generateDefaultHttpAuthSchemeProviderFunction(); } /* import { HttpAuthSchemeParameters } from "@smithy/types"; // ... export interface WeatherHttpAuthSchemeParameters extends HttpAuthSchemeParameters { } */ private void generateHttpAuthSchemeParametersInterface() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( HttpAuthSchemeParametersInterfaceCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .httpAuthSchemeParameters(httpAuthSchemeParameters) .build() ); w.addTypeImport("HttpAuthSchemeParameters", null, TypeScriptDependency.SMITHY_TYPES); w.openCollapsibleBlock( """ /** * @internal */ export interface $LHttpAuthSchemeParameters extends HttpAuthSchemeParameters {""", "}", !httpAuthSchemeParameters.isEmpty(), serviceName, () -> { for (HttpAuthSchemeParameter parameter : httpAuthSchemeParameters.values()) { w.write("$L?: $C;", parameter.name(), parameter.type()); } } ); w.popState(); }); } /* import { HttpAuthSchemeParametersProvider } from "@smithy/types"; import { WeatherClientResolvedConfig } from "../WeatherClient"; // ... export interface WeatherHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< WeatherClientResolvedConfig, HandlerExecutionContext, WeatherHttpAuthSchemeParameters, object > {} */ private void generateHttpAuthSchemeParametersProviderInterface() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( HttpAuthSchemeParametersProviderInterfaceCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .build() ); w.addRelativeTypeImport( serviceSymbol.getName() + "ResolvedConfig", null, Paths.get(".", serviceSymbol.getNamespace()) ); w.addTypeImport("HttpAuthSchemeParametersProvider", null, TypeScriptDependency.SMITHY_TYPES); w.addTypeImport("HandlerExecutionContext", null, TypeScriptDependency.SMITHY_TYPES); w.write( """ /** * @internal */ export interface $LHttpAuthSchemeParametersProvider extends HttpAuthSchemeParametersProvider< $LResolvedConfig, HandlerExecutionContext, $LHttpAuthSchemeParameters, object > {}""", serviceName, serviceSymbol.getName(), serviceName ); w.popState(); }); } /* export const defaultWeatherHttpAuthSchemeParametersProvider = async (config: WeatherClientResolvedConfig, context: HandlerExecutionContext, input: object): Promise => { return { operation: getSmithyContext(context).operation as string, }; }; */ private void generateDefaultHttpAuthSchemeParametersProviderFunction() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( DefaultHttpAuthSchemeParametersProviderFunctionCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .httpAuthSchemeParameters(httpAuthSchemeParameters) .build() ); w.addRelativeTypeImport( serviceSymbol.getName() + "ResolvedConfig", null, Paths.get(".", serviceSymbol.getNamespace()) ); w.addTypeImport("HandlerExecutionContext", null, TypeScriptDependency.SMITHY_TYPES); w.addDependency(TypeScriptDependency.SMITHY_CORE); w.addImportSubmodule( "getSmithyContext", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); w.openBlock( """ /** * @internal */ export const default$LHttpAuthSchemeParametersProvider = async ( config: $LResolvedConfig, context: HandlerExecutionContext, input: object ): Promise<$LHttpAuthSchemeParameters> => {""", "};", serviceName, serviceSymbol.getName(), serviceName, () -> { w.openBlock("return {", "};", () -> { w.write("operation: getSmithyContext(context).operation as string,"); for (HttpAuthSchemeParameter parameter : httpAuthSchemeParameters.values()) { w.write("$L: $C,", parameter.name(), parameter.source()); } }); } ); w.popState(); }); } private void generateHttpAuthOptionFunctions() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( HttpAuthOptionFunctionsCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .effectiveHttpAuthSchemes(effectiveHttpAuthSchemes) .build() ); for (Entry entry : effectiveHttpAuthSchemes.entrySet()) { generateHttpAuthOptionFunction( w, HttpAuthOptionFunctionCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .effectiveHttpAuthSchemes(effectiveHttpAuthSchemes) .schemeId(entry.getKey()) .httpAuthScheme(entry.getValue()) .build() ); } w.popState(); }); } /* import { HttpAuthOption } from "@smithy/types"; // ... function createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters: WeatherHttpAuthSchemeParameters): HttpAuthOption[] { return { schemeId: "smithy.api#httpApiKeyAuth", signingProperties: { name: "Authorization", in: HttpApiKeyAuthLocation.HEADER, scheme: "", }, }; }; */ private void generateHttpAuthOptionFunction(TypeScriptWriter w, HttpAuthOptionFunctionCodeSection s) { w.pushState(s); ShapeId schemeId = s.getSchemeId(); String normalizedAuthSchemeName = normalizeAuthSchemeName(schemeId); Optional authSchemeOptional = s.getHttpAuthScheme(); w.addTypeImport("HttpAuthOption", null, TypeScriptDependency.SMITHY_TYPES); w.openBlock(""" function create$LHttpAuthOption(authParameters: $LHttpAuthSchemeParameters): \ HttpAuthOption {""", "}\n", normalizedAuthSchemeName, serviceName, () -> { w.openBlock("return {", "};", () -> { w.write("schemeId: $S,", schemeId.toString()); // If no HttpAuthScheme is registered, there are no HttpAuthOptionProperties available. if (authSchemeOptional.isEmpty()) { return; } HttpAuthScheme authScheme = authSchemeOptional.get(); Trait trait = serviceShape.findTrait(authScheme.getTraitId()).orElse(null); List identityProperties = authScheme.getHttpAuthSchemeOptionParametersByType( Type.IDENTITY ); if (!identityProperties.isEmpty()) { w.openBlock("identityProperties: {", "},", () -> { for (HttpAuthOptionProperty parameter : identityProperties) { w.write( "$L: $C,", parameter.name(), parameter .source() .apply( HttpAuthOptionProperty.Source.builder() .httpAuthScheme(authScheme) .trait(trait) .build() ) ); } }); } List signingProperties = authScheme.getHttpAuthSchemeOptionParametersByType( Type.SIGNING ); if (!signingProperties.isEmpty()) { w.openBlock("signingProperties: {", "},", () -> { for (HttpAuthOptionProperty parameter : signingProperties) { w.write( "$L: $C,", parameter.name(), parameter .source() .apply( HttpAuthOptionProperty.Source.builder() .httpAuthScheme(authScheme) .trait(trait) .build() ) ); } }); } authScheme .getPropertiesExtractor() .ifPresent( extractor -> w.write( "propertiesExtractor: $C", extractor.apply( serviceSymbol .toBuilder() .name(ServiceBareBonesClientGenerator.getConfigTypeName(serviceSymbol)) .build() ) ) ); }); }); w.popState(); } public static String normalizeAuthSchemeName(ShapeId shapeId) { return String.join( "", Arrays.asList(shapeId.toString().split("[.#]")).stream().map(StringUtils::capitalize).toList() ); } /* import { HttpAuthSchemeProvider } from "@smithy/types"; // ... export interface WeatherHttpAuthSchemeProvider extends HttpAuthSchemeProvider {} */ private void generateHttpAuthSchemeProviderInterface() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( HttpAuthSchemeProviderInterfaceCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .build() ); w.addTypeImport("HttpAuthSchemeProvider", null, TypeScriptDependency.SMITHY_TYPES); w.writeDocs("@internal"); String candidate = "export interface %sHttpAuthSchemeProvider extends".formatted(serviceName) + " HttpAuthSchemeProvider<%sHttpAuthSchemeParameters> {}".formatted(serviceName); if (candidate.length() <= TypeScriptWriter.LINE_WIDTH) { w.write(candidate); } else { w.write( """ export interface $LHttpAuthSchemeProvider extends HttpAuthSchemeProvider<$LHttpAuthSchemeParameters> {} """, serviceName, serviceName ); } w.popState(); }); } /* export const defaultWeatherHttpAuthSchemeProvider: WeatherHttpAuthSchemeProvider = (authParameters) => { const options: HttpAuthOption[] = []; switch (authParameters.operation) { default: { options.push(createSmithyApiHttpApiKeyAuthHttpAuthOption(authParameters)); }; }; return options; }; */ private void generateDefaultHttpAuthSchemeProviderFunction() { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { w.pushState( DefaultHttpAuthSchemeProviderFunctionCodeSection.builder() .service(serviceShape) .settings(settings) .model(model) .symbolProvider(symbolProvider) .build() ); w.openBlock(""" /** * @internal */ export const default$LHttpAuthSchemeProvider: $LHttpAuthSchemeProvider = \ (authParameters) => {""", "};", serviceName, serviceName, () -> { w.write("const options: HttpAuthOption[] = [];"); w.openBlock("switch (authParameters.operation) {", "}", () -> { var serviceAuthSchemes = serviceIndex.getEffectiveAuthSchemes( serviceShape, AuthSchemeMode.NO_AUTH_AWARE ); for (OperationShape operationShape : topDownIndex.getContainedOperations(serviceShape)) { ShapeId operationShapeId = operationShape.getId(); var operationAuthSchemes = serviceIndex.getEffectiveAuthSchemes( serviceShape, operationShapeId, AuthSchemeMode.NO_AUTH_AWARE ); // Skip operation generation if operation auth schemes are equivalent to the default service // auth schemes. if (AuthUtils.areHttpAuthSchemesEqual(serviceAuthSchemes, operationAuthSchemes)) { continue; } w.openBlock("case $S: {", "};", operationShapeId.getName(), () -> { operationAuthSchemes .keySet() .forEach(shapeId -> { w.write( "options.push(create$LHttpAuthOption(authParameters));", normalizeAuthSchemeName(shapeId) ); }); w.write("break;"); }); } w.openBlock("default: {", "}", () -> { serviceAuthSchemes .keySet() .forEach(shapeId -> { w.write( "options.push(create$LHttpAuthOption(authParameters));", normalizeAuthSchemeName(shapeId) ); }); }); }); w.write("return options;"); }); w.popState(); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/ResolveConfigFunction.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.ArrayList; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.ToSmithyBuilder; /** * ResolveConfigFunction. */ @SmithyUnstableApi public record ResolveConfigFunction( Symbol resolveConfigFunction, Symbol inputConfig, Symbol resolvedConfig, List addArgs, Optional previouslyResolved ) implements ToSmithyBuilder { public static Builder builder() { return new Builder(); } @Override public Builder toBuilder() { return builder() .resolveConfigFunction(resolveConfigFunction) .inputConfig(inputConfig) .resolvedConfig(resolvedConfig) .addArgs(addArgs) .previouslyResolved(previouslyResolved.orElse(null)); } public static final class Builder implements SmithyBuilder { private Symbol resolveConfigFunction; private Symbol inputConfig; private Symbol resolvedConfig; private List addArgs = new ArrayList<>(); private Symbol previouslyResolved; @Override public ResolveConfigFunction build() { return new ResolveConfigFunction( SmithyBuilder.requiredState("resolveConfigFunction", resolveConfigFunction), SmithyBuilder.requiredState("inputConfig", inputConfig), SmithyBuilder.requiredState("resolvedConfig", resolvedConfig), SmithyBuilder.requiredState("addArgs", addArgs), Optional.ofNullable(previouslyResolved) ); } public Builder resolveConfigFunction(Symbol resolveConfigFunction) { this.resolveConfigFunction = resolveConfigFunction; return this; } public Builder inputConfig(Symbol inputConfig) { this.inputConfig = inputConfig; return this; } public Builder resolvedConfig(Symbol resolvedConfig) { this.resolvedConfig = resolvedConfig; return this; } public Builder addArgs(List args) { this.addArgs = args; return this; } public Builder previouslyResolved(Symbol previouslyResolved) { this.previouslyResolved = previouslyResolved; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/SupportedHttpAuthSchemesIndex.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http; import java.util.HashMap; import java.util.List; import java.util.Map; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.integration.HttpAuthTypeScriptIntegration; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; /** * Index of AuthSchemes supported in code generation through integrations. * * Integrations may mutate this index to customize {@link HttpAuthScheme} * implementations. */ @SmithyInternalApi public final class SupportedHttpAuthSchemesIndex { private final Map supportedHttpAuthSchemes = new HashMap<>(); /** * Creates an index from registered {@link HttpAuthScheme}s in {@link TypeScriptIntegration}s. * @param integrations list of integrations to register HttpAuthSchemes */ public SupportedHttpAuthSchemesIndex( List integrations, Model model, TypeScriptSettings settings ) { for (TypeScriptIntegration integration : integrations) { if (!(integration instanceof HttpAuthTypeScriptIntegration)) { continue; } HttpAuthTypeScriptIntegration httpAuthIntegration = (HttpAuthTypeScriptIntegration) integration; if (httpAuthIntegration.getHttpAuthScheme().isPresent()) { HttpAuthScheme authScheme = httpAuthIntegration.getHttpAuthScheme().get(); this.putHttpAuthScheme(authScheme.getSchemeId(), authScheme); } httpAuthIntegration.customizeSupportedHttpAuthSchemes(this, model, settings); } } /** * Registers an {@link HttpAuthScheme}. * @param schemeId schemeId of authScheme * @param authScheme auth scheme to put * @return the auth scheme that was there previously or null */ public HttpAuthScheme putHttpAuthScheme(ShapeId schemeId, HttpAuthScheme authScheme) { return supportedHttpAuthSchemes.put(schemeId, authScheme); } /** * Gets an {@link HttpAuthScheme}. * @param schemeId schemeId of auth scheme to get * @return the auth scheme or null if not found */ public HttpAuthScheme getHttpAuthScheme(ShapeId schemeId) { return supportedHttpAuthSchemes.get(schemeId); } /** * Removes an {@link HttpAuthScheme}. * @param schemeId schemeId of auth scheme to remove * @return the removed auth scheme or null if nothing was previously put */ public HttpAuthScheme removeHttpAuthScheme(ShapeId schemeId) { return supportedHttpAuthSchemes.remove(schemeId); } /** * Gets the map of supported {@link HttpAuthScheme}s. * @return supportedHttpAuthSchemes */ public Map getSupportedHttpAuthSchemes() { return supportedHttpAuthSchemes; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/AddHttpAuthSchemePlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.AuthUtils; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.ResolveConfigFunction; import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthSchemeInputConfigInterfaceCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.HttpAuthSchemeResolvedConfigInterfaceCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.ResolveHttpAuthSchemeConfigFunctionCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection; import software.amazon.smithy.typescript.codegen.auth.http.sections.ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention; import software.amazon.smithy.typescript.codegen.sections.ClientBodyExtraCodeSection; import software.amazon.smithy.typescript.codegen.util.ClientWriterConsumer; import software.amazon.smithy.utils.SmithyInternalApi; /** * Add config and middleware for {@code httpAuthSchemeMiddleware}. */ @SmithyInternalApi public final class AddHttpAuthSchemePlugin implements HttpAuthTypeScriptIntegration { /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public List getClientPlugins() { Map httpAuthSchemeParametersProvider = Map.of( "httpAuthSchemeParametersProvider", AddHttpAuthSchemePlugin::httpAuthSchemeParametersProvider, "identityProviderConfigProvider", AddHttpAuthSchemePlugin::identityProviderConfigProvider ); return List.of( RuntimeClientPlugin.builder() .withConventions( TypeScriptDependency.SMITHY_CORE.dependency, "HttpAuthSchemeEndpointRuleSet", Convention.HAS_MIDDLEWARE ) .withAdditionalClientParams(httpAuthSchemeParametersProvider) .build(), RuntimeClientPlugin.builder() .inputConfig( Symbol.builder() .namespace(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_MODULE, "/") .name("HttpAuthSchemeInputConfig") .putProperty("typeOnly", true) .build() ) .resolvedConfig( Symbol.builder() .namespace(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_MODULE, "/") .name("HttpAuthSchemeResolvedConfig") .putProperty("typeOnly", true) .build() ) .resolveFunction( Symbol.builder() .namespace(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_MODULE, "/") .name("resolveHttpAuthSchemeConfig") .build() ) .build() ); } @Override public void customize(TypeScriptCodegenContext codegenContext) { if ( !codegenContext.settings().generateClient() || codegenContext.settings().useLegacyAuth() || !codegenContext.applicationProtocol().isHttpProtocol() ) { return; } codegenContext .writerDelegator() .useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_PROVIDER_PATH, w -> { SupportedHttpAuthSchemesIndex authIndex = new SupportedHttpAuthSchemesIndex( codegenContext.integrations(), codegenContext.model(), codegenContext.settings() ); ServiceShape serviceShape = codegenContext.settings().getService(codegenContext.model()); ServiceIndex serviceIndex = ServiceIndex.of(codegenContext.model()); TopDownIndex topDownIndex = TopDownIndex.of(codegenContext.model()); Map httpAuthSchemes = AuthUtils.getAllEffectiveNoAuthAwareAuthSchemes( serviceShape, serviceIndex, authIndex, topDownIndex ); Map configFields = AuthUtils.collectConfigFields(httpAuthSchemes.values()); Map resolveConfigFunctions = AuthUtils.collectResolveConfigFunctions( httpAuthSchemes.values() ); generateHttpAuthSchemeInputConfigInterface( w, HttpAuthSchemeInputConfigInterfaceCodeSection.builder() .service(serviceShape) .settings(codegenContext.settings()) .model(codegenContext.model()) .symbolProvider(codegenContext.symbolProvider()) .integrations(codegenContext.integrations()) .configFields(configFields) .resolveConfigFunctions(resolveConfigFunctions) .build() ); generateHttpAuthSchemeResolvedConfigInterface( w, HttpAuthSchemeResolvedConfigInterfaceCodeSection.builder() .service(serviceShape) .settings(codegenContext.settings()) .model(codegenContext.model()) .symbolProvider(codegenContext.symbolProvider()) .integrations(codegenContext.integrations()) .configFields(configFields) .resolveConfigFunctions(resolveConfigFunctions) .build() ); generateResolveHttpAuthSchemeConfigFunction( w, ResolveHttpAuthSchemeConfigFunctionCodeSection.builder() .service(serviceShape) .settings(codegenContext.settings()) .model(codegenContext.model()) .symbolProvider(codegenContext.symbolProvider()) .integrations(codegenContext.integrations()) .configFields(configFields) .resolveConfigFunctions(resolveConfigFunctions) .build() ); }); } /** * Writes the httpAuthSchemeParametersProvider for input to middleware additional parameters. * Example: * ```typescript * defaultWeatherHttpAuthSchemeParametersProvider; * ``` */ private static void httpAuthSchemeParametersProvider( TypeScriptWriter w, ClientBodyExtraCodeSection clientBodySection ) { String httpAuthSchemeParametersProviderName = "default" + CodegenUtils.getServiceName( clientBodySection.getSettings(), clientBodySection.getModel(), clientBodySection.getSymbolProvider() ) + "HttpAuthSchemeParametersProvider"; w.addImport(httpAuthSchemeParametersProviderName, null, AuthUtils.AUTH_HTTP_PROVIDER_DEPENDENCY); w.writeInline(httpAuthSchemeParametersProviderName); } /** * Writes the identityProviderConfigProvider for input to middleware additional parameters. * Example: * ```typescript * async (config: WeatherClientResolvedConfig) => new DefaultIdentityProviderConfig({ * "aws.auth#sigv4": config.credentials, * "smithy.api#httpApiKeyAuth": config.apiKey, * "smithy.api#httpBearerAuth": config.token, * }) * ``` */ private static void identityProviderConfigProvider(TypeScriptWriter w, ClientBodyExtraCodeSection s) { w.addDependency(TypeScriptDependency.SMITHY_CORE); w.addImport("DefaultIdentityProviderConfig", null, TypeScriptDependency.SMITHY_CORE); SupportedHttpAuthSchemesIndex authIndex = new SupportedHttpAuthSchemesIndex( s.getIntegrations(), s.getModel(), s.getSettings() ); ServiceIndex serviceIndex = ServiceIndex.of(s.getModel()); TopDownIndex topDownIndex = TopDownIndex.of(s.getModel()); Map httpAuthSchemes = AuthUtils.getAllEffectiveNoAuthAwareAuthSchemes( s.getService(), serviceIndex, authIndex, topDownIndex ); w.openBlock( """ async (config: $LResolvedConfig) =>""", s.getSymbolProvider().toSymbol(s.getService()).getName() ); w.openCollapsibleBlock( """ new DefaultIdentityProviderConfig({""", "})", httpAuthSchemes .values() .stream() .filter(Objects::nonNull) .anyMatch( scheme -> scheme .getConfigFields() .stream() .anyMatch(field -> field.type().equals(ConfigField.Type.MAIN)) ), () -> { for (HttpAuthScheme scheme : httpAuthSchemes.values()) { if (scheme == null) { continue; } for (ConfigField configField : scheme.getConfigFields()) { if (configField.type().equals(ConfigField.Type.MAIN)) { w.write("$S: config.$L,", scheme.getSchemeId().toString(), configField.name()); } } } } ); // no closeBlock needed here, the caller will write the comma // inline with the close of `new DefaultIdentityProviderConfig({})` w.dedent(); } /* export interface HttpAuthSchemeInputConfig { httpAuthSchemes?: HttpAuthScheme[]; httpAuthSchemeProvider?: WeatherHttpAuthSchemeProvider; apiKey?: ApiKeyIdentity | ApiKeyIdentityProvider; token?: TokenIdentity | TokenIdentityProvider; region?: string | __Provider; credentials?: AwsCredentialIdentity | AwsCredentialIdentityProvider; } */ private void generateHttpAuthSchemeInputConfigInterface( TypeScriptWriter w, HttpAuthSchemeInputConfigInterfaceCodeSection s ) { w.pushState(s); Map configFields = s.getConfigFields(); Map resolveConfigFunctions = s.getResolveConfigFunctions(); String serviceName = CodegenUtils.getServiceName(s.getSettings(), s.getModel(), s.getSymbolProvider()); w.writeDocs("@public"); w.writeInline("export interface HttpAuthSchemeInputConfig"); if (!resolveConfigFunctions.isEmpty()) { w.writeInline(" extends "); Iterator iter = resolveConfigFunctions.values().iterator(); while (iter.hasNext()) { ResolveConfigFunction entry = iter.next(); w.writeInline("$T", entry.inputConfig()); if (iter.hasNext()) { w.writeInline(", "); } } } w.write(" {"); w.indent(); w.addTypeImport("Provider", null, TypeScriptDependency.SMITHY_TYPES); w.writeDocs( """ A comma-separated list of case-sensitive auth scheme names. An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. @public""" ); w.write("authSchemePreference?: string[] | Provider;"); w.write(""); w.addTypeImport("HttpAuthScheme", null, TypeScriptDependency.SMITHY_TYPES); w.writeDocs( """ Configuration of HttpAuthSchemes for a client which provides \ default identity providers and signers per auth scheme. @internal""" ); w.write("httpAuthSchemes?: HttpAuthScheme[];"); w.write(""); String httpAuthSchemeProviderName = serviceName + "HttpAuthSchemeProvider"; w.writeDocs( """ Configuration of an HttpAuthSchemeProvider for a client which \ resolves which HttpAuthScheme to use. @internal""" ); w.write("httpAuthSchemeProvider?: $L;", httpAuthSchemeProviderName); for (ConfigField configField : configFields.values()) { if (configField.configFieldWriter().isPresent()) { configField.docs().ifPresent(docs -> w.writeDocs(() -> w.write("$C", docs))); w.write("$L?: $T;", configField.name(), configField.inputType()); } } w.dedent(); w.write("}"); w.write(""); w.popState(); } /* export interface HttpAuthSchemeResolvedConfig { readonly httpAuthSchemes: HttpAuthScheme[]; readonly httpAuthSchemeProvider: WeatherHttpAuthSchemeProvider; readonly apiKey?: ApiKeyIdentityProvider; readonly token?: TokenIdentityProvider; readonly region?: __Provider; readonly credentials?: AwsCredentialIdentityProvider; } */ private void generateHttpAuthSchemeResolvedConfigInterface( TypeScriptWriter w, HttpAuthSchemeResolvedConfigInterfaceCodeSection s ) { w.pushState(s); Map configFields = s.getConfigFields(); Map resolveConfigFunctions = s.getResolveConfigFunctions(); String serviceName = CodegenUtils.getServiceName(s.getSettings(), s.getModel(), s.getSymbolProvider()); w.writeDocs("@internal"); w.writeInline("export interface HttpAuthSchemeResolvedConfig"); if (!resolveConfigFunctions.isEmpty()) { w.writeInline(" extends "); Iterator iter = resolveConfigFunctions.values().iterator(); while (iter.hasNext()) { ResolveConfigFunction entry = iter.next(); w.writeInline("$T", entry.resolvedConfig()); if (iter.hasNext()) { w.writeInline(", "); } } } w.write(" {"); w.indent(); w.addTypeImport("Provider", null, TypeScriptDependency.SMITHY_TYPES); w.writeDocs( """ A comma-separated list of case-sensitive auth scheme names. An auth scheme name is a fully qualified auth scheme ID with the namespace prefix trimmed. For example, the auth scheme with ID aws.auth#sigv4 is named sigv4. @public""" ); w.write("readonly authSchemePreference: Provider;\n"); w.addTypeImport("HttpAuthScheme", null, TypeScriptDependency.SMITHY_TYPES); w.writeDocs( """ Configuration of HttpAuthSchemes for a client which provides \ default identity providers and signers per auth scheme. @internal""" ); w.write("readonly httpAuthSchemes: HttpAuthScheme[];\n"); String httpAuthSchemeProviderName = serviceName + "HttpAuthSchemeProvider"; w.writeDocs( """ Configuration of an HttpAuthSchemeProvider for a client which \ resolves which HttpAuthScheme to use. @internal""" ); w.write("readonly httpAuthSchemeProvider: $L;", httpAuthSchemeProviderName); for (ConfigField configField : configFields.values()) { if (configField.configFieldWriter().isPresent()) { configField.docs().ifPresent(docs -> w.writeDocs(() -> w.write("$C", docs))); w.write("readonly $L?: $T;", configField.name(), configField.resolvedType()); } } w.dedent(); w.write("}"); w.write(""); w.popState(); } /* export const resolveHttpAuthSchemeConfig = (config: HttpAuthSchemeInputConfig): HttpAuthSchemeResolvedConfig => { const credentials = memoizeIdentityProvider(config.credentials, isIdentityExpired, doesIdentityRequireRefresh); const region = config.region ? normalizeProvider(config.region) : undefined; const apiKey = memoizeIdentityProvider(config.apiKey, isIdentityExpired, doesIdentityRequireRefresh); const token = memoizeIdentityProvider(config.token, isIdentityExpired, doesIdentityRequireRefresh); return Object.assign(config, { credentials, region, apiKey, token, }) as HttpAuthSchemeResolvedConfig; }; */ private void generateResolveHttpAuthSchemeConfigFunction( TypeScriptWriter w, ResolveHttpAuthSchemeConfigFunctionCodeSection s ) { w.pushState(s); Map configFields = s.getConfigFields(); Map resolveConfigFunctions = s.getResolveConfigFunctions(); Map previousResolvedFunctions = resolveConfigFunctions .entrySet() .stream() .filter(e -> e.getValue().previouslyResolved().isPresent()) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); w.writeDocs("@internal"); w.writeInline( """ export const resolveHttpAuthSchemeConfig = ( config: T & HttpAuthSchemeInputConfig""" ); if (!previousResolvedFunctions.isEmpty()) { w.writeInline(" & "); Iterator iter = previousResolvedFunctions.values().iterator(); while (iter.hasNext()) { ResolveConfigFunction entry = iter.next(); w.writeInline("$T", entry.previouslyResolved().get()); if (iter.hasNext()) { w.writeInline(" & "); } } } w.write(""); w.write( """ ): T & HttpAuthSchemeResolvedConfig => {""" ); w.indent(); w.pushState( ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection.builder() .service(s.getService()) .settings(s.getSettings()) .model(s.getModel()) .symbolProvider(s.getSymbolProvider()) .integrations(s.getIntegrations()) .configFields(configFields) .build() ); w.addDependency(TypeScriptDependency.SMITHY_CORE); for (ConfigField configField : configFields.values()) { configField.configFieldWriter().ifPresent(cfw -> cfw.accept(w, configField)); } w.popState(); w.pushState( ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection.builder() .service(s.getService()) .settings(s.getSettings()) .model(s.getModel()) .symbolProvider(s.getSymbolProvider()) .integrations(s.getIntegrations()) .configFields(configFields) .build() ); Integer i = 0; String configName = "config"; for (ResolveConfigFunction resolveConfigFunction : resolveConfigFunctions.values()) { w.openCollapsibleBlock( "const config_$L = $T($L", ");", !resolveConfigFunction.addArgs().isEmpty(), i, resolveConfigFunction.resolveConfigFunction(), configName, () -> { for (String addArg : resolveConfigFunction.addArgs()) { w.writeInline(", $L", addArg); } } ); configName = "config_" + i; i++; } w.write("return Object.assign($L, {", configName).indent(); w.addImportSubmodule("normalizeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); w.write("authSchemePreference: normalizeProvider(config.authSchemePreference ?? []),"); for (ConfigField configField : configFields.values()) { if (configField.configFieldWriter().isPresent()) { w.write("$L,", configField.name()); } } w.dedent().write("}) as T & HttpAuthSchemeResolvedConfig;"); w.popState(); w.dedent(); w.write("};"); w.popState(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/AddHttpSigningPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_MIDDLEWARE; import java.util.List; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; /** * Add middleware for {@code httpSigningMiddleware}. */ @SmithyInternalApi public class AddHttpSigningPlugin implements TypeScriptIntegration { /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public List getClientPlugins() { return List.of( RuntimeClientPlugin.builder() .withConventions(TypeScriptDependency.SMITHY_CORE.dependency, "HttpSigning", HAS_MIDDLEWARE) .build() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/HttpAuthExtensionConfigurationInterface.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.typescript.codegen.auth.AuthUtils; import software.amazon.smithy.typescript.codegen.extensions.ExtensionConfigurationInterface; import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds the corresponding interface and functions for {@code HttpAuthExtensionConfiguration}. */ @SmithyInternalApi public class HttpAuthExtensionConfigurationInterface implements ExtensionConfigurationInterface { @Override public Pair name() { return Pair.of("HttpAuthExtensionConfiguration", AuthUtils.AUTH_HTTP_EXTENSION_DEPENDENCY); } @Override public Pair getExtensionConfigurationFn() { return Pair.of("getHttpAuthExtensionConfiguration", AuthUtils.AUTH_HTTP_EXTENSION_DEPENDENCY); } @Override public Pair resolveRuntimeConfigFn() { return Pair.of("resolveHttpAuthRuntimeConfig", AuthUtils.AUTH_HTTP_EXTENSION_DEPENDENCY); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/HttpAuthRuntimeExtensionIntegration.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.List; import java.util.Map; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptDelegator; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.AuthUtils; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex; import software.amazon.smithy.typescript.codegen.extensions.ExtensionConfigurationInterface; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; /** * Adds {@link HttpAuthExtensionConfigurationInterface} to a client. */ @SmithyInternalApi public class HttpAuthRuntimeExtensionIntegration implements TypeScriptIntegration { /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public List getExtensionConfigurationInterfaces( Model model, TypeScriptSettings settings ) { return List.of(new HttpAuthExtensionConfigurationInterface()); } @Override public void customize(TypeScriptCodegenContext codegenContext) { if (!codegenContext.settings().generateClient()) { return; } TypeScriptDelegator delegator = codegenContext.writerDelegator(); SupportedHttpAuthSchemesIndex authIndex = new SupportedHttpAuthSchemesIndex( codegenContext.integrations(), codegenContext.model(), codegenContext.settings() ); ServiceIndex serviceIndex = ServiceIndex.of(codegenContext.model()); TopDownIndex topDownIndex = TopDownIndex.of(codegenContext.model()); String serviceName = CodegenUtils.getServiceName( codegenContext.settings(), codegenContext.model(), codegenContext.symbolProvider() ); ServiceShape serviceShape = codegenContext.settings().getService(codegenContext.model()); Map effectiveAuthSchemes = AuthUtils.getAllEffectiveNoAuthAwareAuthSchemes( serviceShape, serviceIndex, authIndex, topDownIndex ); Map configFields = AuthUtils.collectConfigFields(effectiveAuthSchemes.values()); generateHttpAuthExtensionConfigurationInterface(delegator, configFields, serviceName); generateHttpAuthExtensionRuntimeConfigType(delegator, configFields, serviceName); generateGetHttpAuthExtensionConfigurationFunction(delegator, configFields, serviceName); generateResolveHttpAuthRuntimeConfigFunction(delegator, configFields, serviceName); } /* import { ApiKeyIdentity, ApiKeyIdentityProvider, AwsCredentialsIdentity, AwsCredentialIdentityProvider, HttpAuthScheme, TokenIdentity, TokenIdentityProvider } from "@smithy/types"; import { WeatherHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; // ... export interface HttpAuthExtensionConfiguration { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void; httpAuthSchemes(): HttpAuthScheme[]; setHttpAuthSchemeProvider(httpAuthSchemeProvider: WeatherHttpAuthSchemeProvider): void; httpAuthSchemeProvider(): WeatherHttpAuthSchemeProvider; // @aws.auth#sigv4 setCredentials(credentials: AwsCredentialsIdentity | AwsCredentialIdentityProvider): void; credentials(): AwsCredentialsIdentity | AwsCredentialIdentityProvider | undefined; // @httpApiKeyAuth setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void; apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined; // @httpBearerAuth setToken(token: TokenIdentity| TokenIdentityProvider): void; token(): TokenIdentity | TokenIdentityProvider | undefined; } */ private void generateHttpAuthExtensionConfigurationInterface( TypeScriptDelegator delegator, Map configFields, String serviceName ) { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_EXTENSION_PATH, w -> { w.openBlock(""" /** * @internal */ export interface HttpAuthExtensionConfiguration {""", "}", () -> { w.addTypeImport("HttpAuthScheme", null, TypeScriptDependency.SMITHY_TYPES); w.write("setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void;"); w.write("httpAuthSchemes(): HttpAuthScheme[];"); w.addTypeImport(serviceName + "HttpAuthSchemeProvider", null, AuthUtils.AUTH_HTTP_PROVIDER_DEPENDENCY); w.write( "setHttpAuthSchemeProvider(httpAuthSchemeProvider: $LHttpAuthSchemeProvider): void;", serviceName ); w.write("httpAuthSchemeProvider(): $LHttpAuthSchemeProvider;", serviceName); List mainConfigFields = configFields .values() .stream() .filter(c -> c.type().equals(ConfigField.Type.MAIN)) .toList(); for (ConfigField configField : mainConfigFields) { String capitalizedName = StringUtils.capitalize(configField.name()); w.write("set$L($L: $T): void;", capitalizedName, configField.name(), configField.inputType()); w.write("$L(): $T | undefined;", configField.name(), configField.inputType()); } }); }); } /* import { ApiKeyIdentity, ApiKeyIdentityProvider, AwsCredentialsIdentity, AwsCredentialIdentityProvider, HttpAuthScheme, TokenIdentity, TokenIdentityProvider } from "@smithy/types"; import { WeatherHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; // ... export type HttpAuthRuntimeConfig = Partial<{ httpAuthSchemes: HttpAuthScheme[]; httpAuthSchemeProvider: WeatherHttpAuthSchemeProvider; // @aws.auth#sigv4 credentials: AwsCredentialsIdentity | AwsCredentialIdentityProvider; // @httpApiKeyAuth apiKey: ApiKeyIdentity | ApiKeyIdentityProvider; // @httpBearerAuth token: TokenIdentity | TokenIdentityProvider; }>; */ private void generateHttpAuthExtensionRuntimeConfigType( TypeScriptDelegator delegator, Map configFields, String serviceName ) { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_EXTENSION_PATH, w -> { w.openBlock(""" /** * @internal */ export type HttpAuthRuntimeConfig = Partial<{""", "}>;", () -> { w.addTypeImport("HttpAuthScheme", null, TypeScriptDependency.SMITHY_TYPES); w.write("httpAuthSchemes: HttpAuthScheme[];"); w.addTypeImport(serviceName + "HttpAuthSchemeProvider", null, AuthUtils.AUTH_HTTP_PROVIDER_DEPENDENCY); w.write("httpAuthSchemeProvider: $LHttpAuthSchemeProvider;", serviceName); List mainConfigFields = configFields .values() .stream() .filter(c -> c.type().equals(ConfigField.Type.MAIN)) .toList(); for (ConfigField configField : mainConfigFields) { w.write("$L: $T;", configField.name(), configField.inputType()); } }); }); } /* import { ApiKeyIdentity, ApiKeyIdentityProvider, AwsCredentialsIdentity, AwsCredentialIdentityProvider, HttpAuthScheme, TokenIdentity, TokenIdentityProvider } from "@smithy/types"; import { WeatherHttpAuthSchemeProvider } from "./httpAuthSchemeProvider"; // ... export const getHttpAuthExtensionConfiguration = (runtimeConfig: HttpAuthRuntimeConfig): HttpAuthExtensionConfiguration => { let _httpAuthSchemes = runtimeConfig.httpAuthSchemes!; let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!; let _credentials = runtimeConfig.credentials; let _apiKey = runtimeConfig.apiKey; let _token = runtimeConfig.token; return { setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex(scheme => scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; }, setHttpAuthSchemeProvider(httpAuthSchemeProvider: WeatherHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): WeatherHttpAuthSchemeProvider { return _httpAuthSchemeProvider; }, // Dependent on auth traits setCredentials(credentials: AwsCredentialsIdentity | AwsCredentialIdentityProvider): void { _credentials = credentials; }, credentials(): AwsCredentialsIdentity | AwsCredentialIdentityProvider | undefined { return _credentials; }, setApiKey(apiKey: ApiKeyIdentity | ApiKeyIdentityProvider): void { _apiKey = apiKey; }, apiKey(): ApiKeyIdentity | ApiKeyIdentityProvider | undefined { return _apiKey; }, setToken(token: TokenIdentity | TokenIdentityProvider): void { _token = token; }, token(): TokenIdentity | TokenIdentityProvider | undefined { return _token; }, }; }; */ private void generateGetHttpAuthExtensionConfigurationFunction( TypeScriptDelegator delegator, Map configFields, String serviceName ) { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_EXTENSION_PATH, w -> { w.openBlock(""" /** * @internal */ export const getHttpAuthExtensionConfiguration = ( runtimeConfig: HttpAuthRuntimeConfig ): HttpAuthExtensionConfiguration => {""", "};", () -> { w.addTypeImport("HttpAuthScheme", null, TypeScriptDependency.SMITHY_TYPES); w.write("const _httpAuthSchemes = runtimeConfig.httpAuthSchemes!;"); w.addTypeImport(serviceName + "HttpAuthSchemeProvider", null, AuthUtils.AUTH_HTTP_PROVIDER_DEPENDENCY); w.write("let _httpAuthSchemeProvider = runtimeConfig.httpAuthSchemeProvider!;"); List mainConfigFields = configFields .values() .stream() .filter(c -> c.type().equals(ConfigField.Type.MAIN)) .toList(); for (ConfigField configField : mainConfigFields) { w.write("let _$L = runtimeConfig.$L;", configField.name(), configField.name()); } w.openBlock("return {", "};", () -> { w.write( """ setHttpAuthScheme(httpAuthScheme: HttpAuthScheme): void { const index = _httpAuthSchemes.findIndex((scheme) => \ scheme.schemeId === httpAuthScheme.schemeId); if (index === -1) { _httpAuthSchemes.push(httpAuthScheme); } else { _httpAuthSchemes.splice(index, 1, httpAuthScheme); } }, httpAuthSchemes(): HttpAuthScheme[] { return _httpAuthSchemes; },""" ); w.write( """ setHttpAuthSchemeProvider(httpAuthSchemeProvider: $LHttpAuthSchemeProvider): void { _httpAuthSchemeProvider = httpAuthSchemeProvider; }, httpAuthSchemeProvider(): $LHttpAuthSchemeProvider { return _httpAuthSchemeProvider; },""", serviceName, serviceName ); for (ConfigField configField : mainConfigFields) { String capitalizedName = StringUtils.capitalize(configField.name()); w.write( """ set$L($L: $T): void { _$L = $L; }, $L(): $T | undefined { return _$L; },""", capitalizedName, configField.name(), configField.inputType(), configField.name(), configField.name(), configField.name(), configField.inputType(), configField.name() ); } }); }); }); } /* export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): HttpAuthRuntimeConfig => { return { httpAuthSchemes: config.httpAuthSchemes(), httpAuthSchemeProvider: config.httpAuthSchemeProvider(), // Dependent on auth traits credentials: config.credentials(), apiKey: config.apiKey(), token: config.token(), }; }; */ private void generateResolveHttpAuthRuntimeConfigFunction( TypeScriptDelegator delegator, Map configFields, String serviceName ) { delegator.useFileWriter(AuthUtils.HTTP_AUTH_SCHEME_EXTENSION_PATH, w -> { w.openBlock(""" /** * @internal */ export const resolveHttpAuthRuntimeConfig = (config: HttpAuthExtensionConfiguration): \ HttpAuthRuntimeConfig => {""", "};", () -> { w.openBlock("return {", "};", () -> { w.write("httpAuthSchemes: config.httpAuthSchemes(),"); w.write("httpAuthSchemeProvider: config.httpAuthSchemeProvider(),"); for (ConfigField configField : configFields.values()) { if (configField.type().equals(ConfigField.Type.MAIN)) { w.write("$L: config.$L(),", configField.name(), configField.name()); } } }); }); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/HttpAuthTypeScriptIntegration.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.Optional; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.SupportedHttpAuthSchemesIndex; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; /** * Java SPI for customizing TypeScript code generation for Identity and Authentication. */ @SmithyInternalApi public interface HttpAuthTypeScriptIntegration extends TypeScriptIntegration { /** * Register an {@link HttpAuthScheme} that is used to generate the {@code HttpAuthSchemeProvider} * and corresponding config field and runtime config values. * @return an empty optional. */ default Optional getHttpAuthScheme() { return Optional.empty(); } /** * Mutate an {@link SupportedHttpAuthSchemesIndex} to mutate registered {@link HttpAuthScheme}s, * e.g. default {@code IdentityProvider}s and {@code HttpSigner}s. * @param supportedHttpAuthSchemesIndex index to mutate. * @param model model * @param settings settings */ default void customizeSupportedHttpAuthSchemes( SupportedHttpAuthSchemesIndex supportedHttpAuthSchemesIndex, Model model, TypeScriptSettings settings ) { // pass } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/SupportHttpApiKeyAuth.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.Optional; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.traits.HttpApiKeyAuthTrait; import software.amazon.smithy.model.traits.HttpApiKeyAuthTrait.Location; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthOptionProperty; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.utils.SmithyInternalApi; /** * Support for @httpApiKeyAuth. */ @SmithyInternalApi public class SupportHttpApiKeyAuth implements HttpAuthTypeScriptIntegration { private static final Consumer HTTP_API_KEY_AUTH_SIGNER = w -> w.write( "new $T()", Symbol.builder() .name("HttpApiKeyAuthSigner") .namespace(TypeScriptDependency.SMITHY_CORE.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_CORE) .build() ); private static final Symbol API_KEY_IDENTITY = Symbol.builder() .name("ApiKeyIdentity") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .putProperty("typeOnly", true) .build(); private static final Symbol API_KEY_IDENTITY_PROVIDER = Symbol.builder() .name("ApiKeyIdentityProvider") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .putProperty("typeOnly", true) .build(); private static final Symbol HTTP_API_KEY_LOCATION = Symbol.builder() .name("HttpApiKeyAuthLocation") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build(); /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public Optional getHttpAuthScheme() { return Optional.of( HttpAuthScheme.builder() .schemeId(HttpApiKeyAuthTrait.ID) .applicationProtocol(ApplicationProtocol.createDefaultHttpApplicationProtocol()) .addConfigField( ConfigField.builder() .name("apiKey") .type(ConfigField.Type.MAIN) .docs(w -> w.write("The API key to use when making requests.")) .inputType( Symbol.builder() .name("ApiKeyIdentity | ApiKeyIdentityProvider") .addReference(API_KEY_IDENTITY) .addReference(API_KEY_IDENTITY_PROVIDER) .build() ) .resolvedType( Symbol.builder() .name("ApiKeyIdentityProvider") .addReference(API_KEY_IDENTITY_PROVIDER) .build() ) .configFieldWriter(ConfigField::defaultMainConfigFieldWriter) .build() ) .addHttpAuthOptionProperty( HttpAuthOptionProperty.builder() .name("name") .type(HttpAuthOptionProperty.Type.SIGNING) .source(s -> w -> w.write("$S", ((HttpApiKeyAuthTrait) s.trait()).getName())) .build() ) .addHttpAuthOptionProperty( HttpAuthOptionProperty.builder() .name("in") .type(HttpAuthOptionProperty.Type.SIGNING) .source( s -> w -> { Location in = ((HttpApiKeyAuthTrait) s.trait()).getIn(); switch (in) { case HEADER: { w.write("$T.HEADER", HTTP_API_KEY_LOCATION); break; } case QUERY: { w.write("$T.QUERY", HTTP_API_KEY_LOCATION); break; } default: { throw new CodegenException( "Encountered unsupported `in` property on " + "`@httpApiKeyAuth`: " + in ); } } } ) .build() ) .addHttpAuthOptionProperty( HttpAuthOptionProperty.builder() .name("scheme") .type(HttpAuthOptionProperty.Type.SIGNING) .source( s -> w -> ((HttpApiKeyAuthTrait) s.trait()).getScheme() .ifPresentOrElse( scheme -> w.write("$S", scheme), () -> w.write("undefined") ) ) .build() ) .putDefaultSigner(LanguageTarget.SHARED, HTTP_API_KEY_AUTH_SIGNER) .build() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/SupportHttpBearerAuth.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.Optional; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.traits.HttpBearerAuthTrait; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField.Type; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.utils.SmithyInternalApi; /** * Support for @httpBearerAuth. */ @SmithyInternalApi public final class SupportHttpBearerAuth implements HttpAuthTypeScriptIntegration { private static final Consumer HTTP_BEARER_AUTH_SIGNER = w -> w.write( "new $T()", Symbol.builder() .name("HttpBearerAuthSigner") .namespace(TypeScriptDependency.SMITHY_CORE.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_CORE) .build() ); private static final Symbol TOKEN_IDENTITY = Symbol.builder() .name("TokenIdentity") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build(); private static final Symbol TOKEN_IDENTITY_PROVIDER = Symbol.builder() .name("TokenIdentityProvider") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build(); /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public Optional getHttpAuthScheme() { return Optional.of( HttpAuthScheme.builder() .schemeId(HttpBearerAuthTrait.ID) .applicationProtocol(ApplicationProtocol.createDefaultHttpApplicationProtocol()) .addConfigField( ConfigField.builder() .name("token") .type(Type.MAIN) .docs(w -> w.write("The token used to authenticate requests.")) .inputType( Symbol.builder() .name("TokenIdentity | TokenIdentityProvider") .addReference(TOKEN_IDENTITY) .addReference(TOKEN_IDENTITY_PROVIDER) .build() ) .resolvedType( Symbol.builder() .name("TokenIdentityProvider") .addReference(TOKEN_IDENTITY_PROVIDER) .build() ) .configFieldWriter(ConfigField::defaultMainConfigFieldWriter) .build() ) .putDefaultSigner(LanguageTarget.SHARED, HTTP_BEARER_AUTH_SIGNER) .build() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/integration/SupportNoAuth.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.integration; import java.util.Optional; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.traits.synthetic.NoAuthTrait; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.utils.SmithyInternalApi; /** * Add config and middleware to support the synthetic @noAuth auth scheme. */ @SmithyInternalApi public final class SupportNoAuth implements HttpAuthTypeScriptIntegration { private static final Consumer NO_AUTH_IDENTITY_PROVIDER_WRITER = w -> w.write("async () => ({})"); private static final Consumer NO_AUTH_SIGNER_WRITER = w -> w.write( "new $T()", Symbol.builder() .name("NoAuthSigner") .namespace(TypeScriptDependency.SMITHY_CORE.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_CORE) .build() ); /** * Integration should be skipped if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public Optional getHttpAuthScheme() { return Optional.of( HttpAuthScheme.builder() .schemeId(NoAuthTrait.ID) .applicationProtocol(ApplicationProtocol.createDefaultHttpApplicationProtocol()) .putDefaultIdentityProvider(LanguageTarget.SHARED, NO_AUTH_IDENTITY_PROVIDER_WRITER) .putDefaultSigner(LanguageTarget.SHARED, NO_AUTH_SIGNER_WRITER) .build() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/DefaultHttpAuthSchemeParametersProviderFunctionCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthSchemeParameter; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class DefaultHttpAuthSchemeParametersProviderFunctionCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final Map httpAuthSchemeParameters; private DefaultHttpAuthSchemeParametersProviderFunctionCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); httpAuthSchemeParameters = SmithyBuilder.requiredState( "httpAuthSchemeParameters", builder.httpAuthSchemeParameters ); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public Map getHttpAuthSchemeParameters() { return httpAuthSchemeParameters; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private Map httpAuthSchemeParameters; @Override public DefaultHttpAuthSchemeParametersProviderFunctionCodeSection build() { return new DefaultHttpAuthSchemeParametersProviderFunctionCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder httpAuthSchemeParameters(Map httpAuthSchemeParameters) { this.httpAuthSchemeParameters = httpAuthSchemeParameters; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/DefaultHttpAuthSchemeProviderFunctionCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class DefaultHttpAuthSchemeProviderFunctionCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private DefaultHttpAuthSchemeProviderFunctionCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; @Override public DefaultHttpAuthSchemeProviderFunctionCodeSection build() { return new DefaultHttpAuthSchemeProviderFunctionCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthOptionFunctionCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.Map; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthOptionFunctionCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final Map effectiveHttpAuthSchemes; private final ShapeId schemeId; private final HttpAuthScheme httpAuthScheme; private HttpAuthOptionFunctionCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); effectiveHttpAuthSchemes = SmithyBuilder.requiredState( "effectiveHttpAuthSchemes", builder.effectiveHttpAuthSchemes ); schemeId = SmithyBuilder.requiredState("schemeId", builder.schemeId); httpAuthScheme = builder.httpAuthScheme; } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public Map getEffectiveHttpAuthSchemes() { return effectiveHttpAuthSchemes; } public ShapeId getSchemeId() { return schemeId; } public Optional getHttpAuthScheme() { return Optional.ofNullable(httpAuthScheme); } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private Map effectiveHttpAuthSchemes; private ShapeId schemeId; private HttpAuthScheme httpAuthScheme; @Override public HttpAuthOptionFunctionCodeSection build() { return new HttpAuthOptionFunctionCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder effectiveHttpAuthSchemes(Map effectiveHttpAuthSchemes) { this.effectiveHttpAuthSchemes = effectiveHttpAuthSchemes; return this; } public Builder schemeId(ShapeId schemeId) { this.schemeId = schemeId; return this; } public Builder httpAuthScheme(HttpAuthScheme httpAuthScheme) { this.httpAuthScheme = httpAuthScheme; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthOptionFunctionsCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthOptionFunctionsCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final Map effectiveHttpAuthSchemes; private HttpAuthOptionFunctionsCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); effectiveHttpAuthSchemes = SmithyBuilder.requiredState( "effectiveHttpAuthSchemes", builder.effectiveHttpAuthSchemes ); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public Map getEffectiveHttpAuthSchemes() { return effectiveHttpAuthSchemes; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private Map effectiveHttpAuthSchemes; @Override public HttpAuthOptionFunctionsCodeSection build() { return new HttpAuthOptionFunctionsCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder effectiveHttpAuthSchemes(Map effectiveHttpAuthSchemes) { this.effectiveHttpAuthSchemes = effectiveHttpAuthSchemes; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthSchemeInputConfigInterfaceCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.ResolveConfigFunction; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthSchemeInputConfigInterfaceCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final Map configFields; private final Map resolveConfigFunctions; private HttpAuthSchemeInputConfigInterfaceCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); configFields = SmithyBuilder.requiredState("configFields", builder.configFields); resolveConfigFunctions = SmithyBuilder.requiredState("resolveConfigFunctions", builder.resolveConfigFunctions); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public Map getConfigFields() { return configFields; } public Map getResolveConfigFunctions() { return resolveConfigFunctions; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private List integrations; private Map configFields; private Map resolveConfigFunctions; @Override public HttpAuthSchemeInputConfigInterfaceCodeSection build() { return new HttpAuthSchemeInputConfigInterfaceCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder configFields(Map configFields) { this.configFields = configFields; return this; } public Builder resolveConfigFunctions(Map resolveConfigFunctions) { this.resolveConfigFunctions = resolveConfigFunctions; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthSchemeParametersInterfaceCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthSchemeParameter; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthSchemeParametersInterfaceCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final Map httpAuthSchemeParameters; private HttpAuthSchemeParametersInterfaceCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); httpAuthSchemeParameters = SmithyBuilder.requiredState( "httpAuthSchemeParameters", builder.httpAuthSchemeParameters ); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public Map getHttpAuthSchemeParameters() { return httpAuthSchemeParameters; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private Map httpAuthSchemeParameters; @Override public HttpAuthSchemeParametersInterfaceCodeSection build() { return new HttpAuthSchemeParametersInterfaceCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder httpAuthSchemeParameters(Map httpAuthSchemeParameters) { this.httpAuthSchemeParameters = httpAuthSchemeParameters; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthSchemeParametersProviderInterfaceCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthSchemeParametersProviderInterfaceCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private HttpAuthSchemeParametersProviderInterfaceCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; @Override public HttpAuthSchemeParametersProviderInterfaceCodeSection build() { return new HttpAuthSchemeParametersProviderInterfaceCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthSchemeProviderInterfaceCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthSchemeProviderInterfaceCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private HttpAuthSchemeProviderInterfaceCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; @Override public HttpAuthSchemeProviderInterfaceCodeSection build() { return new HttpAuthSchemeProviderInterfaceCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/HttpAuthSchemeResolvedConfigInterfaceCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.ResolveConfigFunction; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class HttpAuthSchemeResolvedConfigInterfaceCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final Map configFields; private final Map resolveConfigFunctions; private HttpAuthSchemeResolvedConfigInterfaceCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); configFields = SmithyBuilder.requiredState("configFields", builder.configFields); resolveConfigFunctions = SmithyBuilder.requiredState("resolveConfigFunctions", builder.resolveConfigFunctions); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public Map getConfigFields() { return configFields; } public Map getResolveConfigFunctions() { return resolveConfigFunctions; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private List integrations; private Map configFields; private Map resolveConfigFunctions; @Override public HttpAuthSchemeResolvedConfigInterfaceCodeSection build() { return new HttpAuthSchemeResolvedConfigInterfaceCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder configFields(Map configFields) { this.configFields = configFields; return this; } public Builder resolveConfigFunctions(Map resolveConfigFunctions) { this.resolveConfigFunctions = resolveConfigFunctions; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/ResolveHttpAuthSchemeConfigFunctionCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.ResolveConfigFunction; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class ResolveHttpAuthSchemeConfigFunctionCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final Map configFields; private final Map resolveConfigFunctions; private ResolveHttpAuthSchemeConfigFunctionCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); configFields = SmithyBuilder.requiredState("configFields", builder.configFields); resolveConfigFunctions = SmithyBuilder.requiredState("resolveConfigFunctions", builder.resolveConfigFunctions); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public Map getConfigFields() { return configFields; } public Map getResolveConfigFunctions() { return resolveConfigFunctions; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private List integrations; private Map configFields; private Map resolveConfigFunctions; @Override public ResolveHttpAuthSchemeConfigFunctionCodeSection build() { return new ResolveHttpAuthSchemeConfigFunctionCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder configFields(Map configFields) { this.configFields = configFields; return this; } public Builder resolveConfigFunctions(Map resolveConfigFunctions) { this.resolveConfigFunctions = resolveConfigFunctions; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final Map configFields; private ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); configFields = SmithyBuilder.requiredState("configFields", builder.configFields); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public Map getConfigFields() { return configFields; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private List integrations; private Map configFields; @Override public ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection build() { return new ResolveHttpAuthSchemeConfigFunctionConfigFieldsCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder configFields(Map configFields) { this.configFields = configFields; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/auth/http/sections/ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.auth.http.sections; import java.util.List; import java.util.Map; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection implements CodeSection { private final ServiceShape service; private final TypeScriptSettings settings; private final Model model; private final SymbolProvider symbolProvider; private final List integrations; private final Map configFields; private ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); configFields = SmithyBuilder.requiredState("configFields", builder.configFields); } public ServiceShape getService() { return service; } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public Map getConfigFields() { return configFields; } public static Builder builder() { return new Builder(); } public static class Builder implements SmithyBuilder { private ServiceShape service; private TypeScriptSettings settings; private Model model; private SymbolProvider symbolProvider; private List integrations; private Map configFields; @Override public ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection build() { return new ResolveHttpAuthSchemeConfigFunctionReturnBlockCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder configFields(Map configFields) { this.configFields = configFields; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/documentation/DocumentationExampleGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.documentation; import java.util.Comparator; import java.util.stream.Collectors; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.NullNode; import software.amazon.smithy.model.node.NumberNode; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class DocumentationExampleGenerator { private DocumentationExampleGenerator() {} /** * @return the ObjectNode from the curated example written as a JavaScript object literal. */ public static String inputToJavaScriptObject(ObjectNode node) { if (node == null) { return "{ /* empty */ }"; } return write(node, 0); } public static String outputToJavaScriptObject(ObjectNode node) { if (node == null) { return "{ /* metadata only */ }"; } return write(node, 0); } private static String write(Node node, int indent) { StringBuilder buffer = new StringBuilder(); String indentation = " ".repeat(indent); switch (node.getType()) { case OBJECT -> { ObjectNode objectNode = node.expectObjectNode(); if (objectNode.getMembers().isEmpty()) { return indentation + "{ /* empty */ }"; } String membersJoined = objectNode .getMembers() .entrySet() .stream() .sorted(Comparator.comparing(entry -> entry.getKey().getValue())) .map( entry -> indentation + " " + entry.getKey().getValue() + ": " + write(entry.getValue(), indent + 2) ) .collect(Collectors.joining(",\n")); return buffer .append("{\n") .append(membersJoined) .append("\n") .append(indentation) .append("}") .toString(); } case ARRAY -> { ArrayNode arrayNode = node.expectArrayNode(); if (arrayNode.getElements().isEmpty()) { return indentation + "[]"; } String membersJoined = arrayNode .getElements() .stream() .map(elementNode -> indentation + " " + write(elementNode, indent + 2)) .collect(Collectors.joining(",\n")); return buffer .append("[\n") .append(membersJoined) .append("\n") .append(indentation) .append("]") .toString(); } case STRING -> { StringNode stringNode = node.expectStringNode(); if (stringNode.getValue().contains("\"")) { return "`" + stringNode.getValue() + "`"; } return "\"" + stringNode.getValue() + "\""; } case NUMBER -> { NumberNode numberNode = node.expectNumberNode(); return numberNode.getValue().toString(); } case BOOLEAN -> { BooleanNode booleanNode = node.expectBooleanNode(); return booleanNode.toString(); } case NULL -> { NullNode nullNode = node.expectNullNode(); return nullNode.toString(); } default -> throw new IllegalStateException("Unexpected value: " + node.getType()); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/documentation/StructureExampleGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.documentation; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.EnumShape; import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.RequiredTrait; import software.amazon.smithy.model.traits.StreamingTrait; /** * Generates a structural hint for a shape used in command documentation. */ public abstract class StructureExampleGenerator { /** * Generates an example structure for API documentation, as an * automated gap filler for operations that do not have * handwritten examples. * * Example for Athena::createPreparedStatement * ```js * const input = { * // QueryStatement: 'STRING_VALUE', // required * // StatementName: 'STRING_VALUE', // required * // WorkGroup: 'STRING_VALUE', // required * // Description: 'STRING_VALUE' * }; * ``` */ public static String generateStructuralHintDocumentation( Shape shape, Model model, boolean isComment, boolean isInput ) { StringBuilder buffer = new StringBuilder(); shape(shape, buffer, model, 0, new ShapeTracker(), isInput); // replace non-leading whitespace with single space. String s = Arrays.stream(buffer.toString().split("\n")) .map(line -> line.replaceAll("([\\w\\\",:\\[\\{] )\\s+", "$1").replaceAll("\\s+$", "")) .collect(Collectors.joining((isComment) ? "\n// " : "\n")); return ((isComment) ? "// " : "") + s.replaceAll(",$", ";"); } private static void structure( StructureShape structureShape, StringBuilder buffer, Model model, int indentation, ShapeTracker shapeTracker, boolean isInput ) { if (structureShape.getAllMembers().isEmpty()) { append(indentation, buffer, "{},"); checkRequired(indentation, buffer, structureShape); } else { append( indentation, buffer, "{" + (shapeTracker.getOccurrenceCount(structureShape) == 1 ? " // " + structureShape.getId().getName() : "") ); checkRequired(indentation, buffer, structureShape); structureShape .getAllMembers() .values() .forEach(member -> { append(indentation + 2, buffer, member.getMemberName() + ": "); shape(member, buffer, model, indentation + 2, shapeTracker, isInput); }); append(indentation, buffer, "},\n"); } } private static void union( UnionShape unionShape, StringBuilder buffer, Model model, int indentation, ShapeTracker shapeTracker, boolean isInput ) { append( indentation, buffer, "{" + (shapeTracker.getOccurrenceCount(unionShape) == 1 ? " // " + unionShape.getId().getName() : "// ") + " Union: only one key present" ); checkRequired(indentation, buffer, unionShape); unionShape .getAllMembers() .values() .forEach(member -> { append(indentation + 2, buffer, member.getMemberName() + ": "); shape(member, buffer, model, indentation + 2, shapeTracker, isInput); }); append(indentation, buffer, "},\n"); } private static void shape( Shape shape, StringBuilder buffer, Model model, int indentation, ShapeTracker shapeTracker, boolean isInput ) { Shape target; if (shape instanceof MemberShape) { target = model.getShape(((MemberShape) shape).getTarget()).get(); } else { target = shape; } shapeTracker.mark(target, indentation); if (shapeTracker.shouldTruncate(target)) { append(indentation, buffer, "\"<" + target.getId().getName() + ">\","); checkRequired(indentation, buffer, shape); } else { switch (target.getType()) { case BIG_DECIMAL: append(indentation, buffer, "Number(\"bigdecimal\"),"); break; case BIG_INTEGER: append(indentation, buffer, "Number(\"bigint\"),"); break; case BLOB: if (isInput) { if (target.hasTrait(StreamingTrait.class)) { append( indentation, buffer, "\"MULTIPLE_TYPES_ACCEPTED\", // see \\@smithy/types -> StreamingBlobPayloadInputTypes" ); } else { append( indentation, buffer, """ new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("")""" ); } } else { if (target.hasTrait(StreamingTrait.class)) { append( indentation, buffer, "\"\", // see \\@smithy/types -> StreamingBlobPayloadOutputTypes" ); } else { append(indentation, buffer, "new Uint8Array(),"); } } break; case BOOLEAN: append(indentation, buffer, "true || false,"); break; case BYTE: append(indentation, buffer, "0, // BYTE_VALUE"); break; case DOCUMENT: append(indentation, buffer, "\"DOCUMENT_VALUE\","); break; case DOUBLE: append(indentation, buffer, "Number(\"double\"),"); break; case FLOAT: append(indentation, buffer, "Number(\"float\"),"); break; case INTEGER: append(indentation, buffer, "Number(\"int\"),"); break; case LONG: append(indentation, buffer, "Number(\"long\"),"); break; case SHORT: append(indentation, buffer, "Number(\"short\"),"); break; case STRING: append(indentation, buffer, "\"STRING_VALUE\","); break; case TIMESTAMP: append(indentation, buffer, "new Date(\"TIMESTAMP\"),"); break; case SET: case LIST: append( indentation, buffer, "[" + (shapeTracker.getOccurrenceCount(target) == 1 ? " // " + target.getId().getName() : "") ); checkRequired(indentation, buffer, shape); ListShape list = (ListShape) target; shape(list.getMember(), buffer, model, indentation + 2, shapeTracker, isInput); append(indentation, buffer, "],\n"); break; case MAP: append( indentation, buffer, "{" + (shapeTracker.getOccurrenceCount(target) == 1 ? " // " + target.getId().getName() : "") ); checkRequired(indentation, buffer, shape); append(indentation + 2, buffer, "\"\": "); MapShape map = (MapShape) target; shape( model.getShape(map.getValue().getTarget()).get(), buffer, model, indentation + 2, shapeTracker, isInput ); append(indentation, buffer, "},\n"); break; case STRUCTURE: StructureShape structure = (StructureShape) target; structure(structure, buffer, model, indentation, shapeTracker, isInput); break; case UNION: UnionShape union = (UnionShape) target; union(union, buffer, model, indentation, shapeTracker, isInput); break; case ENUM: EnumShape enumShape = (EnumShape) target; String enumeration = enumShape .getEnumValues() .values() .stream() .map(s -> "\"" + s + "\"") .collect(Collectors.joining(" || ")); append(indentation, buffer, enumeration + ","); break; case INT_ENUM: IntEnumShape intEnumShape = (IntEnumShape) target; String intEnumeration = intEnumShape .getEnumValues() .values() .stream() .map(i -> Integer.toString(i)) .collect(Collectors.joining(" || ")); append(indentation, buffer, intEnumeration + ","); break; case OPERATION: case RESOURCE: case SERVICE: case MEMBER: default: append(indentation, buffer, "\"...\","); break; } switch (target.getType()) { case STRUCTURE: case UNION: case LIST: case SET: case MAP: break; case BIG_DECIMAL: case BIG_INTEGER: case BLOB: case BOOLEAN: case BYTE: case DOCUMENT: case DOUBLE: case ENUM: case FLOAT: case INTEGER: case INT_ENUM: case LONG: case MEMBER: case OPERATION: case RESOURCE: case SERVICE: case SHORT: case STRING: case TIMESTAMP: default: checkRequired(indentation, buffer, shape); break; } } } private static void checkRequired(int indentation, StringBuilder buffer, Shape shape) { if (shape.hasTrait(RequiredTrait.class)) { append(indentation, buffer, " // required\n"); } else { append(indentation, buffer, "\n"); } } private static void append(int indentation, StringBuilder buffer, String tail) { while (indentation-- > 0) { buffer.append(" "); } buffer.append(tail); } /** * Tracks the depths at which a shape appears in the tree. * If a shape appears at too many depths it is truncated. * This handles the case of recursive shapes. */ private static final class ShapeTracker { private final Map> depths = new HashMap<>(); private final Map occurrences = new HashMap<>(); /** * Mark that a shape is observed at depth. */ public void mark(Shape shape, int depth) { if (!depths.containsKey(shape)) { depths.put(shape, new HashSet<>()); } depths.get(shape).add(depth); occurrences.put(shape, occurrences.getOrDefault(shape, 0) + 1); } /** * @return whether the shape should be truncated. */ public boolean shouldTruncate(Shape shape) { return ((shape instanceof MapShape || shape instanceof UnionShape || shape instanceof StructureShape || shape instanceof ListShape || shape instanceof SetShape) && (getOccurrenceCount(shape) > 5 || getOccurrenceDepths(shape) > 2)); } /** * @return the number of distinct depths in which the shape appears. */ public int getOccurrenceDepths(Shape shape) { return depths.getOrDefault(shape, Collections.emptySet()).size(); } /** * @return total appearances of the shape. */ public int getOccurrenceCount(Shape shape) { return occurrences.getOrDefault(shape, 0); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/AddDefaultEndpointRuleSet.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_CONFIG; import java.nio.file.Paths; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.AddBuiltinPlugins; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * This class normalizes models without endpointRuleSet traits to use the same code paths as those with ruleSet, * to make reasoning about models easier and less variable. */ @SmithyInternalApi public class AddDefaultEndpointRuleSet implements TypeScriptIntegration { public static final EndpointRuleSetTrait DEFAULT_RULESET = EndpointRuleSetTrait.builder() .ruleSet( Node.parse( """ { "version": "1.0", "parameters": { "endpoint": { "type": "string", "builtIn": "SDK::Endpoint", "documentation": "Endpoint used for making requests. Should be formatted as a URI." } }, "rules": [ { "conditions": [ { "fn": "isSet", "argv": [ { "ref": "endpoint" } ] } ], "endpoint": { "url": { "ref": "endpoint" } }, "type": "endpoint" }, { "conditions": [], "error": "(default endpointRuleSet) endpoint is not set - you must configure an endpoint.", "type": "error" } ] } """ ) ) .build(); private boolean usesDefaultEndpointRuleset = false; @Override public List runAfter() { return List.of(AddBuiltinPlugins.class.getCanonicalName()); } @Override public List getClientPlugins() { RuntimeClientPlugin endpointConfigResolver = RuntimeClientPlugin.builder() .withConventions( "@smithy/core/endpoints", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "Endpoint", HAS_CONFIG ) .build(); if (usesDefaultEndpointRuleset) { return List.of( endpointConfigResolver, RuntimeClientPlugin.builder() .withConventions( "@smithy/core/endpoints", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "EndpointRequired", HAS_CONFIG ) .build() ); } return List.of(endpointConfigResolver); } @Override public Model preprocessModel(Model model, TypeScriptSettings settings) { Model.Builder modelBuilder = model.toBuilder(); ServiceShape serviceShape = settings.getService(model); if (!serviceShape.hasTrait(EndpointRuleSetTrait.class)) { usesDefaultEndpointRuleset = true; modelBuilder.removeShape(serviceShape.toShapeId()); modelBuilder.addShape(serviceShape.toBuilder().addTrait(DEFAULT_RULESET).build()); } return modelBuilder.build(); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!settings.generateClient()) { return Collections.emptyMap(); } if (target == LanguageTarget.SHARED) { return MapUtils.of("endpointProvider", writer -> { writer.addImport( "defaultEndpointResolver", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, "endpoint/endpointResolver").toString() ); writer.write("defaultEndpointResolver"); }); } return Collections.emptyMap(); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/ClientConfigKeys.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import software.amazon.smithy.utils.SmithyInternalApi; /** * Manages known client configuration keys that should not be placed in * clientContextParams. */ @SmithyInternalApi public final class ClientConfigKeys { private static final Set KNOWN_CONFIG_KEYS = ConcurrentHashMap.newKeySet(); static { // Initialize with common client config keys KNOWN_CONFIG_KEYS.add("profile"); KNOWN_CONFIG_KEYS.add("apiKey"); KNOWN_CONFIG_KEYS.add("region"); KNOWN_CONFIG_KEYS.add("credentials"); KNOWN_CONFIG_KEYS.add("endpoint"); KNOWN_CONFIG_KEYS.add("cacheMiddleware"); KNOWN_CONFIG_KEYS.add("requestHandler"); KNOWN_CONFIG_KEYS.add("retryStrategy"); KNOWN_CONFIG_KEYS.add("retryMode"); KNOWN_CONFIG_KEYS.add("maxAttempts"); KNOWN_CONFIG_KEYS.add("logger"); KNOWN_CONFIG_KEYS.add("signer"); KNOWN_CONFIG_KEYS.add("useDualstackEndpoint"); KNOWN_CONFIG_KEYS.add("useFipsEndpoint"); KNOWN_CONFIG_KEYS.add("customUserAgent"); KNOWN_CONFIG_KEYS.add("extensions"); KNOWN_CONFIG_KEYS.add("tls"); KNOWN_CONFIG_KEYS.add("disableHostPrefix"); KNOWN_CONFIG_KEYS.add("signingRegion"); KNOWN_CONFIG_KEYS.add("sigv4aSigningRegionSet"); KNOWN_CONFIG_KEYS.add("authSchemePreference"); KNOWN_CONFIG_KEYS.add("userAgentAppId"); KNOWN_CONFIG_KEYS.add("protocol"); KNOWN_CONFIG_KEYS.add("apiVersion"); KNOWN_CONFIG_KEYS.add("serviceId"); KNOWN_CONFIG_KEYS.add("runtime"); KNOWN_CONFIG_KEYS.add("systemClockOffset"); KNOWN_CONFIG_KEYS.add("signerConstructor"); KNOWN_CONFIG_KEYS.add("endpointProvider"); KNOWN_CONFIG_KEYS.add("urlParser"); KNOWN_CONFIG_KEYS.add("base64Decoder"); KNOWN_CONFIG_KEYS.add("base64Encoder"); KNOWN_CONFIG_KEYS.add("defaultsMode"); KNOWN_CONFIG_KEYS.add("bodyLengthChecker"); KNOWN_CONFIG_KEYS.add("credentialDefaultProvider"); KNOWN_CONFIG_KEYS.add("defaultUserAgentProvider"); KNOWN_CONFIG_KEYS.add("eventStreamSerdeProvider"); KNOWN_CONFIG_KEYS.add("getAwsChunkedEncodingStream"); KNOWN_CONFIG_KEYS.add("md5"); KNOWN_CONFIG_KEYS.add("sdkStreamMixin"); KNOWN_CONFIG_KEYS.add("sha1"); KNOWN_CONFIG_KEYS.add("sha256"); KNOWN_CONFIG_KEYS.add("streamCollector"); KNOWN_CONFIG_KEYS.add("streamHasher"); KNOWN_CONFIG_KEYS.add("utf8Decoder"); KNOWN_CONFIG_KEYS.add("utf8Encoder"); KNOWN_CONFIG_KEYS.add("httpAuthSchemes"); KNOWN_CONFIG_KEYS.add("httpAuthSchemeProvider"); KNOWN_CONFIG_KEYS.add("serviceConfiguredEndpoint"); } private ClientConfigKeys() { // Utility class } /** * Add a configuration key to the known set. * * @param key the configuration key to add */ public static void addConfigKey(String key) { KNOWN_CONFIG_KEYS.add(key); } /** * Check if a key is a known configuration key. * * @param key the configuration key to check * @return true if the key is known */ public static boolean isKnownConfigKey(String key) { return KNOWN_CONFIG_KEYS.contains(key); } /** * Get custom context parameters by filtering out built-in and known config * keys. * * @param clientContextParams all client context parameters * @param builtInParams built-in parameters * @return filtered custom context parameters */ public static Map getCustomContextParams( Map clientContextParams, Map builtInParams ) { Map customContextParams = new java.util.HashMap<>(); for (Map.Entry entry : clientContextParams.entrySet()) { if ( !builtInParams.containsKey(entry.getKey()) && !KNOWN_CONFIG_KEYS.contains(entry.getKey()) ) { customContextParams.put(entry.getKey(), entry.getValue()); } } return customContextParams; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/ConditionSerializer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.Optional; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.rulesengine.language.syntax.rule.Condition; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public class ConditionSerializer { private final Condition condition; public ConditionSerializer(Condition condition) { this.condition = condition; } public ArrayNode toArrayNode() { ObjectNode node = condition.toNode().expectObjectNode(); StringNode fn = node.expectStringMember("fn"); ArrayNode argv = node.expectArrayMember("argv"); Optional assign = node.getStringMember("assign"); return assign.map(stringNode -> ArrayNode.fromNodes(fn, argv, stringNode)) .orElse(ArrayNode.fromNodes(fn, argv)); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/ConvertBdd.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.rulesengine.language.EndpointRuleSet; import software.amazon.smithy.rulesengine.logic.bdd.CostOptimization; import software.amazon.smithy.rulesengine.logic.bdd.NodeReversal; import software.amazon.smithy.rulesengine.logic.bdd.SiftingOptimization; import software.amazon.smithy.rulesengine.logic.cfg.Cfg; import software.amazon.smithy.rulesengine.traits.EndpointBddTrait; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; /** * We use this to convert the endpointRuleSet into BDD only when the * model does not have the trait already, and the available transforms were not applied. */ @SmithyUnstableApi @SmithyInternalApi public final class ConvertBdd { private ConvertBdd() {} public static EndpointBddTrait convert(Model model, TypeScriptSettings settings) { ServiceShape service = settings.getService(model); EndpointRuleSetTrait ruleSetTrait = service.expectTrait(EndpointRuleSetTrait.class); EndpointRuleSet ruleSet = ruleSetTrait.getEndpointRuleSet(); Cfg cfg = Cfg.from(ruleSet); EndpointBddTrait bddTrait = EndpointBddTrait.from(cfg); bddTrait = SiftingOptimization.builder().cfg(cfg).build().apply(bddTrait); bddTrait = CostOptimization.builder().cfg(cfg).build().apply(bddTrait); bddTrait = new NodeReversal().apply(bddTrait); return bddTrait; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/EndpointsParamNameMap.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.HashMap; import java.util.Map; /** * Map of EndpointsV2 canonical ruleset param name to generated code param names. * This allows continuity for parameter names that were decided prior to EndpointsV2 * and differ from their EndpointsV2 name. */ public final class EndpointsParamNameMap { private static final Map MAPPING = new HashMap<>(); private EndpointsParamNameMap() {} public static void setNameMapping(Map parameterNameMap) { EndpointsParamNameMap.MAPPING.clear(); MAPPING.putAll(parameterNameMap); } public static void addNameMapping(Map parameterNameMap) { MAPPING.putAll(parameterNameMap); } public static String getLocalName(String endpointsV2ParamName) { boolean isTitleCase = false; if (endpointsV2ParamName.length() >= 2) { String char1 = endpointsV2ParamName.substring(0, 1); String char2 = endpointsV2ParamName.substring(1, 2); if (char1.toUpperCase().equals(char1) && char2.toLowerCase().equals(char2)) { isTitleCase = true; } } String suggestedName = endpointsV2ParamName; if (isTitleCase) { suggestedName = endpointsV2ParamName.substring(0, 1).toLowerCase() + endpointsV2ParamName.substring(1); } return MAPPING.getOrDefault(endpointsV2ParamName, suggestedName); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/EndpointsV2Generator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.nio.file.Paths; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.rulesengine.language.syntax.rule.Condition; import software.amazon.smithy.rulesengine.language.syntax.rule.Rule; import software.amazon.smithy.rulesengine.logic.bdd.Bdd; import software.amazon.smithy.rulesengine.traits.EndpointBddTrait; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDelegator; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.util.PatternDetectionCompression; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates a service endpoint resolver. */ @SmithyInternalApi public final class EndpointsV2Generator implements Runnable { public static final String ENDPOINT_FOLDER = "endpoint"; public static final String ENDPOINT_PARAMETERS_MODULE_NAME = "EndpointParameters"; public static final String ENDPOINT_RESOLVER_MODULE_NAME = "endpointResolver"; public static final String ENDPOINT_PARAMETERS_MODULE = Paths.get( ".", CodegenUtils.SOURCE_FOLDER, EndpointsV2Generator.ENDPOINT_FOLDER, EndpointsV2Generator.ENDPOINT_PARAMETERS_MODULE_NAME ).toString(); public static final Dependency ENDPOINT_PARAMETERS_DEPENDENCY = new Dependency() { @Override public String getPackageName() { return ENDPOINT_PARAMETERS_MODULE; } @Override public List getDependencies() { return Collections.emptyList(); } }; public static final String ENDPOINT_RESOLVER_MODULE = Paths.get( ".", CodegenUtils.SOURCE_FOLDER, EndpointsV2Generator.ENDPOINT_FOLDER, EndpointsV2Generator.ENDPOINT_RESOLVER_MODULE_NAME ).toString(); public static final Dependency ENDPOINT_RESOLVER_DEPENDENCY = new Dependency() { @Override public String getPackageName() { return ENDPOINT_RESOLVER_MODULE; } @Override public List getDependencies() { return Collections.emptyList(); } }; static final String ENDPOINT_PARAMETERS_FILE = ENDPOINT_PARAMETERS_MODULE_NAME + ".ts"; static final String ENDPOINT_RESOLVER_FILE = ENDPOINT_RESOLVER_MODULE_NAME + ".ts"; static final String ENDPOINT_RULESET_FILE = "ruleset.ts"; static final String ENDPOINT_BDD_FILE = "bdd.ts"; private final TypeScriptDelegator delegator; private final EndpointRuleSetTrait endpointRuleSetTrait; private final EndpointBddTrait endpointBddTrait; private final ServiceShape service; private final TypeScriptSettings settings; private final RuleSetParameterFinder ruleSetParameterFinder; public EndpointsV2Generator(TypeScriptDelegator delegator, TypeScriptSettings settings, Model model) { this.delegator = delegator; service = settings.getService(model); this.settings = settings; endpointRuleSetTrait = service .getTrait(EndpointRuleSetTrait.class) .orElseThrow(() -> new RuntimeException("service or model preprocessor missing EndpointRuleSetTrait")); endpointBddTrait = service.getTrait(EndpointBddTrait.class).orElse(ConvertBdd.convert(model, settings)); ruleSetParameterFinder = new RuleSetParameterFinder(service); } @Override public void run() { generateEndpointParameters(); generateEndpointResolver(); if (settings.generateEndpointBdd()) { generateEndpointBdd(); } else { generateEndpointRuleset(); } } /** * Generate the EndpointParameters interface file specific to this service. */ private void generateEndpointParameters() { this.delegator.useFileWriter( Paths.get(CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_PARAMETERS_FILE).toString(), writer -> { writer.addTypeImport("EndpointParameters", "__EndpointParameters", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Provider", null, TypeScriptDependency.SMITHY_TYPES); Map clientContextParams = ruleSetParameterFinder.getClientContextParams(); Map builtInParams = ruleSetParameterFinder.getBuiltInParams(); builtInParams.keySet().removeIf(OmitEndpointParams::isOmitted); Map customContextParams = ClientConfigKeys.getCustomContextParams( clientContextParams, builtInParams ); writer.writeDocs("@public"); writer.openBlock( "export interface ClientInputEndpointParameters {", "}", () -> { // Only include client context params that are NOT built-ins Map clientContextParamsExcludingBuiltIns = new HashMap<>(clientContextParams); clientContextParamsExcludingBuiltIns.keySet().removeAll(builtInParams.keySet()); if (!clientContextParamsExcludingBuiltIns.isEmpty()) { writer.write("clientContextParams?: {"); writer.indent(); ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode(); ruleSet.getObjectMember("parameters").ifPresent(parameters -> { parameters.accept( new RuleSetParametersVisitor( writer, clientContextParamsExcludingBuiltIns, true ) ); }); writer.dedent(); writer.write("};"); } // Add direct params (built-ins + custom context params, excluding conflicting) Map directParams = new HashMap<>(); // Add all built-ins (they should always be at root level, even if conflicting) directParams.putAll(builtInParams); // Add custom context params excluding conflicting ones customContextParams.entrySet().forEach(entry -> { String paramName = entry.getKey(); String localName = EndpointsParamNameMap .getLocalName(paramName); if ( !ClientConfigKeys.isKnownConfigKey(paramName) && !ClientConfigKeys.isKnownConfigKey(localName) ) { directParams.put(paramName, entry.getValue()); } }); ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode(); ruleSet.getObjectMember("parameters").ifPresent(parameters -> { parameters.accept(new RuleSetParametersVisitor(writer, directParams, true)); }); } ); writer.write(""); writer.writeDocs("@public"); writer.write( """ export type ClientResolvedEndpointParameters = Omit & { defaultSigningName: string; };""" ); if (ruleSetParameterFinder.hasCustomClientContextParams()) { ruleSetParameterFinder.writeNestedClientContextParamDefaults(writer); } writer.write(""); writer.writeDocs("@internal"); writer.openBlock(""" export const resolveClientEndpointParameters = ( options: T & ClientInputEndpointParameters ): T & ClientResolvedEndpointParameters => {""", "};", () -> { writer.openBlock("return Object.assign(options, {", "});", () -> { ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode(); ruleSet .getObjectMember("parameters") .ifPresent(parameters -> { parameters.accept(new RuleSetParametersVisitor(writer, true)); }); writer.write( "defaultSigningName: \"$L\",", settings.getDefaultSigningName() ); if (ruleSetParameterFinder.hasCustomClientContextParams()) { ruleSetParameterFinder.writeConfigResolverNestedClientContextParams(writer); } }); } ); writer.write(""); writer.writeDocs("@internal"); writer.openBlock("export const commonParams = {", "} as const;", () -> { Set paramNames = new HashSet<>(); ruleSetParameterFinder .getClientContextParams() .forEach((name, type) -> { if (!paramNames.contains(name)) { writer.write( "$L: { type: \"clientContextParams\", name: \"$L\" },", name, EndpointsParamNameMap.getLocalName(name) ); } paramNames.add(name); }); ruleSetParameterFinder .getBuiltInParams() .forEach((name, type) -> { if (!paramNames.contains(name)) { writer.write( "$L: { type: \"builtInParams\", name: \"$L\" },", name, EndpointsParamNameMap.getLocalName(name) ); } paramNames.add(name); }); }); writer.write(""); writer.writeDocs("@internal"); writer.openBlock("export interface EndpointParameters extends __EndpointParameters {", "}", () -> { ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode(); ruleSet .getObjectMember("parameters") .ifPresent(parameters -> { parameters.accept(new RuleSetParametersVisitor(writer)); }); }); } ); } /** * Generate the resolver function for this service. */ private void generateEndpointResolver() { this.delegator.useFileWriter( Paths.get(CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_RESOLVER_FILE).toString(), writer -> { writer.addTypeImport("EndpointV2", null, TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Logger", null, TypeScriptDependency.SMITHY_TYPES); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addTypeImportSubmodule( "EndpointParams", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); if (settings.generateEndpointBdd()) { writer.addImportSubmodule( "decideEndpoint", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); writer.addRelativeImport( "bdd", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_BDD_FILE.replace(".ts", "") ) ); } else { writer.addImportSubmodule( "resolveEndpoint", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); writer.addRelativeImport( "ruleSet", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_RULESET_FILE.replace(".ts", "") ) ); } writer.addRelativeTypeImport( "EndpointParameters", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_PARAMETERS_FILE.replace(".ts", "") ) ); writer.addImportSubmodule( "EndpointCache", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); List effectiveParams = ruleSetParameterFinder.getEffectiveParams(); boolean longList = effectiveParams.size() >= 8; if (longList) { writer.openBlock("const cache = new EndpointCache({", "});", () -> { writer.write("size: 50,"); writer.openBlock("params: [", "],", () -> { effectiveParams .forEach(param -> { writer.write("$S,", param); }); }); }); writer.write(""); } else { writer.write( """ const cache = new EndpointCache({ size: 50, params: [$L], }); """, effectiveParams .stream() .collect(Collectors.joining("\", \"", "\"", "\"")) ); } writer.writeDocs("@internal"); writer.write( """ export const defaultEndpointResolver = ( endpointParams: EndpointParameters, context: { logger?: Logger } = {} ): EndpointV2 => { return cache.get(endpointParams as EndpointParams, () => $L, { endpointParams: endpointParams as EndpointParams, logger: context.logger, }) ); }; """, settings.generateEndpointBdd() ? "decideEndpoint(bdd" : "resolveEndpoint(ruleSet" ); } ); } /** * Generate the ruleset (dynamic resolution only). */ private void generateEndpointRuleset() { this.delegator.useFileWriter( Paths.get(CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_RULESET_FILE).toString(), writer -> { writer.addTypeImport("RuleSetObject", null, TypeScriptDependency.SMITHY_TYPES); writer.writeInline("export const ruleSet: RuleSetObject = "); new RuleSetSerializer(endpointRuleSetTrait.getRuleSet(), writer).generate(); } ); } private void generateEndpointBdd() { if (endpointBddTrait == null) { throw new RuntimeException("generateEndpointBdd() called but endpointBddTrait is null."); } this.delegator.useFileWriter( Paths.get(CodegenUtils.SOURCE_FOLDER, ENDPOINT_FOLDER, ENDPOINT_BDD_FILE).toString(), writer -> { ObjectNode conditionsAndResults = ObjectNode.fromStringMap(Collections.emptyMap()); List conditions = endpointBddTrait.getConditions(); conditionsAndResults = conditionsAndResults.withMember( "conditions", ArrayNode.fromNodes( conditions.stream().map(c -> new ConditionSerializer(c).toArrayNode()).toList() ) ); List results = endpointBddTrait.getResults(); conditionsAndResults = conditionsAndResults.withMember( "results", ArrayNode.fromNodes( results.stream().map(r -> new RuleSerializer(r).toArrayNode()).toList() ) ); writer.write( new PatternDetectionCompression(conditionsAndResults).compress() ); Bdd bdd = endpointBddTrait.getBdd(); writer.write( """ const root = $L; const r = 100_000_000; const nodes = new Int32Array([""", endpointBddTrait.getBdd().getRootRef() ).indent(); bdd.getNodes((i, hi, lo) -> { writer.write( """ $L, $L, $L,""", shortestJsLiteral(i), shortestJsLiteral(hi), shortestJsLiteral(lo) ); }); writer.dedent().write(""" ]);"""); writer.addImportSubmodule( "BinaryDecisionDiagram", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.ENDPOINTS ); writer.write(""" export const bdd = BinaryDecisionDiagram.from( nodes, root, _data.conditions, _data.results );"""); } ); } private static String shortestJsLiteral(int value) { String decimal = Integer.toString(value); String hex = "0x" + Integer.toHexString(value).toUpperCase(); String octal = "0o" + Integer.toOctalString(value); String binary = "0b" + Integer.toBinaryString(value); String shortest = decimal; if (hex.length() < shortest.length()) { shortest = hex; } if (octal.length() < shortest.length()) { shortest = octal; } if (binary.length() < shortest.length()) { shortest = binary; } if (shortest.equals(decimal) && value >= 100000000) { return "r + " + (value - 100000000); } return shortest; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/OmitEndpointParams.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.Collections; import java.util.HashSet; import java.util.Set; /** * Manages a collection of endpoint parameter names to be omitted from a specific interface. * While this could be extensible in the future, as of right now, * this collection is maintaining endpoint params to be omitted from the `ClientInputEndpointParameters` interface. */ public final class OmitEndpointParams { private static final Set OMITTED_PARAMS = new HashSet<>(); private OmitEndpointParams() {} public static void addOmittedParams(Set paramNames) { OMITTED_PARAMS.addAll(paramNames); } public static boolean isOmitted(String paramName) { return OMITTED_PARAMS.contains(paramName); } public static Set getOmittedParams() { return Collections.unmodifiableSet(OMITTED_PARAMS); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/ParameterGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.AbstractMap; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; import software.amazon.smithy.model.node.BooleanNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; /** * Owner for a parameter object node in the EndpointRuleSet. */ public class ParameterGenerator { private final String parameterName; private final Node param; private boolean required = false; private boolean isInputKey; private String tsParamType = "string"; /** * @param key - the param name. * @param param - the param value. * @param isInputKey - whether the key is a client input key. This is * distinct from canonical endpoint param name * because it has been transformed to match * pre-existing keys in published clients. */ public ParameterGenerator(String key, Node param, boolean isInputKey) { parameterName = key; this.param = param; this.isInputKey = isInputKey; ObjectNode paramNode = param .asObjectNode() .orElseThrow(() -> new RuntimeException("param node is not object node.")); Optional requiredNode = paramNode.getBooleanMember("required"); requiredNode.ifPresent(booleanNode -> required = booleanNode.getValue()); Optional type = paramNode.getStringMember("type"); if (type.isPresent()) { switch (type.get().getValue()) { case "String": case "string": tsParamType = "string"; break; case "Boolean": case "boolean": tsParamType = "boolean"; break; case "stringArray": tsParamType = "string[]"; break; default: // required by linter } } } public ParameterGenerator(String key, Node param) { this(key, param, false); } public boolean isBuiltIn() { return param.expectObjectNode().containsMember("builtIn"); } public boolean hasDefault() { return param.expectObjectNode().containsMember("default"); } public String defaultAsCodeString() { if (!hasDefault()) { return ""; } String buffer = ""; buffer += parameterName; buffer += ": "; buffer += "options." + parameterName + " ?? "; ObjectNode paramNode = param.expectObjectNode(); StringNode type = paramNode.expectStringMember("type"); switch (type.getValue()) { case "String": case "string": buffer += "\"" + paramNode.expectStringMember("default").getValue() + "\""; break; case "Boolean": case "boolean": buffer += paramNode.expectBooleanMember("default").getValue() ? "true" : "false"; break; case "stringArray": buffer += paramNode .expectArrayMember("default") .getElements() .stream() .map(element -> element.expectStringNode().getValue()) .collect(Collectors.joining("`, `", "[`", "`]")); break; default: throw new RuntimeException("Unhandled endpoint param type: " + type.getValue()); } buffer += ","; return buffer; } public Map.Entry getNameAndType() { return new AbstractMap.SimpleEntry<>(parameterName, tsParamType); } /** * Used to generate interface line for EndpointParameters.ts. */ public String toCodeString(boolean isClientContextParam) { String buffer = ""; buffer += parameterName; boolean optional = !required || hasDefault() || isClientContextParam; if (optional) { buffer += "?"; } buffer += ": "; if (parameterName.equals("endpoint") && isInputKey) { buffer += "string | Provider | Endpoint | Provider | EndpointV2 | Provider;"; } else { if (optional) { if (isClientContextParam) { buffer += (tsParamType + " | undefined | Provider<" + tsParamType + " | undefined>") + ";"; } else { buffer += tsParamType + " | undefined;"; } } else { buffer += tsParamType + ";"; } } return buffer; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSerializer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.List; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.NumberNode; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.rulesengine.language.syntax.rule.Condition; import software.amazon.smithy.rulesengine.language.syntax.rule.EndpointRule; import software.amazon.smithy.rulesengine.language.syntax.rule.ErrorRule; import software.amazon.smithy.rulesengine.language.syntax.rule.NoMatchRule; import software.amazon.smithy.rulesengine.language.syntax.rule.Rule; import software.amazon.smithy.rulesengine.language.syntax.rule.TreeRule; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public class RuleSerializer { /** * Note: the rules will not contain conditions, nor TreeRules. */ private final Rule rule; public RuleSerializer(Rule rule) { this.rule = rule; List conditions = rule.getConditions(); if (conditions != null && !conditions.isEmpty()) { throw new IllegalArgumentException("Endpoint rules for BDD must not contain conditions."); } } public ArrayNode toArrayNode() { ArrayNode array = ArrayNode.fromNodes(); if (rule instanceof EndpointRule endpointRule) { ObjectNode epNode = endpointRule.getEndpoint().toNode().expectObjectNode(); Node url = epNode.expectMember("url"); ObjectNode propertiesNode = epNode.expectObjectMember("properties"); ObjectNode headersNode = epNode.expectObjectMember("headers"); array = headersNode.isEmpty() ? array .withValue(url) .withValue(propertiesNode) : array .withValue(url) .withValue(propertiesNode) .withValue(headersNode); } else if (rule instanceof ErrorRule errorRule) { array = array .withValue(NumberNode.from(-1)) .withValue(errorRule.getError().toNode()); } else if (rule instanceof NoMatchRule) { array = array.withValue(NumberNode.from(-1)); } else if (rule instanceof TreeRule) { throw new IllegalArgumentException("BDD should not have TreeRule objects."); } else { throw new IllegalArgumentException("Unrecognized rule type: " + rule.getClass().getName()); } return array; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSetParameterFinder.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Queue; import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; import java.util.stream.Collectors; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.NodeVisitor; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.rulesengine.language.Endpoint; import software.amazon.smithy.rulesengine.language.EndpointRuleSet; import software.amazon.smithy.rulesengine.language.syntax.expressions.Expression; import software.amazon.smithy.rulesengine.language.syntax.rule.Condition; import software.amazon.smithy.rulesengine.language.syntax.rule.EndpointRule; import software.amazon.smithy.rulesengine.language.syntax.rule.ErrorRule; import software.amazon.smithy.rulesengine.language.syntax.rule.Rule; import software.amazon.smithy.rulesengine.language.syntax.rule.TreeRule; import software.amazon.smithy.rulesengine.traits.ClientContextParamsTrait; import software.amazon.smithy.rulesengine.traits.ContextParamTrait; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.rulesengine.traits.OperationContextParamsTrait; import software.amazon.smithy.rulesengine.traits.StaticContextParamsTrait; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public class RuleSetParameterFinder { public static final Pattern URL_PARAMETERS = Pattern.compile("\\{(\\w+)[}#]"); private final ServiceShape service; private final EndpointRuleSetTrait ruleset; public RuleSetParameterFinder(ServiceShape service) { this.service = service; this.ruleset = service .getTrait(EndpointRuleSetTrait.class) .orElseThrow(() -> new RuntimeException("Service does not have EndpointRuleSetTrait.")); } /** * It's possible for a parameter to pass validation, i.e. exist in the modeled shapes * and be used in endpoint tests, but have no actual effect on endpoint resolution. * * @return the list of endpoint parameters that are actually used in endpoint resolution. */ public List getEffectiveParams() { Set effectiveParams = new TreeSet<>(); EndpointRuleSet endpointRuleSet = ruleset.getEndpointRuleSet(); Set initialParams = new HashSet<>(); endpointRuleSet .getParameters() .forEach(parameter -> { initialParams.add(parameter.getName().getName().getValue()); }); Queue ruleQueue = new ArrayDeque<>(endpointRuleSet.getRules()); Queue conditionQueue = new ArrayDeque<>(); Queue argQueue = new ArrayDeque<>(); while (!ruleQueue.isEmpty() || !conditionQueue.isEmpty() || !argQueue.isEmpty()) { while (!argQueue.isEmpty()) { Node arg = argQueue.poll(); if (arg.isObjectNode()) { Optional ref = arg.expectObjectNode().getMember("ref"); if (ref.isPresent()) { String refName = ref.get().expectStringNode().getValue(); if (initialParams.contains(refName)) { effectiveParams.add(refName); } } Optional argv = arg.expectObjectNode().getMember("argv"); if (argv.isPresent()) { ArrayNode nestedArgv = argv.get().expectArrayNode(); for (Node nestedArg : nestedArgv) { if (nestedArg.isObjectNode()) { argQueue.add(nestedArg.expectObjectNode()); } } } } else if (arg.isStringNode()) { String argString = arg.expectStringNode().getValue(); URL_PARAMETERS.matcher(argString) .results() .forEach(matchResult -> { if (matchResult.groupCount() >= 1) { if (initialParams.contains(matchResult.group(1))) { effectiveParams.add(matchResult.group(1)); } } }); } } while (!conditionQueue.isEmpty()) { Condition condition = conditionQueue.poll(); ArrayNode argv = condition.toNode().expectObjectNode().expectArrayMember("argv"); for (Node arg : argv) { argQueue.add(arg); } } Rule rule = ruleQueue.poll(); if (null == rule) { continue; } List conditions = rule.getConditions(); conditionQueue.addAll(conditions); if (rule instanceof TreeRule treeRule) { ruleQueue.addAll(treeRule.getRules()); } else if (rule instanceof EndpointRule endpointRule) { Endpoint endpoint = endpointRule.getEndpoint(); Expression url = endpoint.getUrl(); String urlString = url.toString(); URL_PARAMETERS.matcher(urlString) .results() .forEach(matchResult -> { if (matchResult.groupCount() >= 1) { if (initialParams.contains(matchResult.group(1))) { effectiveParams.add(matchResult.group(1)); } } }); } else if (rule instanceof ErrorRule errorRule) { // no additional use of endpoint parameters in error rules. } } return new ArrayList<>(effectiveParams); } /** * TODO(endpointsv2) From definitions in EndpointRuleSet.parameters, or * TODO(endpointsv2) are they from the closed set? */ public Map getBuiltInParams() { Map map = new HashMap<>(); ObjectNode ruleSet = ruleset.getRuleSet().expectObjectNode(); ruleSet .getObjectMember("parameters") .ifPresent(parameters -> { parameters.accept(new RuleSetParameterFinderVisitor(map)); }); return map; } /** * Check if there are custom client context parameters. */ public boolean hasCustomClientContextParams() { Map clientContextParams = getClientContextParams(); Map builtInParams = getBuiltInParams(); builtInParams.keySet().removeIf(OmitEndpointParams::isOmitted); Map customContextParams = ClientConfigKeys.getCustomContextParams( clientContextParams, builtInParams ); return !customContextParams.isEmpty(); } /** * Write custom client context parameters to TypeScript writer. */ public void writeInputConfigCustomClientContextParams(TypeScriptWriter writer) { Map clientContextParams = getClientContextParams(); Map builtInParams = getBuiltInParams(); builtInParams.keySet().removeIf(OmitEndpointParams::isOmitted); Map customContextParams = ClientConfigKeys.getCustomContextParams( clientContextParams, builtInParams ); ObjectNode ruleSet = ruleset.getRuleSet().expectObjectNode(); ruleSet.getObjectMember("parameters").ifPresent(parameters -> { parameters.accept(new RuleSetParametersVisitor(writer, customContextParams, true)); }); } /** * Write nested client context parameter defaults to TypeScript writer. * Only includes conflicting parameters with default values. */ public void writeNestedClientContextParamDefaults(TypeScriptWriter writer) { Map clientContextParams = getClientContextParams(); Map builtInParams = getBuiltInParams(); builtInParams.keySet().removeIf(OmitEndpointParams::isOmitted); ObjectNode ruleSet = ruleset.getRuleSet().expectObjectNode(); if (ruleSet.getObjectMember("parameters").isPresent()) { ObjectNode parameters = ruleSet.getObjectMember("parameters").get().expectObjectNode(); writer.write(""); writer.writeDocs("@internal"); writer.openCollapsibleBlock( "const clientContextParamDefaults = {", "} as const;", clientContextParams.keySet() .stream() .anyMatch(k -> { return ClientConfigKeys.isKnownConfigKey(k) && !builtInParams.containsKey(k) && parameters.getObjectMember(k).stream().anyMatch(n -> n.containsMember("default")); }), () -> { // Write defaults only for conflicting parameters for (String paramName : clientContextParams.keySet()) { // Check if this is a conflicting parameter (exists in both clientContextParams and knownConfigKeys) if (ClientConfigKeys.isKnownConfigKey(paramName) && !builtInParams.containsKey(paramName)) { ObjectNode paramNode = parameters.getObjectMember(paramName).orElse(null); if (paramNode != null && paramNode.containsMember("default")) { Node defaultValue = paramNode.getMember("default").get(); if (defaultValue.isStringNode()) { writer.write("$L: \"$L\",", paramName, defaultValue.expectStringNode().getValue()); } else if (defaultValue.isBooleanNode()) { writer.write("$L: $L,", paramName, defaultValue.expectBooleanNode().getValue()); } } } } } ); } } /** * Write config resolver nested client context parameters to TypeScript writer. */ public void writeConfigResolverNestedClientContextParams(TypeScriptWriter writer) { Map clientContextParams = getClientContextParams(); Map builtInParams = getBuiltInParams(); builtInParams.keySet().removeIf(OmitEndpointParams::isOmitted); Map customContextParams = ClientConfigKeys.getCustomContextParams( clientContextParams, builtInParams ); ObjectNode ruleSet = ruleset.getRuleSet().expectObjectNode(); boolean hasDefaultsForResolve = false; if (ruleSet.getObjectMember("parameters").isPresent()) { ObjectNode parameters = ruleSet.getObjectMember("parameters").get().expectObjectNode(); hasDefaultsForResolve = customContextParams.entrySet() .stream() .anyMatch(entry -> { ObjectNode paramNode = parameters.getObjectMember(entry.getKey()).orElse(null); return paramNode != null && paramNode.containsMember("default"); }); } if (hasDefaultsForResolve) { writer.write( "clientContextParams: Object.assign(clientContextParamDefaults, " + "options.clientContextParams)," ); } else { writer.write( "clientContextParams: options.clientContextParams ?? {}," ); } } /** * Defined on the service shape as smithy.rules#clientContextParams traits. */ public Map getClientContextParams() { Map map = new HashMap<>(); Optional trait = service.getTrait(ClientContextParamsTrait.class); if (trait.isPresent()) { ClientContextParamsTrait clientContextParamsTrait = trait.get(); clientContextParamsTrait .getParameters() .forEach((name, definition) -> { ShapeType shapeType = definition.getType(); if (shapeType.isShapeType(ShapeType.STRING) || shapeType.isShapeType(ShapeType.BOOLEAN)) { map.put( name, // "boolean" and "string" are directly usable in TS. definition.getType().toString().toLowerCase() ); } else if (shapeType.isShapeType(ShapeType.LIST)) { map.put( name, "string[]" // Only string lists are supported. ); } else { throw new RuntimeException( "unexpected type " + definition.getType().toString() + " received as clientContextParam." ); } }); } return map; } /** * Get map of params to actual values instead of the value type. */ public Map getStaticContextParamValues(OperationShape operation) { Map map = new HashMap<>(); Optional trait = operation.getTrait(StaticContextParamsTrait.class); if (trait.isPresent()) { StaticContextParamsTrait staticContextParamsTrait = trait.get(); staticContextParamsTrait .getParameters() .forEach((name, definition) -> { String value; if (definition.getValue().isStringNode()) { value = "`" + definition.getValue().expectStringNode().toString() + "`"; } else if (definition.getValue().isBooleanNode()) { value = definition.getValue().expectBooleanNode().toString(); } else if (definition.getValue().isArrayNode()) { ArrayNode arrayNode = definition.getValue().expectArrayNode(); value = arrayNode .getElements() .stream() .map(element -> element.expectStringNode().getValue()) .collect(Collectors.joining("`, `", "[`", "`]")); } else { throw new RuntimeException( "unexpected type " + definition.getValue().getType().toString() + " received as staticContextParam." ); } map.put(name, value); }); } return map; } /** * The contextParam trait allows for binding a structure's member value to a context * parameter name. This trait MUST target a member shape on an operation's input structure. * The targeted endpoint parameter MUST be a type that is compatible with member's * shape targeted by the trait. */ public Map getContextParams(Shape operationInput) { Map map = new HashMap<>(); if (operationInput.isStructureShape()) { operationInput .getAllMembers() .forEach((String memberName, MemberShape member) -> { Optional trait = member.getTrait(ContextParamTrait.class); if (trait.isPresent()) { ContextParamTrait contextParamTrait = trait.get(); String name = contextParamTrait.getName(); map.put(name, member.getMemberName()); } }); } return map; } /** * Get map of params to JavaScript equivalent of provided JMESPath expressions. */ public Map getOperationContextParamValues(OperationShape operation) { Map map = new HashMap<>(); Optional trait = operation.getTrait(OperationContextParamsTrait.class); if (trait.isPresent()) { trait .get() .getParameters() .forEach((name, definition) -> { String separator = "?."; String value = "input"; String path = definition.getPath(); value = getJmesPathExpression(separator, value, path); // Remove no-op map, if it exists. final String noOpMap = "map((obj: any) => obj"; if (value.endsWith(separator + noOpMap)) { value = value.substring(0, value.length() - noOpMap.length() - separator.length()); } // Close all open brackets. value += ")".repeat( (int) (value .chars() .filter(ch -> ch == '(') .count() - value .chars() .filter(ch -> ch == ')') .count()) ); map.put(name, value); }); } return map; } String getJmesPathExpression(String separator, String value, String path) { // Split JMESPath expression string on separator and add JavaScript equivalent. while (path.length() > 0) { if (path.startsWith("[") && !path.startsWith("[*]")) { // Process MultiSelect List https://jmespath.org/specification.html#multiselect-list if (value.endsWith("obj")) { value = value.substring(0, value.length() - 3); } value += "["; path = path.substring(1); while (true) { int commaIndex = path.indexOf(","); int sepIndex = (commaIndex == -1) ? path.indexOf("]") : commaIndex; String part = path.substring(0, sepIndex); path = path.substring(sepIndex + 1).trim(); value += getJmesPathExpression(separator, "obj", part) + ","; if (commaIndex == -1) { // Remove trailing comma and close bracket. value = value.substring(0, value.length() - 1) + "].filter((i) => i))"; break; } } // Process Flatten operator https://jmespath.org/specification.html#flatten-operator if (path.startsWith("[]")) { value += ".flat()"; path = path.substring(2); } continue; } int dotIndex = path.indexOf("."); String part = dotIndex == -1 ? path : path.substring(0, dotIndex); path = dotIndex == -1 ? "" : path.substring(dotIndex + 1); value = getJmesPathExpressionSection(separator, value, part); } return value; } private String getJmesPathExpressionSection(String separator, String value, String part) { if (value.endsWith(")")) { // The value is an object, which needs to run on map. value += ".map((obj: any) => obj"; } // Process keys https://jmespath.org/specification.html#keys if (part.startsWith("keys(")) { // Get provided object for which keys are to be extracted. String object = part.substring(5, part.length() - 1); value = "Object.keys(" + value + separator + object + " ?? {})"; return value; } // Process list wildcard expression https://jmespath.org/specification.html#wildcard-expressions if (part.equals("*") || part.equals("[*]")) { value = "Object.values(" + value + " ?? {})"; return value; } // Process hash wildcard expression https://jmespath.org/specification.html#wildcard-expressions if (part.endsWith("[*]")) { // Get key to run hash wildcard on. String key = part.substring(0, part.length() - 3); value = value + separator + key + separator + "map((obj: any) => obj"; return value; } // Process Flatten operator https://jmespath.org/specification.html#flatten-operator if (part.endsWith("[]")) { // Get key to run hash wildcard on. String key = part.substring(0, part.length() - 2); // If key is on list item if (key.endsWith("[*]")) { value = value + separator + key.substring(0, key.length() - 3) + ".flat()"; } else { // key is on object value = value + separator + key + ").flat()"; } return value; } // Treat remaining part as identifier without spaces https://jmespath.org/specification.html#identifiers value += separator + part; return value; } private static class RuleSetParameterFinderVisitor extends NodeVisitor.Default { private final Map map; RuleSetParameterFinderVisitor(Map map) { this.map = map; } @Override public Void objectNode(ObjectNode node) { Map members = node.getMembers(); for (Map.Entry entry : members.entrySet()) { String key = entry.getKey().getValue(); Node param = entry.getValue(); ParameterGenerator parameterGenerator = new ParameterGenerator(key, param); if (parameterGenerator.isBuiltIn()) { Map.Entry nameAndType = parameterGenerator.getNameAndType(); map.put(nameAndType.getKey(), nameAndType.getValue()); } } return null; } @Override protected Void getDefault(Node node) { return null; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSetParametersVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import java.util.HashMap; import java.util.Map; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.NodeVisitor; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.node.StringNode; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; /** * Writes endpoint ruleset params into a client-specific config resolver step, applying defaults as needed. */ public class RuleSetParametersVisitor extends NodeVisitor.Default { private final TypeScriptWriter writer; private final Map clientContextParams; private boolean useLocalNames = false; private boolean writeDefaults = false; public RuleSetParametersVisitor(TypeScriptWriter writer) { this.writer = writer; this.clientContextParams = new HashMap<>(); } public RuleSetParametersVisitor( TypeScriptWriter writer, Map clientContextParams, boolean useLocalNames ) { this.writer = writer; this.clientContextParams = clientContextParams; this.useLocalNames = useLocalNames; } public RuleSetParametersVisitor(TypeScriptWriter writer, boolean writeDefaults) { this(writer); this.writeDefaults = writeDefaults; this.useLocalNames = true; } @Override public Void objectNode(ObjectNode node) { Map members = node.getMembers(); for (Map.Entry entry : members.entrySet()) { String key = entry.getKey().getValue(); String localKey = key; Node param = entry.getValue(); if (useLocalNames) { localKey = EndpointsParamNameMap.getLocalName(key); } ParameterGenerator parameterGenerator = new ParameterGenerator(localKey, param, useLocalNames); if (localKey.equals("endpoint")) { writer.addTypeImport("Endpoint", null, TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("EndpointV2", null, TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Provider", null, TypeScriptDependency.SMITHY_TYPES); } if (writeDefaults) { if (parameterGenerator.hasDefault()) { // Don't write root-level defaults for conflicting parameters if (!ClientConfigKeys.isKnownConfigKey(key)) { writer.write(parameterGenerator.defaultAsCodeString()); } } } else if (clientContextParams.isEmpty() || clientContextParams.containsKey(key)) { boolean isClientContextParams = !clientContextParams.isEmpty(); writer.write(parameterGenerator.toCodeString(isClientContextParams)); } } return null; } @Override protected Void getDefault(Node node) { return null; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSetSerializer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.util.PropertyAccessor; public class RuleSetSerializer { private final Node ruleSet; private final TypeScriptWriter writer; public RuleSetSerializer(Node ruleSet, TypeScriptWriter writer) { this.ruleSet = ruleSet; this.writer = writer; } /** * Write the ruleset as a TS object. */ public void generate() { ObjectNode objectNode = ruleSet.expectObjectNode(); writer.openCollapsibleBlock("{", "};", !objectNode.getMembers().isEmpty(), () -> { objectNode .getMembers() .forEach((k, v) -> { writer.writeInline(PropertyAccessor.inlineKey(k.toString()) + ": "); traverse(v); }); }); } private void traverse(Node node) { if (node.isObjectNode()) { ObjectNode objectNode = node.expectObjectNode(); writer.openCollapsibleBlock("{", "},", !objectNode.getMembers().isEmpty(), () -> { objectNode .getMembers() .forEach((k, v) -> { writer.writeInline(PropertyAccessor.inlineKey(k.toString()) + ": "); traverse(v); }); }); } else if (node.isArrayNode()) { ArrayNode arrayNode = node.expectArrayNode(); writer.openCollapsibleBlock("[", "],", !arrayNode.getElements().isEmpty(), () -> { arrayNode.getElements().forEach(this::traverse); }); } else if (node.isBooleanNode()) { writer.write("$L,", node.expectBooleanNode().getValue()); } else if (node.isNumberNode()) { Number number = node.expectNumberNode().getValue(); float floatValue = number.floatValue(); int intValue = number.intValue(); if (floatValue == Math.floor(floatValue)) { writer.write("$L,", intValue); } else { writer.write("$L,", floatValue); } } else if (node.isStringNode()) { String stringValue = node.expectStringNode().getValue(); if (stringValue.contains("\"")) { writer.write("`$L`,", stringValue.replaceAll("`", "\\\\`")); } else { writer.write("\"$L\",", stringValue); } } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/extensions/DefaultExtensionConfigurationInterface.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.extensions; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.utils.Pair; public class DefaultExtensionConfigurationInterface implements ExtensionConfigurationInterface { @Override public Pair name() { return Pair.of("DefaultExtensionConfiguration", TypeScriptDependency.SMITHY_TYPES); } @Override public Pair getExtensionConfigurationFn() { return Pair.of("getDefaultExtensionConfiguration", TypeScriptDependency.SMITHY_CORE); } @Override public Pair resolveRuntimeConfigFn() { return Pair.of("resolveDefaultRuntimeConfig", TypeScriptDependency.SMITHY_CORE); } @Override public String submodule() { return SmithyCoreSubmodules.CLIENT; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/extensions/ExtensionConfigurationInterface.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.extensions; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SmithyInternalApi; /** * An interface class for defining the service client configuration. */ @SmithyInternalApi public interface ExtensionConfigurationInterface { /** * Define the interface name. * * @return Returns the interface name and the corresponding dependency package */ Pair name(); /** * Define a function that returns an object instance that implements the interface. * *

{@code
     * interface TimeoutClientConfiguration {
     *   setTimeout(timeout: number): void;
     *   timeout(): timeout;
     * }
     *
     * const getTimeoutClientConfigurationFn = (runtimeConfig: any) => {
     *     let timeout: number = 100;
     *     if (runtimeConfig.timeout !== undefined) {
     *         timeout = runtimeConfig.timeout;
     *     }
     *
     *     const clientConfiguration: TimeoutClientConfiguration = {
     *         _timeout: timeout,
     *         setTimeout: function(timeout: number): void {
     *             this._timeout = timeout;
     *         },
     *         timeout: function(): number {
     *             return this._timeout;
     *         }
     *     }
     *
     *     return clientConfiguration;
     * }
     *
     * }
* * @return Returns a typescript function name */ Pair getExtensionConfigurationFn(); /** * Define a function that returns an object instance that implements the interface. * *
{@code
     * interface TimeoutClientConfiguration {
     *   setTimeout(timeout: number): void;
     *   timeout(): timeout;
     * }
     *
     * export const resolveTimeoutRuntimeConfigFn = (clientConfig: TimeoutClientConfiguration) => {
     *     const runtimeConfig: any = {
     *        timeout: clientConfig.timeout()
     *     };
     *
     *     return runtimeConfig;
     * }
     *
     * }
* * @return Returns a typescript function name */ Pair resolveRuntimeConfigFn(); /** * Optional submodule path for imports (e.g. "/protocols" for @smithy/core/protocols). * When non-null, consumers should use addImportSubmodule instead of addImport. * * @return Returns the submodule path, or null if not applicable. */ default String submodule() { return null; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/extensions/HttpHandlerExtensionConfigurationInterface.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.extensions; import software.amazon.smithy.typescript.codegen.Dependency; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.utils.Pair; public class HttpHandlerExtensionConfigurationInterface implements ExtensionConfigurationInterface { @Override public Pair name() { return Pair.of("HttpHandlerExtensionConfiguration", TypeScriptDependency.SMITHY_CORE); } @Override public String submodule() { return SmithyCoreSubmodules.PROTOCOLS; } @Override public Pair getExtensionConfigurationFn() { return Pair.of("getHttpHandlerExtensionConfiguration", TypeScriptDependency.SMITHY_CORE); } @Override public Pair resolveRuntimeConfigFn() { return Pair.of("resolveHttpHandlerRuntimeConfig", TypeScriptDependency.SMITHY_CORE); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddBaseServiceExceptionClass.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.nio.file.Paths; import java.util.function.BiConsumer; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generate the base ServiceException class. */ @SmithyInternalApi public final class AddBaseServiceExceptionClass implements TypeScriptIntegration { @Override public void customize(TypeScriptCodegenContext codegenContext) { TypeScriptSettings settings = codegenContext.settings(); Model model = codegenContext.model(); SymbolProvider symbolProvider = codegenContext.symbolProvider(); BiConsumer> writerFactory = codegenContext.writerDelegator()::useFileWriter; writeAdditionalFiles(settings, model, symbolProvider, writerFactory); writerFactory.accept(Paths.get(CodegenUtils.SOURCE_FOLDER, "index.ts").toString(), writer -> { writeAdditionalExports(settings, model, symbolProvider, writer); }); } private void writeAdditionalFiles( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, BiConsumer> writerFactory ) { boolean isClientSdk = settings.generateClient(); if (isClientSdk) { String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String serviceExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); writerFactory.accept( Paths.get(CodegenUtils.SOURCE_FOLDER, "models", serviceExceptionName + ".ts").toString(), writer -> { writer.addImportSubmodule( "ServiceException", "__ServiceException", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.addTypeImportSubmodule( "ServiceExceptionOptions", "__ServiceExceptionOptions", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); // Export ServiceException information to allow // documentation inheritance to consume their types writer.write("export type { __ServiceExceptionOptions };\n"); writer.write("export { __ServiceException };\n"); writer.writeDocs( "@public\n\nBase exception class for all service exceptions from " + serviceName + " service." ); writer.openBlock("export class $L extends __ServiceException {", serviceExceptionName); writer.writeDocs("@internal"); writer.openBlock("constructor(options: __ServiceExceptionOptions) {"); writer.write("super(options);"); writer.write("Object.setPrototypeOf(this, $L.prototype);", serviceExceptionName); writer.closeBlock("}"); // constructor writer.closeBlock("}"); // class } ); } } private void writeAdditionalExports( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { boolean isClientSdk = settings.generateClient(); if (isClientSdk) { String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String serviceExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); writer.write("export { $1L } from \"./models/$1L\";", serviceExceptionName); } } /** * For any error shape, add the reference of the base error class to the * error symbol's references. In client SDK, the base error class is the * service-specific service exception class. In server SDK, the base error * class is the ServiceException class from server-common package. */ @Override public SymbolProvider decorateSymbolProvider( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider ) { return shape -> { Symbol symbol = symbolProvider.toSymbol(shape); if (shape.hasTrait(ErrorTrait.class)) { String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String baseExceptionAlias = "__BaseException"; SymbolReference reference; if (settings.generateClient()) { String serviceExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); String namespace = Paths.get(".", "src", "models", serviceExceptionName).toString(); Symbol serviceExceptionSymbol = Symbol.builder() .name(serviceExceptionName) .namespace(namespace, "/") .definitionFile(namespace + ".ts") .build(); reference = SymbolReference.builder() .options(SymbolReference.ContextOption.USE) .alias(baseExceptionAlias) .symbol(serviceExceptionSymbol) .build(); } else { reference = SymbolReference.builder() .options(SymbolReference.ContextOption.USE) .alias(baseExceptionAlias) .symbol(TypeScriptDependency.SERVER_COMMON.createSymbol("ServiceException")) .build(); } return symbol.toBuilder().addReference(reference).build(); } return symbol; }; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddBuiltinPlugins.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_MIDDLEWARE; import java.util.List; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds all built-in runtime client plugins to clients. */ @SmithyInternalApi public class AddBuiltinPlugins implements TypeScriptIntegration { @Override public List getClientPlugins() { // Note that order is significant because configurations might // rely on previously resolved values. return List.of( RuntimeClientPlugin.builder() .withConventions( "@smithy/core/retry", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "Retry" ) .build(), RuntimeClientPlugin.builder() .withConventions( "@smithy/core/protocols", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "ContentLength", HAS_MIDDLEWARE ) .build() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddChecksumRequiredDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention.HAS_MIDDLEWARE; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.HttpChecksumRequiredTrait; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds md5 checksum dependencies if needed. */ @SmithyInternalApi public final class AddChecksumRequiredDependency implements TypeScriptIntegration { @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { if (!hasMd5Dependency(model, settings.getService(model))) { return; } writer.addImport("Readable", null, "stream"); writer.addTypeImport("StreamHasher", "__StreamHasher", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( "A function that, given a hash constructor and a stream, calculates the \n" + "hash of the streamed value.\n" + "@internal" ); writer.write("streamHasher?: __StreamHasher | __StreamHasher;\n"); writer.addTypeImport("HashConstructor", "__HashConstructor", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Checksum", "__Checksum", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("ChecksumConstructor", "__ChecksumConstructor", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( """ A constructor for a class implementing the {@link __Checksum} interface that computes MD5 hashes. @internal""" ); writer.write("md5?: __ChecksumConstructor | __HashConstructor;\n"); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!hasMd5Dependency(model, settings.getService(model))) { return Collections.emptyMap(); } switch (target) { case NODE: return MapUtils.of( "streamHasher", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "fileStreamHasher", "streamHasher", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CHECKSUM ); writer.write("streamHasher"); }, "md5", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "Hash", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("Hash.bind(null, \"md5\")"); } ); case BROWSER: return MapUtils.of( "streamHasher", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "blobHasher", "streamHasher", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CHECKSUM ); writer.write("streamHasher"); }, "md5", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "Md5", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CHECKSUM ); writer.write("Md5"); } ); default: return Collections.emptyMap(); } } @Override public List getClientPlugins() { return ListUtils.of( RuntimeClientPlugin.builder() .withConventions( TypeScriptDependency.BODY_CHECKSUM.dependency, "ApplyMd5BodyChecksum", HAS_MIDDLEWARE ) .operationPredicate((m, s, o) -> hasChecksumRequiredTrait(m, s, o)) .build() ); } // return true if operation shape is decorated with `httpChecksumRequired` trait. private static boolean hasChecksumRequiredTrait(Model model, ServiceShape service, OperationShape operation) { return operation.hasTrait(HttpChecksumRequiredTrait.class); } private static boolean hasMd5Dependency(Model model, ServiceShape service) { TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(service); for (OperationShape operation : operations) { if (hasChecksumRequiredTrait(model, service, operation)) { return true; } } return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddClientRuntimeConfig.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.nio.file.Paths; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.extensions.DefaultExtensionConfigurationInterface; import software.amazon.smithy.typescript.codegen.extensions.ExtensionConfigurationInterface; import software.amazon.smithy.typescript.codegen.extensions.HttpHandlerExtensionConfigurationInterface; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * All clients need to know the max attempt to retry a request and logger * instance to print the log. * *

This plugin adds the following config interface fields: * *

    *
  • maxAttempts: Provides value for how many times a request will be * made at most in case of retry.
  • *
  • retryMode: Specifies which retry algorithm to use.
  • *
  • logger: Optional logger for logging debug/info/warn/error.
  • *
* *

This plugin adds the following Node runtime specific values: * *

    *
  • maxAttempts: Uses the default maxAttempts provider that checks things * like environment variables and the AWS config file.
  • *
  • retryMode: Specifies which retry algorithm to use.
  • *
  • logger: Sets to empty as logger is passed in client configuration.
  • *
* *

This plugin adds the following Browser runtime specific values: * *

    *
  • maxAttempts: Returns default value of 3.
  • *
  • retryMode: Provider which returns DEFAULT_RETRY_MODE.
  • *
  • logger: Sets to empty as logger is passed in client configuration.
  • *
*/ @SmithyInternalApi public final class AddClientRuntimeConfig implements TypeScriptIntegration { @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { writer.addTypeImport("Provider", "__Provider", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("Logger", "__Logger", TypeScriptDependency.SMITHY_TYPES); writer .writeDocs("Value for how many times a request will be made at most in case of retry.") .write("maxAttempts?: number | __Provider;\n"); writer .writeDocs( """ Specifies which retry algorithm to use. @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-smithy-util-retry/Enum/RETRY_MODES/ """ ) .write("retryMode?: string | __Provider;\n"); writer.writeDocs("Optional logger for logging debug/info/warn/error.").write("logger?: __Logger;\n"); writer.addRelativeTypeImport( "RuntimeExtension", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, "runtimeExtensions") ); writer.writeDocs("Optional extensions").write("extensions?: RuntimeExtension[];\n"); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { switch (target) { case SHARED: return MapUtils.of("logger", writer -> { writer.addImportSubmodule( "NoOpLogger", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("new NoOpLogger()"); }); case BROWSER: return MapUtils.of( "maxAttempts", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "DEFAULT_MAX_ATTEMPTS", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.RETRY ); writer.write("DEFAULT_MAX_ATTEMPTS"); }, "retryMode", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "DEFAULT_RETRY_MODE", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.RETRY ); writer.write( "(async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE)" ); } ); case NODE: return MapUtils.of( "maxAttempts", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "loadConfig", "loadNodeConfig", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); writer.addImportSubmodule( "NODE_MAX_ATTEMPT_CONFIG_OPTIONS", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.RETRY ); writer.write("loadNodeConfig(NODE_MAX_ATTEMPT_CONFIG_OPTIONS, config)"); }, "retryMode", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "loadConfig", "loadNodeConfig", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "NODE_RETRY_MODE_CONFIG_OPTIONS", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.RETRY ); writer.addImportSubmodule( "DEFAULT_RETRY_MODE", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.RETRY ); writer.indent(); writer.writeInline( """ loadNodeConfig( { ...NODE_RETRY_MODE_CONFIG_OPTIONS, default: async () => (await defaultConfigProvider()).retryMode || DEFAULT_RETRY_MODE, }, config )""" ); writer.dedent(); } ); default: return Collections.emptyMap(); } } @Override public List getExtensionConfigurationInterfaces( Model model, TypeScriptSettings settings ) { return List.of(new DefaultExtensionConfigurationInterface(), new HttpHandlerExtensionConfigurationInterface()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddCompressionDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.function.Consumer; import java.util.logging.Logger; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.RequestCompressionTrait; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds compression dependencies if needed. */ @SmithyInternalApi public final class AddCompressionDependency implements TypeScriptIntegration { private static final Logger LOGGER = Logger.getLogger(AddCompressionDependency.class.getName()); @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!hasRequestCompressionTrait(model, settings.getService(model))) { return Collections.emptyMap(); } switch (target) { case NODE: return MapUtils.of( "disableRequestCompression", writer -> { writer.addImportSubmodule( "loadConfig", "loadNodeConfig", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); writer.addImport( "NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS", null, TypeScriptDependency.MIDDLEWARE_COMPRESSION ); writer.write("loadNodeConfig(NODE_DISABLE_REQUEST_COMPRESSION_CONFIG_OPTIONS, config)"); }, "requestMinCompressionSizeBytes", writer -> { writer.addImportSubmodule( "loadConfig", "loadNodeConfig", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CONFIG ); writer.addImport( "NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS", null, TypeScriptDependency.MIDDLEWARE_COMPRESSION ); writer.write( "loadNodeConfig(NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES_CONFIG_OPTIONS, config)" ); } ); case BROWSER: return MapUtils.of( "disableRequestCompression", writer -> { writer.addImport( "DEFAULT_DISABLE_REQUEST_COMPRESSION", null, TypeScriptDependency.MIDDLEWARE_COMPRESSION ); writer.write("DEFAULT_DISABLE_REQUEST_COMPRESSION"); }, "requestMinCompressionSizeBytes", writer -> { writer.addImport( "DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES", null, TypeScriptDependency.MIDDLEWARE_COMPRESSION ); writer.write("DEFAULT_NODE_REQUEST_MIN_COMPRESSION_SIZE_BYTES"); } ); default: return Collections.emptyMap(); } } @Override public List getClientPlugins() { return ListUtils.of( RuntimeClientPlugin.builder() .withConventions( TypeScriptDependency.MIDDLEWARE_COMPRESSION.dependency, "Compression", RuntimeClientPlugin.Convention.HAS_CONFIG ) .servicePredicate((m, s) -> hasRequestCompressionTrait(m, s)) .build(), RuntimeClientPlugin.builder() .withConventions( TypeScriptDependency.MIDDLEWARE_COMPRESSION.dependency, "Compression", RuntimeClientPlugin.Convention.HAS_MIDDLEWARE ) .additionalPluginFunctionParamsSupplier((m, s, o) -> getPluginFunctionParams(m, s, o)) .operationPredicate((m, s, o) -> hasRequestCompressionTrait(o)) .build() ); } private static Map getPluginFunctionParams( Model model, ServiceShape service, OperationShape operation ) { Map params = new TreeMap(); // Populate encodings from requestCompression trait RequestCompressionTrait requestCompressionTrait = operation.expectTrait(RequestCompressionTrait.class); params.put("encodings", requestCompressionTrait.getEncodings()); return params; } // return true if operation shape is decorated with `requestCompression` trait. private static boolean hasRequestCompressionTrait(OperationShape operation) { return operation.hasTrait(RequestCompressionTrait.class); } private static boolean hasRequestCompressionTrait(Model model, ServiceShape service) { TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(service); for (OperationShape operation : operations) { if (hasRequestCompressionTrait(operation)) { return true; } } return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddDefaultsModeDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds defaults mode dependencies if needed. */ @SmithyInternalApi public class AddDefaultsModeDependency implements TypeScriptIntegration { @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { // Dependencies used in the default runtime config template. writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addTypeImportSubmodule( "DefaultsMode", "__DefaultsMode", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.addTypeImport("Provider", "__Provider", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( "The {@link @smithy/smithy-client#DefaultsMode} that " + "will be used to determine how certain default configuration " + "options are resolved in the SDK." ); writer.write("defaultsMode?: __DefaultsMode | __Provider<__DefaultsMode>;"); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddEventStreamDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.EventStreamIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.sections.SmithyContextCodeSection; import software.amazon.smithy.utils.CodeInterceptor; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds event streams if needed. */ @SmithyInternalApi public final class AddEventStreamDependency implements TypeScriptIntegration { @Override public List runAfter() { return List.of(new AddBuiltinPlugins().name()); } @Override public List getClientPlugins() { return ListUtils.of( RuntimeClientPlugin.builder() .withConventions( "@smithy/core/event-streams", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "EventStreamSerde", RuntimeClientPlugin.Convention.HAS_CONFIG ) .servicePredicate(AddEventStreamDependency::hasEventStream) .build() ); } @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { if (!hasEventStream(model, settings.getService(model))) { return; } writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addTypeImport( "EventStreamSerdeProvider", "__EventStreamSerdeProvider", TypeScriptDependency.SMITHY_TYPES ); writer.writeDocs("The function that provides necessary utilities for generating and parsing event stream"); writer.write("eventStreamSerdeProvider?: __EventStreamSerdeProvider;\n"); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!hasEventStream(model, settings.getService(model))) { return Collections.emptyMap(); } switch (target) { case NODE: return MapUtils.of("eventStreamSerdeProvider", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "eventStreamSerdeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.EVENT_STREAMS ); writer.write("eventStreamSerdeProvider"); }); case BROWSER: return MapUtils.of("eventStreamSerdeProvider", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "eventStreamSerdeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.EVENT_STREAMS ); writer.write("eventStreamSerdeProvider"); }); default: return Collections.emptyMap(); } } @Override public List> interceptors( TypeScriptCodegenContext codegenContext ) { return List.of( CodeInterceptor.appender(SmithyContextCodeSection.class, (w, s) -> { EventStreamIndex eventStreamIndex = EventStreamIndex.of(s.getModel()); boolean input = eventStreamIndex.getInputInfo(s.getOperation()).isPresent(); boolean output = eventStreamIndex.getOutputInfo(s.getOperation()).isPresent(); // If not event streaming for I/O, don't write anything if (!input && !output) { return; } // Otherwise, write present input and output streaming w.write("").indent(); w.writeDocs("@internal"); w.openBlock("eventStream: {", "},", () -> { if (input) { w.write("input: true,"); } if (output) { w.write("output: true,"); } }); w.dedent(); }) ); } private static boolean hasEventStream(Model model, ServiceShape service) { TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(service); EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); for (OperationShape operation : operations) { if ( eventStreamIndex.getInputInfo(operation).isPresent() || eventStreamIndex.getOutputInfo(operation).isPresent() ) { return true; } } return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddHttpApiKeyAuthPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.nio.file.Paths; import java.util.HashMap; import java.util.List; import java.util.function.BiConsumer; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.HttpApiKeyAuthTrait; import software.amazon.smithy.model.traits.OptionalAuthTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.IoUtils; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Add config and middleware to support a service with the @httpApiKeyAuth trait. * * This is legacy auth behavior, and is no longer in development. */ @SmithyInternalApi public final class AddHttpApiKeyAuthPlugin implements TypeScriptIntegration { public static final String INTEGRATION_NAME = "HttpApiKeyAuth"; /** * Integration should be used only if the `useLegacyAuth` flag is true. */ @Override public boolean matchesSettings(TypeScriptSettings settings) { return settings.useLegacyAuth(); } /** * Plug into code generation for the client. * * This adds the configuration items to the client config and plugs in the * middleware to operations that need it. * * The middleware will inject the client's configured API key into the * request as defined by the @httpApiKeyAuth trait. If the trait says to * put the API key into a named header, that header will be used, optionally * prefixed with a scheme. If the trait says to put the API key into a named * query parameter, that query parameter will be used. */ @Override public List getClientPlugins() { return ListUtils.of( // Add the config if the service uses HTTP API key authorization. RuntimeClientPlugin.builder() .inputConfig( Symbol.builder() .namespace( "./" + CodegenUtils.SOURCE_FOLDER + "/middleware/" + INTEGRATION_NAME, "/" ) .name("HttpApiKeyAuthInputConfig") .build() ) .resolvedConfig( Symbol.builder() .namespace( "./" + CodegenUtils.SOURCE_FOLDER + "/middleware/" + INTEGRATION_NAME, "/" ) .name("HttpApiKeyAuthResolvedConfig") .build() ) .resolveFunction( Symbol.builder() .namespace( "./" + CodegenUtils.SOURCE_FOLDER + "/middleware/" + INTEGRATION_NAME, "/" ) .name("resolveHttpApiKeyAuthConfig") .build() ) .servicePredicate((m, s) -> hasEffectiveHttpApiKeyAuthTrait(m, s)) .build(), // Add the middleware to operations that use HTTP API key authorization. RuntimeClientPlugin.builder() .pluginFunction( Symbol.builder() .namespace( "./" + CodegenUtils.SOURCE_FOLDER + "/middleware/" + INTEGRATION_NAME, "/" ) .name("getHttpApiKeyAuthPlugin") .build() ) .additionalPluginFunctionParamsSupplier((m, s, o) -> new HashMap() { { // It's safe to do expectTrait() because the operation predicate ensures that the trait // exists `in` and `name` are required attributes of the trait, `scheme` is optional. put("in", s.expectTrait(HttpApiKeyAuthTrait.class).getIn().toString()); put("name", s.expectTrait(HttpApiKeyAuthTrait.class).getName()); s .expectTrait(HttpApiKeyAuthTrait.class) .getScheme() .ifPresent(scheme -> put("scheme", scheme)); } }) .operationPredicate((m, s, o) -> hasEffectiveHttpApiKeyAuthTrait(m, s, o)) .build() ); } @Override public void customize(TypeScriptCodegenContext codegenContext) { TypeScriptSettings settings = codegenContext.settings(); Model model = codegenContext.model(); BiConsumer> writerFactory = codegenContext.writerDelegator()::useFileWriter; writeAdditionalFiles(settings, model, writerFactory); writerFactory.accept(Paths.get(CodegenUtils.SOURCE_FOLDER, "index.ts").toString(), writer -> { writeAdditionalExports(settings, model, writer); }); } private void writeAdditionalFiles( TypeScriptSettings settings, Model model, BiConsumer> writerFactory ) { ServiceShape service = settings.getService(model); // If the service doesn't use HTTP API keys, we don't need to do anything and the generated // code doesn't need any additional files. if (!hasEffectiveHttpApiKeyAuthTrait(model, service)) { return; } String noTouchNoticePrefix = "// Please do not touch this file. It's generated from a template in:\n" + "// https://github.com/smithy-lang/smithy-typescript/blob/main/smithy-typescript-codegen/" + "src/main/resources/software/amazon/smithy/aws/typescript/codegen/integration/"; // Write the middleware source. writerFactory.accept( Paths.get(CodegenUtils.SOURCE_FOLDER, "middleware", INTEGRATION_NAME, "index.ts").toString(), writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); String source = IoUtils.readUtf8Resource(getClass(), "http-api-key-auth.ts"); writer.write("$L$L", noTouchNoticePrefix, "http-api-key-auth.ts"); writer.write("$L", source); } ); } private void writeAdditionalExports(TypeScriptSettings settings, Model model, TypeScriptWriter writer) { boolean isClientSdk = settings.generateClient(); ServiceShape service = settings.getService(model); if (isClientSdk && hasEffectiveHttpApiKeyAuthTrait(model, service)) { writer.write("export * from \"./middleware/$1L\";", INTEGRATION_NAME); } } // If no operations use it, then the service doesn't use it private static boolean hasEffectiveHttpApiKeyAuthTrait(Model model, ServiceShape service) { ServiceIndex serviceIndex = ServiceIndex.of(model); TopDownIndex topDownIndex = TopDownIndex.of(model); for (OperationShape operation : topDownIndex.getContainedOperations(service)) { if (operation.hasTrait(OptionalAuthTrait.ID)) { continue; } if (serviceIndex.getEffectiveAuthSchemes(service, operation).containsKey(HttpApiKeyAuthTrait.ID)) { return true; } } return false; } private static boolean hasEffectiveHttpApiKeyAuthTrait( Model model, ServiceShape service, OperationShape operation ) { if (operation.hasTrait(OptionalAuthTrait.class)) { return false; } return ServiceIndex.of(model).getEffectiveAuthSchemes(service, operation).containsKey(HttpApiKeyAuthTrait.ID); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddProtocolConfig.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static software.amazon.smithy.typescript.codegen.schema.SchemaGenerator.SCHEMAS_FOLDER; import java.nio.file.Paths; import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.protocol.traits.Rpcv2CborTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.schema.SchemaGenerationAllowlist; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds a protocol implementation to the runtime config. */ @SmithyInternalApi public final class AddProtocolConfig implements TypeScriptIntegration { @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!SchemaGenerationAllowlist.allows(settings.getService(), settings)) { return Collections.emptyMap(); } String namespace = settings.getService().getNamespace(); switch (target) { case SHARED: if (Objects.equals(settings.getProtocol(), Rpcv2CborTrait.ID)) { return MapUtils.of( "protocol", writer -> { writer.addImportSubmodule( "SmithyRpcV2CborProtocol", null, TypeScriptDependency.SMITHY_CORE, "/cbor" ); writer.write("SmithyRpcV2CborProtocol"); }, "protocolSettings", writer -> { writer.addRelativeImport( "errorTypeRegistries", null, Paths.get(".", CodegenUtils.SOURCE_FOLDER, SCHEMAS_FOLDER, "schemas_0") ); writer.write( """ { defaultNamespace: $S, errorTypeRegistries, }""", namespace ); } ); } case BROWSER: case NODE: default: return Collections.emptyMap(); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/AddSdkStreamMixinDependency.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collections; import java.util.Map; import java.util.Set; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.utils.MapUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Add runtime config for injecting utility functions to consume the JavaScript * runtime-specific stream implementations. */ @SmithyInternalApi public final class AddSdkStreamMixinDependency implements TypeScriptIntegration { @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { if (!hasStreamingBlobDeser(settings, model)) { return; } writer.addTypeImport("SdkStreamMixinInjector", "__SdkStreamMixinInjector", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs( "The internal function that inject utilities to runtime-specific stream to help users" + " consume the data\n@internal" ); writer.write("sdkStreamMixin?: __SdkStreamMixinInjector;\n"); } @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { if (!hasStreamingBlobDeser(settings, model)) { return Collections.emptyMap(); } if (target == LanguageTarget.SHARED) { return MapUtils.of("sdkStreamMixin", writer -> { writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "sdkStreamMixin", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("sdkStreamMixin"); }); } else { return Collections.emptyMap(); } } private static boolean hasStreamingBlobDeser(TypeScriptSettings settings, Model model) { ServiceShape serviceShape = settings.getService(model); TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(serviceShape); for (OperationShape operation : operations) { if (hasStreamingBlobDeser(settings, model, operation)) { return true; } } return false; } public static boolean hasStreamingBlobDeser(TypeScriptSettings settings, Model model, OperationShape operation) { StructureShape ioShapeToDeser = (settings.generateServerSdk()) ? model.expectShape(operation.getInputShape()).asStructureShape().get() : model.expectShape(operation.getOutputShape()).asStructureShape().get(); for (MemberShape member : ioShapeToDeser.members()) { Shape shape = model.expectShape(member.getTarget()); if (shape instanceof BlobShape && shape.hasTrait(StreamingTrait.class)) { return true; } } return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/DefaultReadmeGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.traits.DocumentationTrait; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.IoUtils; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.StringUtils; @SmithyInternalApi public final class DefaultReadmeGenerator implements TypeScriptIntegration { public static final String README_FILENAME = "README.md"; public static final String DEFAULT_CLIENT_README_TEMPLATE = "default_readme_client.md.template"; public static final String DEFAULT_SERVER_README_TEMPLATE = "default_readme_server.md.template"; @Override public void customize(TypeScriptCodegenContext codegenContext) { TypeScriptSettings settings = codegenContext.settings(); if (!settings.createDefaultReadme()) { return; } String file = settings.generateClient() ? DEFAULT_CLIENT_README_TEMPLATE : DEFAULT_SERVER_README_TEMPLATE; Model model = codegenContext.model(); codegenContext .writerDelegator() .useFileWriter(README_FILENAME, "", writer -> { ServiceShape service = settings.getService(model); String resource = IoUtils.readUtf8Resource(getClass(), file); resource = resource.replaceAll(Pattern.quote("${packageName}"), settings.getPackageName()); String clientName = StringUtils.capitalize(service.getId().getName(service)); resource = resource.replaceAll(Pattern.quote("${serviceId}"), clientName); String rawDocumentation = service .getTrait(DocumentationTrait.class) .map(DocumentationTrait::getValue) .orElse(""); String documentation = Arrays.asList(rawDocumentation.split("\n")) .stream() .map(StringUtils::trim) .collect(Collectors.joining("\n")); resource = resource.replaceAll( Pattern.quote("${documentation}"), Matcher.quoteReplacement(documentation) ); TopDownIndex topDownIndex = TopDownIndex.of(model); OperationShape firstOperation = topDownIndex.getContainedOperations(service).iterator().next(); String operationName = firstOperation.getId().getName(service); resource = resource.replaceAll(Pattern.quote("${commandName}"), operationName); // The $ character is escaped using $$ writer.write(resource.replaceAll(Pattern.quote("$"), Matcher.quoteReplacement("$$"))); }); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/DocumentMemberDeserVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.knowledge.HttpBindingIndex; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.ByteShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.IntegerShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.ShortShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Visitor to generate member values for aggregate types deserialized from documents. * * The standard implementations are as follows; these implementations may be * overridden unless otherwise specified. * *
    *
  • Blob: base64 decoded.
  • *
  • BigInteger: converted to JS BigInt.
  • *
  • BigDecimal: converted to Big via {@code big.js}.
  • *
  • Timestamp: converted to JS Date.
  • *
  • Service, Operation, Resource, Member: not deserializable from documents. Not overridable.
  • *
  • Document, List, Map, Set, Structure, Union: delegated to a deserialization function. * Not overridable.
  • *
  • All other types: unmodified.
  • *
*/ @SmithyUnstableApi public class DocumentMemberDeserVisitor implements ShapeVisitor { protected boolean serdeElisionEnabled; private final GenerationContext context; private final String dataSource; private final Format defaultTimestampFormat; private final SerdeElisionIndex serdeElisionIndex; /** * Constructor. * * @param context The generation context. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param defaultTimestampFormat The default timestamp format used in absence * of a TimestampFormat trait. */ public DocumentMemberDeserVisitor(GenerationContext context, String dataSource, Format defaultTimestampFormat) { this.context = context; this.dataSource = dataSource; this.defaultTimestampFormat = defaultTimestampFormat; this.serdeElisionEnabled = false; this.serdeElisionIndex = SerdeElisionIndex.of(context.getModel()); } /** * @return the member this visitor is being run against. Used to discover member-applied * traits, such as @timestampFormat. Can be, and defaults, to, null. */ protected MemberShape getMemberShape() { return null; } /** * @return true if string-formatted epoch seconds in payloads are disallowed. Defaults to false. */ protected boolean requiresNumericEpochSecondsInPayload() { return false; } /** * Gets the generation context. * * @return The generation context. */ protected final GenerationContext getContext() { return context; } /** * Gets the in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.). * * @return The data source. */ protected final String getDataSource() { return dataSource; } /** * Gets the default timestamp format used in absence of a TimestampFormat trait. * * @return The default timestamp format. */ protected final Format getDefaultTimestampFormat() { return defaultTimestampFormat; } @Override public String blobShape(BlobShape shape) { return "context.base64Decoder(" + dataSource + ")"; } @Override public String booleanShape(BooleanShape shape) { context.getWriter() .addImportSubmodule( "expectBoolean", "__expectBoolean", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectBoolean(" + dataSource + ")"; } @Override public String byteShape(ByteShape shape) { context.getWriter() .addImportSubmodule( "expectByte", "__expectByte", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectByte(" + dataSource + ")"; } @Override public String shortShape(ShortShape shape) { context.getWriter() .addImportSubmodule( "expectShort", "__expectShort", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectShort(" + dataSource + ")"; } @Override public String integerShape(IntegerShape shape) { context.getWriter() .addImportSubmodule( "expectInt32", "__expectInt32", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectInt32(" + dataSource + ")"; } @Override public String longShape(LongShape shape) { context.getWriter() .addImportSubmodule( "expectLong", "__expectLong", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectLong(" + dataSource + ")"; } @Override public String floatShape(FloatShape shape) { context .getWriter() .addImportSubmodule( "limitedParseFloat32", "__limitedParseFloat32", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__limitedParseFloat32(" + dataSource + ")"; } @Override public String doubleShape(DoubleShape shape) { context .getWriter() .addImportSubmodule( "limitedParseDouble", "__limitedParseDouble", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__limitedParseDouble(" + dataSource + ")"; } @Override public String stringShape(StringShape shape) { return HttpProtocolGeneratorUtils.getStringOutputParam(context, shape, dataSource); } @Override public String bigIntegerShape(BigIntegerShape shape) { // BigInt is not supported across all environments, use big.js instead. return deserializeToBigJs(); } @Override public String bigDecimalShape(BigDecimalShape shape) { return deserializeToBigJs(); } private String deserializeToBigJs() { context.getWriter().addImport("Big", "__Big", TypeScriptDependency.BIG_JS); return "__Big(" + dataSource + ")"; } @Override public final String operationShape(OperationShape shape) { throw new CodegenException("Operation shapes cannot be bound to documents."); } @Override public final String resourceShape(ResourceShape shape) { throw new CodegenException("Resource shapes cannot be bound to documents."); } @Override public final String serviceShape(ServiceShape shape) { throw new CodegenException("Service shapes cannot be bound to documents."); } @Override public final String memberShape(MemberShape shape) { throw new CodegenException("Member shapes cannot be bound to documents."); } @Override public String timestampShape(TimestampShape shape) { HttpBindingIndex httpIndex = HttpBindingIndex.of(context.getModel()); Format format; if (getMemberShape() == null) { format = httpIndex.determineTimestampFormat(shape, Location.DOCUMENT, defaultTimestampFormat); } else { if (!shape.getId().equals(getMemberShape().getTarget())) { throw new IllegalArgumentException( String.format( "Encountered timestamp shape %s that was not the target of member shape %s", shape.getId(), getMemberShape().getId() ) ); } format = httpIndex.determineTimestampFormat(getMemberShape(), Location.DOCUMENT, defaultTimestampFormat); } return HttpProtocolGeneratorUtils.getTimestampOutputParam( context.getWriter(), dataSource, Location.DOCUMENT, shape, format, requiresNumericEpochSecondsInPayload(), context.getSettings().generateClient() ); } @Override public final String documentShape(DocumentShape shape) { return getDelegateDeserializer(shape); } @Override public final String listShape(ListShape shape) { return getDelegateDeserializer(shape); } @Override public final String mapShape(MapShape shape) { return getDelegateDeserializer(shape); } @Override public final String setShape(SetShape shape) { return getDelegateDeserializer(shape); } @Override public final String structureShape(StructureShape shape) { return getDelegateDeserializer(shape); } @Override public String unionShape(UnionShape shape) { context.getWriter() .addImportSubmodule( "expectUnion", "__expectUnion", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return getDelegateDeserializer(shape, "__expectUnion(" + dataSource + ")"); } private String getDelegateDeserializer(Shape shape) { return getDelegateDeserializer(shape, dataSource); } private String getDelegateDeserializer(Shape shape, String customDataSource) { // Use the shape for the function name. Symbol symbol = context.getSymbolProvider().toSymbol(shape); if (serdeElisionEnabled && serdeElisionIndex.mayElide(shape)) { context.getWriter() .addImportSubmodule("_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); return "_json(" + customDataSource + ")"; } return ProtocolGenerator.getDeserFunctionShortName(symbol) + "(" + customDataSource + ", context)"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/DocumentMemberSerVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.knowledge.HttpBindingIndex; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.ByteShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.IntegerShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.ShortShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Visitor to generate member values for aggregate types serialized in documents. * * The standard implementations are as follows; these implementations may be * overridden unless otherwise specified. * *
    *
  • Blob: base64 encoded.
  • *
  • BigInteger, BigDecimal: converted to strings to maintain precision.
  • *
  • Timestamp: converted to a representation based on the specified format.
  • *
  • Service, Operation, Resource, Member: not serializable in documents. Not overridable.
  • *
  • Document, List, Map, Set, Structure, Union: delegated to a serialization function. * Not overridable.
  • *
  • All other types: unmodified.
  • *
*/ @SmithyUnstableApi public class DocumentMemberSerVisitor implements ShapeVisitor { protected boolean serdeElisionEnabled; private final GenerationContext context; private final String dataSource; private final Format defaultTimestampFormat; private final SerdeElisionIndex serdeElisionIndex; /** * Constructor. * * @param context The generation context. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param defaultTimestampFormat The default timestamp format used in absence * of a TimestampFormat trait. */ public DocumentMemberSerVisitor(GenerationContext context, String dataSource, Format defaultTimestampFormat) { this.context = context; this.dataSource = dataSource; this.defaultTimestampFormat = defaultTimestampFormat; this.serdeElisionEnabled = false; this.serdeElisionIndex = SerdeElisionIndex.of(context.getModel()); } /** * @return the member this visitor is being run against. Used to discover member-applied * traits, such as @xmlName. Can be, and defaults, to, null. */ protected MemberShape getMemberShape() { return null; } /** * Gets the generation context. * * @return The generation context. */ protected final GenerationContext getContext() { return context; } /** * Gets the in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.). * * @return The data source. */ protected final String getDataSource() { return dataSource; } /** * Gets the default timestamp format used in absence of a TimestampFormat trait. * * @return The default timestamp format. */ protected final Format getDefaultTimestampFormat() { return defaultTimestampFormat; } @Override public String blobShape(BlobShape shape) { return "context.base64Encoder(" + dataSource + ")"; } @Override public String booleanShape(BooleanShape shape) { return serializeUnmodified(); } @Override public String byteShape(ByteShape shape) { return serializeUnmodified(); } @Override public String shortShape(ShortShape shape) { return serializeUnmodified(); } @Override public String integerShape(IntegerShape shape) { return serializeUnmodified(); } @Override public String longShape(LongShape shape) { return serializeUnmodified(); } @Override public String floatShape(FloatShape shape) { return handleFloat(); } @Override public String doubleShape(DoubleShape shape) { return handleFloat(); } private String handleFloat() { context.getWriter() .addImportSubmodule( "serializeFloat", "__serializeFloat", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); return "__serializeFloat(" + dataSource + ")"; } @Override public String stringShape(StringShape shape) { return HttpProtocolGeneratorUtils.getStringInputParam(context, shape, serializeUnmodified()); } private String serializeUnmodified() { return dataSource; } /** * This should not be called, since big number serde is handled by format * specific visitors. */ @Override public String bigIntegerShape(BigIntegerShape shape) { if (context.getSettings() != null && context.getSettings().getBigNumberMode().equals("big.js")) { return serializeFromBigJs(); } return "String(" + dataSource + ")"; } /** * This should not be called, since big number serde is handled by format * specific visitors. */ @Override public String bigDecimalShape(BigDecimalShape shape) { if (context.getSettings() != null && context.getSettings().getBigNumberMode().equals("big.js")) { return serializeFromBigJs(); } return "String(" + dataSource + ")"; } private String serializeFromBigJs() { return dataSource + ".toJSON()"; } @Override public final String operationShape(OperationShape shape) { throw new CodegenException("Operation shapes cannot be bound to documents."); } @Override public final String resourceShape(ResourceShape shape) { throw new CodegenException("Resource shapes cannot be bound to documents."); } @Override public final String serviceShape(ServiceShape shape) { throw new CodegenException("Service shapes cannot be bound to documents."); } @Override public final String memberShape(MemberShape shape) { throw new CodegenException("Member shapes cannot be bound to documents."); } @Override public String timestampShape(TimestampShape shape) { HttpBindingIndex httpIndex = HttpBindingIndex.of(context.getModel()); Format format = httpIndex.determineTimestampFormat(shape, Location.DOCUMENT, defaultTimestampFormat); return HttpProtocolGeneratorUtils.getTimestampInputParam(context, dataSource, shape, format); } @Override public final String documentShape(DocumentShape shape) { return getDelegateSerializer(shape); } @Override public final String listShape(ListShape shape) { return getDelegateSerializer(shape); } @Override public final String mapShape(MapShape shape) { return getDelegateSerializer(shape); } @Override public final String setShape(SetShape shape) { return getDelegateSerializer(shape); } @Override public final String structureShape(StructureShape shape) { return getDelegateSerializer(shape); } @Override public final String unionShape(UnionShape shape) { return getDelegateSerializer(shape); } private String getDelegateSerializer(Shape shape) { // Use the shape for the function name. Symbol symbol = context.getSymbolProvider().toSymbol(shape); if (serdeElisionEnabled && serdeElisionIndex.mayElide(shape)) { context.getWriter() .addImportSubmodule("_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); return "_json(" + dataSource + ")"; } return ProtocolGenerator.getSerFunctionShortName(symbol) + "(" + dataSource + ", context)"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/DocumentShapeDeserVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Set; import java.util.function.BiConsumer; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Visitor to generate deserialization functions for shapes in protocol document bodies. * * Visitor methods for aggregate types are final and will generate functions that dispatch * their loading from the body to the matching abstract method. The {@link DocumentMemberDeserVisitor} * is provided to reduce the effort of this implementation by providing the default strategies * for deserializing content from aggregate type members. * * Visitor methods for all other types will default to not generating deserialization * functions. This may be overwritten by downstream implementations if the protocol requires * more complex deserialization strategies for those types. * * This class reduces the effort necessary to build protocol implementations, specifically when * implementing {@link HttpBindingProtocolGenerator#generateDocumentBodyShapeDeserializers(GenerationContext, Set)}. * * Implementations of this class independent of protocol documents are also possible. * * The standard implementation is as follows; no assumptions are made about the protocol * being generated for. * *
    *
  • Service, Operation, Resource: no function generated. Not overridable.
  • *
  • Document, List, Map, Set, Structure, Union: generates a deserialization function. * Not overridable.
  • *
  • All other types: no function generated. May be overridden.
  • *
*/ @SmithyUnstableApi public abstract class DocumentShapeDeserVisitor extends ShapeVisitor.Default { protected boolean serdeElisionEnabled; private final GenerationContext context; public DocumentShapeDeserVisitor(GenerationContext context) { this.context = context; this.serdeElisionEnabled = false; } /** * Gets the generation context. * * @return The generation context. */ protected final GenerationContext getContext() { return context; } @Override protected Void getDefault(Shape shape) { return null; } /** * Writes the code needed to deserialize a collection in the document of a response. * *

Implementations of this method are expected to generate a function body that * returns the type generated for the CollectionShape {@code shape} parameter from an input * deserialized by {@code deserializeOutputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * list ParameterList {
     *     member: Parameter
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code output: any}: a value for the CollectionShape shape parameter deserialized from the document.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code Array<Parameter>} return type. * *

This function would generate the following: * *

{@code
     * return (output || []).map((entry: any) =>
     *   deserializeAws_restJson1_1Parameter(entry, context)
     * );
     * }
* *

{@code Set} types will be generated appropriately for signatures when given. * * @param context The generation context. * @param shape The collection shape being generated. */ protected abstract void deserializeCollection(GenerationContext context, CollectionShape shape); /** * Writes the code needed to deserialize a document in the document of a response. * *

Implementations of this method are expected to generate a function body that * returns the type generated for the DocumentShape {@code shape} parameter from an input * deserialized by {@code deserializeDocument}. * *

For example, given the following Smithy model: * *

{@code
     * document FooDocument
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code output: any}: a value for the DocumentShape shape parameter deserialized from the document.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies a {@code FooDocument} return type. * *

This function would generate the following: * *

{@code
     * return JSON.parse(output);
     * }
* * @param context The generation context. * @param shape The document shape being generated. */ protected abstract void deserializeDocument(GenerationContext context, DocumentShape shape); /** * Writes the code needed to deserialize a map in the document of a response. * *

Implementations of this method are expected to generate a function body that * returns the type generated for the MapShape {@code shape} parameter from an input * deserialized by {@code deserializeOutputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * map FieldMap {
     *     key: String,
     *     value: Field
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code output: any}: a value for the MapShape shape parameter deserialized from the document.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies a {@code Record} return type. * *

This function would generate the following: * *

{@code
     * let mapParams: any = {};
     * Object.keys(output).forEach(key => {
     *   mapParams[key] = deserializeAws_restJson1_1Field(output[key], context);
     * });
     * return mapParams;
     * }
* * @param context The generation context. * @param shape The map shape being generated. */ protected abstract void deserializeMap(GenerationContext context, MapShape shape); /** * Writes the code needed to deserialize a structure in the document of a response. * *

Implementations of this method are expected to generate a function body that * returns the type generated for the StructureShape {@code shape} parameter from an input * deserialized by {@code deserializeOutputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * structure Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code output: any}: a value for the StructureShape shape parameter deserialized from the document.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies a {@code Field} return. * *

This function would generate the following: * *

{@code
     * let contents: any = {
     *   fooValue: undefined,
     *   barValue: undefined,
     * };
     * if (output.fooValue !== undefined) {
     *   contents.fooValue = deserializeAws_restJson1_1Foo(output.fooValue, context);
     * }
     * if (output.barValue !== undefined) {
     *   contents.barValue = output.barValue;
     * }
     * return contents;
     * }
* * @param context The generation context. * @param shape The structure shape being generated. */ protected abstract void deserializeStructure(GenerationContext context, StructureShape shape); /** * Writes the code needed to deserialize a union in the document of a response. * *

Implementations of this method are expected to generate a function body that * returns the type generated for the UnionShape {@code shape} parameter from an input * deserialized by {@code deserializeOutputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * union Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code output: any}: a value for the UnionShape shape parameter deserialized from the document.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies a {@code Field} return type. * *

This function would generate the following: * *

{@code
     * if (output.fooValue !== undefined) {
     *   return {
     *     fooValue: deserializeAws_restJson1_1Foo(output.fooValue, context)
     *   };
     * }
     * if (output.barValue !== undefined) {
     *   return {
     *     barValue: output.barValue
     *   };
     * }
     * return { $unknown: output[Object.keys(output)[0]] };
     * }
* * @param context The generation context. * @param shape The union shape being generated. */ protected abstract void deserializeUnion(GenerationContext context, UnionShape shape); /** * Generates a function for serializing the input shape, dispatching the body generation * to the supplied function. * * @param shape The shape to generate a serializer for. * @param functionBody An implementation that will generate a function body to * serialize the shape. */ protected final void generateDeserFunction(Shape shape, BiConsumer functionBody) { SymbolProvider symbolProvider = context.getSymbolProvider(); TypeScriptWriter writer = context.getWriter(); Symbol symbol = symbolProvider.toSymbol(shape); // Use the shape name for the function name. String methodName = ProtocolGenerator.getDeserFunctionShortName(symbol); String methodLongName = ProtocolGenerator.getDeserFunctionName(symbol, context.getProtocolName()); boolean mayElide = serdeElisionEnabled && SerdeElisionIndex.of(context.getModel()).mayElide(shape); if (mayElide) { writer.write("// " + methodName + " omitted."); writer.write(""); } else { writer.addImport(symbol, symbol.getName()); writer.writeDocs(methodLongName); writer.openBlock( "const $L = (\n" + " output: any,\n" + " context: __SerdeContext\n" + "): $T => {", "}", methodName, symbol, () -> functionBody.accept(context, shape) ); writer.write(""); } } @Override public final Void operationShape(OperationShape shape) { throw new CodegenException("Operation shapes cannot be bound to documents."); } @Override public final Void resourceShape(ResourceShape shape) { throw new CodegenException("Resource shapes cannot be bound to documents."); } @Override public final Void serviceShape(ServiceShape shape) { throw new CodegenException("Service shapes cannot be bound to documents."); } /** * Dispatches to create the body of map shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * document FooDocument
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1FooDocument = (
     *   output: any,
     *   context: SerdeContext
     * ): FooDocument => {
     *   return JSON.parse(output);
     * }
     * }
* @param shape The map shape to generate deserialization for. * @return Null. */ @Override public final Void documentShape(DocumentShape shape) { generateDeserFunction(shape, (c, s) -> deserializeDocument(c, s.asDocumentShape().get())); return null; } /** * Dispatches to create the body of list shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * list ParameterList {
     *     member: Parameter
     * }
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1ParameterList = (
     *   output: any,
     *   context: SerdeContext
     * ): Parameter[] => {
     *   return (output || []).map((entry: any) =>
     *     deserializeAws_restJson1_1Parameter(entry, context)
     *   );
     * }
     * }
* * @param shape The list shape to generate deserialization for. * @return Null. */ @Override public final Void listShape(ListShape shape) { generateDeserFunction(shape, (c, s) -> deserializeCollection(c, s.asListShape().get())); return null; } /** * Dispatches to create the body of map shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * map FieldMap {
     *     key: String,
     *     value: Field
     * }
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1FieldMap = (
     *   output: any,
     *   context: SerdeContext
     * ): Record => {
     *   let mapParams: any = {};
     *   Object.keys(output).forEach(key => {
     *     mapParams[key] = deserializeAws_restJson1_1Field(output[key], context);
     *   });
     *   return mapParams;
     * }
     * }
* @param shape The map shape to generate deserialization for. * @return Null. */ @Override public final Void mapShape(MapShape shape) { generateDeserFunction(shape, (c, s) -> deserializeMap(c, s.asMapShape().get())); return null; } /** * Dispatches to create the body of set shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * set ParameterSet {
     *     member: Parameter
     * }
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1ParameterSet = (
     *   output: any,
     *   context: SerdeContext
     * ): Parameter[] => {
     *   return (output || []).map((entry: any) =>
     *     deserializeAws_restJson1_1Parameter(entry, context)
     *   );
     * }
     * }
* * @param shape The set shape to generate deserialization for. * @return Null. */ @Override public final Void setShape(SetShape shape) { generateDeserFunction(shape, (c, s) -> deserializeCollection(c, s.asSetShape().get())); return null; } /** * Dispatches to create the body of structure shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * structure Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1Field = (
     *   output: any,
     *   context: SerdeContext
     * ): Field => {
     *   let field: any = {
     *     fooValue: undefined,
     *     barValue: undefined,
     *   };
     *   if (output.fooValue !== undefined) {
     *     field.fooValue = deserializeAws_restJson1_1Foo(output.fooValue, context);
     *   }
     *   if (output.barValue !== undefined) {
     *     field.barValue = output.barValue;
     *   }
     *   return field;
     * }
     * }
* * @param shape The structure shape to generate deserialization for. * @return Null. */ @Override public final Void structureShape(StructureShape shape) { generateDeserFunction(shape, (c, s) -> deserializeStructure(c, s.asStructureShape().get())); return null; } /** * Dispatches to create the body of union shape deserialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * union Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The following code is generated for a deserializer

* *
{@code
     * const deserializeAws_restJson1_1Field = (
     *   output: any,
     *   context: SerdeContext
     * ): Field => {
     *   if (output.fooValue !== undefined) {
     *     return {
     *       fooValue: deserializeAws_restJson1_1Foo(output.fooValue, context)
     *     };
     *   }
     *   if (output.barValue !== undefined) {
     *     return {
     *       barValue: output.barValue
     *     };
     *   }
     *   return { $unknown: output[Object.keys(output)[0]] };
     * }
     * }
* * @param shape The union shape to generate deserialization for. * @return Null. */ @Override public final Void unionShape(UnionShape shape) { generateDeserFunction(shape, (c, s) -> deserializeUnion(c, s.asUnionShape().get())); return null; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/DocumentShapeSerVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Set; import java.util.function.BiConsumer; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Visitor to generate serialization functions for shapes in protocol document bodies. * * Visitor methods for aggregate types are final and will generate functions that dispatch * their body generation to the matching abstract method. The {@link DocumentMemberSerVisitor} * is provided to reduce the effort of this implementation by providing the default strategies * for serializing content from aggregate type members. * * Visitor methods for all other types will default to not generating serialization functions. * This may be overwritten by downstream implementations if the protocol requires more * complex serialization strategies for those types. * * This class reduces the effort necessary to build protocol implementations, specifically when * implementing {@link HttpBindingProtocolGenerator#generateDocumentBodyShapeSerializers(GenerationContext, Set)}. * * Implementations of this class independent of protocol documents are also possible. * * The standard implementation is as follows; no assumptions are made about the protocol * being generated for. * *
    *
  • Service, Operation, Resource: no function generated. Not overridable.
  • *
  • Document, List, Map, Set, Structure, Union: generates a serialization function. * Not overridable.
  • *
  • All other types: no function generated. May be overridden.
  • *
*/ @SmithyUnstableApi public abstract class DocumentShapeSerVisitor extends ShapeVisitor.Default { protected boolean serdeElisionEnabled; private final GenerationContext context; public DocumentShapeSerVisitor(GenerationContext context) { this.context = context; this.serdeElisionEnabled = false; } /** * Gets the generation context. * * @return The generation context. */ protected final GenerationContext getContext() { return context; } @Override protected Void getDefault(Shape shape) { return null; } /** * Writes the code needed to serialize a collection in the document of a request. * *

Implementations of this method are expected to generate a function body that * returns a value representing the CollectionShape {@code shape} parameter that is * serializable by {@code serializeInputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * list ParameterList {
     *     member: Parameter
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code input: Array<Parameter>}: the type generated for the CollectionShape shape parameter.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code any} return type; the function body * should return a value serializable by {@code serializeInputDocument}. * *

This function would generate the following: * *

{@code
     * return (input || []).map(entry =>
     *   serializeAws_restJson1_1Parameter(entry, context)
     * );
     * }
* *

{@code Set} types will be generated appropriately for signatures when given. * * @param context The generation context. * @param shape The collection shape being generated. */ protected abstract void serializeCollection(GenerationContext context, CollectionShape shape); /** * Writes the code needed to serialize a document in the document of a request. * *

Implementations of this method are expected to generate a function body that * returns a value representing the DocumentShape {@code shape} parameter that is * serializable by {@code serializeInputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * document FooDocument
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code input: FooDocument}: the type generated for the DocumentShape shape parameter.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code any} return type; the function body * should return a value serializable by {@code serializeInputDocument}. * *

This function would generate the following: * *

{@code
     * return JSON.stringify(input);
     * }
* * @param context The generation context. * @param shape The document shape being generated. */ protected abstract void serializeDocument(GenerationContext context, DocumentShape shape); /** * Writes the code needed to serialize a map in the document of a request. * *

Implementations of this method are expected to generate a function body that * returns a value representing the MapShape {@code shape} parameter that is * serializable by {@code serializeInputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * map FieldMap {
     *     key: String,
     *     value: Field
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code input: Record}: the type generated for the MapShape shape parameter.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code any} return type; the function body * should return a value serializable by {@code serializeInputDocument}. * *

This function would generate the following: * *

{@code
     * let mapParams: any = {};
     * Object.keys(input).forEach(key => {
     *   mapParams[key] = serializeAws_restJson1_1Field(input[key], context);
     * });
     * return mapParams;
     * }
* * @param context The generation context. * @param shape The map shape being generated. */ protected abstract void serializeMap(GenerationContext context, MapShape shape); /** * Writes the code needed to serialize a structure in the document of a request. * *

Implementations of this method are expected to generate a function body that * returns a value representing the StructureShape {@code shape} parameter that is * serializable by {@code serializeInputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * structure Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code input: Field}: the type generated for the StructureShape shape parameter.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code any} return type; the function body * should return a value serializable by {@code serializeInputDocument}. * *

This function would generate the following: * *

{@code
     * let bodyParams: any = {}
     * if (input.fooValue !== undefined) {
     *   bodyParams['fooValue'] = serializeAws_restJson1_1Foo(input.fooValue, context);
     * }
     * if (input.barValue !== undefined) {
     *   bodyParams['barValue'] = input.barValue;
     * }
     * return bodyParams;
     * }
* * @param context The generation context. * @param shape The structure shape being generated. */ protected abstract void serializeStructure(GenerationContext context, StructureShape shape); /** * Writes the code needed to serialize a union in the document of a request. * *

Implementations of this method are expected to generate a function body that * returns a value representing the UnionShape {@code shape} parameter that is * serializable by {@code serializeInputDocument}. * *

For example, given the following Smithy model: * *

{@code
     * union Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The function signature for this body will have two parameters available in scope: *

    *
  • {@code input: Field}: the type generated for the UnionShape shape parameter.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

The function signature specifies an {@code any} return type; the function body * should return a value serializable by {@code serializeInputDocument}. * *

This function would generate the following: * *

{@code
     * return Field.visit(input, {
     *   fooValue: value => serializeAws_restJson1_1Foo(value, context),
     *   barValue: value => value,
     *   _: value => value
     * });
     * }
* * @param context The generation context. * @param shape The union shape being generated. */ protected abstract void serializeUnion(GenerationContext context, UnionShape shape); /** * Generates a function for serializing the input shape, dispatching the body generation * to the supplied function. * * @param shape The shape to generate a serializer for. * @param functionBody An implementation that will generate a function body to * serialize the shape. */ private void generateSerFunction(Shape shape, BiConsumer functionBody) { SymbolProvider symbolProvider = context.getSymbolProvider(); TypeScriptWriter writer = context.getWriter(); Symbol symbol = symbolProvider.toSymbol(shape); // Use the shape name for the function name. String methodName = ProtocolGenerator.getSerFunctionShortName(symbol); String methodLongName = ProtocolGenerator.getSerFunctionName(symbol, context.getProtocolName()); writer.addImport(symbol, symbol.getName()); boolean mayElide = serdeElisionEnabled && SerdeElisionIndex.of(context.getModel()).mayElide(shape); if (mayElide) { writer.write("// " + methodName + " omitted."); writer.write(""); } else { writer.writeDocs(methodLongName); writer.openBlock( "const $L = (\n" + " input: $T,\n" + " context: __SerdeContext\n" + "): any => {", "}", methodName, symbol, () -> functionBody.accept(context, shape) ); writer.write(""); } } @Override public final Void operationShape(OperationShape shape) { throw new CodegenException("Operation shapes cannot be bound to documents."); } @Override public final Void resourceShape(ResourceShape shape) { throw new CodegenException("Resource shapes cannot be bound to documents."); } @Override public final Void serviceShape(ServiceShape shape) { throw new CodegenException("Service shapes cannot be bound to documents."); } /** * Dispatches to create the body of document shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * document FooDocument
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1FooDocument = (
     *   input: FooDocument,
     *   context: SerdeContext
     * ): any => {
     *   return JSON.stringify(input);
     * }
     * }
* * @param shape The document shape to generate serialization for. * @return Null. */ @Override public final Void documentShape(DocumentShape shape) { generateSerFunction(shape, (c, s) -> serializeDocument(c, s.asDocumentShape().get())); return null; } /** * Dispatches to create the body of list shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * list ParameterList {
     *     member: Parameter
     * }
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1ParametersList = (
     *   input: Parameter[],
     *   context: SerdeContext
     * ): any => {
     *   return (input || []).map(entry =>
     *     serializeAws_restJson1_1Parameter(entry, context)
     *   );
     * }
     * }
* * @param shape The list shape to generate serialization for. * @return Null. */ @Override public final Void listShape(ListShape shape) { generateSerFunction(shape, (c, s) -> serializeCollection(c, s.asListShape().get())); return null; } /** * Dispatches to create the body of map shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * map FieldMap {
     *     key: String,
     *     value: Field
     * }
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1FieldMap = (
     *   input: Record,
     *   context: SerdeContext
     * ): any => {
     *   let mapParams: any = {};
     *   Object.keys(input).forEach(key => {
     *     mapParams[key] = serializeAws_restJson1_1Field(input[key], context);
     *   });
     *   return mapParams;
     * }
     * }
* * @param shape The map shape to generate serialization for. * @return Null. */ @Override public final Void mapShape(MapShape shape) { generateSerFunction(shape, (c, s) -> serializeMap(c, s.asMapShape().get())); return null; } /** * Dispatches to create the body of set shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * set ParameterSet {
     *     member: Parameter
     * }
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1ParametersSet = (
     *   input: Parameter[],
     *   context: SerdeContext
     * ): any => {
     *   return (input || []).map(entry =>
     *     serializeAws_restJson1_1Parameter(entry, context)
     *   );
     * }
     * }
* * @param shape The set shape to generate serialization for. * @return Null. */ @Override public final Void setShape(SetShape shape) { generateSerFunction(shape, (c, s) -> serializeCollection(c, s.asSetShape().get())); return null; } /** * Dispatches to create the body of structure shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * structure Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1Field = (
     *   input: Field,
     *   context: SerdeContext
     * ): any => {
     *   let bodyParams: any = {}
     *   if (input.fooValue !== undefined) {
     *     bodyParams['fooValue'] = serializeAws_restJson1_1Foo(input.fooValue, context);
     *   }
     *   if (input.barValue !== undefined) {
     *     bodyParams['barValue'] = input.barValue;
     *   }
     *   return bodyParams;
     * }
     * }
* * @param shape The structure shape to generate serialization for. * @return Null. */ @Override public final Void structureShape(StructureShape shape) { generateSerFunction(shape, (c, s) -> serializeStructure(c, s.asStructureShape().get())); return null; } /** * Dispatches to create the body of union shape serialization functions. * The function signature will be generated. * *

For example, given the following Smithy model: * *

{@code
     * union Field {
     *     fooValue: Foo,
     *     barValue: String,
     * }
     * }
* *

The following code is generated for a serializer: * *

{@code
     * const serializeAws_restJson1_1Field = (
     *   input: Field,
     *   context: SerdeContext
     * ): any => {
     *   return Field.visit(input, {
     *     fooValue: value => serializeAws_restJson1_1Foo(value, context),
     *     barValue: value => value,
     *     _: value => value
     *   });
     * }
     * }
* * @param shape The union shape to generate serialization for. * @return Null. */ @Override public final Void unionShape(UnionShape shape) { generateSerFunction(shape, (c, s) -> serializeUnion(c, s.asUnionShape().get())); return null; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.EventStreamIndex; import software.amazon.smithy.model.knowledge.EventStreamInfo; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.EventHeaderTrait; import software.amazon.smithy.model.traits.EventPayloadTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.Pair; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Evnetstream code generator. */ @SmithyUnstableApi public class EventStreamGenerator { public static boolean isEventStreamShape(Shape shape) { return shape instanceof UnionShape && shape.hasTrait(StreamingTrait.class); } public static boolean hasEventStreamInput(GenerationContext context, OperationShape operation) { Model model = context.getModel(); EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); return eventStreamIndex.getInputInfo(operation).isPresent(); } public static UnionShape getEventStreamInputShape(GenerationContext context, OperationShape operation) { Model model = context.getModel(); EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); EventStreamInfo eventStreamInfo = eventStreamIndex.getInputInfo(operation).get(); return eventStreamInfo.getEventStreamTarget().asUnionShape().get(); } public static boolean hasEventStreamOutput(GenerationContext context, OperationShape operation) { Model model = context.getModel(); EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); return eventStreamIndex.getOutputInfo(operation).isPresent(); } public static UnionShape getEventStreamOutputShape(GenerationContext context, OperationShape operation) { Model model = context.getModel(); EventStreamIndex eventStreamIndex = EventStreamIndex.of(model); EventStreamInfo eventStreamInfo = eventStreamIndex.getOutputInfo(operation).get(); return eventStreamInfo.getEventStreamTarget().asUnionShape().get(); } public static MemberShape getEventStreamMember(GenerationContext context, StructureShape struct) { List eventStreamMembers = struct .members() .stream() .filter(shape -> { Shape target = context.getModel().expectShape(shape.getTarget()); boolean targetStreaming = target.hasTrait(StreamingTrait.class); boolean targetUnion = target.isUnionShape(); return targetUnion && targetStreaming; }) .toList(); if (eventStreamMembers.isEmpty()) { throw new CodegenException("No event stream member found in " + struct.getId().toString()); } else if (eventStreamMembers.size() > 1) { throw new CodegenException("More than one event stream member in " + struct.getId().toString()); } return eventStreamMembers.get(0); } /** * Generate eventstream serializers, and related serializers for events. * @param context Code generation context instance. * @param service The service shape. * @param documentContentType The default content-type value of current protocol. * @param serializeInputEventDocumentPayload Function writes the code needed to serialize an event payload as a * protocol-specific document. * @param documentShapesToSerialize The set of shapes that needs to be serialized as document payload. * Shapes that referred by event will be added. */ public void generateEventStreamSerializers( GenerationContext context, ServiceShape service, String documentContentType, Runnable serializeInputEventDocumentPayload, Set documentShapesToSerialize ) { Model model = context.getModel(); TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(service); TreeSet eventUnionsToSerialize = new TreeSet<>(); TreeSet> eventShapesToMarshall = new TreeSet<>((a, b) -> Objects.compare(a.getRight(), b.getRight(), StructureShape::compareTo)); for (OperationShape operation : operations) { if (hasEventStreamInput(context, operation)) { UnionShape eventsUnion = getEventStreamInputShape(context, operation); eventUnionsToSerialize.add(eventsUnion); eventsUnion .members() .forEach(member -> { eventShapesToMarshall.add( Pair.of( member.getMemberName(), model.expectShape(member.getTarget()).asStructureShape().get() ) ); }); } } eventUnionsToSerialize.forEach(eventsUnion -> { generateEventStreamSerializer(context, eventsUnion); }); SerdeElisionIndex serdeElisionIndex = SerdeElisionIndex.of(model); eventShapesToMarshall.forEach(memberNameAndEvent -> { generateEventMarshaller( context, memberNameAndEvent.getLeft(), memberNameAndEvent.getRight(), documentContentType, serializeInputEventDocumentPayload, documentShapesToSerialize, serdeElisionIndex ); }); } /** * Generate eventstream deserializers, and related deserializers for events. * @param context Code generation context instance. * @param service The service shape. * @param errorShapesToDeserialize A set of error shapes referred by events will be added to this set. * @param eventShapesToDeserialize A set of event shapes that needs to be treated as regular structure shapes will * be added to this set. * @param isErrorCodeInBody A boolean that indicates if the error code for the implementing protocol is located in * the error response body, meaning this generator will parse the body before attempting to * load an error code. */ public void generateEventStreamDeserializers( GenerationContext context, ServiceShape service, Set errorShapesToDeserialize, Set eventShapesToDeserialize, boolean isErrorCodeInBody, boolean serdeElisionEnabled, SerdeElisionIndex serdeElisionIndex ) { Model model = context.getModel(); TopDownIndex topDownIndex = TopDownIndex.of(model); Set operations = topDownIndex.getContainedOperations(service); TreeSet eventUnionsToDeserialize = new TreeSet<>(); TreeSet eventShapesToUnmarshall = new TreeSet<>(); for (OperationShape operation : operations) { if (hasEventStreamOutput(context, operation)) { UnionShape eventsUnion = getEventStreamOutputShape(context, operation); eventUnionsToDeserialize.add(eventsUnion); Set eventShapes = eventsUnion .members() .stream() .map(member -> model.expectShape(member.getTarget()).asStructureShape().get()) .collect(Collectors.toSet()); eventShapes.forEach(eventShapesToUnmarshall::add); } } eventUnionsToDeserialize.forEach(eventsUnion -> { generateEventStreamDeserializer(context, eventsUnion); }); eventShapesToUnmarshall.forEach(event -> { generateEventUnmarshaller( context, event, errorShapesToDeserialize, eventShapesToDeserialize, isErrorCodeInBody, serdeElisionEnabled, serdeElisionIndex ); }); } private void generateEventStreamSerializer(GenerationContext context, UnionShape eventsUnion) { String methodName = getSerFunctionName(context, eventsUnion); String methodLongName = ProtocolGenerator.getSerFunctionName( getSymbol(context, eventsUnion), context.getProtocolName() ); Symbol eventsUnionSymbol = getSymbol(context, eventsUnion); TypeScriptWriter writer = context.getWriter(); Model model = context.getModel(); writer.addTypeImport("Message", "__Message", TypeScriptDependency.SMITHY_TYPES); writer.writeDocs(methodLongName); writer.openBlock(""" const $L = ( input: any, context: $L ): any => {""", "}", methodName, getEventStreamSerdeContextType(context, eventsUnion), () -> { Symbol materializedSymbol = eventsUnionSymbol.toBuilder().putProperty("typeOnly", false).build(); writer.openBlock( "const eventMarshallingVisitor = (event: any): __Message => $T.visit(event, {", "});", materializedSymbol, () -> { eventsUnion .getAllMembers() .forEach((memberName, memberShape) -> { StructureShape target = model.expectShape(memberShape.getTarget(), StructureShape.class); String eventSerMethodName = getEventSerFunctionName(context, target); writer.write("$L: value => $L(value, context),", memberName, eventSerMethodName); }); writer.write("_: value => value as any"); } ); writer.write("return context.eventStreamMarshaller.serialize(input, eventMarshallingVisitor);"); }); } private String getSerFunctionName(GenerationContext context, Shape shape) { Symbol symbol = getSymbol(context, shape); return ProtocolGenerator.getSerFunctionShortName(symbol); } public String getEventSerFunctionName(GenerationContext context, Shape shape) { return getSerFunctionName(context, shape) + "_event"; } private String getEventStreamSerdeContextType(GenerationContext context, UnionShape eventsUnion) { TypeScriptWriter writer = context.getWriter(); writer.addTypeImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); String contextType = "__SerdeContext"; if (eventsUnion.hasTrait(StreamingTrait.class)) { writer.addTypeImport( "EventStreamSerdeContext", "__EventStreamSerdeContext", TypeScriptDependency.SMITHY_TYPES ); contextType += " & __EventStreamSerdeContext"; } return contextType; } private Symbol getSymbol(GenerationContext context, Shape shape) { SymbolProvider symbolProvider = context.getSymbolProvider(); return symbolProvider.toSymbol(shape); } public void generateEventMarshaller( GenerationContext context, String memberName, StructureShape event, String documentContentType, Runnable serializeInputEventDocumentPayload, Set documentShapesToSerialize, SerdeElisionIndex serdeElisionIndex ) { String methodName = getEventSerFunctionName(context, event); Symbol symbol = getSymbol(context, event); TypeScriptWriter writer = context.getWriter(); writer.addTypeImport("MessageHeaders", "__MessageHeaders", TypeScriptDependency.SMITHY_TYPES); writer.openBlock( "const $L = (\n" + " input: $T,\n" + " context: __SerdeContext\n" + "): __Message => {", "}", methodName, symbol, () -> { writer.openBlock("const headers: __MessageHeaders = {", "}", () -> { //fix headers required by event stream writer.write("\":event-type\": { type: \"string\", value: $S },", memberName); writer.write("\":message-type\": { type: \"string\", value: \"event\" },"); writeEventContentTypeHeader(context, event, documentContentType); }); writeEventHeaders(context, event); writeEventBody( context, event, serializeInputEventDocumentPayload, documentShapesToSerialize, serdeElisionIndex ); writer.openBlock("return { headers, body };"); } ); } private void writeEventContentTypeHeader( GenerationContext context, StructureShape event, String documentContentType ) { TypeScriptWriter writer = context.getWriter(); Optional payloadMemberOptional = getEventPayloadMember(event); Shape payloadShape = payloadMemberOptional .map(member -> { return context.getModel().expectShape(member.getTarget()); }) .orElse(event); if (payloadShape instanceof BlobShape) { writer.write("\":content-type\": { type: \"string\", value: \"application/octet-stream\" },"); } else if (payloadShape instanceof StringShape) { writer.write("\":content-type\": { type: \"string\", value: \"text/plain\" },"); } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) { writer.write("\":content-type\": { type: \"string\", value: $S },", documentContentType); } else { throw new CodegenException( String.format("Unexpected shape type bound to event payload: `%s`", payloadShape.getType()) ); } } private Optional getEventPayloadMember(StructureShape event) { List payloadMembers = event .getAllMembers() .values() .stream() .filter(member -> member.hasTrait(EventPayloadTrait.class)) .collect(Collectors.toList()); return payloadMembers.isEmpty() ? Optional.empty() // implicit payload : Optional.of(payloadMembers.get(0)); } private void writeEventHeaders(GenerationContext context, StructureShape event) { TypeScriptWriter writer = context.getWriter(); Model model = context.getModel(); List headerMembers = event .getAllMembers() .values() .stream() .filter(member -> member.hasTrait(EventHeaderTrait.class)) .collect(Collectors.toList()); for (MemberShape headerMember : headerMembers) { String memberName = headerMember.getMemberName(); Shape target = model.expectShape(headerMember.getTarget()); writer.openBlock("if (input.$L != null) {", "}", memberName, () -> { if (target.isLongShape()) { writer.addImportSubmodule( "Int64", "__Int64", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.EVENT_STREAMS ); writer.write( "headers[$1S] = { type: $2S, value: __Int64.fromNumber(input.$1L) }", memberName, getEventHeaderType(target) ); } else { writer.write( "headers[$1S] = { type: $2S, value: input.$1L }", memberName, getEventHeaderType(target) ); } }); } } /** * The value of event header 'type' property of given shape. */ private String getEventHeaderType(Shape shape) { switch (shape.getType()) { case BOOLEAN: case BYTE: case SHORT: case INTEGER: case LONG: case STRING: case TIMESTAMP: return shape.getType().toString(); case BLOB: return "binary"; default: throw new IllegalArgumentException("Unsupported event header shape type: " + shape.getType()); } } /** * If the event has a member that has an explicit eventPayload trait, return the member. */ private MemberShape getExplicitEventPayloadMember(StructureShape event) { return event .getAllMembers() .values() .stream() .filter(member -> member.hasTrait(EventPayloadTrait.class)) .collect(Collectors.toList()) .get(0); } private void writeEventBody( GenerationContext context, StructureShape event, Runnable serializeInputEventDocumentPayload, Set documentShapesToSerialize, SerdeElisionIndex serdeElisionIndex ) { TypeScriptWriter writer = context.getWriter(); Optional payloadMemberOptional = getEventPayloadMember(event); writer.write("let body = new Uint8Array();"); if (payloadMemberOptional.isPresent()) { Shape payloadShape = context.getModel().expectShape(payloadMemberOptional.get().getTarget()); String payloadMemberName = payloadMemberOptional.get().getMemberName(); writer.openBlock("if (input.$L != null) {", "}", payloadMemberName, () -> { if (payloadShape instanceof BlobShape) { writer.write("body = input.$L;", payloadMemberName); } else if (payloadShape instanceof StringShape) { writer.write("body = context.utf8Decoder(input.$L);", payloadMemberName); } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) { Symbol symbol = getSymbol(context, payloadShape); String serFunctionName = ProtocolGenerator.getSerFunctionShortName(symbol); boolean mayElide = serdeElisionIndex.mayElide(payloadShape); documentShapesToSerialize.add(payloadShape); if (mayElide) { writer.addImportSubmodule( "_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("body = $L(input.$L);", "_json", payloadMemberName); } else { writer.write("body = $L(input.$L, context);", serFunctionName, payloadMemberName); } serializeInputEventDocumentPayload.run(); } else { throw new CodegenException( String.format( "Unexpected shape type bound to event payload: `%s`", payloadShape.getType() ) ); } }); } else { // remove the input parameters that already serialized into event headers for (MemberShape memberShape : event.members()) { if (memberShape.hasTrait(EventHeaderTrait.class)) { writer.write("delete input[$S]", memberShape.getMemberName()); } } Symbol symbol = getSymbol(context, event); String serFunctionName = ProtocolGenerator.getSerFunctionShortName(symbol); documentShapesToSerialize.add(event); boolean mayElide = serdeElisionIndex.mayElide(event); if (mayElide) { writer.addImportSubmodule("_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); writer.write("body = $L(input);", "_json"); } else { writer.write("body = $L(input, context);", serFunctionName); } serializeInputEventDocumentPayload.run(); } } private void generateEventStreamDeserializer(GenerationContext context, UnionShape eventsUnion) { String methodName = getDeserFunctionName(context, eventsUnion); String methodLongName = ProtocolGenerator.getDeserFunctionName( getSymbol(context, eventsUnion), context.getProtocolName() ); Symbol eventsUnionSymbol = getSymbol(context, eventsUnion); TypeScriptWriter writer = context.getWriter(); Model model = context.getModel(); String contextType = getEventStreamSerdeContextType(context, eventsUnion); writer.writeDocs(methodLongName); writer.openBlock( "const $L = (\n" + " output: any,\n" + " context: $L\n" + "): AsyncIterable<$T> => {", "}", methodName, contextType, eventsUnionSymbol, () -> { writer.openBlock("return context.eventStreamMarshaller.deserialize(", ");", () -> { writer.write("output,"); writer.openBlock("async event => {", "}", () -> { eventsUnion .getAllMembers() .forEach((name, member) -> { StructureShape event = model.expectShape(member.getTarget(), StructureShape.class); writer.openBlock("if (event[$S] != null) {", "}", name, () -> { writer.openBlock("return {", "};", () -> { String eventDeserMethodName = getEventDeserFunctionName(context, event); writer.write( "$1L: await $2L(event[$1S], context),", name, eventDeserMethodName ); }); }); }); writer.write("return {$$unknown: event as any};"); }); }); } ); } private String getDeserFunctionName(GenerationContext context, Shape shape) { Symbol symbol = getSymbol(context, shape); return ProtocolGenerator.getDeserFunctionShortName(symbol); } public String getEventDeserFunctionName(GenerationContext context, Shape shape) { return getDeserFunctionName(context, shape) + "_event"; } public void generateEventUnmarshaller( GenerationContext context, StructureShape event, Set errorShapesToDeserialize, Set eventShapesToDeserialize, boolean isErrorCodeInBody, boolean serdeElisionEnabled, SerdeElisionIndex serdeElisionIndex ) { String methodName = getEventDeserFunctionName(context, event); Symbol symbol = getSymbol(context, event); TypeScriptWriter writer = context.getWriter(); writer.openBlock( "const $L = async (\n" + " output: any,\n" + " context: __SerdeContext\n" + "): Promise<$T> => {", "}", methodName, symbol, () -> { if (event.hasTrait(ErrorTrait.class)) { generateErrorEventUnmarshaller(context, event, errorShapesToDeserialize, isErrorCodeInBody); } else { writer.write("const contents: $L = {} as any;", symbol.getName()); readEventHeaders(context, event); readEventBody(context, event, eventShapesToDeserialize, serdeElisionEnabled, serdeElisionIndex); writer.write("return contents;"); } } ); } // Writes function content that unmarshall error event with error deserializer private void generateErrorEventUnmarshaller( GenerationContext context, StructureShape event, Set errorShapesToDeserialize, boolean isErrorCodeInBody ) { TypeScriptWriter writer = context.getWriter(); // If this is an error event, we need to generate the error deserializer. errorShapesToDeserialize.add(event); String errorDeserMethodName = getDeserFunctionName(context, event) + "Res"; if (isErrorCodeInBody) { // If error code is in body, parseBody() won't be called inside error deser. So we parse body here. // It's ok to parse body here because body won't be streaming if 'isErrorCodeInBody' is set. writer.openBlock("const parsedOutput: any = {", "};", () -> { writer.write("...output,"); writer.write("body: await parseBody(output.body, context)"); }); writer.write("return $L(parsedOutput, context);", errorDeserMethodName); } else { writer.write("return $L(output, context);", errorDeserMethodName); } } // Parse members from event headers. private void readEventHeaders(GenerationContext context, StructureShape event) { TypeScriptWriter writer = context.getWriter(); List headerMembers = event .getAllMembers() .values() .stream() .filter(member -> member.hasTrait(EventHeaderTrait.class)) .toList(); for (MemberShape headerMember : headerMembers) { String memberName = headerMember.getMemberName(); String varName = context.getStringStore().var(memberName); writer.write( """ if (output.headers[$1L] !== undefined) { contents[$1L] = output.headers[$1L].value; } """, varName ); } } private void readEventBody( GenerationContext context, StructureShape event, Set eventShapesToDeserialize, boolean serdeElisionEnabled, SerdeElisionIndex serdeElisionIndex ) { TypeScriptWriter writer = context.getWriter(); Optional payloadmemberOptional = getEventPayloadMember(event); if (payloadmemberOptional.isPresent()) { Shape payloadShape = context.getModel().expectShape(payloadmemberOptional.get().getTarget()); String payloadMemberName = payloadmemberOptional.get().getMemberName(); if (payloadShape instanceof BlobShape) { writer.write("contents.$L = output.body;", payloadMemberName); } else if (payloadShape instanceof StringShape) { writer.write("contents.$L = await collectBodyString(output.body, context);", payloadMemberName); } else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) { writer.write("const data: any = await parseBody(output.body, context);"); Symbol symbol = getSymbol(context, payloadShape); String deserFunctionName = ProtocolGenerator.getDeserFunctionShortName(symbol); boolean mayElide = serdeElisionEnabled && serdeElisionIndex.mayElide(payloadShape); if (mayElide) { writer.addImportSubmodule( "_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("contents.$L = $L(data);", payloadMemberName, "_json"); } else { writer.write("contents.$L = $L(data, context);", payloadMemberName, deserFunctionName); } eventShapesToDeserialize.add(payloadShape); } } else { writer.write("const data: any = await parseBody(output.body, context);"); Symbol symbol = getSymbol(context, event); String deserFunctionName = ProtocolGenerator.getDeserFunctionShortName(symbol); boolean mayElide = serdeElisionEnabled && serdeElisionIndex.mayElide(event); if (mayElide) { writer.addImportSubmodule("_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); writer.write("Object.assign(contents, $L(data));", "_json"); } else { writer.write("Object.assign(contents, $L(data, context));", deserFunctionName); } eventShapesToDeserialize.add(event); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.nio.file.Paths; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import java.util.function.Consumer; import java.util.logging.Logger; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.HttpBinding; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.knowledge.HttpBindingIndex; import software.amazon.smithy.model.knowledge.OperationIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.pattern.SmithyPattern.Segment; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.NumberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.HostLabelTrait; import software.amazon.smithy.model.traits.HttpErrorTrait; import software.amazon.smithy.model.traits.HttpQueryTrait; import software.amazon.smithy.model.traits.HttpTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.FrameworkErrorModel; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.endpointsV2.RuleSetParameterFinder; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.OptionalUtils; import software.amazon.smithy.utils.SetUtils; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Abstract implementation useful for all protocols that use HTTP bindings. */ @SmithyUnstableApi public abstract class HttpBindingProtocolGenerator implements ProtocolGenerator { private static final Logger LOGGER = Logger.getLogger(HttpBindingProtocolGenerator.class.getName()); private static final Set REGEX_CHARS = SetUtils.of( '.', '*', '+', '?', '^', '$', '{', '}', '(', ')', '|', '[', ']', '\\' ); private static final ApplicationProtocol APPLICATION_PROTOCOL = ApplicationProtocol.createDefaultHttpApplicationProtocol(); private final Set serializingDocumentShapes = new TreeSet<>(); private final Set deserializingDocumentShapes = new TreeSet<>(); private final Set serializingErrorShapes = new TreeSet<>(); private final Set deserializingErrorShapes = new TreeSet<>(); private final boolean isErrorCodeInBody; private final EventStreamGenerator eventStreamGenerator = new EventStreamGenerator(); private final LinkedHashMap headerBuffer = new LinkedHashMap<>(); private Set contextParamDeduplicationParamControlSet = new HashSet<>(); /** * Creates a Http binding protocol generator. * * @param isErrorCodeInBody A boolean that indicates if the error code for the implementing protocol is located in * the error response body, meaning this generator will parse the body before attempting to load an error code. */ public HttpBindingProtocolGenerator(boolean isErrorCodeInBody) { this.isErrorCodeInBody = isErrorCodeInBody; } /** * Indicate that param names in the set should be de-duplicated when appearing in * both contextParams (endpoint ruleset related) and HTTP URI segments / labels. */ public void setContextParamDeduplicationParamControlSet(Set contextParamDeduplicationParamControlSet) { this.contextParamDeduplicationParamControlSet = contextParamDeduplicationParamControlSet; } @Override public final ApplicationProtocol getApplicationProtocol() { return APPLICATION_PROTOCOL; } /** * Gets the default serde format for timestamps. * * @return Returns the default format. */ protected abstract Format getDocumentTimestampFormat(); /** * Gets the default content-type when a document is synthesized in the body. * * @return Returns the default content-type. */ protected abstract String getDocumentContentType(); /** * Generates serialization functions for shapes in the passed set. These functions * should return a value that can then be serialized by the implementation of * {@link HttpBindingProtocolGenerator#serializeInputDocumentBody}. The {@link DocumentShapeSerVisitor} and * {@link DocumentMemberSerVisitor} are provided to reduce the effort of this implementation. * * @param context The generation context. * @param shapes The shapes to generate serialization for. */ protected abstract void generateDocumentBodyShapeSerializers(GenerationContext context, Set shapes); /** * Generates deserialization functions for shapes in the passed set. These functions * should return a value that can then be deserialized by the implementation of * {@link HttpBindingProtocolGenerator#deserializeInputDocumentBody}. The {@link DocumentShapeDeserVisitor} and * {@link DocumentMemberDeserVisitor} are provided to reduce the effort of this implementation. * * @param context The generation context. * @param shapes The shapes to generate deserialization for. */ protected abstract void generateDocumentBodyShapeDeserializers(GenerationContext context, Set shapes); @Override public void generateSharedComponents(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer.addImportSubmodule("map", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); if (context.getSettings().generateClient()) { writer.addImportSubmodule( "withBaseException", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); SymbolReference exception = HttpProtocolGeneratorUtils.getClientBaseException(context); writer.write("const throwDefaultError = withBaseException($T);", exception); } deserializingErrorShapes.forEach(error -> generateErrorDeserializer(context, error)); serializingErrorShapes.forEach(error -> generateErrorSerializer(context, error)); ServiceShape service = context.getService(); eventStreamGenerator.generateEventStreamSerializers( context, service, getDocumentContentType(), () -> { this.serializeInputEventDocumentPayload(context); }, serializingDocumentShapes ); SerdeElisionIndex serdeElisionIndex = SerdeElisionIndex.of(context.getModel()); // Error shapes that only referred in the error event of an eventstream Set errorEventShapes = new TreeSet<>(); eventStreamGenerator.generateEventStreamDeserializers( context, service, errorEventShapes, deserializingDocumentShapes, isErrorCodeInBody, enableSerdeElision(), serdeElisionIndex ); errorEventShapes.removeIf(deserializingErrorShapes::contains); errorEventShapes.forEach(error -> generateErrorDeserializer(context, error)); generateDocumentBodyShapeSerializers(context, serializingDocumentShapes); generateDocumentBodyShapeDeserializers(context, deserializingDocumentShapes); HttpProtocolGeneratorUtils.generateMetadataDeserializer(context, getApplicationProtocol().getResponseType()); HttpProtocolGeneratorUtils.generateCollectBodyString(context); writer.write(context.getStringStore().flushVariableDeclarationCode()); writer.addImportSubmodule( "HttpRequest", "__HttpRequest", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImportSubmodule( "HttpResponse", "__HttpResponse", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); } @Override public void generateRequestSerializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { OptionalUtils.ifPresentOrElse( operation.getTrait(HttpTrait.class), httpTrait -> generateOperationRequestSerializer(context, operation, httpTrait), () -> LOGGER.warning( String.format( "Unable to generate %s protocol request bindings for %s because it does not have an " + "http binding trait", getName(), operation.getId() ) ) ); } } @Override public void generateRequestDeserializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { OptionalUtils.ifPresentOrElse( operation.getTrait(HttpTrait.class), httpTrait -> generateOperationRequestDeserializer(context, operation, httpTrait), () -> LOGGER.warning( String.format( "Unable to generate %s protocol request bindings for %s because it does not have an " + "http binding trait", getName(), operation.getId() ) ) ); } } @Override public void generateResponseSerializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { OptionalUtils.ifPresentOrElse( operation.getTrait(HttpTrait.class), httpTrait -> generateOperationResponseSerializer(context, operation, httpTrait), () -> LOGGER.warning( String.format( "Unable to generate %s protocol response bindings for %s because it does not have an " + "http binding trait", getName(), operation.getId() ) ) ); } } @Override public void generateFrameworkErrorSerializer(GenerationContext inputContext) { final GenerationContext context = inputContext.copy(); context.setModel(FrameworkErrorModel.INSTANCE.getModel()); SymbolReference responseType = getApplicationProtocol().getResponseType(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); TypeScriptWriter writer = context.getWriter(); writer.addImport("SmithyFrameworkException", "__SmithyFrameworkException", TypeScriptDependency.SERVER_COMMON); writer.addUseImports(responseType); writer.addImport("ServerSerdeContext", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "export const serializeFrameworkException = async (\n" + " input: __SmithyFrameworkException,\n" + " ctx: ServerSerdeContext\n" + "): Promise<$T> => {", "}", responseType, () -> { writeEmptyEndpoint(context); writer.openBlock("switch (input.name) {", "}", () -> { for ( final Shape shape : new TreeSet<>( context.getModel().getShapesWithTrait(HttpErrorTrait.class) ) ) { StructureShape errorShape = shape.asStructureShape().orElseThrow(IllegalArgumentException::new); writer.openBlock("case $S: {", "}", errorShape.getId().getName(), () -> { generateErrorSerializationImplementation( context, errorShape, responseType, bindingIndex ); }); } }); } ); writer.write(""); } private void generateServiceMux(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); TypeScriptWriter writer = context.getWriter(); writer.addImport("httpbinding", null, TypeScriptDependency.SERVER_COMMON); Symbol serviceSymbol = context.getSymbolProvider().toSymbol(context.getService()); writer.openBlock( "const mux = new httpbinding.HttpBindingMux<$S, keyof $T>([", "]);", context.getService().getId().getName(), serviceSymbol, () -> { for (OperationShape operation : topDownIndex.getContainedOperations(context.getService())) { OptionalUtils.ifPresentOrElse( operation.getTrait(HttpTrait.class), httpTrait -> generateUriSpec(context, operation, httpTrait), () -> LOGGER.warning( String.format( "Unable to generate %s uri spec for %s because it does not have an " + "http binding trait", getName(), operation.getId() ) ) ); } } ); } private void generateOperationMux(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); writer.addImport("httpbinding", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "const mux = new httpbinding.HttpBindingMux<$S, $S>([", "]);", context.getService().getId().getName(), context.getSymbolProvider().toSymbol(operation).getName(), () -> { HttpTrait httpTrait = operation.expectTrait(HttpTrait.class); generateUriSpec(context, operation, httpTrait); } ); } private void generateUriSpec(GenerationContext context, OperationShape operation, HttpTrait httpTrait) { TypeScriptWriter writer = context.getWriter(); String serviceName = context.getService().getId().getName(); String operationName = context.getSymbolProvider().toSymbol(operation).getName(); writer.openBlock("new httpbinding.UriSpec<$S, $S>(", "),", serviceName, operationName, () -> { writer.write("'$L',", httpTrait.getMethod()); writer.openBlock("[", "],", () -> { for (Segment s : httpTrait.getUri().getSegments()) { if (s.isGreedyLabel()) { writer.write("{ type: 'greedy' },"); } else if (s.isLabel()) { writer.write("{ type: 'path' },"); } else { writer.write("{ type: 'path_literal', value: $S },", s.getContent()); } } }); writer.openBlock("[", "],", () -> { for (Map.Entry e : httpTrait.getUri().getQueryLiterals().entrySet()) { if (e.getValue() == null) { writer.write("{ type: 'query_literal', key: $S },", e.getKey()); } else { writer.write("{ type: 'query_literal', key: $S, value: $S },", e.getKey(), e.getValue()); } } operation .getInput() .ifPresent(inputId -> { StructureShape inputShape = context.getModel().expectShape(inputId, StructureShape.class); for (MemberShape ms : inputShape.members()) { if (ms.isRequired() && ms.hasTrait(HttpQueryTrait.class)) { HttpQueryTrait queryTrait = ms.expectTrait(HttpQueryTrait.class); writer.write("{ type: 'query', key: $S },", queryTrait.getValue()); } } }); }); writer.writeInline("{ service: $S, operation: $S }", serviceName, operationName); }); } @Override public void generateServiceHandlerFactory(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); TopDownIndex index = TopDownIndex.of(context.getModel()); Set operations = index.getContainedOperations(context.getService()); SymbolProvider symbolProvider = context.getSymbolProvider(); writer.addRelativeImport( "serializeFrameworkException", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(getName()) ) ); writer.addImport("ValidationCustomizer", "__ValidationCustomizer", TypeScriptDependency.SERVER_COMMON); writer.addImportSubmodule( "HttpRequest", "__HttpRequest", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImportSubmodule( "HttpResponse", "__HttpResponse", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); Symbol serviceSymbol = symbolProvider.toSymbol(context.getService()); Symbol handlerSymbol = serviceSymbol.expectProperty("handler", Symbol.class); Symbol operationsSymbol = serviceSymbol.expectProperty("operations", Symbol.class); if (context.getSettings().isDisableDefaultValidation()) { writer.write( "export const get$L = (service: $T, " + "customizer: __ValidationCustomizer<$T>): " + "__ServiceHandler => {", handlerSymbol.getName(), serviceSymbol, operationsSymbol ); } else { writer.write( "export const get$L = (service: $T): " + "__ServiceHandler => {", handlerSymbol.getName(), serviceSymbol ); } writer.indent(); generateServiceMux(context); writer.addImport("ServiceException", "__ServiceException", TypeScriptDependency.SERVER_COMMON); writer.openBlock( "const serFn: (op: $1T) => __OperationSerializer<$2T, $1T, __ServiceException> = " + "(op) => {", "};", operationsSymbol, serviceSymbol, () -> { writer.openBlock("switch (op) {", "}", () -> { operations .stream() .filter(o -> o.getTrait(HttpTrait.class).isPresent()) .forEach(writeOperationCase(writer, symbolProvider)); }); } ); if (!context.getSettings().isDisableDefaultValidation()) { writer.addImport( "generateValidationSummary", "__generateValidationSummary", TypeScriptDependency.SERVER_COMMON ); writer.addImport( "generateValidationMessage", "__generateValidationMessage", TypeScriptDependency.SERVER_COMMON ); writer.openBlock( "const customizer: __ValidationCustomizer<$T> = (ctx, failures) => {", "};", operationsSymbol, () -> { writeDefaultValidationCustomizer(writer); } ); } writer.write("return new $T(service, mux, serFn, serializeFrameworkException, customizer);", handlerSymbol); writer.dedent().write("}"); } @Override public void generateOperationHandlerFactory(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); writer.addImport( "serializeFrameworkException", null, Paths.get( ".", CodegenUtils.SOURCE_FOLDER, PROTOCOLS_FOLDER, ProtocolGenerator.getSanitizedName(getName()) ).toString() ); writer.addImportSubmodule( "HttpRequest", "__HttpRequest", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImportSubmodule( "HttpResponse", "__HttpResponse", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); final Symbol operationSymbol = symbolProvider.toSymbol(operation); final Symbol inputType = operationSymbol.expectProperty("inputType", Symbol.class); final Symbol outputType = operationSymbol.expectProperty("outputType", Symbol.class); final Symbol serializerType = operationSymbol.expectProperty("serializerType", Symbol.class); final Symbol operationHandlerSymbol = operationSymbol.expectProperty("handler", Symbol.class); if (context.getSettings().isDisableDefaultValidation()) { writer.write( "export const get$L = (operation: __Operation<$T, $T, Context>, " + "customizer: __ValidationCustomizer<$S>): " + "__ServiceHandler => {", operationHandlerSymbol.getName(), inputType, outputType, operationSymbol.getName() ); } else { writer.write( "export const get$L = (operation: __Operation<$T, $T, Context>): " + "__ServiceHandler => {", operationHandlerSymbol.getName(), inputType, outputType ); } writer.indent(); generateOperationMux(context, operation); if (!context.getSettings().isDisableDefaultValidation()) { writer.addImport( "generateValidationSummary", "__generateValidationSummary", TypeScriptDependency.SERVER_COMMON ); writer.addImport( "generateValidationMessage", "__generateValidationMessage", TypeScriptDependency.SERVER_COMMON ); writer.openBlock( "const customizer: __ValidationCustomizer<$S> = (ctx, failures) => {", "};", operationSymbol.getName(), () -> { writeDefaultValidationCustomizer(writer); } ); } writer.write( "return new $T(operation, mux, new $T(), serializeFrameworkException, customizer);", operationHandlerSymbol, serializerType ); writer.dedent().write("}"); } private void writeDefaultValidationCustomizer(TypeScriptWriter writer) { writer.openBlock("if (!failures) {", "}", () -> { writer.write("return undefined;"); }); writer.openBlock("return {", "};", () -> { writer.write("name: \"ValidationException\","); writer.write("$$fault: \"client\","); writer.write("message: __generateValidationSummary(failures),"); writer.openBlock("fieldList: failures.map(failure => ({", "}))", () -> { writer.write("path: failure.path,"); writer.write("message: __generateValidationMessage(failure)"); }); }); } private Consumer writeOperationCase(TypeScriptWriter writer, SymbolProvider symbolProvider) { return operation -> { Symbol operationSymbol = symbolProvider.toSymbol(operation); Symbol symbol = operationSymbol.expectProperty("serializerType", Symbol.class); writer.write("case $S: return new $T();", operationSymbol.getName(), symbol); }; } @Override public void generateResponseDeserializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { OptionalUtils.ifPresentOrElse( operation.getTrait(HttpTrait.class), httpTrait -> generateOperationResponseDeserializer(context, operation, httpTrait), () -> LOGGER.warning( String.format( "Unable to generate %s protocol response bindings for %s because it does not have an " + "http binding trait", getName(), operation.getId() ) ) ); } SymbolReference responseType = getApplicationProtocol().getResponseType(); Set errorShapes = HttpProtocolGeneratorUtils.generateUnifiedErrorDispatcher( context, containedOperations.stream().toList(), responseType, this::writeErrorCodeParser, isErrorCodeInBody, this::getErrorBodyLocation, this::getOperationErrors, getErrorAliases(context, containedOperations) ); deserializingErrorShapes.addAll(errorShapes); } private void generateOperationResponseSerializer( GenerationContext context, OperationShape operation, HttpTrait trait ) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference responseType = getApplicationProtocol().getResponseType(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); TypeScriptWriter writer = context.getWriter(); writer.addUseImports(responseType); String methodName = ProtocolGenerator.getGenericSerFunctionName(symbol) + "Response"; Symbol outputType = symbol.expectProperty("outputType", Symbol.class); writer.addImport("ServerSerdeContext", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "export const $L = async (\n" + " input: $T,\n" + " ctx: ServerSerdeContext\n" + "): Promise<$T> => {", "};", methodName, outputType, responseType, () -> { writeEmptyEndpoint(context, operation); writeOperationStatusCode(context, operation, bindingIndex, trait); writeResponseHeaders( context, operation, bindingIndex, () -> writeDefaultOutputHeaders(context, operation) ); List bodyBindings = writeResponseBody(context, operation, bindingIndex); if (!bodyBindings.isEmpty()) { // Track all shapes bound to the body so their serializers may be generated. bodyBindings .stream() .map(HttpBinding::getMember) .map(member -> context.getModel().expectShape(member.getTarget())) .forEach(serializingDocumentShapes::add); } calculateContentLength(context); writer.openBlock("return new $T({", "});", responseType, () -> { writer.write("headers,"); writer.write("body,"); writer.write("statusCode,"); }); } ); writer.write(""); serializingErrorShapes.addAll(OperationIndex.of(context.getModel()).getErrors(operation, context.getService())); } private void calculateContentLength(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule( "calculateBodyLength", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.openBlock( "if (body && Object.keys(headers).map((str) => str.toLowerCase())" + ".indexOf('content-length') === -1) {", "}", () -> { writer.write("const length = calculateBodyLength(body);"); writer.openBlock("if (length !== undefined) {", "}", () -> { writer.write("headers = { ...headers, 'content-length': String(length) };"); }); } ); } private void generateErrorSerializer(GenerationContext context, StructureShape error) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(error); SymbolReference responseType = getApplicationProtocol().getResponseType(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); TypeScriptWriter writer = context.getWriter(); writer.addUseImports(responseType); String methodName = ProtocolGenerator.getGenericSerFunctionName(symbol) + "Error"; writer.addImport("ServerSerdeContext", null, TypeScriptDependency.SERVER_COMMON); writer.openBlock( "export const $L = async (\n" + " input: $T,\n" + " ctx: ServerSerdeContext\n" + "): Promise<$T> => {", "};", methodName, symbol, responseType, () -> { writeEmptyEndpoint(context); generateErrorSerializationImplementation(context, error, responseType, bindingIndex); } ); writer.write(""); } private void generateErrorSerializationImplementation( GenerationContext context, StructureShape error, SymbolReference responseType, HttpBindingIndex bindingIndex ) { TypeScriptWriter writer = context.getWriter(); writeErrorStatusCode(context, error); writeResponseHeaders(context, error, bindingIndex, () -> writeDefaultErrorHeaders(context, error)); List bodyBindings = writeResponseBody(context, error, bindingIndex); if (!bodyBindings.isEmpty()) { // Track all shapes bound to the body so their serializers may be generated. bodyBindings .stream() .map(HttpBinding::getMember) .map(member -> context.getModel().expectShape(member.getTarget())) .forEach(serializingDocumentShapes::add); } writer.openBlock("return new $T({", "});", responseType, () -> { writer.write("headers,"); writer.write("body,"); writer.write("statusCode,"); }); } private void writeEmptyEndpoint(GenerationContext context) { context .getWriter() .write( """ const context: __SerdeContext = { ...ctx, endpoint: () => Promise.resolve({ protocol: '', hostname: '', path: '', }), };""" ); } private void writeEmptyEndpoint(GenerationContext context, OperationShape operation) { String contextType = "__SerdeContext"; boolean hasEventStreamResponse = EventStreamGenerator.hasEventStreamOutput(context, operation); if (hasEventStreamResponse) { // todo: unsupported SSDK feature. contextType += "& any /*event stream context unsupported in ssdk*/"; } context .getWriter() .write( """ const context: $L = { ...ctx, endpoint: () => Promise.resolve({ protocol: '', hostname: '', path: '', }), };""", contextType ); } private void generateOperationRequestSerializer( GenerationContext context, OperationShape operation, HttpTrait trait ) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference requestType = getApplicationProtocol().getRequestType(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); TypeScriptWriter writer = context.getWriter(); // Ensure that the request type is imported. writer.addUseImports(requestType); writer.addTypeImport("Endpoint", "__Endpoint", TypeScriptDependency.SMITHY_TYPES); // e.g., se_ES String methodName = ProtocolGenerator.getSerFunctionShortName(symbol); // e.g., serializeAws_restJson1_1ExecuteStatement String methodLongName = ProtocolGenerator.getSerFunctionName(symbol, getName()); // Add the normalized input type. Symbol inputType = symbol.expectProperty("inputType", Symbol.class); String contextType = CodegenUtils.getOperationSerializerContextType(writer, context.getModel(), operation); writer.writeDocs(methodLongName); writer.openBlock( "export const $L = async (\n" + " input: $T,\n" + " context: $L\n" + "): Promise<$T> => {", "};", methodName, inputType, contextType, requestType, () -> { // Get the hostname, path, port, and scheme from client's resolved endpoint. // Then construct the request from them. The client's resolved endpoint can // be default one or supplied by users. writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImport("requestBuilder", "rb", TypeScriptDependency.SMITHY_CORE); writer.write("const b = rb(input, context);"); writeRequestHeaders(context, operation, bindingIndex); writeResolvedPath(context, operation, bindingIndex, trait); boolean hasQueryComponents = writeRequestQueryString(context, operation, bindingIndex, trait); List bodyBindings = writeRequestBody(context, operation, bindingIndex); if (!bodyBindings.isEmpty()) { // Track all shapes bound to the body so their serializers may be generated. bodyBindings .stream() .map(HttpBinding::getMember) .map(member -> context.getModel().expectShape(member.getTarget())) .filter(shape -> !EventStreamGenerator.isEventStreamShape(shape)) .forEach(serializingDocumentShapes::add); } boolean hasHostPrefix = operation.hasTrait(EndpointTrait.class); if (hasHostPrefix) { HttpProtocolGeneratorUtils.writeHostPrefix(context, operation); writer.write("b.hn(resolvedHostname);"); } writer.write("b.m($S)", trait.getMethod()); writer.write(".h(headers)"); if (hasQueryComponents) { writer.write(".q(query)"); } // Always set the body, writer.write(".b(body);"); writer.write("return b.build();"); } ); writer.write(""); } private void writeOperationStatusCode( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex, HttpTrait trait ) { SymbolProvider symbolProvider = context.getSymbolProvider(); List bindings = bindingIndex.getResponseBindings(operation, Location.RESPONSE_CODE); TypeScriptWriter writer = context.getWriter(); writer.write("let statusCode: number = $L", trait.getCode()); if (!bindings.isEmpty()) { HttpBinding binding = bindings.get(0); // This can only be bound to an int so we don't need to do the same sort of complex finagling // as we do with other http bindings. String bindingMember = "input." + symbolProvider.toMemberName(binding.getMember()); writer.openBlock("if ($L !== undefined) {", "}", bindingMember, () -> { writer.write("statusCode = $L", bindingMember); }); } } private void writeErrorStatusCode(GenerationContext context, StructureShape error) { ErrorTrait trait = error.expectTrait(ErrorTrait.class); int code = error .getTrait(HttpErrorTrait.class) .map(HttpErrorTrait::getCode) .orElse(trait.getDefaultHttpStatusCode()); context.getWriter().write("const statusCode: number = $L", code); } private void writeResolvedPath( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex, HttpTrait trait ) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); List labelBindings = bindingIndex.getRequestBindings(operation, Location.LABEL); final Map contextParams = new RuleSetParameterFinder(context.getService()).getContextParams( context.getModel().getShape(operation.getInputShape()).get() ); // Always write the bound path, but only the actual segments. writer.write( "b.bp(\"$L\");", "/" + trait .getUri() .getSegments() .stream() .filter(segment -> { String content = segment.getContent(); boolean isContextParam = contextParams.containsKey(content); // If the endpoint also contains the uri segment, e.g. Bucket, we // do not want to include it in the operation URI to be resolved. // We use this logic plus a temporary control-list, since it is not yet known // how many services and param names will have this issue. return !(isContextParam && contextParamDeduplicationParamControlSet.contains(content)); }) .map(Segment::toString) .collect(Collectors.joining("/")) ); // Handle any label bindings. if (!labelBindings.isEmpty()) { writer.addImportSubmodule( "resolvedPath", "__resolvedPath", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); Model model = context.getModel(); List uriLabels = trait.getUri().getLabels(); for (HttpBinding binding : labelBindings) { String memberName = symbolProvider.toMemberName(binding.getMember()); Shape target = model.expectShape(binding.getMember().getTarget()); String labelValueProvider = "() => " + getInputValue( context, binding.getLocation(), "input." + memberName + "!", binding.getMember(), target ); // Get the correct label to use. Segment uriLabel = uriLabels .stream() .filter(s -> s.getContent().equals(memberName)) .findFirst() .get(); writer.write( "b.p('$L', $L, '$L', $L)", memberName, labelValueProvider, uriLabel.toString(), uriLabel.isGreedyLabel() ? "true" : "false" ); } } } private boolean writeRequestQueryString( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex, HttpTrait trait ) { TypeScriptWriter writer = context.getWriter(); List queryBindings = bindingIndex.getRequestBindings(operation, Location.QUERY); List queryParamsBindings = bindingIndex.getRequestBindings(operation, Location.QUERY_PARAMS); // Build the initial query bag. Map queryLiterals = trait.getUri().getQueryLiterals(); if (!queryLiterals.isEmpty() || !queryBindings.isEmpty() || !queryParamsBindings.isEmpty()) { writer.openBlock("const query: any = map({", "});", () -> { if (!queryLiterals.isEmpty()) { // Write any query literals present in the uri. queryLiterals.forEach((k, v) -> writer.write("[$L]: [, $S],", context.getStringStore().var(k), v)); } // Handle any additional query params bindings. // If query string parameter is also present in httpQuery, it would be overwritten. // Serializing HTTP messages https://smithy.io/2.0/spec/http-bindings.html#serializing-http-messages if (!queryParamsBindings.isEmpty()) { SymbolProvider symbolProvider = context.getSymbolProvider(); String memberName = symbolProvider.toMemberName(queryParamsBindings.get(0).getMember()); writer.addImportSubmodule( "convertMap", "convertMap", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("...convertMap(input.$L),", memberName); } // Handle any additional query bindings. if (!queryBindings.isEmpty()) { for (HttpBinding binding : queryBindings) { writeRequestQueryParam(context, binding); } } }); } // Any binding or literal means we generated a query bag. return !queryBindings.isEmpty() || !queryLiterals.isEmpty() || !queryParamsBindings.isEmpty(); } private void writeRequestQueryParam(GenerationContext context, HttpBinding binding) { Model model = context.getModel(); TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); String memberName = symbolProvider.toMemberName(binding.getMember()); writer.addImportSubmodule( "extendedEncodeURIComponent", "__extendedEncodeURIComponent", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); Shape target = model.expectShape(binding.getMember().getTarget()); boolean isIdempotencyToken = binding.getMember().hasTrait(IdempotencyTokenTrait.class); boolean isRequired = binding.getMember().isRequired(); String idempotencyComponent = ""; if (isIdempotencyToken && !isRequired) { writer.addImportSubmodule( "v4", "generateIdempotencyToken", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); idempotencyComponent = " ?? generateIdempotencyToken()"; } String memberAssertionComponent = (idempotencyComponent.isEmpty() ? "!" : ""); String queryValue = getInputValue( context, binding.getLocation(), "input[" + context.getStringStore().var(memberName) + "]" + memberAssertionComponent, binding.getMember(), target ); String simpleAccessExpression = "input[" + context.getStringStore().var(memberName) + "]" + memberAssertionComponent; boolean isSimpleAccessExpression = Objects.equals(simpleAccessExpression, queryValue); writer.addImportSubmodule( "expectNonNull", "__expectNonNull", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); if (isSimpleAccessExpression) { String value = isRequired ? "__expectNonNull($L, `" + memberName + "`)" : "$L"; // simple undefined check writer.write( "[$L]: [," + value + idempotencyComponent + "],", context.getStringStore().var(binding.getLocationName()), queryValue ); } else { if (isRequired) { // __expectNonNull is immediately invoked and not inside a function. writer.write( "[$L]: [__expectNonNull(input.$L, `$L`) != null, () => $L],", context.getStringStore().var(binding.getLocationName()), memberName, memberName, queryValue // no idempotency token default for required members ); } else { // undefined check with lazy eval writer.write( "[$L]: [() => input.$L !== void 0, () => ($L)$L],", context.getStringStore().var(binding.getLocationName()), memberName, queryValue, idempotencyComponent ); } } } private void flushHeadersBuffer(TypeScriptWriter writer) { for (Map.Entry entry : headerBuffer.entrySet()) { writer.write(entry.getValue()); } headerBuffer.clear(); } private void writeRequestHeaders( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex ) { TypeScriptWriter writer = context.getWriter(); List headers = bindingIndex.getRequestBindings(operation, Location.HEADER); List prefixHeaders = bindingIndex.getRequestBindings(operation, Location.PREFIX_HEADERS); boolean inputPresent = operation.getInput().isPresent(); int normalHeaderCount = headers.size(); int prefixHeaderCount = prefixHeaders.size(); String opening; String closing; if (normalHeaderCount + prefixHeaderCount == 0) { opening = "const headers: any = {"; closing = "};"; } else { writer.addImportSubmodule( "isSerializableHeaderValue", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); opening = normalHeaderCount > 0 ? "const headers: any = map({}, isSerializableHeaderValue, {" : "const headers: any = map({"; closing = "});"; } // Headers are always present either from the default document or the payload. writer.write(opening); writer.indent(); // Only set the content type if one can be determined. writeContentTypeHeader(context, operation, true); writeDefaultInputHeaders(context, operation); if (inputPresent) { // Handle assembling prefix headers. for (HttpBinding binding : prefixHeaders) { writePrefixHeaders(context, binding); } } if (inputPresent) { for (HttpBinding binding : headers) { writeNormalHeader(context, binding); } } flushHeadersBuffer(writer); writer.dedent(); writer.write(closing); } private void writeNormalHeader(GenerationContext context, HttpBinding binding) { String memberLocation = "input[" + context.getStringStore().var(context.getSymbolProvider().toMemberName(binding.getMember())) + "]"; Shape target = context.getModel().expectShape(binding.getMember().getTarget()); String headerKey = binding.getLocationName().toLowerCase(Locale.US); String headerValue = getInputValue( context, binding.getLocation(), memberLocation + "!", binding.getMember(), target ); boolean headerAssertion = headerValue.endsWith("!"); String headerBaseValue = (headerAssertion ? headerValue.substring(0, headerValue.length() - 1) : headerValue); boolean isIdempotencyToken = binding.getMember().hasTrait(IdempotencyTokenTrait.class); if (!Objects.equals(memberLocation + "!", headerValue)) { String defaultValue = ""; if (headerBuffer.containsKey(headerKey)) { String s = headerBuffer.get(headerKey); defaultValue = " || " + s.substring(s.indexOf(": ") + 2, s.length() - 1); } else if (isIdempotencyToken) { context.getWriter() .addImportSubmodule( "v4", "generateIdempotencyToken", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); defaultValue = " ?? generateIdempotencyToken()"; } String headerValueExpression = headerAssertion && !defaultValue.isEmpty() ? headerBaseValue + defaultValue : headerValue + defaultValue; // evaluated value has a function or method call attached context.getWriter() .addImportSubmodule( "isSerializableHeaderValue", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); headerBuffer.put( headerKey, String.format( "[%s]: [() => isSerializableHeaderValue(%s), () => %s],", context.getStringStore().var(headerKey), memberLocation + defaultValue, headerValueExpression ) ); } else { String constructedHeaderValue = (headerAssertion ? headerBaseValue : headerValue); if (headerBuffer.containsKey(headerKey)) { String s = headerBuffer.get(headerKey); constructedHeaderValue += " || " + s.substring(s.indexOf(": ") + 2, s.length() - 1); } else if (isIdempotencyToken) { context.getWriter() .addImportSubmodule( "v4", "generateIdempotencyToken", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); constructedHeaderValue += " ?? generateIdempotencyToken()"; } else { constructedHeaderValue = headerValue; } headerBuffer.put( headerKey, String.format("[%s]: %s,", context.getStringStore().var(headerKey), constructedHeaderValue) ); } } private void writePrefixHeaders(GenerationContext context, HttpBinding binding) { Model model = context.getModel(); TypeScriptWriter writer = context.getWriter(); String memberLocation = "input." + context.getSymbolProvider().toMemberName(binding.getMember()); MapShape prefixMap = model.expectShape(binding.getMember().getTarget()).asMapShape().get(); Shape target = model.expectShape(prefixMap.getValue().getTarget()); // Iterate through each entry in the member. writer.openBlock("...($1L !== undefined) && Object.keys($1L).reduce(", "),", memberLocation, () -> { writer.openBlock("(acc: any, suffix: string) => {", "}, {}", () -> { // Use a ! since we already validated the input member is defined above. String headerValue = getInputValue( context, binding.getLocation(), memberLocation + "![suffix]", binding.getMember(), target ); // Append the prefix to key. writer.write( "acc[`$L$${suffix.toLowerCase()}`] = $L;", binding.getLocationName().toLowerCase(Locale.US), headerValue ); writer.write("return acc;"); }); }); } private void writeResponseHeaders( GenerationContext context, Shape operationOrError, HttpBindingIndex bindingIndex, Runnable injectExtraHeaders ) { TypeScriptWriter writer = context.getWriter(); // Headers are always present either from the default document or the payload. writer.addImportSubmodule( "isSerializableHeaderValue", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.openBlock("let headers: any = map({}, isSerializableHeaderValue, {", "});", () -> { writeContentTypeHeader(context, operationOrError, false); injectExtraHeaders.run(); // Handle assembling prefix headers. for (HttpBinding binding : bindingIndex.getResponseBindings(operationOrError, Location.PREFIX_HEADERS)) { writePrefixHeaders(context, binding); } for (HttpBinding binding : bindingIndex.getResponseBindings(operationOrError, Location.HEADER)) { writeNormalHeader(context, binding); } flushHeadersBuffer(writer); }); } private void writeContentTypeHeader(GenerationContext context, Shape operationOrError, boolean isInput) { HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); Optional optionalContentType; if (isInput) { optionalContentType = bindingIndex.determineRequestContentType(operationOrError, getDocumentContentType()); } else { optionalContentType = bindingIndex.determineResponseContentType(operationOrError, getDocumentContentType()); } // If we need to write a default body then it needs a content type. if (optionalContentType.isEmpty() && shouldWriteDefaultBody(context, operationOrError, isInput)) { optionalContentType = Optional.of(getDocumentContentType()); } optionalContentType.ifPresent(contentType -> { // context.getWriter().write("'content-type': $S,", contentType) headerBuffer.put("content-type", "'content-type': '" + contentType + "',"); }); } private List writeRequestBody( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex ) { List payloadBindings = bindingIndex.getRequestBindings(operation, Location.PAYLOAD); List documentBindings = bindingIndex.getRequestBindings(operation, Location.DOCUMENT); boolean shouldWriteDefaultBody = shouldWriteDefaultInputBody(context, operation); return writeBody(context, operation, payloadBindings, documentBindings, shouldWriteDefaultBody, true); } private List writeResponseBody( GenerationContext context, Shape operationOrError, HttpBindingIndex bindingIndex ) { // We just make one up here since it's not actually used by consumers. List payloadBindings = bindingIndex.getResponseBindings(operationOrError, Location.PAYLOAD); List documentBindings = bindingIndex.getResponseBindings(operationOrError, Location.DOCUMENT); boolean shouldWriteDefaultBody = operationOrError .asOperationShape() .map(operation -> shouldWriteDefaultOutputBody(context, operation)) .orElseGet(() -> shouldWriteDefaultErrorBody(context, operationOrError.asStructureShape().get())); return writeBody(context, operationOrError, payloadBindings, documentBindings, shouldWriteDefaultBody, false); } private boolean shouldWriteDefaultBody(GenerationContext context, Shape operationOrError, boolean isInput) { if (isInput) { return shouldWriteDefaultInputBody(context, operationOrError.asOperationShape().get()); } else if (operationOrError.isOperationShape()) { return shouldWriteDefaultOutputBody(context, operationOrError.asOperationShape().get()); } else { return shouldWriteDefaultErrorBody(context, operationOrError.asStructureShape().get()); } } /** * Given a context and operation, should a default input body be written. By default, a body * will be written if and only if there are payload members bound to the input. * * @param context The generation context. * @param operation The operation whose input is being serialized. * * @return True if a default body should be generated. */ protected boolean shouldWriteDefaultInputBody(GenerationContext context, OperationShape operation) { return HttpBindingIndex.of(context.getModel()).hasRequestBody(operation); } /** * Given a context and operation, should a default output body be written. By default no body will be written * if there are no members bound to the output. * * @param context The generation context. * @param operation The operation whose output is being serialized. * * @return True if a default body should be generated. */ protected boolean shouldWriteDefaultOutputBody(GenerationContext context, OperationShape operation) { return HttpBindingIndex.of(context.getModel()).getResponseBindings(operation).isEmpty(); } /** * Given a context and error, should a default body be written. By default no body will be written * if there are no members bound to the error. * * @param context The generation context. * @param error The error being serialized. * * @return True if a default body should be generated. */ protected boolean shouldWriteDefaultErrorBody(GenerationContext context, StructureShape error) { return HttpBindingIndex.of(context.getModel()).getResponseBindings(error).isEmpty(); } private List writeBody( GenerationContext context, Shape operationOrError, List payloadBindings, List documentBindings, boolean shouldWriteDefaultBody, boolean isInput ) { TypeScriptWriter writer = context.getWriter(); // Write the default `body` property. writer.write("let body: any;"); // Handle a payload binding explicitly. if (!payloadBindings.isEmpty()) { // There can only be one payload binding. HttpBinding payloadBinding = payloadBindings.get(0); if (isInput) { serializeInputPayload(context, operationOrError.asOperationShape().get(), payloadBinding); } else if (operationOrError.isOperationShape()) { serializeOutputPayload(context, operationOrError.asOperationShape().get(), payloadBinding); } else { serializeErrorPayload(context, operationOrError.asStructureShape().get(), payloadBinding); } return payloadBindings; } // If we have document bindings or need a defaulted request body, // use the input document serialization. if (!documentBindings.isEmpty() || shouldWriteDefaultBody) { documentBindings.sort(Comparator.comparing(HttpBinding::getMemberName)); if (isInput) { serializeInputDocumentBody(context, operationOrError.asOperationShape().get(), documentBindings); } else if (operationOrError.isOperationShape()) { serializeOutputDocumentBody(context, operationOrError.asOperationShape().get(), documentBindings); } else { serializeErrorDocumentBody(context, operationOrError.asStructureShape().get(), documentBindings); } return documentBindings; } // Otherwise, we have no bindings to add shapes from. return ListUtils.of(); } /** * Given context and a source of data, generate an input value provider for the * shape. This may use native types (like getting Date formats for timestamps,) * converters (like a base64Encoder,) or invoke complex type serializers to * manipulate the dataSource into the proper input content. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param member The member that points to the value being provided. * @param target The shape of the value being provided. * @return Returns a value or expression of the input value. */ protected String getInputValue( GenerationContext context, Location bindingType, String dataSource, MemberShape member, Shape target ) { if (target instanceof StringShape) { return getStringInputParam(context, bindingType, dataSource, target); } else if (target instanceof FloatShape || target instanceof DoubleShape) { // Handle decimal numbers needing to have .0 in their value when whole numbers. return "((" + dataSource + " % 1 == 0) ? " + dataSource + " + \".0\" : " + dataSource + ".toString())"; } else if (target instanceof BooleanShape || target instanceof NumberShape) { return dataSource + ".toString()"; } else if (target instanceof TimestampShape) { return getTimestampInputParam(context, bindingType, dataSource, member); } else if (target instanceof DocumentShape) { return dataSource; } else if (target instanceof BlobShape) { return getBlobInputParam(bindingType, dataSource); } else if (target instanceof CollectionShape) { return getCollectionInputParam(context, bindingType, dataSource, (CollectionShape) target); } else if (target instanceof StructureShape || target instanceof UnionShape) { return getNamedMembersInputParam(context, bindingType, dataSource, target); } else if (target instanceof MapShape) { return getMapInputParam(context, bindingType, dataSource, (MapShape) target); } throw new CodegenException( String.format( "Unsupported %s binding of %s to %s in %s using the %s protocol", bindingType, member.getMemberName(), target.getType(), member.getContainer(), getName() ) ); } /** * Given context and a source of data, generate an input value provider for the * string. By default, this base64 encodes content in headers if there is a * mediaType applied to the string, and passes through for all other cases. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the input string. */ private String getStringInputParam( GenerationContext context, Location bindingType, String dataSource, Shape target ) { String baseParam = HttpProtocolGeneratorUtils.getStringInputParam(context, target, dataSource); switch (bindingType) { case HEADER: // Encode these to base64 if a MediaType is present. if (target.hasTrait(MediaTypeTrait.ID)) { return "context.base64Encoder(Buffer.from(" + baseParam + "))"; } default: return baseParam; } } /** * Given context and a source of data, generate an input value provider for the * blob. By default, this base64 encodes content in headers and query strings, * and passes through for payloads. * * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @return Returns a value or expression of the input blob. */ private String getBlobInputParam(Location bindingType, String dataSource) { switch (bindingType) { case PAYLOAD: return dataSource; case HEADER: case QUERY: // Encode these to base64. return "context.base64Encoder(" + dataSource + ")"; default: throw new CodegenException("Unexpected blob binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an input value provider for the * collection. By default, this separates the list with commas in headers, and * relies on the HTTP implementation for query strings. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the input collection. */ private String getCollectionInputParam( GenerationContext context, Location bindingType, String dataSource, CollectionShape target ) { MemberShape targetMember = target.getMember(); Shape collectionTarget = context.getModel().expectShape(targetMember.getTarget()); // Use a basic array to serialize this more easily. if (target.isSetShape()) { dataSource = "Array.from(" + dataSource + ".values())"; } String collectionTargetValue = getInputValue(context, bindingType, "_entry", targetMember, collectionTarget); String iteratedParam; if (collectionTargetValue.equals("_entry")) { iteratedParam = "(" + dataSource + " || [])"; } else { iteratedParam = "(" + dataSource + " || []).map(_entry => " + collectionTargetValue + " as any)"; } switch (bindingType) { case HEADER: if (collectionTarget.isStringShape()) { context .getWriter() .addImportSubmodule( "quoteHeader", "__quoteHeader", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return iteratedParam + ".map(__quoteHeader).join(', ')"; } return iteratedParam + ".join(', ')"; case QUERY: case QUERY_PARAMS: return iteratedParam; default: throw new CodegenException("Unexpected collection binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an input value provider for the * shape. This redirects to a serialization function for payloads, * and fails otherwise. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the input shape. */ private String getNamedMembersInputParam( GenerationContext context, Location bindingType, String dataSource, Shape target ) { switch (bindingType) { case PAYLOAD: Symbol symbol = context.getSymbolProvider().toSymbol(target); boolean mayElideInput = SerdeElisionIndex.of(context.getModel()).mayElide(target) && (enableSerdeElision() && !context.getSettings().generateServerSdk()); if (mayElideInput) { context.getWriter() .addImportSubmodule( "_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); return "_json(" + dataSource + ")"; } return ProtocolGenerator.getSerFunctionShortName(symbol) + "(" + dataSource + ", context)"; default: throw new CodegenException("Unexpected named member shape binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an input value provider for the * map. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the input collection. */ private String getMapInputParam( GenerationContext context, Location bindingType, String dataSource, MapShape target ) { Model model = context.getModel(); MemberShape mapMember = target.getValue(); SymbolProvider symbolProvider = context.getSymbolProvider(); String valueString = getInputValue( context, bindingType, "value", mapMember, model.expectShape(mapMember.getTarget()) ); return ("Object.entries(" + dataSource + " || {}).reduce(" + "(acc: any, [key, value]: [string, " + symbolProvider.toSymbol(mapMember) + "]) => {" + "acc[key] = " + valueString + ";" + "return acc;" + "}, {})"); } /** * Given context and a source of data, generate an input value provider for the * shape. This uses the format specified, converting to strings when in a header, * label, or query string. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param member The member that points to the value being provided. * @return Returns a value or expression of the input shape. */ private String getTimestampInputParam( GenerationContext context, Location bindingType, String dataSource, MemberShape member ) { HttpBindingIndex httpIndex = HttpBindingIndex.of(context.getModel()); Format format; switch (bindingType) { case HEADER: format = httpIndex.determineTimestampFormat(member, bindingType, Format.HTTP_DATE); break; case LABEL: format = httpIndex.determineTimestampFormat(member, bindingType, getDocumentTimestampFormat()); break; case QUERY: format = httpIndex.determineTimestampFormat(member, bindingType, Format.DATE_TIME); break; default: throw new CodegenException("Unexpected named member shape binding location `" + bindingType + "`"); } String baseParam = HttpProtocolGeneratorUtils.getTimestampInputParam(context, dataSource, member, format); return baseParam + ".toString()"; } /** * Writes any additional HTTP input headers required by the protocol implementation. * *

Two parameters will be available in scope: *

    *
  • {@code input: }: the type generated for the operation's input.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

For example: * *

{@code
     *   "foo": "This is a custom header",
     * }
* * @param context The generation context. * @param operation The operation whose input is being generated. */ protected void writeDefaultInputHeaders(GenerationContext context, OperationShape operation) {} /** * Writes any additional HTTP output headers required by the protocol implementation. * *

Two parameters will be available in scope: *

    *
  • {@code input: }: the type generated for the operation's input.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

For example: * *

{@code
     *   "foo": "This is a custom header",
     * }
* * @param context The generation context. * @param operation The operation whose output is being generated. */ protected void writeDefaultOutputHeaders(GenerationContext context, OperationShape operation) {} /** * Writes any additional HTTP error headers required by the protocol implementation. * *

Two parameters will be available in scope: *

    *
  • {@code input: }: the type generated for the operation's input.
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

For example: * *

{@code
     *   "foo": "This is a custom header",
     * }
* * @param context The generation context. * @param error The error which is being generated. */ protected void writeDefaultErrorHeaders(GenerationContext context, StructureShape error) {} /** * Writes the code needed to serialize a protocol input document. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will already be defined in scope. * * Implementations MUST properly fill the body parameter even if no * document bindings are present. * *

For example: * *

{@code
     * const bodyParams: any = {};
     * if (input.barValue !== undefined) {
     *   bodyParams['barValue'] = input.barValue;
     * }
     * body = JSON.stringify(bodyParams);
     * }
* @param context The generation context. * @param operation The operation whose input is being generated. * @param documentBindings The bindings to place in the document. */ protected abstract void serializeInputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ); /** * Writes the code needed to serialize an event payload as a protocol-specific document. * *

Implementations of this method are expected to set a value to the instantiated ${@code body} variable. * The value set is expected to be a JavaScript ${@code Uint8Array} type and is to be encoded as the * event payload. * *

Three parameters will be available in scope: *

    *
  • {@code body}: The serialized event payload object that needs to be transformed to binary data
  • *
  • {@code context: SerdeContext}: a TypeScript type containing context and tools for type serde.
  • *
* *

For example: * *

{@code
     * body = context.utf8Decoder(JSON.stringify(body));
     * }
* @param context The generation context. */ protected abstract void serializeInputEventDocumentPayload(GenerationContext context); /** * Writes the code needed to serialize a protocol output document. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will already be defined in scope. * * Implementations MUST properly fill the body parameter even if no * document bindings are present. * *

For example: * *

{@code
     * const bodyParams: any = {};
     * if (input.barValue !== undefined) {
     *   bodyParams['barValue'] = input.barValue;
     * }
     * body = JSON.stringify(bodyParams);
     * }
* @param context The generation context. * @param operation The operation whose output is being generated. * @param documentBindings The bindings to place in the document. */ protected abstract void serializeOutputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ); /** * Writes the code needed to serialize a protocol error document. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will already be defined in scope. * * Implementations MUST properly fill the body parameter even if no * document bindings are present. * *

For example: * *

{@code
     * const bodyParams: any = {};
     * if (input.barValue !== undefined) {
     *   bodyParams['barValue'] = input.barValue;
     * }
     * body = JSON.stringify(bodyParams);
     * }
* @param context The generation context. * @param error The error that is being generated. * @param documentBindings The bindings to place in the document. */ protected abstract void serializeErrorDocumentBody( GenerationContext context, StructureShape error, List documentBindings ); /** * Writes the code needed to serialize the input payload of a request. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will already be defined in scope. * *

For example: * *

{@code
     * if (input.body !== undefined) {
     *   body = context.base64Encoder(input.body);
     * }
     * }
* @param context The generation context. * @param operation The operation whose input is being generated. * @param payloadBinding The payload binding to serialize. */ protected void serializeInputPayload( GenerationContext context, OperationShape operation, HttpBinding payloadBinding ) { genericSerializePayload(context, payloadBinding); } /** * Writes the code needed to serialize the output payload of a response. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the response body. * This variable will already be defined in scope. * *

For example: * *

{@code
     * if (input.body !== undefined) {
     *   body = context.base64Encoder(input.body);
     * }
     * }
* @param context The generation context. * @param operation The operation whose output is being generated. * @param payloadBinding The payload binding to serialize. */ protected void serializeOutputPayload( GenerationContext context, OperationShape operation, HttpBinding payloadBinding ) { genericSerializePayload(context, payloadBinding); } /** * Writes the code needed to serialize the error payload of a response. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the response body. * This variable will already be defined in scope. * *

For example: * *

{@code
     * if (input.body !== undefined) {
     *   body = context.base64Encoder(input.body);
     * }
     * }
* @param context The generation context. * @param error The error being generated. * @param payloadBinding The payload binding to serialize. */ protected void serializeErrorPayload(GenerationContext context, StructureShape error, HttpBinding payloadBinding) { genericSerializePayload(context, payloadBinding); } private void genericSerializePayload(GenerationContext context, HttpBinding payloadBinding) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); String memberName = symbolProvider.toMemberName(payloadBinding.getMember()); writer.openBlock("if (input.$L !== undefined) {", "}", memberName, () -> { Shape target = context.getModel().expectShape(payloadBinding.getMember().getTarget()); // Because documents can be set to a null value, handle setting that as the body // instead of using toString, as `null.toString()` will fail. if (target.isDocumentShape()) { writer.openBlock( "if (input.$L === null) {", "} else {", memberName, () -> writer.write("body = \"null\";") ); writer.indent(); } writer.write( "body = $L;", getInputValue( context, Location.PAYLOAD, "input." + memberName, payloadBinding.getMember(), target ) ); if (target.isDocumentShape()) { writer.dedent(); writer.write("}"); } }); } private void generateOperationRequestDeserializer( GenerationContext context, OperationShape operation, HttpTrait trait ) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference requestType = getApplicationProtocol().getRequestType(); Model model = context.getModel(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(model); TypeScriptWriter writer = context.getWriter(); // Ensure that the request type is imported. writer.addUseImports(requestType); writer.addTypeImport("Endpoint", "__Endpoint", TypeScriptDependency.SMITHY_TYPES); String methodName = ProtocolGenerator.getGenericDeserFunctionName(symbol) + "Request"; // Add the normalized input type. Symbol inputType = symbol.expectProperty("inputType", Symbol.class); String contextType = CodegenUtils.getOperationSerializerContextType(writer, context.getModel(), operation); writer.openBlock( "export const $L = async (\n" + " output: $T,\n" + " context: $L\n" + "): Promise<$T> => {", "};", methodName, requestType, contextType, inputType, () -> { handleContentType(context, operation, bindingIndex); handleAccept(context, operation, bindingIndex); // Start deserializing the response. writer.openBlock("const contents: any = map({", "});", () -> { readRequestHeaders(context, operation, bindingIndex, "output"); }); readQueryString(context, operation, bindingIndex); readPath(context, operation, bindingIndex, trait); readHost(context, operation); List documentBindings = readRequestBody(context, operation, bindingIndex); // Track all shapes bound to the document so their deserializers may be generated. documentBindings.forEach(binding -> { Shape target = model.expectShape(binding.getMember().getTarget()); deserializingDocumentShapes.add(target); }); writer.write("return contents;"); } ); writer.write(""); } /** * Writes out handling for the content-type header. The following rules apply: * * - The content-type header may always be omitted. * - If the input shape has a member with the httpPayload trait then the following apply: * - If the target is a shape with the mediaType trait, the value of the content-type header must * match if present. * - If the target is a blob shape without a media type, the content-type header may have any value. * - Otherwise the content-type header must match the implied content type of the target shape, e.g. * text/plain for a string. * - If the input shape has no members with the httpPayload trait, but does have members bound to * the document, the content-type header must match the default protocol document content type if * present. * - If the input shape has no members bound to the payload / document, the content-type header * must not be set. */ private void handleContentType(GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex) { // Don't enforce any restrictions on a blob bodies if they don't have a // modeled media type. There are plenty of valid reasons for wanting to // accept a range of media types in this case, like supporting multiple // image/video formats. if (bodyIsBlobWithoutMediaType(context, bindingIndex.getRequestBindings(operation).values())) { return; } TypeScriptWriter writer = context.getWriter(); writer.addImport( "UnsupportedMediaTypeException", "__UnsupportedMediaTypeException", TypeScriptDependency.SERVER_COMMON ); Optional optionalContentType = bindingIndex.determineRequestContentType( operation, getDocumentContentType() ); writer.write( "const contentTypeHeaderKey: string | undefined = Object.keys(output.headers)" + ".find(key => key.toLowerCase() === 'content-type');" ); writer.openBlock("if (contentTypeHeaderKey != null) {", "};", () -> { writer.write("const contentType = output.headers[contentTypeHeaderKey];"); if (optionalContentType.isPresent() || operation.getInput().isPresent()) { String contentType = optionalContentType.orElse(getDocumentContentType()); // If the operation accepts a content type, it must be either unset or the expected value. writer.openBlock("if (contentType !== undefined && contentType !== $S) {", "};", contentType, () -> { writer.write("throw new __UnsupportedMediaTypeException();"); }); } else { // If the operation doesn't accept a content type, it must not be set. writer.openBlock("if (contentType !== undefined) {", "};", () -> { writer.write("throw new __UnsupportedMediaTypeException();"); }); } }); } /** * Writes out handling for the accept header. The following rules apply: * * - The accept header may always be omitted. * - If the output shape has a member with the httpPayload trait then the following apply: * - If the target is a shape with the mediaType trait, the value of the accept header must * match if present. * - If the target is a blob shape without a media type, the accept header may have any value. * - Otherwise the accept header must match the implied content type of the target shape, e.g. * text/plain for a string. * - If the output shape has no members with the httpPayload trait, the accept header must match * the default protocol document content type if present. * * Note: matching is performed based on the rules in https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.2 * and any match is considered acceptable, regardless of the supplied accept-params. */ private void handleAccept(GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex) { // Don't enforce any restrictions on a blob bodies if they don't have a // modeled media type. There are plenty of valid reasons for wanting to // accept a range of media types in this case, like supporting multiple // image/video formats. if (bodyIsBlobWithoutMediaType(context, bindingIndex.getResponseBindings(operation).values())) { return; } TypeScriptWriter writer = context.getWriter(); Optional optionalContentType = bindingIndex.determineResponseContentType( operation, getDocumentContentType() ); writer.addImport("NotAcceptableException", "__NotAcceptableException", TypeScriptDependency.SERVER_COMMON); writer.addImport("acceptMatches", "__acceptMatches", TypeScriptDependency.SERVER_COMMON); writer.write( "const acceptHeaderKey: string | undefined = Object.keys(output.headers)" + ".find(key => key.toLowerCase() === 'accept');" ); writer.openBlock("if (acceptHeaderKey != null) {", "};", () -> { writer.write("const accept = output.headers[acceptHeaderKey];"); String contentType = optionalContentType.orElse(getDocumentContentType()); // Validate that the content type matches the protocol default, or what's modeled if there's // a modeled type. writer.openBlock( "if (!__acceptMatches(accept, $S)) {", "};", contentType, () -> writer.write("throw new __NotAcceptableException();") ); }); } private boolean bodyIsBlobWithoutMediaType(GenerationContext context, Collection bindings) { for (HttpBinding binding : bindings) { if (binding.getLocation() == Location.PAYLOAD) { Shape target = context.getModel().expectShape(binding.getMember().getTarget()); return !target.hasTrait(MediaTypeTrait.class) && target.isBlobShape(); } } return false; } private void readQueryString(GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex) { TypeScriptWriter writer = context.getWriter(); List directQueryBindings = bindingIndex.getRequestBindings(operation, Location.QUERY); List mappedQueryBindings = bindingIndex.getRequestBindings(operation, Location.QUERY_PARAMS); if (directQueryBindings.isEmpty() && mappedQueryBindings.isEmpty()) { return; } writer.write("const query = output.query"); writer.openBlock("if (query != null) {", "}", () -> { readDirectQueryBindings(context, directQueryBindings); if (!mappedQueryBindings.isEmpty()) { // There can only ever be one of these bindings on a given operation. readMappedQueryBindings(context, mappedQueryBindings.get(0)); } }); } private void readDirectQueryBindings(GenerationContext context, List directQueryBindings) { TypeScriptWriter writer = context.getWriter(); for (HttpBinding binding : directQueryBindings) { String memberName = context.getSymbolProvider().toMemberName(binding.getMember()); writer.openBlock("if (query[$S] !== undefined) {", "}", binding.getLocationName(), () -> { Shape target = context.getModel().expectShape(binding.getMember().getTarget()); if (target instanceof CollectionShape) { writer.write( "const queryValue = Array.isArray(query[$1S]) ? (query[$1S] as string[])" + " : [query[$1S] as string];", binding.getLocationName() ); } else { writer.addImport( "SerializationException", "__SerializationException", TypeScriptDependency.SERVER_COMMON ); writer.write("let queryValue: string;"); writer.openBlock("if (Array.isArray(query[$S])) {", "}", binding.getLocationName(), () -> { writer.openBlock("if (query[$S].length === 1) {", "}", binding.getLocationName(), () -> { writer.write("queryValue = query[$S][0];", binding.getLocationName()); }); writer.openBlock("else {", "}", () -> { writer.write("throw new __SerializationException();"); }); }); writer.openBlock("else {", "}", () -> { writer.write("queryValue = query[$S] as string;", binding.getLocationName()); }); } String queryValue = getOutputValue( context, binding.getLocation(), "queryValue", binding.getMember(), target ); writer.write("contents.$L = $L;", memberName, queryValue); }); } } private void readMappedQueryBindings(GenerationContext context, HttpBinding mappedBinding) { TypeScriptWriter writer = context.getWriter(); MapShape target = context.getModel().expectShape(mappedBinding.getMember().getTarget()).asMapShape().get(); Shape valueShape = context.getModel().expectShape(target.getValue().getTarget()); String valueType = "string"; if (valueShape instanceof CollectionShape) { valueType = "string[]"; } writer.write("let parsedQuery: Record = {}", valueType); writer.openBlock("for (const [key, value] of Object.entries(query)) {", "}", () -> { writer.write("let queryValue: string;"); final String parsedValue; if (valueShape instanceof CollectionShape) { writer.write("const valueArray = Array.isArray(value) ? (value as string[]) : [value as string];"); parsedValue = getOutputValue( context, mappedBinding.getLocation(), "valueArray", target.getValue(), valueShape ); } else { writer.addImport( "SerializationException", "__SerializationException", TypeScriptDependency.SERVER_COMMON ); writer.openBlock("if (Array.isArray(value)) {", "}", () -> { writer.openBlock("if (value.length === 1) {", "}", () -> { writer.write("queryValue = value[0];"); }); writer.openBlock("else {", "}", () -> { writer.write("throw new __SerializationException();"); }); }); writer.openBlock("else {", "}", () -> { writer.write("queryValue = value as string;"); }); parsedValue = getOutputValue( context, mappedBinding.getLocation(), "queryValue", target.getValue(), valueShape ); } writer.write("parsedQuery[key] = $L;", parsedValue); }); String memberName = context.getSymbolProvider().toMemberName(mappedBinding.getMember()); writer.write("contents.$L = parsedQuery;", memberName); } private void readPath( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex, HttpTrait trait ) { TypeScriptWriter writer = context.getWriter(); List pathBindings = bindingIndex.getRequestBindings(operation, Location.LABEL); if (pathBindings.isEmpty()) { return; } StringBuilder pathRegexBuilder = new StringBuilder(); for (Segment segment : trait.getUri().getSegments()) { pathRegexBuilder.append("/"); if (segment.isLabel()) { // Create a named capture group for the segment so we can grab it later without regard to order. pathRegexBuilder.append(String.format("(?<%s>", segment.getContent())); if (segment.isGreedyLabel()) { pathRegexBuilder.append(".+"); } else { pathRegexBuilder.append("[^/]+"); } pathRegexBuilder.append(")"); } else { segment .getContent() .chars() .forEach(c -> { if (REGEX_CHARS.contains((char) c)) { pathRegexBuilder.append('\\'); } pathRegexBuilder.append((char) c); }); } } writer.write("const pathRegex = new RegExp($S);", pathRegexBuilder.toString()); writer.write("const parsedPath = output.path.match(pathRegex);"); writer.openBlock("if (parsedPath?.groups !== undefined) {", "}", () -> { for (HttpBinding binding : pathBindings) { Shape target = context.getModel().expectShape(binding.getMember().getTarget()); String memberName = context.getSymbolProvider().toMemberName(binding.getMember()); // since this is in the path, we should decode early String dataSource = String.format( "decodeURIComponent(parsedPath.groups.%s)", binding.getLocationName() ); String labelValue = getOutputValue( context, binding.getLocation(), dataSource, binding.getMember(), target ); writer.write("contents.$L = $L;", memberName, labelValue); } }); } private void readHost(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); if (!operation.hasTrait(EndpointTrait.class)) { return; } EndpointTrait endpointTrait = operation.expectTrait(EndpointTrait.class); if (endpointTrait.getHostPrefix().getLabels().isEmpty()) { return; } // Anchor to the beginning since we're looking at the host's prefix StringBuilder endpointRegexBuilder = new StringBuilder("^"); for (Segment segment : endpointTrait.getHostPrefix().getSegments()) { if (segment.isLabel()) { // Create a named capture group for the segment so we can grab it later without regard to order. endpointRegexBuilder.append(String.format("(?<%s>.*)", segment.getContent())); } else { endpointRegexBuilder.append(segment.getContent().replace(".", "\\.")); } } writer.write("const hostRegex = new RegExp($S);", endpointRegexBuilder.toString()); writer.write("const parsedHost = output.path.match(hostRegex);"); Shape input = context.getModel().expectShape(operation.getInput().get()); writer.openBlock("if (parsedHost?.groups !== undefined) {", "}", () -> { for (MemberShape member : input.members()) { if (member.hasTrait(HostLabelTrait.class)) { Shape target = context.getModel().expectShape(member.getTarget()); String memberName = context.getSymbolProvider().toMemberName(member); String labelValue = getOutputValue( context, Location.LABEL, "parsedHost.groups." + member.getMemberName(), member, target ); writer.write("contents.$L = $L;", memberName, labelValue); } } }); } private void generateOperationResponseDeserializer( GenerationContext context, OperationShape operation, HttpTrait trait ) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference responseType = getApplicationProtocol().getResponseType(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); Model model = context.getModel(); TypeScriptWriter writer = context.getWriter(); // Ensure that the response type is imported. writer.addUseImports(responseType); // e.g., deserializeAws_restJson1_1ExecuteStatement String methodName = ProtocolGenerator.getDeserFunctionShortName(symbol); String methodLongName = ProtocolGenerator.getDeserFunctionName(symbol, getName()); String errorMethodName = "de_CommandError"; // Add the normalized output type. Symbol outputType = symbol.expectProperty("outputType", Symbol.class); String contextType = CodegenUtils.getOperationDeserializerContextType( context.getSettings(), writer, context.getModel(), operation ); // Handle the general response. writer.writeDocs(methodLongName); writer.openBlock( "export const $L = async (\n" + " output: $T,\n" + " context: $L\n" + "): Promise<$T> => {", "};", methodName, responseType, contextType, outputType, () -> { // Redirect error deserialization to the dispatcher if we receive an error range // status code that's not the modeled code (300 or higher). This allows for // returning other 2XX codes that don't match the defined value. writer.openBlock( "if (output.statusCode !== $L && output.statusCode >= 300) {", "}", trait.getCode(), () -> writer.write("return $L(output, context);", errorMethodName) ); // Start deserializing the response. writer.openBlock("const contents: any = map({", "});", () -> { writer.write("$$metadata: deserializeMetadata(output),"); readResponseHeaders(context, operation, bindingIndex, "output"); }); List documentBindings = readResponseBody(context, operation, bindingIndex); // Track all shapes bound to the document so their deserializers may be generated. documentBindings.forEach(binding -> { Shape target = model.expectShape(binding.getMember().getTarget()); if (!EventStreamGenerator.isEventStreamShape(target)) { deserializingDocumentShapes.add(target); } }); writer.write("return contents;"); } ); writer.write(""); } private void generateErrorDeserializer(GenerationContext context, StructureShape error) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); HttpBindingIndex bindingIndex = HttpBindingIndex.of(context.getModel()); Model model = context.getModel(); Symbol errorSymbol = symbolProvider.toSymbol(error); String errorDeserMethodName = ProtocolGenerator.getDeserFunctionShortName(errorSymbol) + "Res"; String errorDeserMethodLongName = ProtocolGenerator.getDeserFunctionName(errorSymbol, context.getProtocolName()) + "Res"; String outputName = isErrorCodeInBody ? "parsedOutput" : "output"; writer.writeDocs(errorDeserMethodLongName); writer.openBlock( "const $L = async (\n" + " $L: any,\n" + " context: __SerdeContext\n" + "): Promise<$T> => {", "};", errorDeserMethodName, outputName, errorSymbol, () -> { writer.openBlock("const contents: any = map({", "});", () -> { readResponseHeaders(context, error, bindingIndex, outputName); }); List documentBindings = readErrorResponseBody(context, error, bindingIndex); // Track all shapes bound to the document so their deserializers may be generated. documentBindings.forEach(binding -> { Shape target = model.expectShape(binding.getMember().getTarget()); deserializingDocumentShapes.add(target); }); // todo: unsupported ssdk feature. String serverSdkInfix = context.getSettings().generateServerSdk() ? ": any /* $metadata unsupported on ssdk error */" : ""; Symbol materializedErrorSymbol = errorSymbol.toBuilder().putProperty("typeOnly", false).build(); writer.openBlock( "const exception$L = new $T({", "});", serverSdkInfix, materializedErrorSymbol, () -> { writer.write("$$metadata: deserializeMetadata($L),", outputName); writer.write("...contents"); } ); String errorLocation = this.getErrorBodyLocation(context, outputName + ".body"); writer.addImportSubmodule( "decorateServiceException", "__decorateServiceException", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("return __decorateServiceException(exception, $L);", errorLocation); } ); writer.write(""); } private List readErrorResponseBody( GenerationContext context, Shape error, HttpBindingIndex bindingIndex ) { TypeScriptWriter writer = context.getWriter(); if (isErrorCodeInBody) { // Body is already parsed in the error dispatcher, simply assign the body. writer.write("const data: any = $L;", getErrorBodyLocation(context, "parsedOutput.body")); List responseBindings = bindingIndex.getResponseBindings(error, Location.DOCUMENT); responseBindings.sort(Comparator.comparing(HttpBinding::getMemberName)); deserializeErrorDocumentBody(context, error.asStructureShape().get(), responseBindings); return responseBindings; } else { // Deserialize response body just like in a normal response. return readResponseBody(context, error, bindingIndex); } } private void readResponseHeaders( GenerationContext context, Shape operationOrError, HttpBindingIndex bindingIndex, String outputName ) { List headerBindings = bindingIndex.getResponseBindings(operationOrError, Location.HEADER); readNormalHeaders(context, headerBindings, outputName); List prefixHeaderBindings = bindingIndex.getResponseBindings( operationOrError, Location.PREFIX_HEADERS ); readPrefixHeaders(context, prefixHeaderBindings, outputName); } private void readRequestHeaders( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex, String outputName ) { List headerBindings = bindingIndex.getRequestBindings(operation, Location.HEADER); readNormalHeaders(context, headerBindings, outputName); List prefixHeaderBindings = bindingIndex.getRequestBindings(operation, Location.PREFIX_HEADERS); readPrefixHeaders(context, prefixHeaderBindings, outputName); } /** * Reads headers that are 1-1 mapped to members via the @httpHeader trait. * * @param context the generation context. * @param headerBindings a collection of header bindings. * @param outputName the name of the output variable to read from. */ private void readNormalHeaders( GenerationContext context, Collection headerBindings, String outputName ) { for (HttpBinding binding : headerBindings) { TypeScriptWriter writer = context.getWriter(); String memberName = context.getSymbolProvider().toMemberName(binding.getMember()); String headerName = binding.getLocationName().toLowerCase(Locale.US); Shape target = context.getModel().expectShape(binding.getMember().getTarget()); String headerValue = getOutputValue( context, binding.getLocation(), outputName + ".headers[" + context.getStringStore().var(headerName) + "]", binding.getMember(), target ); String checkedValue = outputName + ".headers[" + context.getStringStore().var(headerName) + "]"; if (checkedValue.equals(headerValue)) { writer.write("[$L]: [, $L],", context.getStringStore().var(memberName), headerValue); } else { writer.write( "[$L]: [() => void 0 !== $L, () => $L],", context.getStringStore().var(memberName), checkedValue, headerValue ); } } } /** * Reads headers are bound by the @httpPrefixHeaders trait. * * @param context the generation context. * @param prefixHeaderBindings a collection of prefix header bindings. * @param outputName the name of the output variable to read from. */ private void readPrefixHeaders( GenerationContext context, Collection prefixHeaderBindings, String outputName ) { if (prefixHeaderBindings.isEmpty()) { return; } Model model = context.getModel(); SymbolProvider symbolProvider = context.getSymbolProvider(); TypeScriptWriter writer = context.getWriter(); // Run through the headers one time, matching any prefix groups. for (HttpBinding binding : prefixHeaderBindings) { // Prepare a grab bag for these headers if necessary String memberName = symbolProvider.toMemberName(binding.getMember()); writer.openBlock("$L: [, ", "],", memberName, () -> { String headerLocation = binding.getLocationName().toLowerCase(Locale.US); writer.write( "Object.keys($L.headers).filter(header => header.startsWith('$L'))", outputName, headerLocation ); writer .indent() .openBlock(".reduce((acc, header) => {", "}, {} as any)", () -> { MapShape prefixMap = model.expectShape(binding.getMember().getTarget()).asMapShape().get(); Shape target = model.expectShape(prefixMap.getValue().getTarget()); String headerValue = getOutputValue( context, binding.getLocation(), outputName + ".headers[header]", binding.getMember(), target ); writer.write("acc[header.substring($L)] = $L;", headerLocation.length(), headerValue); writer.write("return acc;"); }); }); } } private List readRequestBody( GenerationContext context, OperationShape operation, HttpBindingIndex bindingIndex ) { List documentBindings = bindingIndex.getRequestBindings(operation, Location.DOCUMENT); documentBindings.sort(Comparator.comparing(HttpBinding::getMemberName)); List payloadBindings = bindingIndex.getRequestBindings(operation, Location.PAYLOAD); return readBody(context, operation, documentBindings, payloadBindings, Collections.emptyList(), false); } private List readResponseBody( GenerationContext context, Shape operationOrError, HttpBindingIndex bindingIndex ) { List documentBindings = bindingIndex.getResponseBindings(operationOrError, Location.DOCUMENT); documentBindings.sort(Comparator.comparing(HttpBinding::getMemberName)); List payloadBindings = bindingIndex.getResponseBindings(operationOrError, Location.PAYLOAD); List responseCodeBindings = bindingIndex.getResponseBindings( operationOrError, Location.RESPONSE_CODE ); return readBody(context, operationOrError, documentBindings, payloadBindings, responseCodeBindings, true); } private List readBody( GenerationContext context, Shape operationOrError, List documentBindings, List payloadBindings, List responseCodeBindings, boolean isInput ) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); if (!documentBindings.isEmpty()) { // If the response has document bindings, the body can be parsed to a JavaScript object. writer.addImportSubmodule( "expectObject", "__expectObject", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.addImportSubmodule( "expectNonNull", "__expectNonNull", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); String bodyLocation = "(__expectObject(await parseBody(output.body, context)))"; // Use the protocol specific error location for retrieving contents. if (operationOrError instanceof StructureShape) { bodyLocation = getErrorBodyLocation(context, bodyLocation); } writer.write("const data: Record = __expectNonNull($L, $S);", bodyLocation, "body"); if (isInput) { deserializeInputDocumentBody(context, operationOrError.asOperationShape().get(), documentBindings); } else if (operationOrError.isOperationShape()) { deserializeOutputDocumentBody(context, operationOrError.asOperationShape().get(), documentBindings); } else { deserializeErrorDocumentBody(context, operationOrError.asStructureShape().get(), documentBindings); } } if (!payloadBindings.isEmpty()) { HttpBinding payloadBinding = payloadBindings.get(0); if (isInput) { deserializeInputPayload(context, operationOrError.asOperationShape().get(), payloadBinding); } else if (operationOrError.isOperationShape()) { deserializeOutputPayload(context, operationOrError.asOperationShape().get(), payloadBinding); } else { deserializeErrorPayload(context, operationOrError.asStructureShape().get(), payloadBinding); } if (payloadBinding != null) { documentBindings = ListUtils.of(payloadBinding); } } // Handle any potential httpResponseCode binding overrides if the field // isn't set in the body. // These are only relevant when a payload is not present, as it cannot // coexist with a payload. if (!responseCodeBindings.isEmpty()) { writer.openBlock("map(contents, {", "});", () -> { for (HttpBinding responseCodeBinding : responseCodeBindings) { // The name of the member to get from the input shape. String memberName = symbolProvider.toMemberName(responseCodeBinding.getMember()); writer.write("$L: [, output.statusCode]", memberName); } }); } if (!documentBindings.isEmpty()) { return documentBindings; } // If there are no payload or document bindings, the body still needs to be // collected so the process can exit. writer.write("await collectBody(output.body, context);"); return ListUtils.of(); } private HttpBinding readPayload(GenerationContext context, HttpBinding binding) { TypeScriptWriter writer = context.getWriter(); boolean isClientSdk = context.getSettings().generateClient(); // There can only be one payload binding. Shape target = context.getModel().expectShape(binding.getMember().getTarget()); boolean isStreaming = target.hasTrait(StreamingTrait.class); // Handle streaming shapes differently. if (isStreaming) { writer.write("const data: any = output.body;"); // If payload is streaming blob, return low-level stream with the stream utility functions mixin. if (isClientSdk && target instanceof BlobShape) { writer.write("context.sdkStreamMixin(data);"); } } else if (target instanceof BlobShape) { // If payload is non-streaming Blob, only need to collect stream to binary data (Uint8Array). writer.write("const data: any = await collectBody(output.body, context);"); } else if (target instanceof StructureShape) { // If payload is a Structure, then we need to parse the string into JavaScript object. writer.addImportSubmodule( "expectObject", "__expectObject", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write( "const data: Record | undefined " + "= __expectObject(await parseBody(output.body, context));" ); } else if (target instanceof UnionShape) { // If payload is a Union, then we need to parse the string into JavaScript object. writer.write("const data: Record | undefined " + "= await parseBody(output.body, context);"); } else if (target instanceof StringShape || target instanceof DocumentShape) { // If payload is String or Document, we need to collect body and convert binary to string. writer.write("const data: any = await collectBodyString(output.body, context);"); } else { throw new CodegenException(String.format("Unexpected shape type bound to payload: `%s`", target.getType())); } if (!isStreaming && target instanceof UnionShape) { writer.openBlock("if (Object.keys(data ?? {}).length) {", "}", () -> { importUnionDeserializer(writer); writer.write( "contents.$L = __expectUnion($L);", binding.getMemberName(), getOutputValue(context, Location.PAYLOAD, "data", binding.getMember(), target) ); }); } else { writer.write( "contents.$L = $L;", binding.getMemberName(), getOutputValue(context, Location.PAYLOAD, "data", binding.getMember(), target) ); } return binding; } protected void importUnionDeserializer(TypeScriptWriter writer) { writer.addImportSubmodule( "expectUnion", "__expectUnion", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); } /** * Writes the code needed to deserialize the input payload of a request. * *

Implementations of this method are expected to set a value to the * bound member name of the {@code contents} variable after deserializing * the response body. This variable will already be defined in scope. * * @param context The generation context. * @param operation The operation whose input payload is being deserialized. * @param binding The payload binding to deserialize. * @return The deserialized payload binding. */ protected HttpBinding deserializeInputPayload( GenerationContext context, OperationShape operation, HttpBinding binding ) { return readPayload(context, binding); } /** * Writes the code needed to deserialize the output payload of a response. * *

Implementations of this method are expected to set a value to the * bound member name of the {@code contents} variable after deserializing * the response body. This variable will already be defined in scope. * * @param context The generation context. * @param operation The operation whose output payload is being deserialized. * @param binding The payload binding to deserialize. * @return The deserialized payload binding. */ protected HttpBinding deserializeOutputPayload( GenerationContext context, OperationShape operation, HttpBinding binding ) { return readPayload(context, binding); } /** * Writes the code needed to deserialize the error payload of a response. * *

Implementations of this method are expected to set a value to the * bound member name of the {@code contents} variable after deserializing * the response body. This variable will already be defined in scope. * * @param context The generation context. * @param error The error whose payload is being deserialized. * @param binding The payload binding to deserialize. * @return The deserialized payload binding. */ protected HttpBinding deserializeErrorPayload( GenerationContext context, StructureShape error, HttpBinding binding ) { return readPayload(context, binding); } /** * Given context and a source of data, generate an output value provider for the * shape. This may use native types (like generating a Date for timestamps,) * converters (like a base64Decoder,) or invoke complex type deserializers to * manipulate the dataSource into the proper output content. * * @param context The generation context. * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param member The member that points to the value being provided. * @param target The shape of the value being provided. * @return Returns a value or expression of the output value. */ private String getOutputValue( GenerationContext context, Location bindingType, String dataSource, MemberShape member, Shape target ) { if (target instanceof NumberShape) { return getNumberOutputParam(context, bindingType, dataSource, target); } else if (target instanceof BooleanShape) { return getBooleanOutputParam(context, bindingType, dataSource); } else if (target instanceof StringShape) { return getStringOutputParam(context, bindingType, dataSource, target); } else if (target instanceof DocumentShape) { return dataSource; } else if (target instanceof TimestampShape) { HttpBindingIndex httpIndex = HttpBindingIndex.of(context.getModel()); Format format = httpIndex.determineTimestampFormat(member, bindingType, getDocumentTimestampFormat()); return HttpProtocolGeneratorUtils.getTimestampOutputParam( context.getWriter(), dataSource, bindingType, member, format, requiresNumericEpochSecondsInPayload(), context.getSettings().generateClient() ); } else if (target instanceof BlobShape) { return getBlobOutputParam(bindingType, dataSource); } else if (target instanceof CollectionShape) { return getCollectionOutputParam(context, bindingType, dataSource, (CollectionShape) target); } else if (target instanceof StructureShape || target instanceof UnionShape) { return getNamedMembersOutputParam(context, bindingType, dataSource, target); } throw new CodegenException( String.format( "Unsupported %s binding of %s to %s in %s using the %s protocol", bindingType, member.getMemberName(), target.getType(), member.getContainer(), getName() ) ); } /** * Given context and a source of data, generate an output value provider for the * boolean. By default, this checks strict equality to 'true' in headers and passes * through for documents. * * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @return Returns a value or expression of the output boolean. */ private String getBooleanOutputParam(GenerationContext context, Location bindingType, String dataSource) { switch (bindingType) { case QUERY: case LABEL: case HEADER: context.getWriter() .addImportSubmodule( "parseBoolean", "__parseBoolean", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return String.format("__parseBoolean(%s)", dataSource); default: throw new CodegenException("Unexpected boolean binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an output value provider for the * string. By default, this base64 decodes content in headers if there is a * mediaType applied to the string, and passes through for all other cases. * * @param context The generation context. * @param bindingType How this value is bound to the operation input. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the input string. */ private String getStringOutputParam( GenerationContext context, Location bindingType, String dataSource, Shape target ) { // Decode these to base64 if a MediaType is present. if (bindingType == Location.HEADER && target.hasTrait(MediaTypeTrait.ID)) { dataSource = "Buffer.from(context.base64Decoder(" + dataSource + ")).toString('utf8')"; } return HttpProtocolGeneratorUtils.getStringOutputParam( context, target, dataSource, !isGuaranteedString(bindingType) ); } private boolean isGuaranteedString(Location bindingType) { return bindingType != Location.PAYLOAD && bindingType != Location.DOCUMENT; } /** * Given context and a source of data, generate an output value provider for the * blob. By default, this base64 decodes content in headers and passes through * for payloads. * * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @return Returns a value or expression of the output blob. */ private String getBlobOutputParam(Location bindingType, String dataSource) { switch (bindingType) { case PAYLOAD: return dataSource; case QUERY: case LABEL: case HEADER: // Decode these from base64. return "context.base64Decoder(" + dataSource + ")"; default: throw new CodegenException("Unexpected blob binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an output value provider for the * collection. By default, this splits a comma separated string in headers. * * @param context The generation context. * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the output collection. */ private String getCollectionOutputParam( GenerationContext context, Location bindingType, String dataSource, CollectionShape target ) { MemberShape targetMember = target.getMember(); Shape collectionTarget = context.getModel().expectShape(targetMember.getTarget()); boolean trimParameterValue = bindingType != Location.QUERY && bindingType != Location.QUERY_PARAMS; String outputValueDataSource = "_entry"; if (trimParameterValue) { outputValueDataSource += ".trim()"; } String collectionTargetValue = getOutputValue( context, bindingType, outputValueDataSource, targetMember, collectionTarget ); String outputParam; switch (bindingType) { case QUERY_PARAMS: case QUERY: if (collectionTargetValue.equals("_entry")) { return String.format("%1$s", dataSource); } return String.format("%1$s.map(_entry => %2$s as any)", dataSource, collectionTargetValue); case LABEL: dataSource = "(" + dataSource + " || \"\")"; // Split these values on slashes. outputParam = "" + dataSource + ".split('/')"; // Iterate over each entry and do deser work. if (!collectionTargetValue.equals("_entry")) { outputParam += ".map(_entry => " + collectionTargetValue + " as any)"; } return outputParam; case HEADER: dataSource = "(" + dataSource + " || \"\")"; // Split these values on commas. context.getWriter() .addImportSubmodule( "splitHeader", "__splitHeader", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); outputParam = "__splitHeader(" + dataSource + ")"; // Headers that have HTTP_DATE formatted timestamps already contain a "," // in their formatted entry, so split on every other "," instead. if (collectionTarget.isTimestampShape()) { // Check if our member resolves to the HTTP_DATE format. HttpBindingIndex httpIndex = HttpBindingIndex.of(context.getModel()); Format format = httpIndex.determineTimestampFormat(targetMember, bindingType, Format.HTTP_DATE); if (format == Format.HTTP_DATE) { TypeScriptWriter writer = context.getWriter(); writer.addImportSubmodule( "splitEvery", "__splitEvery", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); outputParam = "__splitEvery(" + dataSource + ", ',', 2)"; } } // Iterate over each entry and do deser work. if (!collectionTargetValue.equals("_entry")) { outputParam += ".map(_entry => " + collectionTargetValue + " as any)"; } return outputParam; default: throw new CodegenException("Unexpected collection binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an output value provider for the * shape. This redirects to a deserialization function for documents and payloads, * and fails otherwise. * * @param context The generation context. * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the output shape. */ private String getNamedMembersOutputParam( GenerationContext context, Location bindingType, String dataSource, Shape target ) { switch (bindingType) { case PAYLOAD: // Redirect to a deserialization function. Symbol symbol = context.getSymbolProvider().toSymbol(target); boolean mayElideOutput = SerdeElisionIndex.of(context.getModel()).mayElide(target) && (enableSerdeElision() && !context.getSettings().generateServerSdk()); if (mayElideOutput) { context.getWriter() .addImportSubmodule( "_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); return "_json(" + dataSource + ")"; } return ProtocolGenerator.getDeserFunctionShortName(symbol) + "(" + dataSource + ", context)"; default: throw new CodegenException("Unexpected named member shape binding location `" + bindingType + "`"); } } /** * Given context and a source of data, generate an output value provider for the * number. By default, invokes parseInt on byte/short/integer/long types in headers, * invokes parseFloat on float/double types in headers, and fails otherwise. * * @param bindingType How this value is bound to the operation output. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param target The shape of the value being provided. * @return Returns a value or expression of the output number. */ private String getNumberOutputParam( GenerationContext context, Location bindingType, String dataSource, Shape target ) { switch (bindingType) { case QUERY: case LABEL: case HEADER: switch (target.getType()) { case DOUBLE: context .getWriter() .addImportSubmodule( "strictParseDouble", "__strictParseDouble", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseDouble(" + dataSource + ")"; case FLOAT: context .getWriter() .addImportSubmodule( "strictParseFloat", "__strictParseFloat", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseFloat(" + dataSource + ")"; case LONG: context .getWriter() .addImportSubmodule( "strictParseLong", "__strictParseLong", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseLong(" + dataSource + ")"; case INT_ENUM: case INTEGER: context .getWriter() .addImportSubmodule( "strictParseInt32", "__strictParseInt32", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseInt32(" + dataSource + ")"; case SHORT: context .getWriter() .addImportSubmodule( "strictParseShort", "__strictParseShort", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseShort(" + dataSource + ")"; case BYTE: context .getWriter() .addImportSubmodule( "strictParseByte", "__strictParseByte", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__strictParseByte(" + dataSource + ")"; default: throw new CodegenException("Unexpected number shape `" + target.getType() + "`"); } default: throw new CodegenException("Unexpected number binding location `" + bindingType + "`"); } } /** * Writes the code that loads an optional {@code errorCode} String with the content used * to dispatch errors to specific serializers. If an error code cannot be load, the code * must return {@code undefined} so default value can be injected in default case. * *

Two variables will be in scope: *

    *
  • {@code output} or {@code parsedOutput}: a value of the HttpResponse type. *
      *
    • {@code output} is a raw HttpResponse, available when {@code isErrorCodeInBody} is set to * {@code false}
    • *
    • {@code parsedOutput} is a HttpResponse type with body parsed to JavaScript object, available * when {@code isErrorCodeInBody} is set to {@code true}
    • *
    *
  • *
  • {@code context}: the SerdeContext.
  • *
* *

For example: * *

{@code
     * const errorCode = output.headers["x-amzn-errortype"].split(':')[0];
     * }
* * @param context The generation context. */ protected abstract void writeErrorCodeParser(GenerationContext context); /** * Provides where within the passed output variable the actual error resides. This is useful * for protocols that wrap the specific error in additional elements within the body. * * @param context The generation context. * @param outputLocation The name of the variable containing the output body. * @return A string of the variable containing the error body within the output. */ protected String getErrorBodyLocation(GenerationContext context, String outputLocation) { return outputLocation; } /** * Writes the code needed to deserialize a protocol input document. * *

Implementations of this method are expected to set members in the * {@code contents} variable that represents the type generated for the * response. This variable will already be defined in scope. * *

The contents of the response body will be available in a {@code data} variable. * *

For example: * *

{@code
     * if (data.fieldList !== undefined) {
     *   contents.fieldList = deserializeAws_restJson1_1FieldList(data.fieldList, context);
     * }
     * }
* @param context The generation context. * @param operation The operation whose input document is being deserialized. * @param documentBindings The bindings to read from the document. */ protected abstract void deserializeInputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ); /** * Writes the code needed to deserialize a protocol output document. * *

Implementations of this method are expected to set members in the * {@code contents} variable that represents the type generated for the * response. This variable will already be defined in scope. * *

The contents of the response body will be available in a {@code data} variable. * *

For example: * *

{@code
     * if (data.fieldList !== undefined) {
     *   contents.fieldList = deserializeAws_restJson1_1FieldList(data.fieldList, context);
     * }
     * }
* @param context The generation context. * @param operation The operation whose output document is being deserialized. * @param documentBindings The bindings to read from the document. */ protected abstract void deserializeOutputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ); /** * Writes the code needed to deserialize a protocol error document. * *

Implementations of this method are expected to set members in the * {@code contents} variable that represents the type generated for the * response. This variable will already be defined in scope. * *

The contents of the response body will be available in a {@code data} variable. * *

For example: * *

{@code
     * if (data.fieldList !== undefined) {
     *   contents.fieldList = deserializeAws_restJson1_1FieldList(data.fieldList, context);
     * }
     * }
* @param context The generation context. * @param error The error being deserialized. * @param documentBindings The bindings to read from the document. */ protected abstract void deserializeErrorDocumentBody( GenerationContext context, StructureShape error, List documentBindings ); /** * @return true if this protocol disallows string epoch timestamps in payloads. */ protected abstract boolean requiresNumericEpochSecondsInPayload(); /** * Implement a return true if the protocol allows elision of serde functions. * * @return whether protocol implementation is compatible with serde elision. */ protected boolean enableSerdeElision() { return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpProtocolGeneratorUtils.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.nio.file.Paths; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; import java.util.logging.Logger; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.pattern.SmithyPattern; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.RetryableTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Utility methods for generating HTTP protocols. */ @SmithyUnstableApi @SmithyInternalApi public final class HttpProtocolGeneratorUtils { private static final Logger LOGGER = Logger.getLogger(HttpBindingProtocolGenerator.class.getName()); private HttpProtocolGeneratorUtils() {} /** * Given a format and a source of data, generate an input value provider for the * timestamp. * * @param context The generation context. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @param shape The shape that represents the value being provided. * @param format The timestamp format to provide. * @return Returns a value or expression of the input timestamp. */ public static String getTimestampInputParam( GenerationContext context, String dataSource, Shape shape, Format format ) { switch (format) { case DATE_TIME: context .getWriter() .addImportSubmodule( "serializeDateTime", "__serializeDateTime", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); return "__serializeDateTime(" + dataSource + ")"; case EPOCH_SECONDS: return "(" + dataSource + ".getTime() / 1_000)"; case HTTP_DATE: context .getWriter() .addImportSubmodule( "dateToUtcString", "__dateToUtcString", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__dateToUtcString(" + dataSource + ")"; default: throw new CodegenException("Unexpected timestamp format `" + format + "` on " + shape); } } /** * Given a format and a source of data, generate an output value provider for the * timestamp. * * @param writer The current writer (so that imports may be added) * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param bindingType How this value is bound to the operation output. * @param shape The shape that represents the value being received. * @param format The timestamp format to provide. * @param requireNumericEpochSecondsInPayload if true, paylaod epoch seconds are not allowed to be coerced * from strings. * @param isClient true if generating a client. * @return Returns a value or expression of the output timestamp. */ public static String getTimestampOutputParam( TypeScriptWriter writer, String dataSource, Location bindingType, Shape shape, Format format, boolean requireNumericEpochSecondsInPayload, boolean isClient ) { // This has always explicitly wrapped the dataSource in "new Date(..)", so it could never generate // an expression that evaluates to null. Codegen relies on this. writer.addImportSubmodule( "expectNonNull", "__expectNonNull", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); switch (format) { case DATE_TIME: // Clients should be able to handle offsets and normalize the datetime to an offset of zero. if (isClient) { writer.addImportSubmodule( "parseRfc3339DateTimeWithOffset", "__parseRfc3339DateTimeWithOffset", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return String.format("__expectNonNull(__parseRfc3339DateTimeWithOffset(%s))", dataSource); } else { writer.addImportSubmodule( "parseRfc3339DateTime", "__parseRfc3339DateTime", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return String.format("__expectNonNull(__parseRfc3339DateTime(%s))", dataSource); } case HTTP_DATE: writer.addImportSubmodule( "parseRfc7231DateTime", "__parseRfc7231DateTime", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return String.format("__expectNonNull(__parseRfc7231DateTime(%s))", dataSource); case EPOCH_SECONDS: writer.addImportSubmodule( "parseEpochTimestamp", "__parseEpochTimestamp", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); String modifiedDataSource = dataSource; if ( requireNumericEpochSecondsInPayload && (bindingType == Location.DOCUMENT || bindingType == Location.PAYLOAD) ) { writer.addImportSubmodule( "expectNumber", "__expectNumber", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); modifiedDataSource = String.format("__expectNumber(%s)", dataSource); } return String.format("__expectNonNull(__parseEpochTimestamp(%s))", modifiedDataSource); default: throw new CodegenException("Unexpected timestamp format `" + format.toString() + "` on " + shape); } } /** * Given a String input, determine its media type and generate an input value * provider for it. * *

This currently only supports using the LazyJsonString for {@code "application/json"}. * * @param context The generation context. * @param shape The shape that represents the value being provided. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) * @return Returns a value or expression of the input string. */ public static String getStringInputParam(GenerationContext context, Shape shape, String dataSource) { // Handle media type generation, defaulting to the dataSource. Optional mediaTypeTrait = shape.getTrait(MediaTypeTrait.class); if (mediaTypeTrait.isPresent()) { String mediaType = mediaTypeTrait.get().getValue(); if (CodegenUtils.isJsonMediaType(mediaType)) { TypeScriptWriter writer = context.getWriter(); writer.addImportSubmodule( "LazyJsonString", "__LazyJsonString", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__LazyJsonString.from(" + dataSource + ")"; } else { LOGGER.warning(() -> "Found unsupported mediatype " + mediaType + " on String shape: " + shape); } } return dataSource; } /** * Given a String output, determine its media type and generate an output value * provider for it. * *

This currently only supports using the LazyJsonString for {@code "application/json"}. * * @param context The generation context. * @param shape The shape that represents the value being received. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @param useExpect Whether or not to wrap the string in expectString. This should * only be false if the value is guaranteed to be a string already. * @return Returns a value or expression of the output string. */ public static String getStringOutputParam( GenerationContext context, Shape shape, String dataSource, boolean useExpect ) { // Handle media type generation, defaulting to a standard String. Optional mediaTypeTrait = shape.getTrait(MediaTypeTrait.class); if (mediaTypeTrait.isPresent()) { String mediaType = mediaTypeTrait.get().getValue(); if (CodegenUtils.isJsonMediaType(mediaType)) { TypeScriptWriter writer = context.getWriter(); writer.addImportSubmodule( "LazyJsonString", "__LazyJsonString", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__LazyJsonString.from(" + dataSource + ")"; } else { LOGGER.warning(() -> "Found unsupported mediatype " + mediaType + " on String shape: " + shape); } } if (!useExpect) { return dataSource; } context.getWriter() .addImportSubmodule( "expectString", "__expectString", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); return "__expectString(" + dataSource + ")"; } /** * Given a String output, determine its media type and generate an output value * provider for it. * *

This currently only supports using the LazyJsonString for {@code "application/json"}. * * @param context The generation context. * @param shape The shape that represents the value being received. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) * @return Returns a value or expression of the output string. */ public static String getStringOutputParam(GenerationContext context, Shape shape, String dataSource) { return getStringOutputParam(context, shape, dataSource, true); } /** * Writes a response metadata deserializer function for HTTP protocols. This * will load things like the status code, headers, and more. * * @param context The generation context. * @param responseType The response type for the HTTP protocol. */ public static void generateMetadataDeserializer(GenerationContext context, SymbolReference responseType) { TypeScriptWriter writer = context.getWriter(); writer.addTypeImport("ResponseMetadata", "__ResponseMetadata", TypeScriptDependency.SMITHY_TYPES); writer.openBlock( "const deserializeMetadata = (output: $T): __ResponseMetadata => ({", "});", responseType, () -> { writer.write("httpStatusCode: output.statusCode,"); writer.write( "requestId: output.headers[\"x-amzn-requestid\"] ??" + " output.headers[\"x-amzn-request-id\"] ??" + " output.headers[\"x-amz-request-id\"]," ); writer.write("extendedRequestId: output.headers[\"x-amz-id-2\"],"); writer.write("cfId: output.headers[\"x-amz-cf-id\"],"); } ); writer.write(""); } /** * Writes a function converting the low-level response body stream to utf-8 encoded string. It depends on * response body stream collector. * * @param context The generation context */ public static void generateCollectBodyString(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer .addImportSubmodule("collectBody", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS); writer.addTypeImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); writer.write("// Encode Uint8Array data into string with utf-8."); writer.write( "const collectBodyString = (streamBody: any, context: __SerdeContext): Promise => " + "collectBody(streamBody, context).then(body => context.utf8Encoder(body))" ); writer.write(""); } /** * Writes $retryable key for error if it contains RetryableTrait. * * @param writer The code writer. * @param error The error to write retryableTrait for. * @param separator The string to be used after emitting key-value pair for retryableTrait. */ public static void writeRetryableTrait(TypeScriptWriter writer, StructureShape error, String separator) { Optional retryableTrait = error.getTrait(RetryableTrait.class); if (retryableTrait.isPresent()) { String textAfterBlock = String.format("}%s", separator); writer.openCollapsibleBlock("$$retryable = {", textAfterBlock, retryableTrait.get().getThrottling(), () -> { if (retryableTrait.get().getThrottling()) { writer.write("throttling: true,"); } }); } } /** * Writes a function used to dispatch to the proper error deserializer * for each error that any operation can return. The generated function * assumes a deserialization function is generated for the structures * returned. * * @param context The generation context. * @param responseType The response type for the HTTP protocol. * @param errorCodeGenerator A consumer * @param shouldParseErrorBody Flag indicating whether need to parse response body in this dispatcher function * @param bodyErrorLocationModifier A function that returns the location of an error in a body given a data source. * @param operationErrorsToShapes A map of error names to their {@link ShapeId}. * @return A set of all error structure shapes for the operation that were dispatched to. */ public static Set generateUnifiedErrorDispatcher( GenerationContext context, List operations, SymbolReference responseType, Consumer errorCodeGenerator, boolean shouldParseErrorBody, BiFunction bodyErrorLocationModifier, BiFunction, Map> operationErrorsToShapes, Map> errorAliases ) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); Set errorShapes = new TreeSet<>(); String errorMethodName = "de_CommandError"; String errorMethodLongName = "deserialize_" + ProtocolGenerator.getSanitizedName(context.getProtocolName()) + "CommandError"; writer.writeDocs(errorMethodLongName); writer.openBlock( "const $L = async (\n" + " output: $T,\n" + " context: __SerdeContext,\n" + "): Promise => {", "}", errorMethodName, responseType, () -> { // Prepare error response for parsing error code. If error code needs to be parsed from response body // then we collect body and parse it to JS object, otherwise leave the response body as is. if (shouldParseErrorBody) { writer.openBlock("const parsedOutput: any = {", "};", () -> { writer.write("...output,"); writer.write("body: await parseErrorBody(output.body, context)"); }); } // Error responses must be at least BaseException interface errorCodeGenerator.accept(context); Runnable defaultErrorHandler = () -> { if (shouldParseErrorBody) { // Body is already parsed above writer.write("const parsedBody = parsedOutput.body;"); } else { // Body is not parsed above, so parse it here writer.write("const parsedBody = await parseBody(output.body, context);"); } // Get the protocol specific error location for retrieving contents. String errorLocation = bodyErrorLocationModifier.apply(context, "parsedBody"); writer.openBlock("return throwDefaultError({", "}) as never;", () -> { writer.write("output,"); if (errorLocation.equals("parsedBody")) { writer.write("parsedBody,"); } else { writer.write("parsedBody: $L,", errorLocation); } writer.write("errorCode"); }); }; Map operationNamesToShapes = operationErrorsToShapes.apply(context, operations); if (!operationNamesToShapes.isEmpty()) { writer.openBlock("switch (errorCode) {", "}", () -> { // Generate the case statement for each error, invoking the specific deserializer. operationNamesToShapes.forEach((name, errorId) -> { StructureShape error = context.getModel().expectShape(errorId).asStructureShape().get(); // Track errors bound to the operation so their deserializers may be generated. errorShapes.add(error); Symbol errorSymbol = symbolProvider.toSymbol(error); String errorDeserMethodName = ProtocolGenerator.getDeserFunctionShortName(errorSymbol) + "Res"; // Dispatch to the error deserialization function. String outputParam = shouldParseErrorBody ? "parsedOutput" : "output"; writer.write("case $S:", name); writer.write("case $S:", errorId.toString()); for (String alias : errorAliases.getOrDefault(errorId.toString(), new TreeSet<>())) { if (!Objects.equals(name, alias) && !Objects.equals(errorId.toString(), alias)) { writer.write("case $S:", alias); } } writer .indent() .write("throw await $L($L, context);", errorDeserMethodName, outputParam) .dedent(); }); // Build a generic error the best we can for ones we don't know about. writer.write("default:").indent(); defaultErrorHandler.run(); writer.dedent(); }); } else { defaultErrorHandler.run(); } } ); writer.write(""); return errorShapes; } /** * Writes resolved hostname, prepending existing hostname with hostPrefix and replacing each hostLabel with * the corresponding top-level input member value. * * @param context The generation context. * @param operation The operation to generate for. */ public static void writeHostPrefix(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); EndpointTrait trait = operation.getTrait(EndpointTrait.class).get(); writer.write("let { hostname: resolvedHostname } = await context.endpoint();"); // Check if disableHostPrefixInjection has been set to true at runtime writer.openBlock("if (context.disableHostPrefix !== true) {", "}", () -> { writer.addImportSubmodule( "isValidHostname", "__isValidHostname", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.write("resolvedHostname = $S + resolvedHostname;", trait.getHostPrefix().toString()); if (operation.getInput().isPresent()) { List prefixLabels = trait.getHostPrefix().getLabels(); StructureShape inputShape = context .getModel() .expectShape(operation.getInput().get(), StructureShape.class); for (SmithyPattern.Segment label : prefixLabels) { MemberShape member = inputShape.getMember(label.getContent()).get(); String memberName = symbolProvider.toMemberName(member); writer.openBlock("if (input.$L === undefined) {", "}", memberName, () -> { writer.write("throw new Error('Empty value provided for input host prefix: $L.');", memberName); }); writer.write( "resolvedHostname = resolvedHostname.replace(\"{$L}\", input.$L!)", label.getContent(), memberName ); } } writer.openBlock("if (!__isValidHostname(resolvedHostname)) {", "}", () -> { writer.write("throw new Error(\"ValidationError: prefixed hostname must be hostname compatible.\");"); }); }); } /** * Construct a symbol reference of client's base exception class. */ public static SymbolReference getClientBaseException(GenerationContext context) { ServiceShape service = context.getService(); SymbolProvider symbolProvider = context.getSymbolProvider(); String serviceName = symbolProvider.toSymbol(service).getName().replaceAll("(Client)$", ""); String serviceExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, context.getModel()); String namespace = Paths.get(".", "src", "models", serviceExceptionName).toString(); Symbol serviceExceptionSymbol = Symbol.builder() .name(serviceExceptionName) .namespace(namespace, "/") .definitionFile(namespace + ".ts") .build(); return SymbolReference.builder() .options(SymbolReference.ContextOption.USE) .alias("__BaseException") .symbol(serviceExceptionSymbol) .build(); } /** * Returns a map of error names to their {@link ShapeId}. * * @param context the generation context * @param operation the operation shape to retrieve errors for * @return map of error names to {@link ShapeId} */ public static Map getOperationErrors(GenerationContext context, OperationShape operation) { return operation .getErrors() .stream() .collect( Collectors.toMap( shapeId -> shapeId.getName(context.getService()), Function.identity(), (x, y) -> { if (!x.equals(y)) { throw new CodegenException( String.format("conflicting error shape ids: %s, %s", x, y) ); } return x; }, TreeMap::new ) ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpRpcProtocolGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Set; import java.util.TreeSet; import java.util.logging.Logger; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.utils.OptionalUtils; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Abstract implementation useful for all HTTP protocols without bindings. */ @SmithyUnstableApi public abstract class HttpRpcProtocolGenerator implements ProtocolGenerator { public static final Logger LOGGER = Logger.getLogger(HttpRpcProtocolGenerator.class.getName()); private static final ApplicationProtocol APPLICATION_PROTOCOL = ApplicationProtocol.createDefaultHttpApplicationProtocol(); protected final Set serializingDocumentShapes = new TreeSet<>(); protected final Set deserializingDocumentShapes = new TreeSet<>(); protected final Set deserializingErrorShapes = new TreeSet<>(); protected final EventStreamGenerator eventStreamGenerator = new EventStreamGenerator(); private final boolean isErrorCodeInBody; /** * Creates a Http RPC protocol generator. * * @param isErrorCodeInBody A boolean that indicates if the error code for the implementing protocol is located in * the error response body, meaning this generator will parse the body before attempting to load an error code. */ public HttpRpcProtocolGenerator(boolean isErrorCodeInBody) { this.isErrorCodeInBody = isErrorCodeInBody; } @Override public final ApplicationProtocol getApplicationProtocol() { return APPLICATION_PROTOCOL; } /** * Gets the content-type for a request body. * * @return Returns the default content-type. */ protected abstract String getDocumentContentType(); /** * Generates serialization functions for shapes in the passed set. These functions * should return a value that can then be serialized by the implementation of * {@code serializeInputDocument}. The {@link DocumentShapeSerVisitor} and * {@link DocumentMemberSerVisitor} are provided to reduce the effort of this implementation. * * @param context The generation context. * @param shapes The shapes to generate serialization for. */ protected abstract void generateDocumentBodyShapeSerializers(GenerationContext context, Set shapes); /** * Generates deserialization functions for shapes in the passed set. These functions * should return a value that can then be deserialized by the implementation of * {@code deserializeOutputDocument}. The {@link DocumentShapeDeserVisitor} and * {@link DocumentMemberDeserVisitor} are provided to reduce the effort of this implementation. * * @param context The generation context. * @param shapes The shapes to generate deserialization for. */ protected abstract void generateDocumentBodyShapeDeserializers(GenerationContext context, Set shapes); @Override public void generateSharedComponents(GenerationContext context) { ServiceShape service = context.getService(); deserializingErrorShapes.forEach(error -> generateErrorDeserializer(context, error)); eventStreamGenerator.generateEventStreamSerializers( context, service, getDocumentContentType(), () -> { TypeScriptWriter writer = context.getWriter(); serializeEventStreamBodyToBytes(writer); }, serializingDocumentShapes ); // Error shapes that only referred in the error event of an eventstream Set errorEventShapes = new TreeSet<>(); SerdeElisionIndex serdeElisionIndex = SerdeElisionIndex.of(context.getModel()); eventStreamGenerator.generateEventStreamDeserializers( context, service, errorEventShapes, deserializingDocumentShapes, isErrorCodeInBody, enableSerdeElision(), serdeElisionIndex ); errorEventShapes.removeIf(deserializingErrorShapes::contains); errorEventShapes.forEach(error -> generateErrorDeserializer(context, error)); generateDocumentBodyShapeSerializers(context, serializingDocumentShapes); generateDocumentBodyShapeDeserializers(context, deserializingDocumentShapes); HttpProtocolGeneratorUtils.generateMetadataDeserializer(context, getApplicationProtocol().getResponseType()); HttpProtocolGeneratorUtils.generateCollectBodyString(context); TypeScriptWriter writer = context.getWriter(); if (context.getSettings().generateClient()) { writer.addImportSubmodule( "withBaseException", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); SymbolReference exception = HttpProtocolGeneratorUtils.getClientBaseException(context); writer.write("const throwDefaultError = withBaseException($T);", exception); } // Write a function to generate HTTP requests since they're so similar. SymbolReference requestType = getApplicationProtocol().getRequestType(); writer.addUseImports(requestType); writer.addTypeImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("HeaderBag", "__HeaderBag", TypeScriptDependency.SMITHY_TYPES); Symbol requestSymbol = requestType.getSymbol().toBuilder().putProperty("typeOnly", false).build(); writer.openBlock( "const buildHttpRpcRequest = async (\n" + " context: __SerdeContext,\n" + " headers: __HeaderBag,\n" + " path: string,\n" + " resolvedHostname: string | undefined,\n" + " body: any,\n" + "): Promise<$T> => {", "};", requestType, () -> { // Get the hostname, port, and scheme from client's resolved endpoint. Then construct the request from // them. The client's resolved endpoint can be default one or supplied by users. writer.write( "const {hostname, protocol = \"https\", port, path: basePath} = await context.endpoint();" ); writer.openBlock("const contents: any = {", "};", () -> { writer.write("protocol,"); writer.write("hostname,"); writer.write("port,"); writer.write("method: \"POST\","); writer.write( "path: basePath.endsWith(\"/\") ? basePath.slice(0, -1) + path : basePath + path," ); writer.write("headers,"); }); writer.openBlock("if (resolvedHostname !== undefined) {", "}", () -> { writer.write("contents.hostname = resolvedHostname;"); }); writer.openBlock("if (body !== undefined) {", "}", () -> { writer.write("contents.body = body;"); }); writer.write("return new $T(contents);", requestSymbol); } ); // Write common request header to be shared by all requests writeSharedRequestHeaders(context); writer.write(""); writer.write(context.getStringStore().flushVariableDeclarationCode()); writer.addImportSubmodule( "HttpRequest", "__HttpRequest", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); writer.addImportSubmodule( "HttpResponse", "__HttpResponse", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS ); } @Override public void generateRequestSerializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { generateOperationSerializer(context, operation); } } @Override public void generateFrameworkErrorSerializer(GenerationContext serverContext) { LOGGER.warning("Framework error serialization is not currently supported for RPC protocols."); } @Override public void generateRequestDeserializers(GenerationContext context) { LOGGER.warning("Request deserialization is not currently supported for RPC protocols."); } @Override public void generateResponseSerializers(GenerationContext context) { LOGGER.warning("Response serialization is not currently supported for RPC protocols."); } @Override public void generateServiceHandlerFactory(GenerationContext context) { LOGGER.warning("Handler factory generation is not currently supported for RPC protocols."); } @Override public void generateOperationHandlerFactory(GenerationContext context, OperationShape operation) { LOGGER.warning("Handler factory generation is not currently supported for RPC protocols."); } @Override public void generateResponseDeserializers(GenerationContext context) { TopDownIndex topDownIndex = TopDownIndex.of(context.getModel()); Set containedOperations = new TreeSet<>( topDownIndex.getContainedOperations(context.getService()) ); for (OperationShape operation : containedOperations) { generateOperationDeserializer(context, operation); } SymbolReference responseType = getApplicationProtocol().getResponseType(); Set errorShapes = HttpProtocolGeneratorUtils.generateUnifiedErrorDispatcher( context, containedOperations.stream().toList(), responseType, this::writeErrorCodeParser, isErrorCodeInBody, this::getErrorBodyLocation, this::getOperationErrors, getErrorAliases(context, containedOperations) ); deserializingErrorShapes.addAll(errorShapes); } protected void generateOperationSerializer(GenerationContext context, OperationShape operation) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference requestType = getApplicationProtocol().getRequestType(); TypeScriptWriter writer = context.getWriter(); // Ensure that the request type is imported. writer.addUseImports(requestType); writer.addTypeImport("Endpoint", "__Endpoint", TypeScriptDependency.SMITHY_TYPES); // e.g., se_ES String methodName = ProtocolGenerator.getSerFunctionShortName(symbol); // e.g., serializeAws_restJson1_1ExecuteStatement String methodLongName = ProtocolGenerator.getSerFunctionName(symbol, getName()); // Add the normalized input type. Symbol inputType = symbol.expectProperty("inputType", Symbol.class); String serdeContextType = CodegenUtils.getOperationSerializerContextType(writer, context.getModel(), operation); writer.writeDocs(methodLongName); writer.openBlock( "export const $L = async (\n" + " input: $T,\n" + " context: $L\n" + "): Promise<$T> => {", "};", methodName, inputType, serdeContextType, requestType, () -> { writeRequestHeaders(context, operation); boolean hasRequestBody = writeRequestBody(context, operation); boolean hasHostPrefix = operation.hasTrait(EndpointTrait.class); if (hasHostPrefix) { HttpProtocolGeneratorUtils.writeHostPrefix(context, operation); } // Construct the request with the operation's path and optional hostname and body. writer.write( "return buildHttpRpcRequest(context, headers, $S, $L, $L);", getOperationPath(context, operation), hasHostPrefix ? "resolvedHostname" : "undefined", hasRequestBody ? "body" : "undefined" ); } ); writer.write(""); } /** * Writes HTTP request headers required by the protocol implementation. * *

By default, headers are configured to use {@code SHARED_HEADERS}. See {@link #writeSharedRequestHeaders} * *

{@code
     *   const headers: __HeaderBag = SHARED_HEADERS;
     * }
* *

This method can be overridden to customize headers generation. For example: * *

{@code
     *   const headers: __HeaderBag = {
     *     "foo": "This is a custom header",
     *     ...SHARED_HEADERS
     *   };
     * }
* * @param context The generation context. * @param operation The operation being generated. */ protected void writeRequestHeaders(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); writer.write("const headers: __HeaderBag = SHARED_HEADERS;"); } /** * Writes headers to be shared for all HTTP requests by the protocol implementation. * *

To reduce generated code size, we should put all common headers into single location. *

For example, most request headers contain {@code content-type}. * *

{@code
     * const SHARED_HEADERS: __HeaderBag = {
     *   "content-type": "application/x-www-form-urlencoded",
     * };
     * }
* *

{@code SHARED_HEADERS} can then be used as follows: * *

{@code
     * const headers: __HeaderBag = {
     *   "foo": "This is a custom header",
     *   ...SHARED_HEADERS
     * };
     * }
* *

This method can be overridden for customization. For example: * *

{@code
     * function sharedHeaders(operationName): __HeaderBag = {
     *   "custom-header": "xyz-service:${operationName}",
     * };
     *
     * const headers: __HeaderBag = {
     *   "foo": "This is a custom header",
     *   ...sharedHeaders(operationName)
     * };
     * }
* * @param context The generation context. */ protected void writeSharedRequestHeaders(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer.addTypeImport("HeaderBag", "__HeaderBag", TypeScriptDependency.SMITHY_TYPES); writer.openBlock("const SHARED_HEADERS: __HeaderBag = {", "};", () -> { writer.write("'content-type': $S,", getDocumentContentType()); }); } protected boolean writeRequestBody(GenerationContext context, OperationShape operation) { if (operation.getInput().isPresent()) { // If there's an input present, we know it's a structure. StructureShape inputShape = context .getModel() .expectShape(operation.getInput().get()) .asStructureShape() .get(); TypeScriptWriter writer = context.getWriter(); // Write the default `body` property. writer.write("let body: any;"); if (EventStreamGenerator.hasEventStreamInput(context, operation)) { MemberShape eventStreamMember = EventStreamGenerator.getEventStreamMember(context, inputShape); Shape target = context.getModel().expectShape(eventStreamMember.getTarget()); Symbol targetSymbol = context.getSymbolProvider().toSymbol(target); String serFunctionName = ProtocolGenerator.getSerFunctionShortName(targetSymbol); String memberName = eventStreamMember.getMemberName(); writer.write("body = $L(input.$L, context);", serFunctionName, memberName); } else { // Track input shapes so their serializers may be generated. serializingDocumentShapes.add(inputShape); serializeInputDocument(context, operation, inputShape); } return true; } return writeUndefinedInputBody(context, operation); } /** * Provides the request path for the operation. * * @param context The generation context. * @param operation The operation being generated. * @return The path to send HTTP requests to. */ protected abstract String getOperationPath(GenerationContext context, OperationShape operation); /** * Writes the code needed to serialize the input document of a request. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will already be defined in scope. * *

For example: * *

{@code
     * const wrappedBody: any = {
     *   OperationRequest: serializeAws_json1_1OperationRequest(input, context),
     * };
     * body = JSON.stringify(wrappedBody);
     * }
* * @param context The generation context. * @param operation The operation being generated. * @param inputStructure The structure containing the operation input. */ protected abstract void serializeInputDocument( GenerationContext context, OperationShape operation, StructureShape inputStructure ); /** * Writes any default body contents when an operation has an undefined input. * *

Implementations of this method are expected to set a value to the * {@code body} variable that will be serialized as the request body. * This variable will NOT be defined in scope and should be defined by * implementations if they wish to set it. * *

For example: * *

{@code
     * const body = "{}";
     * }
* *

Implementations should return true if they define a body variable, and * false otherwise. * * @param context The generation context. * @param operation The operation being generated. * @return If a body variable was defined. */ protected boolean writeUndefinedInputBody(GenerationContext context, OperationShape operation) { // Pass return false; } protected void generateOperationDeserializer(GenerationContext context, OperationShape operation) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference responseType = getApplicationProtocol().getResponseType(); TypeScriptWriter writer = context.getWriter(); // Ensure that the response type is imported. writer.addUseImports(responseType); // e.g., deserializeAws_restJson1_1ExecuteStatement String methodName = ProtocolGenerator.getDeserFunctionShortName(symbol); String methodLongName = ProtocolGenerator.getDeserFunctionName(symbol, getName()); String errorMethodName = "de_CommandError"; String serdeContextType = CodegenUtils.getOperationDeserializerContextType( context.getSettings(), writer, context.getModel(), operation ); // Add the normalized output type. Symbol outputType = symbol.expectProperty("outputType", Symbol.class); // Handle the general response. writer.writeDocs(methodLongName); writer.openBlock( "export const $L = async (\n" + " output: $T,\n" + " context: $L\n" + "): Promise<$T> => {", "};", methodName, responseType, serdeContextType, outputType, () -> { // Redirect error deserialization to the dispatcher writer.openBlock("if (output.statusCode >= 300) {", "}", () -> { writer.write("return $L(output, context);", errorMethodName); }); // Start deserializing the response. readResponseBody(context, operation); // Build the response with typing and metadata. writer.openBlock("const response: $T = {", "};", outputType, () -> { writer.write("$$metadata: deserializeMetadata(output),"); operation .getOutput() .ifPresent(outputId -> { writer.write("...contents,"); }); }); writer.write("return response;"); } ); writer.write(""); } protected void generateErrorDeserializer(GenerationContext context, StructureShape error) { TypeScriptWriter writer = context.getWriter(); SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol errorSymbol = symbolProvider.toSymbol(error); String errorDeserMethodName = ProtocolGenerator.getDeserFunctionShortName(errorSymbol) + "Res"; String errorDeserMethodLongName = ProtocolGenerator.getDeserFunctionName(errorSymbol, context.getProtocolName()) + "Res"; // Add the error shape to the list to generate functions for, since we'll use that. deserializingDocumentShapes.add(error); String outputReference = isErrorCodeInBody ? "parsedOutput" : "output"; writer.writeDocs(errorDeserMethodLongName); writer.openBlock( "const $L = async (\n" + " $L: any,\n" + " context: __SerdeContext\n" + "): Promise<$T> => {", "};", errorDeserMethodName, outputReference, errorSymbol, () -> { // First deserialize the body properly. if (isErrorCodeInBody) { // Body is already parsed in the error dispatcher, simply assign the body. writer.write("const body = $L.body", outputReference); } else { // The dispatcher defers parsing the body in cases where protocols do not have // their error code in the body, so we handle that parsing before deserializing // the error shape here. writer.write("const body = parseBody($L.body, context);", outputReference); } if (SerdeElisionIndex.of(context.getModel()).mayElide(error) && enableSerdeElision()) { writer.addImportSubmodule( "_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("const deserialized: any = _json($L);", getErrorBodyLocation(context, "body")); } else { writer.write( "const deserialized: any = $L($L, context);", ProtocolGenerator.getDeserFunctionShortName(errorSymbol), getErrorBodyLocation(context, "body") ); } // Then load it into the object with additional error and response properties. Symbol materializedError = errorSymbol.toBuilder().putProperty("typeOnly", false).build(); writer.openBlock("const exception = new $T({", "});", materializedError, () -> { writer.write("$$metadata: deserializeMetadata($L),", outputReference); writer.write("...deserialized"); }); writer.addImportSubmodule( "decorateServiceException", "__decorateServiceException", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); writer.write("return __decorateServiceException(exception, body);"); } ); writer.write(""); } protected void readResponseBody(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); OptionalUtils.ifPresentOrElse( operation.getOutput(), outputId -> { // If there's an output present, we know it's a structure. StructureShape outputShape = context.getModel().expectShape(outputId).asStructureShape().get(); if (EventStreamGenerator.hasEventStreamOutput(context, operation)) { MemberShape eventStreamMember = EventStreamGenerator.getEventStreamMember(context, outputShape); Shape target = context.getModel().expectShape(eventStreamMember.getTarget()); Symbol targetSymbol = context.getSymbolProvider().toSymbol(target); writer.write( "const contents = { $L: $L(output.body, context) };", eventStreamMember.getMemberName(), ProtocolGenerator.getDeserFunctionShortName(targetSymbol) ); } else { // We only need to load the body and prepare a contents object if there is a response. writer.write("const data: any = await parseBody(output.body, context)"); writer.write("let contents: any = {};"); // Track output shapes so their deserializers may be generated. deserializingDocumentShapes.add(outputShape); deserializeOutputDocument(context, operation, outputShape); } }, () -> { // If there is no output, the body still needs to be collected so the process can exit. writer.write("await collectBody(output.body, context);"); } ); } /** * Writes the code that loads an optional {@code errorCode} String with the content used * to dispatch errors to specific serializers. If an error code cannot be load, the code * must return {@code undefined} so default value can be injected in default case. * *

Two variables will be in scope: *

    *
  • {@code output} or {@code parsedOutput}: a value of the HttpResponse type. *
      *
    • {@code output} is a raw HttpResponse, available when {@code isErrorCodeInBody} is set to * {@code false}
    • *
    • {@code parsedOutput} is a HttpResponse type with body parsed to JavaScript object, available * when {@code isErrorCodeInBody} is set to {@code true}
    • *
    *
  • *
  • {@code context}: the SerdeContext.
  • *
* *

For example: * *

{@code
     * const errorCode = output.headers["x-amzn-errortype"].split(':')[0];
     * }
* * @param context The generation context. */ protected abstract void writeErrorCodeParser(GenerationContext context); /** * Provides where within the passed output variable the actual error resides. This is useful * for protocols that wrap the specific error in additional elements within the body. * * @param context The generation context. * @param outputLocation The name of the variable containing the output body. * @return A string of the variable containing the error body within the output body. */ protected String getErrorBodyLocation(GenerationContext context, String outputLocation) { return outputLocation; } /** * Allows RPC protocols to designate how to convert the body into bytes. * * @deprecated superseded by schema-serde. */ @Deprecated @SmithyInternalApi protected void serializeEventStreamBodyToBytes(TypeScriptWriter writer) { writer.write("body = context.utf8Decoder(JSON.stringify(body));"); } /** * Writes the code needed to deserialize the output document of a response. * *

Implementations of this method are expected to set members in the * {@code contents} variable that represents the type generated for the * response. This variable will already be defined in scope. * *

The contents of the response body will be available in a {@code data} variable. * *

For example: * *

{@code
     * contents = deserializeAws_json1_1OperationResponse(data.OperationResponse, context);
     * }
* * @param context The generation context. * @param operation The operation being generated. * @param outputStructure The structure containing the operation output. */ protected abstract void deserializeOutputDocument( GenerationContext context, OperationShape operation, StructureShape outputStructure ); /** * See {@link SerdeElisionIndex}. * * @return whether protocol implementation is compatible with serde elision. */ protected boolean enableSerdeElision() { return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/ProtocolGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeSet; import java.util.stream.Collectors; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptDelegator; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.util.StringStore; import software.amazon.smithy.utils.CaseUtils; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Smithy protocol code generators. */ @SmithyUnstableApi public interface ProtocolGenerator { String PROTOCOLS_FOLDER = "protocols"; /** * Sanitizes the name of the protocol so it can be used as a symbol * in TypeScript. * *

For example, the default implementation converts "." to "_", * and converts "-" to become camelCase separated words. This means * that "aws.rest-json-1.1" becomes "Aws_RestJson1_1". * * @param name Name of the protocol to sanitize. * @return Returns the sanitized name. */ static String getSanitizedName(String name) { String result = name.replace(".", "_"); return CaseUtils.toCamelCase(result, true, '-'); } /** * Gets the supported protocol {@link ShapeId}. * * @return Returns the protocol supported */ ShapeId getProtocol(); /** * Gets the name of the protocol. * *

The default implementation is the ShapeId name of the protocol trait in * Smithy models (e.g., "aws.protocols#restJson1" would return "restJson1"). * * @return Returns the protocol name. */ default String getName() { return getProtocol().getName(); } /** * Gets the application protocol for the generator. * * @return Returns the application protocol. */ ApplicationProtocol getApplicationProtocol(); /** * Determines if two protocol generators are compatible at the * application protocol level, meaning they both use HTTP, or MQTT * for example. * *

Two protocol implementations are considered compatible if the * {@link ApplicationProtocol#equals} method of {@link #getApplicationProtocol} * returns true when called with {@code other}. The default implementation * should work for most interfaces, but may be overridden for more in-depth * handling of things like minor version incompatibilities. * *

By default, if the application protocols are considered equal, then * {@code other} is returned. * * @param service Service being generated. * @param protocolGenerators Other protocol generators that are being generated. * @param other Protocol generator to resolve against. * @return Returns the resolved application protocol object. */ default ApplicationProtocol resolveApplicationProtocol( ServiceShape service, Collection protocolGenerators, ApplicationProtocol other ) { if (!getApplicationProtocol().equals(other)) { String protocolNames = protocolGenerators .stream() .map(ProtocolGenerator::getProtocol) .map(ShapeId::getName) .sorted() .collect(Collectors.joining(", ")); throw new CodegenException( String.format( "All of the protocols generated for a service must be runtime compatible, but " + "protocol `%s` is incompatible with other application protocols: [%s]. Please pick a " + "set of compatible protocols using the `protocols` option when generating %s.", getProtocol().getName(), protocolNames, service.getId() ) ); } return other; } /** * Generates any standard code for service request/response serde. * * @param context Serde context. */ default void generateSharedComponents(GenerationContext context) {} /** * Generates the code used to serialize the shapes of a service * for requests. * * @param context Serialization context. */ void generateRequestSerializers(GenerationContext context); /** * Generates the code used to deserialize the shapes of a service * for requests. * * @param context Serialization context. */ void generateRequestDeserializers(GenerationContext context); /** * Generates the code used to serialize the shapes of a service * for responses. * * @param context Serialization context. */ void generateResponseSerializers(GenerationContext context); /** * Generates the code used to serialize unmodeled errors for servers. * * @param serverContext Serialization context. */ void generateFrameworkErrorSerializer(GenerationContext serverContext); /** * Generates a factory for the ServiceHandler implementation for this service. * * @param context Generation context. */ void generateServiceHandlerFactory(GenerationContext context); /** * Generates the code used to handle a request for a specific operation in the given service. This allows the * business logic for a service to be split among multiple deployment targets, for example, one Lambda function * per operation. * * @param context Generation context. * @param operation The operation to generate a handler factory for. */ void generateOperationHandlerFactory(GenerationContext context, OperationShape operation); /** * Generates the code used to deserialize the shapes of a service * for responses. * * @param context Deserialization context. */ void generateResponseDeserializers(GenerationContext context); /** * Generates protocol tests to assert the protocol works properly. * * @param context Generation context. */ void generateProtocolTests(GenerationContext context); /** * Generates the name of a serializer function for shapes of a service. * * @param symbol The symbol the serializer function is being generated for. * @param protocol Name of the protocol being generated. * @return Returns the generated function name. */ static String getSerFunctionName(Symbol symbol, String protocol) { // e.g., serializeAws_restJson1_1ExecuteStatement String functionName = "serialize" + ProtocolGenerator.getSanitizedName(protocol); // Update the function to have a component based on the symbol. functionName += getSerdeFunctionSymbolComponent(symbol, symbol.expectProperty("shape", Shape.class)); return functionName; } /** * @param symbol The symbol the deserializer function is being generated for. * @return Returns the generated function short name. */ static String getSerFunctionShortName(Symbol symbol) { // e.g., se_ES for ExecuteStatement String functionName = "se_"; // Update the function to have a component based on the symbol. functionName += ProtocolGenerator.getSerdeFunctionSymbolComponent( symbol, symbol.expectProperty("shape", Shape.class) ); return functionName; } /** * Generates the name of a serializer function for shapes of a service that is not * protocol-specific. * * @param symbol The symbol the serializer function is being generated for. * @return Returns the generated function name. */ static String getGenericSerFunctionName(Symbol symbol) { // e.g., serializeExecuteStatement return "serialize" + getSerdeFunctionSymbolComponent(symbol, symbol.expectProperty("shape", Shape.class)); } /** * Generates the name of a deserializer function for shapes of a service. * * @param symbol The symbol the deserializer function is being generated for. * @param protocol Name of the protocol being generated. * @return Returns the generated function name. */ static String getDeserFunctionName(Symbol symbol, String protocol) { // e.g., deserializeAws_restJson1_1ExecuteStatement String functionName = "deserialize" + ProtocolGenerator.getSanitizedName(protocol); // Update the function to have a component based on the symbol. functionName += getSerdeFunctionSymbolComponent(symbol, symbol.expectProperty("shape", Shape.class)); return functionName; } /** * @param symbol The symbol the deserializer function is being generated for. * @return Returns the generated function short name. */ static String getDeserFunctionShortName(Symbol symbol) { // e.g., de_ES for ExecuteStatement String functionName = "de_"; // Update the function to have a component based on the symbol. functionName += ProtocolGenerator.getSerdeFunctionSymbolComponent( symbol, symbol.expectProperty("shape", Shape.class) ); return functionName; } /** * Generates the name of a deserializer function for shapes of a service that is not protocol-specific. * * @param symbol The symbol the deserializer function is being generated for. * @return Returns the generated function name. */ static String getGenericDeserFunctionName(Symbol symbol) { // e.g., deserializeExecuteStatement return "deserialize" + getSerdeFunctionSymbolComponent(symbol, symbol.expectProperty("shape", Shape.class)); } static String getSerdeFunctionSymbolComponent(Symbol symbol, Shape shape) { switch (shape.getType()) { case LIST: case SET: case MAP: case DOCUMENT: // These need specialized serializers because they use complex but // non-generated types, so generate a separate name. return shape.getId().getName(); default: return symbol.getName(); } } /** * Returns a map of error names to their {@link ShapeId}. * * @param context the generation context * @param operation the operation shape to retrieve errors for * @return map of error names to {@link ShapeId} */ default Map getOperationErrors(GenerationContext context, OperationShape operation) { return HttpProtocolGeneratorUtils.getOperationErrors(context, operation); } /** * Returns a map of error names to their {@link ShapeId}. * * @param context the generation context * @param operations the operation shapes to retrieve errors for * @return map of error names to {@link ShapeId} */ default Map getOperationErrors(GenerationContext context, Collection operations) { Map errors = new LinkedHashMap<>(); for (OperationShape operation : operations) { errors.putAll(getOperationErrors(context, operation)); } return errors; } /** * @return map of fully qualified shape id to aliases and/or short names that should map to the same error. */ default Map> getErrorAliases( GenerationContext context, Collection operations ) { return Collections.emptyMap(); } /** * Context object used for service serialization and deserialization. */ class GenerationContext { private TypeScriptSettings settings; private Model model; private ServiceShape service; private SymbolProvider symbolProvider; private TypeScriptDelegator writerDelegator; private TypeScriptWriter writer; private String protocolName; private StringStore stringStore = new StringStore(); public TypeScriptSettings getSettings() { return settings; } public void setSettings(TypeScriptSettings settings) { this.settings = settings; } public Model getModel() { return model; } public void setModel(Model model) { this.model = model; } public ServiceShape getService() { return service; } public void setService(ServiceShape service) { this.service = service; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public void setSymbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; } // TODO: Potential refactoring. // Consider whether to use a Builder pattern here (also with toBuilder instead of copy), // where the constructor asserts that both writer/writerDelegator are not set, instead of unsetting the other. // Or consider specialized GenerationContextWithWriter/GenerationContextWithWriterDelegator to use in // corresponding ProtocolGenerator methods that need writer v/s writerDelegator. // OR better refactor to add something like a `areProtocolTestsPresent()` so `generateProtocolTests` is called // and `writer` created only if needed. public TypeScriptDelegator getWriterDelegator() { return writerDelegator; } public void setWriterDelegator(TypeScriptDelegator writerDelegator) { this.writerDelegator = writerDelegator; if (writerDelegator != null) { this.writer = null; } } public TypeScriptWriter getWriter() { return writer; } public void setWriter(TypeScriptWriter writer) { this.writer = writer; if (writer != null) { this.writerDelegator = null; } } public String getProtocolName() { return protocolName; } public void setProtocolName(String protocolName) { this.protocolName = protocolName; } public GenerationContext copy() { GenerationContext copy = new GenerationContext(); copy.setSettings(settings); copy.setModel(model); copy.setService(service); copy.setSymbolProvider(symbolProvider); copy.setWriterDelegator(writerDelegator); copy.setWriter(writer); copy.setProtocolName(protocolName); return copy; } public GenerationContext withWriter(TypeScriptWriter newWriter) { GenerationContext copyContext = copy(); copyContext.setWriter(newWriter); return copyContext; } public StringStore getStringStore() { return stringStore; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/RuntimeClientPlugin.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.function.BiPredicate; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.util.ClientWriterConsumer; import software.amazon.smithy.typescript.codegen.util.CommandWriterConsumer; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; import software.amazon.smithy.utils.StringUtils; import software.amazon.smithy.utils.ToSmithyBuilder; /** * Represents a runtime plugin for a client that hooks into various aspects * of TypeScript code generation, including adding configuration settings * to clients and middleware plugins to both clients and commands. * *

These runtime client plugins are registered through the * {@link TypeScriptIntegration} SPI and applied to the code generator at * build-time. */ @SmithyUnstableApi public final class RuntimeClientPlugin implements ToSmithyBuilder { private final SymbolReference inputConfig; private final SymbolReference resolvedConfig; private final SymbolReference resolveFunction; private final FunctionParamsSupplier additionalResolveFunctionParamsSupplier; private final SymbolReference pluginFunction; private final FunctionParamsSupplier additionalPluginFunctionParamsSupplier; private final SymbolReference destroyFunction; private final BiPredicate servicePredicate; private final OperationPredicate operationPredicate; private final SettingsPredicate settingsPredicate; private final Map writeAdditionalClientParams; private final Map writeAdditionalOperationParams; private RuntimeClientPlugin(Builder builder) { inputConfig = builder.inputConfig; resolvedConfig = builder.resolvedConfig; resolveFunction = builder.resolveFunction; additionalResolveFunctionParamsSupplier = builder.additionalResolveFunctionParamsSupplier; pluginFunction = builder.pluginFunction; additionalPluginFunctionParamsSupplier = builder.additionalPluginFunctionParamsSupplier; destroyFunction = builder.destroyFunction; operationPredicate = builder.operationPredicate; servicePredicate = builder.servicePredicate; settingsPredicate = builder.settingsPredicate; writeAdditionalClientParams = builder.writeAdditionalClientParams; writeAdditionalOperationParams = builder.writeAdditionalOperationParams; boolean allNull = (inputConfig == null) && (resolvedConfig == null) && (resolveFunction == null); boolean allSet = (inputConfig != null) && (resolvedConfig != null) && (resolveFunction != null); if (!(allNull || allSet)) { throw new IllegalStateException( "If any of inputConfig, resolvedConfig, or resolveFunction are set, then all of " + "inputConfig, resolvedConfig, and resolveFunction must be set: inputConfig: " + inputConfig + ", resolvedConfig: " + resolvedConfig + ", resolveFunction: " + resolveFunction ); } if (destroyFunction != null && resolvedConfig == null) { throw new IllegalStateException("resolvedConfig must be set if destroyFunction is set"); } } @FunctionalInterface public interface OperationPredicate { /** * Tests if middleware is applied to an individual operation. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test. * @return Returns true if middleware should be applied to the operation. */ boolean test(Model model, ServiceShape service, OperationShape operation); } @FunctionalInterface public interface SettingsPredicate { /** * Tests if runtime client plugin should be applied based on settings. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param settings Settings from smithy-build configuration. * @return Returns true if runtime client plugin should be applied. */ boolean test(Model model, ServiceShape service, TypeScriptSettings settings); } @FunctionalInterface public interface FunctionParamsSupplier { /** * Returns parameters to be passed to a function which can be computed dynamically. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test. * @return Returns the map of parameters to be passed to a function. The key is the key * for a parameter, and value is the value for a parameter. */ Map apply(Model model, ServiceShape service, OperationShape operation); } /** * Gets the optionally present symbol reference that points to the * Input configuration interface for the plugin. * *

If the plugin has input, then it also must define a * resolved interface, and a resolve function. * *

{@code
     * export interface FooConfigInput {
     *     // ...
     * }
     *
     * export interface FooConfigResolved {
     *     // ...
     * }
     *
     * export function resolveFooConfig(config: FooConfigInput): FooConfigResolved {
     *     return {
     *         ...input,
     *         // more properties...
     *     };
     * }
     * }
* * @return Returns the optionally present input interface symbol. * @see #getResolvedConfig() * @see #getResolveFunction() */ public Optional getInputConfig() { return Optional.ofNullable(inputConfig); } /** * Gets the optionally present symbol reference that points to the * Resolved configuration interface for the plugin. * *

If the plugin has a resolved config, then it also must define * an input interface, and a resolve function. * * @return Returns the optionally present resolved interface symbol. * @see #getInputConfig() * @see #getResolveFunction() */ public Optional getResolvedConfig() { return Optional.ofNullable(resolvedConfig); } /** * Gets the optionally present symbol reference that points to the * function that converts the input configuration type into the * resolved configuration type. * *

If the plugin has a resolve function, then it also must define a * resolved interface and a resolve function. * The referenced function must accept the input type of the plugin * as the first positional argument and optional parameters as additional * positional arguments, and return the resolved interface as the return * value. * * @return Returns the optionally present resolve function. * @see #getInputConfig() * @see #getResolvedConfig() */ public Optional getResolveFunction() { return Optional.ofNullable(resolveFunction); } /** * Gets a list of additional parameters to be supplied to the * resolve function. These parameters are to be supplied to resolve * function as second argument. The map is empty if there are * no additional parameters. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test against. * @return Returns the optionally present map of parameters. The key is the key * for a parameter, and value is the value for a parameter. */ public Map getAdditionalResolveFunctionParameters( Model model, ServiceShape service, OperationShape operation ) { if (additionalResolveFunctionParamsSupplier != null) { return additionalResolveFunctionParamsSupplier.apply(model, service, operation); } return new HashMap(); } /** * Gets the optionally present symbol reference that points to the * function that injects plugin middleware into the middleware stack * of a client or command at runtime. * *

If the plugin has middleware, then the plugin must define a method * that takes the plugin's Resolved configuration as the first argument * and returns a {@code Pluggable}. * *

{@code
     * export function getFooPlugin(
     *   config: FooConfigResolved
     * ): Pluggable => ({
     *   applyToStack: clientStack => {
     *     // add or remove middleware from the stack.
     *   }
     * });
     * }
* * @return Returns the optionally present plugin function. */ public Optional getPluginFunction() { return Optional.ofNullable(pluginFunction); } /** * Gets a list of additional parameters to be supplied to the * plugin function. These parameters are to be supplied to plugin * function as second argument. The map is empty if there are * no additional parameters. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test against. * @return Returns the optionally present map of parameters. The key is the key * for a parameter, and value is the value for a parameter. */ public Map getAdditionalPluginFunctionParameters( Model model, ServiceShape service, OperationShape operation ) { if (additionalPluginFunctionParamsSupplier != null) { return additionalPluginFunctionParamsSupplier.apply(model, service, operation); } return new HashMap<>(); } /** * Gets a list of additional parameters to be supplied to the * plugin function. These parameters are to be supplied to plugin * function as second argument. The map is empty if there are * no additional parameters. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test against. * @return Returns the optionally present map of parameters. The key is the key * for a parameter, and value is the value for a parameter. */ public Map getAdditionalPluginFunctionParameterWriterConsumers( Model model, ServiceShape service, OperationShape operation ) { if (additionalPluginFunctionParamsSupplier != null) { return additionalPluginFunctionParamsSupplier.apply(model, service, operation); } return new HashMap<>(); } /** * Gets the optionally present symbol reference that points to the * function that is used to clean up any resources when a client is * destroyed. * *

The referenced method is expected to take a resolved * configuration interface and destroy any necessary values * (for example, close open connections, deallocate resources, etc). * *

{@code
     * export function destroyFooConfig(config: FooConfigResolved): void {
     *   // destroy configuration values here...
     * }
     * }
* * @return Returns the optionally present destroy function. */ public Optional getDestroyFunction() { return Optional.ofNullable(destroyFunction); } /** * Returns true if this plugin applies to the given service. * *

By default, a plugin applies to all services but not to specific * commands. You an configure a plugin to apply only to a subset of * services (for example, only apply to a known service or a service * with specific traits) or to no services at all (for example, if * the plugin is meant to by command-specific and not on every * command executed by the service). * * @param model The model the service belongs to. * @param service Service shape to test against. * @return Returns true if the plugin is applied to the given service. * @see #matchesOperation(Model, ServiceShape, OperationShape) */ public boolean matchesService(Model model, ServiceShape service) { return servicePredicate.test(model, service); } /** * Returns true if this plugin applies to the given operation. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param operation Operation to test against. * @return Returns true if the plugin is applied to the given operation. * @see #matchesService(Model, ServiceShape) */ public boolean matchesOperation(Model model, ServiceShape service, OperationShape operation) { return operationPredicate.test(model, service, operation); } /** * Returns true if this plugin applies given a smithy-build configuration. * * @param model Model the operation belongs to. * @param service Service the operation belongs to. * @param settings Settings from smithy-build configuration to test against. * @return Returns true if the plugin is applied given a smithy-build configuration. */ public boolean matchesSettings(Model model, ServiceShape service, TypeScriptSettings settings) { return settingsPredicate.test(model, service, settings); } /** * @return the map of additional client level plugin params and their writer consumers used * to populate the param values. */ public Map getClientAddParamsWriterConsumers() { return this.writeAdditionalClientParams; } /** * @return the map of additional operation level plugin params and their writer consumers used * to populate the param values. */ public Map getOperationAddParamsWriterConsumers() { return this.writeAdditionalOperationParams; } public static Builder builder() { return new Builder(); } @Override public Builder toBuilder() { Builder builder = builder() .inputConfig(inputConfig) .resolvedConfig(resolvedConfig) .resolveFunction(resolveFunction) .additionalResolveFunctionParamsSupplier(additionalResolveFunctionParamsSupplier) .pluginFunction(pluginFunction) .additionalPluginFunctionParamsSupplier(additionalPluginFunctionParamsSupplier) .destroyFunction(destroyFunction); // Set these directly since their setters have mutual side-effects. builder.operationPredicate = operationPredicate; builder.servicePredicate = servicePredicate; return builder; } @Override public String toString() { return ("RuntimeClientPlugin{" + "inputConfig=" + inputConfig + ", resolvedConfig=" + resolvedConfig + ", resolveFunction=" + resolveFunction + ", pluginFunction=" + pluginFunction + ", destroyFunction=" + destroyFunction + '}'); } @Override public boolean equals(Object o) { if (this == o) { return true; } else if (!(o instanceof RuntimeClientPlugin)) { return false; } RuntimeClientPlugin that = (RuntimeClientPlugin) o; return (Objects.equals(inputConfig, that.inputConfig) && Objects.equals(resolvedConfig, that.resolvedConfig) && Objects.equals(resolveFunction, that.resolveFunction) && Objects.equals(additionalResolveFunctionParamsSupplier, that.additionalResolveFunctionParamsSupplier) && Objects.equals(pluginFunction, that.pluginFunction) && Objects.equals(additionalPluginFunctionParamsSupplier, that.additionalPluginFunctionParamsSupplier) && Objects.equals(destroyFunction, that.destroyFunction) && servicePredicate.equals(that.servicePredicate) && operationPredicate.equals(that.operationPredicate)); } @Override public int hashCode() { return Objects.hash(inputConfig, resolvedConfig, resolveFunction, pluginFunction, destroyFunction); } /** * Builds an {@code RuntimePlugin}. */ public static final class Builder implements SmithyBuilder { private SymbolReference inputConfig; private SymbolReference resolvedConfig; private SymbolReference resolveFunction; private FunctionParamsSupplier additionalResolveFunctionParamsSupplier; private SymbolReference pluginFunction; private FunctionParamsSupplier additionalPluginFunctionParamsSupplier; private SymbolReference destroyFunction; private BiPredicate servicePredicate = (model, service) -> true; private OperationPredicate operationPredicate = (model, service, operation) -> false; private SettingsPredicate settingsPredicate = (model, service, settings) -> true; private Map writeAdditionalClientParams = Collections.emptyMap(); private Map writeAdditionalOperationParams = Collections.emptyMap(); @Override public RuntimeClientPlugin build() { return new RuntimeClientPlugin(this); } /** * Sets the symbol reference used to configure a client input configuration. * *

If this is set, then both {@link #resolvedConfig} and * {@link #resolveFunction} must also be set. * * @param inputConfig Input configuration symbol to set. * @return Returns the builder. * @see #getInputConfig() */ public Builder inputConfig(SymbolReference inputConfig) { this.inputConfig = inputConfig; return this; } /** * Sets the symbol used to configure a client input configuration. * *

If this is set, then both {@link #resolvedConfig} and * {@link #resolveFunction} must also be set. * * @param inputConfig Input configuration symbol to set. * @return Returns the builder. * @see #getInputConfig() */ public Builder inputConfig(Symbol inputConfig) { return inputConfig(SymbolReference.builder().symbol(inputConfig).build()); } /** * Sets the symbol refernece used to configure a client resolved configuration. * *

If this is set, then both {@link #resolveFunction} and * {@link #inputConfig} must also be set. * * @param resolvedConfig Resolved configuration symbol to set. * @return Returns the builder. * @see #getResolvedConfig() */ public Builder resolvedConfig(SymbolReference resolvedConfig) { this.resolvedConfig = resolvedConfig; return this; } /** * Sets the symbol used to configure a client resolved configuration. * *

If this is set, then both {@link #resolveFunction} and * {@link #inputConfig} must also be set. * * @param resolvedConfig Resolved configuration symbol to set. * @return Returns the builder. * @see #getResolvedConfig() */ public Builder resolvedConfig(Symbol resolvedConfig) { return resolvedConfig(SymbolReference.builder().symbol(resolvedConfig).build()); } /** * Sets the symbol reference that is invoked in order to convert the * input symbol type to a resolved symbol type. * *

If this is set, then both {@link #resolvedConfig} and * {@link #inputConfig} must also be set. * * @param resolveFunction Function used to convert input to resolved. * @return Returns the builder. * @see #getResolveFunction() */ public Builder resolveFunction(SymbolReference resolveFunction) { this.resolveFunction = resolveFunction; return this; } /** * Sets the symbol reference that is invoked in order to convert the * input symbol type to a resolved symbol type. * *

If this is set, then both {@link #resolvedConfig} and * {@link #inputConfig} must also be set. * * @param resolveFunction Function used to convert input to resolved. * @param additionalResolveFunctionParamsSupplier Function which returns params to be passed * as resolve function input. * @return Returns the builder. * @see #getResolveFunction() */ public Builder resolveFunction( SymbolReference resolveFunction, FunctionParamsSupplier additionalResolveFunctionParamsSupplier ) { this.resolveFunction = resolveFunction; this.additionalResolveFunctionParamsSupplier = additionalResolveFunctionParamsSupplier; return this; } /** * Sets the symbol that is invoked in order to convert the * input symbol type to a resolved symbol type. * *

If this is set, then both {@link #resolvedConfig} and * {@link #inputConfig} must also be set. * * @param resolveFunction Function used to convert input to resolved. * @return Returns the builder. * @see #getResolveFunction() */ public Builder resolveFunction(Symbol resolveFunction) { return resolveFunction(SymbolReference.builder().symbol(resolveFunction).build()); } /** * Sets the symbol that is invoked in order to convert the * input symbol type to a resolved symbol type. * *

If this is set, then both {@link #resolvedConfig} and * {@link #inputConfig} must also be set. * * @param resolveFunction Function used to convert input to resolved. * @param additionalResolveFunctionParamsSupplier Function which returns params to be passed * as resolve function input. * @return Returns the builder. * @see #getResolveFunction() */ public Builder resolveFunction( Symbol resolveFunction, FunctionParamsSupplier additionalResolveFunctionParamsSupplier ) { return resolveFunction( SymbolReference.builder().symbol(resolveFunction).build(), additionalResolveFunctionParamsSupplier ); } /** * Set function which returns input parameters to resolve function. Set * function to return empty map to remove the current parameters. * *

If this is set, then all of {@link #resolveFunction}, * {@link #resolvedConfig} and {@link #inputConfig} must also be set. * * @param additionalResolveFunctionParamsSupplier Function which returns params to be passed * as resolve function input. * @return Returns the builder. * @see #getResolveFunction() */ public Builder additionalResolveFunctionParamsSupplier( FunctionParamsSupplier additionalResolveFunctionParamsSupplier ) { this.additionalResolveFunctionParamsSupplier = additionalResolveFunctionParamsSupplier; return this; } /** * Sets a function symbol reference used to configure clients and * commands to use a specific middleware function. * * @param pluginFunction Plugin function symbol to invoke. * @return Returns the builder. * @see #getPluginFunction() */ public Builder pluginFunction(SymbolReference pluginFunction) { this.pluginFunction = pluginFunction; return this; } /** * Sets a function symbol reference used to configure clients and * commands to use a specific middleware function. * * @param pluginFunction Plugin function symbol to invoke. * @param pluginFunctionParamsSupplier Function which returns params to be passed as plugin function input. * @return Returns the builder. * @see #getPluginFunction() */ public Builder pluginFunction( SymbolReference pluginFunction, FunctionParamsSupplier pluginFunctionParamsSupplier ) { this.pluginFunction = pluginFunction; this.additionalPluginFunctionParamsSupplier = pluginFunctionParamsSupplier; return this; } /** * Sets a function symbol used to configure clients and commands to * use a specific middleware function. * * @param pluginFunction Plugin function symbol to invoke. * @return Returns the builder. * @see #getPluginFunction() */ public Builder pluginFunction(Symbol pluginFunction) { return pluginFunction(SymbolReference.builder().symbol(pluginFunction).build()); } /** * Sets a function symbol used to configure clients and commands to * use a specific middleware function. * * @param pluginFunction Plugin function symbol to invoke. * @param additionalPluginFunctionParamsSupplier Function which returns params to be passed * as plugin function input. * @return Returns the builder. * @see #getPluginFunction() */ public Builder pluginFunction( Symbol pluginFunction, FunctionParamsSupplier additionalPluginFunctionParamsSupplier ) { return pluginFunction( SymbolReference.builder().symbol(pluginFunction).build(), additionalPluginFunctionParamsSupplier ); } /** * Set function which returns input parameters to plugin function. Set * function to return empty map to remove the current parameters. * * @param additionalPluginFunctionParamsSupplier Function which returns params to be passed * as plugin function input. * @return Returns the builder. * @see #getPluginFunction() */ public Builder additionalPluginFunctionParamsSupplier( FunctionParamsSupplier additionalPluginFunctionParamsSupplier ) { this.additionalPluginFunctionParamsSupplier = additionalPluginFunctionParamsSupplier; return this; } /** * Sets a function symbol reference to call from a client in the * {@code destroy} function of a TypeScript client. * *

The referenced function takes the resolved configuration * type as the first argument. {@link #resolvedConfig} must be * configured if {@code destroyFunction} is set. * * @param destroyFunction Function to invoke from a client. * @return Returns the builder. * @see #getDestroyFunction() */ public Builder destroyFunction(SymbolReference destroyFunction) { this.destroyFunction = destroyFunction; return this; } /** * Sets a function symbol to call from a client in the {@code destroy} * function of a TypeScript client. * *

The referenced function takes the resolved configuration * type as the first argument. {@link #resolvedConfig} must be * configured if {@code destroyFunction} is set. * * @param destroyFunction Function to invoke from a client. * @return Returns the builder. * @see #getDestroyFunction() */ public Builder destroyFunction(Symbol destroyFunction) { return destroyFunction(SymbolReference.builder().symbol(destroyFunction).build()); } /** * Sets a predicate that determines if the plugin applies to a * specific operation. * *

When this method is called, the {@code servicePredicate} is * automatically configured to return false for every service. * *

By default, a plugin applies globally to a service, which thereby * applies to every operation when the middleware stack is copied. * * @param operationPredicate Operation matching predicate. * @return Returns the builder. * @see #servicePredicate(BiPredicate) */ public Builder operationPredicate(OperationPredicate operationPredicate) { this.operationPredicate = Objects.requireNonNull(operationPredicate); servicePredicate = (model, service) -> false; return this; } /** * Configures a predicate that makes a plugin only apply to a set of * operations that match one or more of the set of given shape names, * and ensures that the plugin is not applied globally to services. * *

By default, a plugin applies globally to a service, which thereby * applies to every operation when the middleware stack is copied. * * @param operationNames Set of operation names. * @return Returns the builder. */ public Builder appliesOnlyToOperations(Set operationNames) { operationPredicate((model, service, operation) -> operationNames.contains(operation.getId().getName())); return servicePredicate((model, service) -> false); } /** * Configures a predicate that applies the plugin to a service if the * predicate matches a given model and service and settings. * *

Setting a custom settings predicate is useful for plugins * that should only be applied based on certain smithy-build * configurations. * * @param settingsPredicate Settings predicate. * @return Returns the builder. */ public Builder settingsPredicate(SettingsPredicate settingsPredicate) { this.settingsPredicate = Objects.requireNonNull(settingsPredicate); return this; } /** * Configures a predicate that applies the plugin to a service if the * predicate matches a given model and service. * *

When this method is called, the {@code operationPredicate} is * automatically configured to return false for every operation, * causing the plugin to only apply to services and not to individual * operations. * *

By default, a plugin applies globally to a service, which * thereby applies to every operation when the middleware stack is * copied. Setting a custom service predicate is useful for plugins * that should only be applied to specific services or only applied * at the operation level. * * @param servicePredicate Service predicate. * @return Returns the builder. * @see #operationPredicate(OperationPredicate) */ public Builder servicePredicate(BiPredicate servicePredicate) { this.servicePredicate = Objects.requireNonNull(servicePredicate); operationPredicate = (model, service, operation) -> false; return this; } /** * Enables access to the writer for adding imports/dependencies. */ public Builder withAdditionalClientParams(Map writeAdditionalClientParams) { // enforce consistent sorting during codegen. this.writeAdditionalClientParams = new TreeMap<>(writeAdditionalClientParams); return this; } /** * Enables access to the writer for adding imports/dependencies. */ public Builder withAdditionalOperationParams( Map writeAdditionalOperationParams ) { // enforce consistent sorting during codegen. this.writeAdditionalOperationParams = new TreeMap<>(writeAdditionalOperationParams); return this; } /** * Configures various aspects of the builder based on naming conventions * defined by the provided {@link Convention} values. * *

If no {@code conventions} are provided, a default value of * {@link Convention#HAS_CONFIG} and {@link Convention#HAS_MIDDLEWARE} * is used. * * @param dependency Dependency to pull the package name and version from. * @param pluginName The name of the plugin that is used when generating * symbol names for each {@code convention}. (for example, "Foo"). * @param conventions Conventions to use when configuring the builder. * @return Returns the builder. */ public Builder withConventions(SymbolDependency dependency, String pluginName, Convention... conventions) { return withConventions(dependency.getPackageName(), dependency.getVersion(), pluginName, conventions); } /** * Configures various aspects of the builder based on naming conventions * defined by the provided {@link Convention} values. * *

If no {@code conventions} are provided, a default value of * {@link Convention#HAS_CONFIG} and {@link Convention#HAS_MIDDLEWARE} * is used. * * @param packageName The name of the package to use as an import and * add as a dependency for each generated symbol * (for example, "foo/baz"). * @param version The version number to use in the symbol dependencies. * (for example, "1.0.0"). * @param pluginName The name of the plugin that is used when generating * symbol names for each {@code convention}. (for example, "Foo"). * @param conventions Conventions to use when configuring the builder. * @return Returns the builder. */ public Builder withConventions( String packageName, String version, String pluginName, Convention... conventions ) { pluginName = StringUtils.capitalize(pluginName); if (conventions.length == 0) { conventions = Convention.DEFAULT; } for (Convention convention : conventions) { switch (convention) { case HAS_CONFIG: inputConfig(Convention.createTypeSymbol(packageName, version, pluginName + "InputConfig")); resolvedConfig( Convention.createTypeSymbol(packageName, version, pluginName + "ResolvedConfig") ); resolveFunction( Convention.createSymbol(packageName, version, "resolve" + pluginName + "Config") ); break; case HAS_MIDDLEWARE: pluginFunction(Convention.createSymbol(packageName, version, "get" + pluginName + "Plugin")); break; case HAS_DESTROY: destroyFunction(Convention.createSymbol(packageName, version, "destroy" + pluginName)); break; default: throw new UnsupportedOperationException("Unexpected switch case: " + convention); } } return this; } } /** * Conventions used in {@link Builder#withConventions}. */ public enum Convention { /** * Whether or not to generate a configuration Input type, Resolved type, * and resolveConfig function. * *

Passing this enum to {@link Builder#withConventions} will cause * the client to resolve configuration using a function named * {@code "resolve" + pluginName + "Config"} (e.g., "resolveFooConfig"), * use an input type named {@code pluginName + "InputConfig"} * (e.g., "FooInputConfig"), and a resolved type named * {@code pluginName + "ResolvedConfig"} (e.g., "FooResolvedConfig"). * * @see #getInputConfig() * @see #getResolvedConfig() * @see #getResolveFunction() */ HAS_CONFIG, /** * Whether or not the plugin applies middleware. * *

Passing this enum to {@link Builder#withConventions} will * cause matching clients and commands to call a function name * {@code "get" + pluginName + "Plugin"} to apply middleware * (e.g., "getFooPlugin"). The referenced function is expected * to accept a resolved configuration type and return a * TypeScript {@code Pluggable}. * * @see #getPluginFunction() */ HAS_MIDDLEWARE, /** * Whether or not the plugin has a destroy method. * *

Passing this enum to {@code withConventions} will cause matching * clients to invoke a method named {@code "destroy" + pluginName} * in the {@code destroy} method of the client (e.g., "destroyFoo"). * The referenced function is expected to accept the resolved * configuration type of the plugin. * * @see #getDestroyFunction() */ HAS_DESTROY; private static final Convention[] DEFAULT = {HAS_CONFIG, HAS_MIDDLEWARE}; private static Symbol createSymbol(String packageName, String version, String name) { return Symbol.builder() .namespace(packageName, "/") .name(name) .addDependency(TypeScriptDependency.NORMAL_DEPENDENCY, basePackageName(packageName), version) .build(); } private static Symbol createTypeSymbol(String packageName, String version, String name) { return Symbol.builder() .namespace(packageName, "/") .name(name) .putProperty("typeOnly", true) .addDependency(TypeScriptDependency.NORMAL_DEPENDENCY, basePackageName(packageName), version) .build(); } /** * Extracts the base npm package name from a potentially submodule-qualified path. * e.g. "@smithy/core/protocols" -> "@smithy/core" */ private static String basePackageName(String packageName) { if (packageName.startsWith("@")) { // Scoped package: @scope/name or @scope/name/submodule int secondSlash = packageName.indexOf('/', packageName.indexOf('/') + 1); if (secondSlash > 0) { return packageName.substring(0, secondSlash); } } return packageName; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/TypeScriptIntegration.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.SmithyIntegration; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.extensions.ExtensionConfigurationInterface; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.utils.SmithyUnstableApi; /** * Java SPI for customizing TypeScript code generation, registering * new protocol code generators, renaming shapes, modifying the model, * adding custom code, etc. */ @SmithyUnstableApi public interface TypeScriptIntegration extends SmithyIntegration { /** * Filters the integration based on {@link TypeScriptSettings}. * * This is annotated as a Smithy Internal API, and may be removed at any point. * * @param settings settings to filter against * @return whether the integration matches the settings or not. */ @SmithyInternalApi default boolean matchesSettings(TypeScriptSettings settings) { return true; } /** * Gets a list of plugins to apply to the generated client. * * @return Returns the list of RuntimePlugins to apply to the client. */ default List getClientPlugins() { return Collections.emptyList(); } /** * Mutates in place the loaded list of plugins to apply to the generated client. */ default void mutateClientPlugins(List plugins) { // defaults to no mutation } /** * Gets a list of protocol generators to register. * * @return Returns the list of protocol generators to register. */ default List getProtocolGenerators() { return Collections.emptyList(); } /** * Adds additional client config interface fields. * *

Implementations of this method are expected to add fields to the * "ClientDefaults" interface of a generated client. This interface * contains fields that are either statically generated from * a model or are dependent on the runtime that a client is running in. * Implementations are expected to write interface field names and * their type signatures, each followed by a semicolon (;). Any number * of fields can be added, and any {@link Symbol} or * {@link SymbolReference} objects that are written to the writer are * automatically imported, and any of their contained * {@link SymbolDependency} values are automatically added to the * generated {@code package.json} file. * *

For example, the following code adds two fields to a client: * *

     * {@code
     * public final class MyIntegration implements TypeScriptIntegration {
     *     public void addConfigInterfaceFields(
     *             TypeScriptSettings settings,
     *             Model model,
     *             SymbolProvider symbolProvider,
     *             TypeScriptWriter writer
     *     ) {
     *         writer.writeDocs("The docs for foo...");
     *         writer.write("foo?: string;"); // Note the trailing semicolon!
     *
     *         writer.writeDocs("The docs for bar...");
     *         writer.write("bar?: string;");
     *     }
     * }
     * }
* * @param settings Settings used to generate. * @param model Model to generate from. * @param symbolProvider Symbol provider used for codegen. * @param writer TypeScript writer to write to. */ default void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { // pass } /** * Adds additional runtime-specific or shared client config values. * *

Implementations of this method are expected to add values to * a runtime-specific or shared configuration object that is used to * provide values for a "ClientDefaults" interface. This method is * invoked for every supported {@link LanguageTarget}. Implementations are * expected to branch on the provided {@code LanguageTarget} and add * the appropriate default values and imports, each followed by a * (,). Any number of key-value pairs can be added, and any {@link Symbol} * or {@link SymbolReference} objects that are written to the writer are * automatically imported, and any of their contained * {@link SymbolDependency} values are automatically added to the * generated {@code package.json} file. * *

For example, the following code adds two values for both the * node and browser targets and ignores the SHARED target: * *

     * {@code
     * public final class MyIntegration implements TypeScriptIntegration {
     *
     *     private static final Logger LOGGER = Logger.getLogger(MyIntegration.class.getName());
     *
     *     public Map> getRuntimeConfigWriters(
     *             TypeScriptSettings settings,
     *             Model model,
     *             SymbolProvider symbolProvider,
     *             LanguageTarget target
     *     ) {
     *         // This is a static value that is added to every generated
     *         // runtimeConfig file.
     *         Map> config = new HashMap<>();
     *         config.put("foo", writer -> {
     *            writer.write("some static value");
     *         });
     *
     *         switch (target) {
     *             case NODE:
     *                 config.put("bar", writer -> {
     *                     writer.write("(() => someNodeValue)"); // Note the parenthesis surrounding arrow functions
     *                 });
     *                 break;
     *             case BROWSER:
     *                 config.put("bar", writer -> {
     *                     writer.write("someBrowserValue");
     *                 });
     *                 break;
     *             case SHARED:
     *                 break;
     *             default:
     *                 LOGGER.warn("Unknown target: " + target);
     *         }
     *         return config;
     *     }
     * }
     * }
* *

The following code adds a value to the runtimeConfig.shared.ts file * so that it used on all platforms. It pulls a trait value from the * service being generated and adds it to the client configuration. Note * that a corresponding entry needs to be added to * {@link #addConfigInterfaceFields} to make TypeScript aware of the * property. * *

     * {@code
     * public final class MyIntegration2 implements TypeScriptIntegration {
     *     public Map> getRuntimeConfigWriters(
     *             TypeScriptSettings settings,
     *             Model model,
     *             SymbolProvider symbolProvider,
     *             LanguageTarget target
     *     ) {
     *         if (target == LanguageTarget.SHARED) {
     *             return MapUtils.of("someTraitValue", writer -> {
     *                 String someTraitValue = settings.getModel(model).getTrait(SomeTrait.class)
     *                             .map(SomeTrait::getValue)
     *                             .orElse("");
     *                 writer.write(someTraitValue);
     *             });
     *         }
     *     }
     * }
     * }
* * @param settings Settings used to generate. * @param model Model to generate from. * @param symbolProvider Symbol provider used for codegen. * @param target The TypeScript language target. * @return Returns a map of config property name and a consumer function with TypeScriptWriter parameter. */ default Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { return Collections.emptyMap(); } /** * Define a list of client configuration interfaces * * A client configuration interface contains settings that modify a service client. * The client configuration interface enables configuring timeouts, retry strategy, etc for the client. * * Multiple interfaces are used to define the client configuration. For example: * *
{@code
     * interface ChecksumConfig {
     *   addChecksumAlgorithm(algo: ChecksumAlgorithm): void;
     *   checksumAlgorithms(): ChecksumAlgorithm[];
     * }
     *
     * interface RetryConfig {
     *   setRetryStrategy(algo: RetryStrategy): void;
     *   retryStrategy(): RetryStrategy;
     * }
     *
     * interface ServiceClientConfiguration extends ChecksumConfig, RetryConfig {
     * }
     * }
* * During code-generation, smithy-typescript will aggregate the interfaces and create a single client configuration. * * @return list of client configuration interface */ default List getExtensionConfigurationInterfaces( Model model, TypeScriptSettings settings ) { return Collections.emptyList(); } /** * Allows the customization to write arbitrary preparatory code prior to the returned config object. */ @SmithyInternalApi default void prepareCustomizations( TypeScriptWriter writer, LanguageTarget target, TypeScriptSettings settings, Model model ) { return; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/knowledge/SerdeElisionIndex.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.knowledge; import java.util.HashMap; import java.util.Map; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.KnowledgeIndex; import software.amazon.smithy.model.selector.Selector; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.ToShapeId; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.JsonNameTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.utils.MapUtils; /** * Index of ShapeIds to a boolean indicating whether a shape's serde function * may be omitted. If the shape is of a certain type, and has no downstream * incompatible shapes or traits that require additional handling, its serde * function may be emitted. */ public class SerdeElisionIndex implements KnowledgeIndex { private final Map elisionBinding = new HashMap<>(); private final Map mutatingTraits = MapUtils.of( "jsonName", JsonNameTrait.ID, "streaming", StreamingTrait.ID, "mediaType", MediaTypeTrait.ID, "sparse", SparseTrait.ID, "idempotencyToken", IdempotencyTokenTrait.ID ); public SerdeElisionIndex(Model model) { for (Shape shape : model.toSet()) { elisionBinding.put(shape.toShapeId(), canBeElided(shape, model)); } } public static SerdeElisionIndex of(Model model) { return model.getKnowledge(SerdeElisionIndex.class, SerdeElisionIndex::new); } public boolean mayElide(ToShapeId id) { return elisionBinding.getOrDefault(id.toShapeId(), false); } private boolean canBeElided(Shape shape, Model model) { if (hasIncompatibleTypes(shape, model, 0)) { return false; } return !hasMutatingTraits(shape, model); } private boolean hasMutatingTraits(Shape shape, Model model) { for (var entry : mutatingTraits.entrySet()) { if (shape.hasTrait(entry.getValue())) { return true; } if (shape instanceof MemberShape memberShape) { if (model.expectShape(memberShape.getTarget()).hasTrait(entry.getValue())) { return true; } } Selector selector = Selector.parse("[id = '" + shape.getId() + "']" + " ~> [trait|" + entry.getKey() + "]"); if (!selector.select(model).isEmpty()) { return true; } } return false; } private boolean hasIncompatibleTypes(Shape shape, Model model, int depth) { if (depth > 10) { return true; // bailout for recursive types. } Shape target = shape; if (shape.isMemberShape()) { target = model.expectShape(shape.asMemberShape().get().getTarget()); } switch (target.getType()) { case LIST: return hasIncompatibleTypes(target.asListShape().get().getMember(), model, depth + 1); case SET: return hasIncompatibleTypes(target.asSetShape().get().getMember(), model, depth + 1); case STRUCTURE: return target .asStructureShape() .get() .getAllMembers() .values() .stream() .anyMatch(s -> hasIncompatibleTypes(s, model, depth + 1)); case UNION: return target .asUnionShape() .get() .getAllMembers() .values() .stream() .anyMatch(s -> hasIncompatibleTypes(s, model, depth + 1)); case MAP: return hasIncompatibleTypes( model.getShape(target.asMapShape().get().getValue().getTarget()).get(), model, depth + 1 ); case BIG_DECIMAL: case BIG_INTEGER: case BLOB: case DOCUMENT: case TIMESTAMP: case DOUBLE: // possible call to parseFloatString or serializeFloat. case FLOAT: // possible call to parseFloatString or serializeFloat. // types that generate parsers. return true; case MEMBER: case OPERATION: case RESOURCE: case SERVICE: // non-applicable types. return false; case BOOLEAN: case BYTE: case ENUM: case INTEGER: case INT_ENUM: case LONG: case SHORT: case STRING: default: // compatible types with no special parser. return false; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/knowledge/ServiceClosure.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.knowledge; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.codegen.core.ReservedWords; import software.amazon.smithy.codegen.core.ReservedWordsBuilder; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.KnowledgeIndex; import software.amazon.smithy.model.knowledge.TopDownIndex; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.PaginatedTrait; import software.amazon.smithy.typescript.codegen.TypeScriptClientCodegenPlugin; import software.amazon.smithy.typescript.codegen.schema.SchemaReferenceIndex; import software.amazon.smithy.typescript.codegen.util.StringStore; import software.amazon.smithy.utils.SmithyInternalApi; import software.amazon.smithy.waiters.WaitableTrait; /** * Retrieves shapes in the service operation closure. */ @SmithyInternalApi public final class ServiceClosure implements KnowledgeIndex { public static final ReservedWords RESERVED_WORDS = new ReservedWordsBuilder() .loadWords(Objects.requireNonNull(TypeScriptClientCodegenPlugin.class.getResource("reserved-words.txt"))) .build(); private static final ShapeId UNIT = ShapeId.from("smithy.api#Unit"); private final Model model; private final ServiceShape service; private final SchemaReferenceIndex elision; /** * For API testing & schemas. */ private final TreeSet operations = new TreeSet<>(); private final TreeSet paginatedOperations = new TreeSet<>(); private final TreeSet waitableOperations = new TreeSet<>(); /** * Note: also contains unions. * For API testing. */ private final TreeSet structuralInterfaces = new TreeSet<>(); /** * For API testing. */ private final TreeSet errors = new TreeSet<>(); /** * For API testing. */ private final TreeSet enums = new TreeSet<>(); /** * For schemas. */ private final TreeSet structureShapes = new TreeSet<>(); /** * For schemas. */ private final TreeSet collectionShapes = new TreeSet<>(); /** * For schemas. */ private final TreeSet mapShapes = new TreeSet<>(); /** * For schemas. */ private final TreeSet unionShapes = new TreeSet<>(); /** * For schemas. */ private final TreeSet simpleShapes = new TreeSet<>(); /** * Used to deconflict schema variable names. * Iteration determinism is desired (ordered set). */ private final TreeSet existsAsSchema = new TreeSet<>(); /** * For schemas. */ private final Set requiresNamingDeconfliction = new HashSet<>(); /** * Used temporarily during initial traversal. */ private final Set scanned = new HashSet<>(); private ServiceClosure(Model model, ServiceShape service) { this.model = model; this.service = service; elision = SchemaReferenceIndex.of(model); TopDownIndex topDown = TopDownIndex.of(model); Set containedOperations = topDown.getContainedOperations(service); operations.addAll(containedOperations); scan(containedOperations); scan(service); scanned.clear(); deconflictSchemaVarNames(); } public static ServiceClosure of(Model model, ServiceShape service) { return model.getKnowledge(ServiceClosure.class, (Model m) -> new ServiceClosure(m, service)); } public TreeSet getStructuralNonErrorShapes() { return structuralInterfaces; } public TreeSet getErrorShapes() { return errors; } public TreeSet getEnums() { return enums; } public TreeSet getWaiterNames() { TreeSet waiters = new TreeSet<>(); for (OperationShape operation : getWaitableOperationShapes()) { operation .getTrait(WaitableTrait.class) .ifPresent(trait -> { trait .getWaiters() .forEach((waiterName, waiter) -> { waiters.add("waitFor" + waiterName); waiters.add("waitUntil" + waiterName); }); }); } return waiters; } public TreeSet getPaginatorNames() { TreeSet paginators = new TreeSet<>(); for (OperationShape operation : getPaginatedOperationShapes()) { operation .getTrait(PaginatedTrait.class) .ifPresent(trait -> { paginators.add("paginate" + operation.getId().getName()); }); } return paginators; } public Set getRequiresNamingDeconfliction() { return requiresNamingDeconfliction; } public TreeSet getSimpleShapes() { return simpleShapes; } public TreeSet getStructureShapes() { return structureShapes; } public TreeSet getUnionShapes() { return unionShapes; } public TreeSet getMapShapes() { return mapShapes; } public TreeSet getCollectionShapes() { return collectionShapes; } public TreeSet getOperationShapes() { return operations; } public TreeSet getPaginatedOperationShapes() { return paginatedOperations; } public TreeSet getWaitableOperationShapes() { return waitableOperations; } /** * @return variable name of the shape's schema, with deconfliction for multiple namespaces with the same * unqualified name. */ public String getShapeSchemaVariableName(Shape shape, StringStore store) { if (shape.getId().equals(ShapeId.from("smithy.api#Unit"))) { return "__Unit"; } String symbolName = RESERVED_WORDS.escape(shape.getId().getName()); if (getRequiresNamingDeconfliction().contains(shape)) { if (null == store) { throw new RuntimeException( "getShapeSchemaVariableName must be called with a StringStore because the shape " + shape.getId().getName() + "requires naming deconfliction." ); } symbolName += "_" + store.var(shape.getId().getNamespace(), "n"); } /* * Although exporting a type and value with the same name is allowed by TS, we * do not want to do this because the structure's interface is not that * of the schema object. * * The name transform deconflicts the interface and structure variable names. * for export at the top level of the same package. */ String suffix = ""; if (shape.isStructureShape() || shape.isUnionShape() || shape.isOperationShape()) { suffix = "$"; } return symbolName + suffix; } /** * This is the existing definition migrated from StructuredMemberWriter, which * writes e.g. `member?: Type | undefined` vs. `member: Type | undefined`, the canonical * client-side modeled optionality. * This differs from the structure member optionality specification in * spec point 3.3.3 */ public boolean isMemberRequiredInClient(MemberShape member) { // Currently the client only generates a default for idempotency tokens. // No default is generated for values with a default value trait. boolean clientGeneratesValue = member.hasTrait(IdempotencyTokenTrait.class); return member.isRequired() && !clientGeneratesValue; } /** * Since we use the short names for schema objects, in rare cases there may be a * naming conflict due to shapes with the same short name in different namespaces. * These shapes will have their variable names deconflicted with a suffix. */ private void deconflictSchemaVarNames() { Set observedShapeNames = new HashSet<>(); for (Shape shape : existsAsSchema) { if (observedShapeNames.contains(shape.getId().getName())) { requiresNamingDeconfliction.add(shape); } else { observedShapeNames.add(shape.getId().getName()); } } } private void scan(Shape shape) { scan(Collections.singletonList(shape)); } private void scan(Set shapes) { scan(new ArrayList<>(shapes)); } private void scan(Collection shapes) { for (Shape shape : shapes) { if (scanned.contains(shape.getId())) { continue; } scanned.add(shape.getId()); if (shape.isMemberShape()) { MemberShape memberShape = (MemberShape) shape; shape = model.expectShape(memberShape.getTarget()); } switch (shape.getType()) { case LIST -> { ListShape listShape = (ListShape) shape; collectionShapes.add(listShape); existsAsSchema.add(listShape); scan(listShape.getMember()); } case SET -> { var setShape = shape.asSetShape().get(); collectionShapes.add(setShape); existsAsSchema.add(setShape); scan(setShape.getMember()); } case MAP -> { MapShape mapShape = (MapShape) shape; mapShapes.add(mapShape); existsAsSchema.add(mapShape); scan(mapShape.getKey()); scan(mapShape.getValue()); } case STRUCTURE, UNION -> { if (shape.isStructureShape()) { structureShapes.add(shape.asStructureShape().get()); } else if (shape.isUnionShape()) { unionShapes.add(shape.asUnionShape().get()); } existsAsSchema.add(shape); if (shape.hasTrait(ErrorTrait.class)) { errors.add(shape); } else if (!shape.getId().equals(UNIT)) { structuralInterfaces.add(shape); } if (shape instanceof StructureShape structureShape) { structureShape.getAllMembers().values().forEach(this::scan); } else if (shape instanceof UnionShape unionShape) { unionShape.getAllMembers().values().forEach(this::scan); } } case OPERATION -> { OperationShape operation = (OperationShape) shape; if (operation.hasTrait(WaitableTrait.ID)) { waitableOperations.add(operation); } if (operation.hasTrait(PaginatedTrait.ID)) { paginatedOperations.add(operation); } if (operation.getInput().isPresent()) { scan(model.expectShape(operation.getInputShape())); } else { scan(model.expectShape(UNIT)); } if (operation.getOutput().isPresent()) { scan(model.expectShape(operation.getOutputShape())); } else { scan(model.expectShape(UNIT)); } operation .getErrors(service) .forEach(error -> { scan(model.expectShape(error)); }); operations.add(operation); existsAsSchema.add(operation); } case SERVICE -> { ServiceShape serviceShape = (ServiceShape) shape; serviceShape .getErrorsSet() .forEach(errorShapeId -> { Shape errorShape = model.expectShape(errorShapeId); scan(errorShape); }); } case BYTE, INT_ENUM, SHORT, INTEGER, LONG, FLOAT, DOUBLE, BIG_INTEGER, BIG_DECIMAL, BOOLEAN, STRING, TIMESTAMP, DOCUMENT, ENUM, BLOB -> { if (shape.isEnumShape() || shape.isIntEnumShape() || shape.hasTrait(EnumTrait.class)) { enums.add(shape); } if (elision.traits.hasSchemaTraits(shape)) { existsAsSchema.add(shape); } simpleShapes.add(shape); } default -> { // ... } } } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/AddProtocols.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols; import java.util.List; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.typescript.codegen.protocols.cbor.SmithyRpcV2Cbor; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds Smithy protocols. */ @SmithyInternalApi public class AddProtocols implements TypeScriptIntegration { @Override public List getProtocolGenerators() { return ListUtils.of(new SmithyRpcV2Cbor()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/ProtocolPriorityConfig.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import software.amazon.smithy.model.shapes.ShapeId; /** * Allows customization of protocol selection for specific services or a global default ordering. */ public final class ProtocolPriorityConfig { private final Map> serviceProtocolPriorityCustomizations; private final List customDefaultPriority; public ProtocolPriorityConfig( Map> serviceProtocolPriorityCustomizations, List customDefaultPriority ) { this.serviceProtocolPriorityCustomizations = Objects.requireNonNullElseGet( serviceProtocolPriorityCustomizations, HashMap::new ); this.customDefaultPriority = customDefaultPriority; } /** * @param serviceShapeId - service scope. * @return priority order of protocols or null if no override exists. */ public List getProtocolPriority(ShapeId serviceShapeId) { return serviceProtocolPriorityCustomizations.getOrDefault( serviceShapeId, customDefaultPriority != null ? new ArrayList<>(customDefaultPriority) : null ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/SmithyProtocolUtils.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.model.knowledge.NeighborProviderIndex; import software.amazon.smithy.model.neighbor.Walker; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeVisitor; import software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestCase; import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase; import software.amazon.smithy.typescript.codegen.HttpProtocolTestGenerator; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.utils.SmithyInternalApi; /** * Utility methods for generating Smithy protocols. */ @SmithyInternalApi public final class SmithyProtocolUtils { private SmithyProtocolUtils() {} /** * Writes a serde function for a set of shapes using the passed visitor. * This will walk the input set of shapes and invoke the visitor for any * members of aggregate shapes in the set. * * @see software.amazon.smithy.typescript.codegen.integration.DocumentShapeSerVisitor * @see software.amazon.smithy.typescript.codegen.integration.DocumentShapeDeserVisitor * * @param context The generation context. * @param shapes A list of shapes to generate serde for, including their members. * @param visitor A ShapeVisitor that generates a serde function for shapes. */ public static void generateDocumentBodyShapeSerde( ProtocolGenerator.GenerationContext context, Set shapes, ShapeVisitor visitor ) { Walker shapeWalker = new Walker(NeighborProviderIndex.of(context.getModel()).getProvider()); Set shapesToGenerate = new TreeSet<>(shapes); shapes.forEach(shape -> shapesToGenerate.addAll(shapeWalker.walkShapes(shape))); shapesToGenerate.forEach(shape -> shape.accept(visitor)); } public static void generateProtocolTests(ProtocolGenerator generator, ProtocolGenerator.GenerationContext context) { new HttpProtocolTestGenerator( context, generator, SmithyProtocolUtils::filterProtocolTests, SmithyProtocolUtils::filterMalformedRequestTests ).run(); } private static boolean filterProtocolTests( ServiceShape service, OperationShape operation, HttpMessageTestCase testCase, TypeScriptSettings settings ) { if (testCase.getTags().contains("defaults")) { return true; } // TODO(cbor): enable test when it's working with vitest 3.x if ( settings.generateSchemas() && (testCase.getId().equals("RpcV2CborInvalidGreetingError") || testCase.getId().equals("RpcV2CborComplexError") || testCase.getId().equals("RpcV2CborEmptyComplexError")) ) { return true; } return false; } private static boolean filterMalformedRequestTests( ServiceShape service, OperationShape operation, HttpMalformedRequestTestCase testCase, TypeScriptSettings settings ) { // Handling overflow/underflow of longs in JS is extraordinarily tricky. // Numbers are actually all 62-bit floats, and so any integral number is // limited to 53 bits. In typical JS fashion, a value outside of this // range just kinda silently bumbles on in some third state between valid // and invalid. Infuriatingly, there doesn't seem to be a consistent way // to detect this. We could *try* to do bounds checking, but the constants // we use wouldn't necessarily work, so it could work in some environments // but not others. if (operation.getId().getName().equals("MalformedLong") && testCase.hasTag("underflow/overflow")) { return true; } return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborMemberDeserVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import software.amazon.smithy.model.knowledge.HttpBinding; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.integration.DocumentMemberDeserVisitor; import software.amazon.smithy.typescript.codegen.integration.HttpProtocolGeneratorUtils; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; public class CborMemberDeserVisitor extends DocumentMemberDeserVisitor { private final String dataSource; private final ProtocolGenerator.GenerationContext context; /** * Constructor. * * @param context The generation context. * @param dataSource The in-code location of the data to provide an output of * ({@code output.foo}, {@code entry}, etc.) */ public CborMemberDeserVisitor(ProtocolGenerator.GenerationContext context, String dataSource) { super(context, dataSource, TimestampFormatTrait.Format.EPOCH_SECONDS); this.context = context; context.getWriter() .addImportSubmodule("_json", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); this.serdeElisionEnabled = !context.getSettings().generateServerSdk(); this.dataSource = dataSource; } /** * This differs from the base method in that CBOR does not need to wrap * the blob value in `context.base64Decoder(...)`. The CBOR format deserializer * already does this whereas e.g. JSON.parse does not. */ @Override public String blobShape(BlobShape shape) { return dataSource; } /** * Converted to bigint by the cbor codec. */ @Override public String bigIntegerShape(BigIntegerShape shape) { if (context.getSettings().getBigNumberMode().equals("big.js")) { context.getWriter().addImport("Big", "__Big", TypeScriptDependency.BIG_JS); return "__Big(String(" + dataSource + "))"; } return dataSource; } /** * Converted to NumericValue by the cbor codec. */ @Override public String bigDecimalShape(BigDecimalShape shape) { if (context.getSettings().getBigNumberMode().equals("big.js")) { context.getWriter().addImport("Big", "__Big", TypeScriptDependency.BIG_JS); return "__Big(String(" + dataSource + "))"; } return dataSource; } /** * Smithy RPCv2 CBOR only allows the epoch-seconds format, ignoring the model's * timestamp trait. */ @Override public String timestampShape(TimestampShape shape) { return HttpProtocolGeneratorUtils.getTimestampOutputParam( context.getWriter(), dataSource, HttpBinding.Location.DOCUMENT, shape, TimestampFormatTrait.Format.EPOCH_SECONDS, requiresNumericEpochSecondsInPayload(), context.getSettings().generateClient() ); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborMemberSerVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.integration.DocumentMemberSerVisitor; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; public class CborMemberSerVisitor extends DocumentMemberSerVisitor { private final String dataSource; private final ProtocolGenerator.GenerationContext context; /** * Constructor. * * @param context The generation context. * @param dataSource The in-code location of the data to provide an input of * ({@code input.foo}, {@code entry}, etc.) */ public CborMemberSerVisitor(ProtocolGenerator.GenerationContext context, String dataSource) { super(context, dataSource, TimestampFormatTrait.Format.EPOCH_SECONDS); this.context = context; this.serdeElisionEnabled = true; this.dataSource = dataSource; } /** * This differs from the base method in that CBOR does not need to wrap * the blob value in `context.base64Encoder(...)`. The CBOR format serializer * already does this whereas e.g. JSON.stringify does not. */ @Override public String blobShape(BlobShape shape) { return dataSource; } /** * +/- Infinity and NaN have byte representations. No need to * serialize those values with serializeFloat(). */ @Override public String floatShape(FloatShape shape) { return dataSource; } /** * +/- Infinity and NaN have byte representations. No need to * serialize those values with serializeFloat(). */ @Override public String doubleShape(DoubleShape shape) { return dataSource; } /** * Use bigint from JS. */ @Override public String bigIntegerShape(BigIntegerShape shape) { if (context.getSettings().getBigNumberMode().equals("big.js")) { return "BigInt(" + dataSource + ")"; } return dataSource; } /** * Use NumericValue from \@smithy/core/serde. */ @Override public String bigDecimalShape(BigDecimalShape shape) { context.getWriter().addImportSubmodule("nv", "__nv", TypeScriptDependency.SMITHY_CORE, "/serde"); return "__nv(" + dataSource + ")"; } /** * CBOR serialization needs a JS object identifiable as a tag. */ @Override public String timestampShape(TimestampShape shape) { context .getWriter() .addImportSubmodule( "dateToTag", "__dateToTag", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); return "__dateToTag(" + dataSource + ")"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborShapeDeserVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import java.util.Map; import java.util.TreeMap; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.NumberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.DocumentShapeDeserVisitor; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.util.PropertyAccessor; import software.amazon.smithy.typescript.codegen.validation.UnaryFunctionCall; public class CborShapeDeserVisitor extends DocumentShapeDeserVisitor { public CborShapeDeserVisitor(ProtocolGenerator.GenerationContext context) { super(context); this.serdeElisionEnabled = true; } @Override protected void deserializeCollection(ProtocolGenerator.GenerationContext context, CollectionShape shape) { TypeScriptWriter writer = context.getWriter(); Shape target = context.getModel().expectShape(shape.getMember().getTarget()); String potentialFilter = ""; if (!shape.hasTrait(SparseTrait.ID)) { potentialFilter = ".filter((e: any) => e != null)"; } final String filterExpression = potentialFilter; String returnExpression = target.accept(getMemberVisitor("entry")); if (returnExpression.equals("entry")) { writer.write("const collection = (output || [])$L", filterExpression); } else { writer.openBlock( "const collection = (output || [])$L.map((entry: any) => {", "});", filterExpression, () -> { if (filterExpression.isEmpty()) { writer.openBlock("if (entry === null) {", "}", () -> { if (!shape.hasTrait(SparseTrait.ID)) { writer.write( "throw new TypeError('All elements of the non-sparse list $S must be non-null.');", shape.getId() ); } else { writer.write("return null as any;"); } }); } writer.write( "return $L$L;", target.accept(getMemberVisitor("entry")), usesExpect(target) ? " as any" : "" ); } ); } writer.write("return collection;"); } @Override protected void deserializeDocument(ProtocolGenerator.GenerationContext context, DocumentShape shape) { context .getWriter() .write( """ return output; // document. """ ); } @Override protected void deserializeMap(ProtocolGenerator.GenerationContext context, MapShape shape) { TypeScriptWriter writer = context.getWriter(); Shape target = context.getModel().expectShape(shape.getValue().getTarget()); SymbolProvider symbolProvider = context.getSymbolProvider(); writer.openBlock( "return Object.entries(output).reduce((acc: $T, [key, value]: [string, any]) => {", "", symbolProvider.toSymbol(shape), () -> { writer.openBlock("if (value !== null) {", "}", () -> { writer.write( "acc[key as $T] = $L$L", symbolProvider.toSymbol(shape.getKey()), target.accept(getMemberVisitor("value")), usesExpect(target) ? " as any;" : ";" ); }); if (shape.hasTrait(SparseTrait.ID)) { writer.write("else {").indent(); writer.write("acc[key as $T] = null as any;", symbolProvider.toSymbol(shape.getKey())).dedent(); writer.write("}"); } writer.write("return acc;"); } ); writer.writeInline("}, {} as $T);", symbolProvider.toSymbol(shape)); } @Override protected void deserializeStructure(ProtocolGenerator.GenerationContext context, StructureShape shape) { TypeScriptWriter writer = context.getWriter(); Map members = new TreeMap<>(shape.getAllMembers()); writer.addImportSubmodule("take", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); writer.openBlock("return take(output, {", "}) as any;", () -> { members.forEach((memberName, memberShape) -> { Shape target = context.getModel().expectShape(memberShape.getTarget()); String propertyAccess = PropertyAccessor.getFrom("output", memberName); String value = target.accept(getMemberVisitor("_")); if (usesExpect(target)) { if (UnaryFunctionCall.check(value)) { writer.write("'$L': $L,", memberName, UnaryFunctionCall.toRef(value)); } else { writer.write("'$L': $L,", memberName, "_ => " + value); } } else { String valueExpression = target.accept(getMemberVisitor(propertyAccess)); if (valueExpression.equals(propertyAccess)) { writer.write("'$1L': [],", memberName); } else { String functionExpression = value; boolean isUnaryCall = UnaryFunctionCall.check(functionExpression); if (isUnaryCall) { writer.write("'$1L': $2L,", memberName, UnaryFunctionCall.toRef(functionExpression)); } else { writer.write("'$1L': (_: any) => $2L,", memberName, functionExpression); } } } }); }); } @Override protected void deserializeUnion(ProtocolGenerator.GenerationContext context, UnionShape shape) { TypeScriptWriter writer = context.getWriter(); Model model = context.getModel(); Map members = new TreeMap<>(shape.getAllMembers()); members.forEach((memberName, memberShape) -> { Shape target = model.expectShape(memberShape.getTarget()); String memberValue = target.accept(getMemberVisitor(PropertyAccessor.getFrom("output", memberName))); if (usesExpect(target)) { writer.openBlock("if ($L !== undefined) {", "}", memberValue, () -> { writer.write("return { $L: $L as any }", memberName, memberValue); }); } else { writer.openBlock("if ($1L != null) {", "}", PropertyAccessor.getFrom("output", memberName), () -> { writer.write( """ return { $L: $L } """, memberName, memberValue ); }); } }); writer.write("return { $$unknown: Object.entries(output)[0] };"); } private CborMemberDeserVisitor getMemberVisitor(String dataSource) { return new CborMemberDeserVisitor(getContext(), dataSource); } private boolean usesExpect(Shape shape) { return (shape.isStringShape() || shape.isBooleanShape() || (shape instanceof NumberShape && !shape.isBigDecimalShape() && !shape.isBigIntegerShape())); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborShapeSerVisitor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import java.util.Map; import java.util.TreeMap; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.DocumentMemberSerVisitor; import software.amazon.smithy.typescript.codegen.integration.DocumentShapeSerVisitor; import software.amazon.smithy.typescript.codegen.integration.HttpProtocolGeneratorUtils; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.validation.UnaryFunctionCall; public class CborShapeSerVisitor extends DocumentShapeSerVisitor { /** * The service model's timestampFormat is ignored in RPCv2 CBOR protocol. */ private static final TimestampFormatTrait.Format TIMESTAMP_FORMAT = TimestampFormatTrait.Format.EPOCH_SECONDS; public CborShapeSerVisitor(ProtocolGenerator.GenerationContext context) { super(context); this.serdeElisionEnabled = true; } @Override protected void serializeCollection(ProtocolGenerator.GenerationContext context, CollectionShape shape) { TypeScriptWriter writer = context.getWriter(); Shape target = context.getModel().expectShape(shape.getMember().getTarget()); String potentialFilter = ""; boolean hasSparseTrait = shape.hasTrait(SparseTrait.ID); if (!hasSparseTrait) { potentialFilter = ".filter((e: any) => e != null)"; } String returnedExpression = target.accept(getMemberVisitor("entry")); if (returnedExpression.equals("entry")) { writer.write("return input$L;", potentialFilter); } else { writer.openBlock("return input$L.map(entry => {", "});", potentialFilter, () -> { if (hasSparseTrait) { writer.write("if (entry === null) { return null as any; }"); } writer.write("return $L;", target.accept(getMemberVisitor("entry"))); }); } } @Override protected void serializeDocument(ProtocolGenerator.GenerationContext context, DocumentShape shape) { context .getWriter() .write( """ return input; // document. """ ); } @Override protected void serializeMap(ProtocolGenerator.GenerationContext context, MapShape shape) { TypeScriptWriter writer = context.getWriter(); Shape target = context.getModel().expectShape(shape.getValue().getTarget()); SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol keySymbol = symbolProvider.toSymbol(shape.getKey()); String entryKeyType = keySymbol.toString().equals("string") ? "string" : symbolProvider.toSymbol(shape.getKey()) + "| string"; writer.openBlock( "return Object.entries(input).reduce((acc: Record, " + "[key, value]: [$1L, any]) => {", "}, {});", entryKeyType, () -> { writer.write( """ if (value !== null) { acc[key] = $L; } """, target.accept(getMemberVisitor("value")) ); if (shape.hasTrait(SparseTrait.ID)) { writer.write( """ else { acc[key] = null as any; } """ ); } writer.write("return acc;"); } ); } @Override protected void serializeStructure(ProtocolGenerator.GenerationContext context, StructureShape shape) { TypeScriptWriter writer = context.getWriter(); writer.addImportSubmodule("take", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); writer.openBlock("return take(input, {", "});", () -> { Map members = new TreeMap<>(shape.getAllMembers()); members.forEach((memberName, memberShape) -> { Shape target = context.getModel().expectShape(memberShape.getTarget()); String valueExpression = (memberShape.hasTrait(TimestampFormatTrait.class) ? HttpProtocolGeneratorUtils.getTimestampInputParam(context, "_", memberShape, TIMESTAMP_FORMAT) : target.accept(getMemberVisitor("_"))); String valueProvider = "_ => " + valueExpression; boolean isUnaryCall = UnaryFunctionCall.check(valueExpression); if (memberShape.hasTrait(IdempotencyTokenTrait.class)) { writer.addImportSubmodule( "v4", "generateIdempotencyToken", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.SERDE ); writer.write("'$L': [true, _ => _ ?? generateIdempotencyToken()],", memberName); } else { if (valueProvider.equals("_ => _")) { writer.write("'$1L': [],", memberName); } else if (isUnaryCall) { writer.write("'$1L': $2L,", memberName, UnaryFunctionCall.toRef(valueExpression)); } else { writer.write("'$1L': $2L,", memberName, valueProvider); } } }); }); } @Override protected void serializeUnion(ProtocolGenerator.GenerationContext context, UnionShape shape) { TypeScriptWriter writer = context.getWriter(); Model model = context.getModel(); ServiceShape serviceShape = context.getService(); writer.openBlock("return $L.visit(input, {", "});", shape.getId().getName(serviceShape), () -> { Map members = new TreeMap<>(shape.getAllMembers()); members.forEach((memberName, memberShape) -> { Shape target = model.expectShape(memberShape.getTarget()); writer.write( "$L: value => ({ $S: $L }),", memberName, memberName, target.accept(getMemberVisitor("value")) ); }); writer.write("_: (name, value) => ({ [name]: value } as any)"); }); } private DocumentMemberSerVisitor getMemberVisitor(String dataSource) { return new CborMemberSerVisitor(getContext(), dataSource); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/protocols/cbor/SmithyRpcV2Cbor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.protocol.traits.Rpcv2CborTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.EventStreamGenerator; import software.amazon.smithy.typescript.codegen.integration.HttpProtocolGeneratorUtils; import software.amazon.smithy.typescript.codegen.integration.HttpRpcProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndex; import software.amazon.smithy.typescript.codegen.protocols.SmithyProtocolUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generator for Smithy RPCv2 CBOR. * * @see CborShapeSerVisitor * @see CborShapeDeserVisitor * @see CborMemberSerVisitor * @see CborMemberDeserVisitor * @see SmithyProtocolUtils */ @SmithyInternalApi public class SmithyRpcV2Cbor extends HttpRpcProtocolGenerator { public SmithyRpcV2Cbor() { super(true); } @Override public void generateSharedComponents(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer .addImportSubmodule( "parseCborBody", "parseBody", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ) .addImportSubmodule( "parseCborErrorBody", "parseErrorBody", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ) .addImportSubmodule( "loadSmithyRpcV2CborErrorCode", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); ServiceShape service = context.getService(); deserializingErrorShapes.forEach(error -> generateErrorDeserializer(context, error)); eventStreamGenerator.generateEventStreamSerializers( context, service, getDocumentContentType(), () -> { writer.addImportSubmodule( "cbor", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); writer.write("body = cbor.serialize(body);"); }, serializingDocumentShapes ); Set errorEventShapes = new TreeSet<>(); SerdeElisionIndex serdeElisionIndex = SerdeElisionIndex.of(context.getModel()); eventStreamGenerator.generateEventStreamDeserializers( context, service, errorEventShapes, deserializingDocumentShapes, true, enableSerdeElision(), serdeElisionIndex ); errorEventShapes.removeIf(deserializingErrorShapes::contains); errorEventShapes.forEach(error -> generateErrorDeserializer(context, error)); generateDocumentBodyShapeSerializers(context, serializingDocumentShapes); generateDocumentBodyShapeDeserializers(context, deserializingDocumentShapes); SymbolReference requestType = getApplicationProtocol().getRequestType(); SymbolReference responseType = getApplicationProtocol().getResponseType(); HttpProtocolGeneratorUtils.generateMetadataDeserializer(context, responseType); writer .addImportSubmodule("collectBody", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.PROTOCOLS); if (context.getSettings().generateClient()) { writer.addImportSubmodule( "withBaseException", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT ); SymbolReference exception = HttpProtocolGeneratorUtils.getClientBaseException(context); writer.write("const throwDefaultError = withBaseException($T);", exception); } writer.addUseImports(requestType); writer.addTypeImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); writer.addTypeImport("HeaderBag", "__HeaderBag", TypeScriptDependency.SMITHY_TYPES); writer.addImportSubmodule( "buildHttpRpcRequest", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); writeSharedRequestHeaders(context); writer.write(""); writer.write(context.getStringStore().flushVariableDeclarationCode()); } @Override public ShapeId getProtocol() { return Rpcv2CborTrait.ID; } @Override public void generateProtocolTests(GenerationContext generationContext) { SmithyProtocolUtils.generateProtocolTests(this, generationContext); } @Override protected String getDocumentContentType() { return "application/cbor"; } @Override protected void generateDocumentBodyShapeSerializers(GenerationContext generationContext, Set shapes) { SmithyProtocolUtils.generateDocumentBodyShapeSerde( generationContext, shapes, new CborShapeSerVisitor(generationContext) ); } @Override protected void generateDocumentBodyShapeDeserializers(GenerationContext generationContext, Set shapes) { SmithyProtocolUtils.generateDocumentBodyShapeSerde( generationContext, shapes, new CborShapeDeserVisitor(generationContext) ); } @Override protected void generateOperationDeserializer(GenerationContext context, OperationShape operation) { SymbolProvider symbolProvider = context.getSymbolProvider(); Symbol symbol = symbolProvider.toSymbol(operation); SymbolReference responseType = getApplicationProtocol().getResponseType(); TypeScriptWriter writer = context.getWriter(); writer.addUseImports(responseType); String methodName = ProtocolGenerator.getDeserFunctionShortName(symbol); String methodLongName = ProtocolGenerator.getDeserFunctionName(symbol, getName()); String errorMethodName = "de_CommandError"; String serdeContextType = CodegenUtils.getOperationDeserializerContextType( context.getSettings(), writer, context.getModel(), operation ); Symbol outputType = symbol.expectProperty("outputType", Symbol.class); writer.writeDocs(methodLongName); writer.openBlock(""" export const $L = async ( output: $T, context: $L ): Promise<$T> => {""", "};", methodName, responseType, serdeContextType, outputType, () -> { writer.addImportSubmodule( "checkCborResponse", "cr", TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); writer.write("cr(output);"); writer.write( """ if (output.statusCode >= 300) { return $L(output, context); } """, errorMethodName ); readResponseBody(context, operation); writer.write( """ const response: $T = { $$metadata: deserializeMetadata(output), $L }; return response; """, outputType, operation .getOutput() .map(o -> "...contents,") .orElse("") ); }); writer.write(""); } @Override protected String getOperationPath(GenerationContext generationContext, OperationShape operationShape) { TypeScriptSettings settings = generationContext.getSettings(); Model model = generationContext.getModel(); ServiceShape service = settings.getService(model); String serviceName = service.getId().getName(); String operationName = operationShape.getId().getName(); return "/service/%s/operation/%s".formatted(serviceName, operationName); } @Override protected void serializeInputDocument( GenerationContext generationContext, OperationShape operationShape, StructureShape inputStructure ) { TypeScriptWriter writer = generationContext.getWriter(); writer.addImportSubmodule("cbor", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR); writer.write( "body = cbor.serialize($L);", inputStructure.accept(new CborMemberSerVisitor(generationContext, "input")) ); } @Override protected void writeErrorCodeParser(GenerationContext generationContext) { TypeScriptWriter writer = generationContext.getWriter(); writer.addImportSubmodule( "loadSmithyRpcV2CborErrorCode", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CBOR ); writer.write("const errorCode = loadSmithyRpcV2CborErrorCode(output, parsedOutput.body);"); } @Override protected void deserializeOutputDocument( GenerationContext generationContext, OperationShape operationShape, StructureShape outputStructure ) { TypeScriptWriter writer = generationContext.getWriter(); writer.write("contents = $L;", outputStructure.accept(new CborMemberDeserVisitor(generationContext, "data"))); } @Override protected void writeSharedRequestHeaders(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer.addTypeImport("HeaderBag", "__HeaderBag", TypeScriptDependency.SMITHY_TYPES); writer.openBlock("const SHARED_HEADERS: __HeaderBag = {", "};", () -> { writer.write("'content-type': $S,", getDocumentContentType()); writer.write( """ "smithy-protocol": "rpc-v2-cbor", "accept": "application/cbor", """ ); }); } @Override protected boolean enableSerdeElision() { return true; } @Override protected void writeRequestHeaders(GenerationContext context, OperationShape operation) { TypeScriptWriter writer = context.getWriter(); boolean hasEventStreamOutput = EventStreamGenerator.hasEventStreamOutput(context, operation); boolean hasEventStreamInput = EventStreamGenerator.hasEventStreamInput(context, operation); boolean inputIsEmpty = operation.getInput().isEmpty(); boolean mutatesDefaultHeader = hasEventStreamOutput | hasEventStreamInput | inputIsEmpty; if (mutatesDefaultHeader) { writer.write("const headers: __HeaderBag = { ...SHARED_HEADERS };"); } else { writer.write("const headers: __HeaderBag = SHARED_HEADERS;"); } if (hasEventStreamOutput) { writer.write( """ headers.accept = "application/vnd.amazon.eventstream"; """ ); } if (hasEventStreamInput) { writer.write( """ headers["content-type"] = "application/vnd.amazon.eventstream"; """ ); } else if (inputIsEmpty) { writer.write( """ delete headers["content-type"]; """ ); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaGenerationAllowlist.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.util.Collections; import java.util.HashSet; import java.util.Set; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.protocol.traits.Rpcv2CborTrait; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.SmithyInternalApi; /** * * Controls rollout of schema generation. * */ @SmithyInternalApi public abstract class SchemaGenerationAllowlist { private static final Set ALLOWED = Collections.synchronizedSet(new HashSet<>()); private static final Set PROTOCOLS = Collections.synchronizedSet(new HashSet<>()); static { ALLOWED.add(ShapeId.from("smithy.protocoltests.rpcv2Cbor#RpcV2Protocol")); ALLOWED.add(ShapeId.from("org.xyz.v1#XYZService")); PROTOCOLS.add(Rpcv2CborTrait.ID); } public static boolean allows(ShapeId serviceShapeId, TypeScriptSettings settings) { boolean generateClient = settings.generateClient(); boolean allowedByProtocol = PROTOCOLS.contains(settings.getProtocol()); boolean allowedByName = ALLOWED.contains(serviceShapeId); return settings.generateSchemas() && generateClient && (allowedByProtocol || allowedByName); } @Deprecated public static void allow(String serviceShapeId) { ALLOWED.add(ShapeId.from(serviceShapeId)); } public static void allow(ShapeId serviceShapeId) { ALLOWED.add(serviceShapeId); } public static void allowProtocol(ShapeId protocolShapeId) { PROTOCOLS.add(protocolShapeId); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.build.FileManifest; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.knowledge.ServiceClosure; import software.amazon.smithy.typescript.codegen.util.StringStore; import software.amazon.smithy.utils.SmithyInternalApi; /** * Generates schema objects used to define shape (de)serialization. */ @SmithyInternalApi public class SchemaGenerator implements Runnable { public static final String SCHEMAS_FOLDER = "schemas"; private final SchemaReferenceIndex elision; private final TypeScriptSettings settings; private final SymbolProvider symbolProvider; private final Model model; private final FileManifest fileManifest; private final StringStore store = new StringStore(); private final TypeScriptWriter writer = new TypeScriptWriter(""); private final ServiceClosure closure; private final Set errorRegistries = new TreeSet<>(); public SchemaGenerator( Model model, FileManifest fileManifest, TypeScriptSettings settings, SymbolProvider symbolProvider ) { this.model = model; this.fileManifest = fileManifest; closure = ServiceClosure.of(model, settings.getService(model)); elision = SchemaReferenceIndex.of(model); this.settings = settings; this.symbolProvider = symbolProvider; writer.write( """ /* eslint no-var: 0 */""" ); } /** * Writes all schemas for the model to a schemas.ts file. */ @Override public void run() { for (ServiceShape service : model.getServiceShapes()) { if (!SchemaGenerationAllowlist.allows(service.getId(), settings)) { return; } } writeBaseError(); writeErrors(); closure.getSimpleShapes().forEach(this::writeSimpleSchema); closure.getStructureShapes().forEach(this::writeStructureSchema); closure.getCollectionShapes().forEach(this::writeListSchema); closure.getMapShapes().forEach(this::writeMapSchema); closure.getUnionShapes().forEach(this::writeUnionSchema); closure.getOperationShapes().forEach(this::writeOperationSchema); String stringConstants = store.flushVariableDeclarationCode(); boolean hasContent = !writer.toString().matches("/\\* eslint no-var: 0 \\*/[\\s\\n]+$"); if (hasContent) { fileManifest.writeFile( Paths.get(CodegenUtils.SOURCE_FOLDER, SCHEMAS_FOLDER, "schemas_0.ts").toString(), stringConstants + "\n" + writer ); } } /** * @return variable name of the shape's schema, with deconfliction for multiple namespaces with the same * unqualified name. */ private String getShapeVariableName(Shape shape) { return closure.getShapeSchemaVariableName(shape, store); } /** * Writes the schema declaration for a simple shape. * If it has no runtime traits, e.g. a plain string, nothing will be written. */ private void writeSimpleSchema(Shape shape) { if (elision.traits.hasSchemaTraits(shape)) { writer.addTypeImport("StaticSimpleSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.writeInline( """ var $L: StaticSimpleSchema = [0, $L, $L,\s""", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()) ); writeTraits(shape); writer.writeInline(", $L];", resolveSimpleSchema(shape, shape)); writer.ensureNewline(); } } private void writeStructureSchema(StructureShape shape) { checkedWriteSchema(shape, () -> { if (!shape.hasTrait(ErrorTrait.class)) { writer.addTypeImport("StaticStructureSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.openBlock( """ export var $L: StaticStructureSchema = [3, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> doWithMembers(shape) ); } }); } private void writeErrors() { for (Shape shape : closure.getErrorShapes()) { String ns = store.var(shape.getId().getNamespace(), "n"); String errorRegistryVarName = ns + "_registry"; if (!errorRegistries.contains(errorRegistryVarName)) { writer.addImportSubmodule("TypeRegistry", null, TypeScriptDependency.SMITHY_CORE, "/schema"); writer.write( """ const $L = TypeRegistry.for($L);""", errorRegistryVarName, ns ); errorRegistries.add(errorRegistryVarName); } } for (Shape shape : closure.getErrorShapes()) { Optional errorShapeOpt = shape.asStructureShape(); if (errorShapeOpt.isPresent()) { String ns = store.var(shape.getId().getNamespace(), "n"); String errorRegistryVarName = ns + "_registry"; String exceptionCtorSymbolName = ServiceClosure.RESERVED_WORDS.escape(shape.getId().getName()); writer.addTypeImport("StaticErrorSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.addRelativeImport(exceptionCtorSymbolName, null, Paths.get("..", "models", "errors")); writer.openBlock( """ export var $L: StaticErrorSchema = [-3, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> doWithMembers(shape) ); StructureShape errorShape = errorShapeOpt.get(); errorShape.expectTrait(ErrorTrait.class); writer.write( """ $L.registerError($L, $L);""", errorRegistryVarName, getShapeVariableName(shape), exceptionCtorSymbolName ); } } writer.writeDocs(""" TypeRegistry instances containing modeled errors. @internal """); writer.openBlock("export const errorTypeRegistries = [", "]", () -> { for (String errorRegistry : errorRegistries) { writer.write("$L,", errorRegistry); } }); } /** * Writes the synthetic base exception schema. */ private void writeBaseError() { String serviceName = CodegenUtils.getServiceName(settings, model, symbolProvider); String syntheticBaseExceptionName = CodegenUtils.getSyntheticBaseExceptionName(serviceName, model); String schemaSymbolName = syntheticBaseExceptionName + "$"; String namespace = settings.getService(model).getId().getNamespace(); writer.addTypeImport("StaticErrorSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.addRelativeImport( syntheticBaseExceptionName, null, Paths.get("..", "models", syntheticBaseExceptionName) ); String syntheticNamespace = store.var("smithy.ts.sdk.synthetic." + namespace); String syntheticNamespaceTypeRegistry = syntheticNamespace + "_registry"; writer.addImportSubmodule("TypeRegistry", null, TypeScriptDependency.SMITHY_CORE, "/schema"); writer.write( """ const $L = TypeRegistry.for($L);""", syntheticNamespaceTypeRegistry, syntheticNamespace ); errorRegistries.add(syntheticNamespaceTypeRegistry); writer.write( """ export var $L: StaticErrorSchema = [-3, $L, $S, 0, [], []];""", schemaSymbolName, syntheticNamespace, syntheticBaseExceptionName ); writer.write( """ $L.registerError($L, $L);""", syntheticNamespaceTypeRegistry, schemaSymbolName, syntheticBaseExceptionName ); } private void writeUnionSchema(UnionShape shape) { checkedWriteSchema(shape, () -> { writer.addTypeImport("StaticUnionSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.openBlock( """ export var $L: StaticUnionSchema = [4, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> doWithMembers(shape) ); }); } /** * Handles the member entries for unions/structures. */ private void doWithMembers(Shape shape) { writeTraits(shape); long requiredMemberCount = 0; List orderedNames = new ArrayList<>(); List orderedMembers = new ArrayList<>(); for (MemberShape m : shape.getAllMembers().values()) { if (closure.isMemberRequiredInClient(m)) { requiredMemberCount += 1; orderedNames.add(m.getMemberName()); orderedMembers.add(m); } } for (MemberShape m : shape.getAllMembers().values()) { if (!closure.isMemberRequiredInClient(m)) { orderedNames.add(m.getMemberName()); orderedMembers.add(m); } } assert orderedNames.size() == orderedMembers.size(); assert orderedNames.size() == shape.getAllMembers().size(); // member names. writer.write(","); writer.writeInline("["); orderedNames .forEach((memberName) -> { writer.writeInline("$L, ", store.var(memberName)); }); writer.unwrite(", "); writer.write("],"); // member schemas. writer.writeInline("["); orderedMembers .forEach((member) -> { String ref = resolveSchema(shape, member); if (elision.traits.hasSchemaTraits(member)) { writer.writeInline("[$L, ", ref); writeTraits(member); writer.writeInline("], "); } else { writer.writeInline("$L, ", ref); } }); writer.unwrite(", "); if (requiredMemberCount > 0 && shape.isStructureShape()) { writer.write("], $L", Objects.toString(requiredMemberCount)); } else { writer.write("]"); } } private void writeListSchema(CollectionShape shape) { checkedWriteSchema(shape, () -> { writer.addTypeImport("StaticListSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.openBlock( """ var $L: StaticListSchema = [1, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> this.doWithMember(shape, shape.getMember()) ); }); } private void writeMapSchema(MapShape shape) { checkedWriteSchema(shape, () -> { writer.addTypeImport("StaticMapSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.openBlock( """ var $L: StaticMapSchema = [2, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> this.doWithMember(shape, shape.getKey(), shape.getValue()) ); }); } /** * Write member schema insertion for lists. */ private void doWithMember(Shape shape, MemberShape memberShape) { writeTraits(shape); String ref = resolveSchema(shape, memberShape); if (elision.traits.hasSchemaTraits(memberShape)) { writer.openBlock(", [$L, ", "]", ref, () -> { writeTraits(memberShape); }); } else { writer.write(", $L", ref); } } /** * Write member schema insertion for maps. */ private void doWithMember(Shape shape, MemberShape keyShape, MemberShape memberShape) { writeTraits(shape); String keyRef = resolveSchema(shape, keyShape); String valueRef = resolveSchema(shape, memberShape); if (elision.traits.hasSchemaTraits(memberShape) || elision.traits.hasSchemaTraits(keyShape)) { writer.openBlock(", [$L, ", "]", keyRef, () -> { writeTraits(keyShape); }); writer.openBlock(", [$L, ", "]", valueRef, () -> { writeTraits(memberShape); }); } else { writer.write(", $L, $L", keyRef, valueRef); } } private void writeOperationSchema(OperationShape shape) { writer.addTypeImport("StaticOperationSchema", null, TypeScriptDependency.SMITHY_TYPES); writer.openBlock( """ export var $L: StaticOperationSchema = [9, $L, $L,""", "];", getShapeVariableName(shape), store.var(shape.getId().getNamespace(), "n"), store.var(shape.getId().getName()), () -> { writeTraits(shape); writer.write( """ , () => $L, () => $L""", getShapeVariableName(model.expectShape(shape.getInputShape())), getShapeVariableName(model.expectShape(shape.getOutputShape())) ); } ); } private void writeTraits(Shape shape) { String traitCode = new SchemaTraitWriter(shape, elision, store).toString(); writer.writeInline(traitCode.replace("$", "$$")); } /** * Checks whether ok to write minimized schema. */ private void checkedWriteSchema(Shape shape, Runnable schemaWriteFn) { if (shape.getId().getNamespace().equals("smithy.api") && shape.getId().getName().equals("Unit")) { // special signal value for operation input/output. writer.write( """ var __Unit = "unit" as const;""" ); } else if (!elision.isReferenceSchema(shape) && !elision.traits.hasSchemaTraits(shape)) { String sentinel = this.resolveSchema(model.expectShape(ShapeId.from("smithy.api#Unit")), shape); boolean exportable = shape.isStructureShape() || shape.isUnionShape() || shape.isOperationShape(); if (exportable) { writer.write( """ export var $L = $L;""", getShapeVariableName(shape), sentinel ); } else { writer.write( """ var $L = $L;""", getShapeVariableName(shape), sentinel ); } } else { schemaWriteFn.run(); } } /** * @return generally the symbol name of the target shape, but sometimes a sentinel value for special types like * blob and timestamp. */ private String resolveSchema(Shape context, Shape shape) { MemberShape memberShape = null; if (shape instanceof MemberShape ms) { memberShape = ms; shape = model.expectShape(memberShape.getTarget()); } boolean isReference = elision.isReferenceSchema(shape); boolean hasTraits = elision.traits.hasSchemaTraits(shape); if (!hasTraits) { try { return resolveSimpleSchema(context, memberShape != null ? memberShape : shape); } catch (IllegalArgumentException ignored) { // } } return (isReference || hasTraits ? "() => " : "") + getShapeVariableName(shape); } /** * @return a sentinel value representing a preconfigured schema type. * @throws IllegalArgumentException when no sentinel value exists, e.g. a non-simple schema was passed in. */ private String resolveSimpleSchema(Shape context, Shape shape) { MemberShape memberShape = null; if (shape instanceof MemberShape ms) { memberShape = ms; shape = model.expectShape(memberShape.getTarget()); } ShapeType type = shape.getType(); switch (type) { case BOOLEAN -> { return "2"; } case STRING, ENUM -> { return "0"; } case TIMESTAMP -> { Optional trait = shape.getTrait(TimestampFormatTrait.class); if (memberShape != null && memberShape.hasTrait(TimestampFormatTrait.class)) { trait = memberShape.getTrait(TimestampFormatTrait.class); } return trait .map(timestampFormatTrait -> switch (timestampFormatTrait.getValue()) { case "date-time" -> "5"; case "http-date" -> "6"; case "epoch-seconds" -> "7"; default -> "4"; }) .orElse("4"); } case BLOB -> { if (shape.hasTrait(StreamingTrait.class)) { return "42"; } return "21"; } case BYTE, SHORT, INTEGER, INT_ENUM, LONG, FLOAT, DOUBLE -> { return "1"; } case DOCUMENT -> { return "15"; } case BIG_INTEGER -> { return "17"; } case BIG_DECIMAL -> { return "19"; } case LIST, SET, MAP -> { return resolveSimpleSchemaNestedContainer(context, shape); } default -> { // } } throw new IllegalArgumentException("shape is not simple"); } /** * For example, the number 5 represents a timestamp (Date-Time) schema with no other traits. * For lists, the bit modifier 64 is applied, giving 64 | 5 for a list of timestamps. * For further nested containers, bit masks can no longer be used, necessitating the `sim` simple schema * wrapper: `sim("namespace", "ListOfLists", 64 | 5, {});`. * * @return the container bit modifier attached to the schema numeric value. */ private String resolveSimpleSchemaNestedContainer(Shape context, Shape shape) { Shape contained; String staticTypePrefix; String sentinel; String keySchema = ""; switch (shape.getType()) { case LIST -> { contained = shape.asListShape().get().getMember(); staticTypePrefix = "[1, "; sentinel = "64"; writer.addTypeImport("StaticListSchema", null, TypeScriptDependency.SMITHY_TYPES); } case MAP -> { contained = shape.asMapShape().get().getValue(); staticTypePrefix = "[2, "; keySchema = this.resolveSimpleSchema(context, shape.asMapShape().get().getKey()) + ", "; sentinel = "128"; writer.addTypeImport("StaticMapSchema", null, TypeScriptDependency.SMITHY_TYPES); } default -> { throw new IllegalArgumentException( "call to resolveSimpleSchemaNestedContainer with incompatible shape type." ); } } if (contained.isMemberShape()) { contained = model.expectShape(contained.asMemberShape().get().getTarget()); } if (contained.isListShape() || contained.isMapShape()) { String schemaVarName = store.var(shape.getId().getName()); return (staticTypePrefix + store.var(shape.getId().getNamespace(), "n") + ", " + schemaVarName + ", 0, " + keySchema + this.resolveSimpleSchema(context, contained) + "]"); } else { return sentinel + " | " + this.resolveSimpleSchema(context, contained); } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaReferenceIndex.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.KnowledgeIndex; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeType; import software.amazon.smithy.utils.SmithyInternalApi; /** * Can determine whether a Schema can be defined by a sentinel value. */ @SmithyInternalApi public final class SchemaReferenceIndex implements KnowledgeIndex { public final SchemaTraitFilterIndex traits; private final Model model; SchemaReferenceIndex(Model model) { this.model = model; traits = SchemaTraitFilterIndex.of(model); } public static SchemaReferenceIndex of(Model model) { return model.getKnowledge(SchemaReferenceIndex.class, SchemaReferenceIndex::new); } /** * A reference shape is a function pointer to a shape that doesn't have a constant numeric * sentinel value. * Simple non-aggregate types and lists/maps of those types are considered non-reference * in TypeScript. * * @return whether shape is a reference shape. */ public boolean isReferenceSchema(Shape shape) { Shape targetShape = shape; if (shape instanceof MemberShape member) { targetShape = model.expectShape(member.getTarget()); } ShapeType type = targetShape.getType(); switch (type) { case STRING, BOOLEAN, BYTE, DOUBLE, FLOAT, SHORT, INTEGER, LONG, ENUM, INT_ENUM, BIG_INTEGER, BIG_DECIMAL, TIMESTAMP, BLOB, DOCUMENT -> { return false; } case LIST, SET, MAP -> { if (shape instanceof CollectionShape collection) { return isReferenceSchema(collection.getMember()); } else if (shape instanceof MapShape map) { return isReferenceSchema(map.getValue()); } return true; } default -> { return true; } } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitExtension.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.util.HashMap; import java.util.Map; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.Trait; public final class SchemaTraitExtension { public static final SchemaTraitExtension INSTANCE = new SchemaTraitExtension(); private final Map customization = new HashMap<>(); private SchemaTraitExtension() {} public void add(ShapeId traitShapeId, TraitRenderer traitRenderer) { customization.put(traitShapeId, traitRenderer); } public String render(Trait trait) { return customization.get(trait.toShapeId()).render(trait); } public boolean contains(Trait trait) { return contains(trait.toShapeId()); } public boolean contains(ShapeId trait) { return customization.containsKey(trait); } public interface TraitRenderer { String render(Trait trait); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitFilterIndex.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.TreeSet; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.KnowledgeIndex; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.AuthDefinitionTrait; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.EventHeaderTrait; import software.amazon.smithy.model.traits.EventPayloadTrait; import software.amazon.smithy.model.traits.HostLabelTrait; import software.amazon.smithy.model.traits.HttpErrorTrait; import software.amazon.smithy.model.traits.HttpHeaderTrait; import software.amazon.smithy.model.traits.HttpLabelTrait; import software.amazon.smithy.model.traits.HttpPayloadTrait; import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait; import software.amazon.smithy.model.traits.HttpQueryParamsTrait; import software.amazon.smithy.model.traits.HttpQueryTrait; import software.amazon.smithy.model.traits.HttpResponseCodeTrait; import software.amazon.smithy.model.traits.HttpTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.JsonNameTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.ProtocolDefinitionTrait; import software.amazon.smithy.model.traits.RequiresLengthTrait; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.traits.XmlAttributeTrait; import software.amazon.smithy.model.traits.XmlFlattenedTrait; import software.amazon.smithy.model.traits.XmlNameTrait; import software.amazon.smithy.model.traits.XmlNamespaceTrait; import software.amazon.smithy.utils.SetUtils; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class SchemaTraitFilterIndex implements KnowledgeIndex { private static final Set EXCLUDED_TRAITS = SetUtils.of( // excluded due to special schema handling. TimestampFormatTrait.ID ); /** * All of these are added by scanning the ProtocolDefinition and AuthDefinition meta traits. * The hard coded initial list is shown as an example of what this set contains. */ private final Set includedTraits = new HashSet<>( // (wrapped for mutability) SetUtils.of( SparseTrait.ID, // Shape serde SensitiveTrait.ID, IdempotencyTokenTrait.ID, JsonNameTrait.ID, // Shape serde MediaTypeTrait.ID, // JSON shape serde XmlAttributeTrait.ID, // XML shape serde XmlFlattenedTrait.ID, // XML shape serde XmlNameTrait.ID, // XML shape serde XmlNamespaceTrait.ID, // XML shape serde StreamingTrait.ID, // HttpBindingProtocol handles streaming + payload members. EndpointTrait.ID, // HttpProtocol ErrorTrait.ID, // set by the ServiceException runtime classes. RequiresLengthTrait.ID, // unhandled EventHeaderTrait.ID, // @smithy/core/event-streams::EventStreamSerde EventPayloadTrait.ID, // @smithy/core/event-streams::EventStreamSerde // afaict, HttpErrorTrait is ignored by the client. The discriminator selects the error structure // but the actual HTTP response status code is used with no particular comparison // with the trait's error code. HttpErrorTrait.ID, // the following HTTP traits are handled by HTTP binding protocol base class. HttpTrait.ID, HttpHeaderTrait.ID, HttpQueryTrait.ID, HttpLabelTrait.ID, HttpPayloadTrait.ID, HttpPrefixHeadersTrait.ID, HttpQueryParamsTrait.ID, HttpResponseCodeTrait.ID, HostLabelTrait.ID ) ); private final Map cache = new HashMap<>(); private final Model model; SchemaTraitFilterIndex(Model model) { Set protocolDefinitionTraits = model.getShapesWithTrait(ProtocolDefinitionTrait.class); Set authDefinitionTraits = model.getShapesWithTrait(AuthDefinitionTrait.class); Set definitionTraits = new TreeSet<>(); definitionTraits.addAll(protocolDefinitionTraits); definitionTraits.addAll(authDefinitionTraits); for (Shape shape : definitionTraits) { shape .getTrait(ProtocolDefinitionTrait.class) .ifPresent(protocolDefinitionTrait -> { protocolDefinitionTrait .getTraits() .forEach(traitShapeId -> { if (!EXCLUDED_TRAITS.contains(traitShapeId)) { includedTraits.add(traitShapeId); } }); }); } this.model = model; for (Shape shape : model.toSet()) { cache.put(shape, hasSchemaTraits(shape)); } } public static SchemaTraitFilterIndex of(Model model) { return model.getKnowledge(SchemaTraitFilterIndex.class, SchemaTraitFilterIndex::new); } /** * @param traitShapeId - query. * @return whether trait should be included in schema generation. */ public boolean includeTrait(ShapeId traitShapeId) { return includedTraits.contains(traitShapeId) || SchemaTraitExtension.INSTANCE.contains(traitShapeId); } /** * This operation is cached on call. * * @param shape - structure or member, usually. * @return whether it has at least 1 trait that is needed in a schema. */ public boolean hasSchemaTraits(Shape shape) { return hasSchemaTraits(shape, 0); } private boolean hasSchemaTraits(Shape shape, int depth) { if (cache.containsKey(shape)) { return cache.get(shape); } if (depth > 20) { return false; } boolean hasSchemaTraits = shape .getAllTraits() .values() .stream() .map(Trait::toShapeId) .anyMatch(this::includeTrait); if (hasSchemaTraits) { cache.put(shape, true); return true; } boolean membersHaveSchemaTraits = shape .getAllMembers() .values() .stream() .anyMatch(ms -> hasSchemaTraits(ms, depth + 1)); boolean targetHasSchemaTraits = shape .asMemberShape() .map(ms -> hasSchemaTraits(model.expectShape(ms.getTarget()), depth + 1)) .orElse(false); cache.put(shape, membersHaveSchemaTraits || targetHasSchemaTraits); return cache.get(shape); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitGenerator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.util.Objects; import java.util.Set; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.AnnotationTrait; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.EventHeaderTrait; import software.amazon.smithy.model.traits.EventPayloadTrait; import software.amazon.smithy.model.traits.HostLabelTrait; import software.amazon.smithy.model.traits.HttpChecksumRequiredTrait; import software.amazon.smithy.model.traits.HttpErrorTrait; import software.amazon.smithy.model.traits.HttpHeaderTrait; import software.amazon.smithy.model.traits.HttpLabelTrait; import software.amazon.smithy.model.traits.HttpPayloadTrait; import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait; import software.amazon.smithy.model.traits.HttpQueryParamsTrait; import software.amazon.smithy.model.traits.HttpQueryTrait; import software.amazon.smithy.model.traits.HttpResponseCodeTrait; import software.amazon.smithy.model.traits.HttpTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.JsonNameTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.RequiresLengthTrait; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.StringTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.traits.XmlAttributeTrait; import software.amazon.smithy.model.traits.XmlFlattenedTrait; import software.amazon.smithy.model.traits.XmlNameTrait; import software.amazon.smithy.model.traits.XmlNamespaceTrait; import software.amazon.smithy.typescript.codegen.util.StringStore; import software.amazon.smithy.utils.SetUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Creates the string representing a trait's data. * For presence-based trait, essentially boolean, a 1 or 2 will be used. */ @SmithyInternalApi public class SchemaTraitGenerator { private static final String ANNOTATION_TRAIT_VALUE = "1"; private static final Set ANNOTATION_TRAITS = SetUtils.of( XmlAttributeTrait.ID, XmlFlattenedTrait.ID, EventHeaderTrait.ID, EventPayloadTrait.ID, StreamingTrait.ID, RequiresLengthTrait.ID, HttpLabelTrait.ID, HttpPayloadTrait.ID, HttpQueryParamsTrait.ID, HttpResponseCodeTrait.ID, HttpChecksumRequiredTrait.ID, HostLabelTrait.ID, SparseTrait.ID, SensitiveTrait.ID, IdempotencyTokenTrait.ID ); /** * Data traits are traits with one or more fields of data. * To allow for the possibility of the traits adding new fields, * the generated schema object MUST be an array with consistent ordering and size * for the fields' data. */ private static final Set DATA_TRAITS = SetUtils.of( HttpErrorTrait.ID, HttpTrait.ID, EndpointTrait.ID, XmlNamespaceTrait.ID ); private static final Set STRING_TRAITS = SetUtils.of( TimestampFormatTrait.ID, JsonNameTrait.ID, MediaTypeTrait.ID, XmlNameTrait.ID, HttpHeaderTrait.ID, HttpQueryTrait.ID, HttpPrefixHeadersTrait.ID, ErrorTrait.ID ); public String serializeTraitData(Trait trait, StringStore stringStore) { if (trait instanceof TimestampFormatTrait) { // this is overridden by {@link SchemaGenerator::resolveSchema} return ""; } else if (STRING_TRAITS.contains(trait.toShapeId()) && trait instanceof StringTrait strTrait) { return stringStore.var(strTrait.getValue()); } else if (ANNOTATION_TRAITS.contains(trait.toShapeId()) && trait instanceof AnnotationTrait) { return ANNOTATION_TRAIT_VALUE; } else if (DATA_TRAITS.contains(trait.toShapeId())) { if (trait instanceof EndpointTrait endpointTrait) { return """ ["%s"]""".formatted(endpointTrait.getHostPrefix()); } else if (trait instanceof XmlNamespaceTrait xmlNamespaceTrait) { return """ [%s, %s]""".formatted( stringStore.var(xmlNamespaceTrait.getPrefix().orElse("")), stringStore.var(xmlNamespaceTrait.getUri()) ); } else if (trait instanceof HttpErrorTrait httpError) { return Objects.toString(httpError.getCode()); } else if (trait instanceof HttpTrait httpTrait) { return """ ["%s", "%s", %s]""".formatted(httpTrait.getMethod(), httpTrait.getUri(), httpTrait.getCode()); } } else if (SchemaTraitExtension.INSTANCE.contains(trait)) { return SchemaTraitExtension.INSTANCE.render(trait); } String name = """ `%s`""".formatted(trait.getClass().getSimpleName()); if (trait instanceof StringTrait stringTrait) { return """ /* unhandled trait\s""" + name + " */ " + stringStore.var(stringTrait.getValue()); } else if (trait instanceof AnnotationTrait) { return """ /* unhandled trait\s""" + name + " */ " + ANNOTATION_TRAIT_VALUE; } return """ /* unhandled trait\s""" + name + " */ void 0"; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitWriter.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import java.util.List; import java.util.Objects; import java.util.TreeMap; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.HttpLabelTrait; import software.amazon.smithy.model.traits.HttpPayloadTrait; import software.amazon.smithy.model.traits.HttpQueryParamsTrait; import software.amazon.smithy.model.traits.HttpResponseCodeTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.IdempotentTrait; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.typescript.codegen.util.StringStore; class SchemaTraitWriter { private final Shape shape; private final SchemaReferenceIndex elision; private final StringStore stringStore; private final StringBuilder buffer = new StringBuilder(); private final List compressTraits = List.of( HttpLabelTrait.ID, IdempotentTrait.ID, IdempotencyTokenTrait.ID, SensitiveTrait.ID, HttpPayloadTrait.ID, HttpResponseCodeTrait.ID, HttpQueryParamsTrait.ID ); private final SchemaTraitGenerator traitGenerator = new SchemaTraitGenerator(); SchemaTraitWriter(Shape shape, SchemaReferenceIndex elision, StringStore stringStore) { this.shape = shape; this.elision = elision; this.stringStore = stringStore; } /** * @return either the numeric bitvector or object representation of * the traits on the input shape. */ @Override public String toString() { if (mayUseCompressedTraits()) { writeTraitsBitVector(); } else { writeTraitsObject(); } return buffer.toString(); } private boolean mayUseCompressedTraits() { return shape .getAllTraits() .values() .stream() .map(Trait::toShapeId) .filter(elision.traits::includeTrait) .allMatch(compressTraits::contains); } private void writeTraitsBitVector() { int bits = 0; for (int i = 0; i < compressTraits.size(); ++i) { if (shape.hasTrait(compressTraits.get(i))) { bits |= (1 << i); } } buffer.append(Objects.toString(bits)); } private void writeTraitsObject() { buffer.append("{ "); new TreeMap<>(shape.getAllTraits()) .forEach((shapeId, trait) -> { if (!elision.traits.includeTrait(trait.toShapeId())) { return; } buffer.append( """ [%s]: %s,\s""".formatted( stringStore.var(shapeId.getName()), traitGenerator.serializeTraitData(trait, stringStore) ) ); }); buffer.deleteCharAt(buffer.length() - 1); buffer.deleteCharAt(buffer.length() - 1); buffer.append(" }"); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/ClientBodyExtraCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class ClientBodyExtraCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final List integrations; private final List runtimeClientPlugins; private final ApplicationProtocol applicationProtocol; private ClientBodyExtraCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private SymbolProvider symbolProvider; private List integrations; private List runtimeClientPlugins; private ApplicationProtocol applicationProtocol; @Override public ClientBodyExtraCodeSection build() { return new ClientBodyExtraCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/ClientConfigCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class ClientConfigCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final List integrations; private final List runtimeClientPlugins; private final ApplicationProtocol applicationProtocol; private ClientConfigCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private SymbolProvider symbolProvider; private List integrations; private List runtimeClientPlugins; private ApplicationProtocol applicationProtocol; @Override public ClientConfigCodeSection build() { return new ClientConfigCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/ClientConstructorCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class ClientConstructorCodeSection implements CodeSection { private final ServiceShape service; private final List runtimeClientPlugins; private final Model model; private ClientConstructorCodeSection(Builder builder) { service = SmithyBuilder.requiredState("service", builder.service); runtimeClientPlugins = SmithyBuilder.requiredState("runtimePlugins", builder.runtimeClientPlugins); model = SmithyBuilder.requiredState("model", builder.model); } public static Builder builder() { return new Builder(); } public ServiceShape getService() { return service; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Model getModel() { return model; } public static class Builder implements SmithyBuilder { private ServiceShape service; private List runtimeClientPlugins; private Model model; @Override public ClientConstructorCodeSection build() { return new ClientConstructorCodeSection(this); } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder model(Model model) { this.model = model; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/ClientDestroyCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class ClientDestroyCodeSection implements CodeSection { private final List runtimeClientPlugins; private ClientDestroyCodeSection(Builder builder) { runtimeClientPlugins = SmithyBuilder.requiredState("runtimePlugins", builder.runtimeClientPlugins); } public static Builder builder() { return new Builder(); } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public static class Builder implements SmithyBuilder { private List runtimeClientPlugins; @Override public ClientDestroyCodeSection build() { return new ClientDestroyCodeSection(this); } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/ClientPropertiesCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class ClientPropertiesCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final SymbolProvider symbolProvider; private final List integrations; private final ApplicationProtocol applicationProtocol; private ClientPropertiesCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); integrations = SmithyBuilder.requiredState("integrations", builder.integrations); applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getIntegrations() { return integrations; } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private SymbolProvider symbolProvider; private List integrations; private ApplicationProtocol applicationProtocol; @Override public ClientPropertiesCodeSection build() { return new ClientPropertiesCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder integrations(List integrations) { this.integrations = integrations; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/CommandBodyExtraCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class CommandBodyExtraCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private CommandBodyExtraCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public CommandBodyExtraCodeSection build() { return new CommandBodyExtraCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/CommandConstructorCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class CommandConstructorCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private CommandConstructorCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public CommandConstructorCodeSection build() { return new CommandConstructorCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/CommandContextCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class CommandContextCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private CommandContextCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public CommandContextCodeSection build() { return new CommandContextCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/CommandPropertiesCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class CommandPropertiesCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private CommandPropertiesCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public CommandPropertiesCodeSection build() { return new CommandPropertiesCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/PreCommandClassCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class PreCommandClassCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private PreCommandClassCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public PreCommandClassCodeSection build() { return new PreCommandClassCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/sections/SmithyContextCodeSection.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.sections; import java.util.List; import java.util.Optional; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.utils.CodeSection; import software.amazon.smithy.utils.SmithyBuilder; import software.amazon.smithy.utils.SmithyUnstableApi; @SmithyUnstableApi public final class SmithyContextCodeSection implements CodeSection { private final TypeScriptSettings settings; private final Model model; private final ServiceShape service; private final OperationShape operation; private final SymbolProvider symbolProvider; private final List runtimeClientPlugins; private final ProtocolGenerator protocolGenerator; private final ApplicationProtocol applicationProtocol; private SmithyContextCodeSection(Builder builder) { settings = SmithyBuilder.requiredState("settings", builder.settings); model = SmithyBuilder.requiredState("model", builder.model); service = SmithyBuilder.requiredState("service", builder.service); operation = SmithyBuilder.requiredState("operation", builder.operation); symbolProvider = SmithyBuilder.requiredState("symbolProvider", builder.symbolProvider); runtimeClientPlugins = SmithyBuilder.requiredState("runtimeClientPlugins", builder.runtimeClientPlugins); protocolGenerator = builder.protocolGenerator; applicationProtocol = SmithyBuilder.requiredState("applicationProtocol", builder.applicationProtocol); } public static Builder builder() { return new Builder(); } public TypeScriptSettings getSettings() { return settings; } public Model getModel() { return model; } public ServiceShape getService() { return service; } public OperationShape getOperation() { return operation; } public SymbolProvider getSymbolProvider() { return symbolProvider; } public List getRuntimeClientPlugins() { return runtimeClientPlugins; } public Optional getProtocolGenerator() { return Optional.ofNullable(protocolGenerator); } public ApplicationProtocol getApplicationProtocol() { return applicationProtocol; } public static class Builder implements SmithyBuilder { private TypeScriptSettings settings; private Model model; private ServiceShape service; private OperationShape operation; private SymbolProvider symbolProvider; private List runtimeClientPlugins; private ProtocolGenerator protocolGenerator; private ApplicationProtocol applicationProtocol; @Override public SmithyContextCodeSection build() { return new SmithyContextCodeSection(this); } public Builder settings(TypeScriptSettings settings) { this.settings = settings; return this; } public Builder model(Model model) { this.model = model; return this; } public Builder service(ServiceShape service) { this.service = service; return this; } public Builder operation(OperationShape operation) { this.operation = operation; return this; } public Builder symbolProvider(SymbolProvider symbolProvider) { this.symbolProvider = symbolProvider; return this; } public Builder runtimeClientPlugins(List runtimeClientPlugins) { this.runtimeClientPlugins = runtimeClientPlugins; return this; } public Builder protocolGenerator(ProtocolGenerator protocolGenerator) { this.protocolGenerator = protocolGenerator; return this; } public Builder applicationProtocol(ApplicationProtocol applicationProtocol) { this.applicationProtocol = applicationProtocol; return this; } } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/ClientWriterConsumer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.sections.ClientBodyExtraCodeSection; import software.amazon.smithy.utils.SmithyInternalApi; /** * The writer consumer for a RuntimeClientPlugin. May be used to add imports and dependencies * used by the plugin at the client level. */ @FunctionalInterface @SmithyInternalApi public interface ClientWriterConsumer { void accept(TypeScriptWriter writer, ClientBodyExtraCodeSection section); } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/CommandWriterConsumer.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.sections.CommandConstructorCodeSection; import software.amazon.smithy.utils.SmithyInternalApi; /** * The writer consumer for a RuntimeClientPlugin. May be used to add imports and dependencies * used by the plugin at the command level. */ @FunctionalInterface @SmithyInternalApi public interface CommandWriterConsumer { void accept(TypeScriptWriter writer, CommandConstructorCodeSection section); } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/JavaScriptObjectWriter.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import java.util.stream.Collectors; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.utils.SmithyInternalApi; /** * Serializes Smithy {@link Node} values to JavaScript object/array literals. */ @SmithyInternalApi public final class JavaScriptObjectWriter { private JavaScriptObjectWriter() {} /** * Generic JSON -> JS serializer. */ public static String serialize(Node node) { if (node.isObjectNode()) { ObjectNode obj = node.expectObjectNode(); String members = obj.getMembers() .entrySet() .stream() .map(e -> "\"%s\": %s".formatted(e.getKey().getValue(), serialize(e.getValue()))) .collect(Collectors.joining(", ")); return "{" + members + "}"; } if (node.isArrayNode()) { String elements = node.expectArrayNode() .getElements() .stream() .map(JavaScriptObjectWriter::serialize) .collect(Collectors.joining(", ")); return "[" + elements + "]"; } if (node.isBooleanNode()) { return String.valueOf(node.expectBooleanNode().getValue()); } if (node.isStringNode()) { String value = node.expectStringNode().getValue(); if (value.contains("\"")) { if (value.contains("`")) { return "\"%s\"".formatted(value.replace("\"", "\\\"")); } return "`%s`".formatted(value); } return "\"%s\"".formatted(value); } if (node.isNumberNode()) { return node.expectNumberNode().getValue().toString(); } return node.toString(); } /** * Serialize a Smithy Node to a JavaScript literal, with endpoint rules * engine conventions: objects with a "ref" member become {@code [1, "name"]}, * objects with an "fn" member become {@code [0, "fn", [argv]]}. */ public static String serializeEndpointNode(Node node) { if (node.isObjectNode()) { ObjectNode obj = node.expectObjectNode(); if (obj.getMember("ref").isPresent()) { return "[1, \"%s\"]".formatted(obj.expectStringMember("ref").getValue()); } if (obj.getMember("fn").isPresent()) { String fn = obj.expectStringMember("fn").getValue(); String argv = serializeEndpointNode(obj.expectArrayMember("argv")); return "[0, \"%s\", %s]".formatted(fn, argv); } String members = obj.getMembers() .entrySet() .stream() .map(e -> "\"%s\": %s".formatted(e.getKey().getValue(), serializeEndpointNode(e.getValue()))) .collect(Collectors.joining(", ")); return "{" + members + "}"; } if (node.isArrayNode()) { String elements = node.expectArrayNode() .getElements() .stream() .map(JavaScriptObjectWriter::serializeEndpointNode) .collect(Collectors.joining(", ")); return "[" + elements + "]"; } return serialize(node); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/PatternDetectionCompression.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.utils.SmithyInternalApi; /** * Java port of PatternDetection.js compression algorithm. * * Compresses a JSON ObjectNode by extracting repeated patterns into * reusable JavaScript variables, producing JS code that reconstitutes * the original object. */ @SmithyInternalApi public class PatternDetectionCompression { /** * Alphabet available to the variable name generator. * omits "r" for other use. */ private static final String ALPHABET = "abcdefghijklmnopqstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final Pattern WORD_ONLY_KEY = Pattern.compile("\"(\\w+)\":"); private static final Pattern SSA_PATTERN = Pattern.compile("_ssa_(\\d{1,2})"); private final ObjectNode objectNode; /** * Variable ID to code block string. */ private final Map varIdToBlock = new LinkedHashMap<>(); /** * Reverse map of code block string to variable id. */ private final Map blockToVarId = new LinkedHashMap<>(); /** * Number of times each variable has been detected in the JSON blob. */ private final Map varIdToCount = new LinkedHashMap<>(); /** * Unique JSON path mapped to the variable that can replace it. */ private final Map pathToVarId = new LinkedHashMap<>(); /** * Set of unique paths encountered in the JSON object. */ private final Set pathsSeen = new LinkedHashSet<>(); /** * Set of variables that actually get used (as opposed to only marked). * These will be assigned symbols for write output. */ private final Set variableIdsUsed = new LinkedHashSet<>(); /** * Map of object key strings to their assigned variable id. */ private final Map keyToVarId = new LinkedHashMap<>(); /** * Next available variable id. Increments when used. */ private int variableId = 0; /** * Tracks the next available variable name, e.g. * a, b, ... z, A ... Z, aa, ab, ac, ad ... */ private int[] varName = {0}; /** * 'read' or 'write' mode. */ private String mode = "read"; private final Map writeReplacements = new LinkedHashMap<>(); /** * For SSA replacements, tracks the SSA number for each replaced path. */ private final Map writeReplacementSsaNum = new LinkedHashMap<>(); /** * Maps a normalized SSA block (with _ssa_N replaced by _ssa_) to the set of * actual SSA numbers seen, enabling template function generation. */ private final Map> ssaTemplateNumbers = new LinkedHashMap<>(); /** * Maps original block strings to their SSA-normalized form. */ private final Map blockToSsaNormalized = new LinkedHashMap<>(); public PatternDetectionCompression(ObjectNode objectNode) { this.objectNode = objectNode; } /** * @return JS code that evaluates to an exact match of the original object. */ public String compress() { // First pass: read traverse(objectNode, "", null); // Second pass: write (collect replacements) mode = "write"; traverse(objectNode, "", null); mode = "read"; // Apply replacements and serialize Node replaced = applyReplacements(objectNode, ""); // Serialize modified clone and strip quotes from word-only keys String serialized = jsonStringify(replaced); String buffer = "const _data=" + stripWordOnlyKeyQuotes(serialized) + ";"; // Sort used variable IDs: numbers/strings first, then booleans, then objects, then arrays List orderedVariableIds = getOrderedVariableIds(); // Code blocks List codeBlockBuffer = new ArrayList<>(); for (int variableIdVal : orderedVariableIds) { String symbol = nextVariableName(); String block = varIdToBlock.get(variableIdVal); // Check if this is an SSA template if (ssaTemplateNumbers.containsKey(block)) { // Emit a template function: symbol=(n)=>"prefix_ssa_"+n+"suffix" String inner = block.substring(1, block.length() - 1); // strip quotes String[] parts = inner.split("_ssa_", -1); StringBuilder templateBody = new StringBuilder("\""); for (int i = 0; i < parts.length; ++i) { if (i > 0) { templateBody.append("_ssa_\"+n+\""); } templateBody.append(parts[i]); } templateBody.append("\""); codeBlockBuffer.add(symbol + "=(n: number)=>" + templateBody); // Replace SSA placeholders with function calls Pattern ssaPlaceholder = Pattern.compile( "\"__REPLACE__" + variableIdVal + "__SSA__(\\d{1,2})__REPLACE__\"" ); Matcher ssaM = ssaPlaceholder.matcher(buffer); StringBuilder sb = new StringBuilder(); while (ssaM.find()) { ssaM.appendReplacement(sb, symbol + "(" + ssaM.group(1) + ")"); } ssaM.appendTail(sb); buffer = sb.toString(); } else { codeBlockBuffer.add(symbol + "=" + block); } // Replace non-SSA placeholders buffer = buffer.replace( "\"__REPLACE__" + variableIdVal + "__REPLACE__\"", symbol ); } // Cross-reference code blocks for (int i = 0; i < codeBlockBuffer.size(); ++i) { int iIndex = codeBlockBuffer.get(i).indexOf("="); String iSymbol = codeBlockBuffer.get(i).substring(0, iIndex); String iCode = codeBlockBuffer.get(i).substring(iIndex + 1); for (int j = i + 1; j < codeBlockBuffer.size(); ++j) { int jIndex = codeBlockBuffer.get(j).indexOf("="); String jCode = codeBlockBuffer.get(j).substring(jIndex + 1); if (jCode.contains(iCode)) { if (iCode.charAt(0) != '"' && iCode.length() < 6) { continue; } String escapedICode = Pattern.quote(iCode); String keyPattern = escapedICode + ":([^ ])"; codeBlockBuffer.set( j, codeBlockBuffer.get(j).replaceAll(keyPattern, "[" + iSymbol + "]:$1") ); codeBlockBuffer.set( j, codeBlockBuffer.get(j).replace(iCode, iSymbol) ); } } } if (!codeBlockBuffer.isEmpty()) { buffer = "const " + String.join(",\n", codeBlockBuffer) + ";\n" + buffer; } // Object keys List keyVarBuffer = new ArrayList<>(); for (String key : keyToVarId.keySet()) { Pattern keyPattern = Pattern.compile(Pattern.quote("\"" + key + "\":")); Matcher matcher = keyPattern.matcher(buffer); int count = 0; while (matcher.find()) { count += 1; } if (count > 1 && (long) key.length() * count > 8) { String symbol = nextVariableName(); keyVarBuffer.add(symbol + "=\"" + key + "\""); buffer = buffer.replaceAll( "\"?" + Pattern.quote(key) + "\"?:([^ ])", "[" + symbol + "]:$1" ); } } if (!keyVarBuffer.isEmpty()) { buffer = "const " + String.join(",\n", keyVarBuffer) + ";\n" + buffer; } buffer = prettyPrintData(buffer); buffer += "\n"; return buffer; } /** * Allocates the next unique variable id. */ private int markVariableId() { return variableId++; } /** * Allocates the next required variable name for code output. */ private String nextVariableName() { StringBuilder out = new StringBuilder(); for (int i = varName.length - 1; i >= 0; --i) { out.append(ALPHABET.charAt(varName[i])); } boolean carry = false; for (int i = 0; i < varName.length; ++i) { int n = varName[i]; if (n >= ALPHABET.length() - 1) { varName[i] = 0; carry = true; continue; } if (carry) { varName[i] += 1; carry = false; } else { varName[i] += 1; break; } } if (carry) { int[] newVarName = new int[varName.length + 1]; System.arraycopy(varName, 0, newVarName, 0, varName.length); newVarName[varName.length] = 0; varName = newVarName; } return out.toString(); } private static String jsonStringify(Node node) { return Node.printJson(node); } /** * Recursive. * @param node - the current node in traversal. * @param path - the unique JSON path to the current node. * @param key - the object key for this node, if available. */ private void traverse(Node node, String path, String key) { Integer optionalReplace = work(node, path, key); if (optionalReplace != null) { variableIdsUsed.add(optionalReplace); writeReplacements.put(path, optionalReplace); // If this is an SSA string, record which number it uses. if (node.isStringNode()) { String block = jsonStringify(node); if (blockToSsaNormalized.containsKey(block)) { Matcher ssaM = SSA_PATTERN.matcher(block); if (ssaM.find()) { writeReplacementSsaNum.put(path, ssaM.group(1)); } } } return; } if (node.isArrayNode()) { ArrayNode arrayNode = node.expectArrayNode(); List elements = arrayNode.getElements(); for (int i = 0; i < elements.size(); ++i) { traverse(elements.get(i), path + "[" + i + "]", null); } } else if (node.isObjectNode()) { ObjectNode objNode = node.expectObjectNode(); objNode.getMembers().forEach((k, v) -> { String keyStr = k.getValue(); traverse(v, path + "[`" + keyStr + "`]", keyStr); }); } } /** * Actions on a node during traversal. */ private Integer work(Node node, String path, String key) { if ("read".equals(mode)) { return read(node, path, key); } else if ("write".equals(mode)) { return write(node, path); } return null; } /** * Scan the current node and note its unique JSON * representation. Allocate variables to the JSON strings. */ private Integer read(Node node, String path, String key) { String block = jsonStringify(node); if (pathsSeen.contains(path)) { throw new RuntimeException("already seen: " + path); } pathsSeen.add(path); if (key != null) { int varId = markVariableId(); keyToVarId.put(key, varId); varIdToBlock.put(varId, key); } // For strings containing _ssa_N, normalize to group them together. String lookupBlock = block; if (node.isStringNode()) { Matcher ssaM = SSA_PATTERN.matcher(block); if (ssaM.find()) { String normalized = SSA_PATTERN.matcher(block).replaceAll("_ssa_"); lookupBlock = normalized; blockToSsaNormalized.put(block, normalized); String num = ssaM.group(1); ssaTemplateNumbers.computeIfAbsent(normalized, k -> new ArrayList<>()).add(num); } } if (blockToVarId.containsKey(lookupBlock)) { int varId = blockToVarId.get(lookupBlock); varIdToCount.put(varId, varIdToCount.get(varId) + 1); } else { int varId = markVariableId(); blockToVarId.put(lookupBlock, varId); varIdToBlock.put(varId, lookupBlock); varIdToCount.put(varId, 1); pathToVarId.put(path, varId); } return null; } /** * Check whether the node is worth replacing with * a previously recorded variable id. * @return variable id if replacement is desired, otherwise null. */ private Integer write(Node node, String path) { String block = jsonStringify(node); String lookupBlock = blockToSsaNormalized.getOrDefault(block, block); if (blockToVarId.containsKey(lookupBlock)) { int variable = blockToVarId.get(lookupBlock); int count = varIdToCount.get(variable); if (count >= 2 && (long) lookupBlock.length() * count >= 10) { return variable; } } return null; } private Node applyReplacements(Node node, String path) { if (writeReplacements.containsKey(path)) { int varId = writeReplacements.get(path); String ssaNum = writeReplacementSsaNum.get(path); if (ssaNum != null) { return Node.from("__REPLACE__" + varId + "__SSA__" + ssaNum + "__REPLACE__"); } return Node.from("__REPLACE__" + varId + "__REPLACE__"); } if (node.isArrayNode()) { ArrayNode arrayNode = node.expectArrayNode(); List elements = arrayNode.getElements(); List newElements = new ArrayList<>(); for (int i = 0; i < elements.size(); ++i) { newElements.add(applyReplacements(elements.get(i), path + "[" + i + "]")); } return ArrayNode.fromNodes(newElements); } else if (node.isObjectNode()) { ObjectNode objNode = node.expectObjectNode(); ObjectNode.Builder builder = ObjectNode.builder(); objNode.getMembers().forEach((k, v) -> { String keyStr = k.getValue(); builder.withMember(keyStr, applyReplacements(v, path + "[`" + keyStr + "`]")); }); return builder.build(); } return node; } private List getOrderedVariableIds() { List orderedVariableIds = new ArrayList<>(variableIdsUsed); orderedVariableIds.sort((a, b) -> { String boolStartChar = "b"; String aBlock = varIdToBlock.get(a); String bBlock = varIdToBlock.get(b); String aStartChar = String.valueOf(aBlock.charAt(0)); String bStartChar = String.valueOf(bBlock.charAt(0)); if ("t".equals(aStartChar) || "f".equals(aStartChar)) { aStartChar = boolStartChar; } if ("t".equals(bStartChar) || "f".equals(bStartChar)) { bStartChar = boolStartChar; } if (aStartChar.equals(bStartChar)) { return 0; } for (String startChar : new String[] {"[", "{", "\"", boolStartChar}) { if (aStartChar.equals(startChar)) { return 1; } else if (bStartChar.equals(startChar)) { return -1; } } throw new RuntimeException("unexpected start char: " + aStartChar + ", " + bStartChar); }); return orderedVariableIds; } private static String stripWordOnlyKeyQuotes(String json) { return WORD_ONLY_KEY.matcher(json).replaceAll("$1:"); } /** * Reformats the _data={...}; portion of the buffer to add newlines and indentation * for top-level object keys and individual array entries within those keys. */ private static String prettyPrintData(String buffer) { int dataStart = buffer.indexOf("const _data="); if (dataStart < 0) { return buffer; } int objectLiteralStart = buffer.indexOf('{', dataStart); // Find the matching closing brace at depth 0. int depth = 0; int objectLiteralEnd = -1; for (int i = objectLiteralStart; i < buffer.length(); ++i) { char c = buffer.charAt(i); if (c == '"') { // skip string literals i += 1; while (i < buffer.length() && buffer.charAt(i) != '"') { if (buffer.charAt(i) == '\\') { i += 1; } i += 1; } } else if (c == '{' || c == '[' || c == '(') { depth += 1; } else if (c == '}' || c == ']' || c == ')') { depth -= 1; if (depth == 0) { objectLiteralEnd = i; break; } } } if (objectLiteralEnd < 0) { return buffer; } // Extract the content between the outer braces of _data={...} String inner = buffer.substring(objectLiteralStart + 1, objectLiteralEnd); StringBuilder b = new StringBuilder(); b.append(buffer, 0, objectLiteralStart); b.append("{\n"); // Parse top-level key:value pairs (depth 0 commas separate them) List topEntries = splitAtDepthZero(inner); for (int i = 0; i < topEntries.size(); ++i) { String entry = topEntries.get(i); // Find the colon separating key from value at depth 0 int colonPos = findDepthZeroColon(entry); if (colonPos < 0) { // No colon found, just indent it as-is b.append(" ").append(entry.trim()); } else { String key = entry.substring(0, colonPos + 1).trim(); String value = entry.substring(colonPos + 1).trim(); if (value.startsWith("[")) { // Find matching "]" for this top-level array String arrayContent = value.substring(1, value.length() - 1); List items = splitAtDepthZero(arrayContent); b.append(" ").append(key).append(" [\n"); for (int j = 0; j < items.size(); ++j) { b.append(" ").append(items.get(j).trim()); if (j < items.size() - 1) { b.append(","); } b.append("\n"); } b.append(" ]"); } else { b.append(" ").append(key).append(" ").append(value); } } if (i < topEntries.size() - 1) { b.append(","); } b.append("\n"); } b.append("}"); b.append(buffer, objectLiteralEnd + 1, buffer.length()); return b.toString(); } /** * Splits a string by a "," character, but only at bracket depth 0, * respecting strings, brackets, and parentheses. */ private static List splitAtDepthZero(String s) { List parts = new ArrayList<>(); int depth = 0; int start = 0; for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (c == '"') { i += 1; while (i < s.length() && s.charAt(i) != '"') { if (s.charAt(i) == '\\') { i += 1; } i += 1; } } else if (c == '{' || c == '[' || c == '(') { depth += 1; } else if (c == '}' || c == ']' || c == ')') { depth -= 1; } else if (c == ',' && depth == 0) { parts.add(s.substring(start, i)); start = i + 1; } } if (start < s.length()) { parts.add(s.substring(start)); } return parts; } /** * Finds the position of the first colon at bracket depth 0 in the string, * which separates a key from its value in an object entry. */ private static int findDepthZeroColon(String s) { int depth = 0; for (int i = 0; i < s.length(); ++i) { char c = s.charAt(i); if (c == '"') { i += 1; while (i < s.length() && s.charAt(i) != '"') { if (s.charAt(i) == '\\') { i += 1; } i += 1; } } else if (c == '{' || c == '[' || c == '(') { depth += 1; } else if (c == '}' || c == ']' || c == ')') { depth -= 1; } else if (c == ':' && depth == 0) { return i; } } return -1; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/PropertyAccessor.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import java.util.regex.Pattern; public final class PropertyAccessor { /** * Starts with alpha or underscore, and contains only alphanumeric and underscores. */ public static final Pattern VALID_JAVASCRIPT_PROPERTY_NAME = Pattern.compile("^(?![0-9])[a-zA-Z0-9$_]+$"); private PropertyAccessor() {} /** * @param propertyName - property being accessed. * @return brackets wrapping the name if it's not a valid JavaScript property name. */ public static String getPropertyAccessor(String propertyName) { if (VALID_JAVASCRIPT_PROPERTY_NAME.matcher(propertyName).matches()) { return "." + propertyName; } if (propertyName.contains("\"")) { // This doesn't handle cases of the special characters being pre-escaped in the propertyName, // but that case does not currently need to be addressed. return "[`" + propertyName + "`]"; } return "[\"" + propertyName + "\"]"; } /** * @param propertyName - property being accessed. * @return brackets wrapping the name if it's not a valid JavaScript property name. */ public static String inlineKey(String propertyName) { if (VALID_JAVASCRIPT_PROPERTY_NAME.matcher(propertyName).matches()) { return propertyName; } if (propertyName.contains("\"")) { return "[`" + propertyName.replace("`", "\\\\`") + "`]"; } return "\"" + propertyName.replace("`", "\\\\`") + "\""; } /** * @param variable - object host. * @param propertyName - property being accessed. * @return e.g. someObject.prop or someObject['property name'] or reluctantly someObject[`bad"property"name`]. */ public static String getFrom(String variable, String propertyName) { return variable + getPropertyAccessor(propertyName); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/util/StringStore.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Map; import java.util.Objects; import java.util.Queue; import java.util.Set; import java.util.TreeMap; import java.util.function.Function; import java.util.regex.Pattern; import software.amazon.smithy.utils.SmithyInternalApi; /** * Intended for use at the * {@link software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext} * level, this class allocates and tracks variables assigned to string literals, allowing a * form of compression on long protocol serde files. */ @SmithyInternalApi public class StringStore { /** * Words are the component strings found within `camelCaseWords` or `header-dashed-words`. */ private static final Pattern FIND_WORDS = Pattern.compile("(x-amz)|(-\\w{3,})|(^[a-z]{3,})|([A-Z][a-z]{2,})"); // order doesn't matter for this map. private final Map literalToVariable = new HashMap<>(); // this map should be ordered for consistent codegen output. private final TreeMap variableToLiteral = new TreeMap<>(); // controls incremental output. private final Set writeLog = new HashSet<>(); public StringStore() {} /** * @param literal - a literal string value. * @return the variable name assigned for that string, which may have been encountered before. */ public String var(String literal) { Objects.requireNonNull(literal); return literalToVariable.computeIfAbsent(literal, this::assignKey); } /** * @param literal - a literal string value. * @param preferredPrefix - a preferred rather than derived variable name. * @return allocates the variable with the preferred prefix. */ public String var(String literal, String preferredPrefix) { Objects.requireNonNull(literal); return literalToVariable.computeIfAbsent(literal, (String key) -> assignPreferredKey(key, preferredPrefix)); } /** * @param literal - query. * @return whether the literal has already been assigned. */ public boolean hasVar(String literal) { return literalToVariable.containsKey(literal); } /** * Outputs the generated code for any constants that have been * allocated but not yet retrieved. */ public String flushVariableDeclarationCode() { StringBuilder sourceCode = new StringBuilder(); for (Map.Entry entry : variableToLiteral.entrySet()) { String variable = entry.getKey(); String literal = entry.getValue(); if (writeLog.add(variable)) { sourceCode.append(String.format("const %s = \"%s\";%n", variable, literal)); } } return sourceCode.toString(); } /** * Assigns a new variable for a given string literal. * Avoid calling assignKey more than once for a given literal, for example with * {@link HashMap#computeIfAbsent(Object, Function)}, since it would * allocate two different variables. */ private String assignKey(String literal) { String variable = allocateVariable(literal); variableToLiteral.put(variable, literal); return variable; } /** * Allocates a variable name for a given string literal. */ private String assignPreferredKey(String literal, String preferredPrefix) { int numericSuffix = 0; String candidate = preferredPrefix + numericSuffix; while (variableToLiteral.containsKey(candidate)) { numericSuffix += 1; candidate = preferredPrefix + numericSuffix; } variableToLiteral.put(candidate, literal); return candidate; } /** * Assigns a unique variable using the letters from the literal. * Prefers the uppercase or word-starting letters. */ private String allocateVariable(String literal) { String[] sections = Arrays.stream(literal.split("[-_\\s]")) .filter(s -> !s.isEmpty()) .toArray(String[]::new); StringBuilder v = new StringBuilder("_"); Queue deconfliction = new LinkedList<>(); if (sections.length > 1) { for (String s : sections) { char c = s.charAt(0); if (isAllowedChar(c)) { v.append(c); } } } else { for (int i = 0; i < literal.length(); i++) { char c = literal.charAt(i); if ((c >= 'A' && c <= 'Z') || (isNeutral(v.toString()) && isAllowedChar(c))) { v.append(c); } else if (isAllowedChar(c)) { deconfliction.add(c); } } } if (v.isEmpty()) { v.append("v"); } while (variableToLiteral.containsKey(v.toString())) { if (!deconfliction.isEmpty()) { v.append(deconfliction.poll()); } else { v.append('_'); } } return v.toString(); } /** * @return true if char is in A-Za-z. */ private boolean isAllowedChar(char c) { return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); } /** * @return true if the variable has only underscores. */ private boolean isNeutral(String variable) { for (int i = 0; i < variable.length(); i++) { if (variable.charAt(i) != '_') { return false; } } return true; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/validation/ImportFrom.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import java.util.Set; import software.amazon.smithy.utils.SetUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Interprets the string portion of an import statement. */ @SmithyInternalApi public class ImportFrom { public static final Set NODE_NATIVE_DEPENDENCIES = SetUtils.of( "buffer", "child_process", "crypto", "dns", "events", "fs", "http", "http2", "https", "os", "path", "process", "stream", "tls", "url", "util", "zlib" ); private final String from; public ImportFrom(String importTargetExpression) { this.from = importTargetExpression; } /** * @return whether we recognize it as a Node.js native module. These * do not need to be declared in package.json. This check * is not exhaustive since the list of native modules varies * by version. */ public boolean isNodejsNative() { String[] packageNameSegments = from.split("/"); return from.startsWith("node:") || NODE_NATIVE_DEPENDENCIES.contains(packageNameSegments[0]); } /** * @return whether the import has an org or namespace prefix like \@smithy/pkg. */ public boolean isNamespaced() { return from.startsWith("@") && from.contains("/"); } /** * @return whether the import starts with / or . indicating a relative import. * These would not be added to package.json dependencies. */ public boolean isRelative() { return from.startsWith("/") || from.startsWith("."); } /** * @return whether the import should correspond to an entry in * package.json. */ public boolean isDeclarablePackageImport() { return !isNodejsNative() && !isRelative(); } /** * @return the package name. This excludes sub-paths of packages. * * For example in \@smithy/pkg/module the package name is \@smithy/pkg. */ public String getPackageName() { String[] packageNameSegments = from.split("/"); String packageName; if (isNodejsNative()) { packageName = packageNameSegments[0].substring("node:".length()); } else if (isNamespaced()) { packageName = packageNameSegments[0] + "/" + packageNameSegments[1]; } else { packageName = packageNameSegments[0]; } return packageName; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/validation/LongValidator.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.neighbor.Walker; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.validation.AbstractValidator; import software.amazon.smithy.model.validation.ValidationEvent; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.utils.OptionalUtils; /** * This emits a DANGER validation event for any Long shape in the model * connected to a service. This is because a long can't be properly supported * by the number type in JavaScript. * * This validator is deliberately not registered to be automatically run. It * is run explicitly for SSDK generation. */ public final class LongValidator extends AbstractValidator { private TypeScriptSettings settings; public LongValidator(TypeScriptSettings settings) { this.settings = settings; } @Override public List validate(Model model) { ServiceShape service = model.expectShape(settings.getService(), ServiceShape.class); Set longs = new Walker(model) .walkShapes(service) .stream() .flatMap(shape -> OptionalUtils.stream(shape.asLongShape())) .collect(Collectors.toSet()); return longs .stream() .map( shape -> warning( shape, "JavaScript numbers are all IEEE-754 double-precision floats. As a " + "consequence of this, the maximum safe value for integral numbers is 2^53 - 1. Since a " + "long shape can have values up to 2^63 - 1, there is a significant range of values that " + "cannot be safely represented in JavaScript. If possible, use the int shape. If values " + "outside of the safe range of JavaScript integrals are needed, it is recommended to use a " + "string shape instead." ) ) .collect(Collectors.toList()); } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/validation/ReplaceLast.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; public abstract class ReplaceLast { /** * @param original - source string. * @param target - substring to be replaced. * @param replacement - the replacement. * @return original with the last occurrence of the target string replaced by the replacement string. */ public static String in(String original, String target, String replacement) { int lastPosition = original.lastIndexOf(target); if (lastPosition >= 0) { return (original.substring(0, lastPosition) + replacement + original.substring(lastPosition + target.length())); } return original; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/validation/SensitiveDataFinder.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import java.util.HashMap; import java.util.Map; import java.util.Set; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.selector.Selector; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.StreamingTrait; /** * This validator tells you whether a shape contains sensitive data fields. * This is used to decide whether a sensitive log filter function needs to be * generated for * a given shape. */ public class SensitiveDataFinder { private Map cache = new HashMap<>(); private final Model model; /** * @param model - model context for the {@link #findsSensitiveDataIn(Shape)} * queries. */ public SensitiveDataFinder(Model model) { this.model = model; } /** * @param shape - the shape in question. * @return whether a sensitive field exists in the shape and its downstream * shapes. */ public boolean findsSensitiveDataIn(Shape shape) { boolean found = findRecursive(shape); cache.put(shape, found); return found; } private boolean findRecursive(Shape shape) { if (cache.containsKey(shape)) { return cache.get(shape); } if (shape.hasTrait(SensitiveTrait.class) || shape.hasTrait(StreamingTrait.class)) { cache.put(shape, true); return true; } if ( shape.getMemberTrait(model, SensitiveTrait.class).isPresent() || shape.getMemberTrait(model, StreamingTrait.class).isPresent() ) { cache.put(shape, true); return true; } Selector sensitiveSelector = Selector.parse("[id = '" + shape.getId() + "']" + " ~> [trait|sensitive]"); Selector streamingSelector = Selector.parse("[id = '" + shape.getId() + "']" + " ~> [trait|streaming]"); Set matches = sensitiveSelector.select(model); matches.addAll(streamingSelector.select(model)); boolean found = !matches.isEmpty(); if (found) { cache.put(shape, true); return true; } if (shape instanceof MapShape) { MemberShape keyMember = ((MapShape) shape).getKey(); MemberShape valMember = ((MapShape) shape).getValue(); return findRecursive(keyMember) || findRecursive(valMember); } cache.put(shape, false); return false; } } ================================================ FILE: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/validation/UnaryFunctionCall.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import java.util.regex.Pattern; /** * For handling expressions that may be unary function calls. */ public final class UnaryFunctionCall { private static final Pattern CHECK_PATTERN = Pattern.compile("^(?!new ).+\\(((?!,).)*\\)$"); private static final Pattern TO_REF_PATTERN = Pattern.compile("(.*)\\(.*\\)$"); private UnaryFunctionCall() { // Private } /** * @param expression - to be examined. * @return whether the expression is a single-depth function call with a single parameter. */ public static boolean check(String expression) { if (expression.equals("_")) { // not a call per se, but this indicates a pass-through function. return true; } return maxCallDepth(expression) == 1 && CHECK_PATTERN.matcher(expression).matches(); } /** * @param callExpression the call expression to be converted. Check that * the expression is a unary call first. * @return the unary function call converted to a function reference. */ public static String toRef(String callExpression) { return TO_REF_PATTERN.matcher(callExpression).replaceAll("$1"); } /** * Estimates the call depth of a function call expression. * * @param expression A function call expression (e.g., "call() == 1", "call(call()) == 2", etc). */ private static int maxCallDepth(String expression) { int depth = 0; int maxDepth = 0; for (int i = 0; i < expression.length(); ++i) { char c = expression.charAt(i); if (c == '(') { depth += 1; if (depth > maxDepth) { maxDepth = depth; } continue; } if (c == ')') { depth -= 1; } } return maxDepth; } } ================================================ FILE: smithy-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin ================================================ software.amazon.smithy.typescript.codegen.TypeScriptClientCodegenPlugin software.amazon.smithy.typescript.codegen.TypeScriptServerCodegenPlugin software.amazon.smithy.typescript.codegen.TypeScriptCodegenPlugin software.amazon.smithy.typescript.codegen.TypeScriptSSDKCodegenPlugin ================================================ FILE: smithy-typescript-codegen/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration ================================================ software.amazon.smithy.typescript.codegen.endpointsV2.AddDefaultEndpointRuleSet software.amazon.smithy.typescript.codegen.integration.AddBuiltinPlugins software.amazon.smithy.typescript.codegen.integration.AddClientRuntimeConfig software.amazon.smithy.typescript.codegen.integration.AddProtocolConfig software.amazon.smithy.typescript.codegen.integration.AddEventStreamDependency software.amazon.smithy.typescript.codegen.integration.AddChecksumRequiredDependency software.amazon.smithy.typescript.codegen.integration.AddDefaultsModeDependency software.amazon.smithy.typescript.codegen.auth.http.integration.AddHttpAuthSchemePlugin software.amazon.smithy.typescript.codegen.auth.http.integration.AddHttpSigningPlugin software.amazon.smithy.typescript.codegen.auth.http.integration.HttpAuthRuntimeExtensionIntegration software.amazon.smithy.typescript.codegen.auth.http.integration.SupportNoAuth software.amazon.smithy.typescript.codegen.auth.http.integration.SupportHttpApiKeyAuth software.amazon.smithy.typescript.codegen.auth.http.integration.SupportHttpBearerAuth software.amazon.smithy.typescript.codegen.integration.AddHttpApiKeyAuthPlugin software.amazon.smithy.typescript.codegen.integration.AddBaseServiceExceptionClass software.amazon.smithy.typescript.codegen.integration.AddSdkStreamMixinDependency software.amazon.smithy.typescript.codegen.integration.DefaultReadmeGenerator software.amazon.smithy.typescript.codegen.integration.AddCompressionDependency software.amazon.smithy.typescript.codegen.protocols.AddProtocols ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/base-package.json ================================================ { "name": "${package}", "description": "${packageDescription}", "version": "${packageVersion}", "scripts": { "build": "concurrently '${packageManager}:build:cjs' '${packageManager}:build:es' '${packageManager}:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "build:types:downlevel": "downlevel-dts dist-types dist-types/ts3.4", "test:index": "tsc --noEmit ./test/index-types.ts && node ./test/index-objects.spec.mjs", "clean": "premove dist-cjs dist-es dist-types tsconfig.cjs.tsbuildinfo tsconfig.es.tsbuildinfo tsconfig.types.tsbuildinfo", "prepack": "${packageManager} run clean && ${packageManager} run build" }, "main": "./dist-cjs/index.js", "types": "./dist-types/index.d.ts", "module": "./dist-es/index.js", "sideEffects": false, "dependencies": { "tslib": "^2.6.2" }, "devDependencies": { "@tsconfig/node20": "20.1.8", "concurrently": "7.0.0", "downlevel-dts": "0.10.1", "premove": "4.0.0", "typescript": "~5.8.3" }, "engines": { "node": ">=20.0.0" }, "typesVersions": { "<4.5": { "dist-types/*": ["dist-types/ts3.4/*"] } }, "files": ["dist-*/**"] } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/extensionConfiguration.template ================================================ /** * @internal */ export interface ${extensionConfigName} extends ${extensionConfigInterfaces} {} ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/framework-errors.smithy ================================================ namespace smithy.framework @error("server") @httpError(500) structure InternalFailure {} @error("client") @httpError(404) structure UnknownOperationException {} @error("client") @httpError(400) structure SerializationException {} @error("client") @httpError(415) structure UnsupportedMediaTypeException {} @error("client") @httpError(406) structure NotAcceptableException {} ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/integration/default_readme_client.md.template ================================================ # ${packageName} ## Description SDK for JavaScript ${serviceId} Client for Node.js, Browser and React Native. ${documentation} ## Installing To install the this package, simply type add or install ${packageName} using your favorite package manager: - `npm install ${packageName}` - `yarn add ${packageName}` - `pnpm add ${packageName}` ## Getting Started ### Import To send a request, you only need to import the `${serviceId}Client` and the commands you need, for example `${commandName}Command`: ```js // CJS example const { ${serviceId}Client, ${commandName}Command } = require("${packageName}"); ``` ```ts // ES6+ example import { ${serviceId}Client, ${commandName}Command } from "${packageName}"; ``` ### Usage To send a request, you: - Initiate client with configuration. - Initiate command with input parameters. - Call `send` operation on client with command object as input. - If you are using a custom http handler, you may call `destroy()` to close open connections. ```js // a client can be shared by different commands. const client = new ${serviceId}Client(); const params = { /** input parameters */ }; const command = new ${commandName}Command(params); ``` #### Async/await We recommend using [await](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await) operator to wait for the promise returned by send operation as follows: ```js // async/await. try { const data = await client.send(command); // process data. } catch (error) { // error handling. } finally { // finally. } ``` Async-await is clean, concise, intuitive, easy to debug and has better error handling as compared to using Promise chains or callbacks. #### Promises You can also use [Promise chaining](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#chaining) to execute send operation. ```js client.send(command).then( (data) => { // process data. }, (error) => { // error handling. } ); ``` Promises can also be called using `.catch()` and `.finally()` as follows: ```js client .send(command) .then((data) => { // process data. }) .catch((error) => { // error handling. }) .finally(() => { // finally. }); ``` #### Callbacks We do not recommend using callbacks because of [callback hell](http://callbackhell.com/), but they are supported by the send operation. ```js // callbacks. client.send(command, (err, data) => { // process err and data. }); ``` ### Troubleshooting When the service returns an exception, the error will include the exception information, as well as response metadata (e.g. request id). ```js try { const data = await client.send(command); // process data. } catch (error) { const { requestId, httpStatusCode } = error.$$metadata; console.log({ requestId, httpStatusCode }); /** * The keys within exceptions are also parsed. * You can access them by specifying exception names: * if (error.name === 'SomeServiceException') { * const value = error.specialKeyInException; * } */ } ``` ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/integration/default_readme_server.md.template ================================================ # ${packageName} ## Description JavaScript Server SDK for ${serviceId} ${documentation} ## Installing To install this package, simply type add or install ${packageName} using your favorite package manager: - `npm install ${packageName}` - `yarn add ${packageName}` - `pnpm add ${packageName}` ## Getting Started Below is an example service handler created for the ${commandName} operation. ```ts import { createServer, IncomingMessage, ServerResponse } from "http"; import { HttpRequest } from "@smithy/protocol-http"; import { ${serviceId}Service as __${serviceId}Service, ${commandName}Input, ${commandName}Output, get${serviceId}ServiceHandler } from "${packageName}"; import { convertEvent, convertResponse } from "@aws-smithy/server-node"; class ${serviceId}Service implements __${serviceId}Service { ${commandName}(input: ${commandName}Input, request: HttpRequest): ${commandName}Output { // Populate your business logic } } const serviceHandler = get${serviceId}ServiceHandler(new ${serviceId}Service()); const server = createServer(async function ( req: IncomingMessage, res: ServerResponse & { req: IncomingMessage } ) { // Convert NodeJS's http request to an HttpRequest. const httpRequest = convertRequest(req); // Call the service handler, which will route the request to the GreetingService // implementation and then serialize the response to an HttpResponse. const httpResponse = await serviceHandler.handle(httpRequest); // Write the HttpResponse to NodeJS http's response expected format. return writeResponse(httpResponse, res); }); server.listen(3000); ``` ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/integration/http-api-key-auth.ts ================================================ // derived from https://github.com/aws/aws-sdk-js-v3/blob/e35f78c97fa6710ff9c444351893f0f06755e771/packages/middleware-endpoint-discovery/src/endpointDiscoveryMiddleware.ts import { normalizeProvider } from "@smithy/core/client"; import { HttpRequest } from "@smithy/core/protocols"; import { BuildMiddleware, Pluggable, Provider, RelativeMiddlewareOptions } from "@smithy/types"; interface HttpApiKeyAuthMiddlewareConfig { /** * Where to put the API key. * * If the value is `header`, the API key will be transported in the named header, * optionally prefixed with the provided scheme. * * If the value is `query`, the API key will be transported in the named query parameter. */ in: "header" | "query"; /** * The name of the header / query parameter to use for the transporting the API key. */ name: string; /** * The scheme to use. Only supported when `in` is `header`. */ scheme?: string; } export interface HttpApiKeyAuthInputConfig { /** * The API key to use when making requests. * * This is optional because some operations may not require an API key. */ apiKey?: string | Provider; } export interface ApiKeyPreviouslyResolved {} export interface HttpApiKeyAuthResolvedConfig { /** * The API key to use when making requests. * * This is optional because some operations may not require an API key. */ apiKey?: Provider; } // We have to provide a resolve function when we have config, even if it doesn't // actually do anything to the input value. "If any of inputConfig, resolvedConfig, // or resolveFunction are set, then all of inputConfig, resolvedConfig, and // resolveFunction must be set." export function resolveHttpApiKeyAuthConfig( input: T & ApiKeyPreviouslyResolved & HttpApiKeyAuthInputConfig ): T & HttpApiKeyAuthResolvedConfig { return { ...input, apiKey: input.apiKey ? normalizeProvider(input.apiKey) : undefined, }; } /** * Middleware to inject the API key into the HTTP request. * * The middleware will inject the client's configured API key into the * request as defined by the `@httpApiKeyAuth` trait. If the trait says to * put the API key into a named header, that header will be used, optionally * prefixed with a scheme. If the trait says to put the API key into a named * query parameter, that query parameter will be used. * * @param pluginConfig the client configuration. Includes the function that will return the API key value. * @param middlewareConfig the plugin options (location of the parameter, name, and optional scheme) * @returns a function that processes the HTTP request and passes it on to the next handler */ export const httpApiKeyAuthMiddleware = ( pluginConfig: HttpApiKeyAuthResolvedConfig, middlewareConfig: HttpApiKeyAuthMiddlewareConfig ): BuildMiddleware => (next) => async (args) => { if (!HttpRequest.isInstance(args.request)) return next(args); const apiKey = pluginConfig.apiKey && (await pluginConfig.apiKey()); // This middleware will not be injected if the operation has the @optionalAuth trait. // We don't know if we're the only auth middleware, so let the service deal with the // absence of the API key (or let other middleware do its job). if (!apiKey) { return next(args); } return next({ ...args, request: { ...args.request, headers: { ...args.request.headers, ...(middlewareConfig.in === "header" && { // Set the header, even if it's already been set. [middlewareConfig.name.toLowerCase()]: middlewareConfig.scheme ? `${middlewareConfig.scheme} ${apiKey}` : apiKey, }), }, query: { ...args.request.query, // Set the query parameter, even if it's already been set. ...(middlewareConfig.in === "query" && { [middlewareConfig.name]: apiKey }), }, }, }); }; export const httpApiKeyAuthMiddlewareOptions: RelativeMiddlewareOptions = { name: "httpApiKeyAuthMiddleware", tags: ["APIKEY", "AUTH"], relation: "after", toMiddleware: "retryMiddleware", override: true, }; export const getHttpApiKeyAuthPlugin = ( pluginConfig: HttpApiKeyAuthResolvedConfig, middlewareConfig: HttpApiKeyAuthMiddlewareConfig ): Pluggable => ({ applyToStack: (clientStack) => { clientStack.addRelativeTo( httpApiKeyAuthMiddleware(pluginConfig, middlewareConfig), httpApiKeyAuthMiddlewareOptions ); }, }); ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/malformed-request-test-regex-json-stub.ts ================================================ /** * Returns 'true' if the 'message' field in the serialized JSON document matches the given regex. */ const matchMessageInJsonBody = (body: string, messageRegex: string): Object => { const parsedBody = JSON.parse(body); if (!parsedBody.hasOwnProperty("message")) { return false; } return new RegExp(messageRegex).test(parsedBody["message"]); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-cbor-stub.ts ================================================ const compareEquivalentCborBodies = (expectedBody: string, generatedBody: string | Uint8Array): undefined => { expect( normalizeByteArrayType(cbor.deserialize(typeof generatedBody === "string" ? toBytes(generatedBody) : generatedBody)) ).toEqual(normalizeByteArrayType(cbor.deserialize(toBytes(expectedBody)))); return undefined; }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-form-urlencoded-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentFormUrlencodedBodies = (expectedBody: string, generatedBody: string): Object => { const fromEntries = (components: string[][]): Record => { const parts: Record = {}; components.forEach(component => { parts[component[0]] = component[1]; }); return parts; }; // Generate to k:v maps from query components const expectedParts = fromEntries(expectedBody.split("&").map(part => part.trim().split("="))); const generatedParts = fromEntries(generatedBody.split("&").map(part => part.trim().split("="))); return compareParts(expectedParts, generatedParts); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-json-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentJsonBodies = (expectedBody: string, generatedBody: string): Object => { const expectedParts = JSON.parse(expectedBody); const generatedParts = JSON.parse(generatedBody); return compareParts(expectedParts, generatedParts); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-octet-stream-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentOctetStreamBodies = ( utf8Encoder: __Encoder, expectedBody: string, generatedBody: Uint8Array ): Object => { const expectedParts = {Value: expectedBody}; const generatedParts = {Value: utf8Encoder(generatedBody)}; return compareParts(expectedParts, generatedParts); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-stub.ts ================================================ import { Readable } from "node:stream"; import { HttpRequest, HttpResponse, type HttpHandler } from "@smithy/core/protocols"; import type { Endpoint, HeaderBag, HttpHandlerOptions } from "@smithy/types"; /** * Throws an expected exception that contains the serialized request. */ class EXPECTED_REQUEST_SERIALIZATION_ERROR extends Error { constructor(readonly request: HttpRequest) { super(); } } /** * Throws an EXPECTED_REQUEST_SERIALIZATION_ERROR error before sending a * request. The thrown exception contains the serialized request. */ class RequestSerializationTestHandler implements HttpHandler { handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.reject(new EXPECTED_REQUEST_SERIALIZATION_ERROR(request)); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } /** * Returns a resolved Promise of the specified response contents. */ class ResponseDeserializationTestHandler implements HttpHandler { isSuccess: boolean; code: number; headers: HeaderBag; body: string | Uint8Array; isBase64Body: boolean; constructor(isSuccess: boolean, code: number, headers?: HeaderBag, body?: string) { this.isSuccess = isSuccess; this.code = code; if (headers === undefined) { this.headers = {}; } else { this.headers = headers; } if (body === undefined) { body = ""; } this.body = body; this.isBase64Body = String(body).length > 0 && Buffer.from(String(body), "base64").toString("base64") === body; } handle(request: HttpRequest, options?: HttpHandlerOptions): Promise<{ response: HttpResponse }> { return Promise.resolve({ response: new HttpResponse({ statusCode: this.code, headers: this.headers, body: this.isBase64Body ? toBytes(this.body as string) : Readable.from([this.body]), }), }); } updateHttpClientConfig(key: never, value: never): void {} httpHandlerConfigs() { return {}; } } interface comparableParts { [key: string]: string; } /** * Generates a standard map of un-equal values given input parts. */ const compareParts = (expectedParts: comparableParts, generatedParts: comparableParts) => { const unequalParts: any = {}; Object.keys(expectedParts).forEach((key) => { if (generatedParts[key] === undefined) { unequalParts[key] = { exp: expectedParts[key], gen: undefined }; } else if (!equivalentContents(expectedParts[key], generatedParts[key])) { unequalParts[key] = { exp: expectedParts[key], gen: generatedParts[key] }; } }); Object.keys(generatedParts).forEach((key) => { if (expectedParts[key] === undefined) { unequalParts[key] = { exp: undefined, gen: generatedParts[key] }; } }); if (Object.keys(unequalParts).length !== 0) { return unequalParts; } return undefined; }; /** * Compares all types for equivalent contents, doing nested * equality checks based on non-`$$metadata` * properties that have defined values. */ const equivalentContents = (expected: any, generated: any): boolean => { if (typeof (global as any).expect === "function") { expect(normalizeByteArrayType(generated)).toEqual(normalizeByteArrayType(expected)); return true; } let localExpected = expected; // Short circuit on equality. if (localExpected == generated) { return true; } if (typeof expected !== "object") { return expected === generated; } // If a test fails with an issue in the below 6 lines, it's likely // due to an issue in the nestedness or existence of the property // being compared. delete localExpected["$$metadata"]; delete generated["$$metadata"]; Object.keys(localExpected).forEach((key) => localExpected[key] === undefined && delete localExpected[key]); Object.keys(generated).forEach((key) => generated[key] === undefined && delete generated[key]); const expectedProperties = Object.getOwnPropertyNames(localExpected); const generatedProperties = Object.getOwnPropertyNames(generated); // Short circuit on different property counts. if (expectedProperties.length != generatedProperties.length) { return false; } // Compare properties directly. for (var index = 0; index < expectedProperties.length; index++) { const propertyName = expectedProperties[index]; if (!equivalentContents(localExpected[propertyName], generated[propertyName])) { return false; } } return true; }; const clientParams = { region: "us-west-2", credentials: { accessKeyId: "key", secretAccessKey: "secret" }, apiKey: { apiKey: "apiKey" }, endpoint: { url: new URL("https://localhost/"), headers: { "x-default-header": ["default-header-value"], }, }, }; /** * A wrapper function that shadows `fail` from jest-jasmine2 * (jasmine2 was replaced with circus in > v27 as the default test runner) */ const fail = (error?: any): never => { throw new Error(error); }; /** * Hexadecimal to byteArray. */ const toBytes = (hex: string) => { return Buffer.from(hex, "base64"); }; function normalizeByteArrayType(data: any) { // normalize float32 errors if (typeof data === "number") { const u = new Uint8Array(4); const dv = new DataView(u.buffer, u.byteOffset, u.byteLength); dv.setFloat32(0, data); return dv.getFloat32(0); } if (!data || typeof data !== "object") { return data; } if (data instanceof Uint8Array) { return Uint8Array.from(data); } if (data instanceof String || data instanceof Boolean || data instanceof Number) { return data.valueOf(); } const output = {} as any; for (const key of Object.getOwnPropertyNames(data)) { output[key] = normalizeByteArrayType(data[key]); } return output; } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-text-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentTextBodies = (expectedBody: string, generatedBody: string): Object => { const expectedParts = {Value: expectedBody}; const generatedParts = {Value: generatedBody}; return compareParts(expectedParts, generatedParts); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-unknown-type-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentUnknownTypeBodies = ( utf8Encoder: __Encoder, expectedBody: string, generatedBody: string | Uint8Array ): Object => { const expectedParts = {Value: expectedBody}; const generatedParts = { Value: generatedBody instanceof Uint8Array ? utf8Encoder(generatedBody) : generatedBody }; return compareParts(expectedParts, generatedParts); } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/protocol-test-xml-stub.ts ================================================ /** * Returns a map of key names that were un-equal to value objects showing the * discrepancies between the components. */ const compareEquivalentXmlBodies = (expectedBody: string, generatedBody: string): Object => { const parseConfig = { attributeNamePrefix: "", processEntities: { enabled: true, maxTotalExpansions: Infinity, }, htmlEntities: true, ignoreAttributes: false, ignoreDeclaration: true, parseTagValue: false, trimValues: false, tagValueProcessor: (_: any, val: any) => (val.trim() === "" && val.includes("\n") ? "" : undefined), maxNestedTags: Infinity, }; const parseXmlBody = (body: string) => { const parser = new XMLParser(parseConfig); const parsedObj = parser.parse(body); const textNodeName = "#text"; const key = Object.keys(parsedObj)[0]; const parsedObjToReturn = parsedObj[key]; if (parsedObjToReturn[textNodeName]) { parsedObjToReturn[key] = parsedObjToReturn[textNodeName]; delete parsedObjToReturn[textNodeName]; } return parsedObj; }; const expectedParts = parseXmlBody(expectedBody); const generatedParts = parseXmlBody(generatedBody); return compareParts(expectedParts, generatedParts); }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/reserved-words-members.txt ================================================ # TypeScript reserved words for members. # # Smithy's rules around the names of types are already pretty strict and # mostly compatible with TypeScript's naming conventions. Furthermore, the # code generator will automatically uppercase every instance where a # TypeScript type is generated from a Smithy type. This makes the majority # of all of the reserved words in TypeScript something that will never be # encountered when generating code. However, it's possible that other # SymbolProvider implementations could be used that do emit reserved # words for identifiers, hence this code is useful as an extra layer of # protection. # # Adding new reserved words to this list could potentially result in a # breaking change to previously generated clients, so adding new reserved words # is discouraged. Ideally we could have just automatically added an alias for # built-in types that conflict with generated types, but, unfortunately, it's # not currently possible to alias a built-in TypeScript or JavaScript type. # # When a reserved word is encountered, this implementation will # continue to prefix the word with "_" until it's no longer considered # reserved. # Prevent prototype pollution __proto__ ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/reserved-words.txt ================================================ # TypeScript reserved words. # # Smithy's rules around the names of types are already pretty strict and # mostly compatible with TypeScript's naming conventions. Furthermore, the # code generator will automatically uppercase every instance where a # TypeScript type is generated from a Smithy type. This makes the majority # of all of the reserved words in TypeScript something that will never be # encountered when generating code. However, it's possible that other # SymbolProvider implementations could be used that do emit reserved # words for identifiers, hence this code is useful as an extra layer of # protection. * # Various built-in types defined by JavaScript and/or TypeScript are # included in the set of reserved words (for example, Pick). This # should prevent most conflicts with built-in types based on the information # available as of today (September, 2019), however, the list of built-in # types available in TypeScript are likely to grow over time. Adding new # reserved words to this list when new TypeScript types are added could # potentially result in a breaking change to previously generated clients, # so adding new reserved words is discouraged. Ideally we could have just # automatically added an alias for built-in types that conflict with # generated types, but, unfortunately, it's not currently possible to # alias a built-in TypeScript or JavaScript type. # # When a reserved word is encountered, this implementation will # continue to prefix the word with "_" until it's no longer considered # reserved. # # See: https://github.com/Microsoft/TypeScript/blob/main/src/compiler/types.ts#L113 # Reserved and cannot be used as identifiers break case catch class const continue debugger default delete do else enum export extends false finally for function if import in instanceof new null return super switch this throw true try typeof var void while with # Not valid for identifiers (strict mode reserved words) implements interface let package private protected public static yield # contextual keywords abstract as asserts assert any async await constructor declare get infer intrinsic is keyof module namespace never readonly require type undefined unique unknown from global override of # Not valid for user defined type names. any boolean number string symbol # Common types and interfaces that could potentially conflict with generated code. Array ArrayBuffer ArrayBufferView Blob Boolean ConstructorParameters Date Error Exclude Extract Infinity InstanceType Math NaN NonNullable Number Object Omit Parameters Partial Pick Promise PromiseLike Readable Readonly ReadonlyArray Record RegExp Required ReturnType Set String Stream ThisType WeakMap ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/resolveRuntimeExtensions1.template ================================================ import type { ${extensionConfigName} } from "./extensionConfiguration"; /** * @public */ export interface RuntimeExtension { configure(extensionConfiguration: ${extensionConfigName}): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[]; } /** * @internal */ export const resolveRuntimeExtensions = (runtimeConfig: any, extensions: RuntimeExtension[]) => { const extensionConfiguration: ${extensionConfigName} = Object.assign( ${getPartialExtensionConfigurations} ); extensions.forEach((extension) => extension.configure(extensionConfiguration)); ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/resolveRuntimeExtensions2.template ================================================ return Object.assign( runtimeConfig, ${resolvePartialRuntimeConfigs} ); }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeConfig.browser.ts.template ================================================ /** * @internal */ export const getRuntimeConfig = (config: ${clientConfigName}) => { const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); ${prepareCustomizations} return { ...clientSharedValues, ...config, runtime: "browser", defaultsMode, ${customizations} }; }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeConfig.native.ts.template ================================================ /** * @internal */ export const getRuntimeConfig = (config: ${clientConfigName}) => { const browserDefaults = getBrowserRuntimeConfig(config); ${prepareCustomizations} return { ...browserDefaults, ...config, runtime: "react-native", ${customizations} }; }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeConfig.shared.ts.template ================================================ /** * @internal */ export const getRuntimeConfig = (config: ${clientConfigName}) => { ${prepareCustomizations} return { apiVersion: "${apiVersion}", ${customizations} }; }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeConfig.ts.template ================================================ /** * @internal */ export const getRuntimeConfig = (config: ${clientConfigName}) => { emitWarningIfUnsupportedVersion(process.version); const defaultsMode = resolveDefaultsModeConfig(config); const defaultConfigProvider = () => defaultsMode().then(loadConfigsForDefaultMode); const clientSharedValues = getSharedRuntimeConfig(config); ${prepareCustomizations} return { ...clientSharedValues, ...config, runtime: "node", defaultsMode, ${customizations} }; }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeExtensions1.template ================================================ import type { ${clientConfigName} } from "./clientConfiguration"; /** * @public */ export interface RuntimeExtension { configureClient(clientConfiguration: ${clientConfigName}): void; } /** * @public */ export interface RuntimeExtensionsConfig { extensions: RuntimeExtension[] } const asPartial = >(t: T) => t; /** * @internal */ export const resolveRuntimeExtensions = ( runtimeConfig: any, extensions: RuntimeExtension[] ) => { const clientConfiguration: ${clientConfigName} = { ${getPartialClientConfigurations} }; extensions.forEach(extension => extension.configureClient(clientConfiguration)); ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/runtimeExtensions2.template ================================================ return Object.assign(runtimeConfig, ${resolvePartialRuntimeConfigs} ); }; ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist-cjs", "noCheck": true } } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "lib": ["dom"], "module": "ESNext", "moduleResolution": "bundler", "outDir": "dist-es", "noCheck": true } } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.json ================================================ { "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "downlevelIteration": true, "importHelpers": true, "incremental": true, "removeComments": true, "resolveJsonModule": true, "rootDir": "src", "useUnknownInCatchVariables": false }, "include": ["src"] } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist-types", "emitDeclarationOnly": true, "noCheck": false } } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/typedoc.json ================================================ { "entryPoints": ["src/index.ts"], "out": "docs", "readme": "README.md" } ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { include: ["**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: smithy-typescript-codegen/src/main/resources/software/amazon/smithy/typescript/codegen/vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["**/*.{integ}.spec.ts"], include: ["**/*.spec.ts"], globals: true, }, }); ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/ApplicationProtocolTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class ApplicationProtocolTest { @Test public void detectsHttpProtocols() { Assertions.assertTrue(ApplicationProtocol.createDefaultHttpApplicationProtocol().isHttpProtocol()); } @Test public void detectsMqttProtocols() { Assertions.assertFalse(ApplicationProtocol.createDefaultHttpApplicationProtocol().isMqttProtocol()); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/CodegenUtilsTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; public class CodegenUtilsTest { @Test public void detectsJsonMediaTypes() { Assertions.assertTrue(CodegenUtils.isJsonMediaType("application/json")); Assertions.assertTrue(CodegenUtils.isJsonMediaType("custom+json")); Assertions.assertFalse(CodegenUtils.isJsonMediaType("application/xml")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/CommandGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; public class CommandGeneratorTest { // todo(schema) enable when on by default. @Disabled @Test public void writesOperationSchemaRef() { testCommandCodegen("output-structure.smithy", new String[] {".sc("}); } @Test public void writesOperationContextParamValues() { testCommandCodegen( "endpointsV2/endpoints-operation-context-params.smithy", new String[] { """ opContextParamIdentifier: { type: "operationContextParams", get: (input?: any) => input?.fooString }""", """ opContextParamSubExpression: { type: "operationContextParams", get: (input?: any) => input?.fooObj?.bar }""", """ opContextParamWildcardExpressionList: { type: "operationContextParams", get: (input?: any) => input?.fooList }""", """ opContextParamWildcardExpressionListFlatten: { type: "operationContextParams", get: (input?: any) => input?.fooListList.flat() }""", """ opContextParamWildcardExpressionListObj: { type: "operationContextParams", get: (input?: any) => input?.fooListObj?.map((obj: any) => obj?.key) }""", """ opContextParamWildcardExpressionListObjListFlatten: { type: "operationContextParams", get: (input?: any) => input?.fooListObjList?.map((obj: any) => obj?.key).flat() }""", """ opContextParamWildcardExpressionHash: { type: "operationContextParams", get: (input?: any) => Object.values(input?.fooObjObj ?? {}).map((obj: any) => obj?.bar) }""", """ opContextParamMultiSelectList: { type: "operationContextParams", get: (input?: any) => input?.fooListObjObj?.map((obj: any) => [obj?.fooObject?.bar,obj?.fooString].filter((i) => i)) }""", """ opContextParamMultiSelectListFlatten: { type: "operationContextParams", get: (input?: any) => input?.fooListObjObj?.map((obj: any) => [obj?.fooList].filter((i) => i)).flat() }""", """ opContextParamKeys: { type: "operationContextParams", get: (input?: any) => Object.keys(input?.fooKeys ?? {}) }""", } ); } private void testCommandCodegen(String filename, String[] expectedTypeArray) { MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .pluginClassLoader(getClass().getClassLoader()) .model( Model.assembler() .addImport(getClass().getResource(filename)) .discoverModels() .assemble() .unwrap() ) .fileManifest(manifest) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); String contents = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "//commands/GetFooCommand.ts").get(); assertThat(contents, containsString("as __MetadataBearer")); for (String expectedType : expectedTypeArray) { assertThat(contents, containsString(expectedType)); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/DefaultDefaultReadmeGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static software.amazon.smithy.typescript.codegen.integration.DefaultReadmeGenerator.README_FILENAME; import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.typescript.codegen.integration.DefaultReadmeGenerator; class DefaultDefaultReadmeGeneratorTest { private TypeScriptSettings settings; private TypeScriptCodegenContext context; private MockManifest manifest; private SymbolProvider symbolProvider; private final Model model = Model.assembler() .addImport(getClass().getResource("simple-service-with-operation.smithy")) .assemble() .unwrap(); @BeforeEach void setup() { settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("createDefaultReadme", Node.from(true)) .build() ); manifest = new MockManifest(); symbolProvider = new SymbolVisitor(model, settings); } private TypeScriptCodegenContext createContext() { return TypeScriptCodegenContext.builder() .model(model) .settings(settings) .symbolProvider(symbolProvider) .fileManifest(manifest) .integrations(List.of(new DefaultReadmeGenerator())) .runtimePlugins(new ArrayList<>()) .protocolGenerator(null) .applicationProtocol(ApplicationProtocol.createDefaultHttpApplicationProtocol()) .writerDelegator(new TypeScriptDelegator(manifest, symbolProvider)) .build(); } @Test void expectDefaultFileWrittenForClientSDK() { context = createContext(); new DefaultReadmeGenerator().customize(context); context.writerDelegator().flushWriters(); Assertions.assertTrue(manifest.hasFile("/" + README_FILENAME)); String readme = manifest.getFileString("/" + README_FILENAME).get(); assertThat(readme, containsString("SDK for JavaScript Example Client")); } @Test void expectDefaultFileWrittenForServerSDK() { settings.setArtifactType(TypeScriptSettings.ArtifactType.SSDK); context = createContext(); new DefaultReadmeGenerator().customize(context); context.writerDelegator().flushWriters(); Assertions.assertTrue(manifest.hasFile("/" + README_FILENAME)); String readme = manifest.getFileString("/" + README_FILENAME).get(); assertThat(readme, containsString("JavaScript Server SDK for Example")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/EnumGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.stringContainsInOrder; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.traits.EnumDefinition; import software.amazon.smithy.model.traits.EnumTrait; public class EnumGeneratorTest { @Test public void generatesNamedEnums() { EnumTrait trait = EnumTrait.builder() .addEnum(EnumDefinition.builder().value("FOO").name("FOO").build()) .addEnum(EnumDefinition.builder().value("BAR").name("BAR").build()) .build(); StringShape shape = StringShape.builder().id("com.foo#Baz").addTrait(trait).build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); Model model = Model.assembler() .addShape(shape) .addImport(getClass().getResource("simple-service.smithy")) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); Symbol symbol = new SymbolVisitor(model, settings).toSymbol(shape); new EnumGenerator(shape, symbol, writer).run(); assertThat(writer.toString(), containsString("export const Baz = {")); assertThat(writer.toString(), stringContainsInOrder("BAR: \"BAR\",", "FOO: \"FOO\"")); assertThat(writer.toString(), containsString("export type Baz = (typeof Baz)[keyof typeof Baz];")); } @Test public void generatesUnnamedEnums() { EnumTrait trait = EnumTrait.builder() .addEnum(EnumDefinition.builder().value("FOO").build()) .addEnum(EnumDefinition.builder().value("BAR").build()) .build(); StringShape shape = StringShape.builder().id("com.foo#Baz").addTrait(trait).build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); Model model = Model.assembler() .addShape(shape) .addImport(getClass().getResource("simple-service.smithy")) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); Symbol symbol = new SymbolVisitor(model, settings).toSymbol(shape); new EnumGenerator(shape, symbol, writer).run(); assertThat(writer.toString(), containsString("export type Baz = \"BAR\" | \"FOO\"")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/ImportDeclarationsTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.CodegenException; public class ImportDeclarationsTest { @Test public void addsSingleNonAliasedImport() { ImportDeclarations declarations = new ImportDeclarations("foo/bar"); declarations.addImport("Big", "", "big.js"); String result = declarations.toString(); assertThat(result, containsString("import { Big } from \"big.js\";")); } @Test public void addsSingleAliasedImport() { ImportDeclarations declarations = new ImportDeclarations("foo/bar"); declarations.addImport("Big", "$Big", "big.js"); String result = declarations.toString(); assertThat(result, containsString("import { Big as $Big } from \"big.js\";")); } @Test public void addsMultipleImportsOfSameSymbol() { ImportDeclarations declarations = new ImportDeclarations("foo/bar"); declarations.addImport("Big", "Big", "big.js"); declarations.addImport("Big", "$Big", "big.js"); String result = declarations.toString(); assertThat(result, containsString("import { Big, Big as $Big } from \"big.js\";")); } @Test public void relativizesImports() { ImportDeclarations declarations = new ImportDeclarations("./foo/bar/index"); declarations.addImport("Baz", "", "./foo/bar/bam"); String result = declarations.toString(); assertThat(result, containsString("import { Baz } from \"./bam\";")); } @Test public void relativizesImportsWithTrailingFilenameOnIndex() { ImportDeclarations declarations = new ImportDeclarations("foo/bar/index"); declarations.addImport("Baz", "", "./shared/shapeTypes"); String result = declarations.toString(); assertThat(result, containsString("import { Baz } from \"../../shared/shapeTypes\";")); } @Test public void relativizesImportsWithTrailingFilenameNotIndex() { ImportDeclarations declarations = new ImportDeclarations("foo/bar/hello/index"); declarations.addImport("Baz", "", "./shared/shapeTypes"); String result = declarations.toString(); assertThat(result, containsString("import { Baz } from \"../../../shared/shapeTypes\";")); } @Test public void automaticallyCorrectsBasePath() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar/index"); declarations.addImport("Baz", "", "./foo/bar/bam/qux"); String result = declarations.toString(); assertThat(result, containsString("import { Baz } from \"./bam/qux\";")); } @Test public void doesNotRelativizeAbsolutePaths() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar"); declarations.addImport("Baz", "", "@types/foo"); declarations.addImport("Hello", "", "/abc/def"); String result = declarations.toString(); assertThat(result, containsString("import { Baz } from \"@types/foo\";")); assertThat(result, containsString("import { Hello } from \"/abc/def\";")); } @Test public void canImportFilesUpLevels() { ImportDeclarations declarations = new ImportDeclarations("./foo/bar/index"); declarations.addImport("SharedThing", "", "./shared/types"); String result = declarations.toString(); assertThat(result, containsString("import { SharedThing } from \"../../shared/types\";")); } @Test public void throwsOnStarImport() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar"); declarations.addImport("*", "_baz", "@types/foo"); Assertions.assertThrows(CodegenException.class, () -> declarations.toString()); } @Test public void canImportDefaultImport() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar"); declarations.addDefaultImport("foo", "@types/foo"); String result = declarations.toString(); assertThat(result, containsString("import foo from \"@types/foo\";")); } @Test public void canImportDefaultImportWithIgnore() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar"); declarations.addIgnoredDefaultImport("foo", "@types/foo", "I want to"); String result = declarations.toString(); assertThat( result, containsString("// @ts-ignore: I want to\nimport foo from \"@types/foo\"; // eslint-disable-line") ); } @Test public void canImportDefaultImportWithNamedImport() { ImportDeclarations declarations = new ImportDeclarations("/foo/bar"); declarations.addDefaultImport("foo", "@types/foo"); declarations.addImport("Bar", "Bar", "@types/foo"); String result = declarations.toString(); assertThat(result, containsString("import foo from \"@types/foo\";")); assertThat(result, containsString("import { Bar } from \"@types/foo\";")); } @Test public void canImportNestedFromRoot() { ImportDeclarations declarations = new ImportDeclarations(""); declarations.addImport("Foo", "", "./models/foo"); String result = declarations.toString(); assertThat(result, containsString("import { Foo } from \"./models/foo\";")); } @Test public void canImportNestedFromClient() { ImportDeclarations declarations = new ImportDeclarations("./FooClient"); declarations.addImport("Foo", "", "./models/hello/index"); String result = declarations.toString(); assertThat(result, containsString("import { Foo } from \"./models/hello/index\";")); } @Test public void importOrdering() { ImportDeclarations declarations = new ImportDeclarations("./FooClient"); declarations.addTypeImport("ServiceOutputTypes", null, "../RpcV2ProtocolClient"); declarations.addImport("FractionalSeconds", null, "../schemas/schemas_0"); declarations.addTypeImport("RpcV2ProtocolClientResolvedConfig", null, "../RpcV2ProtocolClient"); declarations.addTypeImport("FractionalSecondsOutput", null, "../models/models_0"); declarations.addImport("commonParams", null, "../endpoint/EndpointParameters"); declarations.addImport("Command", "$Command", "@smithy/smithy-client"); declarations.addTypeImport("MetadataBearer", "__MetadataBearer", "@smithy/types"); declarations.addImport("getEndpointPlugin", null, "@smithy/middleware-endpoint"); declarations.addTypeImport("ServiceInputTypes", null, "../RpcV2ProtocolClient"); // https://projects.haykranen.nl/java/ declarations.addTypeImport("DecoratorContainerSchemaListenerTransactionRepository", null, "../../java8"); declarations.addTypeImport( "AuthenticationExpressionDecoratorContainerSchemaListenerTransactionRepository", null, "../../java11" ); declarations.addTypeImport( "ResolverVisitorAuthenticationExpressionDecoratorContainerSchemaListenerTransactions", null, "../../java15" ); // uses multiline format as line width 120 is breached. declarations.addTypeImport( "ResolverVisitorAuthenticationExpressionDecoratorContainerSchemaListenersTransactions", null, "../../java18" ); String result = declarations.toString(); assertEquals( """ import { getEndpointPlugin } from "@smithy/middleware-endpoint"; import { Command as $Command } from "@smithy/smithy-client"; import type { MetadataBearer as __MetadataBearer } from "@smithy/types"; import type { AuthenticationExpressionDecoratorContainerSchemaListenerTransactionRepository } from "../../java11"; import type { ResolverVisitorAuthenticationExpressionDecoratorContainerSchemaListenerTransactions } from "../../java15"; import type { ResolverVisitorAuthenticationExpressionDecoratorContainerSchemaListenersTransactions, } from "../../java18"; import type { DecoratorContainerSchemaListenerTransactionRepository } from "../../java8"; import { commonParams } from "../endpoint/EndpointParameters"; import type { FractionalSecondsOutput } from "../models/models_0"; import type { RpcV2ProtocolClientResolvedConfig, ServiceInputTypes, ServiceOutputTypes } from "../RpcV2ProtocolClient"; import { FractionalSeconds } from "../schemas/schemas_0"; """, result ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/IndexGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; public class IndexGeneratorTest { @Test public void writesIndex() { Model model = Model.assembler() .addImport(getClass().getResource("simple-service-with-operation.smithy")) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider symbolProvider = new SymbolVisitor(model, settings); TypeScriptWriter writer = new TypeScriptWriter(""); IndexGenerator.writeIndex(settings, model, symbolProvider, null, writer, writer); String contents = writer.toString(); assertThat(contents, containsString("export * from \"./Example\";")); assertThat(contents, containsString("export * from \"./ExampleClient\";")); assertThat(contents, containsString("export * from \"./commands\";")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/IntEnumGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.stringContainsInOrder; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.IntEnumShape; public class IntEnumGeneratorTest { @Test public void generatesIntEnums() { IntEnumShape shape = IntEnumShape.builder().id("com.foo#Foo").addMember("BAR", 5).addMember("BAZ", 2).build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); Model model = Model.assembler() .addShape(shape) .addImport(getClass().getResource("simple-service.smithy")) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); Symbol symbol = new SymbolVisitor(model, settings).toSymbol(shape); new IntEnumGenerator(shape, symbol, writer).run(); assertThat(writer.toString(), containsString("export enum Foo {")); assertThat(writer.toString(), stringContainsInOrder("BAZ = 2,", "BAR = 5,")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/PackageJsonGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.codegen.core.SymbolDependency; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; class PackageJsonGeneratorTest { @ParameterizedTest @MethodSource("providePackageDescriptionTestCases") void expectPackageDescriptionUpdatedByArtifactType( TypeScriptSettings.ArtifactType artifactType, String expectedDescription ) { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from(model, settings, artifactType); PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, new HashMap<>()); assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent()); String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get(); assertThat(packageJson, containsString(String.format("\"description\": \"%s\"", expectedDescription))); } @Test void expectPackageBrowserFieldToBeMerged() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("packageDescription", Node.from("example description")) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from( model, settings, TypeScriptSettings.ArtifactType.CLIENT ); var pjson = typeScriptSettings.getPackageJson(); pjson = pjson.withMember("browser", Node.objectNode().withMember("example-browser", Node.from("example"))); pjson = pjson.withMember( "react-native", Node.objectNode().withMember("example-react-native", Node.from("example")) ); typeScriptSettings.setPackageJson(pjson); PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, new HashMap<>()); assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent()); String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get(); ObjectNode packageJsonNode = Node.parse(packageJson).expectObjectNode(); Node expectedBrowserNode = Node.parse( """ { "example-browser": "example", "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.browser" } """ ); Node expectedReactNativeNode = Node.parse( """ { "example-react-native": "example", "./dist-es/runtimeConfig": "./dist-es/runtimeConfig.native" } """ ); Node.assertEquals(packageJsonNode.expectObjectMember("browser"), expectedBrowserNode); Node.assertEquals(packageJsonNode.expectObjectMember("react-native"), expectedReactNativeNode); } @Test void expectTestScriptAndTestConfigToBeAdded() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("packageDescription", Node.from("example description")) .withMember("packageManager", Node.from("npm")) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from( model, settings, TypeScriptSettings.ArtifactType.CLIENT ); Map> deps = new HashMap<>(); Map devDeps = new HashMap<>(); devDeps.put("vitest", TypeScriptDependency.VITEST.dependency); deps.put("devDependencies", devDeps); PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, deps); assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent()); assertTrue(manifest.getFileString(PackageJsonGenerator.VITEST_CONFIG_FILENAME).isPresent()); String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get(); String configString = manifest.getFileString(PackageJsonGenerator.VITEST_CONFIG_FILENAME).get(); assertThat(packageJson, containsString("\"test\": \"npx vitest run --passWithNoTests\"")); assertThat(configString, containsString("include: [\"**/*.spec.ts\"]")); } @Test void expectTypeDocToNotBeAdded() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("packageDescription", Node.from("example description")) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from( model, settings, TypeScriptSettings.ArtifactType.CLIENT ); Map> deps = new HashMap<>(); PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, deps); assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent()); assertTrue(manifest.getFileString(PackageJsonGenerator.TYPEDOC_FILE_NAME).isEmpty()); String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get(); assertThat(packageJson, not(containsString("\"build:docs\": \"typedoc\""))); assertThat(packageJson, not(containsString("\"typedoc\": \"0.23.23\""))); } @Test void expectTypeDocToBeAddedWithGenerateTypeDoc() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("packageDescription", Node.from("example description")) .withMember("generateTypeDoc", true) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from( model, settings, TypeScriptSettings.ArtifactType.CLIENT ); Map> deps = new HashMap<>(); PackageJsonGenerator.writePackageJson(typeScriptSettings, manifest, deps); assertTrue(manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).isPresent()); assertTrue(manifest.getFileString(PackageJsonGenerator.TYPEDOC_FILE_NAME).isPresent()); String packageJson = manifest.getFileString(PackageJsonGenerator.PACKAGE_JSON_FILENAME).get(); assertThat(packageJson, containsString("\"build:docs\": \"typedoc\"")); assertThat(packageJson, containsString("\"typedoc\": \"0.23.23\"")); } private static Stream providePackageDescriptionTestCases() { return Stream.of( Arguments.of(TypeScriptSettings.ArtifactType.SSDK, "example server"), Arguments.of(TypeScriptSettings.ArtifactType.CLIENT, "example client") ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/RuntimeConfigGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Consumer; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; public class RuntimeConfigGeneratorTest { @Test public void expandsRuntimeConfigFile() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); List integrations = new ArrayList<>(); integrations.add( new TypeScriptIntegration() { @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { Map> config = new HashMap<>(); config.put("syn", writer -> { writer.write("syn: 'ack1',"); }); config.put("foo", writer -> { writer.write("foo: 'bar',"); }); return config; } } ); integrations.add( new TypeScriptIntegration() { @Override public Map> getRuntimeConfigWriters( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, LanguageTarget target ) { Map> config = new HashMap<>(); config.put("syn", writer -> { writer.write("syn: 'ack2',"); }); return config; } } ); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider symbolProvider = new SymbolVisitor(model, settings); TypeScriptDelegator delegator = new TypeScriptDelegator(manifest, symbolProvider); RuntimeConfigGenerator generator = new RuntimeConfigGenerator( settings, model, symbolProvider, delegator, integrations, ApplicationProtocol.createDefaultHttpApplicationProtocol() ); generator.generate(LanguageTarget.NODE); generator.generate(LanguageTarget.BROWSER); generator.generate(LanguageTarget.REACT_NATIVE); generator.generate(LanguageTarget.SHARED); delegator.flushWriters(); Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.ts")); Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.browser.ts")); Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.native.ts")); Assertions.assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.shared.ts")); // Does the runtimeConfig.shared.ts file expand the template properties properly? String runtimeConfigSharedContents = manifest .getFileString(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.shared.ts") .get(); assertThat( runtimeConfigSharedContents, containsString("export const getRuntimeConfig = (config: ExampleClientConfig) =>") ); assertThat(runtimeConfigSharedContents, containsString("apiVersion: \"1.0.0\",")); assertThat(runtimeConfigSharedContents, containsString("config?.syn ?? syn: 'ack2',")); assertThat(runtimeConfigSharedContents, containsString("config?.foo ?? foo: 'bar',")); // Does the runtimeConfig.ts file expand the template properties properly? String runtimeConfigContents = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.ts").get(); assertThat( runtimeConfigContents, containsString("import type { ExampleClientConfig } from \"./ExampleClient\";") ); assertThat( runtimeConfigSharedContents, containsString("export const getRuntimeConfig = (config: ExampleClientConfig) =>") ); assertThat(runtimeConfigContents, containsString("config?.syn ?? syn: 'ack2',")); assertThat(runtimeConfigSharedContents, containsString("config?.foo ?? foo: 'bar',")); // Does the runtimeConfig.browser.ts file expand the template properties properly? String runtimeConfigBrowserContents = manifest .getFileString(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.browser.ts") .get(); assertThat( runtimeConfigBrowserContents, containsString("import type { ExampleClientConfig } from \"./ExampleClient\";") ); assertThat( runtimeConfigSharedContents, containsString("export const getRuntimeConfig = (config: ExampleClientConfig) =>") ); assertThat(runtimeConfigContents, containsString("config?.syn ?? syn: 'ack2',")); assertThat(runtimeConfigSharedContents, containsString("config?.foo ?? foo: 'bar',")); // Does the runtimeConfig.native.ts file expand the browser template properties properly? String runtimeConfigNativeContents = manifest .getFileString(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.native.ts") .get(); assertThat( runtimeConfigNativeContents, containsString("import type { ExampleClientConfig } from \"./ExampleClient\";") ); assertThat( runtimeConfigNativeContents, containsString( "import { getRuntimeConfig as getBrowserRuntimeConfig } from \"./runtimeConfig.browser\";" ) ); assertThat( runtimeConfigSharedContents, containsString("export const getRuntimeConfig = (config: ExampleClientConfig) =>") ); assertThat(runtimeConfigContents, containsString("config?.syn ?? syn: 'ack2',")); assertThat(runtimeConfigSharedContents, containsString("config?.foo ?? foo: 'bar',")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/ServiceBareBonesClientGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; public class ServiceBareBonesClientGeneratorTest { @Test public void hasHooksForService() { // TODO } @Test public void addsCustomIntegrationDependencyFields() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); TypeScriptWriter writer = new TypeScriptWriter("./foo"); SymbolProvider symbolProvider = new SymbolVisitor(model, settings); ApplicationProtocol applicationProtocol = ApplicationProtocol.createDefaultHttpApplicationProtocol(); List integrations = new ArrayList<>(); integrations.add( new TypeScriptIntegration() { @Override public void addConfigInterfaceFields( TypeScriptSettings settings, Model model, SymbolProvider symbolProvider, TypeScriptWriter writer ) { writer.writeDocs("Hello!"); writer.write("syn?: string;"); } } ); new ServiceBareBonesClientGenerator( settings, model, symbolProvider, writer, integrations, Collections.emptyList(), applicationProtocol ).run(); assertThat(writer.toString(), containsString(" /**\n" + " * Hello!\n" + " */\n" + " syn?: string;")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/StructureGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.loader.ModelAssembler; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings.RequiredMemberMode; public class StructureGeneratorTest { @Test public void properlyGeneratesEmptyMessageMemberOfException() { testErrorStructureCodegen( "error-test-empty.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); } } """ ); } @Test public void properlyGeneratesOptionalMessageMemberOfException() { testErrorStructureCodegen( "error-test-optional-message.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); } } """ ); } @Test public void properlyGeneratesRequiredMessageMemberOfException() { testErrorStructureCodegen( "error-test-required-message.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); } } """ ); } @Test public void properlyGeneratesOptionalNonMessageMemberOfException() { testErrorStructureCodegen( "error-test-optional-member-no-message.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; foo?: string | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); this.foo = opts.foo; } } """ ); } @Test public void properlyGeneratesRequiredNonMessageMemberOfException() { testErrorStructureCodegen( "error-test-required-member-no-message.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; foo: string | undefined; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); this.foo = opts.foo; } } """ ); } @Test public void generatesEmptyRetryableTrait() { testErrorStructureCodegen( "error-test-retryable.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; $retryable = {}; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); } } """ ); } @Test public void generatesRetryableTraitWithThrottling() { testErrorStructureCodegen( "error-test-retryable-throttling.smithy", """ export class Err extends __BaseException { readonly name = "Err" as const; readonly $fault = "client" as const; $retryable = { throttling: true, }; /** * @internal */ constructor(opts: __ExceptionOptionType) { super({ name: "Err", $fault: "client", ...opts, }); Object.setPrototypeOf(this, Err.prototype); } } """ ); } @Test public void properlyGeneratesRequiredMessageMemberNotBackwardCompatible() { testStructureCodegenBase( "test-required-member.smithy", """ export interface GetFooOutput { someRequiredMember: string; } """, RequiredMemberMode.STRICT, true ); } private String testStructureCodegen(String file, String includedString) { return testStructureCodegenBase(file, includedString, RequiredMemberMode.NULLABLE, true); } private String testStructureCodegenExcludes(String file, String excludedString) { return testStructureCodegenBase(file, excludedString, RequiredMemberMode.NULLABLE, false); } private String testStructureCodegenBase( String file, String testString, RequiredMemberMode requiredMemberMode, boolean assertContains ) { Model model = Model.assembler().addImport(getClass().getResource(file)).assemble().unwrap(); MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .model(model) .fileManifest(manifest) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("requiredMemberMode", Node.from(requiredMemberMode.getMode())) .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); String contents = ""; contents += manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "//models/models_0.ts").orElse(""); contents += manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "//models/enums.ts").orElse(""); contents += manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "//models/errors.ts").orElse(""); if (assertContains) { assertThat(contents, containsString(testString)); } else { assertThat(contents, not(containsString(testString))); } return contents; } private void testErrorStructureCodegen(String file, String expectedType) { String contents = testStructureCodegen(file, expectedType); assertThat(contents, containsString("as __BaseException")); } @Test public void generatesNonErrorStructures() { StructureShape struct = createNonErrorStructure(); ModelAssembler assembler = Model.assembler() .addShape(struct) .addImport(getClass().getResource("simple-service.smithy")); struct.getAllMembers().values().forEach(assembler::addShape); Model model = assembler.assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); TypeScriptWriter writer = new TypeScriptWriter("./foo"); new StructureGenerator(model, settings, new SymbolVisitor(model, settings), writer, struct).run(); String output = writer.toString(); assertThat(output, containsString("export interface Bar {")); assertThat(output, containsString("foo?: string | undefined;")); } private StructureShape createNonErrorStructure() { return StructureShape.builder() .id("com.foo#Bar") .addMember(MemberShape.builder().id("com.foo#Bar$foo").target("smithy.api#String").build()) .build(); } @Test public void generatesNonErrorStructuresThatExtendOtherInterfaces() { StructureShape struct = createNonErrorStructure(); ModelAssembler assembler = Model.assembler() .addShape(struct) .addImport(getClass().getResource("simple-service.smithy")); struct.getAllMembers().values().forEach(assembler::addShape); OperationShape operation = OperationShape.builder().id("com.foo#Operation").output(struct).build(); assembler.addShape(operation); Model model = assembler.assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); TypeScriptWriter writer = new TypeScriptWriter("./foo"); new StructureGenerator(model, settings, new SymbolVisitor(model, settings), writer, struct).run(); String output = writer.toString(); assertThat(output, containsString("export interface Bar {")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolDecoratorIntegration.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; /** * This SymbolProvider is used to test that TypeScriptCodegenPlugin actually decorates * the provided SymbolProvider using integrations found on the classpath. It is * enabled by setting "__customServiceName" in the provided settings object. */ public final class SymbolDecoratorIntegration implements TypeScriptIntegration { @Override public SymbolProvider decorateSymbolProvider( Model model, TypeScriptSettings settings, SymbolProvider symbolProvider ) { String name = settings.getPluginSettings().getStringMemberOrDefault("__customServiceName", null); if (name == null) { return symbolProvider; } return shape -> { Symbol symbol = symbolProvider.toSymbol(shape); if (shape.isServiceShape()) { return symbol.toBuilder().name(name).definitionFile(name + ".ts").build(); } return symbol; }; } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/SymbolProviderTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Arrays; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.IntEnumShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.EnumDefinition; import software.amazon.smithy.model.traits.EnumTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; public class SymbolProviderTest { @Test public void createsSymbols() { Shape shape = StructureShape.builder().id("com.foo.baz#Hello").build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShape(shape) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol symbol = provider.toSymbol(shape); assertThat(symbol.getName(), equalTo("Hello")); assertThat(symbol.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); assertThat(symbol.getNamespaceDelimiter(), equalTo("/")); assertThat(symbol.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); } @Test public void createsSymbolsIntoTargetNamespace() { Shape shape1 = StructureShape.builder().id("com.foo#Hello").build(); Shape shape2 = StructureShape.builder().id("com.foo.baz#Hello").build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(shape1, shape2) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol symbol1 = provider.toSymbol(shape1); Symbol symbol2 = provider.toSymbol(shape2); SymbolVisitor.modelIndexer(Arrays.asList(shape1, shape2), provider); assertThat(symbol1.getName(), equalTo("Hello")); assertThat(symbol1.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); assertThat(symbol1.getNamespaceDelimiter(), equalTo("/")); assertThat(symbol1.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); assertThat(symbol2.getName(), equalTo("Hello")); assertThat(symbol2.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); assertThat(symbol2.getNamespaceDelimiter(), equalTo("/")); assertThat(symbol2.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); } @Test public void escapesReservedWords() { Shape shape = StructureShape.builder().id("com.foo.baz#Pick").build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShape(shape) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol symbol = provider.toSymbol(shape); assertThat(symbol.getName(), equalTo("_Pick")); } @Test public void doesNotEscapeBuiltins() { MemberShape member = MemberShape.builder().id("foo.bar#Object$a").target("smithy.api#String").build(); StructureShape struct = StructureShape.builder().id("foo.bar#Object").addMember(member).build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(struct, member) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol structSymbol = provider.toSymbol(struct); Symbol memberSymbol = provider.toSymbol(member); // Normal structure with escaping. assertThat(structSymbol.getName(), equalTo("_Object")); assertThat(structSymbol.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); // Reference to built-in type with no escaping. assertThat(memberSymbol.getName(), equalTo("string")); assertThat(memberSymbol.getNamespace(), equalTo("")); } @Test public void escapesRecursiveSymbols() { StructureShape record = StructureShape.builder().id("foo.bar#Record").build(); MemberShape listMember = MemberShape.builder().id("foo.bar#Records$member").target(record).build(); ListShape list = ListShape.builder().id("foo.bar#Records").member(listMember).build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(list, listMember, record) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol listSymbol = provider.toSymbol(list); assertThat(listSymbol.getName(), equalTo("_Record[]")); } @Test public void createsCommandModules() { Model model = Model.assembler() .addImport(getClass().getResource("output-structure.smithy")) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); Shape command = model.expectShape(ShapeId.from("smithy.example#GetFoo")); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol commandSymbol = provider.toSymbol(command); assertThat(commandSymbol.getName(), equalTo("GetFooCommand")); assertThat( commandSymbol.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/commands/GetFooCommand") ); } @Test public void usesLazyJsonStringForJsonMediaType() { StringShape jsonString = StringShape.builder() .id("foo.bar#jsonString") .addTrait(new MediaTypeTrait("application/json")) .build(); MemberShape member = MemberShape.builder().id("foo.bar#test$a").target(jsonString).build(); StructureShape struct = StructureShape.builder().id("foo.bar#test").addMember(member).build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(struct, member, jsonString) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol memberSymbol = provider.toSymbol(member); assertThat(memberSymbol.getName(), equalTo("__AutomaticJsonStringConversion | string")); } @Test public void omitsUnknownStringEnumVariant() { EnumTrait trait = EnumTrait.builder() .addEnum(EnumDefinition.builder().value("FOO").name("FOO").build()) .addEnum(EnumDefinition.builder().value("BAR").name("BAR").build()) .build(); StringShape stringShape = StringShape.builder().id("foo.bar#enumString").addTrait(trait).build(); MemberShape member = MemberShape.builder().id("foo.bar#test$a").target(stringShape).build(); StructureShape struct = StructureShape.builder().id("foo.bar#test").addMember(member).build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(struct, member, stringShape) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol memberSymbol = provider.toSymbol(member); assertThat(memberSymbol.getName(), equalTo("EnumString")); } @Test public void omitsUnknownNumberIntEnumVariant() { IntEnumShape shape = IntEnumShape.builder().id("com.foo#Foo").addMember("BAR", 2).addMember("BAZ", 5).build(); MemberShape member = MemberShape.builder().id("foo.bar#test$a").target(shape).build(); StructureShape struct = StructureShape.builder().id("foo.bar#test").addMember(member).build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(struct, member, shape) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings); Symbol memberSymbol = provider.toSymbol(member); assertThat(memberSymbol.getName(), equalTo("Foo")); } @Test public void placesResourceShapeIntoInitialBucket() { Shape shape1 = StructureShape.builder().id("com.foo#Hello").build(); Shape shape2 = ResourceShape.builder().id("com.foo.baz#Hello").build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(shape1, shape2) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider provider = new SymbolVisitor(model, settings, 1); Symbol symbol1 = provider.toSymbol(shape1); Symbol symbol2 = provider.toSymbol(shape2); SymbolVisitor.modelIndexer(Arrays.asList(shape1, shape2), provider); assertThat(symbol1.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); assertThat(symbol1.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); assertThat(symbol2.getNamespace(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0")); assertThat(symbol2.getDefinitionFile(), equalTo("./" + CodegenUtils.SOURCE_FOLDER + "/models/models_0.ts")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptCodegenPluginTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Optional; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; public class TypeScriptCodegenPluginTest { @Test public void generatesRuntimeConfigFiles() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .model(model) .fileManifest(manifest) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); // Did we generate the runtime config files? // note that asserting the contents of runtime config files is handled in its own unit tests. assertTrue(manifest.hasFile("package.json")); assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.browser.ts")); assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/runtimeConfig.ts")); assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/index.ts")); // Does the package.json file point to the runtime config? String packageJsonContents = manifest.getFileString("package.json").get(); ObjectNode packageJson = Node.parse(packageJsonContents).expectObjectNode(); assertThat( packageJson.expectObjectMember("browser").getStringMember("./dist-es/runtimeConfig"), equalTo(Optional.of(Node.from("./dist-es/runtimeConfig.browser"))) ); } @Test public void decoratesSymbolProvider() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .model(model) .fileManifest(manifest) .pluginClassLoader(getClass().getClassLoader()) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("__customServiceName", "Foo") .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); assertTrue(manifest.hasFile("Foo.ts")); assertThat(manifest.getFileString("Foo.ts").get(), containsString("export class Foo")); } @Test public void generatesServiceClients() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .model(model) .fileManifest(manifest) .pluginClassLoader(getClass().getClassLoader()) .settings( Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/Example.ts")); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/Example.ts").get(), containsString("export class Example extends ExampleClient") ); assertTrue(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts")); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), containsString("export class ExampleClient") ); } @Test public void invokesOnWriterCustomizations() { // TODO } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptDelegatorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.codegen.core.SymbolProvider; public class TypeScriptDelegatorTest { @Test public void addsBuiltinDependencies() { SymbolProvider provider = shape -> null; MockManifest manifest = new MockManifest(); TypeScriptDelegator delegator = new TypeScriptDelegator(manifest, provider); assertThat(delegator.getDependencies(), equalTo(TypeScriptDependency.getUnconditionalDependencies())); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptDependencyTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.startsWith; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolDependency; public class TypeScriptDependencyTest { @Test public void createsSymbols() { Symbol foo = TypeScriptDependency.SMITHY_CORE.createSymbol("Foo"); assertThat(foo.getNamespace(), equalTo(TypeScriptDependency.SMITHY_CORE.packageName)); assertThat(foo.getName(), equalTo("Foo")); assertThat(foo.getDependencies(), contains(TypeScriptDependency.SMITHY_CORE.dependency)); } @Test public void getsUnconditionalDependencies() { assertThat( TypeScriptDependency.getUnconditionalDependencies(), hasItem(TypeScriptDependency.SMITHY_TYPES.dependency) ); } @Test public void getsVendedDependencyVersions() { List smithyTypes = TypeScriptDependency.SMITHY_TYPES.getDependencies(); List serverCommon = TypeScriptDependency.SERVER_COMMON.getDependencies(); assertThat(smithyTypes.size(), equalTo(1)); assertThat(smithyTypes.get(0).getVersion(), startsWith("^")); assertThat(smithyTypes.get(0).getPackageName(), equalTo("@smithy/types")); assertThat(serverCommon.size(), equalTo(1)); assertThat(serverCommon.get(0).getVersion(), not(startsWith("^"))); assertThat(serverCommon.get(0).getPackageName(), equalTo("@aws-smithy/server-common")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptJmesPathVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static software.amazon.smithy.typescript.codegen.TypeScriptWriter.CODEGEN_INDICATOR; import org.junit.jupiter.api.Test; import software.amazon.smithy.jmespath.JmespathExpression; public class TypeScriptJmesPathVisitorTest { private String generateTypescriptInterpretation(String path) { TypeScriptWriter writer = new TypeScriptWriter("test"); JmespathExpression expression = JmespathExpression.parse(path); expression.parse(path); TypeScriptJmesPathVisitor visitor = new TypeScriptJmesPathVisitor(writer, "result", expression); visitor.run(); String result = writer.toString(); return result; } @Test public void createsSimpleOneLevelIndex() { String result = generateTypescriptInterpretation("foo"); assertThat(result, equalTo(CODEGEN_INDICATOR + "const returnComparator = () => {\n return result.foo;\n}\n")); } @Test public void createsSimpleTwoLevelIndex() { String result = generateTypescriptInterpretation("foo.bar"); assertThat( result, equalTo(CODEGEN_INDICATOR + "const returnComparator = () => {\n return result.foo.bar;\n}\n") ); } @Test public void createsDeepIndex() { String result = generateTypescriptInterpretation("foo.bar.car.gar.foo.bar.car"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return result.foo.bar.car.gar.foo.bar.car;\n}\n" ) ); } @Test public void createsListProfile() { String result = generateTypescriptInterpretation("foo.bar[].car"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.foo.bar);\n let projection_3 = flat_1.map((element_2: any) => {\n return element_2.car;\n });\n return projection_3;\n}\n" ) ); } @Test public void createsLengthEqualityCheckProfile() { String result = generateTypescriptInterpretation("length(items) == `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return (result.items.length == 0);\n}\n" ) ); } @Test public void createsLengthLessCheckProfile() { String result = generateTypescriptInterpretation("length(items) < `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return (result.items.length < 0);\n}\n" ) ); } @Test public void createsLengthGreaterCheckProfile() { String result = generateTypescriptInterpretation("length(items) > `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return (result.items.length > 0);\n}\n" ) ); } @Test public void createsDeepLengthCheckProfile() { String result = generateTypescriptInterpretation("length(items.foo.deep[]) == `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.items.foo.deep);\n return (flat_1.length == 0);\n}\n" ) ); } @Test public void createsDoubleLengthChecksProfile() { String result = generateTypescriptInterpretation( "length(set.items[].bar[].gar.foo.items[].item) == length(bar.foos[].foo)" ); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.set.items);\n let projection_3 = flat_1.map((element_2: any) => {\n return element_2.bar;\n });\n let flat_4: any[] = [].concat(...projection_3);\n let projection_6 = flat_4.map((element_5: any) => {\n return element_5.gar.foo.items;\n });\n let flat_7: any[] = [].concat(...projection_6);\n let projection_9 = flat_7.map((element_8: any) => {\n return element_8.item;\n });\n let flat_10: any[] = [].concat(...result.bar.foos);\n let projection_12 = flat_10.map((element_11: any) => {\n return element_11.foo;\n });\n return (projection_9.length == projection_12.length);\n}\n" ) ); } @Test public void createWrapAroundProfile() { String result = generateTypescriptInterpretation("length(items[-1]) == `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return (result.items[result.items.length - 1].length == 0);\n}\n" ) ); } @Test public void createContainsProfile() { String result = generateTypescriptInterpretation("contains(items[].State, `false`)"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.items);\n let projection_3 = flat_1.map((element_2: any) => {\n return element_2.State;\n });\n return projection_3.includes(false);\n}\n" ) ); } @Test public void createWildcardIndex() { String result = generateTypescriptInterpretation("foo.*.bar"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let objectProjection_2 = Object.values(result.foo).map((element_1: any) => {\n return element_1.bar;\n });\n return objectProjection_2;\n}\n" ) ); } @Test public void createFilterIndex() { String result = generateTypescriptInterpretation("items[?foo=='awesome'][]"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let filterRes_2 = result.items.filter((element_1: any) => {\n return (element_1.foo == \"awesome\");\n });\n let flat_3: any[] = [].concat(...filterRes_2);\n return flat_3;\n}\n" ) ); } @Test public void createMultiIndex() { String result = generateTypescriptInterpretation("items[].[`4` > `0`, `1` == `0`][]"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.items);\n let projection_3 = flat_1.map((element_2: any) => {\n let result_4 = [];\n result_4.push((4 > 0));\n result_4.push((1 == 0));\n element_2 = result_4;\n return element_2;\n });\n let flat_5: any[] = [].concat(...projection_3);\n return flat_5;\n}\n" ) ); } @Test public void createLengthFilterInstancesIndex() { String result = generateTypescriptInterpretation( "length(Instances[?LifecycleState==\"InService\"]) >= MinSize" ); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let filterRes_2 = result.Instances.filter((element_1: any) => {\n return (element_1.LifecycleState == element_1.InService);\n });\n return (filterRes_2.length >= result.MinSize);\n}\n" ) ); } @Test public void createComplexLengthFilterContainsIndex() { String result = generateTypescriptInterpretation( "contains(AutoScalingGroups[].[length(Instances[?LifecycleState=='InService']) >= MinSize][], `false`)" ); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.AutoScalingGroups);\n let projection_3 = flat_1.map((element_2: any) => {\n let filterRes_5 = element_2.Instances.filter((element_4: any) => {\n return (element_4.LifecycleState == \"InService\");\n });\n let result_6 = [];\n result_6.push((filterRes_5.length >= element_2.MinSize));\n element_2 = result_6;\n return element_2;\n });\n let flat_7: any[] = [].concat(...projection_3);\n return flat_7.includes(false);\n}\n" ) ); } @Test public void createNotIndex() { String result = generateTypescriptInterpretation("!(length(items) == `0`)"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n return (!(result.items.length == 0));\n}\n" ) ); } @Test public void createOrIndex() { String result = generateTypescriptInterpretation("length(items[]) == `0` || length(foo) > `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.items);\n return (((flat_1.length == 0) || (result.foo.length > 0)) && ((result.foo.length > 0) || (flat_1.length == 0))) ;\n}\n" ) ); } @Test public void createAndIndex() { String result = generateTypescriptInterpretation("length(items[]) == `0` && length(foo) > `0`"); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let flat_1: any[] = [].concat(...result.items);\n return ((flat_1.length == 0) && (result.foo.length > 0));\n}\n" ) ); } @Test public void createComplexAndNotIndex() { String result = generateTypescriptInterpretation( "(length(services[?!(length(deployments) == `1` && runningCount == desiredCount)]) == `0`)" ); assertThat( result, equalTo( CODEGEN_INDICATOR + "const returnComparator = () => {\n let filterRes_2 = result.services.filter((element_1: any) => {\n return (!((element_1.deployments.length == 1) && (element_1.runningCount == element_1.desiredCount)));\n });\n return (filterRes_2.length == 0);\n}\n" ) ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptSettingsTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; import java.util.LinkedHashSet; import java.util.List; import java.util.stream.Stream; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.ServiceIndex; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.protocols.ProtocolPriorityConfig; import software.amazon.smithy.utils.MapUtils; @ExtendWith(MockitoExtension.class) public class TypeScriptSettingsTest { // these are mock protocol names. ShapeId rpcv2Cbor = ShapeId.from("namespace#rpcv2Cbor"); ShapeId json1_0 = ShapeId.from("namespace#json1_0"); ShapeId json1_1 = ShapeId.from("namespace#json1_1"); ShapeId restJson1 = ShapeId.from("namespace#restJson1"); ShapeId restXml = ShapeId.from("namespace#restXml"); ShapeId query = ShapeId.from("namespace#query"); ShapeId serviceQuery = ShapeId.from("namespace#serviceQuery"); LinkedHashSet protocolShapeIds = new LinkedHashSet<>( List.of(json1_0, json1_1, restJson1, rpcv2Cbor, restXml, query, serviceQuery) ); @Test public void resolvesDefaultService() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); assertThat(settings.getService(), equalTo(ShapeId.from("smithy.example#Example"))); } @Test public void defaultsToYarn() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); assertEquals(TypeScriptSettings.PackageManager.YARN, settings.getPackageManager()); } @Test public void canBeConfiguredToNpm() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("packageManager", Node.from("npm")) .build() ); assertEquals(TypeScriptSettings.PackageManager.NPM, settings.getPackageManager()); } @ParameterizedTest @MethodSource("providePackageDescriptionTestCases") void expectPackageDescriptionUpdatedByArtifactType( TypeScriptSettings.ArtifactType artifactType, String expectedDescription ) { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build(); final TypeScriptSettings typeScriptSettings = TypeScriptSettings.from(model, settings, artifactType); assertEquals(typeScriptSettings.getPackageDescription(), expectedDescription); } private static Stream providePackageDescriptionTestCases() { return Stream.of( Arguments.of(TypeScriptSettings.ArtifactType.SSDK, "example server"), Arguments.of(TypeScriptSettings.ArtifactType.CLIENT, "example client") ); } @Test public void resolveServiceProtocolSelectJson( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // spec case 1. when(serviceIndex.getProtocols(service)).thenReturn(MapUtils.of(rpcv2Cbor, null, json1_0, null)); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); // JS customization has JSON at higher default priority than CBOR. assertEquals(json1_0, protocol); } @Test public void resolveServiceProtocolSelectOnlyOption( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // spec case 2. when(serviceIndex.getProtocols(service)).thenReturn(MapUtils.of(rpcv2Cbor, null)); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); assertEquals(rpcv2Cbor, protocol); } @Test public void resolveServiceProtocolSelectJsonOverQueryAndCbor( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // spec case 3. when(serviceIndex.getProtocols(service)).thenReturn(MapUtils.of(rpcv2Cbor, null, json1_0, null, query, null)); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); // JS customization has JSON at higher default priority than CBOR. assertEquals(json1_0, protocol); } @Test public void resolveServiceProtocolSelectJsonOverQuery( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // spec case 4. when(serviceIndex.getProtocols(service)).thenReturn(MapUtils.of(json1_0, null, query, null)); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); assertEquals(json1_0, protocol); } @Test public void resolveServiceProtocolSelectQueryWhenSingularOption( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // spec case 5. when(serviceIndex.getProtocols(service)).thenReturn(MapUtils.of(query, null)); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); assertEquals(query, protocol); } @Test public void resolveServiceProtocolSelectServiceCustomPriority( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // service override, non-spec when(serviceIndex.getProtocols(service)).thenReturn( MapUtils.of( json1_0, null, json1_1, null, restJson1, null, rpcv2Cbor, null, restXml, null, query, null, serviceQuery, null ) ); subject.setProtocolPriority( new ProtocolPriorityConfig( MapUtils.of( serviceShapeId, List.of(serviceQuery, rpcv2Cbor, json1_1, restJson1, restXml, query) ), null ) ); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); assertEquals(serviceQuery, protocol); } @Test public void resolveServiceProtocolSelectDefaultCustomPriority( @Mock Model model, @Mock ServiceShape service, @Mock ServiceIndex serviceIndex ) { TypeScriptSettings subject = new TypeScriptSettings(); when(model.getKnowledge(any(), any())).thenReturn(serviceIndex); ShapeId serviceShapeId = ShapeId.from("namespace#Service"); when(service.toShapeId()).thenReturn(serviceShapeId); // global default override when(serviceIndex.getProtocols(service)).thenReturn( MapUtils.of( json1_0, null, json1_1, null, restJson1, null, rpcv2Cbor, null, restXml, null, query, null, serviceQuery, null ) ); subject.setProtocolPriority( new ProtocolPriorityConfig(null, List.of(rpcv2Cbor, json1_1, restJson1, restXml, query)) ); ShapeId protocol = subject.resolveServiceProtocol(model, service, protocolShapeIds); assertEquals(rpcv2Cbor, protocol); } @Test public void parseProtocolPriorityJson() { Model model = Model.assembler().addImport(getClass().getResource("simple-service.smithy")).assemble().unwrap(); ObjectNode settings = Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember( "serviceProtocolPriority", Node.parse( """ { "namespace#Service1": ["namespace#Protocol1", "namespace#Protocol2"], "namespace#Service2": ["namespace#Protocol2", "namespace#Protocol1"] } """ ) ) .withMember( "defaultProtocolPriority", Node.parse( """ ["namespace#Protocol3", "namespace#Protocol4"] """ ) ) .build(); final TypeScriptSettings subject = TypeScriptSettings.from(model, settings); assertEquals( ShapeId.from("namespace#Protocol2"), subject.getProtocolPriority().getProtocolPriority(ShapeId.from("namespace#Service1")).get(1) ); assertEquals( ShapeId.from("namespace#Protocol2"), subject.getProtocolPriority().getProtocolPriority(ShapeId.from("namespace#Service2")).get(0) ); assertEquals( ShapeId.from("namespace#Protocol4"), subject.getProtocolPriority().getProtocolPriority(ShapeId.from("namespace#Service5")).get(1) ); } @Test public void resolvesSupportProtocols() { // TODO } @Test public void defaultsApplicationProtocolToHttp() { // TODO } @Test public void throwsWhenProtocolsAreNotCoherent() { // TODO } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptUtilsTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Arrays; import org.junit.jupiter.api.Test; public class TypeScriptUtilsTest { @Test public void sanitizesPropertyNames() { assertThat(TypeScriptUtils.sanitizePropertyName("foo"), equalTo("foo")); assertThat(TypeScriptUtils.sanitizePropertyName("$foo"), equalTo("$foo")); assertThat(TypeScriptUtils.sanitizePropertyName("_Foo"), equalTo("_Foo")); assertThat(TypeScriptUtils.sanitizePropertyName("_Foo.bar"), equalTo("\"_Foo.bar\"")); assertThat(TypeScriptUtils.sanitizePropertyName("!foo"), equalTo("\"!foo\"")); assertThat(TypeScriptUtils.sanitizePropertyName("foo?"), equalTo("\"foo?\"")); } @Test public void createsEnumVariantsFromString() { assertThat(TypeScriptUtils.getEnumVariants(Arrays.asList("foo", "bar")), equalTo("\"bar\" | \"foo\"")); assertThat(TypeScriptUtils.getEnumVariants(Arrays.asList("foo!!")), equalTo("\"foo!!\"")); assertThat(TypeScriptUtils.getEnumVariants(Arrays.asList("foo\"", "bar")), equalTo("\"bar\" | \"foo\\\"\"")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/TypeScriptWriterTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.not; import static org.junit.jupiter.api.Assertions.assertEquals; import static software.amazon.smithy.typescript.codegen.TypeScriptWriter.CODEGEN_INDICATOR; import java.nio.file.Paths; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.traits.DeprecatedTrait; import software.amazon.smithy.model.traits.DocumentationTrait; public class TypeScriptWriterTest { @Test public void writesDocStrings() { TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.writeDocs("These are the docs.\nMore."); String result = writer.toString(); assertThat(result, equalTo(CODEGEN_INDICATOR + "/**\n * These are the docs.\n * More.\n */\n")); } @Test public void doesNotAddNewlineBetweenManagedAndExplicitImports() { TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.write("import { Foo } from \"baz\";"); writer.addImport("Baz", "Baz", "./hello"); writer.addImport("Bar", "__Bar", TypeScriptDependency.SMITHY_TYPES); writer.addRelativeImport("Qux", "__Qux", Paths.get("./qux")); String result = writer.toString(); assertEquals( """ %simport { Bar as __Bar } from "@smithy/types"; import { Baz } from "./hello"; import { Qux as __Qux } from "./qux"; import { Foo } from "baz"; """.formatted(CODEGEN_INDICATOR), result ); } @Test public void escapesDollarInDocStrings() { String docs = "This is $ valid documentation."; TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.writeDocs(docs); String result = writer.toString(); assertThat(result, equalTo(CODEGEN_INDICATOR + "/**\n * " + docs + "\n */\n")); } @Test public void escapesMultiLineCloseInDocStrings() { String docs = "This is */ valid documentation."; TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.writeDocs(docs); String result = writer.toString(); assertThat(result, equalTo(CODEGEN_INDICATOR + "/**\n * This is *\\/ valid documentation.\n */\n")); } @Test public void addsFormatterForSymbols() { // TODO } @Test public void addsFormatterForSymbolReferences() { // TODO } @Test public void addImportSubmodule() { TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.addDependency(TypeScriptDependency.SMITHY_CORE); writer.addImportSubmodule("symbol", "__symbol", () -> "@smithy/core", "/submodule"); String result = writer.toString(); assertEquals( """ %simport { symbol as __symbol } from "@smithy/core/submodule"; """.formatted(CODEGEN_INDICATOR) .trim(), result.trim() ); } @Test public void writeShapeDocsIncludesSinceFromDeprecatedTrait() { StringShape shape = StringShape.builder() .id(ShapeId.from("com.example#MyString")) .addTrait(new DocumentationTrait("Some docs.")) .addTrait( DeprecatedTrait.builder() .message("Use MyStringV2 instead") .since("2024-01-01") .build() ) .build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.writeShapeDocs(shape); String result = writer.toString(); assertThat(result, containsString("@deprecated (since 2024-01-01) Use MyStringV2 instead.")); } @Test public void writeShapeDocsOmitsSinceWhenNotSet() { StringShape shape = StringShape.builder() .id(ShapeId.from("com.example#MyString")) .addTrait(new DocumentationTrait("Some docs.")) .addTrait( DeprecatedTrait.builder() .message("Use MyStringV2 instead") .build() ) .build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); writer.writeShapeDocs(shape); String result = writer.toString(); assertThat(result, containsString("@deprecated Use MyStringV2 instead.")); assertThat(result, not(containsString("since"))); } @Test public void buildDeprecationAnnotationWithMessageOnly() { DeprecatedTrait trait = DeprecatedTrait.builder() .message("Use FooV2 instead") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated Use FooV2 instead.", result); } @Test public void buildDeprecationAnnotationWithSinceOnly() { DeprecatedTrait trait = DeprecatedTrait.builder() .since("2024-01-01") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated since 2024-01-01.", result); } @Test public void buildDeprecationAnnotationWithMessageAndSince() { DeprecatedTrait trait = DeprecatedTrait.builder() .message("Use FooV2 instead") .since("2024-01-01") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated (since 2024-01-01) Use FooV2 instead.", result); } @Test public void buildDeprecationAnnotationWithNoFields() { DeprecatedTrait trait = DeprecatedTrait.builder().build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated deprecated.", result); } @Test public void buildIncredulousDeprecationAnnotation() { DeprecatedTrait trait = DeprecatedTrait.builder() .message("what??") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated what??", result); } @Test public void buildDramaticDeprecationAnnotation() { DeprecatedTrait trait = DeprecatedTrait.builder() .message("Noo!!!") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated Noo!!!", result); } @Test public void buildHtmlDeprecationAnnotation() { DeprecatedTrait trait = DeprecatedTrait.builder() .message("

Hello

") .build(); String result = TypeScriptWriter.buildDeprecationAnnotation(trait); assertEquals("@deprecated

Hello

", result); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/UnionGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.UnionShape; public class UnionGeneratorTest { @Test public void generatesTaggedUnions() { MemberShape memberA = MemberShape.builder().id("com.foo#Example$A").target("smithy.api#String").build(); MemberShape memberB = MemberShape.builder().id("com.foo#Example$B").target("smithy.api#Integer").build(); MemberShape memberC = MemberShape.builder().id("com.foo#Example$C").target("smithy.api#Boolean").build(); UnionShape unionShape = UnionShape.builder() .id("com.foo#Example") .addMember(memberA) .addMember(memberB) .addMember(memberC) .build(); Model model = Model.assembler() .addImport(getClass().getResource("simple-service.smithy")) .addShapes(unionShape, memberA, memberB, memberC) .assemble() .unwrap(); TypeScriptSettings settings = TypeScriptSettings.from( model, Node.objectNodeBuilder() .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .build() ); SymbolProvider symbolProvider = new SymbolVisitor(model, settings); TypeScriptWriter writer = new TypeScriptWriter("./Example"); new UnionGenerator(model, settings, symbolProvider, writer, unionShape).run(); String output = writer.toString(); assertEquals( """ // smithy-typescript generated code /** * @public */ export type Example = | Example.AMember | Example.BMember | Example.CMember | Example.$UnknownMember; /** * @public */ export namespace Example { export interface AMember { A: string; B?: never; C?: never; $unknown?: never; } export interface BMember { A?: never; B: number; C?: never; $unknown?: never; } export interface CMember { A?: never; B?: never; C: boolean; $unknown?: never; } /** * @public */ export interface $UnknownMember { A?: never; B?: never; C?: never; $unknown: [string, any]; } export interface Visitor { A: (value: string) => T; B: (value: number) => T; C: (value: boolean) => T; _: (name: string, value: any) => T; } export const visit = (value: Example, visitor: Visitor): T => { if (value.A !== undefined) return visitor.A(value.A); if (value.B !== undefined) return visitor.B(value.B); if (value.C !== undefined) return visitor.C(value.C); return visitor._(value.$unknown[0], value.$unknown[1]); }; } """, output ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/documentation/DocumentationExampleGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.documentation; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.node.ObjectNode; class DocumentationExampleGeneratorTest { ObjectNode input = ObjectNode.builder() .withMember("Key", "example-key") .withMember("Bucket", "example-key") .build(); ObjectNode output = ObjectNode.builder() .withMember("Config", ObjectNode.builder().withMember("Temperature", 30).build()) .build(); @Test void inputToJavaScriptObject() { String example = DocumentationExampleGenerator.inputToJavaScriptObject(input); assertEquals( """ { Bucket: "example-key", Key: "example-key" }""", example ); } @Test void outputToJavaScriptObject() { String example = DocumentationExampleGenerator.inputToJavaScriptObject(output); assertEquals( """ { Config: { Temperature: 30 } }""", example ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/documentation/StructureExampleGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.documentation; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.StreamingTrait; public class StructureExampleGeneratorTest { StringShape string = StringShape.builder().id("foo.bar#string").build(); BlobShape blob = BlobShape.builder().id("foo.bar#blob").build(); BlobShape streamingBlob = BlobShape.builder() .id("foo.bar#streamingBlob") .traits(List.of(new StreamingTrait())) .build(); ListShape list = ListShape.builder().id("foo.bar#list").member(string.getId()).build(); MapShape map = MapShape.builder() .id("foo.bar#map") .key(MemberShape.builder().id("foo.bar#map$member").target(string.getId()).build()) .value(MemberShape.builder().id("foo.bar#map$member").target(string.getId()).build()) .build(); MemberShape memberForString = MemberShape.builder().id("foo.bar#structure$string").target(string.getId()).build(); MemberShape memberForBlob = MemberShape.builder().id("foo.bar#blobStructure$blob").target(blob.getId()).build(); MemberShape memberForStreamingBlob = MemberShape.builder() .id("foo.bar#blobStructure$streamingBlob") .target(streamingBlob.getId()) .build(); MemberShape memberForList = MemberShape.builder().id("foo.bar#structure$list").target(list.getId()).build(); MemberShape memberForMap = MemberShape.builder().id("foo.bar#structure$map").target(map.getId()).build(); StructureShape structure = StructureShape.builder() .id("foo.bar#structure") .members( List.of( memberForString, memberForList, memberForMap, MemberShape.builder().id("foo.bar#structure$list2").target(list.getId()).build(), MemberShape.builder().id("foo.bar#structure$list3").target(list.getId()).build(), MemberShape.builder().id("foo.bar#structure$list4").target(list.getId()).build(), MemberShape.builder().id("foo.bar#structure$list5").target(list.getId()).build(), MemberShape.builder().id("foo.bar#structure$list6").target(list.getId()).build(), MemberShape.builder().id("foo.bar#structure$list7").target(list.getId()).build(), MemberShape.builder() .id("foo.bar#structure$structure") .target("foo.bar#structure") .build() ) ) .build(); StructureShape blobStructure = StructureShape.builder() .id("foo.bar#blobStructure") .members(List.of(memberForBlob, memberForStreamingBlob)) .build(); private Model model = Model.builder() .addShapes(string, list, map, structure, memberForString, memberForList, memberForMap, blob, streamingBlob) .build(); @Test public void generatesStructuralHintDocumentation_map() { assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(map, model, false, true), equalTo( """ { // map "": "STRING_VALUE", };""" ) ); } @Test public void generatesStructuralHintDocumentation_structure() { assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(structure, model, false, true), equalTo( """ { // structure string: "STRING_VALUE", list: [ // list "STRING_VALUE", ], map: { // map "": "STRING_VALUE", }, list2: [ "STRING_VALUE", ], list3: [ "STRING_VALUE", ], list4: [ "STRING_VALUE", ], list5: [ "STRING_VALUE", ], list6: "", list7: "", structure: { string: "STRING_VALUE", list: "", map: { "": "STRING_VALUE", }, list2: "", list3: "", list4: "", list5: "", list6: "", list7: "", structure: "", }, };""" ) ); } @Test public void generatesStructuralHintDocumentation_structure_asComment() { assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(structure, model, true, true), equalTo( """ // { // structure // string: "STRING_VALUE", // list: [ // list // "STRING_VALUE", // ], // map: { // map // "": "STRING_VALUE", // }, // list2: [ // "STRING_VALUE", // ], // list3: [ // "STRING_VALUE", // ], // list4: [ // "STRING_VALUE", // ], // list5: [ // "STRING_VALUE", // ], // list6: "", // list7: "", // structure: { // string: "STRING_VALUE", // list: "", // map: { // "": "STRING_VALUE", // }, // list2: "", // list3: "", // list4: "", // list5: "", // list6: "", // list7: "", // structure: "", // }, // };""" ) ); } @Test public void generatesStructuralHintDocumentation_list() { assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(list, model, false, true), equalTo( """ [ // list "STRING_VALUE", ];""" ) ); } @Test public void generateStructuralHintDocumentation_blob() { assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(blobStructure, model, false, true), equalTo( """ { // blobStructure blob: new Uint8Array(), // e.g. Buffer.from("") or new TextEncoder().encode("") streamingBlob: "MULTIPLE_TYPES_ACCEPTED", // see \\@smithy/types -> StreamingBlobPayloadInputTypes };""" ) ); assertThat( StructureExampleGenerator.generateStructuralHintDocumentation(blobStructure, model, false, false), equalTo( """ { // blobStructure blob: new Uint8Array(), streamingBlob: "", // see \\@smithy/types -> StreamingBlobPayloadOutputTypes };""" ) ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/endpointsV2/EndpointsV2GeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenPlugin; public class EndpointsV2GeneratorTest { @Test public void containsTrailingSemicolon() { MockManifest manifest = testEndpoints("endpoints.smithy"); String ruleset = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/endpoint/ruleset.ts").get(); assertEquals( """ // smithy-typescript generated code import type { RuleSetObject } from "@smithy/types"; export const ruleSet: RuleSetObject = { version: "1.3", parameters: { Region: { type: "String", documentation: "The region to dispatch this request, eg. `us-east-1`.", }, Stage: { type: "String", required: true, default: "production", }, Endpoint: { builtIn: "SDK::Endpoint", type: "String", required: false, documentation: "Override the endpoint used to send this request", }, }, rules: [ { conditions: [ { fn: "isSet", argv: [ { ref: "Endpoint", }, ], }, { fn: "parseURL", argv: [ { ref: "Endpoint", }, ], assign: "url", }, ], endpoint: { url: { ref: "Endpoint", }, properties: {}, headers: {}, }, type: "endpoint", }, { documentation: "Template the region into the URI when region is set", conditions: [ { fn: "isSet", argv: [ { ref: "Region", }, ], }, ], type: "tree", rules: [ { conditions: [ { fn: "stringEquals", argv: [ { ref: "Stage", }, "staging", ], }, ], endpoint: { url: "https://{Region}.staging.example.com/2023-01-01", properties: {}, headers: {}, }, type: "endpoint", }, { conditions: [], endpoint: { url: "https://{Region}.example.com/2023-01-01", properties: {}, headers: {}, }, type: "endpoint", }, ], }, { documentation: "Fallback when region is unset", conditions: [], error: "Region must be set to resolve a valid endpoint", type: "error", }, ], }; """, ruleset ); } @Test public void containsExtraContextParameter() { MockManifest manifest = testEndpoints("endpoints.smithy"); String ruleset = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/endpoint/ruleset.ts").get(); assertThat( ruleset, containsString( """ }, Stage: { type: "String", required: true, default: "production", }, """ ) ); String endpointParameters = manifest .getFileString(CodegenUtils.SOURCE_FOLDER + "/endpoint/EndpointParameters.ts") .get(); assertThat( endpointParameters, containsString( """ return Object.assign(options, { stage: options.stage ?? "production", defaultSigningName: "", clientContextParams: Object.assign(clientContextParamDefaults, options.clientContextParams), }); """ ) ); assertThat( endpointParameters, containsString( """ export interface ClientInputEndpointParameters { clientContextParams?: { region?: string | undefined | Provider; stage?: string | undefined | Provider; }; stage?: string | undefined | Provider; endpoint?: string | Provider | Endpoint | Provider | EndpointV2 | Provider; }""" ) ); } private MockManifest testEndpoints(String filename) { MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .pluginClassLoader(getClass().getClassLoader()) .model( Model.assembler() .addImport(getClass().getResource(filename)) .discoverModels() .assemble() .unwrap() ) .fileManifest(manifest) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("generateEndpointBdd", Node.from(false)) .build() ) .build(); new TypeScriptCodegenPlugin().execute(context); assertThat(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/endpoint/EndpointParameters.ts"), is(true)); assertThat(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/endpoint/endpointResolver.ts"), is(true)); String contents = manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/endpoint/ruleset.ts").get(); assertThat(contents, containsString("export const ruleSet: RuleSetObject")); return manifest; } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSetParameterFinderTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.endpointsV2; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.rulesengine.language.EndpointRuleSet; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; @ExtendWith(MockitoExtension.class) class RuleSetParameterFinderTest { RuleSetParameterFinder subject; Node ruleSet = Node.parse( """ { "version": "1.0", "parameters": { "BasicParameter": { "required": false, "documentation": "...", "type": "String" }, "NestedParameter": { "required": true, "documentation": "...", "type": "Boolean" }, "UrlOnlyParameter": { "required": true, "documentation": "...", "type": "String" }, "UnusedParameter": { "required": false, "documentation": "...", "type": "String" }, "ShorthandParameter": { "required": true, "documentation": "...", "type": "String" } }, "rules": [ { "conditions": [ { "fn": "isSet", "argv": [ { "ref": "BasicParameter" } ] } ], "rules": [ { "conditions": [ { "fn": "booleanEquals", "argv": [ { "fn": "booleanEquals", "argv": [ { "fn": "booleanEquals", "argv": [ { "fn": "booleanEquals", "argv": [ { "ref": "NestedParameter" }, true ] }, true ] }, true ] }, true ] }, { "fn": "stringEquals", "argv": [ "literal", "{ShorthandParameter}" ] } ], "endpoint": { "url": "https://www.{BasicParameter}.{UrlOnlyParameter}.com", "properties": {}, "headers": {} }, "type": "endpoint" } ], "type": "tree" } ] } """ ); @Test void getEffectiveParams(@Mock ServiceShape serviceShape, @Mock EndpointRuleSetTrait endpointRuleSetTrait) { EndpointRuleSet endpointRuleSet = EndpointRuleSet.fromNode(ruleSet); when(serviceShape.getTrait(EndpointRuleSetTrait.class)).thenReturn(Optional.of(endpointRuleSetTrait)); when(endpointRuleSetTrait.getEndpointRuleSet()).thenReturn(endpointRuleSet); subject = new RuleSetParameterFinder(serviceShape); List effectiveParams = subject.getEffectiveParams(); assertEquals( List.of("BasicParameter", "NestedParameter", "ShorthandParameter", "UrlOnlyParameter"), effectiveParams ); } @Test void getJmesPathExpression(@Mock ServiceShape serviceShape, @Mock EndpointRuleSetTrait endpointRuleSetTrait) { when(serviceShape.getTrait(EndpointRuleSetTrait.class)).thenReturn(Optional.of(endpointRuleSetTrait)); subject = new RuleSetParameterFinder(serviceShape); assertEquals( """ Object.keys(input?.RequestItems ?? {})""", subject.getJmesPathExpression("?.", "input", "keys(RequestItems)") ); assertEquals( """ input?.TableCreationParameters?.TableName""", subject.getJmesPathExpression("?.", "input", "TableCreationParameters.TableName") ); assertEquals( """ input?.TransactItems?.map((obj: any) => obj?.Get?.TableName""", subject.getJmesPathExpression("?.", "input", "TransactItems[*].Get.TableName") ); assertEquals( """ input?.TransactItems?.map((obj: any) => [obj?.ConditionCheck?.TableName,obj?.Put?.TableName,obj?.Delete?.TableName,obj?.Update?.TableName].filter((i) => i)).flat()""", subject.getJmesPathExpression( "?.", "input", "TransactItems[*].[ConditionCheck.TableName, Put.TableName, Delete.TableName, Update.TableName][]" ) ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/AddHttpApiKeyAuthPluginTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import java.util.Collection; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.build.MockManifest; import software.amazon.smithy.build.PluginContext; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptClientCodegenPlugin; public class AddHttpApiKeyAuthPluginTest { @Test public void httpApiKeyAuthClientOnService() { testInjects("http-api-key-auth-trait.smithy", """ in: 'header', name: 'Authorization', scheme: 'ApiKey'"""); } @Test public void httpApiKeyAuthClientOnOperation() { testInjects( "http-api-key-auth-trait-on-operation.smithy", """ in: 'header', name: 'Authorization', scheme: 'ApiKey'""" ); } // This should be identical to the httpApiKeyAuthClient test except for the parameters provided // to the middleware. @Test public void httpApiKeyAuthClientNoScheme() { testInjects("http-api-key-auth-trait-no-scheme.smithy", """ in: 'header', name: 'Authorization'"""); } private void testInjects(String filename, String extra) { MockManifest manifest = generate(filename); // Ensure that the client imports the config properly and calls the resolve function. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), containsString("from \"./middleware/HttpApiKeyAuth\"") ); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), containsString("= resolveHttpApiKeyAuthConfig(") ); // Ensure that the GetFoo operation imports the middleware and uses it with all the options. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetFooCommand.ts").get(), containsString("from \"../middleware/HttpApiKeyAuth\"") ); String generatedGetFooCommand = manifest .getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetFooCommand.ts") .get(); assertThat(generatedGetFooCommand, containsString("getHttpApiKeyAuthPlugin(config")); Collection lines = List.of(extra.split("\n")); for (String line : lines) { assertThat(generatedGetFooCommand, containsString(line)); } // Ensure that the GetBar operation does not import the middleware or use it. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetBarCommand.ts").get(), not(containsString("from \"../middleware/HttpApiKeyAuth\"")) ); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetBarCommand.ts").get(), not(containsString("getHttpApiKeyAuthPlugin")) ); // Make sure that the middleware file was written and exports the plugin symbol. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/middleware/HttpApiKeyAuth/index.ts").get(), containsString("export const getHttpApiKeyAuthPlugin") ); // Ensure that the middleware was being exported in the index file. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/index.ts").get(), containsString("from \"./middleware/HttpApiKeyAuth\"") ); } private MockManifest generate(String filename) { MockManifest manifest = new MockManifest(); PluginContext context = PluginContext.builder() .pluginClassLoader(getClass().getClassLoader()) .model( Model.assembler() .addImport(getClass().getResource(filename)) .discoverModels() .assemble() .unwrap() ) .fileManifest(manifest) .settings( Node.objectNodeBuilder() .withMember("service", Node.from("smithy.example#Example")) .withMember("package", Node.from("example")) .withMember("packageVersion", Node.from("1.0.0")) .withMember("useLegacyAuth", Node.from(true)) .build() ) .build(); new TypeScriptClientCodegenPlugin().execute(context); return manifest; } @Test public void notAnHttpApiKeyAuthClient() { testDoesNotInject("endpoint-trait.smithy"); } @Test public void httpApiKeyAuthClientWithAllOptionalAuthOperations() { testDoesNotInject("http-api-key-auth-trait-all-optional.smithy"); } private void testDoesNotInject(String filename) { MockManifest manifest = generate(filename); // Make sure that the config and middleware were not added to the client. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), not(containsString("= resolveHttpApiKeyAuthConfig(")) ); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/ExampleClient.ts").get(), not(containsString("from \"./middleware/HttpApiKeyAuth\"")) ); // Make sure that the import and middleware were not used in the operation. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetFooCommand.ts").get(), not(containsString("from \"../middleware/HttpApiKeyAuth\"")) ); assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/commands/GetFooCommand.ts").get(), not(containsString("getHttpApiKeyAuthPlugin(configuration")) ); // Make sure that the middleware file was not written. assertThat(manifest.hasFile(CodegenUtils.SOURCE_FOLDER + "/middleware/HttpApiKeyAuth/index.ts"), is(false)); // Ensure that the middleware was not being exported in the index file. assertThat( manifest.getFileString(CodegenUtils.SOURCE_FOLDER + "/index.ts").get(), not(containsString("from \"./middleware/HttpApiKeyAuth\"")) ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/DocumentMemberDeserVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Collection; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.ByteShape; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.IntegerShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.ShortShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptSettings.ArtifactType; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.utils.ListUtils; public class DocumentMemberDeserVisitorTest { private static final String DATA_SOURCE = "dataSource"; private static final String PROTOCOL = "TestProtocol"; private static final Format FORMAT = Format.EPOCH_SECONDS; private static GenerationContext mockContext; private static TypeScriptSettings mockSettings; private static StringShape target = StringShape.builder().id(ShapeId.from("com.smithy.example#FooTarget")).build(); static { mockContext = new GenerationContext(); mockSettings = new TypeScriptSettings(); mockContext.setProtocolName(PROTOCOL); mockContext.setSymbolProvider(new MockProvider()); mockContext.setWriter(new TypeScriptWriter("foo")); mockSettings.setArtifactType(ArtifactType.SSDK); mockContext.setSettings(mockSettings); } @ParameterizedTest @MethodSource("validMemberTargetTypes") public void providesExpectedDefaults(Shape shape, String expected, MemberShape memberShape) { Shape fakeStruct = StructureShape.builder().id("com.smithy.example#Enclosing").addMember(memberShape).build(); mockContext.setModel(Model.builder().addShapes(shape, fakeStruct, target).build()); DocumentMemberDeserVisitor visitor = new DocumentMemberDeserVisitor(mockContext, DATA_SOURCE, FORMAT) { @Override protected MemberShape getMemberShape() { return memberShape; } }; assertThat(shape.accept(visitor), equalTo(expected)); } public static Collection validMemberTargetTypes() { String id = "com.smithy.example#Foo"; String targetId = String.valueOf(target.getId()); MemberShape source = MemberShape.builder().id("com.smithy.example#Enclosing$sourceMember").target(id).build(); MemberShape member = MemberShape.builder().id(id + "$member").target(targetId).build(); MemberShape key = MemberShape.builder().id(id + "$key").target(targetId).build(); MemberShape value = MemberShape.builder().id(id + "$value").target(targetId).build(); String delegate = "de_Foo" + "(" + DATA_SOURCE + ", context)"; return ListUtils.of( new Object[][] { {BooleanShape.builder().id(id).build(), "__expectBoolean(" + DATA_SOURCE + ")", source}, {ByteShape.builder().id(id).build(), "__expectByte(" + DATA_SOURCE + ")", source}, {DoubleShape.builder().id(id).build(), "__limitedParseDouble(" + DATA_SOURCE + ")", source}, {FloatShape.builder().id(id).build(), "__limitedParseFloat32(" + DATA_SOURCE + ")", source}, {IntegerShape.builder().id(id).build(), "__expectInt32(" + DATA_SOURCE + ")", source}, {LongShape.builder().id(id).build(), "__expectLong(" + DATA_SOURCE + ")", source}, {ShortShape.builder().id(id).build(), "__expectShort(" + DATA_SOURCE + ")", source}, {StringShape.builder().id(id).build(), "__expectString(" + DATA_SOURCE + ")", source}, { StringShape.builder().id(id).addTrait(new MediaTypeTrait("foo+json")).build(), "__LazyJsonString.from(" + DATA_SOURCE + ")", source, }, {BlobShape.builder().id(id).build(), "context.base64Decoder(" + DATA_SOURCE + ")", source}, {DocumentShape.builder().id(id).build(), delegate, source}, {ListShape.builder().id(id).member(member).build(), delegate, source}, {SetShape.builder().id(id).member(member).build(), delegate, source}, {MapShape.builder().id(id).key(key).value(value).build(), delegate, source}, {StructureShape.builder().id(id).build(), delegate, source}, { TimestampShape.builder().id(id).build(), "__expectNonNull(__parseEpochTimestamp(" + DATA_SOURCE + "))", source, }, { TimestampShape.builder().id(id).build(), "__expectNonNull(__parseRfc3339DateTime(" + DATA_SOURCE + "))", source.toBuilder() .addTrait(new TimestampFormatTrait(TimestampFormatTrait.DATE_TIME)) .build(), }, { TimestampShape.builder().id(id).build(), "__expectNonNull(__parseRfc7231DateTime(" + DATA_SOURCE + "))", source.toBuilder() .addTrait(new TimestampFormatTrait(TimestampFormatTrait.HTTP_DATE)) .build(), }, { UnionShape.builder().id(id).addMember(member).build(), "de_Foo(__expectUnion(" + DATA_SOURCE + "), context)", source, }, } ); } @Test public void throwsOnInvalidDocumentMembers() { String id = "com.smithy.example#Foo"; DocumentMemberDeserVisitor visitor = new DocumentMemberDeserVisitor(mockContext, DATA_SOURCE, FORMAT); Assertions.assertThrows(CodegenException.class, () -> { ServiceShape.builder().version("1").id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { OperationShape.builder().id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { ResourceShape.builder().addIdentifier("id", id + "Id").id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { MemberShape.builder().target(id + "Target").id(id + "$member").build().accept(visitor); }); } private static final class MockProvider implements SymbolProvider { private final String id = "com.smithy.example#Foo"; private Symbol mock = Symbol.builder().name("Foo").namespace("com.smithy.example", "/").build(); private Symbol collectionMock = Symbol.builder().name("Foo[]").namespace("com.smithy.example", "/").build(); @Override public Symbol toSymbol(Shape shape) { if (shape instanceof CollectionShape) { MemberShape member = MemberShape.builder().id(id + "$member").target(id + "Target").build(); return collectionMock .toBuilder() .putProperty("shape", ListShape.builder().id(id).member(member).build()) .build(); } return mock.toBuilder().putProperty("shape", StructureShape.builder().id(id).build()).build(); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/DocumentMemberSerVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Collection; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.BigDecimalShape; import software.amazon.smithy.model.shapes.BigIntegerShape; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.BooleanShape; import software.amazon.smithy.model.shapes.ByteShape; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.IntegerShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.LongShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ResourceShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShortShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; import software.amazon.smithy.utils.ListUtils; public class DocumentMemberSerVisitorTest { private static final String DATA_SOURCE = "dataSource"; private static final String PROTOCOL = "TestProtocol"; private static final Format FORMAT = Format.EPOCH_SECONDS; private static GenerationContext mockContext; static { mockContext = new GenerationContext(); mockContext.setProtocolName(PROTOCOL); mockContext.setSymbolProvider(new MockProvider()); mockContext.setWriter(new TypeScriptWriter("foo")); mockContext.setModel(Model.builder().build()); } @ParameterizedTest @MethodSource("validMemberTargetTypes") public void providesExpectedDefaults(Shape shape, String expected) { DocumentMemberSerVisitor visitor = new DocumentMemberSerVisitor(mockContext, DATA_SOURCE, FORMAT); assertThat(shape.accept(visitor), equalTo(expected)); } public static Collection validMemberTargetTypes() { String id = "com.smithy.example#Foo"; String targetId = id + "Target"; MemberShape member = MemberShape.builder().id(id + "$member").target(targetId).build(); MemberShape key = MemberShape.builder().id(id + "$key").target(targetId).build(); MemberShape value = MemberShape.builder().id(id + "$value").target(targetId).build(); String delegate = "se_Foo(" + DATA_SOURCE + ", context)"; return ListUtils.of( new Object[][] { {BooleanShape.builder().id(id).build(), DATA_SOURCE}, {BigDecimalShape.builder().id(id).build(), "String(" + DATA_SOURCE + ")"}, {BigIntegerShape.builder().id(id).build(), "String(" + DATA_SOURCE + ")"}, {ByteShape.builder().id(id).build(), DATA_SOURCE}, {DoubleShape.builder().id(id).build(), "__serializeFloat(" + DATA_SOURCE + ")"}, {FloatShape.builder().id(id).build(), "__serializeFloat(" + DATA_SOURCE + ")"}, {IntegerShape.builder().id(id).build(), DATA_SOURCE}, {LongShape.builder().id(id).build(), DATA_SOURCE}, {ShortShape.builder().id(id).build(), DATA_SOURCE}, {StringShape.builder().id(id).build(), DATA_SOURCE}, { StringShape.builder().id(id).addTrait(new MediaTypeTrait("foo+json")).build(), "__LazyJsonString.from(" + DATA_SOURCE + ")", }, {BlobShape.builder().id(id).build(), "context.base64Encoder(" + DATA_SOURCE + ")"}, {DocumentShape.builder().id(id).build(), delegate}, {ListShape.builder().id(id).member(member).build(), delegate}, {SetShape.builder().id(id).member(member).build(), delegate}, {MapShape.builder().id(id).key(key).value(value).build(), delegate}, {StructureShape.builder().id(id).build(), delegate}, {UnionShape.builder().id(id).addMember(member).build(), delegate}, } ); } @Test public void throwsOnInvalidDocumentMembers() { String id = "com.smithy.example#Foo"; DocumentMemberSerVisitor visitor = new DocumentMemberSerVisitor(mockContext, DATA_SOURCE, FORMAT); Assertions.assertThrows(CodegenException.class, () -> { ServiceShape.builder().version("1").id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { OperationShape.builder().id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { ResourceShape.builder().addIdentifier("id", id + "Id").id(id).build().accept(visitor); }); Assertions.assertThrows(CodegenException.class, () -> { MemberShape.builder().target(id + "Target").id(id + "$member").build().accept(visitor); }); } private static final class MockProvider implements SymbolProvider { private final String id = "com.smithy.example#Foo"; private Symbol mock = Symbol.builder().name("Foo").namespace("com.smithy.example", "/").build(); private Symbol collectionMock = Symbol.builder().name("Foo[]").namespace("com.smithy.example", "/").build(); @Override public Symbol toSymbol(Shape shape) { if (shape instanceof CollectionShape) { MemberShape member = MemberShape.builder().id(id + "$member").target(id + "Target").build(); return collectionMock .toBuilder() .putProperty("shape", ListShape.builder().id(id).member(member).build()) .build(); } return mock.toBuilder().putProperty("shape", StructureShape.builder().id(id).build()).build(); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/EventStreamGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; import java.util.List; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.codegen.core.CodegenException; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.model.traits.StreamingTrait; @ExtendWith(MockitoExtension.class) class EventStreamGeneratorTest { @Test void getEventStreamMember( @Mock ProtocolGenerator.GenerationContext context, @Mock Model model, @Mock StructureShape struct, @Mock MemberShape eventStreamMember1, @Mock ShapeId streamingMember1ShapeId, @Mock UnionShape streamingTarget1 ) { when(struct.members()).thenReturn(List.of(eventStreamMember1)); when(eventStreamMember1.getTarget()).thenReturn(streamingMember1ShapeId); when(context.getModel()).thenReturn(model); when(model.expectShape(streamingMember1ShapeId)).thenReturn(streamingTarget1); when(streamingTarget1.hasTrait(StreamingTrait.class)).thenReturn(true); when(streamingTarget1.isUnionShape()).thenReturn(true); MemberShape eventStreamMember = EventStreamGenerator.getEventStreamMember(context, struct); assertEquals(eventStreamMember1, eventStreamMember); } @Test void getEventStreamMemberTooFew(@Mock ProtocolGenerator.GenerationContext context, @Mock StructureShape struct) { when(struct.members()).thenReturn(List.of()); when(struct.getId()).thenReturn(ShapeId.from("namespace#Shape")); try { MemberShape eventStreamMember = EventStreamGenerator.getEventStreamMember(context, struct); } catch (CodegenException e) { assertEquals("No event stream member found in " + struct.getId().toString(), e.getMessage()); } } @Test void getEventStreamMemberTooMany( @Mock ProtocolGenerator.GenerationContext context, @Mock Model model, @Mock StructureShape struct, @Mock MemberShape eventStreamMember1, @Mock ShapeId streamingMember1ShapeId, @Mock UnionShape streamingTarget1, @Mock MemberShape eventStreamMember2, @Mock ShapeId streamingMember2ShapeId, @Mock UnionShape streamingTarget2 ) { when(struct.members()).thenReturn(List.of(eventStreamMember1, eventStreamMember2)); when(context.getModel()).thenReturn(model); when(struct.getId()).thenReturn(ShapeId.from("namespace#Shape")); when(eventStreamMember1.getTarget()).thenReturn(streamingMember1ShapeId); when(model.expectShape(streamingMember1ShapeId)).thenReturn(streamingTarget1); when(streamingTarget1.hasTrait(StreamingTrait.class)).thenReturn(true); when(streamingTarget1.isUnionShape()).thenReturn(true); when(eventStreamMember2.getTarget()).thenReturn(streamingMember2ShapeId); when(model.expectShape(streamingMember2ShapeId)).thenReturn(streamingTarget2); when(streamingTarget2.hasTrait(StreamingTrait.class)).thenReturn(true); when(streamingTarget2.isUnionShape()).thenReturn(true); try { MemberShape eventStreamMember = EventStreamGenerator.getEventStreamMember(context, struct); } catch (CodegenException e) { assertEquals("More than one event stream member in " + struct.getId().toString(), e.getMessage()); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/HttpProtocolGeneratorUtilsTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.knowledge.HttpBinding.Location; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator.GenerationContext; public class HttpProtocolGeneratorUtilsTest { private static final String DATA_SOURCE = "dataSource"; @Test public void givesCorrectTimestampSerialization() { GenerationContext mockContext = new GenerationContext(); TypeScriptWriter writer = new TypeScriptWriter("foo"); mockContext.setWriter(writer); TimestampShape shape = TimestampShape.builder().id("com.smithy.example#Foo").build(); assertThat( "__serializeDateTime(" + DATA_SOURCE + ")", equalTo( HttpProtocolGeneratorUtils .getTimestampInputParam(mockContext, DATA_SOURCE, shape, Format.DATE_TIME) ) ); assertThat( "(" + DATA_SOURCE + ".getTime() / 1_000)", equalTo( HttpProtocolGeneratorUtils .getTimestampInputParam(mockContext, DATA_SOURCE, shape, Format.EPOCH_SECONDS) ) ); assertThat( "__dateToUtcString(" + DATA_SOURCE + ")", equalTo( HttpProtocolGeneratorUtils .getTimestampInputParam(mockContext, DATA_SOURCE, shape, Format.HTTP_DATE) ) ); } @Test public void givesCorrectTimestampDeserialization() { TimestampShape shape = TimestampShape.builder().id("com.smithy.example#Foo").build(); TypeScriptWriter writer = new TypeScriptWriter("foo"); assertThat( "__expectNonNull(__parseRfc3339DateTimeWithOffset(" + DATA_SOURCE + "))", equalTo( HttpProtocolGeneratorUtils.getTimestampOutputParam( writer, DATA_SOURCE, Location.DOCUMENT, shape, Format.DATE_TIME, false, true ) ) ); assertThat( "__expectNonNull(__parseRfc3339DateTime(" + DATA_SOURCE + "))", equalTo( HttpProtocolGeneratorUtils.getTimestampOutputParam( writer, DATA_SOURCE, Location.DOCUMENT, shape, Format.DATE_TIME, false, false ) ) ); assertThat( "__expectNonNull(__parseEpochTimestamp(__expectNumber(" + DATA_SOURCE + ")))", equalTo( HttpProtocolGeneratorUtils.getTimestampOutputParam( writer, DATA_SOURCE, Location.DOCUMENT, shape, Format.EPOCH_SECONDS, true, false ) ) ); assertThat( "__expectNonNull(__parseEpochTimestamp(" + DATA_SOURCE + "))", equalTo( HttpProtocolGeneratorUtils.getTimestampOutputParam( writer, DATA_SOURCE, Location.DOCUMENT, shape, Format.EPOCH_SECONDS, false, false ) ) ); assertThat( "__expectNonNull(__parseRfc7231DateTime(" + DATA_SOURCE + "))", equalTo( HttpProtocolGeneratorUtils.getTimestampOutputParam( writer, DATA_SOURCE, Location.DOCUMENT, shape, Format.HTTP_DATE, false, false ) ) ); } @Test public void writesCorrectHostPrefix() { GenerationContext mockContext = new GenerationContext(); mockContext.setSymbolProvider(new MockProvider()); TypeScriptWriter writer = new TypeScriptWriter("foo"); mockContext.setWriter(writer); Model model = Model.assembler().addImport(getClass().getResource("endpoint-trait.smithy")).assemble().unwrap(); mockContext.setModel(model); OperationShape operation = (OperationShape) model.expectShape(ShapeId.from("smithy.example#GetFoo")); HttpProtocolGeneratorUtils.writeHostPrefix(mockContext, operation); assertThat(writer.toString(), containsString("let { hostname: resolvedHostname } = await context.endpoint();")); assertThat(writer.toString(), containsString("if (context.disableHostPrefix !== true) {")); assertThat(writer.toString(), containsString("resolvedHostname = \"{foo}.data.\" + resolvedHostname;")); assertThat( writer.toString(), containsString("resolvedHostname = resolvedHostname.replace(\"{foo}\", input.foo!)") ); assertThat(writer.toString(), containsString("if (!__isValidHostname(resolvedHostname)) {")); assertThat( writer.toString(), containsString("throw new Error(\"ValidationError: prefixed hostname must be hostname compatible.") ); } private static final class MockProvider implements SymbolProvider { private final String id = "com.smithy.example#Foo"; private Symbol mock = Symbol.builder().name("Foo").namespace("com.smithy.example", "/").build(); @Override public Symbol toSymbol(Shape shape) { return mock.toBuilder().putProperty("shape", StructureShape.builder().id(id).build()).build(); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/ProtocolGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.StringShape; public class ProtocolGeneratorTest { @Test public void sanitizesNames() { assertThat(ProtocolGenerator.getSanitizedName("aws.rest-json.1.1"), equalTo("Aws_restJson_1_1")); } @Test public void buildsSerFunctionName() { StringShape shape = StringShape.builder().id("com.smithy.example#Foo").build(); Symbol symbol = Symbol.builder() .name("Foo") .namespace("com.smithy.example", ".") .putProperty("shape", shape) .build(); assertThat( ProtocolGenerator.getSerFunctionName(symbol, "aws.rest-json.1.1"), equalTo("serializeAws_restJson_1_1Foo") ); } @Test public void buildsSerFunctionNameForCollection() { MemberShape member = MemberShape.builder() .id("com.smithy.example#FooList$member") .target("com.smithy.example#Foo") .build(); ListShape list = ListShape.builder().id("com.smithy.example#FooList").member(member).build(); Symbol symbol = Symbol.builder() .name("Foo[]") .namespace("com.smithy.example", ".") .putProperty("shape", list) .build(); assertThat( ProtocolGenerator.getSerFunctionName(symbol, "aws.rest-json.1.1"), equalTo("serializeAws_restJson_1_1FooList") ); } @Test public void buildsDeserFunctionName() { StringShape shape = StringShape.builder().id("com.smithy.example#Foo").build(); Symbol symbol = Symbol.builder() .name("Foo") .namespace("com.smithy.example", ".") .putProperty("shape", shape) .build(); assertThat( ProtocolGenerator.getDeserFunctionName(symbol, "aws.rest-json.1.1"), equalTo("deserializeAws_restJson_1_1Foo") ); } @Test public void buildsDeserFunctionNameForCollection() { MemberShape member = MemberShape.builder() .id("com.smithy.example#FooList$member") .target("com.smithy.example#Foo") .build(); ListShape list = ListShape.builder().id("com.smithy.example#FooList").member(member).build(); Symbol symbol = Symbol.builder() .name("Foo[]") .namespace("com.smithy.example", ".") .putProperty("shape", list) .build(); assertThat( ProtocolGenerator.getDeserFunctionName(symbol, "aws.rest-json.1.1"), equalTo("deserializeAws_restJson_1_1FooList") ); } @Test public void detectsCompatibleGenerators() { // TODO } @Test public void detectsIncompatibleGenerators() { // TODO } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/integration/RuntimeClientPluginTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.integration; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; public class RuntimeClientPluginTest { @Test public void allowsAllServicesByDefault() { ServiceShape service = ServiceShape.builder().id("a.b#C").version("123").build(); OperationShape operation = OperationShape.builder().id("a.b#Operation").build(); Model model = Model.assembler().addShapes(service, operation).assemble().unwrap(); RuntimeClientPlugin plugin = RuntimeClientPlugin.builder() .servicePredicate((m, s) -> s.getId().getName().equals("C")) .build(); assertThat(plugin.matchesService(model, service), equalTo(true)); assertThat(plugin.matchesOperation(model, service, operation), equalTo(false)); } @Test public void allowsConfigurableOperationsPredicate() { ServiceShape service = ServiceShape.builder().id("a.b#C").version("123").build(); OperationShape operation1 = OperationShape.builder().id("a.b#D").build(); OperationShape operation2 = OperationShape.builder().id("a.b#E").build(); Model model = Model.assembler().addShapes(service, operation1, operation2).assemble().unwrap(); RuntimeClientPlugin plugin = RuntimeClientPlugin.builder() .operationPredicate((m, s, o) -> o.getId().getName().equals("D")) .build(); assertThat(plugin.matchesOperation(model, service, operation1), equalTo(true)); assertThat(plugin.matchesOperation(model, service, operation2), equalTo(false)); assertThat(plugin.matchesService(model, service), equalTo(false)); } @Test public void allowsConfigurableServicePredicate() { ServiceShape service1 = ServiceShape.builder().id("a.b#C").version("123").build(); ServiceShape service2 = ServiceShape.builder().id("a.b#D").version("123").build(); OperationShape operation = OperationShape.builder().id("a.b#Operation").build(); Model model = Model.assembler().addShapes(service1, service2, operation).assemble().unwrap(); RuntimeClientPlugin plugin = RuntimeClientPlugin.builder() .servicePredicate((m, s) -> s.getId().getName().equals("C")) .build(); assertThat(plugin.matchesService(model, service1), equalTo(true)); assertThat(plugin.matchesService(model, service2), equalTo(false)); assertThat(plugin.matchesOperation(model, service1, operation), equalTo(false)); assertThat(plugin.matchesOperation(model, service2, operation), equalTo(false)); } @Test public void allowsConfigurableSettingsPredicate() { ServiceShape service = ServiceShape.builder().id("a.b#C").version("123").build(); Model model = Model.assembler().addShapes(service).assemble().unwrap(); RuntimeClientPlugin createDefaultReadmeFlagPlugin = RuntimeClientPlugin.builder() .settingsPredicate((m, s, settings) -> settings.createDefaultReadme()) .build(); TypeScriptSettings createDefaultReadmeTrueSettings = new TypeScriptSettings(); createDefaultReadmeTrueSettings.setCreateDefaultReadme(true); assertThat( createDefaultReadmeFlagPlugin.matchesSettings(model, service, createDefaultReadmeTrueSettings), equalTo(true) ); TypeScriptSettings createDefaultReadmeFalseSettings = new TypeScriptSettings(); assertThat( createDefaultReadmeFlagPlugin.matchesSettings(model, service, createDefaultReadmeFalseSettings), equalTo(false) ); } @Test public void configuresWithDefaultConventions() { Map resolveFunctionParams = new HashMap() { { put("resolveFunctionParam", "resolveFunctionParam"); } }; Map pluginFunctionParams = new HashMap() { { put("pluginFunctionParam", "pluginFunctionParam"); } }; RuntimeClientPlugin plugin = RuntimeClientPlugin.builder() .withConventions("foo/baz", "1.0.0", "Foo") .additionalResolveFunctionParamsSupplier((m, s, o) -> resolveFunctionParams) .additionalPluginFunctionParamsSupplier((m, s, o) -> pluginFunctionParams) .build(); assertThat(plugin.getInputConfig().get().getSymbol().getNamespace(), equalTo("foo/baz")); assertThat(plugin.getInputConfig().get().getSymbol().getName(), equalTo("FooInputConfig")); assertThat(plugin.getResolvedConfig().get().getSymbol().getNamespace(), equalTo("foo/baz")); assertThat(plugin.getResolvedConfig().get().getSymbol().getName(), equalTo("FooResolvedConfig")); assertThat(plugin.getResolveFunction().get().getSymbol().getNamespace(), equalTo("foo/baz")); assertThat(plugin.getResolveFunction().get().getSymbol().getName(), equalTo("resolveFooConfig")); assertThat(plugin.getAdditionalResolveFunctionParameters(null, null, null), equalTo(resolveFunctionParams)); assertThat(plugin.getPluginFunction().get().getSymbol().getNamespace(), equalTo("foo/baz")); assertThat(plugin.getPluginFunction().get().getSymbol().getName(), equalTo("getFooPlugin")); assertThat(plugin.getAdditionalPluginFunctionParameters(null, null, null), equalTo(pluginFunctionParams)); assertThat( plugin.getInputConfig().get().getSymbol().getDependencies().get(0).getPackageName(), equalTo("foo/baz") ); assertThat( plugin.getResolvedConfig().get().getSymbol().getDependencies().get(0).getPackageName(), equalTo("foo/baz") ); assertThat( plugin.getResolveFunction().get().getSymbol().getDependencies().get(0).getPackageName(), equalTo("foo/baz") ); assertThat( plugin.getPluginFunction().get().getSymbol().getDependencies().get(0).getPackageName(), equalTo("foo/baz") ); assertThat(plugin.getInputConfig().get().getSymbol().getDependencies().get(0).getVersion(), equalTo("1.0.0")); assertThat( plugin.getResolvedConfig().get().getSymbol().getDependencies().get(0).getVersion(), equalTo("1.0.0") ); assertThat( plugin.getResolveFunction().get().getSymbol().getDependencies().get(0).getVersion(), equalTo("1.0.0") ); assertThat( plugin.getPluginFunction().get().getSymbol().getDependencies().get(0).getVersion(), equalTo("1.0.0") ); } @Test public void allConfigSymbolsMustBeSetIfAnyAreSet() { Assertions.assertThrows( IllegalStateException.class, () -> RuntimeClientPlugin.builder() .inputConfig(Symbol.builder().namespace("foo", "/").name("abc").build()) .build() ); } @Test public void destroyFunctionRequiresResolvedConfig() { Assertions.assertThrows( IllegalStateException.class, () -> RuntimeClientPlugin.builder() .withConventions("foo/baz", "1.0.0", "Foo", RuntimeClientPlugin.Convention.HAS_DESTROY) .build() ); } @Test public void convertsToBuilder() { RuntimeClientPlugin plugin = RuntimeClientPlugin.builder().withConventions("foo/baz", "1.0.0", "Foo").build(); assertThat(plugin.toBuilder().build(), equalTo(plugin)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/knowledge/SerdeElisionIndexTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.knowledge; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.SetShape; import software.amazon.smithy.model.shapes.ShapeId; public class SerdeElisionIndexTest { private static Model model; @BeforeAll public static void before() { model = Model.assembler() .addImport(SerdeElisionIndexTest.class.getResource("serde-elision.smithy")) .assemble() .unwrap(); } @AfterAll public static void after() { model = null; } @Test public void mayElideSimpleObjects() { SerdeElisionIndex index = SerdeElisionIndex.of(model); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#SimpleString")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#SimpleList")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#SimpleMap")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#SimpleStruct")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Boolean")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Byte")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Enum")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Integer")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#IntEnum")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Long")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#Short")).get())); assertTrue(index.mayElide(model.getShape(ShapeId.from("foo.bar#SimpleStruct")).get())); } @Test public void cannotElideUnsupportedTypes() { SerdeElisionIndex index = SerdeElisionIndex.of(model); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimal")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigInteger")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#Blob")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#Document")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#Timestamp")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#Double")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#Float")).get())); } @Test public void cannotElideNestedUnsupportedTypes() { model = model .toBuilder() .addShapes( // Shim set shapes into 2.0 model. SetShape.builder() .id("foo.bar#BigDecimalSet") .member(ShapeId.from("foo.bar#BigDecimal")) .build(), SetShape.builder() .id("foo.bar#BigIntegerSet") .member(ShapeId.from("foo.bar#BigInteger")) .build(), SetShape.builder().id("foo.bar#BlobSet").member(ShapeId.from("foo.bar#Blob")).build(), SetShape.builder().id("foo.bar#DocumentSet").member(ShapeId.from("foo.bar#Document")).build(), SetShape.builder().id("foo.bar#TimestampSet").member(ShapeId.from("foo.bar#Timestamp")).build(), SetShape.builder().id("foo.bar#DoubleSet").member(ShapeId.from("foo.bar#Double")).build(), SetShape.builder().id("foo.bar#FloatSet").member(ShapeId.from("foo.bar#Float")).build() ) .build(); SerdeElisionIndex index = SerdeElisionIndex.of(model); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimalList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigIntegerList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BlobList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DocumentList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#TimestampList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DoubleList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#FloatList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimalSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigIntegerSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BlobSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DocumentSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#TimestampSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DoubleSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#FloatSet")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimalStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigIntegerStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BlobStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DocumentStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#TimestampStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DoubleStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#FloatStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimalUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigIntegerUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BlobUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DocumentUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#TimestampUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DoubleUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#FloatUnion")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigDecimalMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BigIntegerMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#BlobMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DocumentMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#TimestampMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#DoubleMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#FloatMap")).get())); } @Test public void cannotElideWithMutatingTraits() { SerdeElisionIndex index = SerdeElisionIndex.of(model); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedJsonName")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#JsonNameStructure")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#JsonNameStructure$foo")).get())); // Blobs are incompatible types, so we only need to check for @streaming traits on unions. assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedEventStream")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#EventStreamUnion")).get())); // Blobs are incompatible types, so we only need to check for @mediaType traits on strings. assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedMediaType")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#MediaTypeString")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedSparseList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#SparseList")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedSparseMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#SparseMap")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#NestedIdempotencyToken")).get())); assertFalse(index.mayElide(model.getShape(ShapeId.from("foo.bar#IdempotencyTokenStructure")).get())); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborMemberDeserVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; @ExtendWith(MockitoExtension.class) class CborMemberDeserVisitorTest { private CborMemberDeserVisitor subject; @BeforeEach void setup( @Mock ProtocolGenerator.GenerationContext context, @Mock Model model, @Mock TypeScriptWriter typeScriptWriter, @Mock TypeScriptSettings settings ) { when(context.getModel()).thenReturn(model); when(context.getWriter()).thenReturn(typeScriptWriter); when(context.getSettings()).thenReturn(settings); subject = new CborMemberDeserVisitor(context, "data"); } @Test void blobShape(@Mock BlobShape blobShape) { // no decoder for blob in cbor. assertEquals("data", subject.blobShape(blobShape)); } @Test void timestampShape(@Mock TimestampShape timestampShape) { // protocol always uses this timestamp format. assertEquals("__expectNonNull(__parseEpochTimestamp(data))", subject.timestampShape(timestampShape)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborMemberSerVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.BlobShape; import software.amazon.smithy.model.shapes.DoubleShape; import software.amazon.smithy.model.shapes.FloatShape; import software.amazon.smithy.model.shapes.TimestampShape; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; @ExtendWith(MockitoExtension.class) class CborMemberSerVisitorTest { private CborMemberSerVisitor subject; @BeforeEach void setup( @Mock ProtocolGenerator.GenerationContext context, @Mock Model model, @Mock TypeScriptWriter typeScriptWriter ) { when(context.getModel()).thenReturn(model); lenient().when(context.getWriter()).thenReturn(typeScriptWriter); subject = new CborMemberSerVisitor(context, "data"); } @Test void blobShape(@Mock BlobShape blob) { // no encoder for blob in cbor. assertEquals("data", subject.blobShape(blob)); } @Test void floatShape(@Mock FloatShape floatShape) { // no serializer function for float in cbor. assertEquals("data", subject.floatShape(floatShape)); } @Test void doubleShape(@Mock DoubleShape doubleShape) { // no serializer function for double in cbor. assertEquals("data", subject.doubleShape(doubleShape)); } @Test void timestampShape(@Mock TimestampShape timestampShape) { assertEquals("__dateToTag(data)", subject.timestampShape(timestampShape)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborShapeDeserVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.utils.MapUtils; @ExtendWith(MockitoExtension.class) class CborShapeDeserVisitorTest { @Mock ProtocolGenerator.GenerationContext context; @Mock TypeScriptWriter writer; CborShapeDeserVisitor subject; @BeforeEach void setUp(@Mock TypeScriptSettings typeScriptSettings) { lenient().when(context.getWriter()).thenReturn(writer); lenient().when(context.getSettings()).thenReturn(typeScriptSettings); lenient().when(typeScriptSettings.generateServerSdk()).thenReturn(false); subject = new CborShapeDeserVisitor(context); } @Test void deserializeCollection( @Mock CollectionShape collectionShape, @Mock MemberShape memberShape, @Mock ShapeId shapeId, @Mock Shape target, @Mock Model model ) { when(collectionShape.getMember()).thenReturn(memberShape); when(memberShape.getTarget()).thenReturn(shapeId); when(context.getModel()).thenReturn(model); when(model.expectShape(any(ShapeId.class))).thenReturn(target); when(target.accept(any())).thenReturn("entry"); subject.deserializeCollection(context, collectionShape); verify(writer).write("const collection = (output || [])$L", ".filter((e: any) => e != null)"); } @Test void deserializeDocument(@Mock DocumentShape documentShape) { subject.deserializeDocument(context, documentShape); verify(writer).write( """ return output; // document. """ ); } @Test void deserializeMap( @Mock MapShape mapShape, @Mock MemberShape valueShape, @Mock ShapeId shapeId, @Mock SymbolProvider symbolProvider, @Mock Symbol symbol, @Mock Shape target, @Mock Model model ) { when(mapShape.getValue()).thenReturn(valueShape); when(valueShape.getTarget()).thenReturn(shapeId); when(context.getSymbolProvider()).thenReturn(symbolProvider); when(context.getModel()).thenReturn(model); when(model.expectShape(shapeId)).thenReturn(target); when(symbolProvider.toSymbol(mapShape)).thenReturn(symbol); subject.deserializeMap(context, mapShape); verify(writer).openBlock( eq("return Object.entries(output).reduce((acc: $T, [key, value]: [string, any]) => {"), eq(""), eq(symbol), any() ); } @Test void deserializeStructure(@Mock StructureShape structureShape) { subject.deserializeStructure(context, structureShape); verify(writer).addImportSubmodule("take", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); verify(writer).openBlock(eq("return take(output, {"), eq("}) as any;"), any()); } @Test void deserializeUnion( @Mock UnionShape unionShape, @Mock MemberShape mapMember, @Mock ShapeId shapeId, @Mock Shape target, @Mock Model model ) { when(unionShape.getAllMembers()).thenReturn(MapUtils.of("member", mapMember)); when(mapMember.getTarget()).thenReturn(shapeId); when(context.getModel()).thenReturn(model); when(model.expectShape(shapeId)).thenReturn(target); subject.deserializeUnion(context, unionShape); verify(writer).openBlock(eq("if ($1L != null) {"), eq("}"), eq("output.member"), any()); verify(writer).write("return { $$unknown: Object.entries(output)[0] };"); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/protocols/cbor/CborShapeSerVisitorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.protocols.cbor; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolProvider; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.DocumentShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.ServiceShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.shapes.UnionShape; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; @ExtendWith(MockitoExtension.class) class CborShapeSerVisitorTest { CborShapeSerVisitor subject; @Mock ProtocolGenerator.GenerationContext context; @Mock TypeScriptWriter writer; @BeforeEach void setUp(@Mock Model model, @Mock Shape shape, @Mock SymbolProvider symbolProvider, @Mock Symbol symbol) { lenient().when(context.getWriter()).thenReturn(writer); lenient().when(context.getSymbolProvider()).thenReturn(symbolProvider); lenient().when(symbolProvider.toSymbol(any())).thenReturn(symbol); lenient().when(symbol.toString()).thenReturn("string"); lenient().when(context.getModel()).thenReturn(model); lenient().when(model.expectShape(any(ShapeId.class))).thenReturn(shape); lenient().when(shape.accept(any(CborMemberSerVisitor.class))).thenReturn("entry"); subject = new CborShapeSerVisitor(context); } @Test void serializeCollection( @Mock CollectionShape collectionShape, @Mock MemberShape memberShape, @Mock ShapeId shapeId ) { when(collectionShape.getMember()).thenReturn(memberShape); when(memberShape.getTarget()).thenReturn(shapeId); subject.serializeCollection(context, collectionShape); verify(writer).write("return input$L;", ".filter((e: any) => e != null)"); } @Test void serializeDocument(@Mock DocumentShape documentShape) { subject.serializeDocument(context, documentShape); verify(writer).write( """ return input; // document. """ ); } @Test void serializeMap(@Mock MapShape mapShape, @Mock MemberShape valueShape, @Mock ShapeId shapeId) { when(mapShape.getValue()).thenReturn(valueShape); when(valueShape.getTarget()).thenReturn(shapeId); subject.serializeMap(context, mapShape); verify(writer).openBlock( eq("return Object.entries(input).reduce((acc: Record, [key, value]: [$1L, any]) => {"), eq("}, {});"), eq("string"), any() ); } @Test void serializeStructure(@Mock StructureShape structureShape) { subject.serializeStructure(context, structureShape); verify(writer).addImportSubmodule("take", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); verify(writer).openBlock(eq("return take(input, {"), eq("});"), any()); } @Test void serializeUnion(@Mock UnionShape unionShape, @Mock ServiceShape service, @Mock ShapeId shapeId) { when(context.getService()).thenReturn(service); when(unionShape.getId()).thenReturn(shapeId); when(shapeId.getName(service)).thenReturn("name"); subject.serializeUnion(context, unionShape); verify(writer).openBlock(eq("return $L.visit(input, {"), eq("});"), eq("name"), any()); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/schema/SchemaReferenceIndexTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.SimpleShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndexTest; class SchemaReferenceIndexTest { private static Model model; private static SchemaReferenceIndex subject; @BeforeAll public static void before() { model = Model.assembler() .addImport(SerdeElisionIndexTest.class.getResource("serde-elision.smithy")) .assemble() .unwrap(); subject = new SchemaReferenceIndex(model); } @Test void isReferenceSchema() { Stream simpleShapes = Stream.of( model.getStringShapes().stream(), model.getBooleanShapes().stream(), model.getByteShapes().stream(), model.getDoubleShapes().stream(), model.getFloatShapes().stream(), model.getShortShapes().stream(), model.getIntegerShapes().stream(), model.getLongShapes().stream(), model.getEnumShapes().stream(), model.getIntEnumShapes().stream(), model.getBigIntegerShapes().stream(), model.getBigDecimalShapes().stream(), model.getTimestampShapes().stream(), model.getBlobShapes().stream(), model.getDocumentShapes().stream() ).flatMap(Function.identity()); simpleShapes.forEach(booleanShape -> { assertFalse(subject.isReferenceSchema(booleanShape)); }); Set structureShapes = model.getStructureShapes(); structureShapes.forEach(structureShape -> { assertTrue(subject.isReferenceSchema(structureShape)); }); Stream collectionShapes = Stream.of( model.getSetShapes().stream(), model.getListShapes().stream(), model.getMapShapes().stream() ).flatMap(Function.identity()); collectionShapes.forEach(shape -> { boolean isRef; if (shape instanceof CollectionShape collection) { isRef = subject.isReferenceSchema(collection.getMember()); } else if (shape instanceof MapShape map) { isRef = subject.isReferenceSchema(map.getValue()); } else { throw new UnsupportedOperationException("Unexpected shape type"); } assertEquals(isRef, subject.isReferenceSchema(shape)); }); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitExtensionTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.traits.JsonNameTrait; class SchemaTraitExtensionTest { private static final SchemaTraitExtension subject = SchemaTraitExtension.INSTANCE; @Test void add() { subject.add(JsonNameTrait.ID, Object::toString); } @Test void contains() { subject.add(JsonNameTrait.ID, Object::toString); assertTrue(subject.contains(JsonNameTrait.ID)); JsonNameTrait trait = new JsonNameTrait("test"); assertTrue(subject.contains(trait)); } @Test void render() { JsonNameTrait trait = new JsonNameTrait("test"); subject.add(JsonNameTrait.ID, _trait -> { if (_trait instanceof JsonNameTrait jsonNameTrait) { return jsonNameTrait.getValue() + "__test"; } throw new UnsupportedOperationException("wrong trait type"); }); assertEquals("test__test", subject.render(trait)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitFilterIndexTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import static org.junit.jupiter.api.Assertions.*; import java.util.Set; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.ErrorTrait; import software.amazon.smithy.model.traits.EventHeaderTrait; import software.amazon.smithy.model.traits.EventPayloadTrait; import software.amazon.smithy.model.traits.HostLabelTrait; import software.amazon.smithy.model.traits.HttpErrorTrait; import software.amazon.smithy.model.traits.HttpHeaderTrait; import software.amazon.smithy.model.traits.HttpLabelTrait; import software.amazon.smithy.model.traits.HttpPayloadTrait; import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait; import software.amazon.smithy.model.traits.HttpQueryParamsTrait; import software.amazon.smithy.model.traits.HttpQueryTrait; import software.amazon.smithy.model.traits.HttpResponseCodeTrait; import software.amazon.smithy.model.traits.HttpTrait; import software.amazon.smithy.model.traits.IdempotencyTokenTrait; import software.amazon.smithy.model.traits.JsonNameTrait; import software.amazon.smithy.model.traits.MediaTypeTrait; import software.amazon.smithy.model.traits.RequiresLengthTrait; import software.amazon.smithy.model.traits.SensitiveTrait; import software.amazon.smithy.model.traits.SparseTrait; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.model.traits.XmlAttributeTrait; import software.amazon.smithy.model.traits.XmlFlattenedTrait; import software.amazon.smithy.model.traits.XmlNameTrait; import software.amazon.smithy.model.traits.XmlNamespaceTrait; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndexTest; import software.amazon.smithy.utils.SetUtils; class SchemaTraitFilterIndexTest { private static Model model; private static SchemaTraitFilterIndex subject; @BeforeAll public static void before() { model = Model.assembler() .addImport(SerdeElisionIndexTest.class.getResource("serde-elision.smithy")) .assemble() .unwrap(); subject = new SchemaTraitFilterIndex(model); } @Test void hasSchemaTraits() { Set sparseShapes = model.getShapesWithTrait(SparseTrait.class); assertFalse(sparseShapes.isEmpty()); for (Shape sparseShape : sparseShapes) { assertTrue(subject.hasSchemaTraits(sparseShape)); assertTrue(subject.includeTrait(sparseShape.getTrait(SparseTrait.class).get().toShapeId())); } } @Test void includeTrait() { Set excludedShapes = SetUtils.of(TimestampFormatTrait.ID); for (ShapeId excludedShape : excludedShapes) { String presence = subject.includeTrait(excludedShape) ? "should not be included" : excludedShape.getName(); assertEquals(excludedShape.getName(), presence); } Set includedTraits = SetUtils.of( SparseTrait.ID, SensitiveTrait.ID, IdempotencyTokenTrait.ID, JsonNameTrait.ID, MediaTypeTrait.ID, XmlAttributeTrait.ID, XmlFlattenedTrait.ID, XmlNameTrait.ID, XmlNamespaceTrait.ID, EventHeaderTrait.ID, EventPayloadTrait.ID, StreamingTrait.ID, RequiresLengthTrait.ID, EndpointTrait.ID, HttpErrorTrait.ID, HttpHeaderTrait.ID, HttpQueryTrait.ID, HttpLabelTrait.ID, HttpPayloadTrait.ID, HttpPrefixHeadersTrait.ID, HttpQueryParamsTrait.ID, HttpResponseCodeTrait.ID, HostLabelTrait.ID, ErrorTrait.ID, HttpTrait.ID ); for (ShapeId includedTrait : includedTraits) { String presence = subject.includeTrait(includedTrait) ? includedTrait.getName() : "is missing"; assertEquals(includedTrait.getName(), presence); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitGeneratorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import static org.junit.jupiter.api.Assertions.*; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.pattern.UriPattern; import software.amazon.smithy.model.traits.EndpointTrait; import software.amazon.smithy.model.traits.HttpErrorTrait; import software.amazon.smithy.model.traits.HttpTrait; import software.amazon.smithy.model.traits.JsonNameTrait; import software.amazon.smithy.model.traits.TimestampFormatTrait; import software.amazon.smithy.model.traits.Trait; import software.amazon.smithy.model.traits.XmlAttributeTrait; import software.amazon.smithy.model.traits.XmlNamespaceTrait; import software.amazon.smithy.typescript.codegen.util.StringStore; class SchemaTraitGeneratorTest { private static final SchemaTraitGenerator subject = new SchemaTraitGenerator(); private record TestPair(String expectedSerialization, Trait trait) { public void test() { assertEquals(expectedSerialization, subject.serializeTraitData(trait, new StringStore())); } } private static final List testCases = List.of( // timestamp new TestPair("", new TimestampFormatTrait("date-time")), // strings new TestPair("_jN", new JsonNameTrait("jsonName")), // annotations new TestPair("1", new XmlAttributeTrait()), // data traits new TestPair("[\"prefix\"]", EndpointTrait.builder().hostPrefix("prefix").build()), new TestPair("[_p, _h]", XmlNamespaceTrait.builder().prefix("prefix").uri("https://localhost").build()), new TestPair("404", new HttpErrorTrait(404)), new TestPair( "[\"GET\", \"/uri-pattern\", 200]", HttpTrait.builder().method("GET").uri(UriPattern.parse("/uri-pattern")).code(200).build() ) ); @Test void serializeTraitData() { for (TestPair testCase : testCases) { testCase.test(); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/schema/SchemaTraitWriterTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.schema; import static org.junit.jupiter.api.Assertions.*; import java.util.Set; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.traits.StreamingTrait; import software.amazon.smithy.typescript.codegen.knowledge.SerdeElisionIndexTest; import software.amazon.smithy.typescript.codegen.util.StringStore; class SchemaTraitWriterTest { private static Model model; private static SchemaReferenceIndex schemaReferenceIndex; private static SchemaTraitWriter subject; @BeforeAll public static void before() { model = Model.assembler() .addImport(SerdeElisionIndexTest.class.getResource("serde-elision.smithy")) .assemble() .unwrap(); schemaReferenceIndex = new SchemaReferenceIndex(model); subject = new SchemaTraitWriter(null, schemaReferenceIndex, new StringStore()); } @Test void testToString() { Set streamingShapes = model.getShapesWithTrait(StreamingTrait.class); assertEquals(1, streamingShapes.size()); for (Shape streamingShape : streamingShapes) { subject = new SchemaTraitWriter(streamingShape, schemaReferenceIndex, new StringStore()); String codeGeneration = subject.toString(); assertEquals( """ { [_s]: 1 }""", codeGeneration ); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/util/PatternDetectionCompressionTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Collections; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.node.ArrayNode; import software.amazon.smithy.model.node.Node; import software.amazon.smithy.model.node.ObjectNode; import software.amazon.smithy.rulesengine.language.EndpointRuleSet; import software.amazon.smithy.rulesengine.logic.bdd.CostOptimization; import software.amazon.smithy.rulesengine.logic.bdd.NodeReversal; import software.amazon.smithy.rulesengine.logic.bdd.SiftingOptimization; import software.amazon.smithy.rulesengine.logic.cfg.Cfg; import software.amazon.smithy.rulesengine.traits.EndpointBddTrait; import software.amazon.smithy.typescript.codegen.endpointsV2.ConditionSerializer; import software.amazon.smithy.typescript.codegen.endpointsV2.RuleSerializer; class PatternDetectionCompressionTest { private static String compress(String json) { return new PatternDetectionCompression(Node.parse(json).expectObjectNode()).compress(); } @Test void compressesEmptyObject() { assertEquals( """ const _data={ }; """, compress("{}") ); } @Test void compressesFlatObjectWithoutDuplicates() { assertEquals( """ const _data={ a: "hello", b: 42, c: true }; """, compress(""" {"a":"hello","b":42,"c":true}""") ); } @Test void extractsRepeatedSubtrees() { assertEquals( """ const a={"type":"string","req":true}; const _data={ f1: a, f2: a, f3: a }; """, compress(""" { "f1":{"type":"string","req":true}, "f2":{"type":"string","req":true}, "f3":{"type":"string","req":true} }""") ); } @Test void extractsRepeatedStrings() { assertEquals( """ const a="longstring"; const _data={ a: a, b: a, c: a }; """, compress(""" {"a":"longstring","b":"longstring","c":"longstring"}""") ); } @Test void doesNotExtractShortOrRareValues() { assertEquals( """ const _data={ x: "ab", y: "cd" }; """, compress(""" {"x":"ab","y":"cd"}""") ); } @Test void handlesNestedObjects() { assertEquals( """ const a={"c":{"fn":"isSet"}}; const _data={ r1: a, r2: a, r3: a }; """, compress(""" { "r1":{"c":{"fn":"isSet"}}, "r2":{"c":{"fn":"isSet"}}, "r3":{"c":{"fn":"isSet"}} }""") ); } @Test void handlesArrays() { assertEquals( """ const a={"type":"endpoint","url":"https://example.com"}; const _data={ rules: [ a, a, a ] }; """, compress(""" {"rules":[ {"type":"endpoint","url":"https://example.com"}, {"type":"endpoint","url":"https://example.com"}, {"type":"endpoint","url":"https://example.com"} ]}""") ); } @Test void stripsQuotesFromWordOnlyKeys() { String result = compress(""" {"simpleKey":"value"}"""); assertTrue(result.contains("simpleKey:")); assertFalse(result.contains("\"simpleKey\":")); } @Test void outputEndsWithNewline() { assertTrue(compress(""" {"version":"1.0"}""").endsWith("\n")); } @Test void extractsSsaTemplateFunctions() { assertEquals( """ const a=(n: number)=>"https://bucket.s3express-zone_ssa_"+n+".region.example.com"; const _data={ a: a(1), b: a(2), c: a(3) }; """, compress(""" { "a": "https://bucket.s3express-zone_ssa_1.region.example.com", "b": "https://bucket.s3express-zone_ssa_2.region.example.com", "c": "https://bucket.s3express-zone_ssa_3.region.example.com" }""") ); } @Test void doesNotCorruptObjectKeysWhenReplacingWildcardStringValues() { EndpointRuleSet ruleSet = EndpointRuleSet.fromNode( Node.parse( """ { "version": "1.3", "parameters": { "ParamA": { "required": false, "type": "String" }, "ParamB": { "builtIn": "SDK::Endpoint", "required": false, "type": "String" }, "ParamC": { "required": true, "type": "String", "builtIn": "AWS::Region", "default": "us-east-2" } }, "rules": [ { "type": "endpoint", "conditions": [ { "fn": "isSet", "argv": [{ "ref": "ParamB" }] }, { "fn": "stringEquals", "argv": [{ "ref": "ParamC" }, "*"] } ], "endpoint": { "url": { "ref": "ParamB" }, "properties": { "authSchemes": [{ "name": "sigv4a", "signingRegionSet": ["*"] }] } } }, { "type": "endpoint", "conditions": [{ "fn": "isSet", "argv": [{ "ref": "ParamB" }] }], "endpoint": { "url": { "ref": "ParamB" } } }, { "type": "endpoint", "conditions": [ { "fn": "isSet", "argv": [{ "ref": "ParamA" }] }, { "fn": "stringEquals", "argv": [{ "ref": "ParamC" }, "*"] } ], "endpoint": { "url": "https://{ParamA}.global.example.com", "properties": { "authSchemes": [{ "name": "sigv4a", "signingRegionSet": ["*"] }] } } }, { "type": "endpoint", "conditions": [{ "fn": "isSet", "argv": [{ "ref": "ParamA" }] }], "endpoint": { "url": "https://{ParamC}.{ParamA}.example.com", "properties": { "authSchemes": [{ "name": "sigv4", "signingRegion": "{ParamC}" }] } } }, { "type": "endpoint", "conditions": [{ "fn": "stringEquals", "argv": [{ "ref": "ParamC" }, "*"] }], "endpoint": { "url": "https://prod.global.example.com", "properties": { "authSchemes": [{ "name": "sigv4a", "signingRegionSet": ["*"] }] } } }, { "type": "endpoint", "conditions": [], "endpoint": { "url": "https://{ParamC}.prod.example.com", "properties": { "authSchemes": [{ "name": "sigv4", "signingRegion": "{ParamC}" }] } } } ] }""" ) ); Cfg cfg = Cfg.from(ruleSet); EndpointBddTrait bddTrait = EndpointBddTrait.from(cfg); bddTrait = SiftingOptimization.builder().cfg(cfg).build().apply(bddTrait); bddTrait = CostOptimization.builder().cfg(cfg).build().apply(bddTrait); bddTrait = new NodeReversal().apply(bddTrait); ObjectNode conditionsAndResults = ObjectNode.fromStringMap(Collections.emptyMap()); conditionsAndResults = conditionsAndResults.withMember( "conditions", ArrayNode.fromNodes( bddTrait.getConditions().stream().map(c -> new ConditionSerializer(c).toArrayNode()).toList() ) ); conditionsAndResults = conditionsAndResults.withMember( "results", ArrayNode.fromNodes( bddTrait.getResults().stream().map(r -> new RuleSerializer(r).toArrayNode()).toList() ) ); String result = new PatternDetectionCompression(conditionsAndResults).compress(); assertEquals( """ const f="authSchemes"; const a="isSet", b="*", c={"ref":"ParamB"}, d={[f]:[{"name":"sigv4a","signingRegionSet":[b]}]}, e={[f]:[{"name":"sigv4","signingRegion":"{ParamC}"}]}; const _data={ conditions: [ [a,[c]], ["stringEquals",[{ref:"ParamC"},b]], [a,[{ref:"ParamA"}]] ], results: [ [-1], [c,d], [c,{}], ["https://{ParamA}.global.example.com",d], ["https://{ParamC}.{ParamA}.example.com",e], ["https://prod.global.example.com",d], ["https://{ParamC}.prod.example.com",e] ] }; """, result ); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/util/PropertyAccessorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; class PropertyAccessorTest { @Test void getFrom() { assertEquals("output.fileSystemId", PropertyAccessor.getFrom("output", "fileSystemId")); assertEquals("output.__fileSystemId", PropertyAccessor.getFrom("output", "__fileSystemId")); } @Test void getFromQuoted() { assertEquals("output[\"0fileSystemId\"]", PropertyAccessor.getFrom("output", "0fileSystemId")); assertEquals("output[\"file-system-id\"]", PropertyAccessor.getFrom("output", "file-system-id")); } @Test void getFromExtraQuoted() { assertEquals("output[`file\"system\"id`]", PropertyAccessor.getFrom("output", "file\"system\"id")); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/util/StringStoreTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.util; import static org.junit.jupiter.api.Assertions.*; import java.util.Objects; import org.junit.jupiter.api.Test; class StringStoreTest { @Test void var() { StringStore subject = new StringStore(); String sourceCode = """ const array = [ %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ]; """.formatted( subject.var("SomeObject"), subject.var("some_object"), subject.var("SomeObject"), subject.var("some_object"), subject.var("_"), subject.var("__"), subject.var("___"), subject.var("_internal"), subject.var("__internal"), subject.var("___internal"), subject.var("_internal_"), subject.var("__internal__"), subject.var("___internal__"), subject.var("_two--words"), subject.var("__twoWords__"), subject.var("___TwoWords__"), subject.var("$Symbol"), subject.var("%Symbol"), subject.var(" !)(@*#&$^% "), subject.var(" !)( @ )(@*#&$^* SmithyTypeScript# &)(@*#&$^ $^% )(@*#&$^"), subject.var("**Ack**Ack**"), subject.var("Spaces Are Cool"), subject.var("__why Would &&& YouName $something this...") ); String[] expected = """ const _ = "_"; const _AA = "**Ack**Ack**"; const _S = "$Symbol"; const _SAC = "Spaces Are Cool"; const _SO = "SomeObject"; const _S_ = " !)( @ )(@*#&$^* SmithyTypeScript# &)(@*#&$^ $^% )(@*#&$^"; const _Sy = "%Symbol"; const _TW = "___TwoWords__"; const __ = "__"; const ___ = "___"; const ____ = " !)(@*#&$^% "; const _i = "_internal"; const _in = "__internal"; const _int = "___internal"; const _inte = "_internal_"; const _inter = "__internal__"; const _intern = "___internal__"; const _so = "some_object"; const _tW = "__twoWords__"; const _tw = "_two--words"; const _wWYt = "__why Would &&& YouName $something this..."; const array = [ _SO, _so, _SO, _so, _, __, ___, _i, _in, _int, _inte, _inter, _intern, _tw, _tW, _TW, _S, _Sy, ____, _S_, _AA, _SAC, _wWYt ]; """.split("\n"); String[] actual = (subject.flushVariableDeclarationCode() + "\n" + sourceCode).split("\n"); for (int i = 0; i < expected.length; ++i) { assertEquals( Objects.toString(i) + ": " + expected[i].trim(), Objects.toString(i) + ": " + actual[i].trim() ); } } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/validation/ImportFromTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; class ImportFromTest { @Test void isNodejsNative() { assertTrue(new ImportFrom("node:buffer").isNodejsNative()); assertTrue(new ImportFrom("stream").isNodejsNative()); assertFalse(new ImportFrom("@smithy/util").isNodejsNative()); assertFalse(new ImportFrom("../file").isNodejsNative()); } @Test void isNamespaced() { assertTrue(new ImportFrom("@smithy/util/submodule").isNamespaced()); assertTrue(new ImportFrom("@smithy/util").isNamespaced()); assertFalse(new ImportFrom("node:stream").isNamespaced()); assertFalse(new ImportFrom("fs/promises").isNamespaced()); } @Test void isRelative() { assertTrue(new ImportFrom("/file/path").isRelative()); assertTrue(new ImportFrom("./file/path").isRelative()); assertTrue(new ImportFrom("../../../../file/path").isRelative()); assertFalse(new ImportFrom("@smithy/util").isRelative()); assertFalse(new ImportFrom("fs/promises").isRelative()); } @Test void isDeclarablePackageImport() { assertTrue(new ImportFrom("@smithy/util/submodule").isDeclarablePackageImport()); assertTrue(new ImportFrom("@smithy/util").isDeclarablePackageImport()); assertTrue(new ImportFrom("smithy_pkg").isDeclarablePackageImport()); assertTrue(new ImportFrom("smithy_pkg/array").isDeclarablePackageImport()); assertFalse(new ImportFrom("node:buffer").isDeclarablePackageImport()); assertFalse(new ImportFrom("../pkg/pkg").isDeclarablePackageImport()); } @Test void getPackageName() { assertEquals(new ImportFrom("smithy_pkg/array").getPackageName(), "smithy_pkg"); assertEquals(new ImportFrom("@smithy/util/submodule").getPackageName(), "@smithy/util"); assertEquals(new ImportFrom("node:fs/promises").getPackageName(), "fs"); assertEquals(new ImportFrom("smithy_pkg").getPackageName(), "smithy_pkg"); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/validation/LongValidatorTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.List; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.validation.ValidationEvent; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; public class LongValidatorTest { @Test public void findsDoubles() { Model model = Model.assembler().addImport(getClass().getResource("long-validation.smithy")).assemble().unwrap(); TypeScriptSettings settings = new TypeScriptSettings(); settings.setService(ShapeId.from("smithy.example#Example")); LongValidator validator = new LongValidator(settings); List result = validator.validate(model); assertThat(result.size(), equalTo(1)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/validation/ReplaceLastTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; class ReplaceLastTest { @Test public void replaceLast() { assertEquals(ReplaceLast.in("WorkspacesThinClientClient", "Client", ""), "WorkspacesThinClient"); assertEquals(ReplaceLast.in("WorkspacesThinClientClientClient", "Client", ""), "WorkspacesThinClientClient"); assertEquals(ReplaceLast.in("welcometothecity", "e", "is"), "welcometothiscity"); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/validation/SensitiveDataFinderTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import java.util.Collections; import org.junit.jupiter.api.Test; import software.amazon.smithy.model.Model; import software.amazon.smithy.model.shapes.CollectionShape; import software.amazon.smithy.model.shapes.ListShape; import software.amazon.smithy.model.shapes.MapShape; import software.amazon.smithy.model.shapes.MemberShape; import software.amazon.smithy.model.shapes.StringShape; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.SensitiveTrait; public class SensitiveDataFinderTest { StringShape sensitiveString = StringShape.builder() .addTrait(new SensitiveTrait()) .id("foo.bar#sensitiveString") .build(); StringShape dullString = StringShape.builder().id("foo.bar#dullString").build(); MemberShape memberWithSensitiveData = MemberShape.builder() .id("foo.bar#sensitive$member") .target(sensitiveString.getId()) .build(); MemberShape memberWithDullData = MemberShape.builder().id("foo.bar#dull$member").target(dullString.getId()).build(); MemberShape listMemberWithSensitiveData = MemberShape.builder() .id("foo.bar#listSensitive$member") .target(sensitiveString.getId()) .build(); MemberShape listMemberWithDullData = MemberShape.builder() .id("foo.bar#listDull$member") .target(dullString.getId()) .build(); MemberShape mapMemberWithSensitiveKeyData = MemberShape.builder() .id("foo.bar#mapSensitiveKey$member") .target(sensitiveString.getId()) .build(); MemberShape mapMemberWithSensitiveValueData = MemberShape.builder() .id("foo.bar#mapSensitiveValue$member") .target(sensitiveString.getId()) .build(); StructureShape structureShapeSensitive = StructureShape.builder() .id("foo.bar#sensitive") .members(Collections.singleton(memberWithSensitiveData)) .build(); StructureShape structureShapeDull = StructureShape.builder() .id("foo.bar#dull") .members(Collections.singleton(memberWithDullData)) .build(); CollectionShape collectionSensitive = ListShape.builder() .id("foo.bar#listSensitive") .addMember(listMemberWithSensitiveData) .build(); CollectionShape collectionDull = ListShape.builder() .id("foo.bar#listDull") .addMember(listMemberWithDullData) .build(); MapShape mapSensitiveKey = MapShape.builder() .id("foo.bar#mapSensitiveKey") .key(mapMemberWithSensitiveKeyData) .value(MemberShape.builder().id("foo.bar#mapSensitiveKey$key").target(dullString.getId()).build()) .build(); MapShape mapSensitiveValue = MapShape.builder() .id("foo.bar#mapSensitiveValue") .key(MemberShape.builder().id("foo.bar#mapSensitiveValue$key").target(dullString.getId()).build()) .value(mapMemberWithSensitiveValueData) .build(); MapShape mapDull = MapShape.builder() .id("foo.bar#mapDull") .key(MemberShape.builder().id("foo.bar#mapDull$key").target(dullString.getId()).build()) .value(MemberShape.builder().id("foo.bar#mapDull$value").target(dullString.getId()).build()) .build(); MapShape nested2 = MapShape.builder() .id("foo.bar#mapNested2") .key(MemberShape.builder().id("foo.bar#mapNested2$key").target(dullString.getId()).build()) .value(MemberShape.builder().id("foo.bar#mapNested2$value").target(mapSensitiveValue).build()) .build(); MapShape nested = MapShape.builder() .id("foo.bar#mapNested") .key(MemberShape.builder().id("foo.bar#mapNested$key").target(dullString.getId()).build()) .value(MemberShape.builder().id("foo.bar#mapNested$value").target(nested2).build()) .build(); private Model model = Model.builder() .addShapes( sensitiveString, dullString, memberWithSensitiveData, memberWithDullData, structureShapeSensitive, structureShapeDull, collectionSensitive, collectionDull, mapSensitiveKey, mapSensitiveValue, mapDull, nested, nested2 ) .build(); private SensitiveDataFinder sensitiveDataFinder = new SensitiveDataFinder(model); @Test public void findsSensitiveData_inShapes() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(sensitiveString), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(dullString), equalTo(false)); } @Test public void findsSensitiveData_inTargetShapes() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(memberWithSensitiveData), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(memberWithDullData), equalTo(false)); } @Test public void findsSensitiveData_inStructures() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(structureShapeSensitive), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(structureShapeDull), equalTo(false)); } @Test public void findsSensitiveData_inCollections() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(collectionSensitive), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(collectionDull), equalTo(false)); } @Test public void findsSensitiveData_inMaps() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(mapSensitiveKey), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(mapSensitiveValue), equalTo(true)); assertThat(sensitiveDataFinder.findsSensitiveDataIn(mapDull), equalTo(false)); } @Test public void findsSensitiveData_deeplyNested() { assertThat(sensitiveDataFinder.findsSensitiveDataIn(nested), equalTo(true)); } } ================================================ FILE: smithy-typescript-codegen/src/test/java/software/amazon/smithy/typescript/codegen/validation/UnaryFunctionCallTest.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package software.amazon.smithy.typescript.codegen.validation; import static org.junit.jupiter.api.Assertions.assertEquals; import org.junit.jupiter.api.Test; class UnaryFunctionCallTest { @Test void check() { assertEquals(false, UnaryFunctionCall.check("")); assertEquals(false, UnaryFunctionCall.check("5")); assertEquals(false, UnaryFunctionCall.check("(param)")); assertEquals(false, UnaryFunctionCall.check("x[5]")); assertEquals(false, UnaryFunctionCall.check("new Date(timestamp)")); assertEquals(false, UnaryFunctionCall.check("x(y(_))")); assertEquals(false, UnaryFunctionCall.check("call(param).prop")); assertEquals(false, UnaryFunctionCall.check("call(param, param2)")); assertEquals(true, UnaryFunctionCall.check("_")); assertEquals(true, UnaryFunctionCall.check("x()")); assertEquals(true, UnaryFunctionCall.check("x(_)")); assertEquals(true, UnaryFunctionCall.check("long_function_name(long_parameter_name)")); assertEquals(true, UnaryFunctionCall.check("container.function(param)")); assertEquals(true, UnaryFunctionCall.check("factory(param)(param2)")); } @Test void toRef() { assertEquals("_", UnaryFunctionCall.toRef("_")); assertEquals("x", UnaryFunctionCall.toRef("x()")); assertEquals("x", UnaryFunctionCall.toRef("x(_)")); assertEquals("long_function_name", UnaryFunctionCall.toRef("long_function_name(long_parameter_name)")); assertEquals("container.function", UnaryFunctionCall.toRef("container.function(param)")); assertEquals("factory(param)", UnaryFunctionCall.toRef("factory(param)(param2)")); } } ================================================ FILE: smithy-typescript-codegen/src/test/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration ================================================ software.amazon.smithy.typescript.codegen.SymbolDecoratorIntegration ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/endpointsV2/endpoints-operation-context-params.smithy ================================================ $version: "2.0" namespace smithy.example @smithy.rules#endpointRuleSet({ version: "1.0", parameters: { opContextParamIdentifier: { type: "string", }, opContextParamSubExpression: { type: "string", }, opContextParamWildcardExpressionList: { type: "stringArray", }, opContextParamWildcardExpressionListFlatten: { type: "stringArray", }, opContextParamWildcardExpressionListObj: { type: "stringArray", }, opContextParamWildcardExpressionListObjListFlatten: { type: "stringArray", }, opContextParamWildcardExpressionHash: { type: "stringArray", }, opContextParamMultiSelectList: { type: "stringArray", }, opContextParamMultiSelectListFlatten: { type: "stringArray", }, opContextParamKeys: { type: "stringArray", }, }, rules: [] }) service Example { version: "1.0.0", operations: [GetFoo] } @smithy.rules#operationContextParams( "opContextParamIdentifier": { path: "fooString" } "opContextParamSubExpression": { path: "fooObj.bar" } "opContextParamWildcardExpressionList": { path: "fooList[*]" } "opContextParamWildcardExpressionListFlatten": { path: "fooListList[*][]" } "opContextParamWildcardExpressionListObj": { path: "fooListObj[*].key" } "opContextParamWildcardExpressionListObjListFlatten": { path: "fooListObjList[*].key[]" } "opContextParamWildcardExpressionHash": { path: "fooObjObj.*.bar" } "opContextParamMultiSelectList": { path: "fooListObjObj[*].[fooObject.bar, fooString]" } "opContextParamMultiSelectListFlatten": { path: "fooListObjObj[*].[fooList][]" } "opContextParamKeys": { path: "keys(fooKeys)" } ) operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput { fooKeys: FooObject, fooList: FooList, fooListList: FooListList, fooListObj: FooListObject, fooListObjList: FooListObjectList, fooListObjObj: FooListObjectObject, fooObj: FooObject, fooObjObj: FooObjectObject, fooString: String, } structure FooObject { bar: String } list FooListObjectObject { member: FooMultiSelectObjectObject } structure FooMultiSelectObjectObject { fooList: FooList fooObject: FooObject fooString: String } structure FooObjectObject { baz: FooObject } list FooListList { member: FooList } list FooList { member: String } list FooListObject { member: FooListObjectMember } structure FooListObjectMember { key: String } list FooListObjectList { member: FooListObjectListMember } structure FooListObjectListMember { key: FooList } structure GetFooOutput {} @error("client") structure GetFooError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/endpointsV2/endpoints.smithy ================================================ $version: "2.0" namespace smithy.example @smithy.rules#endpointRuleSet({ "version": "1.3" "parameters": { "Region": { "type": "String", "documentation": "The region to dispatch this request, eg. `us-east-1`." }, "Stage": { "type": "String", "required": true, "default": "production" }, "Endpoint": { "builtIn": "SDK::Endpoint", "type": "String", "required": false, "documentation": "Override the endpoint used to send this request" } }, "rules": [ { "conditions": [ { "fn": "isSet", "argv": [ { "ref": "Endpoint" } ] }, { "fn": "parseURL", "argv": [ { "ref": "Endpoint" } ], "assign": "url" } ], "endpoint": { "url": { "ref": "Endpoint" }, "properties": {}, "headers": {} }, "type": "endpoint" }, { "documentation": "Template the region into the URI when region is set", "conditions": [ { "fn": "isSet", "argv": [ { "ref": "Region" } ] } ], "type": "tree", "rules": [ { "conditions": [ { "fn": "stringEquals", "argv": [ { "ref": "Stage" }, "staging" ] } ], "endpoint": { "url": "https://{Region}.staging.example.com/2023-01-01", "properties": {}, "headers": {} }, "type": "endpoint" }, { "conditions": [], "endpoint": { "url": "https://{Region}.example.com/2023-01-01", "properties": {}, "headers": {} }, "type": "endpoint" } ] }, { "documentation": "Fallback when region is unset", "conditions": [], "error": "Region must be set to resolve a valid endpoint", "type": "error" } ] }) @smithy.rules#clientContextParams( Stage: {type: "string", documentation: "The endpoint stage used to construct the hostname."} Region: {type: "string", documentation: "The region to dispatch this request, eg. `us-east-1`."} ) service Example { version: "2023-01-01" operations: [GetFoo] } @readonly operation GetFoo { input: GetFooInput output: GetFooOutput } structure GetFooInput { @required @hostLabel foo: String } structure GetFooOutput {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-empty.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething{ errors: [Err] } @error("client") structure Err {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-optional-member-no-message.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") structure Err { foo: String, } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-optional-message.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") structure Err { message: String, } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-required-member-no-message.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") structure Err { @required foo: String, } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-required-message.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") structure Err { @required message: String, } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-retryable-throttling.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") @retryable(throttling: true) structure Err {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/error-test-retryable.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [DoSomething] } operation DoSomething { errors: [Err] } @error("client") @retryable structure Err {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/integration/endpoint-trait.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } @readonly @endpoint(hostPrefix: "{foo}.data.") operation GetFoo { input: GetFooInput, output: GetFooOutput } structure GetFooInput { @required @hostLabel foo: String } structure GetFooOutput {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/integration/http-api-key-auth-trait-all-optional.smithy ================================================ namespace smithy.example // This test input is used to validate that the generated client properly injects // the HTTP API key authentication middleware with the correct options. // // In this case the operations all have the `@optionalAuth` trait, so the middleware // should not be injected at all. @httpApiKeyAuth(in: "header", name: "Authorization", scheme: "ApiKey") service Example { version: "2019-10-15", operations: [GetFoo, GetBar] } @optionalAuth operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput {} structure GetFooOutput {} @error("client") structure GetFooError {} @optionalAuth operation GetBar { input: GetBarInput, output: GetBarOutput, errors: [GetBarError] } structure GetBarInput {} structure GetBarOutput {} @error("client") structure GetBarError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/integration/http-api-key-auth-trait-no-scheme.smithy ================================================ namespace smithy.example // This test input is used to validate that the generated client properly injects // the HTTP API key authentication middleware with the correct options. // // In this case the options should not include the `scheme` attribute. @httpApiKeyAuth(in: "header", name: "Authorization") @auth([httpApiKeyAuth]) service Example { version: "2019-10-15", operations: [GetFoo, GetBar] } operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput {} structure GetFooOutput {} @error("client") structure GetFooError {} @optionalAuth operation GetBar { input: GetBarInput, output: GetBarOutput, errors: [GetBarError] } structure GetBarInput {} structure GetBarOutput {} @error("client") structure GetBarError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/integration/http-api-key-auth-trait-on-operation.smithy ================================================ namespace smithy.example // This test input is used to validate that the generated client properly injects // the HTTP API key authentication middleware with the correct options. // // In this scenario the `@auth` trait is on the operation rather than the service. @httpApiKeyAuth(in: "header", name: "Authorization", scheme: "ApiKey") service Example { version: "2019-10-15", operations: [GetFoo, GetBar] } @auth([httpApiKeyAuth]) operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput {} structure GetFooOutput {} @error("client") structure GetFooError {} @optionalAuth operation GetBar { input: GetBarInput, output: GetBarOutput, errors: [GetBarError] } structure GetBarInput {} structure GetBarOutput {} @error("client") structure GetBarError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/integration/http-api-key-auth-trait.smithy ================================================ namespace smithy.example // This test input is used to validate that the generated client properly injects // the HTTP API key authentication middleware with the correct options. // // In this scenario the `@auth` trait is on the service and therefore applies to // all operations except operations with the `@optionalAuth` trait. @httpApiKeyAuth(in: "header", name: "Authorization", scheme: "ApiKey") @auth([httpApiKeyAuth]) service Example { version: "2019-10-15", operations: [GetFoo, GetBar] } operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput {} structure GetFooOutput {} @error("client") structure GetFooError {} @optionalAuth operation GetBar { input: GetBarInput, output: GetBarOutput, errors: [GetBarError] } structure GetBarInput {} structure GetBarOutput {} @error("client") structure GetBarError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/knowledge/serde-elision.smithy ================================================ $version: "2.0" namespace foo.bar string SimpleString list SimpleList { member: A } map SimpleMap { key: A value: A } structure SimpleStruct { a: A } boolean Boolean byte Byte enum Enum { A } integer Integer intEnum IntEnum { A = 1 } long Long short Short bigDecimal BigDecimal bigInteger BigInteger blob Blob timestamp Timestamp document Document double Double float Float list BigDecimalList { member: BigDecimal } list BigIntegerList { member: BigInteger } list BlobList { member: Blob } list DocumentList { member: Document } list TimestampList { member: Timestamp } list DoubleList { member: Double } list FloatList { member: Float } structure BigDecimalStructure { member: BigDecimal } structure BigIntegerStructure { member: BigInteger } structure BlobStructure { member: Blob } structure DocumentStructure { member: Document } structure TimestampStructure { member: Timestamp } structure DoubleStructure { member: Double } structure FloatStructure { member: Float } union BigDecimalUnion { member: BigDecimal } union BigIntegerUnion { member: BigInteger } union BlobUnion { member: Blob } union DocumentUnion { member: Document } union TimestampUnion { member: Timestamp } union DoubleUnion { member: Double } union FloatUnion { member: Float } map BigDecimalMap { key: String value: BigDecimal } map BigIntegerMap { key: String value: BigInteger } map BlobMap { key: String value: Blob } map DocumentMap { key: String value: Document } map TimestampMap { key: String value: Timestamp } map DoubleMap { key: String value: Double } map FloatMap { key: String value: Float } structure NestedJsonName { bar: JsonNameStructure } structure JsonNameStructure { @jsonName("foo") foo: A } structure NestedEventStream { eventStream: EventStreamUnion } @streaming union EventStreamUnion { message: Event } structure Event {} structure NestedMediaType { foo: MediaTypeString } @mediaType("video/quicktime") string MediaTypeString structure NestedSparseList { foo: SparseList } @sparse list SparseList { member: String } structure NestedSparseMap { foo: SparseMap } @sparse map SparseMap { key: String value: String } structure NestedIdempotencyToken { foo: IdempotencyTokenStructure } structure IdempotencyTokenStructure { @idempotencyToken foo: String } string A ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/output-structure.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput, output: GetFooOutput, errors: [GetFooError] } structure GetFooInput {} structure GetFooOutput {} @error("client") structure GetFooError {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/simple-service-with-operation.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo {} ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/simple-service.smithy ================================================ namespace smithy.example service Example { version: "1.0.0" } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-insensitive-list.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: NamesList } list NamesList { member: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-insensitive-map.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: NamesMap } map NamesMap { key: String, value: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-insensitive-simple-shape.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { firstname: String, lastname: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-sensitive-member.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: PhoneNumbersList } list PhoneNumbersList { member: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-structure-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: UserList } list UserList { member: User } structure User { username: String, password: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-list-with-union-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: UserList } list UserList { member: TestUnion } union TestUnion { bar: String, sensitiveBar: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-sensitive-member.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: PhoneNumbersMap } map PhoneNumbersMap { key: String, value: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-structure-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: UserMap } map UserMap { key: String, value: User } structure User { username: String, password: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-map-with-union-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: UserMap } map UserMap { key: String, value: TestUnion } union TestUnion { bar: String, sensitiveBar: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-recursive-shapes.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: User } structure User { recursiveUser: User, recursiveList: UsersList, recursiveMap: UsersMap } list UsersList { member: User } map UsersMap { key: String, value: User } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-required-member.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput, output: GetFooOutput } structure GetFooInput {} structure GetFooOutput { @required someRequiredMember: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-list.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: SecretNamesList } @sensitive list SecretNamesList { member: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-map.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: SecretNamesMap } @sensitive map SecretNamesMap { key: String, value: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-simple-shape.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { username: String, password: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-structure.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: SecretUser } @sensitive structure SecretUser { firstname: String, lastname: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-sensitive-union.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: SecretUnion } @sensitive union SecretUnion { fooString: String, barString: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-streaming-union.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: StreamingUnion } @streaming union StreamingUnion { message: Message } structure Message { message: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-structure-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: User } structure User { username: String, password: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-structure-without-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: User } structure User { firstname: String, lastname: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-list.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: TestUnion } union TestUnion { list: NamesList } list NamesList { member: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-map.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: TestUnion } union TestUnion { map: NamesMap } map NamesMap { key: String, value: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: TestUnion } union TestUnion { bar: String, sensitiveBar: SensitiveString } @sensitive string SensitiveString ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-with-structure.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: TestUnion } union TestUnion { fooUser: User } structure User { firstname: String, lastname: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/test-union-without-sensitive-data.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [GetFoo] } operation GetFoo { input: GetFooInput } structure GetFooInput { foo: TestUnion } union TestUnion { fooString: String, barString: String } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/testmodel.smithy ================================================ namespace smithy.example structure Foo { @required foo: String, } ================================================ FILE: smithy-typescript-codegen/src/test/resources/software/amazon/smithy/typescript/codegen/validation/long-validation.smithy ================================================ namespace smithy.example service Example { version: "1.0.0", operations: [ExampleOperation] } operation ExampleOperation { input: ExampleOperationInput } structure ExampleOperationInput { longInput: Long } ================================================ FILE: smithy-typescript-codegen-test/build.gradle.kts ================================================ /* * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ extra["displayName"] = "Smithy :: Typescript :: Codegen :: Test" extra["moduleName"] = "software.amazon.smithy.typescript.codegen.test" plugins { `java-library` id("software.amazon.smithy.gradle.smithy-jar") } repositories { mavenLocal() mavenCentral() } dependencies { val smithyVersion: String by project // Put plugins and integrations on the smithy build classpath smithyBuild(project(":smithy-typescript-codegen")) smithyBuild(project(":smithy-typescript-codegen-test:example-weather-customizations")) smithyBuild(project(":smithy-typescript-ssdk-codegen-test-utils")) implementation("software.amazon.smithy:smithy-rules-engine:$smithyVersion") implementation("software.amazon.smithy:smithy-waiters:$smithyVersion") implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion") implementation("software.amazon.smithy:smithy-aws-traits:$smithyVersion") } ================================================ FILE: smithy-typescript-codegen-test/example-weather-customizations/build.gradle.kts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ plugins { `java-library` } java { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } tasks.withType { options.encoding = "UTF-8" } repositories { mavenLocal() mavenCentral() } dependencies { implementation(project(":smithy-typescript-codegen")) } ================================================ FILE: smithy-typescript-codegen-test/example-weather-customizations/src/main/java/example/weather/ExampleWeatherCustomEndpointsRuntimeConfig.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 */ package example.weather; import java.nio.file.Paths; import java.util.List; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.ToShapeId; import software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait; import software.amazon.smithy.typescript.codegen.CodegenUtils; import software.amazon.smithy.typescript.codegen.TypeScriptCodegenContext; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.endpointsV2.EndpointsV2Generator; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin; import software.amazon.smithy.typescript.codegen.integration.RuntimeClientPlugin.Convention; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class ExampleWeatherCustomEndpointsRuntimeConfig implements TypeScriptIntegration { public static final String GENERIC_TEST_DIR = Paths.get(".", CodegenUtils.SOURCE_FOLDER, "generic").toString(); public static final String INDEX_MODULE = GENERIC_TEST_DIR + "/index"; public static final String INDEX_FILE = INDEX_MODULE + ".ts"; public static final String ADD_CUSTOM_ENDPOINTS_FILE = GENERIC_TEST_DIR + "/customEndpoints" + ".ts"; public static final String getClientFile(ShapeId service) { return Paths.get(".", CodegenUtils.SOURCE_FOLDER, service.getName() + "Client.ts").toString(); } public static final ShapeId EXAMPLE_WEATHER_SERVICE_ID = ShapeId.from("example.weather#Weather"); @Override public List getClientPlugins() { return List.of( RuntimeClientPlugin.builder() .inputConfig( Symbol.builder().namespace(INDEX_MODULE, "/").name("GenericCustomEndpointsInputConfig").build() ) .resolvedConfig( Symbol.builder().namespace(INDEX_MODULE, "/").name("GenericCustomEndpointsResolvedConfig").build() ) .resolveFunction( Symbol.builder().namespace(INDEX_MODULE, "/").name("resolveGenericCustomEndpointsConfig").build() ) .servicePredicate((m, s) -> isExampleWeatherService(s)) .build(), RuntimeClientPlugin.builder() .withConventions( "@smithy/core/endpoints", TypeScriptDependency.SMITHY_CORE.dependency.getVersion(), "Endpoint", Convention.HAS_CONFIG ) .servicePredicate((m, s) -> isExampleWeatherService(s)) .build() ); } @Override public void customize(TypeScriptCodegenContext codegenContext) { if (!codegenContext.settings().generateClient()) { return; } if (!isExampleWeatherService(codegenContext.settings().getService())) { return; } codegenContext .writerDelegator() .useFileWriter(INDEX_FILE, w -> { w.write("export * from \"./customEndpoints\";"); }); codegenContext .writerDelegator() .useFileWriter(ADD_CUSTOM_ENDPOINTS_FILE, w -> { w.addTypeImport("Provider", "__Provider", TypeScriptDependency.SMITHY_TYPES); w.addImportSubmodule("normalizeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); w.write( """ export interface GenericCustomEndpointsInputConfig { region?: string | __Provider; endpointProvider?: any; } export interface GenericCustomEndpointsResolvedConfig { region: __Provider; endpointProvider: any; } export const resolveGenericCustomEndpointsConfig = (config: T & GenericCustomEndpointsInputConfig): \ T & GenericCustomEndpointsResolvedConfig => { return { ...config, endpointProvider: normalizeProvider(config.endpointProvider || "www.amazon.com"), region: normalizeProvider(config.region || "us-west-2"), }; } """ ); }); } private static boolean isExampleWeatherService(ToShapeId toShapeId) { return toShapeId.toShapeId().equals(EXAMPLE_WEATHER_SERVICE_ID); } } ================================================ FILE: smithy-typescript-codegen-test/example-weather-customizations/src/main/java/example/weather/SupportWeatherSigV4Auth.java ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package example.weather; import java.util.Optional; import java.util.function.Consumer; import software.amazon.smithy.codegen.core.Symbol; import software.amazon.smithy.codegen.core.SymbolReference; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.typescript.codegen.ApplicationProtocol; import software.amazon.smithy.typescript.codegen.LanguageTarget; import software.amazon.smithy.typescript.codegen.SmithyCoreSubmodules; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptSettings; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.auth.http.ConfigField; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthOptionProperty; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthScheme; import software.amazon.smithy.typescript.codegen.auth.http.HttpAuthSchemeParameter; import software.amazon.smithy.typescript.codegen.auth.http.integration.HttpAuthTypeScriptIntegration; import software.amazon.smithy.utils.SmithyInternalApi; @SmithyInternalApi public final class SupportWeatherSigV4Auth implements HttpAuthTypeScriptIntegration { static final Symbol AWS_CREDENTIAL_IDENTITY = Symbol.builder() .name("AwsCredentialIdentity") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build(); static final Symbol AWS_CREDENTIAL_IDENTITY_PROVIDER = Symbol.builder() .name("AwsCredentialIdentityProvider") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build(); static final ConfigField CREDENTIALS_CONFIG_FIELD = ConfigField.builder() .name("credentials") .type(ConfigField.Type.MAIN) .docs(w -> w.write("The credentials used to sign requests.")) .inputType( Symbol.builder() .name("AwsCredentialIdentity | AwsCredentialIdentityProvider") .addReference(AWS_CREDENTIAL_IDENTITY) .addReference(AWS_CREDENTIAL_IDENTITY_PROVIDER) .build() ) .resolvedType( Symbol.builder() .name("AwsCredentialIdentityProvider") .addReference(AWS_CREDENTIAL_IDENTITY) .addReference(AWS_CREDENTIAL_IDENTITY_PROVIDER) .build() ) .configFieldWriter(ConfigField::defaultMainConfigFieldWriter) .build(); private static final Consumer AWS_SIGV4_AUTH_SIGNER = w -> { w.addDependency(TypeScriptDependency.EXPERIMENTAL_IDENTITY_AND_AUTH); w.addImport("SigV4Signer", null, TypeScriptDependency.EXPERIMENTAL_IDENTITY_AND_AUTH); w.write("new SigV4Signer()"); }; private static final SymbolReference PROVIDER = SymbolReference.builder() .symbol( Symbol.builder() .name("Provider") .namespace(TypeScriptDependency.SMITHY_TYPES.getPackageName(), "/") .addDependency(TypeScriptDependency.SMITHY_TYPES) .build() ) .alias("__Provider") .build(); @Override public boolean matchesSettings(TypeScriptSettings settings) { return !settings.useLegacyAuth(); } @Override public Optional getHttpAuthScheme() { return Optional.of( HttpAuthScheme.builder() .schemeId(ShapeId.from("aws.auth#sigv4")) .applicationProtocol(ApplicationProtocol.createDefaultHttpApplicationProtocol()) .putDefaultSigner(LanguageTarget.SHARED, AWS_SIGV4_AUTH_SIGNER) .addConfigField(CREDENTIALS_CONFIG_FIELD) .addConfigField( ConfigField.builder() .name("region") .type(ConfigField.Type.AUXILIARY) .docs(w -> w.write("The AWS region to which this client will send requests.")) .inputType(Symbol.builder().name("string | __Provider").addReference(PROVIDER).build()) .resolvedType(Symbol.builder().name("__Provider").addReference(PROVIDER).build()) .configFieldWriter(ConfigField::defaultAuxiliaryConfigFieldWriter) .build() ) .addHttpAuthSchemeParameter( HttpAuthSchemeParameter.builder() .name("region") .type(w -> w.write("string")) .source(w -> { w.addDependency(TypeScriptDependency.SMITHY_CORE); w.addImportSubmodule("normalizeProvider", null, TypeScriptDependency.SMITHY_CORE, SmithyCoreSubmodules.CLIENT); w.openBlock("await normalizeProvider(config.region)() || (() => {", "})()", () -> { w.write( "throw new Error(\"expected `region` to be configured for `aws.auth#sigv4`\");" ); }); }) .build() ) .addHttpAuthOptionProperty( HttpAuthOptionProperty.builder() .name("name") .type(HttpAuthOptionProperty.Type.SIGNING) .source( s -> w -> { w.write("$S", s.trait().toNode().expectObjectNode().getMember("name")); } ) .build() ) .addHttpAuthOptionProperty( HttpAuthOptionProperty.builder() .name("region") .type(HttpAuthOptionProperty.Type.SIGNING) .source( t -> w -> { w.write("authParameters.region"); } ) .build() ) .propertiesExtractor( s -> w -> w.write( """ (config, context) => { return { /** * @internal */ signingProperties: { ...config, ...context, }, }; },""" ) ) .build() ); } } ================================================ FILE: smithy-typescript-codegen-test/example-weather-customizations/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration ================================================ example.weather.ExampleWeatherCustomEndpointsRuntimeConfig example.weather.SupportWeatherSigV4Auth ================================================ FILE: smithy-typescript-codegen-test/model/common/fakeAuth.smithy ================================================ $version: "2.0" namespace common @trait @authDefinition structure fakeAuth {} ================================================ FILE: smithy-typescript-codegen-test/model/common/fakeProtocol.smithy ================================================ $version: "2.0" namespace common @trait @protocolDefinition structure fakeProtocol {} ================================================ FILE: smithy-typescript-codegen-test/model/identity-and-auth/httpApiKeyAuth/HttpApiKeyAuthService.smithy ================================================ $version: "2.0" namespace identity.auth.httpApiKeyAuth use common#fakeProtocol @fakeProtocol @httpApiKeyAuth(scheme: "ApiKey", name: "Authorization", in: "header") service HttpApiKeyAuthService { operations: [ OnlyHttpApiKeyAuth OnlyHttpApiKeyAuthOptional SameAsService ] } @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAuth") @auth([httpApiKeyAuth]) operation OnlyHttpApiKeyAuth {} @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAuthOptional") @auth([httpApiKeyAuth]) @optionalAuth operation OnlyHttpApiKeyAuthOptional {} @readonly @http(method: "GET", uri: "/SameAsService") operation SameAsService {} ================================================ FILE: smithy-typescript-codegen-test/model/identity-and-auth/httpBearerAuth/HttpBearerAuthService.smithy ================================================ $version: "2.0" namespace identity.auth.httpBearerAuth use common#fakeProtocol @fakeProtocol @httpBearerAuth service HttpBearerAuthService { operations: [ OnlyHttpBearerAuth OnlyHttpBearerAuthOptional SameAsService ] } @readonly @http(method: "GET", uri: "/OnlyHttpBearerAuth") @auth([httpBearerAuth]) operation OnlyHttpBearerAuth {} @readonly @http(method: "GET", uri: "/OnlyHttpBearerAuthOptional") @auth([httpBearerAuth]) @optionalAuth operation OnlyHttpBearerAuthOptional {} @readonly @http(method: "GET", uri: "/SameAsService") operation SameAsService {} ================================================ FILE: smithy-typescript-codegen-test/model/weather/main.smithy ================================================ $version: "2.0" metadata suppressions = [ { id: "UnstableTrait.smithy" namespace: "example.weather" reason: "Unstable traits are expected in test model, do not emit warning on them." } ] namespace example.weather use aws.auth#sigv4 use common#fakeAuth use common#fakeProtocol use smithy.test#httpRequestTests use smithy.test#httpResponseTests use smithy.waiters#waitable /// Provides weather forecasts. @fakeProtocol @httpApiKeyAuth(name: "X-Api-Key", in: "header") @httpBearerAuth @sigv4(name: "weather") @fakeAuth @auth([sigv4]) @paginated(inputToken: "nextToken", outputToken: "nextToken", pageSize: "pageSize") service Weather { version: "2006-03-01" resources: [ City ] operations: [ GetCurrentTime // util-stream.integ.spec.ts Invoke // Identity and Auth OnlyHttpApiKeyAuth OnlyHttpApiKeyAuthOptional OnlyHttpBearerAuth OnlyHttpBearerAuthOptional OnlyHttpApiKeyAndBearerAuth OnlyHttpApiKeyAndBearerAuthReversed OnlySigv4Auth OnlySigv4AuthOptional OnlyFakeAuth OnlyFakeAuthOptional SameAsService ] } @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAuth") @auth([httpApiKeyAuth]) operation OnlyHttpApiKeyAuth {} @readonly @http(method: "GET", uri: "/OnlyHttpBearerAuth") @auth([httpBearerAuth]) operation OnlyHttpBearerAuth {} @readonly @http(method: "GET", uri: "/OnlySigv4Auth") @auth([sigv4]) operation OnlySigv4Auth {} @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAndBearerAuth") @auth([httpApiKeyAuth, httpBearerAuth]) operation OnlyHttpApiKeyAndBearerAuth {} @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAndBearerAuthReversed") @auth([httpBearerAuth, httpApiKeyAuth]) operation OnlyHttpApiKeyAndBearerAuthReversed {} @readonly @http(method: "GET", uri: "/OnlyHttpApiKeyAuthOptional") @auth([httpApiKeyAuth]) @optionalAuth operation OnlyHttpApiKeyAuthOptional {} @readonly @http(method: "GET", uri: "/OnlyHttpBearerAuthOptional") @auth([httpBearerAuth]) @optionalAuth operation OnlyHttpBearerAuthOptional {} @readonly @http(method: "GET", uri: "/OnlySigv4AuthOptional") @auth([sigv4]) @optionalAuth operation OnlySigv4AuthOptional {} @readonly @http(method: "GET", uri: "/OnlyFakeAuth") @auth([fakeAuth]) operation OnlyFakeAuth {} @readonly @http(method: "GET", uri: "/OnlyFakeAuthOptional") @auth([fakeAuth]) @optionalAuth operation OnlyFakeAuthOptional {} @readonly @http(method: "GET", uri: "/SameAsService") operation SameAsService {} resource City { identifiers: { cityId: CityId } create: CreateCity read: GetCity list: ListCities resources: [ Forecast CityImage ] operations: [ GetCityAnnouncements ] } resource Forecast { identifiers: { cityId: CityId } read: GetForecast } resource CityImage { identifiers: { cityId: CityId } read: GetCityImage } // "pattern" is a trait. @pattern("^[A-Za-z0-9 ]+$") string CityId @readonly @http(method: "GET", uri: "/cities/{cityId}") @httpChecksumRequired operation GetCity { input: GetCityInput output: GetCityOutput errors: [ NoSuchResource ] } // Tests that HTTP protocol tests are generated. apply GetCity @httpRequestTests([ { id: "WriteGetCityAssertions" documentation: "Does something" protocol: "common#fakeProtocol" method: "GET" uri: "/cities/123" body: "" params: { cityId: "123" } } ]) apply GetCity @httpResponseTests([ { id: "WriteGetCityResponseAssertions" documentation: "Does something" protocol: "common#fakeProtocol" code: 200 body: """ { "name": "Seattle", "coordinates": { "latitude": 12.34, "longitude": -56.78 }, "city": { "cityId": "123", "name": "Seattle", "number": "One", "case": "Upper" } }""" bodyMediaType: "application/json" params: { name: "Seattle" coordinates: { latitude: 12.34, longitude: -56.78 } city: { cityId: "123", name: "Seattle", number: "One", case: "Upper" } } } ]) /// The input used to get a city. structure GetCityInput { // "cityId" provides the identifier for the resource and // has to be marked as required. @required @httpLabel cityId: CityId } structure GetCityOutput { // "required" is used on output to indicate if the service // will always provide a value for the member. @required name: String @required coordinates: CityCoordinates city: CitySummary } @idempotent @http(method: "PUT", uri: "/city") operation CreateCity { input: CreateCityInput output: CreateCityOutput } structure CreateCityInput { @required name: String @required coordinates: CityCoordinates city: CitySummary } structure CreateCityOutput { @required cityId: CityId } // This structure is nested within GetCityOutput. structure CityCoordinates { @required latitude: Float @required longitude: Float } /// Error encountered when no resource could be found. @error("client") @httpError(404) structure NoSuchResource { /// The type of resource that was not found. @required resourceType: String message: String } apply NoSuchResource @httpResponseTests([ { id: "WriteNoSuchResourceAssertions" documentation: "Does something" protocol: "common#fakeProtocol" code: 404 body: """ { "resourceType": "City", "message": "Your custom message" }""" bodyMediaType: "application/json" params: { resourceType: "City", message: "Your custom message" } } ]) // The paginated trait indicates that the operation may // return truncated results. @readonly @paginated(items: "items") @http(method: "GET", uri: "/cities") @waitable( CitiesExist: { acceptors: [ { state: "success" matcher: { output: { path: "length(items[]) > `0`", comparator: "booleanEquals", expected: "true" } } } { state: "failure" matcher: { errorType: "NoSuchResource" } } ] } ) operation ListCities { input: ListCitiesInput output: ListCitiesOutput errors: [ NoSuchResource ] } apply ListCities @httpRequestTests([ { id: "WriteListCitiesAssertions" documentation: "Does something" protocol: "common#fakeProtocol" method: "GET" uri: "/cities" body: "" queryParams: ["pageSize=50"] forbidQueryParams: ["nextToken"] params: { pageSize: 50 } } ]) structure ListCitiesInput { @httpQuery("nextToken") nextToken: String @httpQuery("pageSize") pageSize: Integer } structure ListCitiesOutput { nextToken: String @required items: CitySummaries } // CitySummaries is a list of CitySummary structures. list CitySummaries { member: CitySummary } // CitySummary contains a reference to a City. @references([ { resource: City } ]) structure CitySummary { @required cityId: CityId @required name: String number: String case: String } @readonly @http(method: "GET", uri: "/current-time") operation GetCurrentTime { output: GetCurrentTimeOutput } structure GetCurrentTimeOutput { @required time: Timestamp } @http(method: "POST", uri: "/invoke", code: 200) operation Invoke { input: InvokeInput output: InvokeOutput } structure InvokeInput { @httpPayload payload: Blob } structure InvokeOutput { @httpPayload payload: Blob } @readonly @http(method: "GET", uri: "/cities/{cityId}/forecast") operation GetForecast { input: GetForecastInput output: GetForecastOutput } // "cityId" provides the only identifier for the resource since // a Forecast doesn't have its own. structure GetForecastInput { @required @httpLabel cityId: CityId } structure GetForecastOutput { chanceOfRain: Float precipitation: Precipitation } union Precipitation { rain: PrimitiveBoolean sleet: PrimitiveBoolean hail: StringMap snow: SimpleYesNo mixed: TypedYesNo other: OtherStructure blob: Blob foo: example.weather.nested#Foo baz: example.weather.nested.more#Baz } structure OtherStructure {} enum SimpleYesNo { YES NO } enum TypedYesNo { YES = "YES" NO = "NO" } map StringMap { key: String value: String } @readonly @http(method: "GET", uri: "/cities/{cityId}/image") operation GetCityImage { input: GetCityImageInput output: GetCityImageOutput errors: [ NoSuchResource ] } structure GetCityImageInput { @required @httpLabel cityId: CityId } structure GetCityImageOutput { @httpPayload @required image: CityImageData } @streaming blob CityImageData @readonly @http(method: "GET", uri: "/cities/{cityId}/announcements") @tags(["client-only"]) operation GetCityAnnouncements { input: GetCityAnnouncementsInput output: GetCityAnnouncementsOutput errors: [ NoSuchResource ] } structure GetCityAnnouncementsInput { @required @httpLabel cityId: CityId } structure GetCityAnnouncementsOutput { @httpHeader("x-last-updated") lastUpdated: Timestamp @httpPayload announcements: Announcements } @streaming union Announcements { police: Message fire: Message health: Message } structure Message { message: String author: String } apply Weather @smithy.rules#endpointRuleSet({ version: "1.3" parameters: { Region: { required: true, type: "String", documentation: "docs" } endpoint: { required: false, type: "String", documentation: "docs" } } rules: [ { conditions: [ { fn: "isSet" argv: [ { ref: "endpoint" } ] } ] endpoint: { url: { ref: "endpoint" } } type: "endpoint" } { conditions: [] error: "(default endpointRuleSet) endpoint is not set - you must configure an endpoint." type: "error" } ] }) apply Weather @smithy.rules#clientContextParams( Region: { type: "string", documentation: "docs" } endpoint: { type: "string", documentation: "docs" } ) ================================================ FILE: smithy-typescript-codegen-test/model/weather/more-nesting.smithy ================================================ $version: "2.0" namespace example.weather.nested.more structure Baz { baz: String bar: String } ================================================ FILE: smithy-typescript-codegen-test/model/weather/nested.smithy ================================================ $version: "2.0" namespace example.weather.nested structure Foo { baz: String bar: String } ================================================ FILE: smithy-typescript-codegen-test/released-version-test/build.gradle.kts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ // TODO(released-version-test): Test released version of smithy-typescript codegenerators, but currently is extremely flaky /* plugins { java id("software.amazon.smithy.gradle.smithy-base") } repositories { mavenCentral() } dependencies { val smithyVersion: String by project smithyBuild("software.amazon.smithy.typescript:smithy-typescript-codegen:0.20.1!!") smithyBuild("software.amazon.smithy.typescript:smithy-aws-typescript-codegen:0.20.1!!") smithyBuild(project(":smithy-typescript-codegen-test:example-weather-customizations")) // Explicitly configure for CLI version smithyBuild("software.amazon.smithy:smithy-model:$smithyVersion") // Includes example model so must be runtime dependency implementation(project(":smithy-typescript-codegen-test")) } tasks["jar"].enabled = false */ ================================================ FILE: smithy-typescript-codegen-test/released-version-test/smithy-build.json ================================================ { "version": "1.0", "plugins": { "typescript-codegen": { "service": "example.weather#Weather", "package": "weather", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true } } } } ================================================ FILE: smithy-typescript-codegen-test/smithy-build.json ================================================ { "version": "1.0", "projections": { "ssdk-test": { "transforms": [ { "name": "excludeShapesByTag", "args": { "tags": ["client-only"] } }, { "name": "includeServices", "args": { "services": ["example.weather#Weather"] } } ], "plugins": { "typescript-server-codegen": { "service": "example.weather#Weather", "package": "weather-ssdk", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true }, "disableDefaultValidation": true } } }, "client-identity-and-auth": { "transforms": [ { "name": "includeServices", "args": { "services": ["example.weather#Weather"] } } ], "plugins": { "typescript-client-codegen": { "service": "example.weather#Weather", "package": "weather", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true } } } }, "client-legacy-auth": { "transforms": [ { "name": "includeServices", "args": { "services": ["example.weather#Weather"] } } ], "plugins": { "typescript-client-codegen": { "service": "example.weather#Weather", "package": "@smithy/weather-legacy-auth", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true }, "useLegacyAuth": true } } }, "identity-and-auth-http-api-key-auth": { "transforms": [ { "name": "includeServices", "args": { "services": ["identity.auth.httpApiKeyAuth#HttpApiKeyAuthService"] } } ], "plugins": { "typescript-client-codegen": { "service": "identity.auth.httpApiKeyAuth#HttpApiKeyAuthService", "package": "@smithy/identity-and-auth-http-api-key-auth-service", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true } } } }, "identity-and-auth-http-bearer-auth": { "transforms": [ { "name": "includeServices", "args": { "services": ["identity.auth.httpBearerAuth#HttpBearerAuthService"] } } ], "plugins": { "typescript-client-codegen": { "service": "identity.auth.httpBearerAuth#HttpBearerAuthService", "package": "@smithy/identity-and-auth-http-bearer-auth-service", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true } } } } }, "plugins": { "typescript-client-codegen": { "service": "example.weather#Weather", "package": "weather", "packageVersion": "0.0.1", "packageJson": { "license": "Apache-2.0", "private": true } } } } ================================================ FILE: smithy-typescript-protocol-test-codegen/build.gradle.kts ================================================ import software.amazon.smithy.gradle.tasks.SmithyBuildTask val smithyVersion: String by project repositories { mavenLocal() mavenCentral() } buildscript { val smithyVersion: String by project dependencies { classpath("software.amazon.smithy:smithy-cli:$smithyVersion") } } plugins { `java-library` val smithyGradleVersion: String by project id("software.amazon.smithy.gradle.smithy-base").version(smithyGradleVersion) } dependencies { implementation("software.amazon.smithy:smithy-protocol-tests:$smithyVersion") implementation(project(":smithy-typescript-codegen")) } val buildSdk = tasks.register("buildSdk") { models.set(files("model/")) smithyBuildConfigs.set(files("smithy-build.json")) } // Run the `buildSdk` automatically. tasks["build"].finalizedBy(buildSdk) tasks.register("copyOutput") { into(layout.buildDirectory.dir("model")) from(buildSdk.map { it.getPluginProjectionDirectory("source", "model") }) } ================================================ FILE: smithy-typescript-protocol-test-codegen/model/my-local-model/HttpLabelCommand.smithy ================================================ $version: "2.0" namespace org.xyz.secondary use smithy.protocols#rpcv2Cbor use smithy.test#httpResponseTests @httpResponseTests([ { id: "HttpLabelCommandExample" protocol: rpcv2Cbor code: 200 headers: { "smithy-protocol": "rpc-v2-cbor" } } ]) @http(method: "POST", uri: "/{LabelDoesNotApplyToRpcProtocol}", code: 200) operation HttpLabelCommand { input := { @httpLabel @required LabelDoesNotApplyToRpcProtocol: String } output := {} } ================================================ FILE: smithy-typescript-protocol-test-codegen/model/my-local-model/main.smithy ================================================ $version: "2.0" metadata suppressions = [ { id: "UnstableTrait" namespace: "*" reason: "noisy" } ] ================================================ FILE: smithy-typescript-protocol-test-codegen/model/my-local-model/my-local-model.smithy ================================================ $version: "2.0" namespace org.xyz.v1 use org.xyz.secondary#HttpLabelCommand use smithy.protocols#rpcv2Cbor use smithy.rules#clientContextParams use smithy.rules#contextParam use smithy.rules#endpointRuleSet use smithy.test#httpRequestTests use smithy.test#httpResponseTests use smithy.waiters#waitable @rpcv2Cbor @documentation("xyz interfaces") @httpApiKeyAuth(name: "X-Api-Key", in: "header") @clientContextParams( customParam: { type: "string", documentation: "Custom parameter" } region: { type: "string", documentation: "Conflicting with built-in region" } enableFeature: { type: "boolean", documentation: "Feature toggle flag" } debugMode: { type: "boolean", documentation: "Debug mode flag" } nonConflictingParam: { type: "string", documentation: "Non-conflicting parameter" } logger: { type: "string", documentation: "Conflicting logger parameter" } ApiKey: { type: "string", documentation: "ApiKey" } ) @endpointRuleSet({ version: "1.0" parameters: { endpoint: { builtIn: "SDK::Endpoint", documentation: "The endpoint used to send the request.", type: "string" } ApiKey: { required: false, documentation: "ApiKey", type: "string" } region: { type: "string", required: false, documentation: "AWS region" } customParam: { type: "string", required: true, default: "default-custom-value", documentation: "Custom parameter for testing" } enableFeature: { type: "boolean", required: true, default: true, documentation: "Feature toggle with default" } debugMode: { type: "boolean", required: true, default: false, documentation: "Debug mode with default" } nonConflictingParam: { type: "string", required: true, default: "non-conflict-default", documentation: "Non-conflicting with default" } logger: { type: "string", required: true, default: "default-logger", documentation: "Conflicting logger with default" } CustomHeaderValue: { type: "string", required: false, documentation: "Value to send as x-custom-header" } } rules: [ { conditions: [ { fn: "isSet" argv: [ { ref: "endpoint" } ] } { fn: "isSet" argv: [ { ref: "ApiKey" } ] } { fn: "isSet" argv: [ { ref: "CustomHeaderValue" } ] } ] endpoint: { url: "{endpoint}" properties: {} headers: { "x-api-key": ["{ApiKey}"] "x-custom-header": ["{CustomHeaderValue}"] } } type: "endpoint" } { conditions: [ { fn: "isSet" argv: [ { ref: "endpoint" } ] } { fn: "isSet" argv: [ { ref: "ApiKey" } ] } ] endpoint: { url: "{endpoint}" properties: {} headers: { "x-api-key": ["{ApiKey}"] } } type: "endpoint" } { conditions: [ { fn: "isSet" argv: [ { ref: "endpoint" } ] } ] endpoint: { url: "{endpoint}" properties: {} headers: {} } type: "endpoint" } { conditions: [] error: "endpoint is not set - you must configure an endpoint." type: "error" } ] }) service XYZService { version: "1.0" operations: [ GetNumbers TradeEventStream camelCaseOperation HttpLabelCommand ] errors: [ MainServiceLinkedError ] } @error("client") @httpError(400) structure MainServiceLinkedError {} @waitable( NumbersAligned: { documentation: "wait until the numbers align" acceptors: [ { state: "success" matcher: { success: true } } { state: "retry" matcher: { errorType: "MysteryThrottlingError" } } { state: "failure" matcher: { errorType: "HaltError" } } ] } NumbersMisaligned: { documentation: "wait until the numbers don't align" acceptors: [ { state: "retry" matcher: { success: true } } { state: "success" matcher: { errorType: "HaltError" } } ] } NumbersWhatDoTheyDoAnyway: { documentation: "wait until the numbers align or don't align" acceptors: [ { state: "success" matcher: { success: true } } { state: "success" matcher: { errorType: "HaltError" } } ] } ) @paginated(inputToken: "startToken", outputToken: "nextToken", pageSize: "maxResults", items: "numbers") @readonly @httpRequestTests([ { id: "GetNumbersRequestExample" protocol: "smithy.protocols#rpcv2Cbor" method: "POST" uri: "/service/XYZService/operation/GetNumbers" tags: ["serde-benchmark"] } { id: "EndpointResolvedHeadersApplied" protocol: "smithy.protocols#rpcv2Cbor" method: "POST" uri: "/service/XYZService/operation/GetNumbers" params: { customHeaderInput: "test-custom-value" } headers: { "x-custom-header": "test-custom-value" } } ]) @httpResponseTests([ { id: "GetNumbersResponseExample" protocol: "smithy.protocols#rpcv2Cbor" code: 200 headers: { "smithy-protocol": "rpc-v2-cbor" } tags: ["serde-benchmark"] } ]) @http(method: "POST", uri: "/get-numbers", code: 200) operation GetNumbers { input: GetNumbersRequest output: GetNumbersResponse errors: [ CodedThrottlingError MysteryThrottlingError RetryableError HaltError XYZServiceServiceException ] } @input structure GetNumbersRequest { bigDecimal: BigDecimal bigInteger: BigInteger @documentation("This is deprecated documentation annotation") @deprecated fieldWithoutMessage: String @documentation("This is deprecated documentation annotation") @deprecated(message: "This field has been deprecated", since: "3.0") fieldWithMessage: String startToken: String maxResults: Integer @contextParam(name: "CustomHeaderValue") customHeaderInput: String numbers: IntegerMap sparseNumbers: SparseIntegerMap } @output structure GetNumbersResponse { bigDecimal: BigDecimal bigInteger: BigInteger numbers: IntegerList sparseNumbers: SparseIntegerList nextToken: String @documentation("This is deprecated documentation annotation") @deprecated(message: "these numbers are not used anymore", since: "1685-12-31") deprecatedNumbers: IntegerList @documentation("This is deprecated documentation annotation") @deprecated(since: "1685-12-31") deprecatedNumbersWithoutExplanation: IntegerList @deprecated(message: "these numbers are not used anymore??") deprecatedNumbersWithoutChronology: IntegerList @deprecated inexplicablyDeprecatedNumbers: IntegerList } list IntegerList { member: Integer } @sparse list SparseIntegerList { member: Integer } map IntegerMap { key: String value: Integer } @sparse map SparseIntegerMap { key: String value: Integer } @error("client") @retryable(throttling: true) @httpError(429) structure CodedThrottlingError {} @error("client") @retryable(throttling: true) structure MysteryThrottlingError {} @error("client") @retryable structure RetryableError { message: String } @error("client") structure HaltError { message: String } @error("client") structure XYZServiceServiceException {} @http(method: "POST", uri: "/trade-event-stream", code: 200) operation TradeEventStream { input: TradeEventStreamRequest output: TradeEventStreamResponse } structure TradeEventStreamRequest { eventStream: TradeEvents } structure TradeEventStreamResponse { eventStream: TradeEvents } @streaming union TradeEvents { alpha: Alpha beta: Unit gamma: Unit delta: DifferentShapeName } structure Alpha { id: String timestamp: Timestamp } // this tests that the event stream member associated with it // generates using :event-type: delta rather than :event-type: DifferentShapeName. structure DifferentShapeName { name: String number: Integer } @rpcv2Cbor @documentation("a second service in the same model, unused.") service UnusedService { version: "1.0" operations: [ UnusedOperation ] errors: [ UnusedServiceLinkedError ] } @http(method: "POST", uri: "/unused", code: 200) operation UnusedOperation { input: Unit output: Unit errors: [ UnusedServiceOperationLinkedError ] } @error("client") @httpError(400) structure UnusedServiceOperationLinkedError {} @error("client") @httpError(400) structure UnusedServiceLinkedError {} @error("client") @httpError(400) structure CompletelyUnlinkedError {} @paginated(inputToken: "token", outputToken: "token", items: "results") @readonly @http(method: "POST", uri: "/camel-case", code: 200) operation camelCaseOperation { input := { token: String } output := { token: String results: Blobs } } list Blobs { member: Blob } ================================================ FILE: smithy-typescript-protocol-test-codegen/model/my-local-model/secondary.smithy ================================================ $version: "2.0" namespace org.xyz.secondary use smithy.protocols#rpcv2Cbor @rpcv2Cbor @documentation("a second service in the same model, unused.") service TertiaryService { version: "1.0" operations: [ TertiaryUnusedOperation ] errors: [ TertiaryUnusedServiceLinkedError ] } operation TertiaryUnusedOperation { input: Unit output: Unit errors: [ TertiaryUnusedServiceOperationLinkedError ] } @error("client") @httpError(400) structure TertiaryUnusedServiceOperationLinkedError {} @error("client") @httpError(400) structure TertiaryUnusedServiceLinkedError {} @error("client") @httpError(400) structure TertiaryCompletelyUnlinkedError {} ================================================ FILE: smithy-typescript-protocol-test-codegen/smithy-build.json ================================================ { "version": "1.0", "projections": { "smithy-rpcv2-cbor": { "transforms": [ { "name": "includeServices", "args": { "services": ["smithy.protocoltests.rpcv2Cbor#RpcV2Protocol"] } } ], "plugins": { "typescript-codegen": { "package": "@smithy/smithy-rpcv2-cbor", "packageManager": "npm", "packageVersion": "1.0.0-alpha.1", "packageJson": { "author": { "name": "Smithy team", "url": "https://smithy.io/" }, "scripts": { "merged": "echo \"this is merged from user configuration.\"" }, "license": "Apache-2.0" }, "private": true, "generateSchemas": false, "generateIndexTests": true } } }, "smithy-rpcv2-cbor-schema": { "transforms": [ { "name": "includeServices", "args": { "services": ["smithy.protocoltests.rpcv2Cbor#RpcV2Protocol"] } } ], "plugins": { "typescript-codegen": { "package": "@smithy/smithy-rpcv2-cbor-schema", "packageManager": "npm", "packageVersion": "1.0.0-alpha.1", "packageJson": { "author": { "name": "Smithy team", "url": "https://smithy.io/" }, "scripts": {}, "license": "Apache-2.0" }, "private": true, "generateSchemas": true, "generateIndexTests": true, "generateSnapshotTests": true } } }, "my-local-model": { "transforms": [ { "name": "includeServices", "args": { "services": ["org.xyz.v1#XYZService", "org.xyz.v1#UnusedService", "org.xyz.secondary#TertiaryService"] } } ], "plugins": { "typescript-client-codegen": { "service": "org.xyz.v1#XYZService", "package": "xyz", "packageManager": "npm", "packageVersion": "0.0.1", "versioningScheme": "@smithy/core", "packageJson": { "private": true }, "bigNumberMode": "native", "generateSchemas": false } } }, "my-local-model-schema": { "transforms": [ { "name": "includeServices", "args": { "services": ["org.xyz.v1#XYZService", "org.xyz.v1#UnusedService", "org.xyz.secondary#TertiaryService"] } } ], "plugins": { "typescript-client-codegen": { "service": "org.xyz.v1#XYZService", "package": "xyz-schema", "packageManager": "npm", "packageVersion": "0.0.1", "versioningScheme": "@aws-sdk/client", "packageJson": { "private": true }, "bigNumberMode": "native", "generateSchemas": true, "generateIndexTests": true, "generateSnapshotTests": true, "generateEndpointBdd": true } } } } } ================================================ FILE: smithy-typescript-ssdk-codegen-test-utils/build.gradle.kts ================================================ extra["displayName"] = "Smithy :: Typescript :: SSDK :: Codegen :: Test :: Utils" extra["moduleName"] = "software.amazon.smithy.typescript.ssdk.codegen.test.utils" plugins { `java-library` } repositories { mavenLocal() mavenCentral() } dependencies { implementation(project(":smithy-typescript-codegen")) } ================================================ FILE: smithy-typescript-ssdk-codegen-test-utils/src/main/java/software/amazon/smithy/typescript/ssdk/codegen/test/utils/AddProtocols.java ================================================ package software.amazon.smithy.typescript.ssdk.codegen.test.utils; import java.util.List; import software.amazon.smithy.typescript.codegen.integration.ProtocolGenerator; import software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration; import software.amazon.smithy.utils.ListUtils; import software.amazon.smithy.utils.SmithyInternalApi; /** * Adds fake protocols. */ @SmithyInternalApi public class AddProtocols implements TypeScriptIntegration { @Override public List getProtocolGenerators() { return ListUtils.of(new TestProtocolGenerator()); } } ================================================ FILE: smithy-typescript-ssdk-codegen-test-utils/src/main/java/software/amazon/smithy/typescript/ssdk/codegen/test/utils/TestProtocolGenerator.java ================================================ package software.amazon.smithy.typescript.ssdk.codegen.test.utils; import java.util.List; import java.util.Set; import software.amazon.smithy.model.knowledge.HttpBinding; import software.amazon.smithy.model.shapes.OperationShape; import software.amazon.smithy.model.shapes.Shape; import software.amazon.smithy.model.shapes.ShapeId; import software.amazon.smithy.model.shapes.StructureShape; import software.amazon.smithy.model.traits.TimestampFormatTrait.Format; import software.amazon.smithy.typescript.codegen.TypeScriptDependency; import software.amazon.smithy.typescript.codegen.TypeScriptWriter; import software.amazon.smithy.typescript.codegen.integration.HttpBindingProtocolGenerator; import software.amazon.smithy.utils.SmithyInternalApi; /** * Protocol for SSDK codegen testing. */ @SmithyInternalApi class TestProtocolGenerator extends HttpBindingProtocolGenerator { TestProtocolGenerator() { super(true); } @Override public ShapeId getProtocol() { return ShapeId.from("common#fakeProtocol"); } @Override public String getName() { return "fakeProtocol"; } @Override protected String getDocumentContentType() { return "application/json"; } @Override public Format getDocumentTimestampFormat() { return Format.EPOCH_SECONDS; } @Override public boolean requiresNumericEpochSecondsInPayload() { return true; } @Override public boolean enableSerdeElision() { return true; } @Override public void deserializeErrorDocumentBody( GenerationContext context, StructureShape error, List documentBindings ) {} @Override public void serializeErrorDocumentBody( GenerationContext context, StructureShape error, List documentBindings ) {} @Override public void deserializeInputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ) {} @Override public void serializeInputDocumentBody( GenerationContext context, OperationShape operation, List documentBindings ) { TypeScriptWriter writer = context.getWriter(); writer.write("body = \"{}\""); } @Override public void deserializeOutputDocumentBody( GenerationContext context, OperationShape error, List documentBindings ) {} @Override public void serializeOutputDocumentBody( GenerationContext context, OperationShape error, List documentBindings ) {} @Override public void serializeInputEventDocumentPayload(GenerationContext context) {} @Override public void generateDocumentBodyShapeSerializers(GenerationContext context, Set shapes) {} @Override public void generateDocumentBodyShapeDeserializers(GenerationContext context, Set shapes) {} @Override public void writeErrorCodeParser(GenerationContext context) { TypeScriptWriter writer = context.getWriter(); writer.write("const errorCode = parseErrorCode(output, parsedOutput.body);"); } @Override public void generateProtocolTests(GenerationContext context) {} @Override public void generateSharedComponents(GenerationContext context) { super.generateSharedComponents(context); TypeScriptWriter writer = context.getWriter(); // Include a JSON body parser used to deserialize documents from HTTP responses. writer.addImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); writer.openBlock( "const parseBody = (streamBody: any, context: __SerdeContext): " + "any => collectBodyString(streamBody, context).then(encoded => {", "});", () -> { writer.openBlock("if (encoded.length) {", "}", () -> { writer.write("return JSON.parse(encoded);"); }); writer.write("return {};"); } ); writer.write(""); // Include a JSON body parser. writer.addImport("SerdeContext", "__SerdeContext", TypeScriptDependency.SMITHY_TYPES); writer.openBlock("const parseErrorBody = async (errorBody: any, context: __SerdeContext) => {", "}", () -> { writer.write("const value = await parseBody(errorBody, context);"); writer.write("value.message = value.message ?? value.Message;"); writer.write("return value;"); }); writer.write(""); // Include an error code parser. writer.openBlock( "const parseErrorCode = (output: __HttpResponse, data: any): string | undefined => {", "}", () -> { writer.openBlock("if (output.headers[\"x-error\"]) {", "}", () -> { writer.write("return output.headers[\"x-error\"];"); }); writer.openBlock("if (data.code !== undefined) {", "}", () -> { writer.write("return data.code;"); }); } ); } } ================================================ FILE: smithy-typescript-ssdk-codegen-test-utils/src/main/resources/META-INF/services/software.amazon.smithy.typescript.codegen.integration.TypeScriptIntegration ================================================ software.amazon.smithy.typescript.ssdk.codegen.test.utils.AddProtocols ================================================ FILE: smithy-typescript-ssdk-libs/README.md ================================================ # Smithy Typescript Server SDK Libraries These libraries support the use of the Smithy TypeScript Server SDKs. ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json src/*.js dist/ types/ ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/.npmignore ================================================ /coverage/ tsconfig.test.json *.tsbuildinfo jest.config.js *.spec.js *.spec.ts *.spec.d.ts *.spec.js.map *.mock.js *.mock.d.ts *.mock.js.map *.fixture.js *.fixture.d.ts *.fixture.js.map ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/CHANGELOG.md ================================================ # server-apigateway Changelog ## 1.0.0-alpha.10 (2023-04-18) ## 1.0.0-alpha.9 (2023-03-16) ### Other - Upgraded to Yarn 3. ([#705](https://github.com/awslabs/smithy-typescript/pull/705)) ## 1.0.0-alpha.8 (2023-02-09) ### Features - Generated ES module distributions. ([#686](https://github.com/awslabs/smithy-typescript/pull/686)) ## 1.0.0-alpha.7 (2023-01-25) ## 1.0.0-alpha.6 (2022-08-22) ### Features - Used Record type in place of Object in SSDK libs. ([#558](https://github.com/awslabs/smithy-typescript/pull/558)) - Updated shelljs, minimist dependencies. ([#497](https://github.com/awslabs/smithy-typescript/pull/497), [#529](https://github.com/awslabs/smithy-typescript/pull/529)) - Updated SDK dependencies. ## 1.0.0-alpha.5 (2022-02-23) ### Features - Updated SDK dependencies. ### Other - Converted from lerna to turborepo. ([#506](https://github.com/awslabs/smithy-typescript/pull/506)) ## 1.0.0-alpha.4 (2022-01-03) ### Features - Updated SDK dependencies. ## 1.0.0-alpha.3 (2021-11-03) ### Features - Update SDK dependencies ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/README.md ================================================ # smithy-typescript/server-apigateway This package provides glue code to enable using a server sdk inside of apigateway. ## Usage ### Example ```typescript import { convertEvent, convertResponse } from "@aws-smithy/server-apigateway"; import { SayHelloInput, SayHelloOutput, GreetingService as __GreetingService, getGreetingServiceHandler, } from "@greeting-service/service-greeting"; import { HttpRequest } from "@smithy/protocol-http"; import { APIGatewayProxyEventV2, APIGatewayProxyHandlerV2, APIGatewayProxyResultV2 } from "aws-lambda"; class GreetingService implements __GreetingService { SayHello(input: SayHelloInput, request: HttpRequest): SayHelloOutput { return { greeting: `Hello ${input.name}! How is ${input.city}?`, }; } } const serviceHandler = getGreetingServiceHandler(new GreetingService()); export const lambdaHandler: APIGatewayProxyHandlerV2 = async ( event: APIGatewayProxyEventV2 ): Promise => { console.log(`Received event: ${JSON.stringify(event)}`); // Convert apigateway's lambda event to an HttpRequest. const convertedEvent = convertEvent(event); // Call the service handler, which will route the request to the GreetingService // implementation and then serialize the response to an HttpResponse. let rawResponse = await serviceHandler.handle(convertedEvent); // Convert the HttpResponse to apigateway's expected format. const convertedResponse = convertResponse(rawResponse); console.log(`Returning response: ${JSON.stringify(convertedResponse)}`); return convertedResponse; }; ``` ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/jest.config.js ================================================ const base = require("../../jest.config.base.js"); module.exports = { preset: "ts-jest", ...base, }; ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/package.json ================================================ { "name": "@aws-smithy/server-apigateway", "version": "1.0.0-alpha.10", "description": "Base components for Smithy services behind APIGateway", "main": "./dist/cjs/index.js", "module": "./dist/es/index.js", "types": "./dist/types/index.d.ts", "scripts": { "prepublishOnly": "yarn build", "pretest": "yarn build", "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "postbuild": "premove dist/types/ts3.4 && downlevel-dts dist/types dist/types/ts3.4", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "jest --passWithNoTests", "clean": "premove dist", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"" }, "repository": { "type": "git", "url": "git+https://github.com/smithy-lang/smithy-typescript.git", "directory": "smithy-typescript-ssdk-libs/server-apigateway" }, "author": "AWS Smithy Team", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "workspace:^", "@smithy/types": "workspace:^", "@types/aws-lambda": "^8.10.72", "tslib": "^1.8.0" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "^0.7.0", "jest": "29.7.0", "premove": "4.0.0", "typescript": "~5.8.3" }, "files": [ "dist/cjs/**/*.js", "dist/es/**/*.js", "dist/types/**/*.d.ts", "!**/*.spec.*" ], "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.0": { "dist/types/*": [ "dist/types/ts3.4/*" ] } }, "bugs": { "url": "https://github.com/smithy-lang/smithy-typescript/issues" }, "homepage": "https://github.com/smithy-lang/smithy-typescript#readme", "publishConfig": { "directory": ".release/package" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/src/index.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ export * from "./lambda"; ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/src/lambda.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { Readable } from "node:stream"; import { HttpRequest, type HeaderBag, type HttpResponse } from "@smithy/protocol-http"; import type { QueryParameterBag } from "@smithy/types"; import type { APIGatewayProxyEvent, APIGatewayProxyEventHeaders, APIGatewayProxyEventMultiValueHeaders, APIGatewayProxyEventMultiValueQueryStringParameters, APIGatewayProxyEventQueryStringParameters, APIGatewayProxyEventV2, APIGatewayProxyResult, APIGatewayProxyResultV2, } from "aws-lambda"; export function convertEvent(event: APIGatewayProxyEvent): HttpRequest; export function convertEvent(event: APIGatewayProxyEventV2): HttpRequest; export function convertEvent(event: APIGatewayProxyEvent | APIGatewayProxyEventV2): HttpRequest { if (isV2Event(event)) { return convertV2Event(event); } else { return convertV1Event(event); } } function convertV1Event(event: APIGatewayProxyEvent): HttpRequest { return new HttpRequest({ method: event.httpMethod, headers: convertMultiValueHeaders(event.multiValueHeaders), query: convertMultiValueQueryStringParameters(event.multiValueQueryStringParameters), path: event.path, ...(event.body ? { body: Readable.from(Buffer.from(event.body, event.isBase64Encoded ? "base64" : "utf8")) } : {}), }); } function convertV2Event(event: APIGatewayProxyEventV2): HttpRequest { return new HttpRequest({ method: event.requestContext.http.method, headers: convertHeaders(event.headers), query: convertQuery(event.queryStringParameters), path: event.rawPath, ...(event.body ? { body: Readable.from(Buffer.from(event.body, event.isBase64Encoded ? "base64" : "utf8")) } : {}), }); } export const convertVersion2Response = convertResponse; export function convertResponse(response: HttpResponse): APIGatewayProxyResultV2 { return { statusCode: response.statusCode, headers: response.headers, body: response.body, isBase64Encoded: false, }; } export function convertVersion1Response(response: HttpResponse): APIGatewayProxyResult { return { statusCode: response.statusCode, multiValueHeaders: convertResponseHeaders(response.headers), body: response.body, isBase64Encoded: false, }; } function convertResponseHeaders(headers: HeaderBag) { const retVal: Record = {}; for (const [key, val] of Object.entries(headers)) { retVal[key] = val.split(",").map((v) => v.trim()); } return retVal; } function isV2Event(event: APIGatewayProxyEvent | APIGatewayProxyEventV2): event is APIGatewayProxyEventV2 { return hasVersion(event) && event.version === "2.0"; } function hasVersion(event: any): event is Record<"version", string> { return event.hasOwnProperty("version"); } function convertMultiValueHeaders(multiValueHeaders: APIGatewayProxyEventMultiValueHeaders | null) { const retVal: Record = {}; if (multiValueHeaders === null) { return retVal; } for (const [key, val] of Object.entries(multiValueHeaders)) { if (val !== undefined) { retVal[key] = val.join(", "); } } return retVal; } // TODO: this can be rewritten with arrow functions / Object.fromEntries / filter // but first we need to split up generated client and servers so we can have different // language version targets. function convertHeaders(headers: APIGatewayProxyEventHeaders): HeaderBag { const retVal: Record = {}; for (const [key, val] of Object.entries(headers)) { if (val !== undefined) { retVal[key] = val; } } return retVal; } function convertMultiValueQueryStringParameters(params: APIGatewayProxyEventMultiValueQueryStringParameters | null) { if (params === undefined || params === null) { return undefined; } const retVal: Record = {}; for (const [key, val] of Object.entries(params)) { if (val !== undefined) { retVal[key] = val; } } return retVal; } // TODO: this can be rewritten with arrow functions / Object.fromEntries / filter function convertQuery(params: APIGatewayProxyEventQueryStringParameters | undefined): QueryParameterBag | undefined { if (params === undefined) { return undefined; } const retVal: { [key: string]: string | string[] } = {}; for (const [key, val] of Object.entries(params)) { if (val !== undefined) { if (val.indexOf(",") !== -1) { retVal[key] = val; } else { retVal[key] = val.split(","); } } } return retVal; } ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist/cjs" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "module": "ESNext", "outDir": "dist/es" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/tsconfig.json ================================================ { "extends": "../../tsconfig.json", "compilerOptions": { "stripInternal": true, "removeComments": true, "rootDir": "src", "baseUrl": "." }, "include": ["src/"] } ================================================ FILE: smithy-typescript-ssdk-libs/server-apigateway/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist/types", "emitDeclarationOnly": true }, "exclude": ["test/**/*", "dist/types/**/*"] } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json src/*.js dist/ types/ ================================================ FILE: smithy-typescript-ssdk-libs/server-common/.npmignore ================================================ /coverage/ tsconfig.test.json *.tsbuildinfo jest.config.js *.spec.js *.spec.ts *.spec.d.ts *.spec.js.map *.mock.js *.mock.d.ts *.mock.js.map *.fixture.js *.fixture.d.ts *.fixture.js.map ================================================ FILE: smithy-typescript-ssdk-libs/server-common/CHANGELOG.md ================================================ # server-common Changelog ## 1.0.0-alpha.10 (2023-04-18) ### Bug Fixes - Fix `uniqueItems` validation not to throw when undefined values are nested inside a list of objects. ## 1.0.0-alpha.9 (2023-03-16) ### Features - Updated validation messages to remove user input values and internal enum values. ([#695](https://github.com/awslabs/smithy-typescript/pull/695), [#704](https://github.com/awslabs/smithy-typescript/pull/704), [#713](https://github.com/awslabs/smithy-typescript/pull/713)) ### Other - Upgraded to Yarn 3. ([#705](https://github.com/awslabs/smithy-typescript/pull/705)) ## 1.0.0-alpha.8 (2023-02-09) ### Features - Generated ES module distributions. ([#685](https://github.com/awslabs/smithy-typescript/pull/685)) - Used re2 `test()` instead of `match()`. ([#680](https://github.com/awslabs/smithy-typescript/pull/680)) ## 1.0.0-alpha.7 (2023-01-25) ### Features - Added intEnum validator. ([#654](https://github.com/awslabs/smithy-typescript/pull/654)) ## 1.0.0-alpha.6 (2022-08-22) ### Features - Used Record type in place of Object in SSDK libs. ([#558](https://github.com/awslabs/smithy-typescript/pull/558)) - Updated shelljs, minimist dependencies. ([#497](https://github.com/awslabs/smithy-typescript/pull/497), [#529](https://github.com/awslabs/smithy-typescript/pull/529)) - Updated SDK dependencies. ## 1.0.0-alpha.5 (2022-02-23) ### Features - Defined ServiceException as base class for service side exception. ([#502](https://github.com/awslabs/smithy-typescript/pull/502)) - Updated SDK dependencies. ### Bug Fixes - Fix the uniqueItems implementation to accommodate non-primitive values. ([#511](https://github.com/awslabs/smithy-typescript/pull/511)) - Fixed the implementation of length validation for strings. ([#510](https://github.com/awslabs/smithy-typescript/pull/510)) ### Other - Converted from lerna to turborepo. ([#506](https://github.com/awslabs/smithy-typescript/pull/506)) ## 1.0.0-alpha.4 (2022-01-03) ### Features - Switched to re2-wasm for pattern validation. ([467](https://github.com/awslabs/smithy-typescript/pull/467)) - Updated SDK dependencies. ### Bug Fixes - Fixed greedy label matching. ([474](https://github.com/awslabs/smithy-typescript/pull/474)) ## 1.0.0-alpha.3 (2021-11-03) ### Features - Switch to re2 for pattern validation ([451](https://github.com/awslabs/smithy-typescript/pull/451)) - Add a helper function for parsing Accept headers ([431](https://github.com/awslabs/smithy-typescript/pull/431)) - Update SDK dependencies ([439](https://github.com/awslabs/smithy-typescript/pull/439)) ### Bug Fixes - Fix query matching against list query values ([450](https://github.com/awslabs/smithy-typescript/pull/450)) ================================================ FILE: smithy-typescript-ssdk-libs/server-common/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: smithy-typescript-ssdk-libs/server-common/README.md ================================================ # smithy-typescript/server-common This library provides common interfaces and utilities needed for building a server sdk. ================================================ FILE: smithy-typescript-ssdk-libs/server-common/jest.config.js ================================================ const base = require("../../jest.config.base.js"); module.exports = { preset: "ts-jest", ...base, }; ================================================ FILE: smithy-typescript-ssdk-libs/server-common/package.json ================================================ { "name": "@aws-smithy/server-common", "version": "1.0.0-alpha.10", "description": "Base components for Smithy services", "main": "./dist/cjs/index.js", "module": "./dist/es/index.js", "types": "./dist/types/index.d.ts", "scripts": { "prepublishOnly": "yarn build", "pretest": "yarn build", "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "postbuild": "premove dist/types/ts3.4 && downlevel-dts dist/types dist/types/ts3.4", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "jest", "clean": "premove dist", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"" }, "repository": { "type": "git", "url": "git+https://github.com/smithy-lang/smithy-typescript.git", "directory": "smithy-typescript-libs/smithy-server-common" }, "author": "AWS Smithy Team", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "workspace:^", "@smithy/types": "workspace:^", "re2-wasm": "^1.0.2", "tslib": "^1.8.0" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "^0.7.0", "jest": "29.7.0", "premove": "4.0.0", "typescript": "~5.8.3" }, "files": [ "dist/cjs/**/*.js", "dist/es/**/*.js", "dist/types/**/*.d.ts", "!**/*.spec.*" ], "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.0": { "dist/types/*": [ "dist/types/ts3.4/*" ] } }, "bugs": { "url": "https://github.com/smithy-lang/smithy-typescript/issues" }, "homepage": "https://github.com/smithy-lang/smithy-typescript#readme", "publishConfig": { "directory": ".release/package" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/accept.spec.ts ================================================ import { acceptMatches } from "./accept"; describe("acceptMatches", () => { it.each([null, undefined, "*/*"])("always returns true for %s", (value) => { expect(acceptMatches(value, "text/plain")).toEqual(true); }); it("handles explicit matches", () => { expect(acceptMatches("text/plain", "text/plain")).toEqual(true); expect(acceptMatches("text/plain; q=5", "text/plain")).toEqual(true); }); it("handles wildcard subtypes", () => { expect(acceptMatches("text/*", "text/plain")).toEqual(true); expect(acceptMatches("text/*; q=5", "text/plain")).toEqual(true); }); it("handles multiple acceptable values", () => { expect(acceptMatches("application/json, text/plain; q=5", "text/plain")).toEqual(true); expect(acceptMatches("application/json, text/*; q=5", "text/plain")).toEqual(true); expect(acceptMatches("application/json, text/xml; q=5, */*", "text/plain")).toEqual(true); }); it.each(["application/*", "application/json", "application/*; q=5; text/xml"])( "does not match text/plain to %s", (value) => { expect(acceptMatches(value, "text/plain")).toEqual(false); } ); }); ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/accept.ts ================================================ /** * A function for matching the 'Accept' header to an explicit MIME type. * * @param acceptHeader the header as specified by the caller * @param responseContentType the content type that we expect to return * @return true if the specified content-type is acceptable given the Accept value */ export const acceptMatches = (acceptHeader: string | null | undefined, responseContentType: string): boolean => { if (acceptHeader === null || acceptHeader === undefined) { return true; } // see: https://datatracker.ietf.org/doc/html/rfc7231#section-5.3.2 // we only care if anything in Accept matches a content-type we want to respond with, // so we disregard all of the accept-params const acceptableContentTypes = acceptHeader.split(",").map((s) => s.split(";")[0].trim()); const responsePrimaryType = responseContentType.split("/")[0]; for (const type of acceptableContentTypes) { if (type === "*/*" || type === `${responsePrimaryType}/*` || type === responseContentType) { return true; } } return false; }; ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/errors.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ export class ServiceException extends Error { /** * Whether the client or server are at fault. */ readonly $fault: "client" | "server"; constructor(options: { name: string; $fault: "client" | "server"; message?: string }) { super(options.message); Object.setPrototypeOf(this, ServiceException.prototype); this.name = options.name; this.$fault = options.$fault; } } export type SmithyFrameworkException = | InternalFailureException | UnknownOperationException | SerializationException | UnsupportedMediaTypeException | NotAcceptableException; export const isFrameworkException = (error: any): error is SmithyFrameworkException => { if (!error.hasOwnProperty("$frameworkError")) { return false; } return error.$frameworkError; }; export class InternalFailureException { readonly name = "InternalFailure"; readonly $fault = "server"; readonly statusCode = 500; readonly $frameworkError = true; } export class UnknownOperationException { readonly name = "UnknownOperationException"; readonly $fault = "client"; readonly statusCode = 404; readonly $frameworkError = true; } export class SerializationException { readonly name = "SerializationException"; readonly $fault = "client"; readonly statusCode = 400; readonly $frameworkError = true; } export class UnsupportedMediaTypeException { readonly name = "UnsupportedMediaTypeException"; readonly $fault = "client"; readonly statusCode = 415; readonly $frameworkError = true; } export class NotAcceptableException { readonly name = "NotAcceptableException"; readonly $fault = "client"; readonly statusCode = 406; readonly $frameworkError = true; } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/httpbinding/index.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ export * from "./mux"; ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.spec.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { HttpRequest } from "@smithy/protocol-http"; import { HttpBindingMux, UriSpec } from "."; describe("simple matching", () => { const router = new HttpBindingMux< "Test", "A" | "LessSpecificA" | "Greedy" | "MiddleGreedy" | "Delete" | "QueryKeyOnly" >([ new UriSpec("GET", [{ type: "path_literal", value: "a" }, { type: "path" }, { type: "path" }], [], { service: "Test", operation: "A", }), new UriSpec("GET", [{ type: "path_literal", value: "a" }, { type: "path" }, { type: "greedy" }], [], { service: "Test", operation: "LessSpecificA", }), new UriSpec("GET", [{ type: "path_literal", value: "greedy" }, { type: "greedy" }], [], { service: "Test", operation: "Greedy", }), new UriSpec( "GET", [ { type: "path_literal", value: "mg" }, { type: "greedy" }, { type: "path_literal", value: "y" }, { type: "path_literal", value: "z" }, ], [], { service: "Test", operation: "MiddleGreedy" } ), new UriSpec( "DELETE", [], [ { type: "query_literal", key: "foo", value: "bar" }, { type: "query", key: "baz" }, ], { service: "Test", operation: "Delete" } ), new UriSpec("GET", [{ type: "path_literal", value: "query_key_only" }], [{ type: "query_literal", key: "foo" }], { service: "Test", operation: "QueryKeyOnly", }), ]); const matches: { [idx: string]: HttpRequest[] } = { "Test#LessSpecificA": [ new HttpRequest({ method: "GET", path: "/a/b/c/d" }), new HttpRequest({ method: "GET", path: "/a/b/c/d/e" }), ], "Test#A": [ new HttpRequest({ method: "GET", path: "/a/b/c" }), new HttpRequest({ method: "GET", path: "/a/b/c/" }), new HttpRequest({ method: "GET", path: "/a/b/c", query: { abc: "def" } }), new HttpRequest({ method: "GET", path: "/a/b/c", query: { abc: null } }), ], "Test#Greedy": [ new HttpRequest({ method: "GET", path: "/greedy/a/b/c/d" }), new HttpRequest({ method: "GET", path: "/greedy/a/b/c/d", query: { abc: "def" } }), ], "Test#MiddleGreedy": [ new HttpRequest({ method: "GET", path: "/mg/a/y/z" }), new HttpRequest({ method: "GET", path: "/mg/a/b/c/d/y/z", query: { abc: "def" } }), new HttpRequest({ method: "GET", path: "/mg/a/b/y/c/d/y/z", query: { abc: "def" } }), new HttpRequest({ method: "GET", path: "/mg/a/b/y/z/d/y/z", query: { abc: "def" } }), ], "Test#Delete": [ new HttpRequest({ method: "DELETE", path: "/", query: { foo: "bar", baz: "quux" } }), new HttpRequest({ method: "DELETE", path: "/", query: { foo: ["bar"], baz: "quux" } }), new HttpRequest({ method: "DELETE", path: "/", query: { foo: ["bar", "corge"], baz: "quux" } }), new HttpRequest({ method: "DELETE", path: "/", query: { foo: "bar", baz: "quux" } }), new HttpRequest({ method: "DELETE", path: "/", query: { foo: "bar", baz: null } }), new HttpRequest({ method: "DELETE", path: "", query: { foo: "bar", baz: ["quux", "grault"] } }), ], "Test#QueryKeyOnly": [ new HttpRequest({ method: "GET", path: "/query_key_only", query: { foo: "bar" } }), new HttpRequest({ method: "GET", path: "/query_key_only", query: { foo: null } }), new HttpRequest({ method: "GET", path: "/query_key_only", query: { foo: "" } }), // this is actually what /query_key_only?foo will look like behind APIGateway new HttpRequest({ method: "GET", path: "/query_key_only", query: { foo: [""] } }), ], }; const misses = [ new HttpRequest({ method: "POST", path: "/a/b/c" }), new HttpRequest({ method: "PUT", path: "/a/b/c" }), new HttpRequest({ method: "PATCH", path: "/a/b/c" }), new HttpRequest({ method: "OPTIONS", path: "/a/b/c" }), new HttpRequest({ method: "GET", path: "/a" }), new HttpRequest({ method: "GET", path: "/a/b" }), new HttpRequest({ method: "GET", path: "/greedy" }), new HttpRequest({ method: "GET", path: "/greedy/" }), new HttpRequest({ method: "GET", path: "/mg" }), new HttpRequest({ method: "GET", path: "/mg/q" }), new HttpRequest({ method: "GET", path: "/mg/z" }), new HttpRequest({ method: "GET", path: "/mg/y/z" }), new HttpRequest({ method: "GET", path: "/mg/a/z" }), new HttpRequest({ method: "GET", path: "/mg/a/y/z/a" }), new HttpRequest({ method: "GET", path: "/mg/a/y/a" }), new HttpRequest({ method: "GET", path: "/mg/a/b/z/c" }), new HttpRequest({ method: "DELETE", path: "/", query: { foo: "bar" } }), new HttpRequest({ method: "DELETE", path: "/", query: { baz: "quux" } }), new HttpRequest({ method: "DELETE", path: "/" }), ]; for (const key in matches) { const reqs = matches[key]; for (const req of reqs) { it(`should match ${JSON.stringify(req)} to ${key}`, () => { expect(router.match(req)).toEqual({ service: key.split("#")[0], operation: key.split("#")[1] }); }); } } for (const req of misses) { it(`should not match ${JSON.stringify(req)} to anything`, () => { expect(router.match(req)).toBeUndefined(); }); } }); ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import type { HttpRequest } from "@smithy/protocol-http"; import type { Mux, ServiceCoordinate } from ".."; export interface PathLiteralSegment { type: "path_literal"; value: string; } export interface PathLabelSegment { type: "path"; } export interface GreedySegment { type: "greedy"; } export interface QueryLiteralSegment { type: "query_literal"; key: string; value?: string; } export interface QuerySegment { type: "query"; key: string; } export class UriSpec { private readonly method: string; private readonly pathSegments: (PathLiteralSegment | PathLabelSegment | GreedySegment)[]; private readonly querySegments: (QueryLiteralSegment | QuerySegment)[]; readonly rank: number; readonly target: ServiceCoordinate; constructor( method: string, pathSegments: (PathLiteralSegment | PathLabelSegment | GreedySegment)[], querySegments: (QueryLiteralSegment | QuerySegment)[], target: ServiceCoordinate ) { this.method = method; this.pathSegments = pathSegments; this.querySegments = querySegments; this.rank = this.pathSegments.length + this.querySegments.length; this.target = target; } private matchesSegment( requestSegment: string, segment: PathLiteralSegment | PathLabelSegment | GreedySegment ): boolean { if (segment.type === "path_literal" && requestSegment !== segment.value) { return false; } return true; } match(req: HttpRequest): boolean { if (req.method !== this.method) { return false; } const requestPathSegments = req.path.split("/").filter((s) => s.length > 0); let requestPathIdx = 0; for (let i = 0; i < this.pathSegments.length; i++) { if (requestPathIdx === requestPathSegments.length) { // there are more pathSegments but we have reached the end of the requestPath return false; } const pathSegment = this.pathSegments[i]; if (pathSegment.type === "path_literal" && pathSegment.value !== requestPathSegments[requestPathIdx]) { return false; } if (pathSegment.type === "greedy") { // greedy labels match greedily, and a greedy label cannot be followed by another greedy label // so just consume as many segments as needed to leave an equal number of segments // at the end of the request path as we have segments in the pattern const remainingSegments = this.pathSegments.length - i - 1; const newRequestPathIdx = requestPathSegments.length - remainingSegments; if (requestPathIdx === newRequestPathIdx) { // greedy labels must consume at least one segment return false; } requestPathIdx = newRequestPathIdx; } else { requestPathIdx++; } } if (requestPathIdx < requestPathSegments.length) { // we reached the end of our defined path segments without reaching the end of the request path return false; } if (this.querySegments.length === 0) { return true; } if (!req.query) { return false; } for (const querySegment of this.querySegments) { if (!(querySegment.key in req.query)) { return false; } if (querySegment.type === "query_literal") { const input_query_value = req.query[querySegment.key]; if (Array.isArray(input_query_value)) { if (querySegment.value && !input_query_value.includes(querySegment.value)) { return false; } } else if (querySegment.value && querySegment.value !== input_query_value) { return false; } } } return true; } } export class HttpBindingMux implements Mux { private readonly specs: UriSpec[]; constructor(inputSpecs: UriSpec[]) { this.specs = inputSpecs.sort((s1, s2) => s2.rank - s1.rank); } match(req: HttpRequest): ServiceCoordinate | undefined { return this.specs.find((s) => s.match(req))?.target; } } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/index.ts ================================================ import type { HttpRequest, HttpResponse } from "@smithy/protocol-http"; import type { SerdeContext } from "@smithy/types"; import type { ServiceException } from "./errors"; /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ export * as httpbinding from "./httpbinding"; export * from "./accept"; export * from "./errors"; export * from "./validation"; export * from "./unique"; export type Operation = (input: I, context: Context) => Promise; export type OperationInput = T extends Operation ? I : never; export type OperationOutput = T extends Operation ? O : never; export interface OperationSerializer { serialize(input: OperationOutput, ctx: ServerSerdeContext): Promise; deserialize(input: HttpRequest, ctx: SerdeContext): Promise>; isOperationError(error: any): error is E; serializeError(error: E, ctx: ServerSerdeContext): Promise; } export interface ServiceHandler { handle(request: RequestType, context: Context): Promise; } export interface ServiceCoordinate { readonly service: S; readonly operation: O; } export interface Mux { match(req: HttpRequest): ServiceCoordinate | undefined; } export interface ServerSerdeContext extends Omit {} ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/unique.spec.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import * as util from "node:util"; import { findDuplicates, type Input } from "./unique"; describe("findDuplicates", () => { describe("finds duplicates in", () => { it("strings", () => { expect(findDuplicates(["a", "b", "c", "a", "b", "a"])).toEqual(["a", "b"]); expect(findDuplicates(["x", "y", "z", "a", "b", "c", "a", "b"])).toEqual(["a", "b"]); }); it("numbers", () => { expect(findDuplicates([1, 2, 3, 4, 1, 2])).toEqual([1, 2]); }); it("booleans", () => { expect(findDuplicates([true, false, true])).toEqual([true]); }); it("arrays", () => { expect( findDuplicates([ [5, 6], [2, 3], [1, 2], [3, 4], [1, 2], ]) ).toEqual([[1, 2]]); }); it("Dates", () => { expect(findDuplicates([new Date(1000), new Date(2000), new Date(1000)])).toEqual([new Date(1000)]); }); it("Blobs", () => { expect(findDuplicates([Uint8Array.of(1, 2, 3), Uint8Array.of(4, 5, 6), Uint8Array.of(4, 5, 6)])).toEqual([ Uint8Array.of(4, 5, 6), ]); }); it("nulls", () => { expect(findDuplicates([null, 1, null])).toEqual([null]); }); it("undefineds", () => { const arr: Array = [undefined, 1, undefined]; expect(findDuplicates(arr)).toEqual([undefined]); }); it("objects", () => { expect(findDuplicates([{ a: "b" }, { b: [1, 2, 3] }, { a: "b" }, { a: "b" }])).toEqual([{ a: "b" }]); expect(findDuplicates([{ a: "b" }, { b: 1, c: 2 }, { c: 2, b: 1 }])).toEqual([{ b: 1, c: 2 }]); }); it("deeply nested objects", () => { expect( findDuplicates([ { a: { b: { c: [1, { d: 2 }, [3]] } } }, 2, [3, 4], { b: "c" }, { a: { b: { c: [1, { d: 2 }, [3]] } } }, ]) ).toEqual([{ a: { b: { c: [1, { d: 2 }, [3]] } } }]); }); }); describe("correctly does not find duplicates in", () => { it("strings", () => { expect(findDuplicates(["a", "b", "c"])).toEqual([]); }); it("numbers", () => { expect(findDuplicates([1, 2, 3, 4])).toEqual([]); expect(findDuplicates([1, 2, "1", "2"])).toEqual([]); }); it("booleans", () => { expect(findDuplicates([true, false])).toEqual([]); expect(findDuplicates([true, false, "true", "false"])).toEqual([]); }); it("arrays", () => { expect( findDuplicates([ [1, 2], [2, 3], [3, 4], ]) ).toEqual([]); expect( findDuplicates([ [1, 2], ["1", "2"], ]) ).toEqual([]); }); it("objects", () => { expect(findDuplicates([{ a: "b" }, { b: [1, 2, 3] }])).toEqual([]); expect(findDuplicates([{ a: 1 }, { a: "1" }])).toEqual([]); }); it("Dates", () => { expect(findDuplicates([new Date(100), new Date(200), new Date(101)])).toEqual([]); }); it("blobs", () => { expect(findDuplicates([Uint8Array.of(1, 2, 3), Uint8Array.of(1, 2)])).toEqual([]); }); it("nulls", () => { expect(findDuplicates([null, 1])).toEqual([]); }); it("undefineds", () => { const arr: Array = [undefined, 1]; expect(findDuplicates(arr)).toEqual([]); }); }); // This is relatively slow and may be flaky if the input size is tuned to let it run reasonably fast it.skip("is faster than the naive implementation", () => { const input: Input[] = [true, false, 1, 2, 3, 4, 5, 6]; for (let i = 0; i < 10_000; i++) { input.push({ a: [1, 2, 3, i], b: { nested: [true] } }); } const uniqueStart = Date.now(); expect(findDuplicates(input)).toEqual([]); const uniqueEnd = Date.now(); const uniqueDuration = (uniqueEnd - uniqueStart) / 1000; console.log(`findDuplicates finished in ${uniqueDuration} seconds`); const naiveStart = Date.now(); expect(naivefindDuplicates(input)).toEqual([]); const naiveEnd = Date.now(); const naiveDuration = (naiveEnd - naiveStart) / 1000; console.log(`naivefindDuplicates finished in ${naiveDuration} seconds`); expect(naiveDuration).toBeGreaterThan(uniqueDuration); }); // This isn't even correct! It should be even slower, it just returns the first duplicate! function naivefindDuplicates(input: Array): Input | undefined { for (let i = 0; i < input.length - 1; i++) { for (let j = i + 1; j < input.length; j++) { if (util.isDeepStrictEqual(input[i], input[j])) { return [input[i]]; } } } return []; } }); ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/unique.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { createHash } from "node:crypto"; import * as util from "node:util"; /** * A shortcut for JSON and Smithy primitives, as well as documents and Smithy- * modeled structures composed of those primitives */ export type Input = { [key: string]: Input } | Array | Date | Uint8Array | string | number | boolean | null; /** * Returns an array of duplicated values in the input. This is equivalent to using * {@link util#isDeepStrictEqual} to compare every member of the input to all the * other members, but with an optimization to make the runtime complexity O(n) * instead of O(n^2). * * @param input an array of {@link Input} * @return an array containing one instance of every duplicated member of the input, * or an empty array if there are no duplicates */ export const findDuplicates = (input: Array): Array => { const potentialCollisions: { [hash: string]: { value: Input; alreadyFound: boolean }[] } = {}; const collisions: Array = []; for (const value of input) { const valueHash = hash(value); if (!potentialCollisions.hasOwnProperty(valueHash)) { potentialCollisions[valueHash] = [{ value: value, alreadyFound: false }]; } else { let duplicateFound = false; for (const potentialCollision of potentialCollisions[valueHash]) { if (util.isDeepStrictEqual(value, potentialCollision.value)) { duplicateFound = true; if (!potentialCollision.alreadyFound) { collisions.push(value); potentialCollision.alreadyFound = true; } } } if (!duplicateFound) { potentialCollisions[valueHash].push({ value: value, alreadyFound: false }); } } } return collisions; }; const hash = (input: Input): string => { return createHash("sha256").update(canonicalize(input)).digest("base64"); }; /** * Since node's hash functions operate on strings or buffers, we need a canonical format for * our objects in order to hash them correctly. This function turns them into string representations * where the types are encoded in order to avoid ambiguity, for instance, between the string "1" and * the number 1. This method sorts object keys lexicographically in order to maintain consistency. * * This doesn't just call JSON.stringify because we want to have firm control over the ordering of map * keys and the handling of blobs and dates * * @param input a JSON-like object * @return a canonical string representation */ const canonicalize = (input: Input): string => { if (input === undefined) { return "undefined()"; } if (input === null) { return "null()"; } if (typeof input === "string" || typeof input === "number" || typeof input === "boolean") { return `${typeof input}(${input.toString()})`; } if (Array.isArray(input)) { return "array(" + input.map((i) => canonicalize(i)).join(",") + ")"; } if (input instanceof Date) { return "date(" + input.getTime() + ")"; } if (input instanceof Uint8Array) { // hashing the blob just to avoid allocating another base64 copy of its data return "blob(" + createHash("sha256").update(input).digest("base64") + ")"; } const contents: Array = []; for (const key of Object.keys(input).slice().sort()) { contents.push("key(" + key + ")->value(" + canonicalize(input[key]) + ")"); } return "map(" + contents.join(",") + ")"; }; ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/validation/index.spec.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { RequiredValidationFailure, generateValidationMessage, type EnumValidationFailure, type IntegerEnumValidationFailure, type LengthValidationFailure, type PatternValidationFailure, type RangeValidationFailure, type UniqueItemsValidationFailure, } from "./index"; describe("message formatting", () => { it("does not return very large inputs", () => { const failure: PatternValidationFailure = { constraintType: "pattern", constraintValues: "^[a-c]$", failureValue: "z".repeat(1024), path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-c]$" ); }); it("omits null values", () => { const failure: PatternValidationFailure = { constraintType: "pattern", constraintValues: "^[a-c]$", failureValue: null, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-c]$" ); }); it("formats required failures", () => { const failure = new RequiredValidationFailure("/test"); expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must not be null" ); }); it("formats enum failures", () => { const failure: EnumValidationFailure = { constraintType: "enum", constraintValues: ["banana", "apple"], failureValue: "pear", path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must satisfy enum value set: [apple, banana]" ); }); it("formats integer enum failures", () => { const failure: IntegerEnumValidationFailure = { constraintType: "integerEnum", constraintValues: [1, 2], failureValue: 3, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must satisfy enum value set: [1, 2]" ); }); describe("formats length failures", () => { it("with only min values", () => { const failure: LengthValidationFailure = { constraintType: "length", constraintValues: [7, undefined], failureValue: 3, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value with length 3 at '/test' failed to satisfy constraint: Member must have length greater than or equal to 7" ); }); it("with only max values", () => { const failure: LengthValidationFailure = { constraintType: "length", constraintValues: [undefined, 2], failureValue: 3, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value with length 3 at '/test' failed to satisfy constraint: Member must have length less than or equal to 2" ); }); it("with min and max values", () => { const failure: LengthValidationFailure = { constraintType: "length", constraintValues: [3, 7], failureValue: 2, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value with length 2 at '/test' failed to satisfy constraint: Member must have length between 3 and 7, inclusive" ); }); }); it("formats pattern failures", () => { const failure: PatternValidationFailure = { constraintType: "pattern", constraintValues: "^[a-c]$", failureValue: "xyz", path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must satisfy regular expression pattern: ^[a-c]$" ); }); describe("formats range failures", () => { it("with only min values", () => { const failure: RangeValidationFailure = { constraintType: "range", constraintValues: [7, undefined], failureValue: 3, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must be greater than or equal to 7" ); }); it("with only max values", () => { const failure: RangeValidationFailure = { constraintType: "range", constraintValues: [undefined, 2], failureValue: 3, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must be less than or equal to 2" ); }); it("with min and max values", () => { const failure: RangeValidationFailure = { constraintType: "range", constraintValues: [3, 7], failureValue: 2, path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must be between 3 and 7, inclusive" ); }); it("with unique items", () => { const failure: UniqueItemsValidationFailure = { constraintType: "uniqueItems", failureValue: [5, 9], path: "/test", }; expect(generateValidationMessage(failure)).toEqual( "Value at '/test' failed to satisfy constraint: Member must have unique values" ); }); }); }); ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/validation/index.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import type { ServiceException } from "../errors"; export * from "./validators"; interface StandardValidationFailure { path: string; constraintType: string; constraintValues: ArrayLike; failureValue: FailureType | null; } export interface EnumValidationFailure extends StandardValidationFailure { constraintType: "enum"; constraintValues: string[]; } export interface IntegerEnumValidationFailure extends StandardValidationFailure { constraintType: "integerEnum"; constraintValues: number[]; } export interface LengthValidationFailure extends StandardValidationFailure { constraintType: "length"; constraintValues: [number, number] | [undefined, number] | [number, undefined]; } export interface PatternValidationFailure { path: string; constraintType: "pattern"; constraintValues: string; failureValue: string | null; } export interface RangeValidationFailure extends StandardValidationFailure { constraintType: "range"; constraintValues: [number, number] | [undefined, number] | [number, undefined]; } export class RequiredValidationFailure { path: string; constraintType = "required" as const; constructor(path: string) { this.path = path; } } export interface UniqueItemsValidationFailure { path: string; constraintType: "uniqueItems"; failureValue: Array | null; } export type ValidationFailure = | EnumValidationFailure | IntegerEnumValidationFailure | LengthValidationFailure | PatternValidationFailure | RangeValidationFailure | RequiredValidationFailure | UniqueItemsValidationFailure; export interface ValidationContext { operation: O; } export type ValidationCustomizer = ( context: ValidationContext, failures: ValidationFailure[] ) => ServiceException | undefined; export const generateValidationSummary = (failures: readonly ValidationFailure[]): string => { const failingPaths = new Set(failures.map((failure) => failure.path)); let message = `${failures.length} validation error${failures.length > 1 ? "s" : ""} `; if (failures.length > 1) { message += `at ${failingPaths.size} ` + `path${failingPaths.size > 1 ? "s" : ""} `; } message += "detected. "; if (failures.length > 1) { message += "First failure: "; } return message + generateValidationMessage(failures[0]); }; export const generateValidationMessage = (failure: ValidationFailure): string => { let prefix = "Value"; let suffix: string; switch (failure.constraintType) { case "required": { suffix = "must not be null"; break; } case "enum": { suffix = `must satisfy enum value set: [${failure.constraintValues .sort((a, b) => a.localeCompare(b)) .join(", ")}]`; break; } case "integerEnum": { suffix = `must satisfy enum value set: [${failure.constraintValues.sort((a, b) => a - b).join(", ")}]`; break; } case "length": { if (failure.failureValue !== null) { prefix = prefix + " with length " + failure.failureValue; } const min = failure.constraintValues[0]; const max = failure.constraintValues[1]; if (min === undefined) { suffix = `must have length less than or equal to ${max}`; } else if (max === undefined) { suffix = `must have length greater than or equal to ${min}`; } else { suffix = `must have length between ${min} and ${max}, inclusive`; } break; } case "pattern": { suffix = `must satisfy regular expression pattern: ${failure.constraintValues}`; break; } case "range": { const min = failure.constraintValues[0]; const max = failure.constraintValues[1]; if (min === undefined) { suffix = `must be less than or equal to ${max}`; } else if (max === undefined) { suffix = `must be greater than or equal to ${min}`; } else { suffix = `must be between ${min} and ${max}, inclusive`; } break; } case "uniqueItems": { suffix = "must have unique values"; } } return `${prefix} at '${failure.path}' failed to satisfy constraint: Member ${suffix}`; }; ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/validation/validators.spec.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { CompositeValidator, EnumValidator, IntegerEnumValidator, LengthValidator, PatternValidator, RangeValidator, SensitiveConstraintValidator, UniqueItemsValidator, type SingleConstraintValidator, } from "./validators"; describe("sensitive validation", () => { function sensitize(validator: SingleConstraintValidator, input: T): V { const failure = new SensitiveConstraintValidator(new CompositeValidator([validator])).validate(input, "")[0]; return failure as unknown as V; } describe("strips the failure value from the resultant validation failure", () => { it("with enums", () => { expect(sensitize(new EnumValidator(["apple", "banana", "orange"], ["apple"]), "pear").failureValue).toBeNull(); }); it("with integer enums", () => { expect(sensitize(new IntegerEnumValidator([1, 2, 3]), 0).failureValue).toBeNull(); }); it("with length", () => { expect(sensitize(new LengthValidator(2, 4), "pears").failureValue).toBeNull(); }); it("with ranges", () => { expect(sensitize(new RangeValidator(2, 4), 7).failureValue).toBeNull(); }); it("with patterns", () => { expect(sensitize(new PatternValidator("^[a-c]+$"), "defg").failureValue).toBeNull(); }); }); }); describe("enum validation", () => { const enumValidator = new EnumValidator(["apple", "banana", "orange"], ["apple", "banana"]); it("does not fail when the enum value is found", () => { expect(enumValidator.validate("apple", "fruit")).toBeNull(); }); it("fails when the enum value is not found", () => { expect(enumValidator.validate("kiwi", "fruit")).toEqual({ constraintType: "enum", constraintValues: ["apple", "banana"], path: "fruit", failureValue: "kiwi", }); }); }); describe("integer enum validation", () => { const integerEnumValidator = new IntegerEnumValidator([1, 2, 3]); it("does not fail when the enum value is found", () => { expect(integerEnumValidator.validate(1, "test")).toBeNull(); }); it("fails when the enum value is not found", () => { expect(integerEnumValidator.validate(0, "test")).toEqual({ constraintType: "integerEnum", constraintValues: [1, 2, 3], path: "test", failureValue: 0, }); }); }); describe("length validation", () => { const threeLengthThings = ["foo", { a: 1, b: 2, c: 3 }, ["a", "b", "c"], new Uint8Array([13, 37, 42])]; for (const value of threeLengthThings) { describe(`for ${JSON.stringify(value)}`, () => { it("should succeed with min = 1", () => { expect(new LengthValidator(1).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should succeed with min = 3", () => { expect(new LengthValidator(3).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should succeed with max = 100", () => { expect(new LengthValidator(undefined, 100).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should succeed with max = 3", () => { expect(new LengthValidator(undefined, 3).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should succeed with min = 3 and max = 3", () => { expect(new LengthValidator(3, 3).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should succeed with min = 1 and max = 128", () => { expect(new LengthValidator(1, 128).validate(value, "aThreeLengthThing")).toBeNull(); }); it("should fail with min = 4", () => { expect(new LengthValidator(4).validate(value, "aThreeLengthThing")).toEqual({ constraintType: "length", constraintValues: [4, undefined], path: "aThreeLengthThing", failureValue: 3, }); }); it("should fail with max = 2", () => { expect(new LengthValidator(undefined, 2).validate(value, "aThreeLengthThing")).toEqual({ constraintType: "length", constraintValues: [undefined, 2], path: "aThreeLengthThing", failureValue: 3, }); }); it("should fail with min = 1 and max = 2", () => { expect(new LengthValidator(1, 2).validate(value, "aThreeLengthThing")).toEqual({ constraintType: "length", constraintValues: [1, 2], path: "aThreeLengthThing", failureValue: 3, }); }); }); } it("properly assesses string length", () => { expect(new LengthValidator(3, 3).validate("👍👍👍", "threeEmojis")).toBeNull(); }); }); describe("pattern validation", () => { it("does not match the entire string", () => { const validator = new PatternValidator("\\w+"); expect(validator.validate("hello", "aField")).toBeNull(); expect(validator.validate("!hello!", "aField")).toBeNull(); }); it("can be anchored", () => { const validator = new PatternValidator("^\\w+$"); expect(validator.validate("hello", "aField")).toBeNull(); expect(validator.validate("!hello!", "aField")).toEqual({ constraintType: "pattern", constraintValues: "^\\w+$", failureValue: "!hello!", path: "aField", }); }); it("supports character class expressions", () => { const validator = new PatternValidator("^\\p{L}+$"); expect(validator.validate("hello", "aField")).toBeNull(); expect(validator.validate("!hello!", "aField")).toEqual({ constraintType: "pattern", constraintValues: "^\\p{L}+$", failureValue: "!hello!", path: "aField", }); }); it("is not vulnerable to ReDoS", () => { const validator = new PatternValidator("^([0-9]+)+$"); expect( validator.validate( "000000000000000000000000000000000000000000000000000000000000000000000000000000000000!", "aField" ) ).toEqual({ constraintType: "pattern", constraintValues: "^([0-9]+)+$", failureValue: "000000000000000000000000000000000000000000000000000000000000000000000000000000000000!", path: "aField", }); }); }); describe("range validation", () => { it("supports min-only constraints", () => { const validator = new RangeValidator(3); expect(validator.validate(3, "aField")).toBeNull(); expect(validator.validate(4, "aField")).toBeNull(); expect(validator.validate(1, "aField")).toEqual({ constraintType: "range", constraintValues: [3, undefined], failureValue: 1, path: "aField", }); }); it("supports max-only constraints", () => { const validator = new RangeValidator(undefined, 3); expect(validator.validate(3, "aField")).toBeNull(); expect(validator.validate(1, "aField")).toBeNull(); expect(validator.validate(4, "aField")).toEqual({ constraintType: "range", constraintValues: [undefined, 3], failureValue: 4, path: "aField", }); }); it("supports min-max constraints", () => { const validator = new RangeValidator(3, 5); expect(validator.validate(3, "aField")).toBeNull(); expect(validator.validate(4, "aField")).toBeNull(); expect(validator.validate(5, "aField")).toBeNull(); expect(validator.validate(1, "aField")).toEqual({ constraintType: "range", constraintValues: [3, 5], failureValue: 1, path: "aField", }); expect(validator.validate(6, "aField")).toEqual({ constraintType: "range", constraintValues: [3, 5], failureValue: 6, path: "aField", }); }); }); describe("uniqueItems", () => { const validator = new UniqueItemsValidator(); describe("supports strings", () => { expect(validator.validate(["a", "b", "c"], "aField")).toBeNull(); expect(validator.validate(["a", "a", "c", "a", "b", "b"], "aField")).toEqual({ constraintType: "uniqueItems", failureValue: ["a", "b"], path: "aField", }); }); describe("supports numbers", () => { expect(validator.validate([1, 2, 3], "aField")).toBeNull(); expect(validator.validate([1, 1, 3, 1, 1, 2.5, 2.5], "aField")).toEqual({ constraintType: "uniqueItems", failureValue: [1, 2.5], path: "aField", }); }); describe("supports booleans, I guess", () => { expect(validator.validate([true, false], "aField")).toBeNull(); expect(validator.validate([true, false, true], "aField")).toEqual({ constraintType: "uniqueItems", failureValue: [true], path: "aField", }); }); describe("supports objects", () => { expect(validator.validate([{ a: 1 }, { b: 2 }], "aField")).toBeNull(); expect(validator.validate([{ a: 1 }, { b: 2 }, { a: 1 }], "aField")).toEqual({ constraintType: "uniqueItems", failureValue: [{ a: 1 }], path: "aField", }); }); describe("supports undefined values inside objects in lists", () => { expect(() => validator.validate([{ a: [{ a: undefined }] }], "aField")).not.toThrowError(); expect(validator.validate([{ a: [{ a: null }] }, { a: [{ a: undefined }] }], "aField")).toBeNull(); expect(validator.validate([{ a: [{ a: undefined }] }, { a: [{ a: undefined }] }], "aField")).toEqual({ constraintType: "uniqueItems", failureValue: [{ a: [{ a: undefined }] }], path: "aField", }); }); }); ================================================ FILE: smithy-typescript-ssdk-libs/server-common/src/validation/validators.ts ================================================ /* * Copyright 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ import { RE2 } from "re2-wasm"; import { RequiredValidationFailure, type EnumValidationFailure, type IntegerEnumValidationFailure, type LengthValidationFailure, type PatternValidationFailure, type RangeValidationFailure, type UniqueItemsValidationFailure, type ValidationFailure, } from "."; import { findDuplicates } from "../unique"; export class CompositeValidator implements MultiConstraintValidator { private readonly validators: SingleConstraintValidator[]; constructor(validators: SingleConstraintValidator[]) { this.validators = validators; } validate(input: T | undefined | null, path: string): ValidationFailure[] { const retVal: ValidationFailure[] = []; for (const v of this.validators) { const failure = v.validate(input, path); if (failure) { retVal.push(failure); } } return retVal; } } export class CompositeStructureValidator implements MultiConstraintValidator { private readonly referenceValidator: MultiConstraintValidator; private readonly structureValidator: (input: T, path: string) => ValidationFailure[]; constructor( referenceValidator: MultiConstraintValidator, structureValidator: (input: T, path: string) => ValidationFailure[] ) { this.referenceValidator = referenceValidator; this.structureValidator = structureValidator; } validate(input: T | undefined | null, path: string): ValidationFailure[] { const retVal: ValidationFailure[] = []; retVal.push(...this.referenceValidator.validate(input, path)); if (input !== null && input !== undefined) { retVal.push(...this.structureValidator(input, path)); } return retVal; } } export class CompositeCollectionValidator implements MultiConstraintValidator> { private readonly referenceValidator: MultiConstraintValidator>; private readonly memberValidator: MultiConstraintValidator; constructor(referenceValidator: MultiConstraintValidator>, memberValidator: MultiConstraintValidator) { this.referenceValidator = referenceValidator; this.memberValidator = memberValidator; } validate(input: Iterable | undefined | null, path: string): ValidationFailure[] { const retVal: ValidationFailure[] = []; retVal.push(...this.referenceValidator.validate(input, path)); if (input !== null && input !== undefined) { let i = 0; for (const member of input) { retVal.push(...this.memberValidator.validate(member, `${path}/${i}`)); i += 1; } } return retVal; } } export class CompositeMapValidator implements MultiConstraintValidator> { private readonly referenceValidator: MultiConstraintValidator>; private readonly keyValidator: MultiConstraintValidator; private readonly valueValidator: MultiConstraintValidator; constructor( referenceValidator: MultiConstraintValidator>, keyValidator: MultiConstraintValidator, valueValidator: MultiConstraintValidator ) { this.referenceValidator = referenceValidator; this.keyValidator = keyValidator; this.valueValidator = valueValidator; } validate(input: Record | undefined | null, path: string): ValidationFailure[] { const retVal: ValidationFailure[] = []; retVal.push(...this.referenceValidator.validate(input, path)); if (input !== null && input !== undefined) { Object.keys(input).forEach((key) => { const value = input[key]; retVal.push(...this.keyValidator.validate(key, path)); retVal.push(...this.valueValidator.validate(value, `${path}/${key}`)); }); } return retVal; } } export class NoOpValidator implements MultiConstraintValidator { validate(): ValidationFailure[] { return []; } } export class SensitiveConstraintValidator implements MultiConstraintValidator { private readonly delegate: MultiConstraintValidator; constructor(delegate: MultiConstraintValidator) { this.delegate = delegate; } validate(input: T, path: string): ValidationFailure[] { return this.delegate.validate(input, path).map((f) => { return { ...f, failureValue: null, }; }); } } export interface MultiConstraintValidator { validate(input: T | undefined | null, path: string): ValidationFailure[]; } export interface SingleConstraintValidator { validate(input: T | undefined | null, path: string): F | null; } export class EnumValidator implements SingleConstraintValidator { private readonly allowedValues: string[]; private readonly nonInternalValues: string[]; constructor(allowedValues: readonly string[], nonInternalValues: readonly string[]) { this.allowedValues = allowedValues.slice(); this.nonInternalValues = nonInternalValues.slice(); } validate(input: string | undefined | null, path: string): EnumValidationFailure | null { if (input === null || input === undefined) { return null; } if (this.allowedValues.indexOf(input) < 0) { return { constraintType: "enum", constraintValues: this.nonInternalValues.slice(), path: path, failureValue: input, }; } return null; } } export class IntegerEnumValidator implements SingleConstraintValidator { private readonly allowedValues: number[]; constructor(allowedValues: readonly number[]) { this.allowedValues = allowedValues.slice(); } validate(input: number | undefined | null, path: string): IntegerEnumValidationFailure | null { if (input === null || input === undefined) { return null; } if (this.allowedValues.indexOf(input) < 0) { return { constraintType: "integerEnum", constraintValues: this.allowedValues.slice(), path: path, failureValue: input, }; } return null; } } type LengthCheckable = string | { length: number } | Record; export class LengthValidator implements SingleConstraintValidator { private readonly min?: number; private readonly max?: number; constructor(min?: number, max?: number) { if (min === undefined && max === undefined) { throw new Error("Length constraints must have at least a min or a max."); } this.min = min; this.max = max; } validate(input: LengthCheckable | undefined | null, path: string): LengthValidationFailure | null { if (input === null || input === undefined) { return null; } let length: number; if (typeof input === "string") { length = [...input].length; // string length is defined by the number of code points } else if (LengthValidator.hasLength(input)) { length = input.length; } else { length = Object.keys(input).length; } if ((this.min !== undefined && length < this.min) || (this.max !== undefined && length > this.max)) { return { constraintType: "length", constraintValues: this.min === undefined ? [undefined, this.max!] : this.max === undefined ? [this.min!, undefined] : [this.min!, this.max!], path: path, failureValue: length, }; } return null; } private static hasLength(obj: any): obj is { length: number } { return obj.hasOwnProperty("length"); } } export class RangeValidator implements SingleConstraintValidator { private readonly min?: number; private readonly max?: number; constructor(min?: number, max?: number) { if (min === undefined && max === undefined) { throw new Error("Range constraints must have at least a min or a max."); } this.min = min; this.max = max; } validate(input: number | undefined | null, path: string): RangeValidationFailure | null { if (input === null || input === undefined) { return null; } if ((this.min !== undefined && input < this.min) || (this.max !== undefined && input > this.max)) { return { constraintType: "range", constraintValues: this.min === undefined ? [undefined, this.max!] : this.max === undefined ? [this.min!, undefined] : [this.min!, this.max!], path: path, failureValue: input, }; } return null; } } export class PatternValidator implements SingleConstraintValidator { private readonly inputPattern: string; private readonly pattern: RE2; constructor(pattern: string) { this.inputPattern = pattern; this.pattern = new RE2(pattern, "u"); } validate(input: string | undefined | null, path: string): PatternValidationFailure | null { if (input === null || input === undefined) { return null; } if (!this.pattern.test(input)) { return { constraintType: "pattern", constraintValues: this.inputPattern, failureValue: input, path: path, }; } return null; } } export class RequiredValidator implements SingleConstraintValidator { validate(input: any, path: string): RequiredValidationFailure | null { if (input === null || input === undefined) { return new RequiredValidationFailure(path); } return null; } } export class UniqueItemsValidator implements SingleConstraintValidator, UniqueItemsValidationFailure> { validate(input: Array | undefined | null, path: string): UniqueItemsValidationFailure | null { if (input === null || input === undefined) { return null; } const repeats = findDuplicates(input); if (repeats.length > 0) { return { constraintType: "uniqueItems", path: path, failureValue: [...repeats].sort(), }; } return null; } } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist/cjs" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "module": "ESNext", "outDir": "dist/es" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/tsconfig.json ================================================ { "extends": "../../tsconfig.json", "compilerOptions": { "stripInternal": true, "removeComments": true, "rootDir": "src", "baseUrl": "." }, "include": ["src/"] } ================================================ FILE: smithy-typescript-ssdk-libs/server-common/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist/types", "emitDeclarationOnly": true }, "exclude": ["test/**/*", "dist/types/**/*"] } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/.gitignore ================================================ /node_modules/ /build/ /coverage/ /docs/ *.tsbuildinfo *.tgz *.log package-lock.json src/*.js dist/ types/ ================================================ FILE: smithy-typescript-ssdk-libs/server-node/.npmignore ================================================ /coverage/ tsconfig.test.json *.tsbuildinfo jest.config.js *.spec.js *.spec.ts *.spec.d.ts *.spec.js.map *.mock.js *.mock.d.ts *.mock.js.map *.fixture.js *.fixture.d.ts *.fixture.js.map ================================================ FILE: smithy-typescript-ssdk-libs/server-node/CHANGELOG.md ================================================ # server-node Changelog ## 1.0.0-alpha.10 (2023-04-18) ## 1.0.0-alpha.9 (2023-03-16) ### Features Module created. ### Other - Upgraded to Yarn 3. ([#705](https://github.com/awslabs/smithy-typescript/pull/705)) ================================================ FILE: smithy-typescript-ssdk-libs/server-node/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================ FILE: smithy-typescript-ssdk-libs/server-node/README.md ================================================ # smithy-typescript/server-node This package provides glue code to enable using a server sdk with NodeJS. ## Usage ### Example ```typescript import { IncomingMessage, ServerResponse, createServer } from "http"; import { convertEvent, convertResponse } from "@aws-smithy/server-node"; import { SayHelloInput, SayHelloOutput, GreetingService as __GreetingService, getGreetingServiceHandler, } from "@greeting-service/service-greeting"; import { HttpRequest } from "@smithy/protocol-http"; class GreetingService implements __GreetingService { SayHello(input: SayHelloInput, request: HttpRequest): SayHelloOutput { return { greeting: `Hello ${input.name}! How is ${input.city}?`, }; } } const serviceHandler = getGreetingServiceHandler(new GreetingService()); const server = createServer(async function ( req: IncomingMessage, res: ServerResponse & { req: IncomingMessage } ) { // Convert NodeJS's http request to an HttpRequest. const httpRequest = convertRequest(req); // Call the service handler, which will route the request to the GreetingService // implementation and then serialize the response to an HttpResponse. const httpResponse = await serviceHandler.handle(httpRequest); // Write the HttpResponse to NodeJS http's response expected format. return writeResponse(httpResponse, res); }); server.listen(3000); console.error("Listening on port 3000"); ``` ================================================ FILE: smithy-typescript-ssdk-libs/server-node/jest.config.js ================================================ const base = require("../../jest.config.base.js"); module.exports = { preset: "ts-jest", ...base, }; ================================================ FILE: smithy-typescript-ssdk-libs/server-node/package.json ================================================ { "name": "@aws-smithy/server-node", "version": "1.0.0-alpha.10", "description": "Base components for Smithy services running on NodeJS", "main": "./dist/cjs/index.js", "module": "./dist/es/index.js", "types": "./dist/types/index.d.ts", "scripts": { "prepublishOnly": "yarn build", "pretest": "yarn build", "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types'", "build:cjs": "tsc -p tsconfig.cjs.json", "build:es": "tsc -p tsconfig.es.json", "build:types": "tsc -p tsconfig.types.json", "postbuild": "premove dist/types/ts3.4 && downlevel-dts dist/types dist/types/ts3.4", "stage-release": "premove .release && yarn pack && mkdir ./.release && tar zxvf ./package.tgz --directory ./.release && rm ./package.tgz", "test": "jest --passWithNoTests", "clean": "premove dist", "lint": "eslint -c ../../.eslintrc.js \"src/**/*.ts\"", "format": "prettier --config ../../prettier.config.js --ignore-path ../../.prettierignore --write \"**/*.{ts,md,json}\"" }, "repository": { "type": "git", "url": "git+https://github.com/smithy-lang/smithy-typescript.git", "directory": "smithy-typescript-ssdk-libs/server-node" }, "author": "AWS Smithy Team", "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "workspace:^", "@smithy/types": "workspace:^", "tslib": "^1.8.0" }, "devDependencies": { "@types/node": "^18.11.9", "concurrently": "7.0.0", "downlevel-dts": "^0.7.0", "jest": "29.7.0", "premove": "4.0.0", "typescript": "~5.8.3" }, "files": [ "dist/cjs/**/*.js", "dist/es/**/*.js", "dist/types/**/*.d.ts", "!**/*.spec.*" ], "engines": { "node": ">=18.0.0" }, "typesVersions": { "<4.0": { "dist/types/*": [ "dist/types/ts3.4/*" ] } }, "bugs": { "url": "https://github.com/smithy-lang/smithy-typescript/issues" }, "homepage": "https://github.com/smithy-lang/smithy-typescript#readme", "publishConfig": { "directory": ".release/package" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/src/index.spec.ts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import { mkdtemp } from "node:fs/promises"; import { createServer, request, type IncomingMessage, type RequestOptions, type Server, type ServerResponse, } from "node:http"; import * as os from "node:os"; import * as path from "node:path"; import type { Readable } from "node:stream"; import { convertRequest } from "./node"; let socketPath: string; let promiseResolve: ([req, res]: [IncomingMessage, ServerResponse]) => void; let server: Server; beforeAll(async () => { server = createServer(function (req, res) { promiseResolve([req, res]); resToEnd = res; }); // Create a temporary named pipe where to run the server and obtain a request socketPath = path.join(await mkdtemp(path.join(os.tmpdir(), "named-pipe-for-test-")), "server"); // TODO Add support to Windows by using '\\\\?\\pipe' // See: https://nodejs.org/api/net.html#identifying-paths-for-ipc-connections server.listen(socketPath); }); let resToEnd: ServerResponse; function getRequest(options: RequestOptions & { body?: string }): Promise<[IncomingMessage, ServerResponse]> { return new Promise((resolve) => { promiseResolve = resolve; request({ socketPath, ...options, }).end(Buffer.from(options.body || [])); }); } afterAll(() => { server?.close(); }); async function streamToString(stream: Readable) { const chunks = []; for await (const chunk of stream) { chunks.push(Buffer.from(chunk)); } return Buffer.concat(chunks).toString("utf-8"); } describe("convertRequest", () => { afterEach(async () => { resToEnd?.end(); }); it("converts a simple GET / correctly", async () => { const [req] = await getRequest({ host: "example.com", path: "/", }); const convertedReq = convertRequest(req); expect(convertedReq.hostname).toEqual("example.com"); expect(convertedReq.method).toEqual("GET"); expect(convertedReq.path).toEqual("/"); expect(convertedReq.protocol).toEqual("http:"); expect(convertedReq.query).toEqual({}); expect(convertedReq.headers).toMatchObject({ host: "example.com", // From LTS 18 -> 20, the connection header defaults from "close" to "keep-alive", so don't test explicitly }); expect(await streamToString(convertedReq.body)).toEqual(""); }); it("converts a POST with query string correctly", async () => { const [req] = await getRequest({ method: "POST", host: "example.com", path: "/some/endpoint?q=hello&a=world", body: "hello", }); const convertedReq = convertRequest(req); expect(convertedReq.hostname).toEqual("example.com"); expect(convertedReq.method).toEqual("POST"); expect(convertedReq.path).toEqual("/some/endpoint"); expect(convertedReq.protocol).toEqual("http:"); expect(convertedReq.query).toEqual({ q: "hello", a: "world", }); expect(convertedReq.headers).toMatchObject({ host: "example.com", "content-length": "5", // From LTS 18 -> 20, the connection header defaults from "close" to "keep-alive", so don't test explicitly }); expect(await streamToString(convertedReq.body)).toEqual("hello"); }); it("converts OPTIONS CORS requests", async () => { const [req] = await getRequest({ method: "OPTIONS", host: "example.com", path: "/some/resource", headers: { "Access-Control-Request-Method": "DELETE", "Access-Control-Request-Headers": "origin, x-requested-with", Origin: "https://example.com", }, }); const convertedReq = convertRequest(req); expect(convertedReq.hostname).toEqual("example.com"); expect(convertedReq.method).toEqual("OPTIONS"); expect(convertedReq.path).toEqual("/some/resource"); expect(convertedReq.protocol).toEqual("http:"); expect(convertedReq.query).toEqual({}); expect(convertedReq.headers).toMatchObject({ "access-control-request-headers": "origin, x-requested-with", "access-control-request-method": "DELETE", origin: "https://example.com", host: "example.com", // From LTS 18 -> 20, the connection header defaults from "close" to "keep-alive", so don't test explicitly }); expect(await streamToString(convertedReq.body)).toEqual(""); }); }); // TODO Implement writeResponse tests // describe("writeResponse", () => { // it("converts a simple GET / correctly", async () => {}); // }); ================================================ FILE: smithy-typescript-ssdk-libs/server-node/src/index.ts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ export * from "./node"; ================================================ FILE: smithy-typescript-ssdk-libs/server-node/src/node.ts ================================================ /* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import type { IncomingHttpHeaders, IncomingMessage, ServerResponse } from "node:http"; import { URL, type URLSearchParams } from "node:url"; import { HttpRequest, type HeaderBag, type HttpResponse } from "@smithy/protocol-http"; import type { QueryParameterBag } from "@smithy/types"; function convertHeaders(headers: IncomingHttpHeaders): HeaderBag { // TODO make this proper return Object.fromEntries(Object.entries(headers).filter((x) => x)) as HeaderBag; } function convertQueryString(qs: URLSearchParams): QueryParameterBag { return Object.fromEntries(qs.entries()); } export function convertRequest(req: IncomingMessage): HttpRequest { const url = new URL(req.url || "", `http://${req.headers.host}`); return new HttpRequest({ hostname: url.hostname, method: req.method, path: url.pathname, protocol: url.protocol, query: convertQueryString(url.searchParams), headers: convertHeaders(req.headers), body: req, }); } export function writeResponse(httpResponse: HttpResponse, res: ServerResponse) { if (!httpResponse) { res.statusCode = 500; res.write("Error processing request"); res.end(); return; } res.statusCode = httpResponse.statusCode; Object.entries(httpResponse.headers).forEach(([key, value]) => res.setHeader(key, value)); res.write(httpResponse.body); res.end(); } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/tsconfig.cjs.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "outDir": "dist/cjs" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/tsconfig.es.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "module": "ESNext", "outDir": "dist/es" } } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/tsconfig.json ================================================ { "extends": "../../tsconfig.json", "compilerOptions": { "stripInternal": true, "removeComments": true, "rootDir": "src", "baseUrl": ".", "lib": ["es2019.object", "dom"] }, "include": ["src/"] } ================================================ FILE: smithy-typescript-ssdk-libs/server-node/tsconfig.types.json ================================================ { "extends": "./tsconfig", "compilerOptions": { "removeComments": false, "declaration": true, "declarationDir": "dist/types", "emitDeclarationOnly": true }, "exclude": ["test/**/*", "dist/types/**/*"] } ================================================ FILE: testbed/bundlers/.gitignore ================================================ node_modules/ dist-vite/ dist-esbuild/ dist-webpack/ dist-rollup/ package-lock.json ================================================ FILE: testbed/bundlers/Makefile ================================================ .PHONY: run run: npm install node ./runner/run.mjs ================================================ FILE: testbed/bundlers/applications/NormalizedSchema.ts ================================================ export { NormalizedSchema } from "@smithy/core/schema"; ================================================ FILE: testbed/bundlers/applications/abstract-protocols.ts ================================================ export { HttpBindingProtocol, RpcProtocol } from "@smithy/core/protocols"; ================================================ FILE: testbed/bundlers/applications/cbor-client-aggregate.ts ================================================ export { RpcV2Protocol } from "@smithy/smithy-rpcv2-cbor-schema"; ================================================ FILE: testbed/bundlers/applications/cbor-client.ts ================================================ export { RpcV2ProtocolClient, FractionalSecondsCommand } from "@smithy/smithy-rpcv2-cbor-schema"; ================================================ FILE: testbed/bundlers/applications/cbor-protocol.ts ================================================ export { SmithyRpcV2CborProtocol } from "@smithy/core/cbor"; ================================================ FILE: testbed/bundlers/applications/inactive/.gitkeep ================================================ ================================================ FILE: testbed/bundlers/package.json ================================================ { "type": "module", "dependencies": {}, "devDependencies": { "acorn": "^8.14.0", "acorn-walk": "^8.3.0", "esbuild": "^0.25.0", "ts-loader": "^9.5.0", "typescript": "~5.8.0", "vite": "^6.0.0", "webpack": "^5.90.0" } } ================================================ FILE: testbed/bundlers/runner/bundler-output-analysis.cjs ================================================ const { parse } = require("acorn"); const walk = require("acorn-walk"); const MODULE = "module"; const BUFFER = "Buffer"; const TYPEOF = "typeof"; const LOGICAL_AND = "&&"; const NOT = "!"; const IDENTIFIER = "Identifier"; const UNARY_EXPRESSION = "UnaryExpression"; const BINARY_EXPRESSION = "BinaryExpression"; const LOGICAL_EXPRESSION = "LogicalExpression"; const MEMBER_EXPRESSION = "MemberExpression"; const OBJECT_PATTERN = "ObjectPattern"; const ARRAY_PATTERN = "ArrayPattern"; const REST_ELEMENT = "RestElement"; const ASSIGNMENT_PATTERN = "AssignmentPattern"; const FUNCTION_DECLARATION = "FunctionDeclaration"; const FUNCTION_EXPRESSION = "FunctionExpression"; const ARROW_FUNCTION_EXPRESSION = "ArrowFunctionExpression"; /** * Detects unguarded references to the global `Buffer` identifier in bundled code. * * Guarded means the reference is inside a `typeof Buffer` check, a variable * derived from such a check (e.g. `USE_BUFFER`), or a polyfill assignment scope. * * @param {string} code - bundle source text. * @returns {{ line: number, column: number }[]} unguarded global Buffer references. * @internal */ function findGlobalBufferRefs(code) { const ast = parse(code, { ecmaVersion: 2022, sourceType: MODULE, allowHashBang: true, locations: true, }); const polyfillRanges = collectPolyfillRanges(ast); const guardedRanges = collectGuardedRanges(ast); const typeofArgPositions = collectTypeofArgPositions(ast); // Scope-aware walk: track local declarations to distinguish global Buffer. const scopeStack = [new Set()]; const globalRefs = []; function isDeclared(name) { for (let i = scopeStack.length - 1; i >= 0; --i) { if (scopeStack[i].has(name)) { return true; } } return false; } function isGuarded(node) { for (let i = 0; i < guardedRanges.length; ++i) { const r = guardedRanges[i]; if (node.start >= r.start && node.end <= r.end) { return true; } } return false; } function isInPolyfill(node) { for (let i = 0; i < polyfillRanges.length; ++i) { const r = polyfillRanges[i]; if (node.start >= r.start && node.end <= r.end) { return true; } } return false; } walk.recursive(ast, null, { FunctionDeclaration(node, state, c) { if (node.id) { scopeStack[scopeStack.length - 1].add(node.id.name); } const scope = new Set(); scopeStack.push(scope); for (let i = 0; i < node.params.length; ++i) { extractBindings(node.params[i], scope); } c(node.body, state); scopeStack.pop(); }, FunctionExpression(node, state, c) { const scope = new Set(); scopeStack.push(scope); if (node.id) { scope.add(node.id.name); } for (let i = 0; i < node.params.length; ++i) { extractBindings(node.params[i], scope); } c(node.body, state); scopeStack.pop(); }, ArrowFunctionExpression(node, state, c) { const scope = new Set(); scopeStack.push(scope); for (let i = 0; i < node.params.length; ++i) { extractBindings(node.params[i], scope); } c(node.body, state); scopeStack.pop(); }, BlockStatement(node, state, c) { scopeStack.push(new Set()); for (let i = 0; i < node.body.length; ++i) { c(node.body[i], state); } scopeStack.pop(); }, ForStatement(node, state, c) { scopeStack.push(new Set()); if (node.init) { c(node.init, state); } if (node.test) { c(node.test, state); } if (node.update) { c(node.update, state); } c(node.body, state); scopeStack.pop(); }, VariableDeclaration(node, state, c) { const scope = scopeStack[scopeStack.length - 1]; for (let i = 0; i < node.declarations.length; ++i) { const decl = node.declarations[i]; extractBindings(decl.id, scope); if (decl.init) { c(decl.init, state); } } }, CatchClause(node, state, c) { const scope = new Set(); scopeStack.push(scope); if (node.param) { extractBindings(node.param, scope); } c(node.body, state); scopeStack.pop(); }, Identifier(node) { if ( node.name === BUFFER && !isDeclared(BUFFER) && !typeofArgPositions.has(node.start) && !isGuarded(node) && !isInPolyfill(node) ) { globalRefs.push({ line: node.loc.start.line, column: node.loc.start.column }); } }, MemberExpression(node, state, c) { c(node.object, state); if (node.computed) { c(node.property, state); } }, }); return globalRefs; } /** * Collects ranges of functions that assign to Buffer (polyfill code). */ function collectPolyfillRanges(ast) { const ranges = []; walk.ancestor(ast, { AssignmentExpression(node, ancestors) { if (isBufferAssignTarget(node.left)) { const fn = findEnclosingFunction(ancestors); if (fn) { ranges.push({ start: fn.start, end: fn.end }); } } }, VariableDeclarator(node, ancestors) { if (node.id.type === IDENTIFIER && node.id.name === BUFFER) { const fn = findEnclosingFunction(ancestors); if (fn) { ranges.push({ start: fn.start, end: fn.end }); } } }, }); return ranges; } /** * Collects AST ranges protected by typeof Buffer checks or derived variables. */ function collectGuardedRanges(ast) { // Variables assigned from typeof Buffer expressions (e.g. USE_BUFFER). const typeofBufferVars = new Set(); walk.simple(ast, { VariableDeclarator(node) { if (node.id.type === IDENTIFIER && node.init && containsTypeofBuffer(node.init)) { typeofBufferVars.add(node.id.name); } }, }); function isTypeofBufferVar(node) { if (node.type === IDENTIFIER && typeofBufferVars.has(node.name)) { return true; } if (node.type === UNARY_EXPRESSION && node.operator === NOT && isTypeofBufferVar(node.argument)) { return true; } return false; } const ranges = []; walk.simple(ast, { ConditionalExpression(node) { if (containsTypeofBuffer(node.test) || isTypeofBufferVar(node.test)) { ranges.push(node); } }, IfStatement(node) { if (containsTypeofBuffer(node.test) || isTypeofBufferVar(node.test)) { ranges.push(node); } }, LogicalExpression(node) { if (node.operator === LOGICAL_AND && (containsTypeofBuffer(node.left) || isTypeofBufferVar(node.left))) { ranges.push(node); } }, }); return ranges; } /** * Collects start positions of Buffer identifiers used as typeof operands. * These are not actual references to the Buffer value. */ function collectTypeofArgPositions(ast) { const positions = new Set(); walk.simple(ast, { UnaryExpression(node) { if (node.operator === TYPEOF && node.argument.type === IDENTIFIER && node.argument.name === BUFFER) { positions.add(node.argument.start); } }, }); return positions; } function extractBindings(pattern, scope) { if (!pattern) { return; } switch (pattern.type) { case IDENTIFIER: scope.add(pattern.name); break; case OBJECT_PATTERN: for (let i = 0; i < pattern.properties.length; ++i) { extractBindings(pattern.properties[i].value || pattern.properties[i].argument, scope); } break; case ARRAY_PATTERN: for (let i = 0; i < pattern.elements.length; ++i) { if (pattern.elements[i]) { extractBindings(pattern.elements[i], scope); } } break; case REST_ELEMENT: extractBindings(pattern.argument, scope); break; case ASSIGNMENT_PATTERN: extractBindings(pattern.left, scope); break; } } function isBufferAssignTarget(node) { if (node.type === IDENTIFIER && node.name === BUFFER) { return true; } if (node.type === MEMBER_EXPRESSION) { if (node.object.type === IDENTIFIER && node.object.name === BUFFER) { return true; } if (node.property.type === IDENTIFIER && node.property.name === BUFFER) { return true; } } return false; } function containsTypeofBuffer(node) { if ( node.type === UNARY_EXPRESSION && node.operator === TYPEOF && node.argument.type === IDENTIFIER && node.argument.name === BUFFER ) { return true; } if (node.type === BINARY_EXPRESSION || node.type === LOGICAL_EXPRESSION) { return containsTypeofBuffer(node.left) || containsTypeofBuffer(node.right); } return false; } function findEnclosingFunction(ancestors) { for (let i = ancestors.length - 1; i >= 0; --i) { const t = ancestors[i].type; if (t === FUNCTION_DECLARATION || t === FUNCTION_EXPRESSION || t === ARROW_FUNCTION_EXPRESSION) { return ancestors[i]; } } return null; } module.exports = { findGlobalBufferRefs }; ================================================ FILE: testbed/bundlers/runner/run.mjs ================================================ import { execSync } from "node:child_process"; import fs from "node:fs"; import { createRequire } from "node:module"; import path from "node:path"; import { fileURLToPath } from "node:url"; const require = createRequire(import.meta.url); const webpack = require("webpack"); const { build: viteBuild } = await import("vite"); const esbuild = require("esbuild"); const { findGlobalBufferRefs } = require("./bundler-output-analysis.cjs"); const __dirname = path.dirname(fileURLToPath(import.meta.url)); const root = path.join(__dirname, ".."); const applicationFolder = path.join(root, "applications"); const distDir = path.join(root, "dist"); // Clean dist fs.rmSync(path.join(root, "dist-vite"), { recursive: true, force: true }); fs.rmSync(path.join(root, "dist-esbuild"), { recursive: true, force: true }); fs.rmSync(path.join(root, "dist-webpack"), { recursive: true, force: true }); fs.rmSync(path.join(root, "dist-rollup"), { recursive: true, force: true }); fs.mkdirSync(path.join(root, "dist-vite"), { recursive: true }); fs.mkdirSync(path.join(root, "dist-esbuild"), { recursive: true }); fs.mkdirSync(path.join(root, "dist-webpack"), { recursive: true }); const apps = fs.readdirSync(applicationFolder).filter((f) => f.endsWith(".ts") || f.endsWith(".mjs")); let failed = false; for (const app of apps) { const entry = path.join(applicationFolder, app); const baseName = app.replace(/\.[^.]+$/, ""); console.log(`\n${"=".repeat(60)}`); console.log(`Application: ${app}`); console.log(`${"=".repeat(60)}`); // --- Vite (UMD, no minify, readable) --- const viteOutDir = path.join(root, "dist-vite"); const viteOutFile = path.join(viteOutDir, `${baseName}.umd.cjs`); try { await viteBuild({ logLevel: "silent", resolve: { conditions: ["browser", "module", "import"] }, build: { outDir: viteOutDir, lib: { entry, name: "dist", fileName: baseName, formats: ["umd"] }, minify: false, sourcemap: false, emptyOutDir: false, rollupOptions: { output: { inlineDynamicImports: true }, treeshake: true, }, }, }); console.log(`\n Vite: ${byteSize(fs.statSync(viteOutFile).size)}`); validateBundle("vite", viteOutFile); } catch (e) { console.error(` Vite: ❌ FAIL: build error: ${e.message}`); failed = true; } // --- esbuild (ESM, no minify, readable) --- const esbuildOutFile = path.join(root, "dist-esbuild", `${baseName}.mjs`); try { await esbuild.build({ entryPoints: [entry], platform: "browser", bundle: true, minify: false, treeShaking: true, mainFields: ["browser", "module", "main"], conditions: ["browser", "import"], outfile: esbuildOutFile, format: "esm", target: "es2022", }); console.log(` esbuild: ${byteSize(fs.statSync(esbuildOutFile).size)}`); validateBundle("esbuild", esbuildOutFile); } catch (e) { console.error(` esbuild: ❌ FAIL: build error: ${e.message}`); failed = true; } // --- Webpack (UMD, no minify, readable) --- const webpackOutFile = path.join(root, "dist-webpack", `${baseName}.js`); try { await new Promise((resolve, reject) => { webpack( { mode: "development", devtool: false, entry, target: "web", resolve: { extensions: [".ts", ".js", ".mjs"], conditionNames: ["browser", "import", "module", "default"], aliasFields: ["browser"], }, output: { path: path.dirname(webpackOutFile), filename: path.basename(webpackOutFile), library: { type: "umd", name: "dist" }, }, optimization: { minimize: false, usedExports: true }, module: { rules: [ { test: /\.ts$/, use: { loader: "ts-loader", options: { transpileOnly: true } }, exclude: /node_modules/, }, ], }, }, (err, stats) => { if (err) return reject(err); if (stats.hasErrors()) return reject(new Error(stats.toString({ errors: true }))); resolve(); } ); }); console.log(` Webpack: ${byteSize(fs.statSync(webpackOutFile).size)}`); validateBundle("webpack", webpackOutFile); } catch (e) { console.error(` Webpack: ❌ FAIL: build error: ${e.message.split("\n").slice(0, 3).join("\n")}`); failed = true; } } console.log(`\n${"=".repeat(60)}`); if (failed) { console.error("❌ Bundler check FAILED"); process.exit(1); } else { console.log("✅ Bundler check PASSED"); } function validateBundle(bundler, filePath) { const content = fs.readFileSync(filePath, "utf-8"); // Check for node: protocol references const nodeImports = content.match(/["']node:[^"']+["']/g) || []; const nodeRequires = content.match(/require\(["']node:[^"']+["']\)/g) || []; const allNodeRefs = [...new Set([...nodeImports, ...nodeRequires])]; if (allNodeRefs.length > 0) { console.error(` ${bundler}: ❌ FAIL: node: protocol references: ${allNodeRefs.join(", ")}`); failed = true; } else { console.log(` ${bundler}: ✅ PASS: No node: protocol references`); } // Check for node-only code marker const nodeOnlyMatches = content.match(/\w+\s*=\s*Symbol\.for\(["']node-only["']\)/g) || []; if (nodeOnlyMatches.length > 3) { console.error(` ${bundler}: ❌ FAIL: ${nodeOnlyMatches.length}/3 Symbol.for("node-only") occurrence(s) — node-only code not fully tree-shaken`); failed = true; } else if (nodeOnlyMatches.length > 0) { console.log(` ${bundler}: ⚠️ ${nodeOnlyMatches.length}/3 Symbol.for("node-only") occurrence(s) — node-only code not fully tree-shaken`); } // AST-based global Buffer check const globalBufferRefs = findGlobalBufferRefs(content); if (globalBufferRefs.length > 0) { console.error(` ${bundler}: ❌ FAIL: ${globalBufferRefs.length} unguarded global Buffer reference(s)`); for (const ref of globalBufferRefs.slice(0, 3)) { const line = content.split("\n")[ref.line - 1]?.trim().slice(0, 120); console.error(` L${ref.line}: ${line}`); } if (globalBufferRefs.length > 3) console.error(` ... and ${globalBufferRefs.length - 3} more`); failed = true; } else { console.log(` ${bundler}: ✅ PASS: No unguarded global Buffer references`); } } function byteSize(num) { if (num > 1024 ** 2) return ((((num / 1024 ** 2) * 1000) | 0) / 1000).toLocaleString() + " MB"; if (num > 1024) return ((num / 1024) | 0).toLocaleString() + " KB"; return num.toLocaleString() + " B"; } ================================================ FILE: tsconfig.cjs.json ================================================ { "extends": "./tsconfig.json", "compilerOptions": { "importHelpers": true, "module": "commonjs", "noEmitHelpers": false, "target": "es2022", "noCheck": true } } ================================================ FILE: tsconfig.es.json ================================================ { "extends": "./tsconfig.json", "compilerOptions": { "importHelpers": true, "module": "ESNext", "moduleResolution": "bundler", "noEmitHelpers": false, "target": "es2022", "noCheck": true } } ================================================ FILE: tsconfig.json ================================================ { "compilerOptions": { "baseUrl": ".", "downlevelIteration": true, "esModuleInterop": true, "incremental": true, "lib": ["es2015", "dom"], "module": "commonjs", "moduleResolution": "node", "noFallthroughCasesInSwitch": true, "paths": { "@aws-smithy/*": ["smithy-typescript-ssdk-libs/*/src"], "@smithy/*": ["packages/*/src"] }, "preserveConstEnums": true, "removeComments": true, "resolveJsonModule": true, "target": "es5", "useUnknownInCatchVariables": false, "experimentalDecorators": true, "jsx": "react", "jsxFactory": "JSX.createElement", "jsxFragmentFactory": "JSX.Fragment" }, "include": ["packages/", "smithy-typescript-ssdk-libs/"], "exclude": ["node_modules/", "**/*.spec.ts", "vitest.*"] } ================================================ FILE: tsconfig.test.json ================================================ { "compilerOptions": { "baseUrl": ".", "noEmit": true, "noCheck": false, "skipLibCheck": true }, "extends": "./tsconfig.types.json", "include": ["packages/**/*.spec.ts", "private/**/*.spec.ts"], "exclude": [ "node_modules/", "node_modules", "vitest.*.ts" ] } ================================================ FILE: tsconfig.types.json ================================================ { "extends": "./tsconfig.json", "compilerOptions": { "declaration": true, "emitDeclarationOnly": true, "removeComments": false, "strict": true } } ================================================ FILE: turbo.json ================================================ { "$schema": "https://turborepo.org/schema.json", "tasks": { "build": { "dependsOn": ["^build"], "inputs": ["src/**/*", "package.json"], "outputs": ["dist-types/**", "dist-cjs/**", "dist-es/**", "dist"] }, "test": { "dependsOn": ["build", "^build"], "cache": false }, "test:integration": { "dependsOn": ["build", "^build"], "cache": false }, "lint": { "outputs": [] }, "format": { "outputs": [] }, "clean": { "cache": false }, "extract:docs": { "dependsOn": ["build"], "cache": false }, "stage-release": { "dependsOn": ["build"] } } } ================================================ FILE: vitest.config.browser.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["node_modules"], include: ["{packages,private}/**/*.browser.spec.ts"], environment: "happy-dom", }, }); ================================================ FILE: vitest.config.integ.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: ["node_modules", "**/*.{e2e,browser}.spec.ts"], include: ["{packages,private}/**/*.integ.spec.ts"], environment: "node", }, }); ================================================ FILE: vitest.config.mts ================================================ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { exclude: [ "node_modules", "**/*.{integ,e2e,browser}.spec.ts", "smithy-typescript-ssdk-libs", "packages/types", "packages/util-defaults-mode-browser", ], include: ["packages/**/*.spec.ts", "private/**/*.spec.ts"], environment: "node", globals: true, }, });

Note that the auto detection is heuristics-based and does not guarantee 100% accuracy. STANDARD mode will be used if the execution environment cannot be determined. The auto detection might query EC2 Instance Metadata service, which might introduce latency. Therefore we recommend choosing an explicit defaults_mode instead if startup latency is critical to your application