ajsc 5.2.4 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/README.md +303 -144
  3. package/dist/converter/BaseConverter.d.ts +315 -0
  4. package/dist/converter/BaseConverter.js +131 -0
  5. package/dist/converter/BaseConverter.js.map +1 -0
  6. package/dist/converter/Emitter.d.ts +35 -0
  7. package/dist/converter/Emitter.js +50 -0
  8. package/dist/converter/Emitter.js.map +1 -0
  9. package/dist/converter/discriminatedUnions.d.ts +47 -0
  10. package/dist/converter/discriminatedUnions.js +168 -0
  11. package/dist/converter/discriminatedUnions.js.map +1 -0
  12. package/dist/converter/formatDefault.d.ts +20 -0
  13. package/dist/converter/formatDefault.js +31 -0
  14. package/dist/converter/formatDefault.js.map +1 -0
  15. package/dist/converter/index.d.ts +24 -0
  16. package/dist/converter/index.js +24 -0
  17. package/dist/converter/index.js.map +1 -0
  18. package/dist/converter/mergeUnions.d.ts +36 -0
  19. package/dist/converter/mergeUnions.js +189 -0
  20. package/dist/converter/mergeUnions.js.map +1 -0
  21. package/dist/converter/naming.d.ts +29 -0
  22. package/dist/converter/naming.js +137 -0
  23. package/dist/converter/naming.js.map +1 -0
  24. package/dist/converter/registry.d.ts +18 -0
  25. package/dist/converter/registry.js +50 -0
  26. package/dist/converter/registry.js.map +1 -0
  27. package/dist/converter/walk.d.ts +9 -0
  28. package/dist/converter/walk.js +40 -0
  29. package/dist/converter/walk.js.map +1 -0
  30. package/dist/index.d.ts +71 -3
  31. package/dist/index.js +63 -3
  32. package/dist/index.js.map +1 -1
  33. package/dist/{JSONSchemaConverter.d.ts → ir/JSONSchemaConverter.d.ts} +1 -1
  34. package/dist/{JSONSchemaConverter.js → ir/JSONSchemaConverter.js} +9 -3
  35. package/dist/ir/JSONSchemaConverter.js.map +1 -0
  36. package/dist/ir/index.d.ts +1 -0
  37. package/dist/ir/index.js +2 -0
  38. package/dist/ir/index.js.map +1 -0
  39. package/dist/kotlin/KotlinBaseConverter.d.ts +18 -0
  40. package/dist/kotlin/KotlinBaseConverter.js +36 -0
  41. package/dist/kotlin/KotlinBaseConverter.js.map +1 -0
  42. package/dist/kotlin/KotlinConverter.d.ts +67 -0
  43. package/dist/kotlin/KotlinConverter.js +142 -0
  44. package/dist/kotlin/KotlinConverter.js.map +1 -0
  45. package/dist/kotlin/annotations.d.ts +26 -0
  46. package/dist/kotlin/annotations.js +35 -0
  47. package/dist/kotlin/annotations.js.map +1 -0
  48. package/dist/kotlin/enums.d.ts +15 -0
  49. package/dist/kotlin/enums.js +58 -0
  50. package/dist/kotlin/enums.js.map +1 -0
  51. package/dist/kotlin/index.d.ts +13 -0
  52. package/dist/kotlin/index.js +14 -0
  53. package/dist/kotlin/index.js.map +1 -0
  54. package/dist/kotlin/objectEmitter.d.ts +12 -0
  55. package/dist/kotlin/objectEmitter.js +74 -0
  56. package/dist/kotlin/objectEmitter.js.map +1 -0
  57. package/dist/kotlin/sealedUnion.d.ts +17 -0
  58. package/dist/kotlin/sealedUnion.js +74 -0
  59. package/dist/kotlin/sealedUnion.js.map +1 -0
  60. package/dist/kotlin/typeMapper.d.ts +17 -0
  61. package/dist/kotlin/typeMapper.js +107 -0
  62. package/dist/kotlin/typeMapper.js.map +1 -0
  63. package/dist/kotlin/unsupported.d.ts +13 -0
  64. package/dist/kotlin/unsupported.js +53 -0
  65. package/dist/kotlin/unsupported.js.map +1 -0
  66. package/dist/swift/SwiftBaseConverter.d.ts +18 -0
  67. package/dist/swift/SwiftBaseConverter.js +38 -0
  68. package/dist/swift/SwiftBaseConverter.js.map +1 -0
  69. package/dist/swift/SwiftConverter.d.ts +60 -0
  70. package/dist/swift/SwiftConverter.js +113 -0
  71. package/dist/swift/SwiftConverter.js.map +1 -0
  72. package/dist/swift/discriminatedEnum.d.ts +18 -0
  73. package/dist/swift/discriminatedEnum.js +99 -0
  74. package/dist/swift/discriminatedEnum.js.map +1 -0
  75. package/dist/swift/enums.d.ts +15 -0
  76. package/dist/swift/enums.js +62 -0
  77. package/dist/swift/enums.js.map +1 -0
  78. package/dist/swift/index.d.ts +13 -0
  79. package/dist/swift/index.js +14 -0
  80. package/dist/swift/index.js.map +1 -0
  81. package/dist/swift/structEmitter.d.ts +12 -0
  82. package/dist/swift/structEmitter.js +70 -0
  83. package/dist/swift/structEmitter.js.map +1 -0
  84. package/dist/swift/typeMapper.d.ts +18 -0
  85. package/dist/swift/typeMapper.js +106 -0
  86. package/dist/swift/typeMapper.js.map +1 -0
  87. package/dist/swift/unsupported.d.ts +19 -0
  88. package/dist/swift/unsupported.js +88 -0
  89. package/dist/swift/unsupported.js.map +1 -0
  90. package/dist/typescript/TypescriptBaseConverter.d.ts +25 -0
  91. package/dist/typescript/TypescriptBaseConverter.js +178 -0
  92. package/dist/typescript/TypescriptBaseConverter.js.map +1 -0
  93. package/dist/typescript/TypescriptConverter.d.ts +74 -0
  94. package/dist/typescript/TypescriptConverter.js +254 -0
  95. package/dist/typescript/TypescriptConverter.js.map +1 -0
  96. package/dist/typescript/index.d.ts +12 -0
  97. package/dist/typescript/index.js +13 -0
  98. package/dist/typescript/index.js.map +1 -0
  99. package/dist/utils/index.d.ts +2 -0
  100. package/dist/utils/index.js +3 -0
  101. package/dist/utils/index.js.map +1 -0
  102. package/package.json +39 -6
  103. package/dist/JSONSchemaConverter.js.map +0 -1
  104. package/dist/JSONSchemaConverter.test.d.ts +0 -1
  105. package/dist/JSONSchemaConverter.test.js +0 -585
  106. package/dist/JSONSchemaConverter.test.js.map +0 -1
  107. package/dist/Typebox.test.d.ts +0 -1
  108. package/dist/Typebox.test.js +0 -88
  109. package/dist/Typebox.test.js.map +0 -1
  110. package/dist/TypescriptBaseConverter.d.ts +0 -75
  111. package/dist/TypescriptBaseConverter.js +0 -321
  112. package/dist/TypescriptBaseConverter.js.map +0 -1
  113. package/dist/TypescriptConverter.additionalProperties.test.d.ts +0 -1
  114. package/dist/TypescriptConverter.additionalProperties.test.js +0 -110
  115. package/dist/TypescriptConverter.additionalProperties.test.js.map +0 -1
  116. package/dist/TypescriptConverter.arrays.test.d.ts +0 -1
  117. package/dist/TypescriptConverter.arrays.test.js +0 -130
  118. package/dist/TypescriptConverter.arrays.test.js.map +0 -1
  119. package/dist/TypescriptConverter.composites.advanced.test.d.ts +0 -1
  120. package/dist/TypescriptConverter.composites.advanced.test.js +0 -1070
  121. package/dist/TypescriptConverter.composites.advanced.test.js.map +0 -1
  122. package/dist/TypescriptConverter.composites.test.d.ts +0 -1
  123. package/dist/TypescriptConverter.composites.test.js +0 -335
  124. package/dist/TypescriptConverter.composites.test.js.map +0 -1
  125. package/dist/TypescriptConverter.d.ts +0 -163
  126. package/dist/TypescriptConverter.js +0 -606
  127. package/dist/TypescriptConverter.js.map +0 -1
  128. package/dist/TypescriptConverter.jsdoc.test.d.ts +0 -1
  129. package/dist/TypescriptConverter.jsdoc.test.js +0 -194
  130. package/dist/TypescriptConverter.jsdoc.test.js.map +0 -1
  131. package/dist/TypescriptConverter.objects.test.d.ts +0 -1
  132. package/dist/TypescriptConverter.objects.test.js +0 -258
  133. package/dist/TypescriptConverter.objects.test.js.map +0 -1
  134. package/dist/TypescriptConverter.options.test.d.ts +0 -1
  135. package/dist/TypescriptConverter.options.test.js +0 -501
  136. package/dist/TypescriptConverter.options.test.js.map +0 -1
  137. package/dist/TypescriptConverter.primitives.test.d.ts +0 -1
  138. package/dist/TypescriptConverter.primitives.test.js +0 -26
  139. package/dist/TypescriptConverter.primitives.test.js.map +0 -1
  140. package/dist/utils/path-utils.test.d.ts +0 -1
  141. package/dist/utils/path-utils.test.js +0 -92
  142. package/dist/utils/path-utils.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/swift/enums.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `ajsc/swift` — class-based Swift converter and identifier utilities.
