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.
- package/CHANGELOG.md +103 -0
- package/README.md +303 -144
- package/dist/converter/BaseConverter.d.ts +315 -0
- package/dist/converter/BaseConverter.js +131 -0
- package/dist/converter/BaseConverter.js.map +1 -0
- package/dist/converter/Emitter.d.ts +35 -0
- package/dist/converter/Emitter.js +50 -0
- package/dist/converter/Emitter.js.map +1 -0
- package/dist/converter/discriminatedUnions.d.ts +47 -0
- package/dist/converter/discriminatedUnions.js +168 -0
- package/dist/converter/discriminatedUnions.js.map +1 -0
- package/dist/converter/formatDefault.d.ts +20 -0
- package/dist/converter/formatDefault.js +31 -0
- package/dist/converter/formatDefault.js.map +1 -0
- package/dist/converter/index.d.ts +24 -0
- package/dist/converter/index.js +24 -0
- package/dist/converter/index.js.map +1 -0
- package/dist/converter/mergeUnions.d.ts +36 -0
- package/dist/converter/mergeUnions.js +189 -0
- package/dist/converter/mergeUnions.js.map +1 -0
- package/dist/converter/naming.d.ts +29 -0
- package/dist/converter/naming.js +137 -0
- package/dist/converter/naming.js.map +1 -0
- package/dist/converter/registry.d.ts +18 -0
- package/dist/converter/registry.js +50 -0
- package/dist/converter/registry.js.map +1 -0
- package/dist/converter/walk.d.ts +9 -0
- package/dist/converter/walk.js +40 -0
- package/dist/converter/walk.js.map +1 -0
- package/dist/index.d.ts +71 -3
- package/dist/index.js +63 -3
- package/dist/index.js.map +1 -1
- package/dist/{JSONSchemaConverter.d.ts → ir/JSONSchemaConverter.d.ts} +1 -1
- package/dist/{JSONSchemaConverter.js → ir/JSONSchemaConverter.js} +9 -3
- package/dist/ir/JSONSchemaConverter.js.map +1 -0
- package/dist/ir/index.d.ts +1 -0
- package/dist/ir/index.js +2 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/kotlin/KotlinBaseConverter.d.ts +18 -0
- package/dist/kotlin/KotlinBaseConverter.js +36 -0
- package/dist/kotlin/KotlinBaseConverter.js.map +1 -0
- package/dist/kotlin/KotlinConverter.d.ts +67 -0
- package/dist/kotlin/KotlinConverter.js +142 -0
- package/dist/kotlin/KotlinConverter.js.map +1 -0
- package/dist/kotlin/annotations.d.ts +26 -0
- package/dist/kotlin/annotations.js +35 -0
- package/dist/kotlin/annotations.js.map +1 -0
- package/dist/kotlin/enums.d.ts +15 -0
- package/dist/kotlin/enums.js +58 -0
- package/dist/kotlin/enums.js.map +1 -0
- package/dist/kotlin/index.d.ts +13 -0
- package/dist/kotlin/index.js +14 -0
- package/dist/kotlin/index.js.map +1 -0
- package/dist/kotlin/objectEmitter.d.ts +12 -0
- package/dist/kotlin/objectEmitter.js +74 -0
- package/dist/kotlin/objectEmitter.js.map +1 -0
- package/dist/kotlin/sealedUnion.d.ts +17 -0
- package/dist/kotlin/sealedUnion.js +74 -0
- package/dist/kotlin/sealedUnion.js.map +1 -0
- package/dist/kotlin/typeMapper.d.ts +17 -0
- package/dist/kotlin/typeMapper.js +107 -0
- package/dist/kotlin/typeMapper.js.map +1 -0
- package/dist/kotlin/unsupported.d.ts +13 -0
- package/dist/kotlin/unsupported.js +53 -0
- package/dist/kotlin/unsupported.js.map +1 -0
- package/dist/swift/SwiftBaseConverter.d.ts +18 -0
- package/dist/swift/SwiftBaseConverter.js +38 -0
- package/dist/swift/SwiftBaseConverter.js.map +1 -0
- package/dist/swift/SwiftConverter.d.ts +60 -0
- package/dist/swift/SwiftConverter.js +113 -0
- package/dist/swift/SwiftConverter.js.map +1 -0
- package/dist/swift/discriminatedEnum.d.ts +18 -0
- package/dist/swift/discriminatedEnum.js +99 -0
- package/dist/swift/discriminatedEnum.js.map +1 -0
- package/dist/swift/enums.d.ts +15 -0
- package/dist/swift/enums.js +62 -0
- package/dist/swift/enums.js.map +1 -0
- package/dist/swift/index.d.ts +13 -0
- package/dist/swift/index.js +14 -0
- package/dist/swift/index.js.map +1 -0
- package/dist/swift/structEmitter.d.ts +12 -0
- package/dist/swift/structEmitter.js +70 -0
- package/dist/swift/structEmitter.js.map +1 -0
- package/dist/swift/typeMapper.d.ts +18 -0
- package/dist/swift/typeMapper.js +106 -0
- package/dist/swift/typeMapper.js.map +1 -0
- package/dist/swift/unsupported.d.ts +19 -0
- package/dist/swift/unsupported.js +88 -0
- package/dist/swift/unsupported.js.map +1 -0
- package/dist/typescript/TypescriptBaseConverter.d.ts +25 -0
- package/dist/typescript/TypescriptBaseConverter.js +178 -0
- package/dist/typescript/TypescriptBaseConverter.js.map +1 -0
- package/dist/typescript/TypescriptConverter.d.ts +74 -0
- package/dist/typescript/TypescriptConverter.js +254 -0
- package/dist/typescript/TypescriptConverter.js.map +1 -0
- package/dist/typescript/index.d.ts +12 -0
- package/dist/typescript/index.js +13 -0
- package/dist/typescript/index.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +39 -6
- package/dist/JSONSchemaConverter.js.map +0 -1
- package/dist/JSONSchemaConverter.test.d.ts +0 -1
- package/dist/JSONSchemaConverter.test.js +0 -585
- package/dist/JSONSchemaConverter.test.js.map +0 -1
- package/dist/Typebox.test.d.ts +0 -1
- package/dist/Typebox.test.js +0 -88
- package/dist/Typebox.test.js.map +0 -1
- package/dist/TypescriptBaseConverter.d.ts +0 -75
- package/dist/TypescriptBaseConverter.js +0 -321
- package/dist/TypescriptBaseConverter.js.map +0 -1
- package/dist/TypescriptConverter.additionalProperties.test.d.ts +0 -1
- package/dist/TypescriptConverter.additionalProperties.test.js +0 -110
- package/dist/TypescriptConverter.additionalProperties.test.js.map +0 -1
- package/dist/TypescriptConverter.arrays.test.d.ts +0 -1
- package/dist/TypescriptConverter.arrays.test.js +0 -130
- package/dist/TypescriptConverter.arrays.test.js.map +0 -1
- package/dist/TypescriptConverter.composites.advanced.test.d.ts +0 -1
- package/dist/TypescriptConverter.composites.advanced.test.js +0 -1070
- package/dist/TypescriptConverter.composites.advanced.test.js.map +0 -1
- package/dist/TypescriptConverter.composites.test.d.ts +0 -1
- package/dist/TypescriptConverter.composites.test.js +0 -335
- package/dist/TypescriptConverter.composites.test.js.map +0 -1
- package/dist/TypescriptConverter.d.ts +0 -163
- package/dist/TypescriptConverter.js +0 -606
- package/dist/TypescriptConverter.js.map +0 -1
- package/dist/TypescriptConverter.jsdoc.test.d.ts +0 -1
- package/dist/TypescriptConverter.jsdoc.test.js +0 -194
- package/dist/TypescriptConverter.jsdoc.test.js.map +0 -1
- package/dist/TypescriptConverter.objects.test.d.ts +0 -1
- package/dist/TypescriptConverter.objects.test.js +0 -258
- package/dist/TypescriptConverter.objects.test.js.map +0 -1
- package/dist/TypescriptConverter.options.test.d.ts +0 -1
- package/dist/TypescriptConverter.options.test.js +0 -501
- package/dist/TypescriptConverter.options.test.js.map +0 -1
- package/dist/TypescriptConverter.primitives.test.d.ts +0 -1
- package/dist/TypescriptConverter.primitives.test.js +0 -26
- package/dist/TypescriptConverter.primitives.test.js.map +0 -1
- package/dist/utils/path-utils.test.d.ts +0 -1
- package/dist/utils/path-utils.test.js +0 -92
- 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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,CAAwB,EACxB,MAAgB,EAChB,IAAY;IAEZ,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC;IAC1E,MAAM,IAAI,GAAG,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,6DAA6D;IAC7D,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAE,CAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC;QAAE,CAAC,GAAG,OAAO,CAAC;IACpB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IAC/B,wFAAwF;IACxF,wEAAwE;IACxE,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3D,iDAAiD;IACjD,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,CAAwB;IAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QACxD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,IAAI,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,KAAK,GAAG,QAAQ,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAC,QAAQ,GAAG,KAAK,GAAG,CAAC,CAAC;gBAAC,CAAC,EAAE,CAAC;YAAC,CAAC;YAC9D,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,yEAAyE;YACzE,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,OAAO,UAAU,QAAQ,EAAE,CAAC;YAC9B,CAAC;YACD,OAAO,UAAU,QAAQ,OAAO,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,OAAO,GAAG,CAAC,CAAC,WAAW,SAAS,IAAI,WAAW,WAAW,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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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"}
|