sparkling-method-cli 2.0.0-rc.1

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 (86) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +37 -0
  3. package/dist/codegen/definition-parser.d.ts +5 -0
  4. package/dist/codegen/definition-parser.d.ts.map +1 -0
  5. package/dist/codegen/definition-parser.js +376 -0
  6. package/dist/codegen/definition-parser.js.map +1 -0
  7. package/dist/codegen/index.d.ts +3 -0
  8. package/dist/codegen/index.d.ts.map +1 -0
  9. package/dist/codegen/index.js +99 -0
  10. package/dist/codegen/index.js.map +1 -0
  11. package/dist/codegen/kotlin.d.ts +4 -0
  12. package/dist/codegen/kotlin.d.ts.map +1 -0
  13. package/dist/codegen/kotlin.js +273 -0
  14. package/dist/codegen/kotlin.js.map +1 -0
  15. package/dist/codegen/metadata.d.ts +4 -0
  16. package/dist/codegen/metadata.d.ts.map +1 -0
  17. package/dist/codegen/metadata.js +78 -0
  18. package/dist/codegen/metadata.js.map +1 -0
  19. package/dist/codegen/swift.d.ts +4 -0
  20. package/dist/codegen/swift.d.ts.map +1 -0
  21. package/dist/codegen/swift.js +145 -0
  22. package/dist/codegen/swift.js.map +1 -0
  23. package/dist/codegen/template/android/kotlin-idl-template +119 -0
  24. package/dist/codegen/template/android/kotlin-impl-template +0 -0
  25. package/dist/codegen/template/ios/oc-idl-template +0 -0
  26. package/dist/codegen/template/ios/oc-impl-template +0 -0
  27. package/dist/codegen/template/ios/swift-idl-template +83 -0
  28. package/dist/codegen/template/ios/swift-impl-template +0 -0
  29. package/dist/codegen/template/ts/call-template +0 -0
  30. package/dist/codegen/template/ts/ts-idl-template +66 -0
  31. package/dist/codegen/template/ts/ts-impl-template +78 -0
  32. package/dist/codegen/template/ts/ts-index-template +13 -0
  33. package/dist/codegen/types.d.ts +157 -0
  34. package/dist/codegen/types.d.ts.map +1 -0
  35. package/dist/codegen/types.js +3 -0
  36. package/dist/codegen/types.js.map +1 -0
  37. package/dist/codegen/typescript.d.ts +8 -0
  38. package/dist/codegen/typescript.d.ts.map +1 -0
  39. package/dist/codegen/typescript.js +232 -0
  40. package/dist/codegen/typescript.js.map +1 -0
  41. package/dist/codegen/utils.d.ts +10 -0
  42. package/dist/codegen/utils.d.ts.map +1 -0
  43. package/dist/codegen/utils.js +144 -0
  44. package/dist/codegen/utils.js.map +1 -0
  45. package/dist/create/index.d.ts +3 -0
  46. package/dist/create/index.d.ts.map +1 -0
  47. package/dist/create/index.js +44 -0
  48. package/dist/create/index.js.map +1 -0
  49. package/dist/create/prompts.d.ts +7 -0
  50. package/dist/create/prompts.d.ts.map +1 -0
  51. package/dist/create/prompts.js +61 -0
  52. package/dist/create/prompts.js.map +1 -0
  53. package/dist/create/scaffold.d.ts +9 -0
  54. package/dist/create/scaffold.d.ts.map +1 -0
  55. package/dist/create/scaffold.js +131 -0
  56. package/dist/create/scaffold.js.map +1 -0
  57. package/dist/create/template/README.md +17 -0
  58. package/dist/create/template/android/.gitkeep +1 -0
  59. package/dist/create/template/ios/.gitkeep +1 -0
  60. package/dist/create/template/src/method.d.ts +17 -0
  61. package/dist/create/templates.d.ts +5 -0
  62. package/dist/create/templates.d.ts.map +1 -0
  63. package/dist/create/templates.js +75 -0
  64. package/dist/create/templates.js.map +1 -0
  65. package/dist/create/types.d.ts +12 -0
  66. package/dist/create/types.d.ts.map +1 -0
  67. package/dist/create/types.js +3 -0
  68. package/dist/create/types.js.map +1 -0
  69. package/dist/create/utils.d.ts +3 -0
  70. package/dist/create/utils.d.ts.map +1 -0
  71. package/dist/create/utils.js +19 -0
  72. package/dist/create/utils.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +60 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/ui.d.ts +13 -0
  78. package/dist/ui.d.ts.map +1 -0
  79. package/dist/ui.js +82 -0
  80. package/dist/ui.js.map +1 -0
  81. package/dist/verbose.d.ts +4 -0
  82. package/dist/verbose.d.ts.map +1 -0
  83. package/dist/verbose.js +25 -0
  84. package/dist/verbose.js.map +1 -0
  85. package/package.json +44 -0
  86. package/templates/sparkling-app-template-android-groovy/android/sparkling-method-media/build.gradle +44 -0
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runCodegen = runCodegen;
7
+ // Copyright (c) 2025 TikTok Pte. Ltd.
8
+ // Licensed under the Apache License Version 2.0 that can be found in the
9
+ // LICENSE file in the root directory of this source tree.
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const fast_glob_1 = __importDefault(require("fast-glob"));
13
+ const definition_parser_1 = require("./definition-parser");
14
+ const metadata_1 = require("./metadata");
15
+ const kotlin_1 = require("./kotlin");
16
+ const swift_1 = require("./swift");
17
+ const typescript_1 = require("./typescript");
18
+ const ui_1 = require("../ui");
19
+ const verbose_1 = require("../verbose");
20
+ const TEMPLATE_ROOT = path_1.default.resolve(__dirname, './template');
21
+ async function runCodegen(options = {}) {
22
+ const projectRoot = process.cwd();
23
+ const config = await readModuleConfig(projectRoot);
24
+ const srcDir = path_1.default.resolve(projectRoot, options.src ?? 'src');
25
+ if (!await fs_extra_1.default.pathExists(srcDir)) {
26
+ throw new Error(`Source directory not found at ${srcDir}`);
27
+ }
28
+ const definitionFiles = await (0, fast_glob_1.default)('**/*.d.ts', { cwd: srcDir, absolute: true });
29
+ if ((0, verbose_1.isVerboseEnabled)()) {
30
+ (0, verbose_1.verboseLog)(`Scanning for definitions in ${srcDir}; found ${definitionFiles.length} file(s).`);
31
+ }
32
+ if (definitionFiles.length === 0) {
33
+ console.log(ui_1.ui.error('No .d.ts files found under src; please add your method definitions.'));
34
+ return;
35
+ }
36
+ const templates = await readTemplates();
37
+ const methods = [];
38
+ for (const file of definitionFiles) {
39
+ const source = await fs_extra_1.default.readFile(file, 'utf8');
40
+ const parsed = (0, definition_parser_1.parseDefinitionFile)(file, source);
41
+ methods.push(...parsed);
42
+ }
43
+ if (methods.length === 0) {
44
+ console.log(ui_1.ui.warn('No method definitions were discovered.'));
45
+ return;
46
+ }
47
+ const metadataDir = path_1.default.join(projectRoot, 'generated', 'metadata');
48
+ await fs_extra_1.default.ensureDir(metadataDir);
49
+ const metadataNameUsage = {};
50
+ for (const method of methods) {
51
+ const metaFile = (0, metadata_1.buildMetadataFileName)(method.name, metadataNameUsage);
52
+ if ((0, verbose_1.isVerboseEnabled)()) {
53
+ (0, verbose_1.verboseLog)(`Generating artifacts for method ${method.name} (metadata file ${metaFile})`);
54
+ }
55
+ await (0, metadata_1.writeMetadataFile)(metadataDir, metaFile, method, config, projectRoot);
56
+ const kotlinView = (0, kotlin_1.buildKotlinView)(method, config);
57
+ const swiftView = (0, swift_1.buildSwiftView)(method, config);
58
+ const typeScriptView = (0, typescript_1.buildTypeScriptView)(method, config);
59
+ await (0, kotlin_1.writeKotlinFile)(projectRoot, config, method, kotlinView, templates.kotlin);
60
+ await (0, swift_1.writeSwiftFile)(projectRoot, config, method, swiftView, templates.swift);
61
+ await (0, typescript_1.writeTypeScriptFiles)(projectRoot, config, method, typeScriptView, templates.typescript);
62
+ console.log(ui_1.ui.success(`Generated metadata, Kotlin, Swift, and TypeScript IDL for ${method.name}`));
63
+ }
64
+ }
65
+ async function readModuleConfig(root) {
66
+ const configPath = path_1.default.join(root, 'module.config.json');
67
+ if (!await fs_extra_1.default.pathExists(configPath)) {
68
+ throw new Error('module.config.json not found. Please run `sparkling-method init <name>` first.');
69
+ }
70
+ const config = await fs_extra_1.default.readJson(configPath);
71
+ if (!config.packageName || !config.moduleName) {
72
+ throw new Error('module.config.json must include packageName and moduleName fields.');
73
+ }
74
+ return config;
75
+ }
76
+ async function readTemplates() {
77
+ const kotlinPath = path_1.default.join(TEMPLATE_ROOT, 'android', 'kotlin-idl-template');
78
+ const swiftPath = path_1.default.join(TEMPLATE_ROOT, 'ios', 'swift-idl-template');
79
+ const tsIdlPath = path_1.default.join(TEMPLATE_ROOT, 'ts', 'ts-idl-template');
80
+ const tsImplPath = path_1.default.join(TEMPLATE_ROOT, 'ts', 'ts-impl-template');
81
+ const tsIndexPath = path_1.default.join(TEMPLATE_ROOT, 'ts', 'ts-index-template');
82
+ const [kotlin, swift, tsIdl, tsImpl, tsIndex] = await Promise.all([
83
+ fs_extra_1.default.readFile(kotlinPath, 'utf8'),
84
+ fs_extra_1.default.readFile(swiftPath, 'utf8'),
85
+ fs_extra_1.default.readFile(tsIdlPath, 'utf8'),
86
+ fs_extra_1.default.readFile(tsImplPath, 'utf8'),
87
+ fs_extra_1.default.readFile(tsIndexPath, 'utf8')
88
+ ]);
89
+ return {
90
+ kotlin,
91
+ swift,
92
+ typescript: {
93
+ idl: tsIdl,
94
+ impl: tsImpl,
95
+ index: tsIndex
96
+ }
97
+ };
98
+ }
99
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codegen/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { KotlinTemplateView, MethodDefinition, ModuleConfig } from './types';
2
+ export declare function buildKotlinView(method: MethodDefinition, config: ModuleConfig): KotlinTemplateView;
3
+ export declare function writeKotlinFile(root: string, config: ModuleConfig, method: MethodDefinition, view: KotlinTemplateView, template: string): Promise<void>;
4
+ //# sourceMappingURL=kotlin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kotlin.d.ts","sourceRoot":"","sources":["../../src/codegen/kotlin.ts"],"names":[],"mappings":"AAOA,OAAO,EAQL,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EAIb,MAAM,SAAS,CAAC;AAIjB,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,GAAG,kBAAkB,CAqBlG;AAgRD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAOf"}
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildKotlinView = buildKotlinView;
7
+ exports.writeKotlinFile = writeKotlinFile;
8
+ // Copyright (c) 2025 TikTok Pte. Ltd.
9
+ // Licensed under the Apache License Version 2.0 that can be found in the
10
+ // LICENSE file in the root directory of this source tree.
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_extra_1 = __importDefault(require("fs-extra"));
13
+ const mustache_1 = __importDefault(require("mustache"));
14
+ const definition_parser_1 = require("./definition-parser");
15
+ const utils_1 = require("./utils");
16
+ function buildKotlinView(method, config) {
17
+ const methodPascal = (0, utils_1.toPascalCase)(method.name);
18
+ const packageSegments = (0, utils_1.buildPackageSegments)(config, method.name);
19
+ const className = `Abs${methodPascal}MethodIDL`;
20
+ const requestModel = buildKotlinModel(method.request, `${methodPascal}Request`, method, 'request');
21
+ const responseModel = buildKotlinModel(method.response, `${methodPascal}Response`, method, 'response');
22
+ const paramsList = requestModel.topItem?.items.map((item) => item.title).filter(Boolean) ?? [];
23
+ const resultsList = responseModel.topItem?.items.map((item) => item.title).filter(Boolean) ?? [];
24
+ return {
25
+ packageName: packageSegments.join('.'),
26
+ moduleName: config.moduleName,
27
+ methodName: method.name,
28
+ className,
29
+ fullName: methodPascal,
30
+ params: paramsList.length > 0 ? { value: paramsList, str: paramsList.map((item) => `"${item}"`).join(', ') } : undefined,
31
+ results: resultsList.length > 0 ? { value: resultsList, str: resultsList.map((item) => `"${item}"`).join(', ') } : undefined,
32
+ request: requestModel,
33
+ response: responseModel
34
+ };
35
+ }
36
+ function buildKotlinModel(summary, fallbackName, method, scope) {
37
+ if (!summary) {
38
+ return { clazz: [] };
39
+ }
40
+ const definition = (0, definition_parser_1.ensureObjectDefinition)(summary, fallbackName, method.interfaces);
41
+ const classMap = new Map();
42
+ const context = {
43
+ methodPascal: (0, utils_1.toPascalCase)(method.name),
44
+ interfaces: method.interfaces,
45
+ classMap,
46
+ visiting: new Set(),
47
+ scope
48
+ };
49
+ const topItem = convertObjectToKotlinView(definition, context, true, []);
50
+ return {
51
+ topItem,
52
+ clazz: Array.from(classMap.values())
53
+ };
54
+ }
55
+ function convertObjectToKotlinView(definition, context, isRoot, path) {
56
+ const className = definition.name ?? 'AnonymousType';
57
+ if (!isRoot) {
58
+ const cached = context.classMap.get(className);
59
+ if (cached) {
60
+ return cached;
61
+ }
62
+ if (context.visiting.has(className)) {
63
+ return { needCompanion: false, items: [] };
64
+ }
65
+ }
66
+ context.visiting.add(className);
67
+ const items = definition.fields.map((field) => convertFieldToKotlinView(field, context, [...path, field.name]));
68
+ const needCompanion = items.some((item) => item.enum && item.enum.length > 0);
69
+ context.visiting.delete(className);
70
+ const result = {
71
+ needCompanion,
72
+ items
73
+ };
74
+ if (!isRoot) {
75
+ context.classMap.set(className, { name: className, ...result });
76
+ }
77
+ return result;
78
+ }
79
+ function convertFieldToKotlinView(field, context, path) {
80
+ const required = !field.optional;
81
+ const defaultValue = formatDefaultValue(field.defaultValue);
82
+ const nullable = !required && !defaultValue;
83
+ const typeInfo = resolveKotlinType(field.type, context, path);
84
+ const enumDetails = buildEnumDetails(field.type, context.methodPascal, path);
85
+ return {
86
+ title: field.name,
87
+ field: toFieldName(field.name),
88
+ className: typeInfo.typeName,
89
+ required,
90
+ nullable,
91
+ annotation: typeInfo.annotation,
92
+ default: defaultValue,
93
+ enumType: enumDetails?.enumType,
94
+ enum: enumDetails?.entries,
95
+ explanation: context.scope === 'response' && typeInfo.typeName === 'Number'
96
+ ? '// you can\'t set a Number type to this param, only support Int/Double/Long/Float'
97
+ : undefined
98
+ };
99
+ }
100
+ function resolveKotlinType(summary, context, path) {
101
+ switch (summary.kind) {
102
+ case 'primitive':
103
+ return { typeName: mapPrimitiveToKotlin(summary.name) };
104
+ case 'reference':
105
+ return resolveReferenceType(summary.name, context, path);
106
+ case 'object':
107
+ return resolveInlineObject(summary, context, path);
108
+ case 'array':
109
+ return resolveArrayType(summary.elementType, context, path);
110
+ default:
111
+ return { typeName: 'Any' };
112
+ }
113
+ }
114
+ function resolveReferenceType(name, context, path) {
115
+ const definition = context.interfaces[name];
116
+ if (definition) {
117
+ convertObjectToKotlinView(definition, context, false, path);
118
+ }
119
+ return {
120
+ typeName: name,
121
+ annotation: `nestedClassType = ${name}::class`
122
+ };
123
+ }
124
+ function resolveInlineObject(summary, context, path) {
125
+ const className = createInlineClassName(context.methodPascal, path);
126
+ const definition = { name: className, fields: summary.fields };
127
+ convertObjectToKotlinView(definition, context, false, path);
128
+ return {
129
+ typeName: className,
130
+ annotation: `nestedClassType = ${className}::class`
131
+ };
132
+ }
133
+ function resolveArrayType(summary, context, path) {
134
+ const elementInfo = resolveKotlinType(summary, context, path);
135
+ let annotation;
136
+ if (summary.kind === 'primitive') {
137
+ annotation = `primitiveClassType = ${elementInfo.typeName}::class`;
138
+ }
139
+ else if (summary.kind === 'reference' || summary.kind === 'object') {
140
+ annotation = `nestedClassType = ${elementInfo.typeName}::class`;
141
+ }
142
+ else if (summary.kind === 'array') {
143
+ annotation = 'primitiveClassType = List::class';
144
+ }
145
+ return {
146
+ typeName: `List<${elementInfo.typeName}>`,
147
+ annotation
148
+ };
149
+ }
150
+ function buildEnumDetails(type, methodPascal, path) {
151
+ const enumSource = extractEnumSource(type);
152
+ if (!enumSource) {
153
+ return undefined;
154
+ }
155
+ const enumType = enumSource.kind === 'string' ? 'IDLMethodStringEnum' : enumSource.kind === 'number' ? 'IDLMethodIntEnum' : undefined;
156
+ if (!enumType) {
157
+ return undefined;
158
+ }
159
+ return {
160
+ enumType,
161
+ entries: buildEnumConstants(enumSource.values, methodPascal, path)
162
+ };
163
+ }
164
+ function extractEnumSource(type) {
165
+ if (type.kind === 'primitive' && type.enumValues && type.enumValues.length > 0) {
166
+ if (type.name === 'string' || type.name === 'number') {
167
+ return { kind: type.name, values: type.enumValues };
168
+ }
169
+ }
170
+ if (type.kind === 'array') {
171
+ return extractEnumSource(type.elementType);
172
+ }
173
+ return undefined;
174
+ }
175
+ function buildEnumConstants(values, methodPascal, path) {
176
+ const base = `${methodPascal}${path.map((segment) => (0, utils_1.toPascalCase)(segment)).join('')}` || methodPascal;
177
+ const used = new Set();
178
+ return values.map((value, index) => {
179
+ const suffix = enumSuffix(value);
180
+ const nameCandidate = suffix ? `${base}${suffix}` : base;
181
+ let candidate = nameCandidate;
182
+ let counter = 1;
183
+ while (used.has(candidate)) {
184
+ candidate = `${nameCandidate}${counter}`;
185
+ counter += 1;
186
+ }
187
+ used.add(candidate);
188
+ const wrapperValue = typeof value === 'string' ? JSON.stringify(value) : String(value);
189
+ return {
190
+ wrapperName: candidate,
191
+ wrapperValue,
192
+ comma: index < values.length - 1
193
+ };
194
+ });
195
+ }
196
+ function enumSuffix(value) {
197
+ if (typeof value === 'number') {
198
+ if (value === 0) {
199
+ return '';
200
+ }
201
+ return value.toString().replace(/[^0-9]/g, '');
202
+ }
203
+ const cleaned = value.replace(/[^a-zA-Z0-9]+/g, ' ').trim();
204
+ if (!cleaned) {
205
+ return '';
206
+ }
207
+ return cleaned
208
+ .split(/\s+/)
209
+ .map((chunk) => chunk.charAt(0).toUpperCase() + chunk.slice(1).toLowerCase())
210
+ .join('');
211
+ }
212
+ function mapPrimitiveToKotlin(kind) {
213
+ switch (kind) {
214
+ case 'string':
215
+ return 'String';
216
+ case 'number':
217
+ return 'Number';
218
+ case 'boolean':
219
+ return 'Boolean';
220
+ case 'void':
221
+ return 'Unit';
222
+ case 'object':
223
+ return 'Map<String, Any>';
224
+ default:
225
+ return 'Any';
226
+ }
227
+ }
228
+ function formatDefaultValue(value) {
229
+ if (!value) {
230
+ return undefined;
231
+ }
232
+ switch (value.kind) {
233
+ case 'boolean':
234
+ return `MethodParamDefaultValue(type = DefaultType.BOOL, boolValue = ${value.value})`;
235
+ case 'number': {
236
+ const num = value.value;
237
+ if (Number.isInteger(num)) {
238
+ if (num > 2147483647 || num < -2147483648) {
239
+ return `MethodParamDefaultValue(type = DefaultType.LONG, longValue = ${num})`;
240
+ }
241
+ return `MethodParamDefaultValue(type = DefaultType.INT, intValue = ${num})`;
242
+ }
243
+ return `MethodParamDefaultValue(type = DefaultType.DOUBLE, doubleValue = ${num})`;
244
+ }
245
+ case 'string':
246
+ return `MethodParamDefaultValue(type = DefaultType.STRING, stringValue = ${JSON.stringify(value.value)})`;
247
+ default:
248
+ return undefined;
249
+ }
250
+ }
251
+ function createInlineClassName(methodPascal, path) {
252
+ const suffix = path.map((segment) => (0, utils_1.toPascalCase)(segment)).join('');
253
+ return `PipeBean${methodPascal}${suffix}`;
254
+ }
255
+ function toFieldName(name) {
256
+ if (/^[a-z][a-zA-Z0-9]*$/.test(name)) {
257
+ return name;
258
+ }
259
+ const parts = (0, utils_1.splitIntoWords)(name);
260
+ if (parts.length === 0) {
261
+ return name || 'field';
262
+ }
263
+ return parts[0].toLowerCase() + parts.slice(1).map((chunk) => chunk.charAt(0).toUpperCase() + chunk.slice(1).toLowerCase()).join('');
264
+ }
265
+ async function writeKotlinFile(root, config, method, view, template) {
266
+ const packageSegments = (0, utils_1.buildPackageSegments)(config, method.name);
267
+ const kotlinDir = path_1.default.join(root, 'android', 'src', 'main', 'java', ...packageSegments);
268
+ await fs_extra_1.default.ensureDir(kotlinDir);
269
+ const filePath = path_1.default.join(kotlinDir, `${view.className}.kt`);
270
+ const rendered = mustache_1.default.render(template, view);
271
+ await fs_extra_1.default.writeFile(filePath, rendered, 'utf8');
272
+ }
273
+ //# sourceMappingURL=kotlin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kotlin.js","sourceRoot":"","sources":["../../src/codegen/kotlin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { MethodDefinition, ModuleConfig } from './types';
2
+ export declare function buildMetadataFileName(name: string, usage: Record<string, number>): string;
3
+ export declare function writeMetadataFile(metadataDir: string, fileName: string, method: MethodDefinition, config: ModuleConfig, projectRoot: string): Promise<void>;
4
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/codegen/metadata.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgB,gBAAgB,EAAE,YAAY,EAAiC,MAAM,SAAS,CAAC;AAEtG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIzF;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildMetadataFileName = buildMetadataFileName;
7
+ exports.writeMetadataFile = writeMetadataFile;
8
+ // Copyright (c) 2025 TikTok Pte. Ltd.
9
+ // Licensed under the Apache License Version 2.0 that can be found in the
10
+ // LICENSE file in the root directory of this source tree.
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_extra_1 = __importDefault(require("fs-extra"));
13
+ function buildMetadataFileName(name, usage) {
14
+ const count = usage[name] ?? 0;
15
+ usage[name] = count + 1;
16
+ return count === 0 ? `${name}.json` : `${name}-${count}.json`;
17
+ }
18
+ async function writeMetadataFile(metadataDir, fileName, method, config, projectRoot) {
19
+ const outputPath = path_1.default.join(metadataDir, fileName);
20
+ const payload = {
21
+ name: method.name,
22
+ description: method.description,
23
+ moduleName: config.moduleName,
24
+ packageName: config.packageName,
25
+ source: path_1.default.relative(projectRoot, method.source),
26
+ request: serializeTypeSummary(method.request),
27
+ response: serializeTypeSummary(method.response),
28
+ interfaces: Object.fromEntries(Object.entries(method.interfaces).map(([key, value]) => [key, serializeObjectDefinition(value)])),
29
+ generatedAt: new Date().toISOString()
30
+ };
31
+ await fs_extra_1.default.writeJson(outputPath, payload, { spaces: 2 });
32
+ }
33
+ function serializeTypeSummary(summary) {
34
+ if (!summary) {
35
+ return null;
36
+ }
37
+ switch (summary.kind) {
38
+ case 'primitive':
39
+ return { kind: 'primitive', name: summary.name, text: summary.text, enumValues: summary.enumValues };
40
+ case 'array':
41
+ return { kind: 'array', elementType: serializeTypeSummary(summary.elementType) };
42
+ case 'reference':
43
+ return { kind: 'reference', name: summary.name };
44
+ case 'object':
45
+ return {
46
+ kind: 'object',
47
+ fields: summary.fields.map((field) => ({
48
+ name: field.name,
49
+ optional: field.optional,
50
+ description: field.description,
51
+ defaultValue: serializeDefaultValue(field.defaultValue),
52
+ type: serializeTypeSummary(field.type)
53
+ }))
54
+ };
55
+ default:
56
+ return summary;
57
+ }
58
+ }
59
+ function serializeDefaultValue(value) {
60
+ if (!value) {
61
+ return undefined;
62
+ }
63
+ return { kind: value.kind, value: value.value };
64
+ }
65
+ function serializeObjectDefinition(def) {
66
+ return {
67
+ name: def.name,
68
+ description: def.description,
69
+ fields: def.fields.map((field) => ({
70
+ name: field.name,
71
+ optional: field.optional,
72
+ description: field.description,
73
+ defaultValue: serializeDefaultValue(field.defaultValue),
74
+ type: serializeTypeSummary(field.type)
75
+ }))
76
+ };
77
+ }
78
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/codegen/metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { MethodDefinition, ModuleConfig, SwiftTemplateView } from './types';
2
+ export declare function buildSwiftView(method: MethodDefinition, config: ModuleConfig): SwiftTemplateView;
3
+ export declare function writeSwiftFile(root: string, config: ModuleConfig, method: MethodDefinition, view: SwiftTemplateView, template: string): Promise<void>;
4
+ //# sourceMappingURL=swift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swift.d.ts","sourceRoot":"","sources":["../../src/codegen/swift.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,gBAAgB,EAChB,YAAY,EAIZ,iBAAiB,EAElB,MAAM,SAAS,CAAC;AAIjB,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,GAAG,iBAAiB,CAsBhG;AAqHD,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,iBAAiB,EACvB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildSwiftView = buildSwiftView;
7
+ exports.writeSwiftFile = writeSwiftFile;
8
+ // Copyright (c) 2025 TikTok Pte. Ltd.
9
+ // Licensed under the Apache License Version 2.0 that can be found in the
10
+ // LICENSE file in the root directory of this source tree.
11
+ const path_1 = __importDefault(require("path"));
12
+ const fs_extra_1 = __importDefault(require("fs-extra"));
13
+ const mustache_1 = __importDefault(require("mustache"));
14
+ const definition_parser_1 = require("./definition-parser");
15
+ const utils_1 = require("./utils");
16
+ function buildSwiftView(method, config) {
17
+ const methodPascal = (0, utils_1.toPascalCase)(method.name);
18
+ const requestObject = (0, definition_parser_1.ensureObjectDefinition)(method.request, `${methodPascal}Request`, method.interfaces);
19
+ const responseObject = (0, definition_parser_1.ensureObjectDefinition)(method.response, `${methodPascal}Response`, method.interfaces);
20
+ const swiftContext = {
21
+ methodPascal,
22
+ interfaces: method.interfaces,
23
+ extras: new Map()
24
+ };
25
+ const requestView = toSwiftStructView(requestObject, `SPK${methodPascal}MethodParamModel`, swiftContext, ['Param']);
26
+ const responseView = toSwiftStructView(responseObject, `SPK${methodPascal}MethodResultModel`, swiftContext, ['Result']);
27
+ return {
28
+ moduleName: config.moduleName,
29
+ methodName: method.name,
30
+ methodClassName: `SPK${methodPascal}Method`,
31
+ methodObjcName: `SPK${methodPascal}Method`,
32
+ request: requestView,
33
+ response: responseView,
34
+ extraTypes: Array.from(swiftContext.extras.values())
35
+ };
36
+ }
37
+ function toSwiftStructView(definition, className, context, path) {
38
+ const fields = definition.fields.map((field, index, arr) => ({
39
+ name: field.name,
40
+ type: resolveSwiftType(field.type, context, [...path, field.name]),
41
+ optional: field.optional,
42
+ comment: field.description,
43
+ defaultValue: formatSwiftDefaultValue(field.defaultValue),
44
+ isLast: index === arr.length - 1
45
+ }));
46
+ return {
47
+ structName: className,
48
+ objcName: className,
49
+ hasFields: fields.length > 0,
50
+ fields
51
+ };
52
+ }
53
+ function resolveSwiftType(type, context, path) {
54
+ switch (type.kind) {
55
+ case 'primitive':
56
+ return mapPrimitiveToSwift(type.name);
57
+ case 'array':
58
+ return `[${resolveSwiftType(type.elementType, context, path)}]`;
59
+ case 'reference': {
60
+ const definition = context.interfaces[type.name];
61
+ if (definition) {
62
+ const helper = ensureSwiftHelper(definition, context, [type.name]);
63
+ return helper.structName;
64
+ }
65
+ return type.name;
66
+ }
67
+ case 'object': {
68
+ const inline = {
69
+ name: path.map((segment) => (0, utils_1.toPascalCase)(segment)).join('') || undefined,
70
+ fields: type.fields
71
+ };
72
+ const helper = ensureSwiftHelper(inline, context, path);
73
+ return helper.structName;
74
+ }
75
+ default:
76
+ return 'Any';
77
+ }
78
+ }
79
+ function ensureSwiftHelper(definition, context, path) {
80
+ const key = definition.name ?? path.join('.');
81
+ const cached = context.extras.get(key);
82
+ if (cached) {
83
+ return cached;
84
+ }
85
+ const base = definition.name ? (0, utils_1.toPascalCase)(definition.name) : path.map((segment) => (0, utils_1.toPascalCase)(segment)).join('');
86
+ const suffix = base || 'Anonymous';
87
+ const className = `SPK${context.methodPascal}Method${suffix}Model`;
88
+ const fields = definition.fields.map((field, index, arr) => ({
89
+ name: field.name,
90
+ type: resolveSwiftType(field.type, context, [...path, field.name]),
91
+ optional: field.optional,
92
+ comment: field.description,
93
+ defaultValue: formatSwiftDefaultValue(field.defaultValue),
94
+ isLast: index === arr.length - 1
95
+ }));
96
+ const view = {
97
+ structName: className,
98
+ objcName: className,
99
+ hasFields: fields.length > 0,
100
+ fields
101
+ };
102
+ context.extras.set(key, view);
103
+ return view;
104
+ }
105
+ function mapPrimitiveToSwift(kind) {
106
+ switch (kind) {
107
+ case 'string':
108
+ return 'String';
109
+ case 'number':
110
+ return 'Double';
111
+ case 'boolean':
112
+ return 'Bool';
113
+ case 'void':
114
+ return 'Void';
115
+ case 'object':
116
+ return '[String: Any]';
117
+ default:
118
+ return 'Any';
119
+ }
120
+ }
121
+ function formatSwiftDefaultValue(value) {
122
+ if (!value) {
123
+ return undefined;
124
+ }
125
+ switch (value.kind) {
126
+ case 'boolean':
127
+ return value.value ? 'true' : 'false';
128
+ case 'number':
129
+ return `${value.value}`;
130
+ case 'string':
131
+ return JSON.stringify(value.value);
132
+ default:
133
+ return undefined;
134
+ }
135
+ }
136
+ async function writeSwiftFile(root, config, method, view, template) {
137
+ const moduleDir = (0, utils_1.toPascalCase)(config.moduleName);
138
+ const methodDir = (0, utils_1.toPascalCase)(method.name);
139
+ const swiftDir = path_1.default.join(root, 'ios', 'Source', 'Core', moduleDir, methodDir);
140
+ await fs_extra_1.default.ensureDir(swiftDir);
141
+ const filePath = path_1.default.join(swiftDir, `${methodDir}IDL.swift`);
142
+ const rendered = mustache_1.default.render(template, view);
143
+ await fs_extra_1.default.writeFile(filePath, rendered, 'utf8');
144
+ }
145
+ //# sourceMappingURL=swift.js.map