ts-procedures 6.0.2 → 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 +2 -0
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +2 -0
- package/agent_config/claude-code/skills/ts-procedures-kotlin/SKILL.md +106 -0
- package/agent_config/claude-code/skills/ts-procedures-swift/SKILL.md +119 -0
- package/agent_config/copilot/copilot-instructions.md +3 -0
- package/agent_config/cursor/cursorrules +3 -0
- package/agent_config/lib/install-claude.mjs +1 -1
- package/build/codegen/bin/cli.d.ts +39 -0
- package/build/codegen/bin/cli.js +164 -0
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/bin/cli.test.js +180 -1
- package/build/codegen/bin/cli.test.js.map +1 -1
- package/build/codegen/index.d.ts +36 -0
- package/build/codegen/index.js +8 -0
- package/build/codegen/index.js.map +1 -1
- package/build/codegen/pipeline.d.ts +22 -4
- package/build/codegen/pipeline.js +44 -86
- package/build/codegen/pipeline.js.map +1 -1
- package/build/codegen/pipeline.test.js +162 -0
- package/build/codegen/pipeline.test.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/ajsc-adapter.d.ts +6 -4
- package/build/codegen/targets/kotlin/ajsc-adapter.js +12 -7
- package/build/codegen/targets/kotlin/ajsc-adapter.js.map +1 -1
- package/build/codegen/targets/kotlin/ajsc-adapter.test.js +20 -2
- package/build/codegen/targets/kotlin/ajsc-adapter.test.js.map +1 -1
- package/build/codegen/targets/kotlin/e2e-compile.test.js +41 -9
- package/build/codegen/targets/kotlin/e2e-compile.test.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +6 -2
- package/build/codegen/targets/kotlin/emit-route-kotlin.js +18 -28
- package/build/codegen/targets/kotlin/emit-route-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.test.js +120 -1
- package/build/codegen/targets/kotlin/emit-route-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-scope-kotlin.d.ts +4 -1
- package/build/codegen/targets/kotlin/emit-scope-kotlin.js +12 -11
- package/build/codegen/targets/kotlin/emit-scope-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js +39 -0
- package/build/codegen/targets/kotlin/emit-scope-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/format-kotlin.d.ts +0 -1
- package/build/codegen/targets/kotlin/format-kotlin.js +0 -7
- package/build/codegen/targets/kotlin/format-kotlin.js.map +1 -1
- package/build/codegen/targets/kotlin/format-kotlin.test.js +1 -8
- package/build/codegen/targets/kotlin/format-kotlin.test.js.map +1 -1
- package/build/codegen/targets/kotlin/integration.test.js +27 -10
- package/build/codegen/targets/kotlin/integration.test.js.map +1 -1
- package/build/codegen/targets/kotlin/probe-unsupported-unions.test.d.ts +1 -0
- package/build/codegen/targets/kotlin/probe-unsupported-unions.test.js +50 -0
- package/build/codegen/targets/kotlin/probe-unsupported-unions.test.js.map +1 -0
- 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/build/codegen/test-helpers/golden.d.ts +15 -0
- package/build/codegen/test-helpers/golden.js +30 -0
- package/build/codegen/test-helpers/golden.js.map +1 -0
- package/build/codegen/test-helpers/golden.test.d.ts +1 -0
- package/build/codegen/test-helpers/golden.test.js +76 -0
- package/build/codegen/test-helpers/golden.test.js.map +1 -0
- package/docs/codegen-kotlin.md +176 -0
- package/docs/codegen-swift.md +314 -0
- package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +1993 -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 +314 -0
- package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +264 -0
- package/package.json +2 -2
- package/src/codegen/__fixtures__/users-envelope.json +144 -0
- package/src/codegen/bin/cli.test.ts +200 -1
- package/src/codegen/bin/cli.ts +187 -0
- package/src/codegen/index.ts +50 -0
- package/src/codegen/pipeline.test.ts +175 -0
- package/src/codegen/pipeline.ts +58 -101
- 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/__fixtures__/users-golden.kt +121 -0
- package/src/codegen/targets/kotlin/__snapshots__/probe-unsupported-unions.test.ts.snap +27 -0
- package/src/codegen/targets/kotlin/ajsc-adapter.test.ts +47 -0
- package/src/codegen/targets/kotlin/ajsc-adapter.ts +66 -0
- package/src/codegen/targets/kotlin/e2e-compile.test.ts +86 -0
- package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +239 -0
- package/src/codegen/targets/kotlin/emit-route-kotlin.ts +89 -0
- package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +112 -0
- package/src/codegen/targets/kotlin/emit-scope-kotlin.ts +60 -0
- package/src/codegen/targets/kotlin/format-kotlin.test.ts +26 -0
- package/src/codegen/targets/kotlin/format-kotlin.ts +13 -0
- package/src/codegen/targets/kotlin/integration.test.ts +77 -0
- package/src/codegen/targets/kotlin/probe-unsupported-unions.test.ts +64 -0
- 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/test-helpers/golden.test.ts +80 -0
- package/src/codegen/test-helpers/golden.ts +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-route-swift.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/emit-route-swift.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ScopeGroup } from '../../group-routes.js';
|
|
2
|
+
import type { SwiftEmitter } from './ajsc-adapter.js';
|
|
3
|
+
import { type EmitRouteOpts } from './emit-route-swift.js';
|
|
4
|
+
export interface EmitScopeOptions extends EmitRouteOpts {
|
|
5
|
+
sourceHash: string;
|
|
6
|
+
}
|
|
7
|
+
export interface EmittedSwiftFile {
|
|
8
|
+
filename: string;
|
|
9
|
+
code: string;
|
|
10
|
+
/** Names of stream routes within this scope that were skipped. */
|
|
11
|
+
skippedStreams: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function emitSwiftScope(group: ScopeGroup, opts: EmitScopeOptions, emitter: SwiftEmitter, errorSchemas: Map<string, unknown>): EmittedSwiftFile;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { emitSwiftRoute } from './emit-route-swift.js';
|
|
2
|
+
import { swiftHeader, swiftImports } from './format-swift.js';
|
|
3
|
+
import { indent } from '../_shared/indent.js';
|
|
4
|
+
import { pickDefined } from '../_shared/pick-defined.js';
|
|
5
|
+
import { pascalCase } from '../_shared/pascal-case.js';
|
|
6
|
+
export function emitSwiftScope(group, opts, emitter, errorSchemas) {
|
|
7
|
+
const scopeName = pascalCase(group.scopeKey);
|
|
8
|
+
const access = opts.accessLevel ?? 'public';
|
|
9
|
+
const allImports = [];
|
|
10
|
+
const routeBlocks = [];
|
|
11
|
+
const skippedStreams = [];
|
|
12
|
+
const PASSTHROUGH_KEYS = ['serializer', 'accessLevel', 'unsupportedUnions', 'arrayItemNaming', 'depluralize', 'uncountableWords'];
|
|
13
|
+
const routeOpts = pickDefined(opts, PASSTHROUGH_KEYS);
|
|
14
|
+
for (const route of group.routes) {
|
|
15
|
+
const r = emitSwiftRoute(route, emitter, errorSchemas, routeOpts);
|
|
16
|
+
if (r.skipped) {
|
|
17
|
+
skippedStreams.push(r.routeName);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
allImports.push(...r.imports);
|
|
21
|
+
const wrapped = `${access} enum ${r.routeName} {\n${indent(r.code, 1)}\n}`;
|
|
22
|
+
routeBlocks.push(wrapped);
|
|
23
|
+
}
|
|
24
|
+
const innerScope = routeBlocks.length === 0 ? '' : indent(routeBlocks.join('\n\n'), 1);
|
|
25
|
+
const scopeBlock = innerScope === ''
|
|
26
|
+
? `${access} enum ${scopeName} {\n}`
|
|
27
|
+
: `${access} enum ${scopeName} {\n${innerScope}\n}`;
|
|
28
|
+
const importsBlock = swiftImports(allImports);
|
|
29
|
+
const parts = [
|
|
30
|
+
swiftHeader(opts.sourceHash),
|
|
31
|
+
importsBlock,
|
|
32
|
+
scopeBlock,
|
|
33
|
+
].filter((p) => p.length > 0);
|
|
34
|
+
return { filename: `${scopeName}.swift`, code: parts.join('\n\n') + '\n', skippedStreams };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=emit-scope-swift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-scope-swift.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/emit-scope-swift.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAsB,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAatD,MAAM,UAAU,cAAc,CAC5B,KAAiB,EACjB,IAAsB,EACtB,OAAqB,EACrB,YAAkC;IAElC,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAA;IAC3C,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,aAAa,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAA;IAC1I,MAAM,SAAS,GAAkB,WAAW,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IAEpE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;QACjE,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,GAAG,MAAM,SAAS,CAAC,CAAC,SAAS,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAA;QAC1E,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,GAAG,MAAM,SAAS,SAAS,OAAO;QACpC,CAAC,CAAC,GAAG,MAAM,SAAS,SAAS,OAAO,UAAU,KAAK,CAAA;IAErD,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;IAC7C,MAAM,KAAK,GAAG;QACZ,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;QAC5B,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,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,cAAc,EAAE,CAAA;AAC5F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { emitSwiftScope } from './emit-scope-swift.js';
|
|
3
|
+
import { createStubSwiftEmitter } from './ajsc-adapter.js';
|
|
4
|
+
const ok = (code, rootTypeName) => ({
|
|
5
|
+
code,
|
|
6
|
+
rootTypeName,
|
|
7
|
+
extractedTypeNames: [],
|
|
8
|
+
imports: ['Foundation'],
|
|
9
|
+
});
|
|
10
|
+
describe('emitSwiftScope', () => {
|
|
11
|
+
it('produces a complete swift source file for a single-route scope', () => {
|
|
12
|
+
const route = {
|
|
13
|
+
kind: 'api',
|
|
14
|
+
name: 'GetUser',
|
|
15
|
+
method: 'GET',
|
|
16
|
+
fullPath: '/users/:id',
|
|
17
|
+
schema: { input: { pathParams: { type: 'object' } }, returnType: { type: 'object' } },
|
|
18
|
+
errors: [],
|
|
19
|
+
};
|
|
20
|
+
const group = { scopeKey: 'users', camelCase: 'users', routes: [route] };
|
|
21
|
+
const emitter = createStubSwiftEmitter({
|
|
22
|
+
PathParams: ok('public struct PathParams: Codable { public let id: String }', 'PathParams'),
|
|
23
|
+
Response: ok('public struct Response: Codable { public let id: String }', 'Response'),
|
|
24
|
+
});
|
|
25
|
+
const file = emitSwiftScope(group, { sourceHash: 'abc123' }, emitter, new Map());
|
|
26
|
+
expect(file.filename).toBe('Users.swift');
|
|
27
|
+
expect(file.code).toContain('// Generated by ts-procedures-codegen — do not edit.');
|
|
28
|
+
expect(file.code).toContain('// Source hash: abc123');
|
|
29
|
+
expect(file.code).toContain('import Foundation');
|
|
30
|
+
expect(file.code).toContain('public enum Users {');
|
|
31
|
+
expect(file.code).toContain('public enum GetUser {');
|
|
32
|
+
expect(file.code).toContain('public static let method = "GET"');
|
|
33
|
+
expect(file.code).not.toContain('package ');
|
|
34
|
+
});
|
|
35
|
+
it('joins multiple routes inside one scope enum, separated by a blank line', () => {
|
|
36
|
+
const route1 = { kind: 'api', name: 'GetUser', method: 'GET', fullPath: '/users/:id', schema: {}, errors: [] };
|
|
37
|
+
const route2 = { kind: 'api', name: 'CreateUser', method: 'POST', fullPath: '/users', schema: {}, errors: [] };
|
|
38
|
+
const group = { scopeKey: 'users', camelCase: 'users', routes: [route1, route2] };
|
|
39
|
+
const emitter = createStubSwiftEmitter({});
|
|
40
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, emitter, new Map());
|
|
41
|
+
expect(file.code).toContain('public enum GetUser {');
|
|
42
|
+
expect(file.code).toContain('public enum CreateUser {');
|
|
43
|
+
// exactly one outer scope enum
|
|
44
|
+
expect((file.code.match(/^public enum Users \{/gm) ?? []).length).toBe(1);
|
|
45
|
+
});
|
|
46
|
+
it('uses PascalCase scope name for the filename and outer enum', () => {
|
|
47
|
+
const group = { scopeKey: 'admin-users', camelCase: 'adminUsers', routes: [] };
|
|
48
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, createStubSwiftEmitter({}), new Map());
|
|
49
|
+
expect(file.filename).toBe('AdminUsers.swift');
|
|
50
|
+
expect(file.code).toContain('public enum AdminUsers {');
|
|
51
|
+
});
|
|
52
|
+
it('PascalCases multi-segment kebab scope keys', () => {
|
|
53
|
+
const group = { scopeKey: 'admin-settings', camelCase: 'adminSettings', routes: [] };
|
|
54
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, createStubSwiftEmitter({}), new Map());
|
|
55
|
+
expect(file.filename).toBe('AdminSettings.swift');
|
|
56
|
+
expect(file.code).toContain('public enum AdminSettings {');
|
|
57
|
+
});
|
|
58
|
+
it('emits an empty scope enum body when there are no non-stream routes', () => {
|
|
59
|
+
const group = { scopeKey: 'empty', camelCase: 'empty', routes: [] };
|
|
60
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, createStubSwiftEmitter({}), new Map());
|
|
61
|
+
expect(file.code).toContain('public enum Empty {\n}');
|
|
62
|
+
});
|
|
63
|
+
it('dedupes and sorts imports across all routes in the scope', () => {
|
|
64
|
+
const route1 = { kind: 'api', name: 'A', method: 'GET', fullPath: '/a', schema: { returnType: { type: 'object' } }, errors: [] };
|
|
65
|
+
const route2 = { kind: 'api', name: 'B', method: 'GET', fullPath: '/b', schema: { returnType: { type: 'object' } }, errors: [] };
|
|
66
|
+
const group = { scopeKey: 'multi', camelCase: 'multi', routes: [route1, route2] };
|
|
67
|
+
const emitter = {
|
|
68
|
+
emit(_s, opts) {
|
|
69
|
+
if (opts.rootTypeName === 'Response') {
|
|
70
|
+
return { code: `public struct Response { }`, rootTypeName: 'Response', extractedTypeNames: [], imports: ['Foundation', 'CommonCrypto'] };
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`No stub for ${opts.rootTypeName}`);
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, emitter, new Map());
|
|
76
|
+
// Should appear once per unique import, sorted alphabetically.
|
|
77
|
+
const imports = file.code.split('\n').filter((l) => l.startsWith('import '));
|
|
78
|
+
expect(imports).toEqual(['import CommonCrypto', 'import Foundation']);
|
|
79
|
+
});
|
|
80
|
+
it('threads all 6 passthrough opts to every emitter call', () => {
|
|
81
|
+
const route = { kind: 'api', name: 'X', method: 'GET', fullPath: '/x', schema: { returnType: { type: 'object' } }, errors: [] };
|
|
82
|
+
const group = { scopeKey: 'x', camelCase: 'x', routes: [route] };
|
|
83
|
+
const calls = [];
|
|
84
|
+
const emitter = {
|
|
85
|
+
emit(_s, opts) {
|
|
86
|
+
calls.push(opts);
|
|
87
|
+
return { code: 'public struct Response', rootTypeName: 'Response', extractedTypeNames: [], imports: [] };
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
emitSwiftScope(group, {
|
|
91
|
+
sourceHash: 'h',
|
|
92
|
+
serializer: 'none',
|
|
93
|
+
accessLevel: 'internal',
|
|
94
|
+
unsupportedUnions: 'fallback',
|
|
95
|
+
arrayItemNaming: false,
|
|
96
|
+
depluralize: true,
|
|
97
|
+
uncountableWords: ['data', 'metadata'],
|
|
98
|
+
}, emitter, new Map());
|
|
99
|
+
expect(calls.length).toBe(1);
|
|
100
|
+
expect(calls[0].inlineTypes).toBe(true);
|
|
101
|
+
expect(calls[0].serializer).toBe('none');
|
|
102
|
+
expect(calls[0].accessLevel).toBe('internal');
|
|
103
|
+
expect(calls[0].unsupportedUnions).toBe('fallback');
|
|
104
|
+
expect(calls[0].arrayItemNaming).toBe(false);
|
|
105
|
+
expect(calls[0].depluralize).toBe(true);
|
|
106
|
+
expect(calls[0].uncountableWords).toEqual(['data', 'metadata']);
|
|
107
|
+
});
|
|
108
|
+
it('applies accessLevel to the outer scope enum and the route enum wrappers', () => {
|
|
109
|
+
const route = { kind: 'api', name: 'GetUser', method: 'GET', fullPath: '/users', schema: {}, errors: [] };
|
|
110
|
+
const group = { scopeKey: 'users', camelCase: 'users', routes: [route] };
|
|
111
|
+
const emitter = createStubSwiftEmitter({});
|
|
112
|
+
const file = emitSwiftScope(group, { sourceHash: 'h', accessLevel: 'internal' }, emitter, new Map());
|
|
113
|
+
expect(file.code).toContain('internal enum Users {');
|
|
114
|
+
expect(file.code).toContain('internal enum GetUser {');
|
|
115
|
+
expect(file.code).toContain('internal static let method = "GET"');
|
|
116
|
+
expect(file.code).not.toContain('public enum');
|
|
117
|
+
});
|
|
118
|
+
it('collects skipped stream-route names', () => {
|
|
119
|
+
const stream = { kind: 'stream', name: 'WatchUsers', method: 'GET', path: '/u/stream', schema: {}, errors: [] };
|
|
120
|
+
const api = { kind: 'api', name: 'GetUser', method: 'GET', fullPath: '/u', schema: { returnType: { type: 'object' } }, errors: [] };
|
|
121
|
+
const group = { scopeKey: 'u', camelCase: 'u', routes: [stream, api] };
|
|
122
|
+
const emitter = createStubSwiftEmitter({
|
|
123
|
+
Response: ok('public struct Response: Codable { public let id: String }', 'Response'),
|
|
124
|
+
});
|
|
125
|
+
const result = emitSwiftScope(group, { sourceHash: 'h' }, emitter, new Map());
|
|
126
|
+
expect(result.skippedStreams).toEqual(['WatchUsers']);
|
|
127
|
+
expect(result.code).toContain('public enum GetUser');
|
|
128
|
+
expect(result.code).not.toContain('public enum WatchUsers');
|
|
129
|
+
});
|
|
130
|
+
it('terminates the file with a trailing newline', () => {
|
|
131
|
+
const group = { scopeKey: 'x', camelCase: 'x', routes: [] };
|
|
132
|
+
const file = emitSwiftScope(group, { sourceHash: 'h' }, createStubSwiftEmitter({}), new Map());
|
|
133
|
+
expect(file.code.endsWith('\n')).toBe(true);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=emit-scope-swift.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-scope-swift.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/emit-scope-swift.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function swiftHeader(sourceHash) {
|
|
2
|
+
return `// Generated by ts-procedures-codegen — do not edit.\n// Source hash: ${sourceHash}`;
|
|
3
|
+
}
|
|
4
|
+
export function swiftImports(imports) {
|
|
5
|
+
if (imports.length === 0)
|
|
6
|
+
return '';
|
|
7
|
+
const unique = Array.from(new Set(imports)).sort();
|
|
8
|
+
return unique.map((i) => `import ${i}`).join('\n');
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=format-swift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-swift.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/format-swift.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,yEAAyE,UAAU,EAAE,CAAA;AAC9F,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAiB;IAC5C,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { swiftHeader, swiftImports, } from './format-swift.js';
|
|
3
|
+
describe('format-swift', () => {
|
|
4
|
+
it('emits a two-line generated header with source hash', () => {
|
|
5
|
+
expect(swiftHeader('abc123')).toBe('// Generated by ts-procedures-codegen — do not edit.\n// Source hash: abc123');
|
|
6
|
+
});
|
|
7
|
+
it('dedupes and sorts imports', () => {
|
|
8
|
+
expect(swiftImports(['Foundation', 'Foundation', 'CommonCrypto'])).toBe('import CommonCrypto\nimport Foundation');
|
|
9
|
+
});
|
|
10
|
+
it('returns empty string when no imports', () => {
|
|
11
|
+
expect(swiftImports([])).toBe('');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=format-swift.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-swift.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/format-swift.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EACL,WAAW,EACX,YAAY,GACb,MAAM,mBAAmB,CAAA;AAE1B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAChC,8EAA8E,CAC/E,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CACrE,wCAAwC,CACzC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { runPipeline } from '../../pipeline.js';
|
|
6
|
+
import { assertGoldenOrUpdate } from '../../test-helpers/golden.js';
|
|
7
|
+
import { createStubSwiftEmitter } from './ajsc-adapter.js';
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = dirname(__filename);
|
|
10
|
+
const ok = (code, rootTypeName, imports = []) => ({
|
|
11
|
+
code,
|
|
12
|
+
rootTypeName,
|
|
13
|
+
extractedTypeNames: [],
|
|
14
|
+
imports,
|
|
15
|
+
});
|
|
16
|
+
describe('swift codegen — integration', () => {
|
|
17
|
+
it('produces byte-identical output against the golden fixture', async () => {
|
|
18
|
+
const envelopePath = join(__dirname, '../../__fixtures__/users-envelope.json');
|
|
19
|
+
const goldenPath = join(__dirname, '__fixtures__/users-golden.swift');
|
|
20
|
+
const envelope = JSON.parse(await readFile(envelopePath, 'utf8'));
|
|
21
|
+
// Hand-authored slot outputs in the v7.2 nested-struct shape (inlineTypes: true).
|
|
22
|
+
//
|
|
23
|
+
// The stub map is keyed on rootTypeName, NOT on (route, slot). Both GetUser
|
|
24
|
+
// and CreateUser have a slot named "Response" — they intentionally share the
|
|
25
|
+
// single stub entry below. The golden file therefore shows three identical
|
|
26
|
+
// Response structs (one per route that has one). This is correct: the
|
|
27
|
+
// integration test pins our file-assembly logic, not real ajsc per-route
|
|
28
|
+
// output. The swiftc E2E test exercises real ajsc against the same fixture
|
|
29
|
+
// and would surface any incompatibility.
|
|
30
|
+
const emitter = createStubSwiftEmitter({
|
|
31
|
+
// GetUser
|
|
32
|
+
PathParams: ok('public struct PathParams: Codable {\n public let id: String\n}', 'PathParams'),
|
|
33
|
+
Response: ok('public struct Response: Codable {\n public let id: String\n public let name: String\n public let createdAt: Date\n public let address: Address\n\n enum CodingKeys: String, CodingKey {\n case id, name\n case createdAt = "created-at"\n case address\n }\n\n public struct Address: Codable {\n public let street: String\n public let city: String\n }\n}', 'Response', ['Foundation']),
|
|
34
|
+
NotFound: ok('public struct NotFound: Codable {\n public let name: String\n public let message: String\n}', 'NotFound'),
|
|
35
|
+
// CreateUser
|
|
36
|
+
Body: ok('public enum Body: Codable {\n case guest(GuestBody)\n case registered(RegisteredBody)\n\n public struct GuestBody: Codable {\n public let kind: String\n public let displayName: String\n }\n\n public struct RegisteredBody: Codable {\n public let kind: String\n public let email: String\n public let name: String\n }\n}', 'Body'),
|
|
37
|
+
ValidationError: ok('public struct ValidationError: Codable {\n public let name: String\n public let message: String\n public let field: String?\n}', 'ValidationError'),
|
|
38
|
+
// ListUsers
|
|
39
|
+
Query: ok('public struct Query: Codable {\n public let status: Status?\n public let limit: Int64?\n\n public enum Status: String, Codable {\n case active\n case inactive\n }\n}', 'Query'),
|
|
40
|
+
});
|
|
41
|
+
const files = await runPipeline({
|
|
42
|
+
envelope,
|
|
43
|
+
outDir: 'out',
|
|
44
|
+
dryRun: true,
|
|
45
|
+
target: 'swift',
|
|
46
|
+
swiftEmitter: emitter,
|
|
47
|
+
});
|
|
48
|
+
expect(files).toHaveLength(1);
|
|
49
|
+
expect(files[0].path).toBe(join('out', 'Users.swift'));
|
|
50
|
+
await assertGoldenOrUpdate(files[0].code, goldenPath);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/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,sBAAsB,EAAwB,MAAM,mBAAmB,CAAA;AAEhF,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,EAAE,EAAmB,EAAE,CAAC,CAAC;IAC3F,IAAI;IACJ,YAAY;IACZ,kBAAkB,EAAE,EAAE;IACtB,OAAO;CACR,CAAC,CAAA;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,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,iCAAiC,CAAC,CAAA;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;QAEjE,kFAAkF;QAClF,EAAE;QACF,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,sEAAsE;QACtE,yEAAyE;QACzE,2EAA2E;QAC3E,yCAAyC;QACzC,MAAM,OAAO,GAAG,sBAAsB,CAAC;YACrC,UAAU;YACV,UAAU,EAAE,EAAE,CACZ,mEAAmE,EACnE,YAAY,CACb;YACD,QAAQ,EAAE,EAAE,CACV,yZAAyZ,EACzZ,UAAU,EACV,CAAC,YAAY,CAAC,CACf;YACD,QAAQ,EAAE,EAAE,CACV,mGAAmG,EACnG,UAAU,CACX;YAED,aAAa;YACb,IAAI,EAAE,EAAE,CACN,oXAAoX,EACpX,MAAM,CACP;YACD,eAAe,EAAE,EAAE,CACjB,yIAAyI,EACzI,iBAAiB,CAClB;YAED,YAAY;YACZ,KAAK,EAAE,EAAE,CACP,iMAAiM,EACjM,OAAO,CACR;SACF,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;YAC9B,QAAQ;YACR,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,OAAO;YACf,YAAY,EAAE,OAAO;SACtB,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,aAAa,CAAC,CAAC,CAAA;QAEvD,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 { SwiftEmitter } from './ajsc-adapter.js';
|
|
4
|
+
export interface SwiftRunInput extends TargetRunInput {
|
|
5
|
+
swiftSerializer?: 'codable' | 'none';
|
|
6
|
+
swiftAccessLevel?: 'public' | 'internal';
|
|
7
|
+
unsupportedUnions?: 'throw' | 'fallback';
|
|
8
|
+
/** Injected for tests; production wiring resolves a real ajsc emitter. */
|
|
9
|
+
swiftEmitter?: SwiftEmitter;
|
|
10
|
+
}
|
|
11
|
+
export declare function runSwiftPipeline(input: SwiftRunInput): Promise<GeneratedFile[]>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swift-target pipeline runner. Invoked by the dispatcher in
|
|
3
|
+
* `src/codegen/pipeline.ts` when `target === 'swift'`. Emits one `.swift`
|
|
4
|
+
* file per scope via `emitSwiftScope` 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 { emitSwiftScope } from './emit-scope-swift.js';
|
|
12
|
+
/**
|
|
13
|
+
* `--array-item-naming`, `--depluralize`, `--uncountable-words` are reused
|
|
14
|
+
* across targets. The CLI parks them on `options.ajsc`; copy the relevant
|
|
15
|
+
* subset onto the scope opts here.
|
|
16
|
+
*/
|
|
17
|
+
const AJSC_PASSTHROUGH_KEYS = ['arrayItemNaming', 'depluralize', 'uncountableWords'];
|
|
18
|
+
export async function runSwiftPipeline(input) {
|
|
19
|
+
const { envelope, outDir, hash, groups, dryRun = false, cleanOutDir = false } = input;
|
|
20
|
+
// Runtime guard for non-CLI callers (direct API consumers + tests).
|
|
21
|
+
// The CLI resolves the emitter before calling runPipeline, so end users
|
|
22
|
+
// never hit this throw. Swift currently has no required CLI flags.
|
|
23
|
+
if (input.swiftEmitter == null) {
|
|
24
|
+
throw new Error('[ts-procedures-codegen] target=swift requires a swiftEmitter (CLI resolves via resolveProductionSwiftEmitter)');
|
|
25
|
+
}
|
|
26
|
+
const errorSchemas = buildErrorSchemasMap(envelope.errors);
|
|
27
|
+
const ajscPassthrough = input.ajsc ?? {};
|
|
28
|
+
const files = [];
|
|
29
|
+
const allSkipped = [];
|
|
30
|
+
for (const group of groups) {
|
|
31
|
+
const emitted = emitSwiftScope(group, {
|
|
32
|
+
sourceHash: hash,
|
|
33
|
+
...(input.swiftSerializer !== undefined ? { serializer: input.swiftSerializer } : {}),
|
|
34
|
+
...(input.swiftAccessLevel !== undefined ? { accessLevel: input.swiftAccessLevel } : {}),
|
|
35
|
+
...(input.unsupportedUnions !== undefined ? { unsupportedUnions: input.unsupportedUnions } : {}),
|
|
36
|
+
...pickDefined(ajscPassthrough, AJSC_PASSTHROUGH_KEYS),
|
|
37
|
+
}, input.swiftEmitter, errorSchemas);
|
|
38
|
+
files.push({ path: join(outDir, emitted.filename), code: emitted.code });
|
|
39
|
+
allSkipped.push(...emitted.skippedStreams);
|
|
40
|
+
}
|
|
41
|
+
if (allSkipped.length > 0) {
|
|
42
|
+
console.log(`[ts-procedures-codegen] Skipped ${allSkipped.length} stream route${allSkipped.length === 1 ? '' : 's'} (swift target): ${allSkipped.join(', ')}`);
|
|
43
|
+
}
|
|
44
|
+
await writeGeneratedFiles(files, outDir, { dryRun, cleanOutDir });
|
|
45
|
+
return files;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/codegen/targets/swift/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,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAUtD;;;;GAIG;AACH,MAAM,qBAAqB,GAAG,CAAC,iBAAiB,EAAE,aAAa,EAAE,kBAAkB,CAAU,CAAA;AAE7F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAoB;IACzD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,KAAK,CAAA;IAErF,oEAAoE;IACpE,wEAAwE;IACxE,mEAAmE;IACnE,IAAI,KAAK,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,+GAA+G,CAChH,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,cAAc,CAC5B,KAAK,EACL;YACE,UAAU,EAAE,IAAI;YAChB,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,KAAK,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,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,YAAY,EAClB,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,oBAAoB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClJ,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,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript-target pipeline runner. Invoked by the dispatcher in
|
|
3
|
+
* `src/codegen/pipeline.ts` when `target` is `'ts'` (or unset). Emits the
|
|
4
|
+
* scope `.ts` files, `_errors.ts`, `index.ts`, and — under self-contained
|
|
5
|
+
* mode — `_types.ts` + `_client.ts`, then commits via the shared
|
|
6
|
+
* `writeGeneratedFiles` tail.
|
|
7
|
+
*/
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { writeGeneratedFiles } from '../_shared/write-files.js';
|
|
10
|
+
import { emitScopeFile } from '../../emit-scope.js';
|
|
11
|
+
import { emitIndexFile } from '../../emit-index.js';
|
|
12
|
+
import { emitErrorsFile } from '../../emit-errors.js';
|
|
13
|
+
import { emitClientTypesFile } from '../../emit-client-types.js';
|
|
14
|
+
import { emitClientRuntimeFile } from '../../emit-client-runtime.js';
|
|
15
|
+
export async function runTsPipeline(input) {
|
|
16
|
+
const { envelope, outDir, hash, groups, serviceName, ajsc: ajscOpts, clientImportPath, dryRun = false, namespaceTypes = false, selfContained = false, cleanOutDir = false, } = input;
|
|
17
|
+
const hashComment = `// Source hash: ${hash}`;
|
|
18
|
+
// Error keys that will be emitted in `_errors.ts` — only those with a schema.
|
|
19
|
+
// Scope emit uses this to filter `route.errors` so generated code never
|
|
20
|
+
// references an undefined error type.
|
|
21
|
+
const errorKeys = new Set(envelope.errors.filter((e) => e.schema != null).map((e) => e.name));
|
|
22
|
+
if (selfContained) {
|
|
23
|
+
for (const group of groups) {
|
|
24
|
+
if (group.scopeKey === '_types' || group.scopeKey === '_client') {
|
|
25
|
+
throw new Error(`[ts-procedures-codegen] Scope "${group.scopeKey}" conflicts with self-contained mode reserved filename "${group.scopeKey}.ts". Rename the scope to avoid collision.`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const files = [];
|
|
30
|
+
for (const group of groups) {
|
|
31
|
+
const rawCode = await emitScopeFile(group, {
|
|
32
|
+
ajsc: ajscOpts,
|
|
33
|
+
clientImportPath,
|
|
34
|
+
namespaceTypes,
|
|
35
|
+
serviceName,
|
|
36
|
+
errorKeys: errorKeys.size > 0 ? errorKeys : undefined,
|
|
37
|
+
});
|
|
38
|
+
const lines = rawCode.split('\n');
|
|
39
|
+
lines.splice(1, 0, hashComment);
|
|
40
|
+
const code = lines.join('\n');
|
|
41
|
+
files.push({ path: join(outDir, `${group.scopeKey}.ts`), code });
|
|
42
|
+
}
|
|
43
|
+
const errorsCode = await emitErrorsFile(envelope.errors, {
|
|
44
|
+
ajsc: ajscOpts,
|
|
45
|
+
clientImportPath,
|
|
46
|
+
namespaceTypes,
|
|
47
|
+
serviceName,
|
|
48
|
+
});
|
|
49
|
+
const hasErrors = errorsCode != null;
|
|
50
|
+
if (errorsCode != null) {
|
|
51
|
+
const errorsLines = errorsCode.split('\n');
|
|
52
|
+
errorsLines.splice(1, 0, hashComment);
|
|
53
|
+
const errorsWithHash = errorsLines.join('\n');
|
|
54
|
+
files.push({ path: join(outDir, '_errors.ts'), code: errorsWithHash });
|
|
55
|
+
}
|
|
56
|
+
// In self-contained mode types come from `./_types` but the runtime
|
|
57
|
+
// (`createClient`) lives in `./_client`. In regular mode both share the
|
|
58
|
+
// single `clientImportPath` (e.g. `ts-procedures/client`).
|
|
59
|
+
const clientRuntimeImportPath = selfContained ? './_client' : clientImportPath;
|
|
60
|
+
const rawIndexCode = emitIndexFile(groups, {
|
|
61
|
+
clientImportPath,
|
|
62
|
+
clientRuntimeImportPath,
|
|
63
|
+
hasErrors,
|
|
64
|
+
namespaceTypes,
|
|
65
|
+
serviceName,
|
|
66
|
+
});
|
|
67
|
+
const indexLines = rawIndexCode.split('\n');
|
|
68
|
+
indexLines.splice(1, 0, hashComment);
|
|
69
|
+
const indexCode = indexLines.join('\n');
|
|
70
|
+
files.push({ path: join(outDir, 'index.ts'), code: indexCode });
|
|
71
|
+
if (selfContained) {
|
|
72
|
+
const rawTypesCode = await emitClientTypesFile();
|
|
73
|
+
const typesLines = rawTypesCode.split('\n');
|
|
74
|
+
typesLines.splice(1, 0, hashComment);
|
|
75
|
+
const typesCode = typesLines.join('\n');
|
|
76
|
+
files.push({ path: join(outDir, '_types.ts'), code: typesCode });
|
|
77
|
+
const rawClientCode = await emitClientRuntimeFile();
|
|
78
|
+
const clientLines = rawClientCode.split('\n');
|
|
79
|
+
clientLines.splice(1, 0, hashComment);
|
|
80
|
+
const clientCode = clientLines.join('\n');
|
|
81
|
+
files.push({ path: join(outDir, '_client.ts'), code: clientCode });
|
|
82
|
+
}
|
|
83
|
+
await writeGeneratedFiles(files, outDir, { dryRun, cleanOutDir });
|
|
84
|
+
return files;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/codegen/targets/ts/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compares produced source against a golden file, with optional regeneration.
|
|
3
|
+
*
|
|
4
|
+
* - Normal mode: reads `goldenPath`, splices the produced source-hash line into
|
|
5
|
+
* the golden's `<PLACEHOLDER>` slot, and asserts byte-equality.
|
|
6
|
+
* - Regen mode (`UPDATE_GOLDENS=1`): replaces the produced source-hash line with
|
|
7
|
+
* `<PLACEHOLDER>` and writes the result to `goldenPath`. The next normal run
|
|
8
|
+
* will assert against the new golden.
|
|
9
|
+
*
|
|
10
|
+
* The source-hash placeholder lets us check generated content into source
|
|
11
|
+
* control without coupling the golden to a specific envelope hash. Codegen
|
|
12
|
+
* outputs that don't include a `// Source hash:` line work too — the
|
|
13
|
+
* splice/replace is a no-op when no match is found.
|
|
14
|
+
*/
|
|
15
|
+
export declare function assertGoldenOrUpdate(produced: string, goldenPath: string): Promise<void>;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
/**
|
|
4
|
+
* Compares produced source against a golden file, with optional regeneration.
|
|
5
|
+
*
|
|
6
|
+
* - Normal mode: reads `goldenPath`, splices the produced source-hash line into
|
|
7
|
+
* the golden's `<PLACEHOLDER>` slot, and asserts byte-equality.
|
|
8
|
+
* - Regen mode (`UPDATE_GOLDENS=1`): replaces the produced source-hash line with
|
|
9
|
+
* `<PLACEHOLDER>` and writes the result to `goldenPath`. The next normal run
|
|
10
|
+
* will assert against the new golden.
|
|
11
|
+
*
|
|
12
|
+
* The source-hash placeholder lets us check generated content into source
|
|
13
|
+
* control without coupling the golden to a specific envelope hash. Codegen
|
|
14
|
+
* outputs that don't include a `// Source hash:` line work too — the
|
|
15
|
+
* splice/replace is a no-op when no match is found.
|
|
16
|
+
*/
|
|
17
|
+
export async function assertGoldenOrUpdate(produced, goldenPath) {
|
|
18
|
+
if (process.env.UPDATE_GOLDENS === '1') {
|
|
19
|
+
const goldenContent = produced.replace(/^\/\/ Source hash: [a-f0-9]+$/m, '// Source hash: <PLACEHOLDER>');
|
|
20
|
+
await writeFile(goldenPath, goldenContent, 'utf-8');
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.log(`[golden-test] Wrote golden: ${goldenPath}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const goldenTemplate = await readFile(goldenPath, 'utf8');
|
|
26
|
+
const sourceHashLine = produced.split('\n').find((l) => l.startsWith('// Source hash:')) ?? '';
|
|
27
|
+
const goldenWithHash = goldenTemplate.replace('// Source hash: <PLACEHOLDER>', sourceHashLine);
|
|
28
|
+
expect(produced).toBe(goldenWithHash);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=golden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"golden.js","sourceRoot":"","sources":["../../../src/codegen/test-helpers/golden.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB,EAAE,UAAkB;IAC7E,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CACpC,gCAAgC,EAChC,+BAA+B,CAChC,CAAA;QACD,MAAM,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAA;QACnD,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAA;QACxD,OAAM;IACR,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IACzD,MAAM,cAAc,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAA;IAC9F,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,+BAA+B,EAAE,cAAc,CAAC,CAAA;IAC9F,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|