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,137 @@
1
+ import pluralize from "pluralize";
2
+ import { PathUtils } from "../utils/path-utils.js";
3
+ import { toPascalCase } from "../utils/to-pascal-case.js";
4
+ /** Default words that should not be singularized (common programming/API terms). */
5
+ const DEFAULT_UNCOUNTABLE_WORDS = ["data", "metadata"];
6
+ /** Pure helper: singularize a word, respecting uncountable allow-lists. */
7
+ export function singularize(word, extraUncountable) {
8
+ const uncountable = [...DEFAULT_UNCOUNTABLE_WORDS, ...(extraUncountable ?? [])];
9
+ if (uncountable.some((u) => word.toLowerCase().endsWith(u.toLowerCase()))) {
10
+ return word;
11
+ }
12
+ return pluralize.singular(word);
13
+ }
14
+ /** Default ref-type naming configuration shared by all language converters. */
15
+ export function defaultRefTypeNamingConfig() {
16
+ return {
17
+ postfixes: [
18
+ "Type", "Element", "Schema", "Object", "Shape", "Definition",
19
+ "Item", "Entry", "One", "Two", "Three", "Four", "Five",
20
+ "Six", "Seven", "Eight", "Nine", "Ten",
21
+ ],
22
+ handleAnySymbol: true,
23
+ stripLeadingAnySymbol: true,
24
+ depluralize: true,
25
+ arrayItemNaming: false,
26
+ };
27
+ }
28
+ /**
29
+ * Returns the effective ref-type naming config for the given context: the
30
+ * default merged shallow with the language profile's `refTypeNamingConfig` overrides.
31
+ */
32
+ export function getRefTypeNamingConfig(c) {
33
+ return { ...defaultRefTypeNamingConfig(), ...c.languageProfile.refTypeNamingConfig };
34
+ }
35
+ /**
36
+ * Computes a path-derived, collision-free ref type name for a (signature, nodePath) pair.
37
+ *
38
+ * Algorithm:
39
+ * 1. Parse the path into segments and pick the array-item / `*` / regular postfix list.
40
+ * 2. Try increasingly more parent segments combined with each postfix.
41
+ * 3. If a refType already exists for (signature, proposedName), reuse it.
42
+ * 4. If no name is free after exhausting postfixes, fall back to `<base><N>` with a
43
+ * deterministic instance-scoped counter on `c.fallbackCounter`.
44
+ */
45
+ export function getUniqueRefTypeName(c, signature, nodePath) {
46
+ const config = getRefTypeNamingConfig(c);
47
+ const path = PathUtils.parsePath(nodePath);
48
+ const lastPathItem = nodePath.split(".").slice(-1)[0];
49
+ const isArrayItem = lastPathItem === "0";
50
+ const isAnySymbol = lastPathItem === "*";
51
+ const postFixes = [...config.postfixes];
52
+ if (isArrayItem) {
53
+ if (config.arrayItemNaming !== false) {
54
+ postFixes.unshift(config.arrayItemNaming ?? "Item");
55
+ }
56
+ else {
57
+ postFixes.unshift("");
58
+ }
59
+ // When path is empty (root-level array), use the root schema name as context
60
+ if (path.length === 0 && c.rootName) {
61
+ path.push(c.rootName);
62
+ }
63
+ if (config.depluralize && path.length > 0 && path[path.length - 1]) {
64
+ path[path.length - 1] = singularize(path[path.length - 1], config.uncountableWords);
65
+ }
66
+ }
67
+ else if (config.handleAnySymbol && isAnySymbol) {
68
+ postFixes.unshift("AnyKey", "AnyProperty", "AnyField", "AnyIdentifier");
69
+ }
70
+ else {
71
+ postFixes.unshift("");
72
+ }
73
+ let pathsSegmentsToInclude = 1;
74
+ let name = "";
75
+ let postFixIndexToTry = 0;
76
+ // Optional caller-supplied prefix prepended to every proposed name. Useful
77
+ // for cross-call disambiguation when emitting multiple schemas into one
78
+ // namespace (see BaseConverterOpts.namePrefix). PascalCased so non-identifier
79
+ // characters in the source value are sanitized.
80
+ const prefix = c.baseOpts?.namePrefix
81
+ ? toPascalCase(c.baseOpts.namePrefix)
82
+ : "";
83
+ while (!name) {
84
+ const pathSegment = path.slice(-pathsSegmentsToInclude).map(toPascalCase).join("");
85
+ let proposedName = prefix + pathSegment + postFixes[postFixIndexToTry];
86
+ if (config.stripLeadingAnySymbol && proposedName[0] === "*") {
87
+ proposedName = proposedName.slice(1);
88
+ }
89
+ const foundSignatureMatch = c.refTypes.find((entry) => entry.signature === signature && entry.name === proposedName);
90
+ if (foundSignatureMatch) {
91
+ return foundSignatureMatch.name;
92
+ }
93
+ // Skip empty proposed names (e.g. empty path with no postfix)
94
+ if (!proposedName) {
95
+ postFixIndexToTry++;
96
+ if (postFixIndexToTry >= postFixes.length) {
97
+ do {
98
+ c.fallbackCounter++;
99
+ name = "Type" + c.fallbackCounter;
100
+ } while (c.usedDeclarationNames.has(name));
101
+ }
102
+ continue;
103
+ }
104
+ const nameAlreadyUsed = c.usedDeclarationNames.has(proposedName);
105
+ if (nameAlreadyUsed) {
106
+ pathsSegmentsToInclude++;
107
+ if (pathsSegmentsToInclude >= path.length) {
108
+ postFixIndexToTry++;
109
+ pathsSegmentsToInclude = 1;
110
+ if (postFixIndexToTry === postFixes.length) {
111
+ // Deterministic instance-scoped fallback
112
+ do {
113
+ c.fallbackCounter++;
114
+ name = proposedName + c.fallbackCounter;
115
+ } while (c.usedDeclarationNames.has(name));
116
+ }
117
+ }
118
+ }
119
+ else {
120
+ name = proposedName;
121
+ }
122
+ }
123
+ c.usedDeclarationNames.add(name);
124
+ return name;
125
+ }
126
+ /** Default resolver for a ref-type name from an IR node and signature. */
127
+ export function defaultResolveRefTypeName(c, ir, signature) {
128
+ return getUniqueRefTypeName(c, signature, ir.path);
129
+ }
130
+ /**
131
+ * Returns names of all extracted ref types in declaration order.
132
+ * Subclasses may filter further (e.g. to exclude the root type).
133
+ */
134
+ export function computeExtractedTypeNames(c) {
135
+ return c.refTypes.map((entry) => entry.name);
136
+ }
137
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/converter/naming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { IRNode } from "../types.js";
2
+ import type { BaseConverterContext } from "./BaseConverter.js";
3
+ /**
4
+ * Resolves an IR node to its registered ref-type name, registering a new entry
5
+ * if needed. Returns `undefined` when the node has no signature.
6
+ *
7
+ * Behavior:
8
+ * 1. Self-reference: if `ir.name === c.rootName` and `detectSelfReferenceToRoot`
9
+ * is enabled (default true), short-circuits to the root name without registering.
10
+ * 2. Signature dedup: if `languageProfile.shouldReuseExistingSignature(sig)`
11
+ * returns true and an entry already exists for the signature, reuses it.
12
+ * 3. Otherwise resolves a name (via the language profile's `resolveRefTypeName`
13
+ * hook or the default path-derived resolver), then either reuses an existing
14
+ * matching entry or registers a fresh one. Code is generated by calling back
15
+ * into `c.generateObjectType` and assigned via the held entry reference (so
16
+ * recursion sees an entry-in-progress).
17
+ */
18
+ export declare function getReferencedType(c: BaseConverterContext, ir: IRNode): string | undefined;
@@ -0,0 +1,50 @@
1
+ import { defaultResolveRefTypeName } from "./naming.js";
2
+ /**
3
+ * Resolves an IR node to its registered ref-type name, registering a new entry
4
+ * if needed. Returns `undefined` when the node has no signature.
5
+ *
6
+ * Behavior:
7
+ * 1. Self-reference: if `ir.name === c.rootName` and `detectSelfReferenceToRoot`
8
+ * is enabled (default true), short-circuits to the root name without registering.
9
+ * 2. Signature dedup: if `languageProfile.shouldReuseExistingSignature(sig)`
10
+ * returns true and an entry already exists for the signature, reuses it.
11
+ * 3. Otherwise resolves a name (via the language profile's `resolveRefTypeName`
12
+ * hook or the default path-derived resolver), then either reuses an existing
13
+ * matching entry or registers a fresh one. Code is generated by calling back
14
+ * into `c.generateObjectType` and assigned via the held entry reference (so
15
+ * recursion sees an entry-in-progress).
16
+ */
17
+ export function getReferencedType(c, ir) {
18
+ const signature = ir.signature;
19
+ if (!signature) {
20
+ return undefined;
21
+ }
22
+ // Self-reference to the root: short-circuit so we don't register a duplicate type.
23
+ if ((c.languageProfile.detectSelfReferenceToRoot ?? true) && ir.name && ir.name === c.rootName) {
24
+ return c.rootName;
25
+ }
26
+ // Hook: allow subclasses to enable signature-only dedup for specific signatures
27
+ if (c.languageProfile.shouldReuseExistingSignature?.(signature) ?? false) {
28
+ const existingBySignature = c.refTypes.find((entry) => entry.signature === signature);
29
+ if (existingBySignature)
30
+ return existingBySignature.name;
31
+ }
32
+ const defaultResolver = () => defaultResolveRefTypeName(c, ir, signature);
33
+ const name = c.languageProfile.resolveRefTypeName?.(ir, signature, defaultResolver)
34
+ ?? defaultResolver();
35
+ // Account for recursion: the ref type could have already been created
36
+ const existing = c.refTypes.find((entry) => entry.signature === signature && entry.name === name);
37
+ if (existing) {
38
+ return name;
39
+ }
40
+ // Push entry with empty code placeholder - hold reference for safe assignment
41
+ const entry = { signature, name, code: "", title: ir.title, description: ir.description };
42
+ c.refTypes.push(entry);
43
+ const code = c.generateObjectType(ir, {
44
+ getReferencedType: (node) => getReferencedType(c, node),
45
+ });
46
+ // Safe assignment via direct reference
47
+ entry.code = code;
48
+ return name;
49
+ }
50
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/converter/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAC/B,CAAuB,EACvB,EAAU;IAEV,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;IAE/B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,mFAAmF;IACnF,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,yBAAyB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/F,OAAO,CAAC,CAAC,QAAQ,CAAC;IACpB,CAAC;IAED,gFAAgF;IAChF,IAAI,CAAC,CAAC,eAAe,CAAC,4BAA4B,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC;QACzE,MAAM,mBAAmB,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACtF,IAAI,mBAAmB;YAAE,OAAO,mBAAmB,CAAC,IAAI,CAAC;IAC3D,CAAC;IAED,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,yBAAyB,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC;WAC9E,eAAe,EAAE,CAAC;IAEvB,sEAAsE;IACtE,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAChE,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8EAA8E;IAC9E,MAAM,KAAK,GAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC;IACxG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEvB,MAAM,IAAI,GAAG,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE;QACpC,iBAAiB,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC;KAChE,CAAC,CAAC;IAEH,uCAAuC;IACvC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAElB,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { IRNode } from "../types.js";
2
+ /**
3
+ * Recursively walks an IR tree, visiting each node and optionally replacing it.
4
+ * Returns the (potentially replaced) root node.
5
+ *
6
+ * @param visitor Return an IRNode to replace the current node, or void/null to keep it.
7
+ * @param order 'pre' visits before children; 'post' (default) visits after children.
8
+ */
9
+ export declare function walkIR(ir: IRNode, visitor: (node: IRNode) => IRNode | void | null, order?: "pre" | "post"): IRNode;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Recursively walks an IR tree, visiting each node and optionally replacing it.
3
+ * Returns the (potentially replaced) root node.
4
+ *
5
+ * @param visitor Return an IRNode to replace the current node, or void/null to keep it.
6
+ * @param order 'pre' visits before children; 'post' (default) visits after children.
7
+ */
8
+ export function walkIR(ir, visitor, order = "post") {
9
+ let node = ir;
10
+ if (order === "pre") {
11
+ const result = visitor(node);
12
+ if (result != null)
13
+ node = result;
14
+ }
15
+ if (node.properties) {
16
+ for (const key of Object.keys(node.properties)) {
17
+ node.properties[key] = walkIR(node.properties[key], visitor, order);
18
+ }
19
+ }
20
+ if (node.items) {
21
+ node.items = walkIR(node.items, visitor, order);
22
+ }
23
+ if (node.tupleItems) {
24
+ node.tupleItems = node.tupleItems.map((t) => walkIR(t, visitor, order));
25
+ }
26
+ if (node.options) {
27
+ node.options = node.options.map((o) => walkIR(o, visitor, order));
28
+ }
29
+ if (node.additionalProperties &&
30
+ typeof node.additionalProperties !== "boolean") {
31
+ node.additionalProperties = walkIR(node.additionalProperties, visitor, order);
32
+ }
33
+ if (order === "post") {
34
+ const result = visitor(node);
35
+ if (result != null)
36
+ return result;
37
+ }
38
+ return node;
39
+ }
40
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/converter/walk.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CACpB,EAAU,EACV,OAA+C,EAC/C,QAAwB,MAAM;IAE9B,IAAI,IAAI,GAAG,EAAE,CAAC;IAEd,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,IAAI,IAAI;YAAE,IAAI,GAAG,MAAM,CAAC;IACpC,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,IACE,IAAI,CAAC,oBAAoB;QACzB,OAAO,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAC9C,CAAC;QACD,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAChC,IAAI,CAAC,oBAAoB,EACzB,OAAO,EACP,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,MAAM,IAAI,IAAI;YAAE,OAAO,MAAM,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,71 @@
1
- export * from './JSONSchemaConverter.js';
2
- export * from './TypescriptBaseConverter.js';
3
- export * from './TypescriptConverter.js';
1
+ import type { JSONSchema7Definition } from "json-schema";
2
+ import { type TypescriptConverterOpts } from "./typescript/index.js";
3
+ import { type KotlinConverterOpts } from "./kotlin/index.js";
4
+ import { type SwiftConverterOpts } from "./swift/index.js";
5
+ /**
6
+ * The structured result of emitting source for a JSON Schema.
7
+ *
8
+ * Returned by {@link emitTypescript}, {@link emitKotlin}, and {@link emitSwift}.
9
+ */
10
+ export interface EmitResult {
11
+ /**
12
+ * The generated source code. Contains type/struct/data-class declarations
13
+ * only — no `import` lines (Kotlin) or module imports (Swift). Consumers
14
+ * assemble the final file by combining {@link imports} with this string.
15
+ */
16
+ code: string;
17
+ /** Name of the top-level type that the schema's root maps to. */
18
+ rootTypeName: string;
19
+ /**
20
+ * Names of every additional named declaration emitted besides the root —
21
+ * nested object types, enums, sealed-interface variants, and similar.
22
+ * Useful for downstream codegen that wants to reference these by name
23
+ * without parsing the {@link code} string.
24
+ */
25
+ extractedTypeNames: string[];
26
+ /**
27
+ * Required imports for the emitted code, as fully-qualified module/symbol
28
+ * paths (Kotlin) or module names (Swift). Empty for TypeScript.
29
+ *
30
+ * Format the value into the language's `import` statement at assembly time.
31
+ * Example:
32
+ *
33
+ * const file = [...imports.map((i) => `import ${i}`), "", code].join("\n");
34
+ */
35
+ imports: string[];
36
+ }
37
+ /**
38
+ * Emits TypeScript source for the given JSON Schema.
39
+ *
40
+ * Wraps {@link TypescriptConverter} with the {@link EmitResult} shape used by
41
+ * the other language emitters. For advanced use (custom subclassing, deep
42
+ * options reuse), import {@link TypescriptConverter} directly from `ajsc/typescript`.
43
+ */
44
+ export declare function emitTypescript(schema: JSONSchema7Definition, opts?: TypescriptConverterOpts): EmitResult;
45
+ /**
46
+ * Emits Kotlin source for the given JSON Schema.
47
+ *
48
+ * Defaults: `serializer: "kotlinx"` (emits `@Serializable` data classes for
49
+ * use with kotlinx-serialization). Pass `serializer: "none"` for plain types
50
+ * with no annotations.
51
+ *
52
+ * For advanced use (custom subclassing), import {@link KotlinConverter}
53
+ * directly from `ajsc/kotlin`.
54
+ */
55
+ export declare function emitKotlin(schema: JSONSchema7Definition, opts?: KotlinConverterOpts): EmitResult;
56
+ /**
57
+ * Emits Swift source for the given JSON Schema.
58
+ *
59
+ * Defaults: `serializer: "codable"` (emits `Codable`-conforming structs).
60
+ * Pass `serializer: "none"` for plain types with no Codable conformance.
61
+ *
62
+ * For advanced use (custom subclassing), import {@link SwiftConverter}
63
+ * directly from `ajsc/swift`.
64
+ */
65
+ export declare function emitSwift(schema: JSONSchema7Definition, opts?: SwiftConverterOpts): EmitResult;
66
+ export { TypescriptConverter } from "./typescript/index.js";
67
+ export type { TypescriptConverterOpts } from "./typescript/index.js";
68
+ export { KotlinConverter } from "./kotlin/index.js";
69
+ export type { KotlinConverterOpts } from "./kotlin/index.js";
70
+ export { SwiftConverter } from "./swift/index.js";
71
+ export type { SwiftConverterOpts } from "./swift/index.js";
package/dist/index.js CHANGED
@@ -1,4 +1,64 @@
1
- export * from './JSONSchemaConverter.js';
2
- export * from './TypescriptBaseConverter.js';
3
- export * from './TypescriptConverter.js';
1
+ // Top-level entry for ajsc. Convenience function-style API for code generators
2
+ // that want a single call site, plus re-exports of the class-style converters
3
+ // for direct subclassing or advanced use.
4
+ //
5
+ // Most consumers should prefer the function-style API:
6
+ //
7
+ // import { emitKotlin } from "ajsc";
8
+ // const { code, imports, rootTypeName, extractedTypeNames } = emitKotlin(schema);
9
+ //
10
+ // Class-style imports remain available via the language subpaths (`ajsc/kotlin`,
11
+ // `ajsc/swift`, `ajsc/typescript`) for users who need to subclass the converter.
12
+ import { TypescriptConverter, } from "./typescript/index.js";
13
+ import { KotlinConverter, } from "./kotlin/index.js";
14
+ import { SwiftConverter, } from "./swift/index.js";
15
+ function toEmitResult(c) {
16
+ return {
17
+ code: c.code,
18
+ rootTypeName: c.rootTypeName,
19
+ extractedTypeNames: c.extractedTypeNames,
20
+ imports: c.imports,
21
+ };
22
+ }
23
+ /**
24
+ * Emits TypeScript source for the given JSON Schema.
25
+ *
26
+ * Wraps {@link TypescriptConverter} with the {@link EmitResult} shape used by
27
+ * the other language emitters. For advanced use (custom subclassing, deep
28
+ * options reuse), import {@link TypescriptConverter} directly from `ajsc/typescript`.
29
+ */
30
+ export function emitTypescript(schema, opts) {
31
+ return toEmitResult(new TypescriptConverter(schema, opts));
32
+ }
33
+ /**
34
+ * Emits Kotlin source for the given JSON Schema.
35
+ *
36
+ * Defaults: `serializer: "kotlinx"` (emits `@Serializable` data classes for
37
+ * use with kotlinx-serialization). Pass `serializer: "none"` for plain types
38
+ * with no annotations.
39
+ *
40
+ * For advanced use (custom subclassing), import {@link KotlinConverter}
41
+ * directly from `ajsc/kotlin`.
42
+ */
43
+ export function emitKotlin(schema, opts) {
44
+ return toEmitResult(new KotlinConverter(schema, opts));
45
+ }
46
+ /**
47
+ * Emits Swift source for the given JSON Schema.
48
+ *
49
+ * Defaults: `serializer: "codable"` (emits `Codable`-conforming structs).
50
+ * Pass `serializer: "none"` for plain types with no Codable conformance.
51
+ *
52
+ * For advanced use (custom subclassing), import {@link SwiftConverter}
53
+ * directly from `ajsc/swift`.
54
+ */
55
+ export function emitSwift(schema, opts) {
56
+ return toEmitResult(new SwiftConverter(schema, opts));
57
+ }
58
+ // Re-export the converter classes for users who need them directly.
59
+ // Existing consumers using `import { TypescriptConverter } from "ajsc"` continue
60
+ // to work; new consumers should generally prefer `emitTypescript()`.
61
+ export { TypescriptConverter } from "./typescript/index.js";
62
+ export { KotlinConverter } from "./kotlin/index.js";
63
+ export { SwiftConverter } from "./swift/index.js";
4
64
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,0CAA0C;AAC1C,EAAE;AACF,uDAAuD;AACvD,EAAE;AACF,uCAAuC;AACvC,oFAAoF;AACpF,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AAGjF,OAAO,EACL,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,GAEf,MAAM,kBAAkB,CAAC;AAsC1B,SAAS,YAAY,CAAC,CAKrB;IACC,OAAO;QACL,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,MAA6B,EAC7B,IAA8B;IAE9B,OAAO,YAAY,CAAC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACxB,MAA6B,EAC7B,IAA0B;IAE1B,OAAO,YAAY,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CACvB,MAA6B,EAC7B,IAAyB;IAEzB,OAAO,YAAY,CAAC,IAAI,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,oEAAoE;AACpE,iFAAiF;AACjF,qEAAqE;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { JSONSchema7Definition } from "json-schema";
2
- import { ConverterOptions, IRNode, SignatureOccurrences } from "./types.js";
2
+ import { ConverterOptions, IRNode, SignatureOccurrences } from "../types.js";
3
3
  /**
4
4
  * JSONSchemaConverter converts a JSON Schema (Draft-07) into an
5
5
  * intermediate representation (IR) that can later be transformed
@@ -262,9 +262,15 @@ export class JSONSchemaConverter {
262
262
  }
263
263
  case "array": {
264
264
  const name = this.getTypeName(schema, ctx);
265
- // Step 1.7: Tuple validation: items is an array of positional schemas
266
- if (schema.items && Array.isArray(schema.items)) {
267
- const tupleItems = schema.items.map((item, i) => this.convertSchema(item, {
265
+ // Step 1.7: Tuple validation: positional schemas via legacy
266
+ // `items: [...]` (Draft-07) or modern `prefixItems: [...]`
267
+ // (JSON Schema 2020-12). Both spellings are accepted.
268
+ const tupleSpec = Array.isArray(schema.items)
269
+ ? schema.items
270
+ : (schema
271
+ .prefixItems);
272
+ if (tupleSpec) {
273
+ const tupleItems = tupleSpec.map((item, i) => this.convertSchema(item, {
268
274
  path: ctx.path ? `${ctx.path}.${i}` : `${i}`,
269
275
  }));
270
276
  const tupleNode = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONSchemaConverter.js","sourceRoot":"","sources":["../../src/ir/JSONSchemaConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./JSONSchemaConverter.js";
@@ -0,0 +1,2 @@
1
+ export * from "./JSONSchemaConverter.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ir/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { BaseConverter, GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ export declare const KOTLIN_RESERVED: Set<string>;
4
+ /**
5
+ * Converts a JSON property key into a valid Kotlin identifier:
6
+ * - kebab/snake → camelCase
7
+ * - non-identifier chars stripped
8
+ * - leading digit gets `_` prefix
9
+ * - reserved words get `_` suffix
10
+ * - empty result becomes "value"
11
+ */
12
+ export declare function sanitizeKotlinIdentifier(raw: string): string;
13
+ export declare abstract class KotlinBaseConverter extends BaseConverter {
14
+ /** @internal Mutated by KotlinConverter helper modules; not part of the public API. */
15
+ importsSet: Set<string>;
16
+ /** @internal Public for `BaseConverterContext`; treat as protected for subclasses. */
17
+ abstract generateObjectType(ir: IRNode, utils: GenerateTypeUtils): string;
18
+ }
@@ -0,0 +1,36 @@
1
+ import { BaseConverter } from "../converter/BaseConverter.js";
2
+ export const KOTLIN_RESERVED = new Set([
3
+ "as", "break", "class", "continue", "do", "else", "false", "for", "fun",
4
+ "if", "in", "init", "interface", "is", "null", "object", "package", "return",
5
+ "super", "this", "throw", "true", "try", "typealias", "typeof", "val",
6
+ "var", "when", "while",
7
+ ]);
8
+ /**
9
+ * Converts a JSON property key into a valid Kotlin identifier:
10
+ * - kebab/snake → camelCase
11
+ * - non-identifier chars stripped
12
+ * - leading digit gets `_` prefix
13
+ * - reserved words get `_` suffix
14
+ * - empty result becomes "value"
15
+ */
16
+ export function sanitizeKotlinIdentifier(raw) {
17
+ // kebab/snake → camelCase
18
+ let name = raw.replace(/[-_](.)/g, (_, c) => c.toUpperCase());
19
+ // strip remaining invalid chars
20
+ name = name.replace(/[^a-zA-Z0-9_]/g, "");
21
+ if (!name)
22
+ name = "value";
23
+ if (/^\d/.test(name))
24
+ name = "_" + name;
25
+ if (KOTLIN_RESERVED.has(name))
26
+ name = name + "_";
27
+ return name;
28
+ }
29
+ export class KotlinBaseConverter extends BaseConverter {
30
+ constructor() {
31
+ super(...arguments);
32
+ /** @internal Mutated by KotlinConverter helper modules; not part of the public API. */
33
+ this.importsSet = new Set();
34
+ }
35
+ }
36
+ //# sourceMappingURL=KotlinBaseConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KotlinBaseConverter.js","sourceRoot":"","sources":["../../src/kotlin/KotlinBaseConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,+BAA+B,CAAC;AAGjF,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK;IACvE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;IAC5E,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK;IACrE,KAAK,EAAE,MAAM,EAAE,OAAO;CACvB,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,0BAA0B;IAC1B,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,CAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,gCAAgC;IAChC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,IAAI,GAAG,OAAO,CAAC;IAC1B,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;IACxC,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAgB,mBAAoB,SAAQ,aAAa;IAA/D;;QACE,uFAAuF;QAChF,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAIxC,CAAC;CAAA"}
@@ -0,0 +1,67 @@
1
+ import { JSONSchema7Definition } from "json-schema";
2
+ import { ILanguageConverter, IRNode } from "../types.js";
3
+ import { BaseConverterContext, BaseConverterOpts, GenerateTypeUtils, LanguageProfile } from "../converter/BaseConverter.js";
4
+ import { KotlinBaseConverter } from "./KotlinBaseConverter.js";
5
+ export interface KotlinConverterOpts extends BaseConverterOpts {
6
+ serializer?: "kotlinx" | "none";
7
+ packageName?: string;
8
+ }
9
+ /**
10
+ * The state-and-method surface that helper modules in `src/kotlin/` need to
11
+ * operate on a KotlinConverter instance. KotlinConverter implements this;
12
+ * helpers take it as their first argument.
13
+ *
14
+ * @internal
15
+ */
16
+ export interface KotlinConverterContext extends BaseConverterContext {
17
+ readonly isKotlinx: boolean;
18
+ readonly importsSet: Set<string>;
19
+ readonly contextualNodes: WeakSet<IRNode>;
20
+ readonly docFormatNodes: WeakMap<IRNode, string>;
21
+ readonly propertySerialNames: WeakMap<IRNode, string>;
22
+ readonly enumDecls: Map<string, {
23
+ name: string;
24
+ values: string[];
25
+ }>;
26
+ readonly sealedDecls: string[];
27
+ generateType(ir: IRNode, utils: GenerateTypeUtils): string;
28
+ emitSealedInterface(ir: IRNode, utils: GenerateTypeUtils): string;
29
+ }
30
+ export declare class KotlinConverter extends KotlinBaseConverter implements ILanguageConverter, KotlinConverterContext {
31
+ readonly code: string;
32
+ readonly rootTypeName: string;
33
+ readonly extractedTypeNames: string[];
34
+ readonly imports: string[];
35
+ /** @internal Public for `BaseConverterContext`; treat as protected for subclasses. */
36
+ readonly languageProfile: LanguageProfile;
37
+ /** @internal Mutated by KotlinConverter helper modules; not part of the public API. */
38
+ isKotlinx: boolean;
39
+ /** @internal */
40
+ enumDecls: Map<string, {
41
+ name: string;
42
+ values: string[];
43
+ }>;
44
+ /** @internal */
45
+ propertySerialNames: WeakMap<IRNode, string>;
46
+ /** @internal */
47
+ contextualNodes: WeakSet<IRNode>;
48
+ /** @internal */
49
+ docFormatNodes: WeakMap<IRNode, string>;
50
+ /** @internal */
51
+ sealedDecls: string[];
52
+ constructor(schema: JSONSchema7Definition, opts?: KotlinConverterOpts);
53
+ /** @internal Public for `KotlinConverterContext`; treat as protected for subclasses. */
54
+ generateType(ir: IRNode, utils: GenerateTypeUtils): string;
55
+ /** @internal Public for `BaseConverterContext`; treat as protected for subclasses. */
56
+ generateObjectType(ir: IRNode, utils: GenerateTypeUtils): string;
57
+ /** @internal Public for `KotlinConverterContext`; treat as protected for subclasses. */
58
+ emitSealedInterface(ir: IRNode, utils: GenerateTypeUtils): string;
59
+ /**
60
+ * Assembles the final Kotlin source by joining the (optional) `package` line
61
+ * and a list of top-level declarations with blank-line separators, terminated
62
+ * by a trailing newline. Uses {@link Emitter} for indent/block tracking
63
+ * (Kotlin top-level decls are at indent 0, so this is essentially a join,
64
+ * but keeps assembly consistent with other language emitters).
65
+ */
66
+ private assembleCode;
67
+ }