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,142 @@
1
+ import { JSONSchemaConverter } from "../ir/JSONSchemaConverter.js";
2
+ import { Emitter } from "../converter/Emitter.js";
3
+ import { KotlinBaseConverter } from "./KotlinBaseConverter.js";
4
+ import { guardUnsupportedKeywords } from "./unsupported.js";
5
+ import { buildEnumDeclarations } from "./enums.js";
6
+ import { generateKotlinType } from "./typeMapper.js";
7
+ import { generateKotlinObjectType } from "./objectEmitter.js";
8
+ import { emitSealedInterface, sealedDeclsContainsName } from "./sealedUnion.js";
9
+ import { serializableAnnotation, KOTLIN_ANNOTATION_IMPORTS } from "./annotations.js";
10
+ export class KotlinConverter extends KotlinBaseConverter {
11
+ constructor(schema, opts) {
12
+ super();
13
+ /** @internal */
14
+ this.enumDecls = new Map();
15
+ /** @internal */
16
+ this.propertySerialNames = new WeakMap();
17
+ /** @internal */
18
+ this.contextualNodes = new WeakSet();
19
+ /** @internal */
20
+ this.docFormatNodes = new WeakMap();
21
+ /** @internal */
22
+ this.sealedDecls = [];
23
+ this.baseOpts = opts;
24
+ if (opts?.nameRegistry)
25
+ this.usedDeclarationNames = opts.nameRegistry;
26
+ this.isKotlinx = (opts?.serializer ?? "kotlinx") === "kotlinx";
27
+ this.languageProfile = {
28
+ language: "kotlin",
29
+ processOneOfAsDiscriminatedUnion: true,
30
+ shouldEraseDiscriminator: this.isKotlinx,
31
+ getDiscriminatedVariantParentName: (ir) => {
32
+ const segments = ir.path.split(".").filter((x) => !/^\d+$/.test(x));
33
+ const fromPath = segments[segments.length - 1] ?? "";
34
+ return fromPath || ir.name || ir.title || "";
35
+ },
36
+ };
37
+ const ir = this.mergeCompatibleUnions(new JSONSchemaConverter(schema).irNode);
38
+ this.enhanceDiscriminatedUnions(ir);
39
+ guardUnsupportedKeywords(this, ir);
40
+ if (opts?.rootTypeName)
41
+ ir.name = opts.rootTypeName;
42
+ if (!ir.name)
43
+ ir.name = ir.title || "Root";
44
+ this.rootName = ir.name;
45
+ this.usedDeclarationNames.add(ir.name);
46
+ const utils = {
47
+ getReferencedType: this.getReferencedType.bind(this),
48
+ };
49
+ // Root-level string enum: emit a single `enum class` and skip the data-class path.
50
+ if (ir.type === "enum" && ir.values?.every((v) => typeof v === "string")) {
51
+ const key = JSON.stringify([...ir.values].sort());
52
+ this.enumDecls.set(key, { name: ir.name, values: ir.values });
53
+ const enumCode = buildEnumDeclarations(this);
54
+ this.code = this.assembleCode(opts?.packageName, enumCode);
55
+ this.rootTypeName = ir.name;
56
+ this.extractedTypeNames = [];
57
+ this.imports = [...this.importsSet].sort();
58
+ return;
59
+ }
60
+ let rootDecl;
61
+ let needsRootDataClass = true;
62
+ if (ir.type === "union" &&
63
+ ir.options?.length &&
64
+ ir.options.every((o) => this.variantNames.has(o))) {
65
+ // Root IS the discriminated union — emit it via emitSealedInterface, no wrapper data class
66
+ this.emitSealedInterface(ir, utils);
67
+ needsRootDataClass = false;
68
+ rootDecl = "";
69
+ }
70
+ else {
71
+ const rootBody = this.generateObjectType(ir, utils);
72
+ const rootDeclAnn = this.isKotlinx ? serializableAnnotation() + "\n" : "";
73
+ if (this.isKotlinx)
74
+ this.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serializable);
75
+ const rootDoc = this.rootDoc;
76
+ const rootDocPrefix = rootDoc ? `/** ${rootDoc} */\n` : "";
77
+ rootDecl = `${rootDocPrefix}${rootDeclAnn}data class ${ir.name}${rootBody}`;
78
+ }
79
+ const childDecls = this.refTypes
80
+ .filter(({ name }) => name !== this.rootName && !sealedDeclsContainsName(this, name))
81
+ .map(({ name, code, doc }) => {
82
+ if (this.isKotlinx)
83
+ this.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serializable);
84
+ const docPrefix = doc ? `/** ${doc} */\n` : "";
85
+ return `${docPrefix}${this.isKotlinx ? serializableAnnotation() + "\n" : ""}data class ${name}${code}`;
86
+ });
87
+ const enumCode = buildEnumDeclarations(this);
88
+ const allDecls = [...enumCode, ...this.sealedDecls, ...childDecls];
89
+ if (needsRootDataClass)
90
+ allDecls.push(rootDecl);
91
+ this.code = this.assembleCode(opts?.packageName, allDecls);
92
+ this.rootTypeName = ir.name;
93
+ const refTypeNames = this.computeExtractedTypeNames().filter((n) => n !== this.rootTypeName && !sealedDeclsContainsName(this, n));
94
+ const enumNames = [...this.enumDecls.values()]
95
+ .map(({ name }) => name)
96
+ .filter((n) => n !== this.rootTypeName);
97
+ const sealedNames = this.sealedDecls
98
+ .map((d) => {
99
+ const m = d.match(/data class (\w+)/) || d.match(/sealed interface (\w+)/);
100
+ return m ? m[1] : null;
101
+ })
102
+ .filter((n) => !!n && n !== this.rootTypeName);
103
+ this.extractedTypeNames = [
104
+ ...new Set([...enumNames, ...sealedNames, ...refTypeNames]),
105
+ ];
106
+ this.imports = [...this.importsSet].sort();
107
+ }
108
+ /** @internal Public for `KotlinConverterContext`; treat as protected for subclasses. */
109
+ generateType(ir, utils) {
110
+ return generateKotlinType(this, ir, utils);
111
+ }
112
+ /** @internal Public for `BaseConverterContext`; treat as protected for subclasses. */
113
+ generateObjectType(ir, utils) {
114
+ return generateKotlinObjectType(this, ir, utils);
115
+ }
116
+ /** @internal Public for `KotlinConverterContext`; treat as protected for subclasses. */
117
+ emitSealedInterface(ir, utils) {
118
+ return emitSealedInterface(this, ir, utils);
119
+ }
120
+ /**
121
+ * Assembles the final Kotlin source by joining the (optional) `package` line
122
+ * and a list of top-level declarations with blank-line separators, terminated
123
+ * by a trailing newline. Uses {@link Emitter} for indent/block tracking
124
+ * (Kotlin top-level decls are at indent 0, so this is essentially a join,
125
+ * but keeps assembly consistent with other language emitters).
126
+ */
127
+ assembleCode(packageName, decls) {
128
+ const filtered = decls.filter(Boolean);
129
+ const e = new Emitter({ indentUnit: " " });
130
+ if (packageName) {
131
+ e.line(`package ${packageName}`);
132
+ e.blank();
133
+ }
134
+ for (let i = 0; i < filtered.length; i++) {
135
+ e.raw(filtered[i]);
136
+ if (i < filtered.length - 1)
137
+ e.blank();
138
+ }
139
+ return e.toString() + "\n";
140
+ }
141
+ }
142
+ //# sourceMappingURL=KotlinConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KotlinConverter.js","sourceRoot":"","sources":["../../src/kotlin/KotlinConverter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Pure helpers for constructing Kotlin annotation strings.
3
+ *
4
+ * Centralizes the literal text used across the Kotlin emitter modules so
5
+ * that adding a new annotation, changing import FQNs, or tightening the
6
+ * string format only happens in one place.
7
+ *
8
+ * All helpers are pure: no state, no side effects. Callers add the
9
+ * corresponding import to `importsSet` themselves (the FQNs are exposed
10
+ * via `KOTLIN_ANNOTATION_IMPORTS`).
11
+ */
12
+ /** `@Serializable` */
13
+ export declare function serializableAnnotation(): string;
14
+ /** `@SerialName("<value>")` */
15
+ export declare function serialNameAnnotation(value: string): string;
16
+ /** `@Contextual` */
17
+ export declare function contextualAnnotation(): string;
18
+ /** `@JsonClassDiscriminator("<field>")` */
19
+ export declare function jsonClassDiscriminatorAnnotation(field: string): string;
20
+ /** Fully qualified import paths for each annotation. */
21
+ export declare const KOTLIN_ANNOTATION_IMPORTS: {
22
+ readonly serializable: "kotlinx.serialization.Serializable";
23
+ readonly serialName: "kotlinx.serialization.SerialName";
24
+ readonly contextual: "kotlinx.serialization.Contextual";
25
+ readonly jsonClassDiscriminator: "kotlinx.serialization.json.JsonClassDiscriminator";
26
+ };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Pure helpers for constructing Kotlin annotation strings.
3
+ *
4
+ * Centralizes the literal text used across the Kotlin emitter modules so
5
+ * that adding a new annotation, changing import FQNs, or tightening the
6
+ * string format only happens in one place.
7
+ *
8
+ * All helpers are pure: no state, no side effects. Callers add the
9
+ * corresponding import to `importsSet` themselves (the FQNs are exposed
10
+ * via `KOTLIN_ANNOTATION_IMPORTS`).
11
+ */
12
+ /** `@Serializable` */
13
+ export function serializableAnnotation() {
14
+ return "@Serializable";
15
+ }
16
+ /** `@SerialName("<value>")` */
17
+ export function serialNameAnnotation(value) {
18
+ return `@SerialName("${value}")`;
19
+ }
20
+ /** `@Contextual` */
21
+ export function contextualAnnotation() {
22
+ return "@Contextual";
23
+ }
24
+ /** `@JsonClassDiscriminator("<field>")` */
25
+ export function jsonClassDiscriminatorAnnotation(field) {
26
+ return `@JsonClassDiscriminator("${field}")`;
27
+ }
28
+ /** Fully qualified import paths for each annotation. */
29
+ export const KOTLIN_ANNOTATION_IMPORTS = {
30
+ serializable: "kotlinx.serialization.Serializable",
31
+ serialName: "kotlinx.serialization.SerialName",
32
+ contextual: "kotlinx.serialization.Contextual",
33
+ jsonClassDiscriminator: "kotlinx.serialization.json.JsonClassDiscriminator",
34
+ };
35
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/kotlin/annotations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,sBAAsB;AACtB,MAAM,UAAU,sBAAsB;IACpC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,gBAAgB,KAAK,IAAI,CAAC;AACnC,CAAC;AAED,oBAAoB;AACpB,MAAM,UAAU,oBAAoB;IAClC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,gCAAgC,CAAC,KAAa;IAC5D,OAAO,4BAA4B,KAAK,IAAI,CAAC;AAC/C,CAAC;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,YAAY,EAAE,oCAAoC;IAClD,UAAU,EAAE,kCAAkC;IAC9C,UAAU,EAAE,kCAAkC;IAC9C,sBAAsB,EAAE,mDAAmD;CACnE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { KotlinConverterContext } from "./KotlinConverter.js";
2
+ /**
3
+ * Returns or creates a Kotlin enum class declaration name for a given set of
4
+ * string values, deduplicating by sorted-values key. Tracks the declaration
5
+ * for later emission via {@link buildEnumDeclarations}.
6
+ */
7
+ export declare function getOrCreateEnumDecl(c: KotlinConverterContext, values: string[], path: string): string;
8
+ /** Sanitizes a JSON enum value into a Kotlin enum member name (UPPER_SNAKE_CASE). */
9
+ export declare function toEnumMemberName(value: string): string;
10
+ /**
11
+ * Builds Kotlin `enum class` declarations from the converter's accumulated
12
+ * `enumDecls` map. Used for both nested enums (rendered alongside data
13
+ * classes) and root-level enum schemas (where the root IS the enum).
14
+ */
15
+ export declare function buildEnumDeclarations(c: KotlinConverterContext): string[];
@@ -0,0 +1,58 @@
1
+ import { toPascalCase } from "../utils/to-pascal-case.js";
2
+ import { serializableAnnotation, serialNameAnnotation, KOTLIN_ANNOTATION_IMPORTS } from "./annotations.js";
3
+ /**
4
+ * Returns or creates a Kotlin enum class declaration name for a given set of
5
+ * string values, deduplicating by sorted-values key. Tracks the declaration
6
+ * for later emission via {@link buildEnumDeclarations}.
7
+ */
8
+ export function getOrCreateEnumDecl(c, values, path) {
9
+ const key = JSON.stringify([...values].sort());
10
+ const existing = c.enumDecls.get(key);
11
+ if (existing)
12
+ return existing.name;
13
+ const segments = path.split(".").filter((x) => !/^\d+$/.test(x));
14
+ const baseName = segments.map((s) => toPascalCase(s)).join("") || "Value";
15
+ const name = c.findAvailableName(baseName);
16
+ c.usedDeclarationNames.add(name);
17
+ c.enumDecls.set(key, { name, values });
18
+ return name;
19
+ }
20
+ /** Sanitizes a JSON enum value into a Kotlin enum member name (UPPER_SNAKE_CASE). */
21
+ export function toEnumMemberName(value) {
22
+ let n = value.toUpperCase().replace(/[^A-Z0-9]/g, "_").replace(/^_+|_+$/g, "");
23
+ if (!n)
24
+ n = "VALUE";
25
+ if (/^\d/.test(n))
26
+ n = "_" + n;
27
+ return n;
28
+ }
29
+ /**
30
+ * Builds Kotlin `enum class` declarations from the converter's accumulated
31
+ * `enumDecls` map. Used for both nested enums (rendered alongside data
32
+ * classes) and root-level enum schemas (where the root IS the enum).
33
+ */
34
+ export function buildEnumDeclarations(c) {
35
+ return [...c.enumDecls.values()].map(({ name, values }) => {
36
+ const usedMembers = new Set();
37
+ const members = values.map((v) => {
38
+ let m = toEnumMemberName(v);
39
+ const base = m;
40
+ let i = 2;
41
+ while (usedMembers.has(m)) {
42
+ m = base + i;
43
+ i++;
44
+ }
45
+ usedMembers.add(m);
46
+ if (c.isKotlinx && m !== v) {
47
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serialName);
48
+ return `${serialNameAnnotation(v)} ${m}`;
49
+ }
50
+ return m;
51
+ });
52
+ const classAnn = c.isKotlinx ? serializableAnnotation() + "\n" : "";
53
+ if (c.isKotlinx)
54
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serializable);
55
+ return `${classAnn}enum class ${name} { ${members.join(", ")} }`;
56
+ });
57
+ }
58
+ //# sourceMappingURL=enums.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/kotlin/enums.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `ajsc/kotlin` — class-based Kotlin converter and identifier utilities.
3
+ *
4
+ * Most consumers should prefer the function-style `emitKotlin` exported from
5
+ * the package root (`ajsc`). Use this subpath when you need direct access to
6
+ * the {@link KotlinConverter} class for subclassing, or to the identifier
7
+ * sanitization helpers (`sanitizeKotlinIdentifier`, `KOTLIN_RESERVED`) when
8
+ * building tooling around Kotlin output.
9
+ *
10
+ * @see {@link ../docs/architecture/README.md} for the layered design.
11
+ */
12
+ export * from "./KotlinBaseConverter.js";
13
+ export * from "./KotlinConverter.js";
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `ajsc/kotlin` — class-based Kotlin converter and identifier utilities.
3
+ *
4
+ * Most consumers should prefer the function-style `emitKotlin` exported from
5
+ * the package root (`ajsc`). Use this subpath when you need direct access to
6
+ * the {@link KotlinConverter} class for subclassing, or to the identifier
7
+ * sanitization helpers (`sanitizeKotlinIdentifier`, `KOTLIN_RESERVED`) when
8
+ * building tooling around Kotlin output.
9
+ *
10
+ * @see {@link ../docs/architecture/README.md} for the layered design.
11
+ */
12
+ export * from "./KotlinBaseConverter.js";
13
+ export * from "./KotlinConverter.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kotlin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ import type { KotlinConverterContext } from "./KotlinConverter.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 Kotlin data-class constructor body for an object IR node, including
8
+ * KDoc comments for unmodelled `additionalProperties`, per-property
9
+ * `@SerialName`/`@Contextual` annotations, and nullable/default-value suffixes
10
+ * driven by `required` and union-includes-null analysis.
11
+ */
12
+ export declare function generateKotlinObjectType(c: KotlinConverterContext, ir: IRNode, utils: GenerateTypeUtils): string;
@@ -0,0 +1,74 @@
1
+ import { formatPrimitiveDefault } from "../converter/formatDefault.js";
2
+ import { sanitizeKotlinIdentifier } from "./KotlinBaseConverter.js";
3
+ import { generateKotlinType } from "./typeMapper.js";
4
+ import { serialNameAnnotation, contextualAnnotation, KOTLIN_ANNOTATION_IMPORTS } from "./annotations.js";
5
+ /** Returns true if the property is optional or its type union includes null. */
6
+ export function isPropertyNullable(prop) {
7
+ if (!prop.required)
8
+ return true;
9
+ if (prop.type === "union" && prop.options?.some((o) => o.type === "null")) {
10
+ return true;
11
+ }
12
+ return false;
13
+ }
14
+ /**
15
+ * Emits a Kotlin data-class constructor body for an object IR node, including
16
+ * KDoc comments for unmodelled `additionalProperties`, per-property
17
+ * `@SerialName`/`@Contextual` annotations, and nullable/default-value suffixes
18
+ * driven by `required` and union-includes-null analysis.
19
+ */
20
+ export function generateKotlinObjectType(c, ir, utils) {
21
+ // Record additionalProperties doc note for the declaration emission step
22
+ if (ir.additionalProperties && typeof ir.additionalProperties !== "boolean") {
23
+ const apType = generateKotlinType(c, ir.additionalProperties, utils);
24
+ const note = `Note: schema permits additional keys of type ${apType} — not modeled.`;
25
+ // For ref types: signature was set; find the latest registered refTypes entry for this signature
26
+ if (ir.signature) {
27
+ const entry = c.refTypes.find((e) => e.signature === ir.signature);
28
+ if (entry)
29
+ entry.doc = note;
30
+ }
31
+ // For root: ir.name === c.rootName at this point if root has no signature
32
+ if (ir.name === c.rootName) {
33
+ c.rootDoc = note;
34
+ }
35
+ }
36
+ if (!ir.properties || Object.keys(ir.properties).length === 0) {
37
+ return "()";
38
+ }
39
+ const lines = Object.entries(ir.properties).map(([key, prop]) => {
40
+ const name = sanitizeKotlinIdentifier(key);
41
+ if (name !== key && c.isKotlinx) {
42
+ c.propertySerialNames.set(prop, key);
43
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serialName);
44
+ }
45
+ const type = generateKotlinType(c, prop, utils);
46
+ const nullable = isPropertyNullable(prop);
47
+ const def = formatPrimitiveDefault(prop.defaultValue);
48
+ // Optional (not required) → ? = <default|null>. Required-but-nullable → ? (no default unless schema-provided).
49
+ let suffix;
50
+ if (!prop.required) {
51
+ suffix = def !== undefined ? `? = ${def}` : "? = null";
52
+ }
53
+ else if (nullable) {
54
+ suffix = def !== undefined ? `? = ${def}` : "?";
55
+ }
56
+ else {
57
+ suffix = def !== undefined ? ` = ${def}` : "";
58
+ }
59
+ const annotations = [];
60
+ if (c.docFormatNodes.has(prop)) {
61
+ annotations.push(` /** @format ${c.docFormatNodes.get(prop)} */`);
62
+ }
63
+ if (c.propertySerialNames.has(prop)) {
64
+ annotations.push(` ${serialNameAnnotation(c.propertySerialNames.get(prop))}`);
65
+ }
66
+ if (c.contextualNodes.has(prop)) {
67
+ annotations.push(` ${contextualAnnotation()}`);
68
+ }
69
+ const annPrefix = annotations.length > 0 ? annotations.join("\n") + "\n" : "";
70
+ return `${annPrefix} val ${name}: ${type}${suffix}`;
71
+ });
72
+ return `(\n${lines.join(",\n")},\n)`;
73
+ }
74
+ //# sourceMappingURL=objectEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objectEmitter.js","sourceRoot":"","sources":["../../src/kotlin/objectEmitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ import type { KotlinConverterContext } from "./KotlinConverter.js";
4
+ /**
5
+ * Emits a Kotlin `sealed interface` plus per-variant `data class` declarations
6
+ * for a discriminated union, registering them in `c.sealedDecls`. Idempotent
7
+ * for nested visits: re-emitting the same interface or variant short-circuits.
8
+ */
9
+ export declare function emitSealedInterface(c: KotlinConverterContext, ir: IRNode, utils: GenerateTypeUtils): string;
10
+ /** Derives the Kotlin sealed-interface name for a union IR node. */
11
+ export declare function deriveSealedName(c: KotlinConverterContext, ir: IRNode): string;
12
+ /**
13
+ * Substring-scans `c.sealedDecls` for an existing declaration matching the
14
+ * given name. Used to detect prior emission so the orchestrator can skip the
15
+ * regular ref-types path for sealed variants.
16
+ */
17
+ export declare function sealedDeclsContainsName(c: KotlinConverterContext, name: string): boolean;
@@ -0,0 +1,74 @@
1
+ import { generateKotlinObjectType } from "./objectEmitter.js";
2
+ import { serializableAnnotation, serialNameAnnotation, jsonClassDiscriminatorAnnotation, KOTLIN_ANNOTATION_IMPORTS } from "./annotations.js";
3
+ /**
4
+ * Emits a Kotlin `sealed interface` plus per-variant `data class` declarations
5
+ * for a discriminated union, registering them in `c.sealedDecls`. Idempotent
6
+ * for nested visits: re-emitting the same interface or variant short-circuits.
7
+ */
8
+ export function emitSealedInterface(c, ir, utils) {
9
+ const ifaceName = deriveSealedName(c, ir);
10
+ if (c.usedDeclarationNames.has(ifaceName) && sealedDeclsContainsName(c, ifaceName)) {
11
+ // already emitted (idempotency for nested visits)
12
+ return ifaceName;
13
+ }
14
+ c.usedDeclarationNames.add(ifaceName);
15
+ const options = ir.options;
16
+ const discriminator = c.findDiscriminatorProperty(options, c.collectUnionPropertyNames(options).sharedPropNames);
17
+ if (!discriminator)
18
+ return "Any";
19
+ for (const opt of options) {
20
+ const variantName = c.variantNames.get(opt);
21
+ if (c.usedDeclarationNames.has(variantName) &&
22
+ sealedDeclsContainsName(c, variantName)) {
23
+ continue;
24
+ }
25
+ c.usedDeclarationNames.add(variantName);
26
+ const discValue = c.getConstStringValue(opt.properties[discriminator]);
27
+ const tempIR = c.stripDiscriminatorField(opt, discriminator);
28
+ const body = generateKotlinObjectType(c, tempIR, utils);
29
+ const annotations = [];
30
+ if (c.isKotlinx) {
31
+ annotations.push(serializableAnnotation());
32
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serializable);
33
+ if (discValue) {
34
+ annotations.push(serialNameAnnotation(discValue));
35
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serialName);
36
+ }
37
+ }
38
+ const annPrefix = annotations.length > 0 ? annotations.join("\n") + "\n" : "";
39
+ c.sealedDecls.push(`${annPrefix}data class ${variantName}${body} : ${ifaceName}`);
40
+ }
41
+ const ifaceAnnotations = [];
42
+ if (c.isKotlinx) {
43
+ ifaceAnnotations.push(serializableAnnotation());
44
+ ifaceAnnotations.push(jsonClassDiscriminatorAnnotation(discriminator));
45
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.serializable);
46
+ c.importsSet.add(KOTLIN_ANNOTATION_IMPORTS.jsonClassDiscriminator);
47
+ }
48
+ const ifaceAnnPrefix = ifaceAnnotations.length > 0 ? ifaceAnnotations.join("\n") + "\n" : "";
49
+ c.sealedDecls.push(`${ifaceAnnPrefix}sealed interface ${ifaceName}`);
50
+ return ifaceName;
51
+ }
52
+ /** Derives the Kotlin sealed-interface name for a union IR node. */
53
+ export function deriveSealedName(c, ir) {
54
+ if (ir.name)
55
+ return ir.name;
56
+ if (ir.title)
57
+ return ir.title;
58
+ const segments = ir.path.split(".").filter((x) => !/^\d+$/.test(x));
59
+ const baseName = segments
60
+ .map((s) => s.charAt(0).toUpperCase() + s.slice(1))
61
+ .join("") || "Union";
62
+ return c.findAvailableName(baseName);
63
+ }
64
+ /**
65
+ * Substring-scans `c.sealedDecls` for an existing declaration matching the
66
+ * given name. Used to detect prior emission so the orchestrator can skip the
67
+ * regular ref-types path for sealed variants.
68
+ */
69
+ export function sealedDeclsContainsName(c, name) {
70
+ return c.sealedDecls.some((d) => d.includes(`data class ${name}(`) ||
71
+ d.includes(`data class ${name} `) ||
72
+ d.includes(`sealed interface ${name}`));
73
+ }
74
+ //# sourceMappingURL=sealedUnion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealedUnion.js","sourceRoot":"","sources":["../../src/kotlin/sealedUnion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { GenerateTypeUtils } from "../converter/BaseConverter.js";
2
+ import { IRNode } from "../types.js";
3
+ import type { KotlinConverterContext } from "./KotlinConverter.js";
4
+ export declare const PRIMITIVES: Record<string, string>;
5
+ export declare const FORMAT_MAP: Record<string, {
6
+ type: string;
7
+ import: string;
8
+ needsContextual: boolean;
9
+ }>;
10
+ export declare const STRING_DOC_FORMATS: Set<string>;
11
+ /**
12
+ * Maps an IRNode to its Kotlin type expression. Handles primitives, formatted
13
+ * strings (with `@Contextual` and KDoc tracking), arrays, tuples (Pair/Triple),
14
+ * referenced object types, string enums, literals, and unions (T | null
15
+ * unwrapping, sealed-interface dispatch, unsupported-union policy).
16
+ */
17
+ export declare function generateKotlinType(c: KotlinConverterContext, ir: IRNode, utils: GenerateTypeUtils): string;