@contractkit/plugin-typescript 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,9 +5,9 @@ $ tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly
5
5
  CLI tsup v8.5.1
6
6
  CLI Target: esnext
7
7
  ESM Build start
8
- ESM dist/index.js 191.67 KB
9
- ESM dist/index.js.map 428.46 KB
10
- ESM ⚡️ Build success in 328ms
8
+ ESM dist/index.js 210.74 KB
9
+ ESM dist/index.js.map 480.07 KB
10
+ ESM ⚡️ Build success in 478ms
11
11
  DTS Build start
12
- DTS ⚡️ Build success in 3774ms
13
- DTS dist/index.d.ts 5.08 KB
12
+ DTS ⚡️ Build success in 3983ms
13
+ DTS dist/index.d.ts 5.14 KB
@@ -3,34 +3,36 @@ $ vitest run --coverage
3
3
   RUN  v4.1.5 /home/runner/work/ContractKit/ContractKit/packages/plugin-typescript
4
4
  Coverage enabled with v8
5
5
 
6
- ✓ tests/codegen-contract.test.ts (128 tests) 165ms
7
- ✓ tests/codegen-sdk.test.ts (152 tests) 307ms
8
- ✓ tests/codegen-operation.test.ts (154 tests) 317ms
9
- ✓ tests/codegen-plain-types.test.ts (66 tests) 70ms
10
- ✓ tests/codegen-server.test.ts (30 tests) 123ms
11
- ✓ tests/pipeline.test.ts (29 tests) 279ms
12
- ✓ tests/codegen-mcp.test.ts (24 tests) 55ms
13
- ✓ tests/escaping-security.test.ts (18 tests) 38ms
6
+ ✓ tests/codegen-contract.test.ts (140 tests) 214ms
7
+ ✓ tests/codegen-operation.test.ts (155 tests) 270ms
8
+ ✓ tests/codegen-sdk.test.ts (159 tests) 239ms
9
+ ✓ tests/codegen-server.test.ts (30 tests) 84ms
10
+ ✓ tests/codegen-plain-types.test.ts (66 tests) 82ms
11
+ ✓ tests/pipeline.test.ts (30 tests) 279ms
12
+ ✓ tests/codegen-mcp.test.ts (24 tests) 31ms
13
+ ✓ tests/escaping-security.test.ts (18 tests) 21ms
14
14
 
15
15
   Test Files  8 passed (8)
16
-  Tests  601 passed (601)
17
-  Start at  16:35:30
18
-  Duration  8.90s (transform 6.21s, setup 0ms, import 18.05s, tests 1.36s, environment 7ms)
16
+  Tests  622 passed (622)
17
+  Start at  17:30:03
18
+  Duration  8.38s (transform 4.61s, setup 0ms, import 16.31s, tests 1.22s, environment 1ms)
19
19
 
20
20
   % Coverage report from v8
21
21
  -------------------|---------|----------|---------|---------|-------------------
22
22
  File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
23
23
  -------------------|---------|----------|---------|---------|-------------------
