ts-procedures 6.1.0 → 6.2.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.
Files changed (163) hide show
  1. package/agent_config/bin/setup.mjs +2 -2
  2. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +1 -0
  3. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +1 -1
  4. package/agent_config/claude-code/skills/ts-procedures-kotlin/SKILL.md +1 -1
  5. package/agent_config/claude-code/skills/ts-procedures-swift/SKILL.md +119 -0
  6. package/agent_config/copilot/copilot-instructions.md +1 -0
  7. package/agent_config/cursor/cursorrules +1 -0
  8. package/agent_config/lib/install-claude.mjs +1 -1
  9. package/build/codegen/bin/cli.d.ts +17 -3
  10. package/build/codegen/bin/cli.js +79 -3
  11. package/build/codegen/bin/cli.js.map +1 -1
  12. package/build/codegen/index.d.ts +18 -1
  13. package/build/codegen/index.js +3 -0
  14. package/build/codegen/index.js.map +1 -1
  15. package/build/codegen/pipeline.d.ts +16 -5
  16. package/build/codegen/pipeline.js +44 -143
  17. package/build/codegen/pipeline.js.map +1 -1
  18. package/build/codegen/targets/_shared/error-schemas.d.ts +10 -0
  19. package/build/codegen/targets/_shared/error-schemas.js +17 -0
  20. package/build/codegen/targets/_shared/error-schemas.js.map +1 -0
  21. package/build/codegen/targets/_shared/error-schemas.test.d.ts +1 -0
  22. package/build/codegen/targets/_shared/error-schemas.test.js +38 -0
  23. package/build/codegen/targets/_shared/error-schemas.test.js.map +1 -0
  24. package/build/codegen/targets/_shared/indent.d.ts +6 -0
  25. package/build/codegen/targets/_shared/indent.js +13 -0
  26. package/build/codegen/targets/_shared/indent.js.map +1 -0
  27. package/build/codegen/targets/_shared/indent.test.d.ts +1 -0
  28. package/build/codegen/targets/_shared/indent.test.js +21 -0
  29. package/build/codegen/targets/_shared/indent.test.js.map +1 -0
  30. package/build/codegen/targets/_shared/pascal-case.d.ts +6 -0
  31. package/build/codegen/targets/_shared/pascal-case.js +13 -0
  32. package/build/codegen/targets/_shared/pascal-case.js.map +1 -0
  33. package/build/codegen/targets/_shared/pascal-case.test.d.ts +1 -0
  34. package/build/codegen/targets/_shared/pascal-case.test.js +25 -0
  35. package/build/codegen/targets/_shared/pascal-case.test.js.map +1 -0
  36. package/build/codegen/targets/_shared/path-utils.d.ts +12 -0
  37. package/build/codegen/targets/_shared/path-utils.js +20 -0
  38. package/build/codegen/targets/_shared/path-utils.js.map +1 -0
  39. package/build/codegen/targets/_shared/path-utils.test.d.ts +1 -0
  40. package/build/codegen/targets/_shared/path-utils.test.js +42 -0
  41. package/build/codegen/targets/_shared/path-utils.test.js.map +1 -0
  42. package/build/codegen/targets/_shared/pick-defined.d.ts +11 -0
  43. package/build/codegen/targets/_shared/pick-defined.js +21 -0
  44. package/build/codegen/targets/_shared/pick-defined.js.map +1 -0
  45. package/build/codegen/targets/_shared/pick-defined.test.d.ts +1 -0
  46. package/build/codegen/targets/_shared/pick-defined.test.js +25 -0
  47. package/build/codegen/targets/_shared/pick-defined.test.js.map +1 -0
  48. package/build/codegen/targets/_shared/route-slots.d.ts +17 -0
  49. package/build/codegen/targets/_shared/route-slots.js +17 -0
  50. package/build/codegen/targets/_shared/route-slots.js.map +1 -0
  51. package/build/codegen/targets/_shared/route-slots.test.d.ts +1 -0
  52. package/build/codegen/targets/_shared/route-slots.test.js +43 -0
  53. package/build/codegen/targets/_shared/route-slots.test.js.map +1 -0
  54. package/build/codegen/targets/_shared/target-run.d.ts +27 -0
  55. package/build/codegen/targets/_shared/target-run.js +2 -0
  56. package/build/codegen/targets/_shared/target-run.js.map +1 -0
  57. package/build/codegen/targets/_shared/write-files.d.ts +24 -0
  58. package/build/codegen/targets/_shared/write-files.js +35 -0
  59. package/build/codegen/targets/_shared/write-files.js.map +1 -0
  60. package/build/codegen/targets/_shared/write-files.test.d.ts +1 -0
  61. package/build/codegen/targets/_shared/write-files.test.js +79 -0
  62. package/build/codegen/targets/_shared/write-files.test.js.map +1 -0
  63. package/build/codegen/targets/kotlin/e2e-compile.test.js +1 -1
  64. package/build/codegen/targets/kotlin/e2e-compile.test.js.map +1 -1
  65. package/build/codegen/targets/kotlin/emit-route-kotlin.js +5 -22
  66. package/build/codegen/targets/kotlin/emit-route-kotlin.js.map +1 -1
  67. package/build/codegen/targets/kotlin/emit-scope-kotlin.js +4 -8
  68. package/build/codegen/targets/kotlin/emit-scope-kotlin.js.map +1 -1
  69. package/build/codegen/targets/kotlin/format-kotlin.d.ts +0 -12
  70. package/build/codegen/targets/kotlin/format-kotlin.js +0 -27
  71. package/build/codegen/targets/kotlin/format-kotlin.js.map +1 -1
  72. package/build/codegen/targets/kotlin/format-kotlin.test.js +1 -34
  73. package/build/codegen/targets/kotlin/format-kotlin.test.js.map +1 -1
  74. package/build/codegen/targets/kotlin/integration.test.js +1 -1
  75. package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
  76. package/build/codegen/targets/kotlin/run.d.ts +11 -0
  77. package/build/codegen/targets/kotlin/run.js +51 -0
  78. package/build/codegen/targets/kotlin/run.js.map +1 -0
  79. package/build/codegen/targets/swift/access-level.test.d.ts +1 -0
  80. package/build/codegen/targets/swift/access-level.test.js +98 -0
  81. package/build/codegen/targets/swift/access-level.test.js.map +1 -0
  82. package/build/codegen/targets/swift/ajsc-adapter.d.ts +27 -0
  83. package/build/codegen/targets/swift/ajsc-adapter.js +38 -0
  84. package/build/codegen/targets/swift/ajsc-adapter.js.map +1 -0
  85. package/build/codegen/targets/swift/ajsc-adapter.test.d.ts +1 -0
  86. package/build/codegen/targets/swift/ajsc-adapter.test.js +37 -0
  87. package/build/codegen/targets/swift/ajsc-adapter.test.js.map +1 -0
  88. package/build/codegen/targets/swift/e2e-compile.test.d.ts +1 -0
  89. package/build/codegen/targets/swift/e2e-compile.test.js +57 -0
  90. package/build/codegen/targets/swift/e2e-compile.test.js.map +1 -0
  91. package/build/codegen/targets/swift/emit-route-swift.d.ts +15 -0
  92. package/build/codegen/targets/swift/emit-route-swift.js +64 -0
  93. package/build/codegen/targets/swift/emit-route-swift.js.map +1 -0
  94. package/build/codegen/targets/swift/emit-route-swift.test.d.ts +1 -0
  95. package/build/codegen/targets/swift/emit-route-swift.test.js +258 -0
  96. package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -0
  97. package/build/codegen/targets/swift/emit-scope-swift.d.ts +13 -0
  98. package/build/codegen/targets/swift/emit-scope-swift.js +36 -0
  99. package/build/codegen/targets/swift/emit-scope-swift.js.map +1 -0
  100. package/build/codegen/targets/swift/emit-scope-swift.test.d.ts +1 -0
  101. package/build/codegen/targets/swift/emit-scope-swift.test.js +136 -0
  102. package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -0
  103. package/build/codegen/targets/swift/format-swift.d.ts +2 -0
  104. package/build/codegen/targets/swift/format-swift.js +10 -0
  105. package/build/codegen/targets/swift/format-swift.js.map +1 -0
  106. package/build/codegen/targets/swift/format-swift.test.d.ts +1 -0
  107. package/build/codegen/targets/swift/format-swift.test.js +14 -0
  108. package/build/codegen/targets/swift/format-swift.test.js.map +1 -0
  109. package/build/codegen/targets/swift/integration.test.d.ts +1 -0
  110. package/build/codegen/targets/swift/integration.test.js +53 -0
  111. package/build/codegen/targets/swift/integration.test.js.map +1 -0
  112. package/build/codegen/targets/swift/run.d.ts +11 -0
  113. package/build/codegen/targets/swift/run.js +47 -0
  114. package/build/codegen/targets/swift/run.js.map +1 -0
  115. package/build/codegen/targets/ts/run.d.ts +4 -0
  116. package/build/codegen/targets/ts/run.js +86 -0
  117. package/build/codegen/targets/ts/run.js.map +1 -0
  118. package/docs/codegen-kotlin.md +1 -0
  119. package/docs/codegen-swift.md +314 -0
  120. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +1 -1
  121. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +1 -1
  122. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +264 -0
  123. package/package.json +2 -2
  124. package/src/codegen/bin/cli.ts +91 -7
  125. package/src/codegen/index.ts +24 -1
  126. package/src/codegen/pipeline.ts +52 -174
  127. package/src/codegen/targets/_shared/error-schemas.test.ts +42 -0
  128. package/src/codegen/targets/_shared/error-schemas.ts +17 -0
  129. package/src/codegen/targets/_shared/indent.test.ts +25 -0
  130. package/src/codegen/targets/_shared/indent.ts +12 -0
  131. package/src/codegen/targets/_shared/pascal-case.test.ts +30 -0
  132. package/src/codegen/targets/_shared/pascal-case.ts +12 -0
  133. package/src/codegen/targets/_shared/path-utils.test.ts +51 -0
  134. package/src/codegen/targets/_shared/path-utils.ts +21 -0
  135. package/src/codegen/targets/_shared/pick-defined.test.ts +48 -0
  136. package/src/codegen/targets/_shared/pick-defined.ts +23 -0
  137. package/src/codegen/targets/_shared/route-slots.test.ts +55 -0
  138. package/src/codegen/targets/_shared/route-slots.ts +32 -0
  139. package/src/codegen/targets/_shared/target-run.ts +28 -0
  140. package/src/codegen/targets/_shared/write-files.test.ts +110 -0
  141. package/src/codegen/targets/_shared/write-files.ts +53 -0
  142. package/src/codegen/targets/kotlin/e2e-compile.test.ts +1 -1
  143. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +5 -25
  144. package/src/codegen/targets/kotlin/emit-scope-kotlin.ts +4 -9
  145. package/src/codegen/targets/kotlin/format-kotlin.test.ts +0 -44
  146. package/src/codegen/targets/kotlin/format-kotlin.ts +0 -32
  147. package/src/codegen/targets/kotlin/integration.test.ts +1 -1
  148. package/src/codegen/targets/kotlin/run.ts +78 -0
  149. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +123 -0
  150. package/src/codegen/targets/swift/access-level.test.ts +108 -0
  151. package/src/codegen/targets/swift/ajsc-adapter.test.ts +47 -0
  152. package/src/codegen/targets/swift/ajsc-adapter.ts +67 -0
  153. package/src/codegen/targets/swift/e2e-compile.test.ts +66 -0
  154. package/src/codegen/targets/swift/emit-route-swift.test.ts +300 -0
  155. package/src/codegen/targets/swift/emit-route-swift.ts +90 -0
  156. package/src/codegen/targets/swift/emit-scope-swift.test.ts +164 -0
  157. package/src/codegen/targets/swift/emit-scope-swift.ts +59 -0
  158. package/src/codegen/targets/swift/format-swift.test.ts +23 -0
  159. package/src/codegen/targets/swift/format-swift.ts +9 -0
  160. package/src/codegen/targets/swift/integration.test.ts +80 -0
  161. package/src/codegen/targets/swift/run.ts +74 -0
  162. package/src/codegen/targets/ts/run.ts +117 -0
  163. /package/src/codegen/{targets/kotlin/__fixtures__ → __fixtures__}/users-envelope.json +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Returns the deterministic ordered slot list for a route, filtered to slots