3
+ *
4
+ * Most consumers should prefer the function-style `emitSwift` exported from
5
+ * the package root (`ajsc`). Use this subpath when you need direct access to
6
+ * the {@link SwiftConverter} class for subclassing, or to the identifier
7
+ * sanitization helpers (`sanitizeSwiftIdentifier`, `SWIFT_RESERVED`) when
8
+ * building tooling around Swift output.
9
+ *
10
+ * @see {@link ../docs/architecture/README.md} for the layered design.
11
+ */
12
+ export * from "./SwiftBaseConverter.js";
13
+ export * from "./SwiftConverter.js";
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `ajsc/swift` — class-based Swift converter and identifier utilities.
3
+ *
4
+ * Most consumers should prefer the function-style `emitSwift` exported from
5
+ * the package root (`ajsc`). Use this subpath when you need direct access to
6
+ * the {@link SwiftConverter} class for subclassing, or to the identifier
7
+ * sanitization helpers (`sanitizeSwiftIdentifier`, `SWIFT_RESERVED`) when
8
+ * building tooling around Swift output.
9
+ *
10
+ * @see {@link ../docs/architecture/README.md} for the layered design.
11
+ */
12
+ export * from "./SwiftBaseConverter.js";
13
+ export * from "./SwiftConverter.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/swift/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ import type { SwiftConverterContext } from "./SwiftConverter.js";
4
+ /** Returns true if the property is optional or its type union includes null. */
5
+ export declare function isPropertyNullable(prop: IRNode): boolean;
6
+ /**
7
+ * Emits a Swift struct body for an object IR node, including the property
8
+ * declarations, doc comments for formatted strings, and a `CodingKeys` block
9
+ * when codable conformance requires JSON-key remapping (kebab/snake renames
10
+ * or backticked reserved words).
11
+ */
12
+ export declare function generateSwiftObjectType(c: SwiftConverterContext, ir: IRNode, utils: GenerateTypeUtils): string;
@@ -0,0 +1,70 @@
1
+ import { formatPrimitiveDefault } from "../converter/formatDefault.js";
2
+ import { sanitizeSwiftIdentifier } from "./SwiftBaseConverter.js";
3
+ import { generateSwiftType } from "./typeMapper.js";
4
+ /** Returns true if the property is optional or its type union includes null. */
5
+ export function isPropertyNullable(prop) {
6
+ if (!prop.required)
7
+ return true;
8
+ if (prop.type === "union" && prop.options?.some((o) => o.type === "null"))
9
+ return true;
10
+ return false;
11
+ }
12
+ /**
13
+ * Emits a Swift struct body for an object IR node, including the property
14
+ * declarations, doc comments for formatted strings, and a `CodingKeys` block
15
+ * when codable conformance requires JSON-key remapping (kebab/snake renames
16
+ * or backticked reserved words).
17
+ */
18
+ export function generateSwiftObjectType(c, ir, utils) {
19
+ if (ir.additionalProperties && typeof ir.additionalProperties !== "boolean") {
20
+ const apType = generateSwiftType(c, ir.additionalProperties, utils);
21
+ const note = `Note: schema permits additional keys of type ${apType} — not modeled.`;
22
+ if (ir.signature) {
23
+ const entry = c.refTypes.find((e) => e.signature === ir.signature);
24
+ if (entry)
25
+ entry.doc = note;
26
+ }
27
+ if (ir.name === c.rootName) {
28
+ c.rootDoc = note;
29
+ }
30
+ }
31
+ if (!ir.properties || Object.keys(ir.properties).length === 0) {
32
+ return "{}";
33
+ }
34
+ const propInfos = [];
35
+ const lines = [];
36
+ for (const [key, prop] of Object.entries(ir.properties)) {
37
+ const swiftName = sanitizeSwiftIdentifier(key);
38
+ const type = generateSwiftType(c, prop, utils);
39
+ const nullable = isPropertyNullable(prop);
40
+ const def = formatPrimitiveDefault(prop.defaultValue);
41
+ let suffix;
42
+ if (nullable) {
43
+ suffix = def !== undefined ? `? = ${def}` : "?";
44
+ }
45
+ else {
46
+ suffix = def !== undefined ? ` = ${def}` : "";
47
+ }
48
+ if (c.docFormatNodes.has(prop)) {
49
+ lines.push(` /// ${c.docFormatNodes.get(prop)}`);
50
+ }
51
+ lines.push(` ${c.accessLevel} let ${swiftName}: ${type}${suffix}`);
52
+ // Need a CodingKey if the swift name differs from the JSON key (kebab/snake renames)
53
+ // OR if the swift name uses backticks (reserved word)
54
+ const needsCodingKey = swiftName !== key || swiftName.startsWith("`");
55
+ propInfos.push({ jsonKey: key, swiftName, needsCodingKey });
56
+ }
57
+ // CodingKeys block under codable when any prop needs mapping.
58
+ // Swift requires ALL properties be listed when CodingKeys is present.
59
+ if (c.isCodable && propInfos.some((p) => p.needsCodingKey)) {
60
+ const cases = propInfos.map(({ jsonKey, swiftName }) => {
61
+ return ` case ${swiftName} = "${jsonKey}"`;
62
+ });
63
+ lines.push("");
64
+ lines.push(" enum CodingKeys: String, CodingKey {");
65
+ lines.push(...cases);
66
+ lines.push(" }");
67
+ }
68
+ return `{\n${lines.join("\n")}\n}`;
69
+ }
70
+ //# sourceMappingURL=structEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structEmitter.js","sourceRoot":"","sources":["../../src/swift/structEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ import type { SwiftConverterContext } from "./SwiftConverter.js";
4
+ export declare const PRIMITIVES: Record<string, string>;
5
+ export declare const FORMAT_MAP: Record<string, {
6
+ type: string;
7
+ needsFoundation: boolean;
8
+ doc?: string;
9
+ }>;
10
+ export declare const STRING_DOC_FORMATS: Set<string>;
11
+ /**
12
+ * Maps an IRNode to its Swift type expression. Handles primitives, formatted
13
+ * strings (with `Foundation` import and doc-comment tracking), arrays, tuples
14
+ * (homogeneous → array, heterogeneous → Swift tuple under `serializer: 'none'`),
15
+ * referenced object types, string enums, literals, and unions (T | null
16
+ * unwrapping, discriminated-enum dispatch, unsupported-union policy).
17
+ */
18
+ export declare function generateSwiftType(c: SwiftConverterContext, ir: IRNode, utils: GenerateTypeUtils): string;
@@ -0,0 +1,106 @@
1
+ import { getOrCreateEnumDecl } from "./enums.js";
2
+ import { handleUnsupportedUnion } from "./unsupported.js";
3
+ export const PRIMITIVES = {
4
+ string: "String",
5
+ integer: "Int64",
6
+ number: "Double",
7
+ boolean: "Bool",
8
+ null: "Never",
9
+ };
10
+ export const FORMAT_MAP = {
11
+ "date-time": { type: "Date", needsFoundation: true, doc: "ISO-8601 — set JSONDecoder.dateDecodingStrategy = .iso8601" },
12
+ "uuid": { type: "UUID", needsFoundation: true },
13
+ "uri": { type: "URL", needsFoundation: true },
14
+ "date": { type: "String", needsFoundation: false, doc: "format: date" },
15
+ "time": { type: "String", needsFoundation: false, doc: "format: time" },
16
+ };
17
+ export const STRING_DOC_FORMATS = new Set(["email", "hostname", "ipv4", "ipv6"]);
18
+ /**
19
+ * Maps an IRNode to its Swift type expression. Handles primitives, formatted
20
+ * strings (with `Foundation` import and doc-comment tracking), arrays, tuples
21
+ * (homogeneous → array, heterogeneous → Swift tuple under `serializer: 'none'`),
22
+ * referenced object types, string enums, literals, and unions (T | null
23
+ * unwrapping, discriminated-enum dispatch, unsupported-union policy).
24
+ */
25
+ export function generateSwiftType(c, ir, utils) {
26
+ switch (ir.type) {
27
+ case "string": {
28
+ const fmt = ir.constraints?.format;
29
+ if (fmt && FORMAT_MAP[fmt]) {
30
+ const m = FORMAT_MAP[fmt];
31
+ if (m.needsFoundation)
32
+ c.importsSet.add("Foundation");
33
+ if (m.doc)
34
+ c.docFormatNodes.set(ir, m.doc);
35
+ return m.type;
36
+ }
37
+ if (fmt && STRING_DOC_FORMATS.has(fmt)) {
38
+ c.docFormatNodes.set(ir, `format: ${fmt}`);
39
+ }
40
+ return "String";
41
+ }
42
+ case "integer": {
43
+ const fmt = ir.constraints?.format;
44
+ if (fmt === "int32")
45
+ return "Int32";
46
+ return PRIMITIVES.integer;
47
+ }
48
+ case "number":
49
+ case "boolean":
50
+ case "null":
51
+ return PRIMITIVES[ir.type];
52
+ case "array":
53
+ return `[${ir.items ? generateSwiftType(c, ir.items, utils) : "Any"}]`;
54
+ case "tuple": {
55
+ const items = ir.tupleItems ?? [];
56
+ const types = items.map((i) => generateSwiftType(c, i, utils));
57
+ if (types.length === 0)
58
+ return "[Any]";
59
+ const homogeneous = types.every((t) => t === types[0]);
60
+ if (homogeneous) {
61
+ return `[${types[0]}]`;
62
+ }
63
+ if (c.isCodable) {
64
+ throw new Error(`Unsupported: heterogeneous tuple at "${ir.path}" — Codable does not auto-derive heterogeneous tuples. ` +
65
+ `Use serializer: 'none' to emit a Swift native tuple, or restructure the schema.`);
66
+ }
67
+ return `(${types.join(", ")})`;
68
+ }
69
+ case "enum": {
70
+ if (ir.values?.every((v) => typeof v === "string")) {
71
+ return getOrCreateEnumDecl(c, ir.values, ir.path);
72
+ }
73
+ return "Any";
74
+ }
75
+ case "literal": {
76
+ const v = ir.constraints?.value;
77
+ if (typeof v === "string")
78
+ return "String";
79
+ if (typeof v === "number")
80
+ return Number.isInteger(v) ? "Int64" : "Double";
81
+ if (typeof v === "boolean")
82
+ return "Bool";
83
+ return "Any";
84
+ }
85
+ case "object": {
86
+ const ref = utils.getReferencedType(ir);
87
+ if (ref)
88
+ return ref;
89
+ return "Any";
90
+ }
91
+ case "union": {
92
+ const non = ir.options?.filter((o) => o.type !== "null") ?? [];
93
+ if (non.length === 1)
94
+ return generateSwiftType(c, non[0], utils);
95
+ // Discriminated union: variantNames populated
96
+ if (ir.options?.length &&
97
+ ir.options.every((o) => c.variantNames.has(o))) {
98
+ return c.emitSwiftDiscriminatedEnum(ir, utils);
99
+ }
100
+ return handleUnsupportedUnion(c, ir);
101
+ }
102
+ default:
103
+ return "Any";
104
+ }
105
+ }
106
+ //# sourceMappingURL=typeMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeMapper.js","sourceRoot":"","sources":["../../src/swift/typeMapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { IRNode } from "../types.js";
2
+ import type { SwiftConverterContext } from "./SwiftConverter.js";
3
+ /**
4
+ * Applies the `unsupportedUnions` policy for an untagged union that survived
5
+ * merging and has no usable discriminator.
6
+ */
7
+ export declare function handleUnsupportedUnion(c: SwiftConverterContext, ir: IRNode): string;
8
+ /**
9
+ * Pre-emission guard pass that throws on JSON Schema features Swift codegen
10
+ * does not support: `not` and `patternProperties`. These are NOT silenced by
11
+ * `unsupportedUnions: 'fallback'`.
12
+ */
13
+ export declare function guardUnsupportedKeywords(_c: SwiftConverterContext, root: IRNode): void;
14
+ /**
15
+ * Returns the `AnyCodable` helper struct that wraps arbitrary JSON values for
16
+ * the unsupported-union fallback under `serializer: 'codable'`. Emitted only
17
+ * when at least one fallback path requested it via `c.needsAnyCodable`.
18
+ */
19
+ export declare function anyCodableHelper(c: SwiftConverterContext): string;
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Applies the `unsupportedUnions` policy for an untagged union that survived
3
+ * merging and has no usable discriminator.
4
+ */
5
+ export function handleUnsupportedUnion(c, ir) {
6
+ const policy = c.baseOpts?.unsupportedUnions ?? "throw";
7
+ if (policy === "throw") {
8
+ const opts = ir.options?.map((o) => o.type).join(", ") ?? "?";
9
+ throw new Error(`Unsupported: untagged union at "${ir.path}"\n` +
10
+ ` options: [${opts}]\n` +
11
+ ` Add a discriminator property with a const per variant, or set unsupportedUnions:'fallback' to emit AnyCodable.`);
12
+ }
13
+ // fallback
14
+ if (c.isCodable) {
15
+ c.needsAnyCodable = true;
16
+ return "AnyCodable";
17
+ }
18
+ return "Any";
19
+ }
20
+ /**
21
+ * Pre-emission guard pass that throws on JSON Schema features Swift codegen
22
+ * does not support: `not` and `patternProperties`. These are NOT silenced by
23
+ * `unsupportedUnions: 'fallback'`.
24
+ */
25
+ export function guardUnsupportedKeywords(_c, root) {
26
+ const walk = (n) => {
27
+ if (n.not) {
28
+ throw new Error(`Unsupported: \`not\` keyword at "${n.path}".`);
29
+ }
30
+ if (n.patternProperties &&
31
+ Object.keys(n.patternProperties).length > 0) {
32
+ throw new Error(`Unsupported: patternProperties at "${n.path}".`);
33
+ }
34
+ if (n.properties) {
35
+ for (const k of Object.keys(n.properties))
36
+ walk(n.properties[k]);
37
+ }
38
+ if (n.items)
39
+ walk(n.items);
40
+ if (n.tupleItems)
41
+ for (const t of n.tupleItems)
42
+ walk(t);
43
+ if (n.options)
44
+ for (const o of n.options)
45
+ walk(o);
46
+ if (n.additionalProperties &&
47
+ typeof n.additionalProperties !== "boolean") {
48
+ walk(n.additionalProperties);
49
+ }
50
+ };
51
+ walk(root);
52
+ }
53
+ /**
54
+ * Returns the `AnyCodable` helper struct that wraps arbitrary JSON values for
55
+ * the unsupported-union fallback under `serializer: 'codable'`. Emitted only
56
+ * when at least one fallback path requested it via `c.needsAnyCodable`.
57
+ */
58
+ export function anyCodableHelper(c) {
59
+ const al = c.accessLevel;
60
+ return `${al} struct AnyCodable: Codable {
61
+ ${al} let value: Any
62
+ ${al} init(_ value: Any) { self.value = value }
63
+ ${al} init(from decoder: Decoder) throws {
64
+ let container = try decoder.singleValueContainer()
65
+ if container.decodeNil() { self.value = (); return }
66
+ if let v = try? container.decode(Bool.self) { self.value = v; return }
67
+ if let v = try? container.decode(Int64.self) { self.value = v; return }
68
+ if let v = try? container.decode(Double.self) { self.value = v; return }
69
+ if let v = try? container.decode(String.self) { self.value = v; return }
70
+ if let v = try? container.decode([AnyCodable].self) { self.value = v; return }
71
+ if let v = try? container.decode([String: AnyCodable].self) { self.value = v; return }
72
+ throw DecodingError.typeMismatch(AnyCodable.self, .init(codingPath: decoder.codingPath, debugDescription: "Unsupported type"))
73
+ }
74
+ ${al} func encode(to encoder: Encoder) throws {
75
+ var container = encoder.singleValueContainer()
76
+ switch self.value {
77
+ case let v as Bool: try container.encode(v)
78
+ case let v as Int64: try container.encode(v)
79
+ case let v as Double: try container.encode(v)
80
+ case let v as String: try container.encode(v)
81
+ case let v as [AnyCodable]: try container.encode(v)
82
+ case let v as [String: AnyCodable]: try container.encode(v)
83
+ default: try container.encodeNil()
84
+ }
85
+ }
86
+ }`;
87
+ }
88
+ //# sourceMappingURL=unsupported.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unsupported.js","sourceRoot":"","sources":["../../src/swift/unsupported.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAAwB,EAAE,EAAU;IACzE,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,iBAAiB,IAAI,OAAO,CAAC;IACxD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,mCAAmC,EAAE,CAAC,IAAI,KAAK;YAC7C,eAAe,IAAI,KAAK;YACxB,kHAAkH,CACrH,CAAC;IACJ,CAAC;IACD,WAAW;IACX,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAChB,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC;QACzB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,EAAyB,EAAE,IAAY;IAC9E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAQ,EAAE;QAC/B,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAClE,CAAC;QACD,IACE,CAAC,CAAC,iBAAiB;YACnB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,EAC3C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC;gBAAE,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,CAAC,CAAC,KAAK;YAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,CAAC,UAAU;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,OAAO;YAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,IACE,CAAC,CAAC,oBAAoB;YACtB,OAAO,CAAC,CAAC,oBAAoB,KAAK,SAAS,EAC3C,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAwB;IACvD,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC;IACzB,OAAO,GAAG,EAAE;MACR,EAAE;MACF,EAAE;MACF,EAAE;;;;;;;;;;;MAWF,EAAE;;;;;;;;;;;;EAYN,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { IRNode } from "../types.js";
2
+ import { BaseConverter, GenerateTypeUtils } from "../converter/BaseConverter.js";
3
+ export type { RefTypeNamingConfig, GenerateTypeUtils } from "../converter/BaseConverter.js";
4
+ export type { RefTypeName, RefTypes, RefTypeEntry } from "../converter/BaseConverter.js";
5
+ export declare abstract class TypescriptBaseConverter extends BaseConverter {
6
+ protected emitJSDoc: boolean;
7
+ /**
8
+ * Recursively generates a TypeScript type string for the given IR node.
9
+ */
10
+ protected generateType(ir: IRNode, utils: GenerateTypeUtils): string;
11
+ protected generateArrayType(ir: IRNode, utils: GenerateTypeUtils): string;
12
+ protected generateTupleType(ir: IRNode, utils: GenerateTypeUtils): string;
13
+ protected generateUnionType(ir: IRNode, utils: GenerateTypeUtils): string;
14
+ protected generateIntersectionType(ir: IRNode, utils: GenerateTypeUtils): string;
15
+ protected generateEnumType(ir: IRNode): string;
16
+ protected generateLiteralType(ir: IRNode): string;
17
+ protected getPrimitiveTypeMap(): Record<string, string>;
18
+ /**
19
+ * Generates a TypeScript object type (as an inline type literal) from the given IR node.
20
+ * @internal Public for `BaseConverterContext`; treat as protected for subclasses.
21
+ */
22
+ generateObjectType(ir: IRNode, utils: GenerateTypeUtils): string;
23
+ protected isValidIdentifier(name: string): boolean;
24
+ protected formatJSDoc(description: string, title?: string): string;
25
+ }
@@ -0,0 +1,178 @@
1
+ import { BaseConverter } from "../converter/BaseConverter.js";
2
+ export class TypescriptBaseConverter extends BaseConverter {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.emitJSDoc = false;
6
+ }
7
+ /**
8
+ * Recursively generates a TypeScript type string for the given IR node.
9
+ */
10
+ generateType(ir, utils) {
11
+ switch (ir.type) {
12
+ case "object": {
13
+ const referencedType = utils.getReferencedType(ir);
14
+ if (referencedType)
15
+ return referencedType;
16
+ return this.generateObjectType(ir, utils);
17
+ }
18
+ case "array":
19
+ return this.generateArrayType(ir, utils);
20
+ case "tuple":
21
+ return this.generateTupleType(ir, utils);
22
+ case "union":
23
+ return this.generateUnionType(ir, utils);
24
+ case "intersection":
25
+ return this.generateIntersectionType(ir, utils);
26
+ case "enum":
27
+ return this.generateEnumType(ir);
28
+ case "literal":
29
+ return this.generateLiteralType(ir);
30
+ case "any":
31
+ return "any";
32
+ case "unknown":
33
+ return "unknown";
34
+ case "never":
35
+ return "never";
36
+ default: {
37
+ const primitiveMap = this.getPrimitiveTypeMap();
38
+ if (ir.type in primitiveMap) {
39
+ return primitiveMap[ir.type];
40
+ }
41
+ return "any";
42
+ }
43
+ }
44
+ }
45
+ generateArrayType(ir, utils) {
46
+ if (ir.items) {
47
+ return `Array<${this.generateType(ir.items, utils)}>`;
48
+ }
49
+ return "any[]";
50
+ }
51
+ generateTupleType(ir, utils) {
52
+ if (ir.tupleItems && ir.tupleItems.length > 0) {
53
+ const elements = ir.tupleItems.map((item) => this.generateType(item, utils));
54
+ return `[${elements.join(", ")}]`;
55
+ }
56
+ return "[]";
57
+ }
58
+ generateUnionType(ir, utils) {
59
+ if (ir.options && ir.options.length > 0) {
60
+ return ir.options
61
+ .map((opt) => this.generateType(opt, utils))
62
+ .join(" | ");
63
+ }
64
+ return "never";
65
+ }
66
+ generateIntersectionType(ir, utils) {
67
+ if (ir.options && ir.options.length > 0) {
68
+ return ir.options
69
+ .map((opt) => this.generateType(opt, utils))
70
+ .join(" & ");
71
+ }
72
+ return "never";
73
+ }
74
+ generateEnumType(ir) {
75
+ if (ir.values && ir.values.length > 0) {
76
+ return ir.values.map((v) => JSON.stringify(v)).join(" | ");
77
+ }
78
+ return "never";
79
+ }
80
+ generateLiteralType(ir) {
81
+ return typeof ir.constraints?.value === "string"
82
+ ? JSON.stringify(ir.constraints.value)
83
+ : String(ir.constraints?.value);
84
+ }
85
+ getPrimitiveTypeMap() {
86
+ return {
87
+ string: "string",
88
+ number: "number",
89
+ integer: "number",
90
+ boolean: "boolean",
91
+ null: "null",
92
+ };
93
+ }
94
+ /**
95
+ * Generates a TypeScript object type (as an inline type literal) from the given IR node.
96
+ * @internal Public for `BaseConverterContext`; treat as protected for subclasses.
97
+ */
98
+ generateObjectType(ir, utils) {
99
+ let generated = ``;
100
+ const generatedAdditionalValues = new Set();
101
+ if (ir.additionalProperties === true) {
102
+ generatedAdditionalValues.add("Record<string, any>");
103
+ }
104
+ else if (ir.additionalProperties) {
105
+ generatedAdditionalValues.add(`Record<string, ${this.generateType(ir.additionalProperties, utils)}>`);
106
+ }
107
+ if (ir.properties) {
108
+ const hasAnnotations = this.emitJSDoc &&
109
+ Object.values(ir.properties).some((p) => p.description || p.title);
110
+ const props = Object.keys(ir.properties).map((key) => {
111
+ const prop = ir.properties[key];
112
+ // Append '?' if the property is not required.
113
+ const optional = prop.required ? "" : "?";
114
+ const propKey = this.isValidIdentifier(key) ? key : `"${key}"`;
115
+ const propLine = `${propKey}${optional}: ${this.generateType(prop, utils)};`;
116
+ if (hasAnnotations && (prop.description || prop.title)) {
117
+ const jsdoc = prop.description
118
+ ? this.formatJSDoc(prop.description, prop.title)
119
+ : this.formatJSDoc(prop.title);
120
+ return `${jsdoc}\n${propLine}`;
121
+ }
122
+ return propLine;
123
+ });
124
+ if (!props.length && generatedAdditionalValues.size === 0) {
125
+ generatedAdditionalValues.add("{ [key:string]: unknown }");
126
+ }
127
+ else if (props.length) {
128
+ if (hasAnnotations) {
129
+ const indented = props
130
+ .map((block) => block
131
+ .split("\n")
132
+ .map((line) => ` ${line}`)
133
+ .join("\n"))
134
+ .join("\n");
135
+ generated = `{\n${indented}\n}`;
136
+ }
137
+ else {
138
+ generated = `{ ${props.join(" ")} }`;
139
+ }
140
+ }
141
+ }
142
+ let returnValue = ``;
143
+ if (generatedAdditionalValues.size > 0) {
144
+ if (generated) {
145
+ returnValue = `(${generated} & (${Array.from(generatedAdditionalValues).join(" & ")}))`;
146
+ }
147
+ else {
148
+ returnValue = Array.from(generatedAdditionalValues).join(" & ");
149
+ }
150
+ }
151
+ else {
152
+ returnValue = generated || "{ [key:string]: unknown }";
153
+ }
154
+ return returnValue;
155
+ }
156
+ isValidIdentifier(name) {
157
+ return /^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(name);
158
+ }
159
+ formatJSDoc(description, title) {
160
+ const safe = description.replace(/\*\//g, "*\\/");
161
+ const parts = [];
162
+ if (title) {
163
+ parts.push(title.replace(/\*\//g, "*\\/"));
164
+ parts.push("");
165
+ parts.push(safe);
166
+ }
167
+ else {
168
+ parts.push(safe);
169
+ }
170
+ const text = parts.join("\n");
171
+ const lines = text.split("\n");
172
+ if (lines.length === 1) {
173
+ return `/** ${text} */`;
174
+ }
175
+ return `/**\n${lines.map((l) => ` * ${l}`).join("\n")}\n */`;
176
+ }
177
+ }
178
+ //# sourceMappingURL=TypescriptBaseConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypescriptBaseConverter.js","sourceRoot":"","sources":["../../src/typescript/TypescriptBaseConverter.ts"],"names":[],"mappings":"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"}