24
- All files | 84.1 | 78.42 | 86.54 | 86.6 |
25
- src | 83.97 | 78.12 | 86.28 | 86.46 |
26
- ...n-contract.ts | 88.69 | 83.12 | 90.08 | 89.98 | ...1095,1100-1101
27
- codegen-mcp.ts | 82.79 | 75.47 | 84.21 | 86.02 | ...93,298-299,382
28
- ...-operation.ts | 83.05 | 80.67 | 79.71 | 85.23 | ...1010,1015-1016
29
- ...lain-types.ts | 91.57 | 81.98 | 96.87 | 94.44 | ...31,157,269,275
30
- codegen-sdk.ts | 89.92 | 83.94 | 90.62 | 92.67 | ...1411,1425-1426
31
- index.ts | 67.64 | 55.61 | 73.68 | 70.93 | ...1052,1068-1087
24
+ All files | 83.01 | 77.14 | 86.06 | 85.64 |
25
+ src | 82.87 | 76.85 | 85.8 | 85.49 |
26
+ ...n-contract.ts | 89.24 | 83.92 | 90.16 | 90.42 | ...1150,1155-1156
27
+ codegen-mcp.ts | 82.33 | 74.84 | 84.21 | 85.77 | ...97,302-303,386
28
+ ...-operation.ts | 83.02 | 80.71 | 79.71 | 85.18 | ...1032,1037-1038
29
+ ...lain-types.ts | 88.44 | 80.74 | 97.05 | 90.74 | ...71,197,309,315
30
+ ...gen-revive.ts | 57.77 | 52.04 | 75 | 62.74 | ...65-196,278-284
31
+ codegen-sdk.ts | 88.96 | 82.01 | 90.56 | 91.78 | ...1632,1636-1637
32
+ ...al-runtime.ts | 100 | 100 | 100 | 100 |
33
+ index.ts | 67.96 | 54.68 | 75 | 71.09 | ...1079,1095-1114
32
34
  path-utils.ts | 70.28 | 51.13 | 100 | 73.5 | ...65-168,216-231
33
- ts-render.ts | 85 | 87.36 | 79.16 | 89.23 | 83,159,192-200
35
+ ts-render.ts | 85.18 | 87.5 | 79.16 | 89.39 | 83,165,198-206
34
36
  tests | 91.22 | 92.68 | 90.32 | 94 |
35
37
  helpers.ts | 91.22 | 92.68 | 90.32 | 94 | 115-123
36
38
  -------------------|---------|----------|---------|---------|-------------------
package/CHANGELOG.md CHANGED
@@ -1,5 +1,88 @@
1
1
  # @contractkit/contractkit-plugin-typescript
2
2
 