3
+ * with non-null sources. Order is fixed at the module level for stable output.
4
+ */
5
+ export function extractRouteSlots(route) {
6
+ const schema = route.schema ?? {};
7
+ const input = (schema.input ?? {});
8
+ // Order is load-bearing: targets emit slots in this sequence.
9
+ const slots = [
10
+ { rootName: 'PathParams', source: input.pathParams },
11
+ { rootName: 'Query', source: input.query },
12
+ { rootName: 'Body', source: input.body },
13
+ { rootName: 'Response', source: schema.returnType },
14
+ ];
15
+ return slots.filter((s) => s.source != null);
16
+ }
17
+ //# sourceMappingURL=route-slots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-slots.js","sourceRoot":"","sources":["../../../../src/codegen/targets/_shared/route-slots.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,MAAM,GAAI,KAA8C,CAAC,MAAM,IAAI,EAAE,CAAA;IAC3E,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAA;IAE7D,8DAA8D;IAC9D,MAAM,KAAK,GAAgB;QACzB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE;QACpD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE;QAC1C,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE;QACxC,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE;KACpD,CAAA;IAED,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { extractRouteSlots } from './route-slots.js';
3
+ const r = (schema) => ({ name: 'X', kind: 'api', method: 'GET', fullPath: '/x', schema });
4
+ describe('extractRouteSlots', () => {
5
+ it('returns no slots when schema is undefined', () => {
6
+ expect(extractRouteSlots(r(undefined))).toEqual([]);
7
+ });
8
+ it('returns no slots when schema is empty', () => {
9
+ expect(extractRouteSlots(r({}))).toEqual([]);
10
+ });
11
+ it('returns the deterministic slot order: PathParams, Query, Body, Response', () => {
12
+ const slots = extractRouteSlots(r({
13
+ input: {
14
+ body: { type: 'object', x: 'body' },
15
+ query: { type: 'object', x: 'query' },
16
+ pathParams: { type: 'object', x: 'path' },
17
+ },
18
+ returnType: { type: 'object', x: 'response' },
19
+ }));
20
+ expect(slots.map((s) => s.rootName)).toEqual(['PathParams', 'Query', 'Body', 'Response']);
21
+ });
22
+ it('omits slots whose source is null or undefined', () => {
23
+ const slots = extractRouteSlots(r({
24
+ input: { pathParams: { type: 'object' }, query: null, body: undefined },
25
+ // returnType missing
26
+ }));
27
+ expect(slots.map((s) => s.rootName)).toEqual(['PathParams']);
28
+ });
29
+ it('attaches the source schema verbatim to each slot', () => {
30
+ const path = { type: 'object', tag: 'p' };
31
+ const ret = { type: 'object', tag: 'r' };
32
+ const slots = extractRouteSlots(r({ input: { pathParams: path }, returnType: ret }));
33
+ expect(slots).toEqual([
34
+ { rootName: 'PathParams', source: path },
35
+ { rootName: 'Response', source: ret },
36
+ ]);
37
+ });
38
+ it('returns no slots for stream/no-schema routes', () => {
39
+ const stream = { name: 'S', kind: 'stream', method: 'GET', path: '/s' };
40
+ expect(extractRouteSlots(stream)).toEqual([]);
41
+ });
42
+ });
43
+ //# sourceMappingURL=route-slots.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-slots.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/_shared/route-slots.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { DocEnvelope } from '../../../implementations/types.js';
2
+ import type { ScopeGroup } from '../../group-routes.js';
3
+ import type { AjscOptions } from '../../emit-types.js';
4
+ /**
5
+ * Inputs the dispatcher prepares once and forwards to every per-target
6
+ * `run*Pipeline` module. Each target module reads only the fields it needs.
7
+ *
8
+ * The fields here are deliberately narrow: target-specific knobs (e.g.
9
+ * `kotlinPackage`, `swiftSerializer`) are passed as additional options on
10
+ * each per-target input shape, not on this base.
11
+ */
12
+ export interface TargetRunInput {
13
+ envelope: DocEnvelope;
14
+ outDir: string;
15
+ /** MD5 hash of the envelope JSON, prefix-stamped into every emitted file. */
16
+ hash: string;
17
+ /** Pre-grouped routes (one entry per scope key). */
18
+ groups: ScopeGroup[];
19
+ /** Validated service name (defaults to `Api` upstream). */
20
+ serviceName: string;
21
+ ajsc?: AjscOptions;
22
+ clientImportPath?: string;
23
+ dryRun?: boolean;
24
+ namespaceTypes?: boolean;
25
+ selfContained?: boolean;
26
+ cleanOutDir?: boolean;
27
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=target-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target-run.js","sourceRoot":"","sources":["../../../../src/codegen/targets/_shared/target-run.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ export interface GeneratedFile {
2
+ path: string;
3
+ code: string;
4
+ }
5
+ export interface WriteOptions {
6
+ /** When true, log what would happen instead of touching the filesystem. */
7
+ dryRun?: boolean;
8
+ /** When true, recursively delete `outDir` before writing. */
9
+ cleanOutDir?: boolean;
10
+ }
11
+ /**
12
+ * Persists the generated files to disk (or simulates the writes under
13
+ * `dryRun`). Centralises the dryRun / cleanOutDir / mkdir / writeFile
14
+ * sequence shared by every codegen target so per-target run modules don't
15
+ * duplicate it.
16
+ *
17
+ * Behaviour:
18
+ * - `dryRun: true` — logs `[dry-run] Would write: <path> (<bytes> bytes)` per
19
+ * file, plus a leading `[dry-run] Would clean outDir: <outDir>` when
20
+ * `cleanOutDir: true`. No filesystem mutation.
21
+ * - `dryRun: false` (default) — when `cleanOutDir`, recursively removes
22
+ * `outDir`; then ensures it exists; then writes each file as utf-8.
23
+ */
24
+ export declare function writeGeneratedFiles(files: readonly GeneratedFile[], outDir: string, opts?: WriteOptions): Promise<void>;
@@ -0,0 +1,35 @@
1
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
2
+ /**
3
+ * Persists the generated files to disk (or simulates the writes under
4
+ * `dryRun`). Centralises the dryRun / cleanOutDir / mkdir / writeFile
5
+ * sequence shared by every codegen target so per-target run modules don't
6
+ * duplicate it.
7
+ *
8
+ * Behaviour:
9
+ * - `dryRun: true` — logs `[dry-run] Would write: <path> (<bytes> bytes)` per
10
+ * file, plus a leading `[dry-run] Would clean outDir: <outDir>` when
11
+ * `cleanOutDir: true`. No filesystem mutation.
12
+ * - `dryRun: false` (default) — when `cleanOutDir`, recursively removes
13
+ * `outDir`; then ensures it exists; then writes each file as utf-8.
14
+ */
15
+ export async function writeGeneratedFiles(files, outDir, opts = {}) {
16
+ const { dryRun = false, cleanOutDir = false } = opts;
17
+ if (dryRun) {
18
+ if (cleanOutDir) {
19
+ console.log(`[dry-run] Would clean outDir: ${outDir}`);
20
+ }
21
+ for (const f of files) {
22
+ const bytes = Buffer.byteLength(f.code, 'utf-8');
23
+ console.log(`[dry-run] Would write: ${f.path} (${bytes} bytes)`);
24
+ }
25
+ return;
26
+ }
27
+ if (cleanOutDir) {
28
+ await rm(outDir, { recursive: true, force: true });
29
+ }
30
+ await mkdir(outDir, { recursive: true });
31
+ for (const f of files) {
32
+ await writeFile(f.path, f.code, 'utf-8');
33
+ }
34
+ }
35
+ //# sourceMappingURL=write-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-files.js","sourceRoot":"","sources":["../../../../src/codegen/targets/_shared/write-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAcvD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA+B,EAC/B,MAAc,EACd,OAAqB,EAAE;IAEvB,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;IAEpD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YAChD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,IAAI,KAAK,KAAK,SAAS,CAAC,CAAA;QAClE,CAAC;QACD,OAAM;IACR,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,CAAC;AACH,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { mkdir, readFile, rm, writeFile, stat, mkdtemp } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { writeGeneratedFiles } from './write-files.js';
6
+ describe('writeGeneratedFiles', () => {
7
+ describe('dryRun mode', () => {
8
+ let logSpy;
9
+ beforeEach(() => {
10
+ logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
11
+ });
12
+ afterEach(() => {
13
+ logSpy.mockRestore();
14
+ });
15
+ it('logs each file with its byte length and does not touch the filesystem', async () => {
16
+ const dir = '/nonexistent/should-not-be-created';
17
+ await writeGeneratedFiles([
18
+ { path: `${dir}/a.txt`, code: 'hello' },
19
+ { path: `${dir}/b.txt`, code: 'hi' },
20
+ ], dir, { dryRun: true });
21
+ expect(logSpy).toHaveBeenCalledWith(`[dry-run] Would write: ${dir}/a.txt (5 bytes)`);
22
+ expect(logSpy).toHaveBeenCalledWith(`[dry-run] Would write: ${dir}/b.txt (2 bytes)`);
23
+ // Sanity: the dir was not created.
24
+ await expect(stat(dir)).rejects.toBeInstanceOf(Error);
25
+ });
26
+ it('logs a clean-outDir notice when cleanOutDir is true', async () => {
27
+ await writeGeneratedFiles([], '/out', { dryRun: true, cleanOutDir: true });
28
+ expect(logSpy).toHaveBeenCalledWith('[dry-run] Would clean outDir: /out');
29
+ });
30
+ it('does not log clean-outDir when cleanOutDir is false', async () => {
31
+ await writeGeneratedFiles([{ path: '/out/x', code: 'x' }], '/out', { dryRun: true });
32
+ const messages = logSpy.mock.calls.map((c) => c[0]);
33
+ expect(messages.find((m) => String(m).includes('Would clean'))).toBeUndefined();
34
+ });
35
+ it('counts bytes as utf-8', async () => {
36
+ // "é" is 2 bytes in utf-8.
37
+ await writeGeneratedFiles([{ path: '/x/e.txt', code: 'é' }], '/x', { dryRun: true });
38
+ expect(logSpy).toHaveBeenCalledWith('[dry-run] Would write: /x/e.txt (2 bytes)');
39
+ });
40
+ });
41
+ describe('real write mode', () => {
42
+ let outDir;
43
+ beforeEach(async () => {
44
+ outDir = await mkdtemp(join(tmpdir(), 'write-files-test-'));
45
+ });
46
+ afterEach(async () => {
47
+ await rm(outDir, { recursive: true, force: true });
48
+ });
49
+ it('writes each file with utf-8 contents', async () => {
50
+ await writeGeneratedFiles([
51
+ { path: join(outDir, 'a.txt'), code: 'alpha' },
52
+ { path: join(outDir, 'b.txt'), code: 'beta' },
53
+ ], outDir);
54
+ expect(await readFile(join(outDir, 'a.txt'), 'utf-8')).toBe('alpha');
55
+ expect(await readFile(join(outDir, 'b.txt'), 'utf-8')).toBe('beta');
56
+ });
57
+ it('creates outDir recursively if missing', async () => {
58
+ const nested = join(outDir, 'a', 'b', 'c');
59
+ await writeGeneratedFiles([{ path: join(nested, 'x.txt'), code: 'x' }], nested);
60
+ expect(await readFile(join(nested, 'x.txt'), 'utf-8')).toBe('x');
61
+ });
62
+ it('removes outDir when cleanOutDir is true before writing', async () => {
63
+ // Pre-populate a stale file.
64
+ await mkdir(outDir, { recursive: true });
65
+ await writeFile(join(outDir, 'stale.txt'), 'stale', 'utf-8');
66
+ await writeGeneratedFiles([{ path: join(outDir, 'fresh.txt'), code: 'fresh' }], outDir, { cleanOutDir: true });
67
+ await expect(readFile(join(outDir, 'stale.txt'), 'utf-8')).rejects.toBeInstanceOf(Error);
68
+ expect(await readFile(join(outDir, 'fresh.txt'), 'utf-8')).toBe('fresh');
69
+ });
70
+ it('does not remove outDir when cleanOutDir is false', async () => {
71
+ await mkdir(outDir, { recursive: true });
72
+ await writeFile(join(outDir, 'keep.txt'), 'keep', 'utf-8');
73
+ await writeGeneratedFiles([{ path: join(outDir, 'new.txt'), code: 'new' }], outDir);
74
+ expect(await readFile(join(outDir, 'keep.txt'), 'utf-8')).toBe('keep');
75
+ expect(await readFile(join(outDir, 'new.txt'), 'utf-8')).toBe('new');
76
+ });
77
+ });
78
+ });
79
+ //# sourceMappingURL=write-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-files.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/_shared/write-files.test.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ const RUN = process.env.TS_PROCEDURES_KOTLIN_E2E === '1';
41
41
  describe('kotlin codegen — kotlinc compile (gated)', () => {
42
42
  it.skipIf(!kotlincAvailable() || !RUN)('compiles generated output without errors', async () => {
43
43
  const emitter = await resolveProductionKotlinEmitter();
44
- const envelope = JSON.parse(readFileSync(join(__dirname, '__fixtures__/users-envelope.json'), 'utf8'));
44
+ const envelope = JSON.parse(readFileSync(join(__dirname, '../../__fixtures__/users-envelope.json'), 'utf8'));
45
45
  const files = await runPipeline({
46
46
  envelope,
47
47
  outDir: 'out',
@@ -1 +1 @@
1
- {"version":3,"file":"e2e-compile.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/e2e-compile.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"e2e-compile.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/e2e-compile.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,7 @@
1
- import { indent, pickDefined } from './format-kotlin.js';
2
- const COLON_PARAM_RE = /:([A-Za-z_][A-Za-z0-9_]*)/g;
3
- function toBracePath(template) {
4
- return template.replace(COLON_PARAM_RE, '{$1}');
5
- }
6
- function pathParamNames(template) {
7
- const names = [];
8
- for (const match of template.matchAll(COLON_PARAM_RE))
9
- names.push(match[1]);
10
- return names;
11
- }
1
+ import { indent } from '../_shared/indent.js';
2
+ import { pickDefined } from '../_shared/pick-defined.js';
3
+ import { toBracePath, pathParamNames } from '../_shared/path-utils.js';
4
+ import { extractRouteSlots } from '../_shared/route-slots.js';
12
5
  function buildPathFn(bracePath, params) {
13
6
  if (params.length === 0)
14
7
  return `const val path = "${bracePath}"`;
@@ -41,18 +34,8 @@ export function emitKotlinRoute(route, emitter, errorSchemas, routeOpts = {}) {
41
34
  buildPathFn(bracePath, params),
42
35
  ];
43
36
  const imports = [];
44
- const schema = route.schema ?? {};
45
- const input = (schema.input ?? {});
46
37
  // Per-slot emission. Order is fixed for deterministic output.
47
- const slots = [
48
- { rootName: 'PathParams', source: input.pathParams },
49
- { rootName: 'Query', source: input.query },
50
- { rootName: 'Body', source: input.body },
51
- { rootName: 'Response', source: schema.returnType },
52
- ];
53
- for (const slot of slots) {
54
- if (slot.source == null)
55
- continue;
38
+ for (const slot of extractRouteSlots(route)) {
56
39
  const result = emitter.emit(slot.source, emitOptsFor(slot.rootName, routeOpts));
57
40
  lines.push('');
58
41
  lines.push(result.code);
@@ -1 +1 @@
1
- {"version":3,"file":"emit-route-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/emit-route-kotlin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emit-route-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/emit-route-kotlin.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,8 @@
1
1
  import { emitKotlinRoute } from './emit-route-kotlin.js';
2
- import { kotlinPackageDecl, kotlinSourceHashHeader, kotlinImports, indent, pickDefined } from './format-kotlin.js';
3
- function pascalCase(scope) {
4
- return scope
5
- .split('-')
6
- .filter((p) => p.length > 0)
7
- .map((p) => p.charAt(0).toUpperCase() + p.slice(1))
8
- .join('');
9
- }
2
+ import { kotlinPackageDecl, kotlinSourceHashHeader, kotlinImports } from './format-kotlin.js';
3
+ import { indent } from '../_shared/indent.js';
4
+ import { pickDefined } from '../_shared/pick-defined.js';
5
+ import { pascalCase } from '../_shared/pascal-case.js';
10
6
  export function emitKotlinScope(group, opts, emitter, errorSchemas) {
11
7
  const scopeName = pascalCase(group.scopeKey);
12
8
  const allImports = [];
@@ -1 +1 @@
1
- {"version":3,"file":"emit-scope-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/emit-scope-kotlin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAsB,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAclH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAClD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,IAAsB,EACtB,OAAsB,EACtB,YAAkC;IAElC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,cAAc,GAAa,EAAE,CAAA;IAEnC,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAA;IAC3H,MAAM,SAAS,GAAkB,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAEpE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;QAClE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAChC,SAAQ;QACV,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,SAAS,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAA;QAClE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACtF,MAAM,UAAU,GAAG,UAAU,KAAK,EAAE;QAClC,CAAC,CAAC,UAAU,SAAS,OAAO;QAC5B,CAAC,CAAC,UAAU,SAAS,OAAO,UAAU,KAAK,CAAA;IAE7C,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG;QACZ,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC;QACrC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC,YAAY;QACZ,UAAU;KACX,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE7B,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,CAAA;AACzF,CAAC"}
1
+ {"version":3,"file":"emit-scope-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/emit-scope-kotlin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAsB,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC7F,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AActD,MAAM,UAAU,eAAe,CAC7B,KAAiB,EACjB,IAAsB,EACtB,OAAsB,EACtB,YAAkC;IAElC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,WAAW,GAAa,EAAE,CAAA;IAChC,MAAM,cAAc,GAAa,EAAE,CAAA;IAEnC,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAA;IAC3H,MAAM,SAAS,GAAkB,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAEpE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;QAClE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YAChC,SAAQ;QACV,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,SAAS,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAA;QAClE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IACtF,MAAM,UAAU,GAAG,UAAU,KAAK,EAAE;QAClC,CAAC,CAAC,UAAU,SAAS,OAAO;QAC5B,CAAC,CAAC,UAAU,SAAS,OAAO,UAAU,KAAK,CAAA;IAE7C,MAAM,YAAY,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;IAC9C,MAAM,KAAK,GAAG;QACZ,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC;QACrC,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC;QACvC,YAAY;QACZ,UAAU;KACX,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAE7B,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,CAAA;AACzF,CAAC"}
@@ -1,15 +1,3 @@
1
1
  export declare function kotlinPackageDecl(pkg: string): string;
2
2
  export declare function kotlinSourceHashHeader(hash: string): string;
3
3
  export declare function kotlinImports(imports: string[]): string;
4
- export declare function indent(text: string, level: number): string;
5
- /**
6
- * Returns a new object containing only the keys of `src` whose values are
7
- * not `undefined`. Useful for building option objects where unset keys must
8
- * be ABSENT (not `undefined`-valued), so they don't shadow downstream
9
- * defaults — e.g., when forwarding into `KotlinEmitOptions`.
10
- *
11
- * @example
12
- * pickDefined({ a: 1, b: undefined, c: false }, ['a', 'b', 'c'])
13
- * // → { a: 1, c: false }
14
- */
15
- export declare function pickDefined<T extends object, K extends keyof T>(src: T, keys: readonly K[]): Partial<Pick<T, K>>;
@@ -10,31 +10,4 @@ export function kotlinImports(imports) {
10
10
  const unique = Array.from(new Set(imports)).sort();
11
11
  return unique.map((i) => `import ${i}`).join('\n');
12
12
  }
13
- export function indent(text, level) {
14
- const prefix = ' '.repeat(level);
15
- return text
16
- .split('\n')
17
- .map((line) => (line.length === 0 ? line : `${prefix}${line}`))
18
- .join('\n');
19
- }
20
- /**
21
- * Returns a new object containing only the keys of `src` whose values are
22
- * not `undefined`. Useful for building option objects where unset keys must
23
- * be ABSENT (not `undefined`-valued), so they don't shadow downstream
24
- * defaults — e.g., when forwarding into `KotlinEmitOptions`.
25
- *
26
- * @example
27
- * pickDefined({ a: 1, b: undefined, c: false }, ['a', 'b', 'c'])
28
- * // → { a: 1, c: false }
29
- */
30
- export function pickDefined(src, keys) {
31
- const out = {};
32
- for (const key of keys) {
33
- const value = src[key];
34
- if (value !== undefined) {
35
- out[key] = value;
36
- }
37
- }
38
- return out;
39
- }
40
13
  //# sourceMappingURL=format-kotlin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/format-kotlin.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,WAAW,GAAG,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,mBAAmB,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAiB;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAClD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC;SAC9D,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CACzB,GAAM,EACN,IAAkB;IAElB,MAAM,GAAG,GAAwB,EAAE,CAAA;IACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACtB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"format-kotlin.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/format-kotlin.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,WAAW,GAAG,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,OAAO,mBAAmB,IAAI,EAAE,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAiB;IAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IACnC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAClD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { kotlinPackageDecl, kotlinSourceHashHeader, kotlinImports, indent, pickDefined, } from './format-kotlin.js';
2
+ import { kotlinPackageDecl, kotlinSourceHashHeader, kotlinImports, } from './format-kotlin.js';
3
3
  describe('format-kotlin', () => {
4
4
  it('emits a package declaration', () => {
5
5
  expect(kotlinPackageDecl('com.example.api')).toBe('package com.example.api');
@@ -13,38 +13,5 @@ describe('format-kotlin', () => {
13
13
  it('returns empty string when no imports', () => {
14
14
  expect(kotlinImports([])).toBe('');
15
15
  });
16
- it('indents every line by 4 spaces per level', () => {
17
- expect(indent('a\nb', 1)).toBe(' a\n b');
18
- expect(indent('a', 2)).toBe(' a');
19
- });
20
- it('preserves blank lines without trailing whitespace when indenting', () => {
21
- expect(indent('a\n\nb', 1)).toBe(' a\n\n b');
22
- });
23
- });
24
- describe('pickDefined', () => {
25
- it('returns only the keys whose values are not undefined', () => {
26
- expect(pickDefined({ a: 1, b: undefined, c: 3 }, ['a', 'b', 'c']))
27
- .toEqual({ a: 1, c: 3 });
28
- });
29
- it('preserves the literal `false` value for boolean opts', () => {
30
- expect(pickDefined({ depluralize: false, x: undefined }, ['depluralize', 'x']))
31
- .toEqual({ depluralize: false });
32
- });
33
- it('preserves the literal `false` for `string | false` opts (e.g. arrayItemNaming)', () => {
34
- const result = pickDefined({ arrayItemNaming: false }, ['arrayItemNaming']);
35
- expect(result).toEqual({ arrayItemNaming: false });
36
- expect('arrayItemNaming' in result).toBe(true);
37
- });
38
- it('omits keys not in the keys list even if they are defined on src', () => {
39
- expect(pickDefined({ a: 1, b: 2 }, ['a']))
40
- .toEqual({ a: 1 });
41
- });
42
- it('returns an empty object when all keys are undefined', () => {
43
- expect(pickDefined({ a: undefined, b: undefined }, ['a', 'b']))
44
- .toEqual({});
45
- });
46
- it('returns an empty object when keys is empty', () => {
47
- expect(pickDefined({ a: 1 }, [])).toEqual({});
48
- });
49
16
  });
50
17
  //# sourceMappingURL=format-kotlin.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-kotlin.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/format-kotlin.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"format-kotlin.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/format-kotlin.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,GACd,MAAM,oBAAoB,CAAA;AAE3B,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,aAAa,CAAC,CAAC,oCAAoC,EAAE,kCAAkC,EAAE,oCAAoC,CAAC,CAAC,CAAC,CAAC,IAAI,CAC1I,oFAAoF,CACrF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -15,7 +15,7 @@ const ok = (code, rootTypeName, imports = ['kotlinx.serialization.Serializable']
15
15
  });
16
16
  describe('kotlin codegen — integration', () => {
17
17
  it('produces byte-identical output against the golden fixture', async () => {
18
- const envelopePath = join(__dirname, '__fixtures__/users-envelope.json');
18
+ const envelopePath = join(__dirname, '../../__fixtures__/users-envelope.json');
19
19
  const goldenPath = join(__dirname, '__fixtures__/users-golden.kt');
20
20
  const envelope = JSON.parse(await readFile(envelopePath, 'utf8'));
21
21
  // Hand-authored slot outputs in the v7.2 nested-class shape (inlineTypes: true).
@@ -1 +1 @@
1
- {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAyB,MAAM,mBAAmB,CAAA;AAElF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,YAAoB,EAAE,UAAoB,CAAC,oCAAoC,CAAC,EAAoB,EAAE,CAAC,CAAC;IAChI,IAAI;IACJ,YAAY;IACZ,kBAAkB,EAAE,EAAE;IACtB,OAAO;CACR,CAAC,CAAA;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAA;QACxE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;QAEjE,iFAAiF;QACjF,EAAE;QACF,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,iDAAiD;QACjD,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACtC,UAAU;YACV,UAAU,EAAE,EAAE,CAAC,+DAA+D,EAAE,YAAY,CAAC;YAC7F,QAAQ,EAAE,EAAE,CACV,4SAA4S,EAC5S,UAAU,EACV,CAAC,oCAAoC,EAAE,kCAAkC,EAAE,kCAAkC,CAAC,CAC/G;YACD,QAAQ,EAAE,EAAE,CACV,sGAAsG,EACtG,UAAU,CACX;YAED,aAAa;YACb,IAAI,EAAE,EAAE,CACN,6VAA6V,EAC7V,MAAM,EACN,CAAC,oCAAoC,EAAE,kCAAkC,EAAE,mDAAmD,CAAC,CAChI;YACD,eAAe,EAAE,EAAE,CACjB,oJAAoJ,EACpJ,iBAAiB,CAClB;YAED,YAAY;YACZ,KAAK,EAAE,EAAE,CACP,8OAA8O,EAC9O,OAAO,EACP,CAAC,oCAAoC,EAAE,kCAAkC,CAAC,CAC3E;SACF,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;YAC9B,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YACrC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB;YAClD,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;QAEpD,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/integration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAyB,MAAM,mBAAmB,CAAA;AAElF,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,YAAoB,EAAE,UAAoB,CAAC,oCAAoC,CAAC,EAAoB,EAAE,CAAC,CAAC;IAChI,IAAI;IACJ,YAAY;IACZ,kBAAkB,EAAE,EAAE;IACtB,OAAO;CACR,CAAC,CAAA;AAEF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAA;QAC9E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAA;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;QAEjE,iFAAiF;QACjF,EAAE;QACF,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,2EAA2E;QAC3E,yEAAyE;QACzE,yEAAyE;QACzE,iDAAiD;QACjD,MAAM,OAAO,GAAG,uBAAuB,CAAC;YACtC,UAAU;YACV,UAAU,EAAE,EAAE,CAAC,+DAA+D,EAAE,YAAY,CAAC;YAC7F,QAAQ,EAAE,EAAE,CACV,4SAA4S,EAC5S,UAAU,EACV,CAAC,oCAAoC,EAAE,kCAAkC,EAAE,kCAAkC,CAAC,CAC/G;YACD,QAAQ,EAAE,EAAE,CACV,sGAAsG,EACtG,UAAU,CACX;YAED,aAAa;YACb,IAAI,EAAE,EAAE,CACN,6VAA6V,EAC7V,MAAM,EACN,CAAC,oCAAoC,EAAE,kCAAkC,EAAE,mDAAmD,CAAC,CAChI;YACD,eAAe,EAAE,EAAE,CACjB,oJAAoJ,EACpJ,iBAAiB,CAClB;YAED,YAAY;YACZ,KAAK,EAAE,EAAE,CACP,8OAA8O,EAC9O,OAAO,EACP,CAAC,oCAAoC,EAAE,kCAAkC,CAAC,CAC3E;SACF,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;YAC9B,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI;YACrC,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB;YAClD,aAAa,EAAE,OAAO;SACvB,CAAC,CAAA;QAEF,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAA;QAEpD,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { GeneratedFile } from '../_shared/write-files.js';
2
+ import type { TargetRunInput } from '../_shared/target-run.js';
3
+ import type { KotlinEmitter } from './ajsc-adapter.js';
4
+ export interface KotlinRunInput extends TargetRunInput {
5
+ kotlinPackage?: string;
6
+ kotlinSerializer?: 'kotlinx' | 'none';
7
+ unsupportedUnions?: 'throw' | 'fallback';
8
+ /** Injected for tests; production wiring resolves a real ajsc emitter. */
9
+ kotlinEmitter?: KotlinEmitter;
10
+ }
11
+ export declare function runKotlinPipeline(input: KotlinRunInput): Promise<GeneratedFile[]>;
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Kotlin-target pipeline runner. Invoked by the dispatcher in
3
+ * `src/codegen/pipeline.ts` when `target === 'kotlin'`. Emits one `.kt` file
4
+ * per scope via `emitKotlinScope` and commits via the shared
5
+ * `writeGeneratedFiles` tail.
6
+ */
7
+ import { join } from 'node:path';
8
+ import { writeGeneratedFiles } from '../_shared/write-files.js';
9
+ import { buildErrorSchemasMap } from '../_shared/error-schemas.js';
10
+ import { pickDefined } from '../_shared/pick-defined.js';
11
+ import { emitKotlinScope } from './emit-scope-kotlin.js';
12
+ /**
13
+ * Spec §"CLI flags" — `--array-item-naming`, `--depluralize`,
14
+ * `--uncountable-words` also apply to the Kotlin target. The CLI parks them
15
+ * on `options.ajsc` (a TS-target structure historically); copy the
16
+ * Kotlin-relevant subset onto the scope opts here.
17
+ */
18
+ const AJSC_PASSTHROUGH_KEYS = ['arrayItemNaming', 'depluralize', 'uncountableWords'];
19
+ export async function runKotlinPipeline(input) {
20
+ const { envelope, outDir, hash, groups, dryRun = false, cleanOutDir = false } = input;
21
+ // Runtime guards for non-CLI callers (direct API consumers + tests).
22
+ // The CLI validates --kotlin-package in parseArgs and resolves the emitter
23
+ // before calling runPipeline, so end users never hit these throws.
24
+ if (input.kotlinPackage == null) {
25
+ throw new Error('[ts-procedures-codegen] target=kotlin requires kotlinPackage');
26
+ }
27
+ if (input.kotlinEmitter == null) {
28
+ throw new Error('[ts-procedures-codegen] target=kotlin requires a kotlinEmitter (CLI resolves via resolveProductionKotlinEmitter)');
29
+ }
30
+ const errorSchemas = buildErrorSchemasMap(envelope.errors);
31
+ const ajscPassthrough = input.ajsc ?? {};
32
+ const files = [];
33
+ const allSkipped = [];
34
+ for (const group of groups) {
35
+ const emitted = emitKotlinScope(group, {
36
+ kotlinPackage: input.kotlinPackage,
37
+ sourceHash: hash,
38
+ ...(input.kotlinSerializer !== undefined ? { serializer: input.kotlinSerializer } : {}),
39
+ ...(input.unsupportedUnions !== undefined ? { unsupportedUnions: input.unsupportedUnions } : {}),
40
+ ...pickDefined(ajscPassthrough, AJSC_PASSTHROUGH_KEYS),
41
+ }, input.kotlinEmitter, errorSchemas);
42
+ files.push({ path: join(outDir, emitted.filename), code: emitted.code });
43
+ allSkipped.push(...emitted.skippedStreams);
44
+ }
45
+ if (allSkipped.length > 0) {
46
+ console.log(`[ts-procedures-codegen] Skipped ${allSkipped.length} stream route${allSkipped.length === 1 ? '' : 's'} (kotlin target): ${allSkipped.join(', ')}`);
47
+ }
48
+ await writeGeneratedFiles(files, outDir, { dryRun, cleanOutDir });
49
+ return files;
50
+ }
51
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/codegen/targets/kotlin/run.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAGxD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAUxD;;;;;GAKG;AACH,MAAM,qBAAqB,GAAG,CAAC,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAA;AAE7F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAqB;IAC3D,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,KAAK,CAAA;IAErF,qEAAqE;IACrE,2EAA2E;IAC3E,mEAAmE;IACnE,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,IAAI,KAAK,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,kHAAkH,CACnH,CAAA;IACH,CAAC;IAED,MAAM,YAAY,GAAG,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC1D,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAA;IAExC,MAAM,KAAK,GAAoB,EAAE,CAAA;IACjC,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,eAAe,CAC7B,KAAK,EACL;YACE,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,UAAU,EAAE,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvF,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChG,GAAG,WAAW,CAAC,eAAe,EAAE,qBAAqB,CAAC;SACvD,EACD,KAAK,CAAC,aAAa,EACnB,YAAY,CACb,CAAA;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACxE,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CACT,mCAAmC,UAAU,CAAC,MAAM,gBAAgB,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,qBAAqB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnJ,CAAA;IACH,CAAC;IAED,MAAM,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;IAEjE,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1 @@
1
+ export {};