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,131 @@
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.resolveTemplateDir = resolveTemplateDir;
7
+ exports.copyTemplateDirectory = copyTemplateDirectory;
8
+ exports.createPackageJson = createPackageJson;
9
+ exports.ensurePlatformScaffolds = ensurePlatformScaffolds;
10
+ exports.writeAndroidConfigs = writeAndroidConfigs;
11
+ exports.writeIosConfigs = writeIosConfigs;
12
+ exports.writeModuleConfig = writeModuleConfig;
13
+ // Copyright (c) 2025 TikTok Pte. Ltd.
14
+ // Licensed under the Apache License Version 2.0 that can be found in the
15
+ // LICENSE file in the root directory of this source tree.
16
+ const fs_extra_1 = __importDefault(require("fs-extra"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const templates_1 = require("./templates");
19
+ const utils_1 = require("./utils");
20
+ const verbose_1 = require("../verbose");
21
+ const DEFAULT_TEMPLATE_DIR = path_1.default.resolve(__dirname, './template');
22
+ async function resolveTemplateDir(customTemplate) {
23
+ const templateDir = customTemplate
24
+ ? path_1.default.resolve(process.cwd(), customTemplate)
25
+ : DEFAULT_TEMPLATE_DIR;
26
+ if (!await fs_extra_1.default.pathExists(templateDir)) {
27
+ throw new Error(`Template directory not found at ${templateDir}`);
28
+ }
29
+ if ((0, verbose_1.isVerboseEnabled)()) {
30
+ (0, verbose_1.verboseLog)(`Using template directory: ${templateDir}`);
31
+ }
32
+ return templateDir;
33
+ }
34
+ async function copyTemplateDirectory(templateDir, targetDir, force) {
35
+ const exists = await fs_extra_1.default.pathExists(targetDir);
36
+ if (exists) {
37
+ if (!force) {
38
+ throw new Error(`Directory ${targetDir} already exists. Use --force to overwrite.`);
39
+ }
40
+ if ((0, verbose_1.isVerboseEnabled)()) {
41
+ (0, verbose_1.verboseLog)(`Removing existing directory ${targetDir} due to --force`);
42
+ }
43
+ await fs_extra_1.default.remove(targetDir);
44
+ }
45
+ if ((0, verbose_1.isVerboseEnabled)()) {
46
+ (0, verbose_1.verboseLog)(`Copying template from ${templateDir} to ${targetDir}`);
47
+ }
48
+ await fs_extra_1.default.copy(templateDir, targetDir);
49
+ }
50
+ async function createPackageJson(projectName, targetDir) {
51
+ const pkgPath = path_1.default.join(targetDir, 'package.json');
52
+ const normalized = (0, utils_1.normalizePackageName)(projectName);
53
+ const packageJson = {
54
+ name: normalized,
55
+ version: '0.1.0',
56
+ private: true,
57
+ scripts: {
58
+ build: 'tsc',
59
+ codegen: 'npx sparkling-method codegen',
60
+ test: 'echo "Add your tests"',
61
+ },
62
+ files: ['dist', 'android', 'ios', 'generated'],
63
+ devDependencies: {},
64
+ dependencies: {},
65
+ };
66
+ await fs_extra_1.default.writeJson(pkgPath, packageJson, { spaces: 2 });
67
+ if ((0, verbose_1.isVerboseEnabled)()) {
68
+ (0, verbose_1.verboseLog)(`Wrote package.json to ${pkgPath}`);
69
+ }
70
+ }
71
+ async function ensurePlatformScaffolds(config, projectDir) {
72
+ const androidRoot = path_1.default.join(projectDir, 'android', 'src', 'main', 'java');
73
+ const packagePath = config.packageName.split('.').filter(Boolean).join(path_1.default.sep);
74
+ const moduleSegment = config.moduleName.replace(/\s+/g, '').toLowerCase();
75
+ const androidDir = path_1.default.join(androidRoot, packagePath, moduleSegment);
76
+ await fs_extra_1.default.ensureDir(androidDir);
77
+ const iosDir = path_1.default.join(projectDir, 'ios', 'Source', 'Core', moduleSegment);
78
+ await fs_extra_1.default.ensureDir(iosDir);
79
+ if ((0, verbose_1.isVerboseEnabled)()) {
80
+ (0, verbose_1.verboseLog)(`Ensured platform scaffolds at ${androidDir} and ${iosDir}`);
81
+ }
82
+ }
83
+ async function writeAndroidConfigs(config, projectDir) {
84
+ const androidDir = path_1.default.join(projectDir, 'android');
85
+ const manifestDir = path_1.default.join(androidDir, 'src', 'main');
86
+ await fs_extra_1.default.ensureDir(manifestDir);
87
+ const manifestPath = path_1.default.join(manifestDir, 'AndroidManifest.xml');
88
+ if (!await fs_extra_1.default.pathExists(manifestPath)) {
89
+ await fs_extra_1.default.writeFile(manifestPath, (0, templates_1.androidManifestTemplate)(config.packageName), 'utf8');
90
+ }
91
+ const moduleSegment = config.moduleName.replace(/\s+/g, '');
92
+ const useKotlinDsl = config.androidDsl === 'kts';
93
+ const gradleFileName = useKotlinDsl ? 'build.gradle.kts' : 'build.gradle';
94
+ const gradlePath = path_1.default.join(androidDir, gradleFileName);
95
+ const alternatePath = path_1.default.join(androidDir, useKotlinDsl ? 'build.gradle' : 'build.gradle.kts');
96
+ if (await fs_extra_1.default.pathExists(alternatePath)) {
97
+ await fs_extra_1.default.remove(alternatePath);
98
+ }
99
+ if (!await fs_extra_1.default.pathExists(gradlePath)) {
100
+ const namespace = `${config.packageName}.${moduleSegment.toLowerCase()}`;
101
+ await fs_extra_1.default.writeFile(gradlePath, (0, templates_1.androidGradleTemplate)(namespace, config.androidDsl), 'utf8');
102
+ }
103
+ if ((0, verbose_1.isVerboseEnabled)()) {
104
+ (0, verbose_1.verboseLog)(`Android config written: manifest=${manifestPath}, gradle=${gradlePath}`);
105
+ }
106
+ }
107
+ async function writeIosConfigs(config, projectDir) {
108
+ const iosDir = path_1.default.join(projectDir, 'ios');
109
+ await fs_extra_1.default.ensureDir(iosDir);
110
+ const moduleId = (0, utils_1.toPascalCase)(config.moduleName);
111
+ const podspecName = `Sparkling-${moduleId}.podspec`;
112
+ const podspecPath = path_1.default.join(iosDir, podspecName);
113
+ if (!await fs_extra_1.default.pathExists(podspecPath)) {
114
+ await fs_extra_1.default.writeFile(podspecPath, (0, templates_1.iosPodspecTemplate)(moduleId), 'utf8');
115
+ }
116
+ if ((0, verbose_1.isVerboseEnabled)()) {
117
+ (0, verbose_1.verboseLog)(`iOS podspec ensured at ${podspecPath}`);
118
+ }
119
+ }
120
+ async function writeModuleConfig(projectName, config, dir) {
121
+ const resolved = {
122
+ ...config,
123
+ projectName,
124
+ };
125
+ await fs_extra_1.default.writeJson(path_1.default.join(dir, 'module.config.json'), resolved, { spaces: 2 });
126
+ if ((0, verbose_1.isVerboseEnabled)()) {
127
+ (0, verbose_1.verboseLog)(`module.config.json written with project ${projectName} at ${dir}`);
128
+ }
129
+ return resolved;
130
+ }
131
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/create/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ # Sparkling Method Module Template
2
+
3
+ This directory is copied when running `pnpm dlx sparkling-method init <name>`. It
4
+ contains a minimal project layout with placeholder TypeScript definitions under
5
+ `src/method.d.ts`. Feel free to remove these examples after scaffolding a new
6
+ module.
7
+
8
+ After editing the `.d.ts` declarations, run `pnpm dlx sparkling-method codegen` (or
9
+ `pnpm --filter <module> codegen` inside a workspace) to produce cross-platform implementations:
10
+
11
+ - **Kotlin IDL** sources under `android/` directories
12
+ - **Swift IDL** sources under `ios/` directories
13
+ - **TypeScript implementation** with validation and pipe integration under `src/`
14
+ - **Package exports** in `index.ts` for easy importing
15
+
16
+ The generated TypeScript code provides type-safe wrappers around the Sparkling pipe SDK,
17
+ following the same patterns used in `sparkling-router` and `sparkling-storage`.
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,17 @@
1
+ /** Simple case for displaying a toast. */
2
+ export interface ShowToastRequest {
3
+ message: string;
4
+ /**
5
+ * @default 2000
6
+ */
7
+ duration?: number;
8
+ }
9
+
10
+ export interface ShowToastResponse {
11
+ /**
12
+ * @default true
13
+ */
14
+ success: boolean;
15
+ }
16
+
17
+ declare function showToast(params: ShowToastRequest, callback: (result: ShowToastResponse) => void): void;
@@ -0,0 +1,5 @@
1
+ import type { AndroidDsl } from "./types";
2
+ export declare function androidManifestTemplate(packageName: string): string;
3
+ export declare function androidGradleTemplate(namespace: string, dsl: AndroidDsl): string;
4
+ export declare function iosPodspecTemplate(moduleId: string): string;
5
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/create/templates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAQnE;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,UAAU,GACd,MAAM,CAER;AA4CD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgB3D"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.androidManifestTemplate = androidManifestTemplate;
4
+ exports.androidGradleTemplate = androidGradleTemplate;
5
+ exports.iosPodspecTemplate = iosPodspecTemplate;
6
+ function androidManifestTemplate(packageName) {
7
+ return [
8
+ '<?xml version="1.0" encoding="utf-8"?>',
9
+ `<manifest package="${packageName}">`,
10
+ ' <!-- Library manifest placeholder. Add <application> or <uses-permission> entries as needed. -->',
11
+ '</manifest>',
12
+ '',
13
+ ].join('\n');
14
+ }
15
+ function androidGradleTemplate(namespace, dsl) {
16
+ return dsl === "kts" ? kotlinGradle(namespace) : groovyGradle(namespace);
17
+ }
18
+ function groovyGradle(namespace) {
19
+ return [
20
+ 'plugins {',
21
+ " id 'com.android.library'",
22
+ " id 'org.jetbrains.kotlin.android'",
23
+ '}',
24
+ '',
25
+ 'android {',
26
+ ` namespace '${namespace}'`,
27
+ ' compileSdk 34',
28
+ '',
29
+ ' defaultConfig {',
30
+ ' minSdk 23',
31
+ ' }',
32
+ '}',
33
+ '',
34
+ '// Add dependencies required by your module.',
35
+ '',
36
+ ].join('\n');
37
+ }
38
+ function kotlinGradle(namespace) {
39
+ return [
40
+ 'plugins {',
41
+ ' id("com.android.library")',
42
+ ' id("org.jetbrains.kotlin.android")',
43
+ '}',
44
+ '',
45
+ 'android {',
46
+ ` namespace = "${namespace}"`,
47
+ ' compileSdk = 34',
48
+ '',
49
+ ' defaultConfig {',
50
+ ' minSdk = 23',
51
+ ' }',
52
+ '}',
53
+ '',
54
+ '// Add dependencies required by your module.',
55
+ '',
56
+ ].join('\n');
57
+ }
58
+ function iosPodspecTemplate(moduleId) {
59
+ return [
60
+ 'Pod::Spec.new do |s|',
61
+ ` s.name = 'Sparkling-${moduleId}'`,
62
+ " s.version = '0.1.0'",
63
+ ` s.summary = '${moduleId} sparkling method module'`,
64
+ " s.description = 'Generated by sparkling-method init. Fill in details before publishing.'",
65
+ ` s.homepage = 'https://example.com/${moduleId}'`,
66
+ " s.license = { :type => 'Apache-2.0' }",
67
+ " s.author = { 'sparkling' => 'dev@example.com' }",
68
+ " s.source = { :path => '.' }",
69
+ " s.source_files = 'Source/**/*.{h,m,mm,swift}'",
70
+ " s.swift_version = '5.0'",
71
+ 'end',
72
+ '',
73
+ ].join('\n');
74
+ }
75
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/create/templates.ts"],"names":[],"mappings":";;AAKA,0DAQC;AAED,sDAKC;AA4CD,gDAgBC;AA3ED,SAAgB,uBAAuB,CAAC,WAAmB;IACzD,OAAO;QACL,wCAAwC;QACxC,sBAAsB,WAAW,IAAI;QACrC,sGAAsG;QACtG,aAAa;QACb,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,qBAAqB,CACnC,SAAiB,EACjB,GAAe;IAEf,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,OAAO;QACL,WAAW;QACX,8BAA8B;QAC9B,uCAAuC;QACvC,GAAG;QACH,EAAE;QACF,WAAW;QACX,kBAAkB,SAAS,GAAG;QAC9B,mBAAmB;QACnB,EAAE;QACF,qBAAqB;QACrB,mBAAmB;QACnB,OAAO;QACP,GAAG;QACH,EAAE;QACF,8CAA8C;QAC9C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,SAAiB;IACrC,OAAO;QACL,WAAW;QACX,+BAA+B;QAC/B,wCAAwC;QACxC,GAAG;QACH,EAAE;QACF,WAAW;QACX,oBAAoB,SAAS,GAAG;QAChC,qBAAqB;QACrB,EAAE;QACF,qBAAqB;QACrB,qBAAqB;QACrB,OAAO;QACP,GAAG;QACH,EAAE;QACF,8CAA8C;QAC9C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAgB;IACjD,OAAO;QACL,sBAAsB;QACtB,qCAAqC,QAAQ,GAAG;QAChD,gCAAgC;QAChC,2BAA2B,QAAQ,2BAA2B;QAC9D,iGAAiG;QACjG,+CAA+C,QAAQ,GAAG;QAC1D,kDAAkD;QAClD,6DAA6D;QAC7D,yCAAyC;QACzC,qDAAqD;QACrD,8BAA8B;QAC9B,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type AndroidDsl = 'kts' | 'groovy';
2
+ export interface InitOptions {
3
+ template?: string;
4
+ force?: boolean;
5
+ }
6
+ export interface ModuleConfig {
7
+ packageName: string;
8
+ moduleName: string;
9
+ projectName: string;
10
+ androidDsl: AndroidDsl;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/create/types.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CACxB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/create/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export declare function normalizePackageName(name: string): string;
2
+ export declare function toPascalCase(value: string): string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/create/utils.ts"],"names":[],"mappings":"AAGC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlD"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizePackageName = normalizePackageName;
4
+ exports.toPascalCase = toPascalCase;
5
+ // Copyright (c) 2025 TikTok Pte. Ltd.
6
+ // Licensed under the Apache License Version 2.0 that can be found in the
7
+ // LICENSE file in the root directory of this source tree.
8
+ function normalizePackageName(name) {
9
+ const sanitized = name.replace(/[^a-z0-9-]/gi, '-').replace(/-+/g, '-').toLowerCase();
10
+ return sanitized || 'sparkling-method-module';
11
+ }
12
+ function toPascalCase(value) {
13
+ return value
14
+ .split(/[^a-zA-Z0-9]/)
15
+ .filter(Boolean)
16
+ .map(chunk => chunk.charAt(0).toUpperCase() + chunk.slice(1))
17
+ .join('');
18
+ }
19
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/create/utils.ts"],"names":[],"mappings":";;AAGC,oDAGA;AAED,oCAMC;AAdD,sCAAsC;AACtC,yEAAyE;AACzE,0DAA0D;AACzD,SAAgB,oBAAoB,CAAC,IAAY;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;IACtF,OAAO,SAAS,IAAI,yBAAyB,CAAC;AAChD,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK;SACT,KAAK,CAAC,cAAc,CAAC;SACrB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // Copyright (c) 2025 TikTok Pte. Ltd.
4
+ // Licensed under the Apache License Version 2.0 that can be found in the
5
+ // LICENSE file in the root directory of this source tree.
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const commander_1 = require("commander");
11
+ const package_json_1 = __importDefault(require("../package.json"));
12
+ const create_1 = require("./create");
13
+ const codegen_1 = require("./codegen");
14
+ const ui_1 = require("./ui");
15
+ const verbose_1 = require("./verbose");
16
+ const program = new commander_1.Command();
17
+ program
18
+ .name('sparkling-method')
19
+ .description('Sparkling method utilities')
20
+ .version(package_json_1.default.version);
21
+ program.option('-v, --verbose', 'Enable verbose logging for debugging');
22
+ program.hook('preAction', (thisCommand) => {
23
+ const opts = thisCommand.optsWithGlobals();
24
+ (0, verbose_1.enableVerboseLogging)(opts.verbose);
25
+ if ((0, verbose_1.isVerboseEnabled)()) {
26
+ (0, verbose_1.verboseLog)('Verbose logging enabled');
27
+ }
28
+ });
29
+ program
30
+ .command('init [name]')
31
+ .description('Create a new sparkling-method workspace from the bundled template')
32
+ .option('-f, --force', 'Overwrite the target directory if it already exists', false)
33
+ .option('-t, --template <path>', 'Use a custom template directory')
34
+ .action(async (name, options) => {
35
+ try {
36
+ await (0, create_1.runInit)(name, options);
37
+ }
38
+ catch (error) {
39
+ console.error(ui_1.ui.error(error instanceof Error ? error.message : String(error)));
40
+ process.exitCode = 1;
41
+ }
42
+ });
43
+ program
44
+ .command('codegen')
45
+ .description('Generate metadata and native IDL code from local method definitions')
46
+ .option('--src <dir>', 'Directory containing .d.ts definitions', 'src')
47
+ .action(async (options) => {
48
+ try {
49
+ await (0, codegen_1.runCodegen)(options);
50
+ }
51
+ catch (error) {
52
+ console.error(ui_1.ui.error(error instanceof Error ? error.message : String(error)));
53
+ process.exitCode = 1;
54
+ }
55
+ });
56
+ program.parseAsync(process.argv).catch((error) => {
57
+ console.error(ui_1.ui.error(error instanceof Error ? error.message : String(error)));
58
+ process.exitCode = 1;
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AACA,sCAAsC;AACtC,yEAAyE;AACzE,0DAA0D;;;;;AAE1D,yCAAoC;AACpC,mEAA0C;AAC1C,qCAAmC;AACnC,uCAAuC;AACvC,6BAA0B;AAC1B,uCAA+E;AAE/E,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,4BAA4B,CAAC;KACzC,OAAO,CAAC,sBAAW,CAAC,OAAO,CAAC,CAAC;AAChC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,sCAAsC,CAAC,CAAC;AACxE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,EAAyB,CAAC;IAClE,IAAA,8BAAoB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,IAAA,0BAAgB,GAAE,EAAE,CAAC;QACvB,IAAA,oBAAU,EAAC,yBAAyB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,mEAAmE,CAAC;KAChF,MAAM,CAAC,aAAa,EAAE,qDAAqD,EAAE,KAAK,CAAC;KACnF,MAAM,CAAC,uBAAuB,EAAE,iCAAiC,CAAC;KAClE,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA+C,EAAE,EAAE;IAC1F,IAAI,CAAC;QACH,MAAM,IAAA,gBAAO,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,OAAE,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qEAAqE,CAAC;KAClF,MAAM,CAAC,aAAa,EAAE,wCAAwC,EAAE,KAAK,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,IAAA,oBAAU,EAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,OAAE,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/C,OAAO,CAAC,KAAK,CAAC,OAAE,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
package/dist/ui.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ export declare const ui: {
2
+ headline: (msg: string) => string;
3
+ success: (msg: string) => string;
4
+ warn: (msg: string) => string;
5
+ error: (msg: string) => string;
6
+ info: (msg: string) => string;
7
+ muted: (msg: string) => string;
8
+ tipLabel: string;
9
+ tip: (msg: string) => string;
10
+ step: (msg: string) => string;
11
+ prompt: (msg: string) => string;
12
+ };
13
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AA0EA,eAAO,MAAM,EAAE;oBACG,MAAM;mBACP,MAAM;gBACT,MAAM;iBACL,MAAM;gBACP,MAAM;iBACL,MAAM;;eAER,MAAM;gBACL,MAAM;kBACJ,MAAM;CACrB,CAAC"}
package/dist/ui.js ADDED
@@ -0,0 +1,82 @@
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.ui = void 0;
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 node_fs_1 = __importDefault(require("node:fs"));
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const DEFAULT_CONFIG = {
14
+ labels: { tip: 'Tip' },
15
+ colors: {
16
+ headline: 'cyan',
17
+ success: 'green',
18
+ warn: 'yellow',
19
+ error: 'red',
20
+ // Use blue for info to improve contrast on light themes
21
+ info: 'blue',
22
+ // Use dim for muted text to avoid low-contrast gray on light themes
23
+ muted: 'dim',
24
+ tipLabel: 'cyan',
25
+ tipText: 'blue',
26
+ promptLabel: 'blue',
27
+ promptText: 'blue',
28
+ },
29
+ };
30
+ const colorFns = {
31
+ cyan: chalk_1.default.cyan,
32
+ green: chalk_1.default.green,
33
+ yellow: chalk_1.default.yellow,
34
+ red: chalk_1.default.red,
35
+ white: chalk_1.default.white,
36
+ gray: chalk_1.default.gray,
37
+ grey: chalk_1.default.grey,
38
+ magenta: chalk_1.default.magenta,
39
+ blue: chalk_1.default.blue,
40
+ };
41
+ function loadUiConfig() {
42
+ const candidate = node_path_1.default.join(process.cwd(), 'packages', 'common', 'cli-style.config.json');
43
+ if (node_fs_1.default.existsSync(candidate)) {
44
+ try {
45
+ const parsed = JSON.parse(node_fs_1.default.readFileSync(candidate, 'utf8'));
46
+ return parsed;
47
+ }
48
+ catch {
49
+ // ignore parse errors
50
+ }
51
+ }
52
+ return {};
53
+ }
54
+ const cfg = loadUiConfig();
55
+ const palette = { ...DEFAULT_CONFIG.colors, ...(cfg.colors ?? {}) };
56
+ const labels = { ...DEFAULT_CONFIG.labels, ...(cfg.labels ?? {}) };
57
+ function paint(msg, colorName, bold = false) {
58
+ const key = colorName?.toLowerCase();
59
+ if (key === 'none' || key === 'default' || key === 'reset') {
60
+ return bold ? chalk_1.default.bold(msg) : msg;
61
+ }
62
+ if (key === 'dim') {
63
+ const styled = chalk_1.default.dim(msg);
64
+ return bold ? chalk_1.default.bold(styled) : styled;
65
+ }
66
+ const fn = key ? colorFns[key] : undefined;
67
+ const colored = fn ? fn(msg) : msg;
68
+ return bold ? chalk_1.default.bold(colored) : colored;
69
+ }
70
+ exports.ui = {
71
+ headline: (msg) => paint(msg, palette.headline, true),
72
+ success: (msg) => paint(msg, palette.success, true),
73
+ warn: (msg) => paint(msg, palette.warn, true),
74
+ error: (msg) => paint(msg, palette.error, true),
75
+ info: (msg) => paint(msg, palette.info, false),
76
+ muted: (msg) => paint(msg, palette.muted, false),
77
+ tipLabel: paint(labels.tip ?? 'TIP', palette.tipLabel, true),
78
+ tip: (msg) => `${paint(labels.tip ?? 'TIP', palette.tipLabel, true)} ${paint(msg, palette.tipText, true)}`,
79
+ step: (msg) => paint(msg, palette.headline, false),
80
+ prompt: (msg) => paint(msg, palette.promptText ?? palette.promptLabel ?? palette.info, true),
81
+ };
82
+ //# sourceMappingURL=ui.js.map
package/dist/ui.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function isVerboseEnabled(): boolean;
2
+ export declare function enableVerboseLogging(enabled?: boolean): void;
3
+ export declare function verboseLog(message: string): void;
4
+ //# sourceMappingURL=verbose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose.d.ts","sourceRoot":"","sources":["../src/verbose.ts"],"names":[],"mappings":"AAMA,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAED,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAK5D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIhD"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ // Copyright (c) 2025 TikTok Pte. Ltd.
3
+ // Licensed under the Apache License Version 2.0 that can be found in the
4
+ // LICENSE file in the root directory of this source tree.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.isVerboseEnabled = isVerboseEnabled;
7
+ exports.enableVerboseLogging = enableVerboseLogging;
8
+ exports.verboseLog = verboseLog;
9
+ const VERBOSE_ENV = 'SPARKLING_VERBOSE';
10
+ function isVerboseEnabled() {
11
+ const value = process.env[VERBOSE_ENV];
12
+ return value === '1' || value === 'true' || value === 'TRUE';
13
+ }
14
+ function enableVerboseLogging(enabled) {
15
+ if (!enabled) {
16
+ return;
17
+ }
18
+ process.env[VERBOSE_ENV] = 'true';
19
+ }
20
+ function verboseLog(message) {
21
+ if (isVerboseEnabled()) {
22
+ console.log(`[verbose] ${message}`);
23
+ }
24
+ }
25
+ //# sourceMappingURL=verbose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verbose.js","sourceRoot":"","sources":["../src/verbose.ts"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,yEAAyE;AACzE,0DAA0D;;AAI1D,4CAGC;AAED,oDAKC;AAED,gCAIC;AAlBD,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,SAAgB,gBAAgB;IAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACvC,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,CAAC;AAC/D,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAiB;IACpD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;AACpC,CAAC;AAED,SAAgB,UAAU,CAAC,OAAe;IACxC,IAAI,gBAAgB,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "sparkling-method-cli",
3
+ "version": "2.0.0-rc.1",
4
+ "description": "CLI utilities for managing Sparkling method modules with cross-platform code generation",
5
+ "homepage": "",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/tiktok/sparkling",
9
+ "directory": "packages/sparkling-method-cli"
10
+ },
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "files": [
14
+ "dist",
15
+ "templates"
16
+ ],
17
+ "bin": {
18
+ "sparkling-method-cli": "./dist/index.js"
19
+ },
20
+ "license": "Apache-2.0",
21
+ "dependencies": {
22
+ "chalk": "^4.1.2",
23
+ "commander": "^12.1.0",
24
+ "fs-extra": "^11.2.0",
25
+ "fast-glob": "^3.3.3",
26
+ "inquirer": "^8.2.6",
27
+ "mustache": "^4.2.0",
28
+ "typescript": "^5.8.3"
29
+ },
30
+ "devDependencies": {
31
+ "@types/fs-extra": "^11.0.4",
32
+ "@types/inquirer": "^9.0.8",
33
+ "@types/jest": "^29.5.12",
34
+ "@types/node": "^22.15.0",
35
+ "@types/mustache": "^4.2.5",
36
+ "jest": "^29.7.0",
37
+ "ts-node": "^10.9.2",
38
+ "ts-jest": "^29.1.2"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc && node ./scripts/copy-assets.js",
42
+ "test": "jest --runInBand"
43
+ }
44
+ }