3
+ ## 0.33.0
4
+
5
+ ### Minor Changes
6
+
7
+ - e102a2c: Add a `decimal` scalar, for money and anything else that has to be exact
8
+
9
+ `number` compiles to `z.coerce.number()` — an IEEE-754 double. Anything monetary has to be exact,
10
+ so contracts either lied about their types or routed the value through `string` by hand. `decimal`
11
+ gives the language a type for it:
12
+
13
+ ```
14
+ contract Payslip: {
15
+ gross: decimal(min=0, scale=2)
16
+ rate: decimal
17
+ }
18
+ ```
19
+
20
+ A decimal travels as a **quoted JSON string** (`{"gross": "1250.00"}`) and becomes a decimal.js
21
+ `Decimal` — the same class Prisma hands you for a `Decimal` column, so a value moves between the
22
+ two with no conversion. Python gets `decimal.Decimal`; OpenAPI gets `type: string, format: decimal`.
23
+
24
+ A raw JSON number is **rejected**, not coerced. By the time one reaches the schema it has already
25
+ been through a double, which is precisely the loss the scalar exists to prevent, so accepting it
26
+ would defeat the point silently.
27
+
28
+ **`scale=` is a validation constraint — at most N decimal places — not a formatting directive.**
29
+ It cannot be one: the router assigns `ctx.body` and Koa serializes it with a `JSON.stringify` we
30
+ have no replacer for, so the wire form is whatever decimal.js normalizes to and `"1250.00"` reads
31
+ back as `"1250"`. The two are the same number; format at the display edge if you need the trailing
32
+ zeros. This is also what `scale` means in OpenAPI `pattern`, pydantic `condecimal(decimal_places=)`
33
+ and Prisma `@db.Decimal(_, n)`, so every downstream mapping stays honest.
34
+
35
+ Generated code sets `Decimal.set({ toExpNeg: -9e15, toExpPos: 9e15 })` so values never serialize in
36
+ exponential notation — without it `0.00000001` ships as `"1e-8"` and any peer validating
37
+ `^-?\d+(\.\d+)?$` rejects it. Note this is global decimal.js configuration and affects every
38
+ `Decimal` in the consuming process.
39
+
40
+ SDK clients rehydrate decimals through generated `reviveX` functions. The `bigint` approach does
41
+ not transfer — it works only because bigint invented a tagged `"123n"` wire encoding, and tagging a
42
+ decimal would corrupt the format for every non-ContractKit consumer. Re-parsing responses through
43
+ the Zod schema is not available either: `XOutput` is a type alias with no runtime value, and models
44
+ default to `z.strictObject`, so any field the server added would throw in every deployed client.
45
+ The revivers mutate in place, which preserves unknown server-added keys.
46
+
47
+ Two placements are rejected at parse time, both errors rather than warnings since no existing
48
+ contract can be relying on them. A decimal inside an **undiscriminated union** cannot be rehydrated
49
+ — the SDK has no way to tell which arm arrived, and a convert-if-string fallback would silently
50
+ rewrite a genuine `string` field in a sibling arm. A decimal in a **response header** has no
51
+ parsing step at all, so the annotation would simply be false at runtime.
52
+
53
+ `min`/`max` are kept as exact decimal strings rather than coerced through `Number()`, and OpenAPI
54
+ carries them in `x-contractkit-min`/`-max` extensions, since JSON Schema's numeric `minimum` and
55
+ `maximum` are ignored on a string type. A contract round-trips through OpenAPI and back with its
56
+ bounds intact.
57
+
58
+ SDKs that scaffold a `package.json` gain `decimal.js` as a dependency when a covered model uses the
59
+ scalar. Existing scaffolds are write-once and are not updated, so add it by hand there.
60
+
61
+ ### Patch Changes
62
+
63
+ - e102a2c: Fix scalar lists that had drifted out of sync with the language
64
+
65
+ Four places kept a hand-written copy of the language's scalar names, and three had already fallen
66
+ behind without anything failing to build:
67
+ - The VS Code completion list and hover map were both missing `interval`, so the editor silently
68
+ stopped recognising it — no completion, no hover.
69
+ - The constraint-argument regex that decides when to offer `min=`/`max=` completions was missing
70
+ `time`, `interval`, and every non-constrainable scalar.
71
+ - `docs/language.md`'s scalar table was missing `duration`.
72
+
73
+ The completion and semantic-token providers now read `SCALAR_NAMES` from `@contractkit/core`
74
+ directly, which removes the drift class rather than patching this instance of it, and the
75
+ constraint regex is built from those lists. What genuinely cannot derive from the set — a TextMate
76
+ alternation, a per-scalar documentation map, a Markdown table — is now covered by a test that fails
77
+ when any of them falls behind.
78
+
79
+ Also fixes the SDK scaffold's luxon detection, which omitted `duration`. `generateContract` imports
80
+ `Duration` from luxon whenever that scalar is present, so a contract whose only temporal type was a
81
+ duration scaffolded a `package.json` with no `luxon` dependency and did not compile.
82
+
83
+ - Updated dependencies [e102a2c]
84
+ - @contractkit/core@0.28.0
85
+
3
86
  ## 0.32.0
4
87
 
5
88
  ### Minor Changes
package/README.md CHANGED
@@ -100,6 +100,11 @@ Generates plain TypeScript interface/type files from `contract` declarations. No
100
100
  The `server` and `sdk` sub-generators set `target` themselves (`server` and `client` respectively), so
101
101
  their plain-type output already matches the runtime that consumes it.
102
102
 
103
+ `decimal` is the one scalar that renders the same for both targets — decimal.js `Decimal` — because
104
+ it has no output transform, so the wire view and the server view agree. That also means plain-type
105
+ output carries a real `import Decimal from 'decimal.js'`, and the scaffolded `package.json` adds
106
+ `decimal.js` as a dependency whenever a covered model uses the scalar.
107
+
103
108
  ## Path templates
104
109
 
105
110
  Output paths support the following variables:
@@ -24,6 +24,13 @@ export interface ContractCodegenContext {
24
24
  * `generateContract`, whose Zod schemas are server-shaped by construction. Default `'client'`.
25
25
  */
26
26
  target?: TsRenderTarget;
27
+ /** Model names that carry a `decimal`, directly or transitively. */
28
+ modelsWithDecimal?: Set<string>;
29
+ /**
30
+ * Emit `reviveX()` hydration functions alongside the schemas. Set only for SDK type files: a
31
+ * server handler receives decimals already parsed by `_ZodDecimal`, so it has nothing to revive.
32
+ */
33
+ emitRevivers?: boolean;
27
34
  }
28
35
  /**
29
36
  * Compute which models need Input variants, including transitive dependencies.
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-contract.d.ts","sourceRoot":"","sources":["../src/codegen-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,gBAAgB,EAChB,SAAS,EAET,gBAAgB,EAWhB,UAAU,EACb,MAAM,mBAAmB,CAAC;AAO3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAStD;AAID,4GAA4G;AAC5G,MAAM,WAAW,sBAAsB;IACnC,sDAAsD;IACtD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,6GAA6G;IAC7G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;CAC3B;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAsCzH;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAkEjG;AAgVD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CA6B5H;AAkOD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CAuDvH;AA2BD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CAsCvH;AA0CD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB7E;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAiBjE;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAcpE;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CA4BvG;AAmCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CA6D/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAgB3F;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"}
1
+ {"version":3,"file":"codegen-contract.d.ts","sourceRoot":"","sources":["../src/codegen-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,gBAAgB,EAChB,SAAS,EAET,gBAAgB,EAWhB,UAAU,EACb,MAAM,mBAAmB,CAAC;AAO3B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIrD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAStD;AAID,4GAA4G;AAC5G,MAAM,WAAW,sBAAsB;IACnC,sDAAsD;IACtD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,6GAA6G;IAC7G,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,oEAAoE;IACpE,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAsCzH;AAkBD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAgGjG;AAgVD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,OAAO,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CA6B5H;AAkPD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CAuDvH;AA2BD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,UAAU,GAAG,MAAM,CAsCvH;AA0CD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB7E;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAiBjE;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAcpE;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CA4BvG;AAmCD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CA6D/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAgB3F;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-mcp.d.ts","sourceRoot":"","sources":["../src/codegen-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA8E,MAAM,mBAAmB,CAAC;AAShI,MAAM,WAAW,iBAAiB;IAC9B,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,UAAQ,GAAG,OAAO,CASnF;AA4VD,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA0DzF;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAC/B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAe3E;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAuBzE"}
1
+ {"version":3,"file":"codegen-mcp.d.ts","sourceRoot":"","sources":["../src/codegen-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA8E,MAAM,mBAAmB,CAAC;AAUhI,MAAM,WAAW,iBAAiB;IAC9B,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uFAAuF;IACvF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AASD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,UAAQ,GAAG,OAAO,CASnF;AA+VD,0GAA0G;AAC1G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA2DzF;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAC/B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,0FAA0F;AAC1F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAe3E;AAED,sGAAsG;AACtG,wBAAgB,iBAAiB,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAuBzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-operation.d.ts","sourceRoot":"","sources":["../src/codegen-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EACV,WAAW,EACX,eAAe,EAGf,gBAAgB,EAInB,MAAM,mBAAmB,CAAC;AAiC3B;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAkE5F;AAID,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAuGnF;AAwSD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAY7H;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAqBzE;AAsaD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E"}
1
+ {"version":3,"file":"codegen-operation.d.ts","sourceRoot":"","sources":["../src/codegen-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EACV,WAAW,EACX,eAAe,EAGf,gBAAgB,EAInB,MAAM,mBAAmB,CAAC;AAkC3B;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CA0E5F;AAID,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAgHnF;AAwSD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAY7H;AAoBD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,eAAe,GAAG,MAAM,CAqBzE;AA0aD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnD;AAMD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E"}
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-plain-types.d.ts","sourceRoot":"","sources":["../src/codegen-plain-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;AAEhF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAcpE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CA4CnG"}
1
+ {"version":3,"file":"codegen-plain-types.d.ts","sourceRoot":"","sources":["../src/codegen-plain-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,mBAAmB,CAAC;AAEhF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAgBpE;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CAkFnG"}
@@ -0,0 +1,42 @@
1
+ import type { ContractTypeNode, ModelNode } from '@contractkit/core';
2
+ /**
3
+ * Emitters for the `reviveX` functions that rehydrate `decimal` fields in an SDK response.
4
+ *
5
+ * A decimal arrives as a quoted JSON string, but the generated types say `Decimal`, so something
6
+ * has to construct one. The SDK cannot do it the way `bigint` does — `bigIntReviver` works only
7
+ * because bigint invented a tagged `"123n"` wire encoding, and `"10.50"` is indistinguishable from
8
+ * an ordinary string without knowing the schema. Nor can it re-parse the response through the Zod
9
+ * schema: `XOutput` is a `z.output<>` type alias with no runtime value behind it, and models
10
+ * default to `z.strictObject`, so any field the server added would throw in every deployed client.
11
+ *
12
+ * So the knowledge lives in generated code instead: one function per model that walks to the field
13
+ * positions a decimal can occupy and converts in place. Mutating rather than rebuilding keeps the
14
+ * cost proportional to the number of decimal fields, and preserves unknown server-added keys —
15
+ * the forward compatibility a strict re-parse would destroy.
16
+ *
17
+ * Emitted from the AST, so zod mode and plain-types mode produce identical runtime behaviour.
18
+ */
19
+ export interface ReviveCodegenOptions {
20
+ /** Models that carry a decimal, directly or transitively. Only these get a reviver. */
21
+ modelsWithDecimal: Set<string>;
22
+ /** Models with an `Output` variant, which need a second reviver keyed by the output casing. */
23
+ modelsWithOutput?: Set<string>;
24
+ /** Every model in scope, for resolving discriminated-union members to their literal tag. */
25
+ modelMap?: Map<string, ModelNode>;
26
+ }
27
+ /** The per-file coercion helper. Emitted once in any file that declares a reviver. */
28
+ export declare const DECIMAL_COERCE_DECL: string[];
29
+ /** `reviveInvoice` / `reviveInvoiceOutput`. */
30
+ export declare function reviveFnName(model: string, variant?: 'base' | 'output'): string;
31
+ /** Whether a type reaches a decimal, following refs through `modelsWithDecimal`. */
32
+ export declare function typeReachesDecimal(type: ContractTypeNode, opts: ReviveCodegenOptions): boolean;
33
+ /**
34
+ * A standalone reviver for an arbitrary type node — used for a response body that is not a plain
35
+ * model reference (an inline object, a record, a tuple), where there is no `reviveX` to call.
36
+ *
37
+ * Returns `null` when the type holds no decimal, so the caller emits nothing at all.
38
+ */
39
+ export declare function renderInlineReviver(fnName: string, tsType: string, type: ContractTypeNode, opts: ReviveCodegenOptions, variant?: 'base' | 'output'): string[] | null;
40
+ /** The `reviveX` (and `reviveXOutput`) declarations for one model, or `[]` if it holds no decimal. */
41
+ export declare function renderReviveFunctions(model: ModelNode, opts: ReviveCodegenOptions): string[];
42
+ //# sourceMappingURL=codegen-revive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen-revive.d.ts","sourceRoot":"","sources":["../src/codegen-revive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAa,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEhF;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,oBAAoB;IACjC,uFAAuF;IACvF,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;CACrC;AAED,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,UAW/B,CAAC;AAEF,+CAA+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,QAAiB,GAAG,MAAM,CAEvF;AAQD,oFAAoF;AACpF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAuB9F;AA0JD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,gBAAgB,EACtB,IAAI,EAAE,oBAAoB,EAC1B,OAAO,GAAE,MAAM,GAAG,QAAmB,GACtC,MAAM,EAAE,GAAG,IAAI,CAajB;AAED,sGAAsG;AACtG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAQ5F"}
@@ -1,4 +1,4 @@
1
- import type { OpRootNode } from '@contractkit/core';
1
+ import type { OpRootNode, ModelNode } from '@contractkit/core';
2
2
  /** Options shared by every SDK code-generation entry point. */
3
3
  export interface SdkCodegenOptions {
4
4
  /** Template for type import paths when `modelOutPaths` is not provided. Supports `{module}` and `{base}`. */
@@ -13,6 +13,10 @@ export interface SdkCodegenOptions {
13
13
  modelsWithInput?: Set<string>;
14
14
  /** Set of model names that have Output variants (models with format(output=...)) */
15
15
  modelsWithOutput?: Set<string>;
16
+ /** Model names carrying a `decimal`, whose response bodies need rehydrating client-side. */
17
+ modelsWithDecimal?: Set<string>;
18
+ /** Every model in scope, for resolving discriminated-union members inside an inline reviver. */
19
+ modelMap?: Map<string, ModelNode>;
16
20
  /**
17
21
  * Whether to emit SDK methods for operations marked `internal`. Defaults to `false` —
18
22
  * internal ops are omitted from the SDK so consumers don't pick them up. Set to `true`
@@ -41,16 +45,22 @@ export declare function hasPublicOperations(root: OpRootNode, includeInternal?:
41
45
  export declare function generateSdk(root: OpRootNode, options?: SdkCodegenOptions): string;
42
46
  /**
43
47
  * Render the method-block lines for an operation file as if they were declared inside a
44
- * client class. Returns one consolidated array of strings (each pre-indented for class body
45
- * level, with leading blank lines between methods) plus the set of method names emitted —
46
- * the caller uses the names to detect cross-file collisions when multiple files contribute
47
- * to the same area-level client.
48
+ * client class.
48
49
  *
49
50
  * Skips operations marked `internal` unless `options.includeInternal` is set.
51
+ *
52
+ * @returns `lines`, one consolidated array pre-indented for class-body level with leading blank
53
+ * lines between methods; `methodNames`, used by the caller to detect cross-file collisions when
54
+ * several files contribute to the same area-level client; `preludeLines`, module-level
55
+ * declarations the methods reference (decimal revivers and their `__dec` helper) which the caller
56
+ * must splice in above the class; and `needsDecimalImport`, true when those declarations require
57
+ * `import { Decimal } from 'decimal.js'` in the emitting file.
50
58
  */
51
59
  export declare function generateClientMethods(root: OpRootNode, options: SdkCodegenOptions): {
52
60
  lines: string[];
53
61
  methodNames: string[];
62
+ preludeLines: string[];
63
+ needsDecimalImport: boolean;
54
64
  };
55
65
  /**
56
66
  * Module-level `…ErrorBody` aliases for every operation whose thrown statuses declare a body.
@@ -87,8 +97,10 @@ export declare function generateSdkOptions(): string;
87
97
  export interface SdkScaffoldDeps {
88
98
  /** Zod schema files are emitted (`config.zod`) — the SDK imports `zod`. */
89
99
  zod: boolean;
90
- /** Any covered model uses a `date`/`time`/`datetime`/`interval` scalar — the SDK imports `luxon`. */
100
+ /** Any covered model uses a `date`/`time`/`datetime`/`duration`/`interval` scalar — the SDK imports `luxon`. */
91
101
  luxon: boolean;
102
+ /** Any covered model uses a `decimal` scalar — the SDK imports `decimal.js`. */
103
+ decimal: boolean;
92
104
  }
93
105
  /**
94
106
  * Generate a starter `package.json` for a generated SDK package. Emitted with
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-sdk.d.ts","sourceRoot":"","sources":["../src/codegen-sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codegen-sdk.d.ts","sourceRoot":"","sources":["../src/codegen-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EAQV,SAAS,EAEZ,MAAM,mBAAmB,CAAC;AA6D3B,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAC9B,6GAA6G;IAC7G,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,8GAA8G;IAC9G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,4FAA4F;IAC5F,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,gGAAgG;IAChG,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,UAAQ,GAAG,OAAO,CAOtF;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA6JrF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACjC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,GAC3B;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAAC,kBAAkB,EAAE,OAAO,CAAA;CAAE,CAqBjG;AAwaD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAgB/F;AAuJD,gIAAgI;AAChI,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,oGAAoG;AACpG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAEpF;AAeD,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,0FAA0F;AAC1F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,0GAA0G;AAC1G,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEjE;AAmSD,qDAAqD;AACrD,wBAAgB,kBAAkB,IAAI,MAAM,CA2F3C;AAaD,sGAAsG;AACtG,MAAM,WAAW,eAAe;IAC5B,2EAA2E;IAC3E,GAAG,EAAE,OAAO,CAAC;IACb,gHAAgH;IAChH,KAAK,EAAE,OAAO,CAAC;IACf,gFAAgF;IAChF,OAAO,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG,MAAM,CA8B7F;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAkB5C;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC1B,2EAA2E;IAC3E,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAC9B,kBAAkB;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,mIAAmI;IACnI,cAAc,EAAE,iBAAiB,CAAC;CACrC;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IAC/B,8FAA8F;IAC9F,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,iCAAiC;IACjC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,kFAAkF;IAClF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC5B,uFAAuF;IACvF,IAAI,EAAE,MAAM,CAAC;IACb,+HAA+H;IAC/H,OAAO,EAAE,MAAM,CAAC;IAChB,0GAA0G;IAC1G,WAAW,EAAE,iBAAiB,EAAE,CAAC;IACjC,2EAA2E;IAC3E,cAAc,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,EAAE,CAAC;IAClE,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAqJjE;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAyCvE"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The emitted decimal.js runtime shared by every generator that renders a `decimal` scalar.
3
+ *
4
+ * `_ZodBinary`/`_ZodDatetime`/`_ZodInterval` are duplicated as literals across codegen-contract,
5
+ * codegen-operation and codegen-mcp, and have already drifted once (the three files emit their
6
+ * luxon import lists in two different orders). The decimal runtime is defined once here so the
7
+ * three call sites cannot disagree about it; each still decides *whether* to emit it with its own
8
+ * detection strategy, which is the part that legitimately differs between them.
9
+ */
10
+ /**
11
+ * The decimal.js import — **named, not default**.
12
+ *
13
+ * `decimal.d.ts` declares `Decimal` three times over: a class, a namespace, and a function, with
14
+ * `export default Decimal` alongside. Under the `NodeNext` resolution the scaffolded SDK uses
15
+ * (`module: NodeNext` + `"type": "module"`), the default export resolves to the *namespace*
16
+ * meaning, so `import Decimal from 'decimal.js'` fails to compile with "Cannot use namespace
17
+ * 'Decimal' as a type" and "Property 'set' does not exist". The named import binds the merged
18
+ * class and is the only form that typechecks.
19
+ */
20
+ export declare const DECIMAL_IMPORT = "import { Decimal } from 'decimal.js';";
21
+ /**
22
+ * Global decimal.js configuration, emitted in **every** file that imports `Decimal` — plain-types
23
+ * mode included, where there is no Zod schema but `String(value)` and `JSON.stringify` still run.
24
+ *
25
+ * Load-bearing, not cosmetic. decimal.js switches to exponential
26
+ * notation outside `toExpNeg`/`toExpPos` (defaults -7/21), so without it `new Decimal('0.00000001')`
27
+ * serializes as `"1e-8"` and any peer validating `^-?\d+(\.\d+)?$` rejects it. It is the only lever
28
+ * that reaches the `JSON.stringify` Koa runs over `ctx.body`, which we do not otherwise control.
29
+ *
30
+ */
31
+ export declare const DECIMAL_CONFIG_LINE = "Decimal.set({ toExpNeg: -9e15, toExpPos: 9e15 });";
32
+ /**
33
+ * The Zod schema for a `decimal`.
34
+ *
35
+ * Deliberately has no output `.transform()`. `isRevalidatable` in codegen-operation treats every
36
+ * scalar as idempotent under re-parse — the assumption `server.validateResponses` rests on — and
37
+ * preprocess passes an already-`Decimal` value through untouched, so it holds.
38
+ *
39
+ * A raw JSON number fails validation rather than being coerced: by the time one reaches us it has
40
+ * already been through an IEEE-754 double, which is the loss this scalar exists to prevent. Bad
41
+ * strings are returned unchanged from preprocess rather than throwing, so they surface as an
42
+ * ordinary Zod issue instead of a `DecimalError` escaping the parse.
43
+ */
44
+ export declare const DECIMAL_ZOD_SCHEMA_LINE = "const _ZodDecimal = z.preprocess((val) => { if (typeof val !== 'string') return val; try { return new Decimal(val); } catch { return val; } }, z.custom<Decimal>((val) => Decimal.isDecimal(val), { message: 'Must be an exact decimal sent as a quoted string, e.g. \"1250.00\"' }));";
45
+ /** The decimal runtime for a file that also holds Zod schemas, in emission order. */
46
+ export declare const DECIMAL_PRELUDE_LINES: readonly string[];
47
+ //# sourceMappingURL=decimal-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decimal-runtime.d.ts","sourceRoot":"","sources":["../src/decimal-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,0CAA0C,CAAC;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,sDAAsD,CAAC;AAEvF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,2RAAyR,CAAC;AAE9T,qFAAqF;AACrF,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAAmD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -42,7 +42,8 @@ export interface SdkConfig {
42
42
  * write-once: the files are created only when absent and are never overwritten or
43
43
  * cleaned up on later builds, so any edits you make to them are preserved.
44
44
  * Dependency ranges are derived from the contracts (always `zod` when `zod: true`;
45
- * `luxon` when any covered model uses a date/time/datetime/interval scalar).
45
+ * `luxon` when any covered model uses a date/time/datetime/duration/interval scalar;
46
+ * `decimal.js` when any uses a decimal).
46
47
  */
47
48
  scaffold?: boolean;
48
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,iBAAiB,EAQpB,MAAM,mBAAmB,CAAC;AA+C3B,gFAAgF;AAChF,MAAM,WAAW,YAAY;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6HAA6H;IAC7H,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,8EAA8E;QAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,mGAAmG;AACnG,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,sFAAsF;AACtF,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,iGAAiG;AACjG,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC;AAED,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACL,oHAAoH;QACpH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,0GAA0G;QAC1G,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,yFAAyF;QACzF,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,0FAA0F;AAC1F,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,SAAS,CAAC;CACnB;AAID,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAO9C,QAAA,MAAM,MAAM,EAAE,iBAMb,CAAC;AAEF,eAAe,MAAM,CAAC;AAEtB,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAOzG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACR,iBAAiB,EAQpB,MAAM,mBAAmB,CAAC;AAgD3B,gFAAgF;AAChF,MAAM,WAAW,YAAY;IACzB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6HAA6H;IAC7H,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,8EAA8E;QAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wEAAwE;IACxE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,mGAAmG;AACnG,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,sFAAsF;AACtF,MAAM,WAAW,SAAS;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,iGAAiG;AACjG,MAAM,WAAW,WAAW;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAChC;AAED,0FAA0F;AAC1F,MAAM,WAAW,SAAS;IACtB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE;QACL,oHAAoH;QACpH,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,0GAA0G;QAC1G,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,yFAAyF;QACzF,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,gEAAgE;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yFAAyF;IACzF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,0FAA0F;AAC1F,MAAM,WAAW,sBAAsB;IACnC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,GAAG,CAAC,EAAE,SAAS,CAAC;CACnB;AAID,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAO9C,QAAA,MAAM,MAAM,EAAE,iBAMb,CAAC;AAEF,eAAe,MAAM,CAAC;AAEtB,2GAA2G;AAC3G,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAOzG"}