diff --git a/packages/core/src/submodules/account-id-endpoint/AccountIdEndpointModeConfigResolver.ts b/packages/core/src/submodules/account-id-endpoint/AccountIdEndpointModeConfigResolver.ts index b9166c184c39e..e07c3dd3e4f05 100644 --- a/packages/core/src/submodules/account-id-endpoint/AccountIdEndpointModeConfigResolver.ts +++ b/packages/core/src/submodules/account-id-endpoint/AccountIdEndpointModeConfigResolver.ts @@ -1,4 +1,4 @@ -import { Provider } from "@smithy/types"; +import type { Provider } from "@smithy/types"; import { normalizeProvider } from "@smithy/util-middleware"; import { diff --git a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.ts b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.ts index 097a06e6ecfe0..ba3ba9e30186a 100644 --- a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.ts +++ b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4ASigner.ts @@ -1,5 +1,5 @@ import { HttpRequest } from "@smithy/protocol-http"; -import { AwsCredentialIdentity, HttpRequest as IHttpRequest } from "@smithy/types"; +import type { AwsCredentialIdentity, HttpRequest as IHttpRequest } from "@smithy/types"; import { getSkewCorrectedDate } from "../utils"; import { AwsSdkSigV4Signer, validateSigningProperties } from "./AwsSdkSigV4Signer"; diff --git a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.ts b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.ts index acda615969c51..eb11b5a952f37 100644 --- a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.ts +++ b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/AwsSdkSigV4Signer.ts @@ -1,6 +1,6 @@ import { HttpRequest } from "@smithy/protocol-http"; import { ServiceException } from "@smithy/smithy-client"; -import { +import type { AuthScheme, AwsCredentialIdentity, HandlerExecutionContext, diff --git a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.ts b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.ts index ab7eee8424c96..0e27328bd914b 100644 --- a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.ts +++ b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4AConfig.ts @@ -1,7 +1,7 @@ import { normalizeProvider } from "@smithy/core"; import { LoadedConfigSelectors } from "@smithy/node-config-provider"; import { ProviderError } from "@smithy/property-provider"; -import { Profile, Provider } from "@smithy/types"; +import type { Profile, Provider } from "@smithy/types"; /** * @public diff --git a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.spec.ts b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.spec.ts index 0075c41684c55..0d59d1a109bd9 100644 --- a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.spec.ts +++ b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.spec.ts @@ -1,4 +1,4 @@ -import { AwsCredentialIdentityProvider, IdentityProvider } from "@smithy/types"; +import type { AwsCredentialIdentityProvider } from "@smithy/types"; import { describe, expect, test as it, vi } from "vitest"; import { resolveAwsSdkSigV4Config } from "./resolveAwsSdkSigV4Config"; diff --git a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts index 34536efe0932c..8e4b89c4eb0cb 100644 --- a/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts +++ b/packages/core/src/submodules/httpAuthSchemes/aws_sdk/resolveAwsSdkSigV4Config.ts @@ -7,7 +7,7 @@ import { normalizeProvider, } from "@smithy/core"; import { SignatureV4, SignatureV4CryptoInit, SignatureV4Init } from "@smithy/signature-v4"; -import { +import type { AuthScheme, AwsCredentialIdentity, AwsCredentialIdentityProvider, diff --git a/packages/core/src/submodules/protocols/ConfigurableSerdeContext.ts b/packages/core/src/submodules/protocols/ConfigurableSerdeContext.ts index af2ba0fc84a1d..dd0febd6910d1 100644 --- a/packages/core/src/submodules/protocols/ConfigurableSerdeContext.ts +++ b/packages/core/src/submodules/protocols/ConfigurableSerdeContext.ts @@ -1,4 +1,4 @@ -import { ConfigurableSerdeContext, SerdeFunctions } from "@smithy/types"; +import type { ConfigurableSerdeContext, SerdeFunctions } from "@smithy/types"; /** * @internal diff --git a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts index 646806059cbdb..fe6f83976e41e 100644 --- a/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/cbor/AwsSmithyRpcV2CborProtocol.spec.ts @@ -1,7 +1,8 @@ import { cbor } from "@smithy/core/cbor"; -import { op, SCHEMA } from "@smithy/core/schema"; +import { op } from "@smithy/core/schema"; import { error as registerError } from "@smithy/core/schema"; import { HttpResponse } from "@smithy/protocol-http"; +import type { NumericSchema, StringSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { AwsSmithyRpcV2CborProtocol } from "./AwsSmithyRpcV2CborProtocol"; @@ -20,7 +21,7 @@ describe(AwsSmithyRpcV2CborProtocol.name, () => { "MyQueryError", { error: "client" }, ["Message", "Prop2"], - [SCHEMA.STRING, SCHEMA.NUMERIC], + [0 satisfies StringSchema, 1 satisfies NumericSchema], MyQueryError ); diff --git a/packages/core/src/submodules/protocols/json/AwsJson1_0Protocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsJson1_0Protocol.spec.ts index 16d7c227bba55..ae9e63ee67d75 100644 --- a/packages/core/src/submodules/protocols/json/AwsJson1_0Protocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsJson1_0Protocol.spec.ts @@ -1,4 +1,12 @@ -import { map, op, SCHEMA, sim, struct } from "@smithy/core/schema"; +import { map, op, sim, struct } from "@smithy/core/schema"; +import type { + BlobSchema, + BooleanSchema, + DocumentSchema, + NumericSchema, + StringSchema, + TimestampDefaultSchema, +} from "@smithy/types"; import { toBase64 } from "@smithy/util-base64"; import { toUtf8 } from "@smithy/util-utf8"; import { describe, expect, test as it } from "vitest"; @@ -19,7 +27,13 @@ describe(AwsJson1_0Protocol.name, () => { "MyStruct", 0, [...Object.keys(json)], - [SCHEMA.STRING, SCHEMA.NUMERIC, SCHEMA.BOOLEAN, SCHEMA.BLOB, SCHEMA.TIMESTAMP_DEFAULT] + [ + 0 satisfies StringSchema, + 1 satisfies NumericSchema, + 2 satisfies BooleanSchema, + 21 satisfies BlobSchema, + 4 satisfies TimestampDefaultSchema, + ] ); const serdeContext = { base64Encoder: toBase64, @@ -85,18 +99,18 @@ describe(AwsJson1_0Protocol.name, () => { {}, ["header", "query", "headerMap", "payload"], [ - sim("ns", "MyHeader", SCHEMA.STRING, { httpHeader: "header", jsonName: "MyHeader" }), - sim("ns", "MyQuery", SCHEMA.STRING, { httpQuery: "query" }), + sim("ns", "MyHeader", 0 satisfies StringSchema, { httpHeader: "header", jsonName: "MyHeader" }), + sim("ns", "MyQuery", 0 satisfies StringSchema, { httpQuery: "query" }), map( "ns", "HeaderMap", { httpPrefixHeaders: "", }, - SCHEMA.STRING, - SCHEMA.NUMERIC + 0 satisfies StringSchema, + 1 satisfies NumericSchema ), - sim("ns", "MyPayload", SCHEMA.DOCUMENT, { httpPayload: 1 }), + sim("ns", "MyPayload", 15 satisfies DocumentSchema, { httpPayload: 1 }), ] ); const operationSchema = op("ns", "MyOperation", {}, schema, "unit"); diff --git a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts index 3be2a02d54720..5c62d58b2e8e9 100644 --- a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.spec.ts @@ -1,5 +1,6 @@ -import { error as registerError, op, SCHEMA } from "@smithy/core/schema"; +import { error as registerError, op } from "@smithy/core/schema"; import { HttpResponse } from "@smithy/protocol-http"; +import type { NumericSchema, StringSchema, TimestampEpochSecondsSchema } from "@smithy/types"; import { fromUtf8 } from "@smithy/util-utf8"; import { describe, expect, test as it } from "vitest"; @@ -25,7 +26,7 @@ describe(AwsJsonRpcProtocol.name, () => { expect(codec.settings).toEqual({ jsonName: false, timestampFormat: { - default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, + default: 7 satisfies TimestampEpochSecondsSchema, useTrait: true, }, }); @@ -39,7 +40,7 @@ describe(AwsJsonRpcProtocol.name, () => { "MyQueryError", { error: "client" }, ["Message", "Prop2"], - [SCHEMA.STRING, SCHEMA.NUMERIC], + [0 satisfies StringSchema, 1 satisfies NumericSchema], MyQueryError ); diff --git a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts index cfbb4b16d8360..5f3c140026b89 100644 --- a/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts +++ b/packages/core/src/submodules/protocols/json/AwsJsonRpcProtocol.ts @@ -1,5 +1,5 @@ import { RpcProtocol } from "@smithy/core/protocols"; -import { deref, NormalizedSchema, SCHEMA, TypeRegistry } from "@smithy/core/schema"; +import { deref, NormalizedSchema, TypeRegistry } from "@smithy/core/schema"; import type { EndpointBearer, HandlerExecutionContext, @@ -10,6 +10,7 @@ import type { SerdeFunctions, ShapeDeserializer, ShapeSerializer, + TimestampEpochSecondsSchema, } from "@smithy/types"; import { ProtocolLib } from "../ProtocolLib"; @@ -43,7 +44,7 @@ export abstract class AwsJsonRpcProtocol extends RpcProtocol { this.codec = new JsonCodec({ timestampFormat: { useTrait: true, - default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, + default: 7 as const satisfies TimestampEpochSecondsSchema, }, jsonName: false, }); diff --git a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts index ead21b9da5d79..47d5084f4d45e 100644 --- a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts +++ b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.spec.ts @@ -1,5 +1,16 @@ -import { op, SCHEMA, sim, struct } from "@smithy/core/schema"; +import { op, sim, struct } from "@smithy/core/schema"; import { HttpResponse } from "@smithy/protocol-http"; +import type { + BlobSchema, + BooleanSchema, + MapSchemaModifier, + NumericSchema, + StringSchema, + TimestampDateTimeSchema, + TimestampDefaultSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { toBase64 } from "@smithy/util-base64"; import { toUtf8 } from "@smithy/util-utf8"; import { describe, expect, test as it } from "vitest"; @@ -20,7 +31,13 @@ describe(AwsRestJsonProtocol.name, () => { "MyStruct", 0, [...Object.keys(json)], - [SCHEMA.STRING, SCHEMA.NUMERIC, SCHEMA.BOOLEAN, SCHEMA.BLOB, SCHEMA.TIMESTAMP_DEFAULT] + [ + 0 satisfies StringSchema, + 1 satisfies NumericSchema, + 2 satisfies BooleanSchema, + 21 satisfies BlobSchema, + 4 satisfies TimestampDefaultSchema, + ] ); const serdeContext = { base64Encoder: toBase64, @@ -87,10 +104,10 @@ describe(AwsRestJsonProtocol.name, () => { {}, ["header", "query", "headerMap", "payload"], [ - [SCHEMA.STRING, { httpHeader: "header" }], - [SCHEMA.STRING, { httpQuery: "query" }], + [0 satisfies StringSchema, { httpHeader: "header" }], + [0 satisfies StringSchema, { httpQuery: "query" }], [ - SCHEMA.MAP_MODIFIER | SCHEMA.NUMERIC, + (128 satisfies MapSchemaModifier) | (1 satisfies NumericSchema), { httpPrefixHeaders: "", }, @@ -102,8 +119,8 @@ describe(AwsRestJsonProtocol.name, () => { 0, ["a", "b"], [ - [SCHEMA.STRING, 0], - [SCHEMA.STRING, { jsonName: "JSON_NAME" }], + [0 satisfies StringSchema, 0], + [0 satisfies StringSchema, { jsonName: "JSON_NAME" }], ] ), { httpPayload: 1 }, @@ -116,10 +133,10 @@ describe(AwsRestJsonProtocol.name, () => { {}, ["header", "code", "headerMap", "payload"], [ - [SCHEMA.STRING, { httpHeader: "header" }], - [SCHEMA.NUMERIC, { httpResponseCode: 1 }], + [0 satisfies StringSchema, { httpHeader: "header" }], + [1 satisfies NumericSchema, { httpResponseCode: 1 }], [ - SCHEMA.MAP_MODIFIER | SCHEMA.NUMERIC, + (128 satisfies MapSchemaModifier) | (1 satisfies NumericSchema), { httpPrefixHeaders: "x-", }, @@ -131,8 +148,8 @@ describe(AwsRestJsonProtocol.name, () => { { httpPayload: 1 }, ["a", "b"], [ - [SCHEMA.STRING, 0], - [SCHEMA.STRING, { jsonName: "JSON_NAME" }], + [0 satisfies StringSchema, 0], + [0 satisfies StringSchema, { jsonName: "JSON_NAME" }], ] ), { httpPayload: 1 }, @@ -230,18 +247,21 @@ describe(AwsRestJsonProtocol.name, () => { "payloadDefaultDate", ], [ - [SCHEMA.TIMESTAMP_DEFAULT, { httpHeader: "header-default-date" }], - [SCHEMA.TIMESTAMP_DATE_TIME, { httpHeader: "header-member-trait-date" }], - [SCHEMA.TIMESTAMP_HTTP_DATE, { httpHeader: "header-http-date" }], - [SCHEMA.TIMESTAMP_EPOCH_SECONDS, { httpHeader: "header-epoch-seconds" }], + [4 satisfies TimestampDefaultSchema, { httpHeader: "header-default-date" }], + [5 satisfies TimestampDateTimeSchema, { httpHeader: "header-member-trait-date" }], + [6 satisfies TimestampHttpDateSchema, { httpHeader: "header-http-date" }], + [7 satisfies TimestampEpochSecondsSchema, { httpHeader: "header-epoch-seconds" }], [ - sim("ns", "", SCHEMA.TIMESTAMP_EPOCH_SECONDS, 0), + sim("ns", "", 7 satisfies TimestampEpochSecondsSchema, 0), { httpHeader: "header-target-trait-date", }, ], - [SCHEMA.TIMESTAMP_DEFAULT, { httpQuery: "query-default-date" }], - [struct("ns", "date", 0, ["payloadDefaultDate"], [SCHEMA.TIMESTAMP_DEFAULT]), { httpPayload: 1 }], + [4 satisfies TimestampDefaultSchema, { httpQuery: "query-default-date" }], + [ + struct("ns", "date", 0, ["payloadDefaultDate"], [4 satisfies TimestampDefaultSchema]), + { httpPayload: 1 }, + ], ] ), "unit" diff --git a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts index 3b1882e6247c8..1891c21c30a6b 100644 --- a/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts +++ b/packages/core/src/submodules/protocols/json/AwsRestJsonProtocol.ts @@ -3,7 +3,7 @@ import { HttpInterceptingShapeDeserializer, HttpInterceptingShapeSerializer, } from "@smithy/core/protocols"; -import { NormalizedSchema, SCHEMA, TypeRegistry } from "@smithy/core/schema"; +import { NormalizedSchema, TypeRegistry } from "@smithy/core/schema"; import type { EndpointBearer, HandlerExecutionContext, @@ -14,6 +14,7 @@ import type { SerdeFunctions, ShapeDeserializer, ShapeSerializer, + TimestampEpochSecondsSchema, } from "@smithy/types"; import { ProtocolLib } from "../ProtocolLib"; @@ -36,7 +37,7 @@ export class AwsRestJsonProtocol extends HttpBindingProtocol { const settings: JsonSettings = { timestampFormat: { useTrait: true, - default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, + default: 7 as const satisfies TimestampEpochSecondsSchema, }, httpBindings: true, jsonName: true, diff --git a/packages/core/src/submodules/protocols/json/JsonCodec.ts b/packages/core/src/submodules/protocols/json/JsonCodec.ts index 38d085035379b..e1b6ee6dd81d6 100644 --- a/packages/core/src/submodules/protocols/json/JsonCodec.ts +++ b/packages/core/src/submodules/protocols/json/JsonCodec.ts @@ -1,4 +1,4 @@ -import { Codec, CodecSettings, ShapeDeserializer, ShapeSerializer } from "@smithy/types"; +import type { Codec, CodecSettings } from "@smithy/types"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; import { JsonShapeDeserializer } from "./JsonShapeDeserializer"; diff --git a/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.spec.ts b/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.spec.ts index 96671d5fc1d49..231450c635882 100644 --- a/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.spec.ts +++ b/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.spec.ts @@ -1,5 +1,5 @@ -import { SCHEMA } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; +import type { TimestampEpochSecondsSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { widget } from "../test-schema.spec"; @@ -15,7 +15,7 @@ describe(JsonShapeDeserializer.name, () => { const deserializer = new JsonShapeDeserializer({ jsonName: true, - timestampFormat: { default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, useTrait: true }, + timestampFormat: { default: 7 satisfies TimestampEpochSecondsSchema, useTrait: true }, }); it("understands list sparseness", async () => { diff --git a/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.ts b/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.ts index 1040cb700ecfb..1f9ec46074ebd 100644 --- a/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.ts +++ b/packages/core/src/submodules/protocols/json/JsonShapeDeserializer.ts @@ -1,5 +1,5 @@ import { determineTimestampFormat } from "@smithy/core/protocols"; -import { NormalizedSchema, SCHEMA, TypeRegistry } from "@smithy/core/schema"; +import { NormalizedSchema } from "@smithy/core/schema"; import { LazyJsonString, NumericValue, @@ -7,7 +7,14 @@ import { parseRfc3339DateTimeWithOffset, parseRfc7231DateTime, } from "@smithy/core/serde"; -import { DocumentType, Schema, ShapeDeserializer } from "@smithy/types"; +import type { + DocumentType, + Schema, + ShapeDeserializer, + TimestampDateTimeSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { fromBase64 } from "@smithy/util-base64"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; @@ -88,11 +95,11 @@ export class JsonShapeDeserializer extends SerdeContextConfig implements ShapeDe if (ns.isTimestampSchema() && value != null) { const format = determineTimestampFormat(ns, this.settings); switch (format) { - case SCHEMA.TIMESTAMP_DATE_TIME: + case 5 satisfies TimestampDateTimeSchema: return parseRfc3339DateTimeWithOffset(value); - case SCHEMA.TIMESTAMP_HTTP_DATE: + case 6 satisfies TimestampHttpDateSchema: return parseRfc7231DateTime(value); - case SCHEMA.TIMESTAMP_EPOCH_SECONDS: + case 7 satisfies TimestampEpochSecondsSchema: return parseEpochTimestamp(value); default: console.warn("Missing timestamp format, parsing value with Date constructor:", value); diff --git a/packages/core/src/submodules/protocols/json/JsonShapeSerializer.spec.ts b/packages/core/src/submodules/protocols/json/JsonShapeSerializer.spec.ts index aea832e7b7238..0e64233816056 100644 --- a/packages/core/src/submodules/protocols/json/JsonShapeSerializer.spec.ts +++ b/packages/core/src/submodules/protocols/json/JsonShapeSerializer.spec.ts @@ -1,5 +1,5 @@ -import { SCHEMA } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; +import type { TimestampEpochSecondsSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { widget } from "../test-schema.spec"; @@ -9,7 +9,7 @@ describe(JsonShapeSerializer.name, () => { it("serializes data to JSON", async () => { const serializer = new JsonShapeSerializer({ jsonName: true, - timestampFormat: { default: SCHEMA.TIMESTAMP_EPOCH_SECONDS, useTrait: true }, + timestampFormat: { default: 7 satisfies TimestampEpochSecondsSchema, useTrait: true }, }); serializer.setSerdeContext({ base64Encoder: (input: Uint8Array) => { diff --git a/packages/core/src/submodules/protocols/json/JsonShapeSerializer.ts b/packages/core/src/submodules/protocols/json/JsonShapeSerializer.ts index 38c4a210099d1..9f9678a166b44 100644 --- a/packages/core/src/submodules/protocols/json/JsonShapeSerializer.ts +++ b/packages/core/src/submodules/protocols/json/JsonShapeSerializer.ts @@ -1,11 +1,17 @@ import { determineTimestampFormat } from "@smithy/core/protocols"; -import { NormalizedSchema, SCHEMA } from "@smithy/core/schema"; +import { NormalizedSchema } from "@smithy/core/schema"; import { dateToUtcString, generateIdempotencyToken, LazyJsonString, NumericValue } from "@smithy/core/serde"; -import { Schema, ShapeSerializer } from "@smithy/types"; +import type { + Schema, + ShapeSerializer, + TimestampDateTimeSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { toBase64 } from "@smithy/util-base64"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; -import { JsonSettings } from "./JsonCodec"; +import type { JsonSettings } from "./JsonCodec"; import { JsonReplacer } from "./jsonReplacer"; /** @@ -105,11 +111,11 @@ export class JsonShapeSerializer extends SerdeContextConfig implements ShapeSeri if ((ns.isTimestampSchema() || ns.isDocumentSchema()) && value instanceof Date) { const format = determineTimestampFormat(ns, this.settings); switch (format) { - case SCHEMA.TIMESTAMP_DATE_TIME: + case 5 satisfies TimestampDateTimeSchema: return value.toISOString().replace(".000Z", "Z"); - case SCHEMA.TIMESTAMP_HTTP_DATE: + case 6 satisfies TimestampHttpDateSchema: return dateToUtcString(value); - case SCHEMA.TIMESTAMP_EPOCH_SECONDS: + case 7 satisfies TimestampEpochSecondsSchema: return value.getTime() / 1000; default: console.warn("Missing timestamp format, using epoch seconds", value); diff --git a/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts index 970366b39aeec..4928afed995ba 100644 --- a/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts +++ b/packages/core/src/submodules/protocols/query/AwsQueryProtocol.ts @@ -1,7 +1,8 @@ import { collectBody, RpcProtocol } from "@smithy/core/protocols"; -import { deref, ErrorSchema, NormalizedSchema, SCHEMA, TypeRegistry } from "@smithy/core/schema"; +import { deref, ErrorSchema, NormalizedSchema, TypeRegistry } from "@smithy/core/schema"; import type { Codec, + DocumentSchema, EndpointBearer, HandlerExecutionContext, HttpRequest, @@ -10,6 +11,7 @@ import type { OperationSchema, ResponseMetadata, SerdeFunctions, + TimestampDateTimeSchema, } from "@smithy/types"; import { ProtocolLib } from "../ProtocolLib"; @@ -37,7 +39,7 @@ export class AwsQueryProtocol extends RpcProtocol { const settings = { timestampFormat: { useTrait: true, - default: SCHEMA.TIMESTAMP_DATE_TIME, + default: 5 as const satisfies TimestampDateTimeSchema, }, httpBindings: false, xmlNamespace: options.xmlNamespace, @@ -100,7 +102,7 @@ export class AwsQueryProtocol extends RpcProtocol { if (response.statusCode >= 300) { const bytes: Uint8Array = await collectBody(response.body, context as SerdeFunctions); if (bytes.byteLength > 0) { - Object.assign(dataObject, await deserializer.read(SCHEMA.DOCUMENT, bytes)); + Object.assign(dataObject, await deserializer.read(15 satisfies DocumentSchema, bytes)); } await this.handleError(operationSchema, context, response, dataObject, this.deserializeMetadata(response)); } diff --git a/packages/core/src/submodules/protocols/query/QuerySerializerSettings.ts b/packages/core/src/submodules/protocols/query/QuerySerializerSettings.ts index 88dd858612d40..117623e1bb006 100644 --- a/packages/core/src/submodules/protocols/query/QuerySerializerSettings.ts +++ b/packages/core/src/submodules/protocols/query/QuerySerializerSettings.ts @@ -1,4 +1,4 @@ -import { CodecSettings } from "@smithy/types"; +import type { CodecSettings } from "@smithy/types"; export type QuerySerializerSettings = CodecSettings & { capitalizeKeys?: boolean; diff --git a/packages/core/src/submodules/protocols/query/QueryShapeSerializer.spec.ts b/packages/core/src/submodules/protocols/query/QueryShapeSerializer.spec.ts index b6510be4e1056..1acb9d317e5c7 100644 --- a/packages/core/src/submodules/protocols/query/QueryShapeSerializer.spec.ts +++ b/packages/core/src/submodules/protocols/query/QueryShapeSerializer.spec.ts @@ -1,5 +1,5 @@ -import { SCHEMA } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; +import type { TimestampDateTimeSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { widget } from "../test-schema.spec"; @@ -8,7 +8,7 @@ import { QueryShapeSerializer } from "./QueryShapeSerializer"; describe(QueryShapeSerializer.name, () => { it("serializes data to Query", async () => { const serializer = new QueryShapeSerializer({ - timestampFormat: { default: SCHEMA.TIMESTAMP_DATE_TIME, useTrait: true }, + timestampFormat: { default: 5 satisfies TimestampDateTimeSchema, useTrait: true }, }); serializer.setSerdeContext({ base64Encoder: (input: Uint8Array) => { diff --git a/packages/core/src/submodules/protocols/query/QueryShapeSerializer.ts b/packages/core/src/submodules/protocols/query/QueryShapeSerializer.ts index 4076bf8854636..4283471aa3241 100644 --- a/packages/core/src/submodules/protocols/query/QueryShapeSerializer.ts +++ b/packages/core/src/submodules/protocols/query/QueryShapeSerializer.ts @@ -1,8 +1,14 @@ import { determineTimestampFormat, extendedEncodeURIComponent } from "@smithy/core/protocols"; -import { NormalizedSchema, SCHEMA } from "@smithy/core/schema"; +import { NormalizedSchema } from "@smithy/core/schema"; import { generateIdempotencyToken, NumericValue } from "@smithy/core/serde"; import { dateToUtcString } from "@smithy/smithy-client"; -import type { Schema, ShapeSerializer } from "@smithy/types"; +import type { + Schema, + ShapeSerializer, + TimestampDateTimeSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { toBase64 } from "@smithy/util-base64"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; @@ -55,13 +61,13 @@ export class QueryShapeSerializer extends SerdeContextConfig implements ShapeSer this.writeKey(prefix); const format = determineTimestampFormat(ns, this.settings); switch (format) { - case SCHEMA.TIMESTAMP_DATE_TIME: + case 5 satisfies TimestampDateTimeSchema: this.writeValue(value.toISOString().replace(".000Z", "Z")); break; - case SCHEMA.TIMESTAMP_HTTP_DATE: + case 6 satisfies TimestampHttpDateSchema: this.writeValue(dateToUtcString(value)); break; - case SCHEMA.TIMESTAMP_EPOCH_SECONDS: + case 7 satisfies TimestampEpochSecondsSchema: this.writeValue(String(value.getTime() / 1000)); break; } diff --git a/packages/core/src/submodules/protocols/schema-testing/schema-documents.spec.ts b/packages/core/src/submodules/protocols/schema-testing/schema-documents.spec.ts index 28a25291375a4..d30349152fb44 100644 --- a/packages/core/src/submodules/protocols/schema-testing/schema-documents.spec.ts +++ b/packages/core/src/submodules/protocols/schema-testing/schema-documents.spec.ts @@ -1,5 +1,18 @@ -import { list, map, NormalizedSchema, SCHEMA, sim, struct, TypeRegistry } from "@smithy/core/schema"; -import { DocumentType, Schema } from "@smithy/types"; +import { list, map, NormalizedSchema, sim, struct, TypeRegistry } from "@smithy/core/schema"; +import type { + BigDecimalSchema, + BigIntegerSchema, + BlobSchema, + BooleanSchema, + DocumentSchema, + DocumentType, + NumericSchema, + StringSchema, + TimestampDateTimeSchema, + TimestampDefaultSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { JsonCodec, JsonSettings } from "../json/JsonCodec"; @@ -35,27 +48,27 @@ export var OmniWidget = struct( "structure", ], [ - SCHEMA.BLOB, - SCHEMA.BOOLEAN, + 21 satisfies BlobSchema, + 2 satisfies BooleanSchema, sim("smithy.api", "String", 0, { jsonName: "String", xmlName: "String", }), - sim("smithy.api", "Byte", SCHEMA.NUMERIC, 0), - sim("smithy.api", "Short", SCHEMA.NUMERIC, 0), - sim("smithy.api", "Integer", SCHEMA.NUMERIC, 0), - sim("smithy.api", "Long", SCHEMA.NUMERIC, 0), - sim("smithy.api", "Float", SCHEMA.NUMERIC, 0), - SCHEMA.NUMERIC, // double - SCHEMA.BIG_INTEGER, - SCHEMA.BIG_DECIMAL, - SCHEMA.TIMESTAMP_DEFAULT, - SCHEMA.TIMESTAMP_DATE_TIME, - SCHEMA.TIMESTAMP_HTTP_DATE, - SCHEMA.TIMESTAMP_EPOCH_SECONDS, - SCHEMA.DOCUMENT, - sim("smithy.api", "Enum", SCHEMA.STRING, 0), - sim("smithy.api", "IntEnum", SCHEMA.NUMERIC, 0), + sim("smithy.api", "Byte", 1 satisfies NumericSchema, 0), + sim("smithy.api", "Short", 1 satisfies NumericSchema, 0), + sim("smithy.api", "Integer", 1 satisfies NumericSchema, 0), + sim("smithy.api", "Long", 1 satisfies NumericSchema, 0), + sim("smithy.api", "Float", 1 satisfies NumericSchema, 0), + 1 satisfies NumericSchema, // double + 17 satisfies BigIntegerSchema, + 19 satisfies BigDecimalSchema, + 4 satisfies TimestampDefaultSchema, + 5 satisfies TimestampDateTimeSchema, + 6 satisfies TimestampHttpDateSchema, + 7 satisfies TimestampEpochSecondsSchema, + 15 satisfies DocumentSchema, + sim("smithy.api", "Enum", 0 satisfies StringSchema, 0), + sim("smithy.api", "IntEnum", 1 satisfies NumericSchema, 0), list("smithy.example", "OmniWidgetList", 0, () => OmniWidget), map("smithy.example", "OmniWidgetMap", 0, 0, () => OmniWidget), () => OmniWidget, @@ -66,10 +79,11 @@ function getJsonCodec(test: { settings: JsonSettings }): JsonCodec { const { settings } = test; const format = { - "date-time": SCHEMA.TIMESTAMP_DATE_TIME, - "http-date": SCHEMA.TIMESTAMP_HTTP_DATE, - "epoch-seconds": SCHEMA.TIMESTAMP_EPOCH_SECONDS, - }[(settings.timestampFormat?.default as unknown as string) ?? "epoch-seconds"] ?? SCHEMA.TIMESTAMP_EPOCH_SECONDS; + "date-time": 5 as const satisfies TimestampDateTimeSchema, + "http-date": 6 as const satisfies TimestampHttpDateSchema, + "epoch-seconds": 7 as const satisfies TimestampEpochSecondsSchema, + }[(settings.timestampFormat?.default as unknown as string) ?? "epoch-seconds"] ?? + (7 as const satisfies TimestampEpochSecondsSchema); return new JsonCodec({ jsonName: settings.jsonName ?? false, timestampFormat: { @@ -93,7 +107,7 @@ function readDocument(deserializer: JsonShapeDeserializer, data: DocumentType): const ns = NormalizedSchema.of(schema); return deserializer.readObject(ns, object); } - return deserializer.readObject(SCHEMA.DOCUMENT, data); + return deserializer.readObject(15 satisfies DocumentSchema, data); } describe("schema conversion tests for serializations, data objects, and documents", () => { @@ -105,13 +119,13 @@ describe("schema conversion tests for serializations, data objects, and document const serializer = codec.createSerializer(); const deserializer = codec.createDeserializer(); - serializer.write(SCHEMA.DOCUMENT, test.serialized); + serializer.write(15 satisfies DocumentSchema, test.serialized); const serialization = serializer.flush(); - const documentFromSerialization = await deserializer.read(SCHEMA.DOCUMENT, serialization); + const documentFromSerialization = await deserializer.read(15 satisfies DocumentSchema, serialization); const canonicalDataObject = await deserializer.read(subjectSchema, serialization); serializer.writeDiscriminatedDocument(subjectSchema, canonicalDataObject); - const documentFromDataObject = await deserializer.read(SCHEMA.DOCUMENT, serializer.flush()); + const documentFromDataObject = await deserializer.read(15 satisfies DocumentSchema, serializer.flush()); // 1. data object from serialization expect(typeof documentFromSerialization).toBe("object"); @@ -130,13 +144,13 @@ describe("schema conversion tests for serializations, data objects, and document expect(serializationFromDataObject).toEqual(serialization); // 5. serialization from serialization document - serializer.write(SCHEMA.DOCUMENT, documentFromSerialization); + serializer.write(15 satisfies DocumentSchema, documentFromSerialization); const serializationFromSerializedDocument = serializer.flush(); expect(serializationFromSerializedDocument).toEqual(serialization); // 6. serialization from data object document delete documentFromDataObject.__type; - serializer.write(SCHEMA.DOCUMENT, documentFromDataObject); + serializer.write(15 satisfies DocumentSchema, documentFromDataObject); const serializationFromDocumentFromDataObject = serializer.flush(); expect(serializationFromDocumentFromDataObject).toEqual(serialization); }); diff --git a/packages/core/src/submodules/protocols/test-schema.spec.ts b/packages/core/src/submodules/protocols/test-schema.spec.ts index 85c00d6456416..ee5a7185b2288 100644 --- a/packages/core/src/submodules/protocols/test-schema.spec.ts +++ b/packages/core/src/submodules/protocols/test-schema.spec.ts @@ -1,4 +1,11 @@ -import { list, map, op, SCHEMA, sim, struct } from "@smithy/core/schema"; +import { list, map, op, sim, struct } from "@smithy/core/schema"; +import type { + BigDecimalSchema, + BigIntegerSchema, + BlobSchema, + NumericSchema, + TimestampEpochSecondsSchema, +} from "@smithy/types"; import { describe, test as it } from "vitest"; describe("testing schema export", () => { @@ -15,12 +22,12 @@ export const widget = struct( [list("", "List", 0, 0), { sparse: 1 }], map("", "Map", 0, 0, 0), [map("", "Map", 0, 0, 0), { sparse: 1 }], - SCHEMA.BLOB, + 21 satisfies BlobSchema, sim("", "Media", 0, { mediaType: "application/json" }), - SCHEMA.TIMESTAMP_EPOCH_SECONDS, - SCHEMA.BIG_INTEGER, - SCHEMA.BIG_DECIMAL, - SCHEMA.NUMERIC, + 7 satisfies TimestampEpochSecondsSchema, + 17 satisfies BigIntegerSchema, + 19 satisfies BigDecimalSchema, + 1 satisfies NumericSchema, ] ); diff --git a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts index c9a9f8a7988b0..48a43e1357e94 100644 --- a/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts +++ b/packages/core/src/submodules/protocols/xml/AwsRestXmlProtocol.ts @@ -3,7 +3,7 @@ import { HttpInterceptingShapeDeserializer, HttpInterceptingShapeSerializer, } from "@smithy/core/protocols"; -import { NormalizedSchema, OperationSchema, SCHEMA, TypeRegistry } from "@smithy/core/schema"; +import { NormalizedSchema, OperationSchema, TypeRegistry } from "@smithy/core/schema"; import type { EndpointBearer, HandlerExecutionContext, @@ -14,6 +14,7 @@ import type { SerdeFunctions, ShapeDeserializer, ShapeSerializer, + TimestampDateTimeSchema, } from "@smithy/types"; import { ProtocolLib } from "../ProtocolLib"; @@ -34,7 +35,7 @@ export class AwsRestXmlProtocol extends HttpBindingProtocol { const settings: XmlSettings = { timestampFormat: { useTrait: true, - default: SCHEMA.TIMESTAMP_DATE_TIME, + default: 5 as const satisfies TimestampDateTimeSchema, }, httpBindings: true, xmlNamespace: options.xmlNamespace, diff --git a/packages/core/src/submodules/protocols/xml/XmlCodec.ts b/packages/core/src/submodules/protocols/xml/XmlCodec.ts index c1271b6907f20..cc418b80755a6 100644 --- a/packages/core/src/submodules/protocols/xml/XmlCodec.ts +++ b/packages/core/src/submodules/protocols/xml/XmlCodec.ts @@ -1,4 +1,4 @@ -import { Codec, CodecSettings, ShapeDeserializer, ShapeSerializer } from "@smithy/types"; +import type { Codec, CodecSettings } from "@smithy/types"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; import { XmlShapeDeserializer } from "./XmlShapeDeserializer"; diff --git a/packages/core/src/submodules/protocols/xml/XmlShapeDeserializer.spec.ts b/packages/core/src/submodules/protocols/xml/XmlShapeDeserializer.spec.ts index 344a7266886c3..7bdfd27f0ec4b 100644 --- a/packages/core/src/submodules/protocols/xml/XmlShapeDeserializer.spec.ts +++ b/packages/core/src/submodules/protocols/xml/XmlShapeDeserializer.spec.ts @@ -1,5 +1,5 @@ -import { SCHEMA } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; +import type { TimestampDateTimeSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { widget } from "../test-schema.spec"; @@ -16,7 +16,7 @@ describe("", () => { const deserializer = new XmlShapeDeserializer({ httpBindings: true, serviceNamespace: "namespace", - timestampFormat: { default: SCHEMA.TIMESTAMP_DATE_TIME, useTrait: true }, + timestampFormat: { default: 5 satisfies TimestampDateTimeSchema, useTrait: true }, xmlNamespace: "namespace", }); diff --git a/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.spec.ts b/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.spec.ts index 013fdb37ee5dd..90e3280d7e4be 100644 --- a/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.spec.ts +++ b/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.spec.ts @@ -1,5 +1,5 @@ -import { SCHEMA } from "@smithy/core/schema"; import { NumericValue } from "@smithy/core/serde"; +import type { TimestampDateTimeSchema } from "@smithy/types"; import { describe, expect, test as it } from "vitest"; import { widget } from "../test-schema.spec"; @@ -11,7 +11,7 @@ describe(XmlShapeSerializer.name, () => { const serializer = new XmlShapeSerializer({ xmlNamespace: "namespace", serviceNamespace: "namespace", - timestampFormat: { default: SCHEMA.TIMESTAMP_DATE_TIME, useTrait: true }, + timestampFormat: { default: 5 satisfies TimestampDateTimeSchema, useTrait: true }, }); serializer.setSerdeContext({ base64Encoder: (input: Uint8Array) => { diff --git a/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.ts b/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.ts index b4d370e292f7b..2ddc329f43ed8 100644 --- a/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.ts +++ b/packages/core/src/submodules/protocols/xml/XmlShapeSerializer.ts @@ -1,9 +1,15 @@ import { XmlNode, XmlText } from "@aws-sdk/xml-builder"; import { determineTimestampFormat } from "@smithy/core/protocols"; -import { NormalizedSchema, SCHEMA } from "@smithy/core/schema"; +import { NormalizedSchema } from "@smithy/core/schema"; import { generateIdempotencyToken, NumericValue } from "@smithy/core/serde"; import { dateToUtcString } from "@smithy/smithy-client"; -import type { Schema as ISchema, ShapeSerializer } from "@smithy/types"; +import type { + Schema as ISchema, + ShapeSerializer, + TimestampDateTimeSchema, + TimestampEpochSecondsSchema, + TimestampHttpDateSchema, +} from "@smithy/types"; import { fromBase64, toBase64 } from "@smithy/util-base64"; import { SerdeContextConfig } from "../ConfigurableSerdeContext"; @@ -262,13 +268,13 @@ export class XmlShapeSerializer extends SerdeContextConfig implements ShapeSeria } else if (ns.isTimestampSchema() && value instanceof Date) { const format = determineTimestampFormat(ns, this.settings); switch (format) { - case SCHEMA.TIMESTAMP_DATE_TIME: + case 5 satisfies TimestampDateTimeSchema: nodeContents = value.toISOString().replace(".000Z", "Z"); break; - case SCHEMA.TIMESTAMP_HTTP_DATE: + case 6 satisfies TimestampHttpDateSchema: nodeContents = dateToUtcString(value); break; - case SCHEMA.TIMESTAMP_EPOCH_SECONDS: + case 7 satisfies TimestampEpochSecondsSchema: nodeContents = String(value.getTime() / 1000); break; default: