diff --git a/.changeset/neat-queens-peel.md b/.changeset/neat-queens-peel.md new file mode 100644 index 00000000000..2e674b9cd27 --- /dev/null +++ b/.changeset/neat-queens-peel.md @@ -0,0 +1,5 @@ +--- +"@smithy/core": minor +--- + +add numeric value container for serde diff --git a/packages/core/package.json b/packages/core/package.json index c716f75ad19..cd71e5add55 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -45,6 +45,13 @@ "import": "./dist-es/submodules/protocols/index.js", "require": "./dist-cjs/submodules/protocols/index.js", "types": "./dist-types/submodules/protocols/index.d.ts" + }, + "./serde": { + "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", + "types": "./dist-types/submodules/serde/index.d.ts" } }, "author": { @@ -78,6 +85,8 @@ "./cbor.js", "./protocols.d.ts", "./protocols.js", + "./serde.d.ts", + "./serde.js", "dist-*/**" ], "homepage": "https://github.com/awslabs/smithy-typescript/tree/main/packages/core", diff --git a/packages/core/serde.d.ts b/packages/core/serde.d.ts new file mode 100644 index 00000000000..9906bb086f0 --- /dev/null +++ b/packages/core/serde.d.ts @@ -0,0 +1,7 @@ +/** + * 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"; +} diff --git a/packages/core/serde.js b/packages/core/serde.js new file mode 100644 index 00000000000..b2d727f86a6 --- /dev/null +++ b/packages/core/serde.js @@ -0,0 +1,6 @@ + +/** + * 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"); diff --git a/packages/core/src/submodules/serde/index.ts b/packages/core/src/submodules/serde/index.ts new file mode 100644 index 00000000000..a70d0dda874 --- /dev/null +++ b/packages/core/src/submodules/serde/index.ts @@ -0,0 +1 @@ +export * from "./value/NumericValue"; diff --git a/packages/core/src/submodules/serde/value/NumericValue.spec.ts b/packages/core/src/submodules/serde/value/NumericValue.spec.ts new file mode 100644 index 00000000000..b5fb7090842 --- /dev/null +++ b/packages/core/src/submodules/serde/value/NumericValue.spec.ts @@ -0,0 +1,12 @@ +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"); + }); +}); diff --git a/packages/core/src/submodules/serde/value/NumericValue.ts b/packages/core/src/submodules/serde/value/NumericValue.ts new file mode 100644 index 00000000000..11b54144114 --- /dev/null +++ b/packages/core/src/submodules/serde/value/NumericValue.ts @@ -0,0 +1,36 @@ +/** + * 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"; + +/** + * 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 + ) {} +} + +/** + * Serde shortcut. + * @internal + */ +export function nv(string: string): NumericValue { + return new NumericValue(string, "bigDecimal"); +} diff --git a/packages/core/tsconfig.cjs.json b/packages/core/tsconfig.cjs.json index fea7954e681..a5bbf2547b8 100644 --- a/packages/core/tsconfig.cjs.json +++ b/packages/core/tsconfig.cjs.json @@ -5,7 +5,8 @@ "rootDir": "src", "paths": { "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], - "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"] + "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], + "@smithy/core/serde": ["./src/submodules/serde/index.ts"] } }, "extends": "../../tsconfig.cjs.json", diff --git a/packages/core/tsconfig.es.json b/packages/core/tsconfig.es.json index 0519270a909..95225ee3300 100644 --- a/packages/core/tsconfig.es.json +++ b/packages/core/tsconfig.es.json @@ -6,7 +6,8 @@ "rootDir": "src", "paths": { "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], - "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"] + "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], + "@smithy/core/serde": ["./src/submodules/serde/index.ts"] } }, "extends": "../../tsconfig.es.json", diff --git a/packages/core/tsconfig.types.json b/packages/core/tsconfig.types.json index 3ebde5c3ede..5400575ea0b 100644 --- a/packages/core/tsconfig.types.json +++ b/packages/core/tsconfig.types.json @@ -5,7 +5,8 @@ "rootDir": "src", "paths": { "@smithy/core/cbor": ["./src/submodules/cbor/index.ts"], - "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"] + "@smithy/core/protocols": ["./src/submodules/protocols/index.ts"], + "@smithy/core/serde": ["./src/submodules/serde/index.ts"] } }, "extends": "../../tsconfig.types.json",