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.
- package/agent_config/bin/setup.mjs +2 -2
- package/agent_config/claude-code/skills/ts-procedures/SKILL.md +1 -0
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +1 -1
- package/agent_config/claude-code/skills/ts-procedures-kotlin/SKILL.md +1 -1
- package/agent_config/claude-code/skills/ts-procedures-swift/SKILL.md +119 -0
- package/agent_config/copilot/copilot-instructions.md +1 -0
- package/agent_config/cursor/cursorrules +1 -0
- package/agent_config/lib/install-claude.mjs +1 -1
- package/build/codegen/bin/cli.d.ts +17 -3
- package/build/codegen/bin/cli.js +79 -3
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/index.d.ts +18 -1
- package/build/codegen/index.js +3 -0
- package/build/codegen/index.js.map +1 -1
- package/build/codegen/pipeline.d.ts +16 -5
- package/build/codegen/pipeline.js +44 -143
- package/build/codegen/pipeline.js.map +1 -1
- package/build/codegen/targets/_shared/error-schemas.d.ts +10 -0
- package/build/codegen/targets/_shared/error-schemas.js +17 -0
- package/build/codegen/targets/_shared/error-schemas.js.map +1 -0
- package/build/codegen/targets/_shared/error-schemas.test.d.ts +1 -0
- package/build/codegen/targets/_shared/error-schemas.test.js +38 -0
- package/build/codegen/targets/_shared/error-schemas.test.js.map +1 -0
- package/build/codegen/targets/_shared/indent.d.ts +6 -0
- package/build/codegen/targets/_shared/indent.js +13 -0
- package/build/codegen/targets/_shared/indent.js.map +1 -0
- package/build/codegen/targets/_shared/indent.test.d.ts +1 -0
- package/build/codegen/targets/_shared/indent.test.js +21 -0
- package/build/codegen/targets/_shared/indent.test.js.map +1 -0
- package/build/codegen/targets/_shared/pascal-case.d.ts +6 -0
- package/build/codegen/targets/_shared/pascal-case.js +13 -0
- package/build/codegen/targets/_shared/pascal-case.js.map +1 -0
- package/build/codegen/targets/_shared/pascal-case.test.d.ts +1 -0
- package/build/codegen/targets/_shared/pascal-case.test.js +25 -0
- package/build/codegen/targets/_shared/pascal-case.test.js.map +1 -0
- package/build/codegen/targets/_shared/path-utils.d.ts +12 -0
- package/build/codegen/targets/_shared/path-utils.js +20 -0
- package/build/codegen/targets/_shared/path-utils.js.map +1 -0
- package/build/codegen/targets/_shared/path-utils.test.d.ts +1 -0
- package/build/codegen/targets/_shared/path-utils.test.js +42 -0
- package/build/codegen/targets/_shared/path-utils.test.js.map +1 -0
- package/build/codegen/targets/_shared/pick-defined.d.ts +11 -0
- package/build/codegen/targets/_shared/pick-defined.js +21 -0
- package/build/codegen/targets/_shared/pick-defined.js.map +1 -0
- package/build/codegen/targets/_shared/pick-defined.test.d.ts +1 -0
- package/build/codegen/targets/_shared/pick-defined.test.js +25 -0
- package/build/codegen/targets/_shared/pick-defined.test.js.map +1 -0
- package/build/codegen/targets/_shared/route-slots.d.ts +17 -0
- package/build/codegen/targets/_shared/route-slots.js +17 -0
- package/build/codegen/targets/_shared/route-slots.js.map +1 -0
- package/build/codegen/targets/_shared/route-slots.test.d.ts +1 -0
- package/build/codegen/targets/_shared/route-slots.test.js +43 -0
- package/build/codegen/targets/_shared/route-slots.test.js.map +1 -0
- package/build/codegen/targets/_shared/target-run.d.ts +27 -0
- package/build/codegen/targets/_shared/target-run.js +2 -0
- package/build/codegen/targets/_shared/target-run.js.map +1 -0
- package/build/codegen/targets/_shared/write-files.d.ts +24 -0
- package/build/codegen/targets/_shared/write-files.js +35 -0
- package/build/codegen/targets/_shared/write-files.js.map +1 -0
- package/build/codegen/targets/_shared/write-files.test.d.ts +1 -0
- package/build/codegen/targets/_shared/write-files.test.js +79 -0
- package/build/codegen/targets/_shared/write-files.test.js.map +1 -0
- package/build/codegen/targets/kotlin/e2e-compile.test.js +1 -1
- package/build/codegen/targets/kotlin/e2e-compile.test.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.js +5 -22
- package/build/codegen/targets/kotlin/emit-route-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-scope-kotlin.js +4 -8
- package/build/codegen/targets/kotlin/emit-scope-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/format-kotlin.d.ts +0 -12
- package/build/codegen/targets/kotlin/format-kotlin.js +0 -27
- package/build/codegen/targets/kotlin/format-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/format-kotlin.test.js +1 -34
- package/build/codegen/targets/kotlin/format-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/integration.test.js +1 -1
- package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
- package/build/codegen/targets/kotlin/run.d.ts +11 -0
- package/build/codegen/targets/kotlin/run.js +51 -0
- package/build/codegen/targets/kotlin/run.js.map +1 -0
- package/build/codegen/targets/swift/access-level.test.d.ts +1 -0
- package/build/codegen/targets/swift/access-level.test.js +98 -0
- package/build/codegen/targets/swift/access-level.test.js.map +1 -0
- package/build/codegen/targets/swift/ajsc-adapter.d.ts +27 -0
- package/build/codegen/targets/swift/ajsc-adapter.js +38 -0
- package/build/codegen/targets/swift/ajsc-adapter.js.map +1 -0
- package/build/codegen/targets/swift/ajsc-adapter.test.d.ts +1 -0
- package/build/codegen/targets/swift/ajsc-adapter.test.js +37 -0
- package/build/codegen/targets/swift/ajsc-adapter.test.js.map +1 -0
- package/build/codegen/targets/swift/e2e-compile.test.d.ts +1 -0
- package/build/codegen/targets/swift/e2e-compile.test.js +57 -0
- package/build/codegen/targets/swift/e2e-compile.test.js.map +1 -0
- package/build/codegen/targets/swift/emit-route-swift.d.ts +15 -0
- package/build/codegen/targets/swift/emit-route-swift.js +64 -0
- package/build/codegen/targets/swift/emit-route-swift.js.map +1 -0
- package/build/codegen/targets/swift/emit-route-swift.test.d.ts +1 -0
- package/build/codegen/targets/swift/emit-route-swift.test.js +258 -0
- package/build/codegen/targets/swift/emit-route-swift.test.js.map +1 -0
- package/build/codegen/targets/swift/emit-scope-swift.d.ts +13 -0
- package/build/codegen/targets/swift/emit-scope-swift.js +36 -0
- package/build/codegen/targets/swift/emit-scope-swift.js.map +1 -0
- package/build/codegen/targets/swift/emit-scope-swift.test.d.ts +1 -0
- package/build/codegen/targets/swift/emit-scope-swift.test.js +136 -0
- package/build/codegen/targets/swift/emit-scope-swift.test.js.map +1 -0
- package/build/codegen/targets/swift/format-swift.d.ts +2 -0
- package/build/codegen/targets/swift/format-swift.js +10 -0
- package/build/codegen/targets/swift/format-swift.js.map +1 -0
- package/build/codegen/targets/swift/format-swift.test.d.ts +1 -0
- package/build/codegen/targets/swift/format-swift.test.js +14 -0
- package/build/codegen/targets/swift/format-swift.test.js.map +1 -0
- package/build/codegen/targets/swift/integration.test.d.ts +1 -0
- package/build/codegen/targets/swift/integration.test.js +53 -0
- package/build/codegen/targets/swift/integration.test.js.map +1 -0
- package/build/codegen/targets/swift/run.d.ts +11 -0
- package/build/codegen/targets/swift/run.js +47 -0
- package/build/codegen/targets/swift/run.js.map +1 -0
- package/build/codegen/targets/ts/run.d.ts +4 -0
- package/build/codegen/targets/ts/run.js +86 -0
- package/build/codegen/targets/ts/run.js.map +1 -0
- package/docs/codegen-kotlin.md +1 -0
- package/docs/codegen-swift.md +314 -0
- package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +1 -1
- package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +1 -1
- package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +264 -0
- package/package.json +2 -2
- package/src/codegen/bin/cli.ts +91 -7
- package/src/codegen/index.ts +24 -1
- package/src/codegen/pipeline.ts +52 -174
- package/src/codegen/targets/_shared/error-schemas.test.ts +42 -0
- package/src/codegen/targets/_shared/error-schemas.ts +17 -0
- package/src/codegen/targets/_shared/indent.test.ts +25 -0
- package/src/codegen/targets/_shared/indent.ts +12 -0
- package/src/codegen/targets/_shared/pascal-case.test.ts +30 -0
- package/src/codegen/targets/_shared/pascal-case.ts +12 -0
- package/src/codegen/targets/_shared/path-utils.test.ts +51 -0
- package/src/codegen/targets/_shared/path-utils.ts +21 -0
- package/src/codegen/targets/_shared/pick-defined.test.ts +48 -0
- package/src/codegen/targets/_shared/pick-defined.ts +23 -0
- package/src/codegen/targets/_shared/route-slots.test.ts +55 -0
- package/src/codegen/targets/_shared/route-slots.ts +32 -0
- package/src/codegen/targets/_shared/target-run.ts +28 -0
- package/src/codegen/targets/_shared/write-files.test.ts +110 -0
- package/src/codegen/targets/_shared/write-files.ts +53 -0
- package/src/codegen/targets/kotlin/e2e-compile.test.ts +1 -1
- package/src/codegen/targets/kotlin/emit-route-kotlin.ts +5 -25
- package/src/codegen/targets/kotlin/emit-scope-kotlin.ts +4 -9
- package/src/codegen/targets/kotlin/format-kotlin.test.ts +0 -44
- package/src/codegen/targets/kotlin/format-kotlin.ts +0 -32
- package/src/codegen/targets/kotlin/integration.test.ts +1 -1
- package/src/codegen/targets/kotlin/run.ts +78 -0
- package/src/codegen/targets/swift/__fixtures__/users-golden.swift +123 -0
- package/src/codegen/targets/swift/access-level.test.ts +108 -0
- package/src/codegen/targets/swift/ajsc-adapter.test.ts +47 -0
- package/src/codegen/targets/swift/ajsc-adapter.ts +67 -0
- package/src/codegen/targets/swift/e2e-compile.test.ts +66 -0
- package/src/codegen/targets/swift/emit-route-swift.test.ts +300 -0
- package/src/codegen/targets/swift/emit-route-swift.ts +90 -0
- package/src/codegen/targets/swift/emit-scope-swift.test.ts +164 -0
- package/src/codegen/targets/swift/emit-scope-swift.ts +59 -0
- package/src/codegen/targets/swift/format-swift.test.ts +23 -0
- package/src/codegen/targets/swift/format-swift.ts +9 -0
- package/src/codegen/targets/swift/integration.test.ts +80 -0
- package/src/codegen/targets/swift/run.ts +74 -0
- package/src/codegen/targets/ts/run.ts +117 -0
- /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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
export {};
|
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,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,8BAA8B,EAAE,MAAM,mBAAmB,CAAA;AAElE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,SAAS,gBAAgB;IACvB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACjD,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAA;AAExD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACxD,EAAE,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CACpC,0CAA0C,EAC1C,KAAK,IAAI,EAAE;QACT,MAAM,OAAO,GAAG,MAAM,8BAA8B,EAAE,CAAA;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,
|
|
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
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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
|
|
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":"AAEA,OAAO,EAAE,MAAM,EAAE,
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
|
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,
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,aAAa,
|
|
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,
|
|
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 {};
|