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.
- package/LICENSE +201 -0
- package/README.md +37 -0
- package/dist/codegen/definition-parser.d.ts +5 -0
- package/dist/codegen/definition-parser.d.ts.map +1 -0
- package/dist/codegen/definition-parser.js +376 -0
- package/dist/codegen/definition-parser.js.map +1 -0
- package/dist/codegen/index.d.ts +3 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +99 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/kotlin.d.ts +4 -0
- package/dist/codegen/kotlin.d.ts.map +1 -0
- package/dist/codegen/kotlin.js +273 -0
- package/dist/codegen/kotlin.js.map +1 -0
- package/dist/codegen/metadata.d.ts +4 -0
- package/dist/codegen/metadata.d.ts.map +1 -0
- package/dist/codegen/metadata.js +78 -0
- package/dist/codegen/metadata.js.map +1 -0
- package/dist/codegen/swift.d.ts +4 -0
- package/dist/codegen/swift.d.ts.map +1 -0
- package/dist/codegen/swift.js +145 -0
- package/dist/codegen/swift.js.map +1 -0
- package/dist/codegen/template/android/kotlin-idl-template +119 -0
- package/dist/codegen/template/android/kotlin-impl-template +0 -0
- package/dist/codegen/template/ios/oc-idl-template +0 -0
- package/dist/codegen/template/ios/oc-impl-template +0 -0
- package/dist/codegen/template/ios/swift-idl-template +83 -0
- package/dist/codegen/template/ios/swift-impl-template +0 -0
- package/dist/codegen/template/ts/call-template +0 -0
- package/dist/codegen/template/ts/ts-idl-template +66 -0
- package/dist/codegen/template/ts/ts-impl-template +78 -0
- package/dist/codegen/template/ts/ts-index-template +13 -0
- package/dist/codegen/types.d.ts +157 -0
- package/dist/codegen/types.d.ts.map +1 -0
- package/dist/codegen/types.js +3 -0
- package/dist/codegen/types.js.map +1 -0
- package/dist/codegen/typescript.d.ts +8 -0
- package/dist/codegen/typescript.d.ts.map +1 -0
- package/dist/codegen/typescript.js +232 -0
- package/dist/codegen/typescript.js.map +1 -0
- package/dist/codegen/utils.d.ts +10 -0
- package/dist/codegen/utils.d.ts.map +1 -0
- package/dist/codegen/utils.js +144 -0
- package/dist/codegen/utils.js.map +1 -0
- package/dist/create/index.d.ts +3 -0
- package/dist/create/index.d.ts.map +1 -0
- package/dist/create/index.js +44 -0
- package/dist/create/index.js.map +1 -0
- package/dist/create/prompts.d.ts +7 -0
- package/dist/create/prompts.d.ts.map +1 -0
- package/dist/create/prompts.js +61 -0
- package/dist/create/prompts.js.map +1 -0
- package/dist/create/scaffold.d.ts +9 -0
- package/dist/create/scaffold.d.ts.map +1 -0
- package/dist/create/scaffold.js +131 -0
- package/dist/create/scaffold.js.map +1 -0
- package/dist/create/template/README.md +17 -0
- package/dist/create/template/android/.gitkeep +1 -0
- package/dist/create/template/ios/.gitkeep +1 -0
- package/dist/create/template/src/method.d.ts +17 -0
- package/dist/create/templates.d.ts +5 -0
- package/dist/create/templates.d.ts.map +1 -0
- package/dist/create/templates.js +75 -0
- package/dist/create/templates.js.map +1 -0
- package/dist/create/types.d.ts +12 -0
- package/dist/create/types.d.ts.map +1 -0
- package/dist/create/types.js +3 -0
- package/dist/create/types.js.map +1 -0
- package/dist/create/utils.d.ts +3 -0
- package/dist/create/utils.d.ts.map +1 -0
- package/dist/create/utils.js +19 -0
- package/dist/create/utils.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/ui.d.ts +13 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +82 -0
- package/dist/ui.js.map +1 -0
- package/dist/verbose.d.ts +4 -0
- package/dist/verbose.d.ts.map +1 -0
- package/dist/verbose.js +25 -0
- package/dist/verbose.js.map +1 -0
- package/package.json +44 -0
- 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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/create/types.ts"],"names":[],"mappings":""}
|
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
package/dist/ui.d.ts.map
ADDED
|
@@ -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":";;;;;;AAAA,sCAAsC;AACtC,yEAAyE;AACzE,0DAA0D;AAC1D,sDAAyB;AACzB,0DAA6B;AAC7B,kDAA0B;AAQ1B,MAAM,cAAc,GAAuB;IACzC,MAAM,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;IACtB,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,KAAK;QACZ,wDAAwD;QACxD,IAAI,EAAE,MAAM;QACZ,oEAAoE;QACpE,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,MAAM;QACf,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,MAAM;KACnB;CACF,CAAC;AAEF,MAAM,QAAQ,GAA4C;IACxD,IAAI,EAAE,eAAK,CAAC,IAAI;IAChB,KAAK,EAAE,eAAK,CAAC,KAAK;IAClB,MAAM,EAAE,eAAK,CAAC,MAAM;IACpB,GAAG,EAAE,eAAK,CAAC,GAAG;IACd,KAAK,EAAE,eAAK,CAAC,KAAK;IAClB,IAAI,EAAE,eAAK,CAAC,IAAI;IAChB,IAAI,EAAE,eAAK,CAAC,IAAI;IAChB,OAAO,EAAE,eAAK,CAAC,OAAO;IACtB,IAAI,EAAE,eAAK,CAAC,IAAI;CACjB,CAAC;AAEF,SAAS,YAAY;IACnB,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAC1F,IAAI,iBAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAa,CAAC;YAC1E,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;AAC3B,MAAM,OAAO,GAAG,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AACpE,MAAM,MAAM,GAAG,EAAE,GAAG,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;AAEnE,SAAS,KAAK,CAAC,GAAW,EAAE,SAA6B,EAAE,IAAI,GAAG,KAAK;IACrE,MAAM,GAAG,GAAG,SAAS,EAAE,WAAW,EAAE,CAAC;IACrC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IACD,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,OAAO,IAAI,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAEY,QAAA,EAAE,GAAG;IAChB,QAAQ,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;IAC3D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;IACrD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;IACvD,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;IACtD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;IACxD,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC5D,GAAG,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;IAClH,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC1D,MAAM,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;CACrG,CAAC"}
|
|
@@ -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"}
|
package/dist/verbose.js
ADDED
|
@@ -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
|
+
}
|