@vertesia/create-plugin 0.80.0-dev-20251118 → 0.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -66
- package/lib/configuration.d.ts +63 -0
- package/lib/configuration.d.ts.map +1 -0
- package/lib/configuration.js +68 -0
- package/lib/configuration.js.map +1 -0
- package/lib/download-template.d.ts +5 -0
- package/lib/download-template.d.ts.map +1 -0
- package/lib/download-template.js +33 -0
- package/lib/download-template.js.map +1 -0
- package/lib/index.d.ts +9 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +159 -0
- package/lib/index.js.map +1 -0
- package/lib/package-manager.d.ts +10 -0
- package/lib/package-manager.d.ts.map +1 -0
- package/lib/package-manager.js +74 -0
- package/lib/package-manager.js.map +1 -0
- package/lib/process-template.d.ts +25 -0
- package/lib/process-template.d.ts.map +1 -0
- package/lib/process-template.js +186 -0
- package/lib/process-template.js.map +1 -0
- package/lib/prompts.d.ts +6 -0
- package/lib/prompts.d.ts.map +1 -0
- package/lib/prompts.js +54 -0
- package/lib/prompts.js.map +1 -0
- package/lib/template-config.d.ts +87 -0
- package/lib/template-config.d.ts.map +1 -0
- package/lib/template-config.js +23 -0
- package/lib/template-config.js.map +1 -0
- package/lib/template-selector.d.ts +7 -0
- package/lib/template-selector.d.ts.map +1 -0
- package/lib/template-selector.js +56 -0
- package/lib/template-selector.js.map +1 -0
- package/lib/transforms.d.ts +33 -0
- package/lib/transforms.d.ts.map +1 -0
- package/lib/transforms.js +81 -0
- package/lib/transforms.js.map +1 -0
- package/package.json +38 -48
- package/bin/create-plugin.mjs +0 -2
- package/lib/Package.d.ts +0 -42
- package/lib/Package.d.ts.map +0 -1
- package/lib/Package.js +0 -52
- package/lib/Package.js.map +0 -1
- package/lib/TemplateInit.d.ts +0 -30
- package/lib/TemplateInit.d.ts.map +0 -1
- package/lib/TemplateInit.js +0 -48
- package/lib/TemplateInit.js.map +0 -1
- package/lib/ToolTemplateInit.d.ts +0 -10
- package/lib/ToolTemplateInit.d.ts.map +0 -1
- package/lib/ToolTemplateInit.js +0 -58
- package/lib/ToolTemplateInit.js.map +0 -1
- package/lib/WebTemplateInit.d.ts +0 -10
- package/lib/WebTemplateInit.d.ts.map +0 -1
- package/lib/WebTemplateInit.js +0 -68
- package/lib/WebTemplateInit.js.map +0 -1
- package/lib/copy.d.ts +0 -12
- package/lib/copy.d.ts.map +0 -1
- package/lib/copy.js +0 -45
- package/lib/copy.js.map +0 -1
- package/lib/deps.d.ts +0 -3
- package/lib/deps.d.ts.map +0 -1
- package/lib/deps.js +0 -20
- package/lib/deps.js.map +0 -1
- package/lib/hasBin.d.ts +0 -2
- package/lib/hasBin.d.ts.map +0 -1
- package/lib/hasBin.js +0 -14
- package/lib/hasBin.js.map +0 -1
- package/lib/init.d.ts +0 -2
- package/lib/init.d.ts.map +0 -1
- package/lib/init.js +0 -124
- package/lib/init.js.map +0 -1
- package/lib/main.d.ts +0 -2
- package/lib/main.d.ts.map +0 -1
- package/lib/main.js +0 -8
- package/lib/main.js.map +0 -1
- package/lib/template.d.ts +0 -4
- package/lib/template.d.ts.map +0 -1
- package/lib/template.js +0 -16
- package/lib/template.js.map +0 -1
- package/lib/types.d.ts +0 -12
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -20
- package/lib/types.js.map +0 -1
- package/lib/utils.d.ts +0 -2
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js +0 -7
- package/lib/utils.js.map +0 -1
- package/templates/tool/.env.example +0 -6
- package/templates/tool/.vscode/launch.json +0 -24
- package/templates/tool/README.md +0 -190
- package/templates/tool/api/index.ts +0 -8
- package/templates/tool/gitignore +0 -26
- package/templates/tool/rollup.config.js +0 -30
- package/templates/tool/src/collections/example/icon.svg.ts +0 -6
- package/templates/tool/src/collections/example/index.ts +0 -14
- package/templates/tool/src/collections/example/weather/WeatherTool.ts +0 -32
- package/templates/tool/src/collections/example/weather/manifest.ts +0 -16
- package/templates/tool/src/collections/index.ts +0 -7
- package/templates/tool/src/index.ts +0 -5
- package/templates/tool/src/server.ts +0 -71
- package/templates/tool/tsconfig.json +0 -24
- package/templates/tool/vite.config.js +0 -48
- package/templates/web/README.md +0 -156
- package/templates/web/eslint.config.js +0 -29
- package/templates/web/gitignore +0 -25
- package/templates/web/index.html.tmpl +0 -26
- package/templates/web/src/app.tsx +0 -8
- package/templates/web/src/assets.ts +0 -26
- package/templates/web/src/env.ts.tmpl +0 -14
- package/templates/web/src/index.css +0 -21
- package/templates/web/src/main.tsx.tmpl +0 -21
- package/templates/web/src/pages.tsx +0 -31
- package/templates/web/src/plugin.tsx.tmpl +0 -18
- package/templates/web/src/routes.tsx +0 -17
- package/templates/web/src/vite-env.d.ts +0 -1
- package/templates/web/tsconfig.app.json +0 -51
- package/templates/web/tsconfig.json +0 -7
- package/templates/web/tsconfig.node.json +0 -27
- package/templates/web/vite.config.ts.tmpl +0 -128
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package manager detection and selection
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import prompts from 'prompts';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a command exists on the system (cross-platform)
|
|
9
|
+
*/
|
|
10
|
+
function commandExists(command) {
|
|
11
|
+
try {
|
|
12
|
+
const checkCommand = process.platform === 'win32'
|
|
13
|
+
? `where ${command}`
|
|
14
|
+
: `which ${command}`;
|
|
15
|
+
execSync(checkCommand, { stdio: 'ignore' });
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect available package managers and let user choose
|
|
24
|
+
* Returns the selected package manager ('pnpm' or 'npm')
|
|
25
|
+
*/
|
|
26
|
+
export async function selectPackageManager() {
|
|
27
|
+
const hasPnpm = commandExists('pnpm');
|
|
28
|
+
const hasNpm = commandExists('npm');
|
|
29
|
+
// If npm is not installed, something is seriously wrong
|
|
30
|
+
if (!hasNpm) {
|
|
31
|
+
throw new Error('npm is not installed. Please install Node.js and npm first.');
|
|
32
|
+
}
|
|
33
|
+
// If pnpm is not installed, use npm
|
|
34
|
+
if (!hasPnpm) {
|
|
35
|
+
console.log(chalk.gray('Using npm (pnpm not found)\n'));
|
|
36
|
+
return 'npm';
|
|
37
|
+
}
|
|
38
|
+
// Both are installed - let user choose
|
|
39
|
+
console.log(chalk.blue('📦 Package Manager\n'));
|
|
40
|
+
const response = await prompts({
|
|
41
|
+
type: 'select',
|
|
42
|
+
name: 'packageManager',
|
|
43
|
+
message: 'Which package manager would you like to use?',
|
|
44
|
+
choices: [
|
|
45
|
+
{ title: 'pnpm (recommended)', value: 'pnpm' },
|
|
46
|
+
{ title: 'npm', value: 'npm' }
|
|
47
|
+
],
|
|
48
|
+
initial: 0
|
|
49
|
+
}, {
|
|
50
|
+
onCancel: () => {
|
|
51
|
+
throw new Error('Installation cancelled by user');
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
console.log();
|
|
55
|
+
return response.packageManager;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Install dependencies using the specified package manager
|
|
59
|
+
*/
|
|
60
|
+
export async function installDependencies(projectName, packageManager) {
|
|
61
|
+
console.log(chalk.blue('📦 Installing dependencies...\n'));
|
|
62
|
+
console.log(chalk.gray(` Using: ${packageManager}\n`));
|
|
63
|
+
try {
|
|
64
|
+
execSync(`${packageManager} install`, {
|
|
65
|
+
cwd: projectName,
|
|
66
|
+
stdio: 'inherit'
|
|
67
|
+
});
|
|
68
|
+
console.log();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new Error(`Failed to install dependencies: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC/C,CAAC,CAAC,SAAS,OAAO,EAAE;YACpB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC;QACvB,QAAQ,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEpC,wDAAwD;IACxD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,oCAAoC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAEhD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,8CAA8C;QACvD,OAAO,EAAE;YACP,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;YAC9C,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;SAC/B;QACD,OAAO,EAAE,CAAC;KACX,EAAE;QACD,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,QAAQ,CAAC,cAAc,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,cAAsB;IACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,CAAC,CAAC;IAEzD,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,cAAc,UAAU,EAAE;YACpC,GAAG,EAAE,WAAW;YAChB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACjH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TemplateConfig } from './template-config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Replace variables in files
|
|
4
|
+
* Uses different strategies based on file type:
|
|
5
|
+
* - Code files (.js, .jsx, .mjs, .ts, .tsx):
|
|
6
|
+
* - CONFIG__variableName for constant values
|
|
7
|
+
* - TEMPLATE__IdentifierName for identifier replacement
|
|
8
|
+
* - Text files (all others): {{VARIABLE}} placeholder pattern
|
|
9
|
+
*/
|
|
10
|
+
export declare function replaceVariables(projectName: string, templateConfig: TemplateConfig, answers: Record<string, any>): void;
|
|
11
|
+
/**
|
|
12
|
+
* Adjust package.json after variable replacement
|
|
13
|
+
* 1. Sets the package name to PROJECT_NAME
|
|
14
|
+
* 2. Converts workspace:* dependencies to * for @vertesia and @llumiverse packages
|
|
15
|
+
*/
|
|
16
|
+
export declare function adjustPackageJson(projectName: string, answers: Record<string, any>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Handle conditional file removal based on user answers
|
|
19
|
+
*/
|
|
20
|
+
export declare function handleConditionalRemoves(projectName: string, templateConfig: TemplateConfig, answers: Record<string, any>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Remove meta files that shouldn't be in the user's project
|
|
23
|
+
*/
|
|
24
|
+
export declare function removeMetaFiles(projectName: string, templateConfig: TemplateConfig): void;
|
|
25
|
+
//# sourceMappingURL=process-template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-template.d.ts","sourceRoot":"","sources":["../src/process-template.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAwEtD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,IAAI,CAoCN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAgDzF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC3B,IAAI,CAqBN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAczF"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template file processing - variable replacement and adjustments
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
/**
|
|
8
|
+
* Escape special regex characters
|
|
9
|
+
*/
|
|
10
|
+
function escapeRegex(str) {
|
|
11
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if a file is a code file based on extension
|
|
15
|
+
*/
|
|
16
|
+
function isCodeFile(filePath) {
|
|
17
|
+
const codeExtensions = ['.js', '.jsx', '.mjs', '.ts', '.tsx'];
|
|
18
|
+
return codeExtensions.some(ext => filePath.endsWith(ext));
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Replace variables in text files (HTML, JSON, Markdown, etc.)
|
|
22
|
+
* Uses {{VARIABLE}} placeholder pattern
|
|
23
|
+
*/
|
|
24
|
+
function replaceInTextFile(content, answers) {
|
|
25
|
+
let modified = false;
|
|
26
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
27
|
+
const placeholder = `{{${key}}}`;
|
|
28
|
+
if (content.includes(placeholder)) {
|
|
29
|
+
content = content.replace(new RegExp(escapeRegex(placeholder), 'g'), String(value));
|
|
30
|
+
modified = true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return { content, modified };
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Replace variables in code files (JavaScript, TypeScript)
|
|
37
|
+
* Supports two patterns:
|
|
38
|
+
* 1. const CONFIG__variableName = value; - Constant value replacement
|
|
39
|
+
* 2. TEMPLATE__IdentifierName - Identifier name replacement (functions, classes, variables)
|
|
40
|
+
*/
|
|
41
|
+
function replaceInCodeFile(content, answers) {
|
|
42
|
+
let modified = false;
|
|
43
|
+
for (const [key, value] of Object.entries(answers)) {
|
|
44
|
+
// Pattern 1: CONFIG__ constant value replacement
|
|
45
|
+
// Matches: const CONFIG__variableName = <value>; or <value>\n
|
|
46
|
+
// Replaces only the value, keeps the constant declaration
|
|
47
|
+
const configPattern = new RegExp(`(const\\s+CONFIG__${key}\\s*=\\s*)([^;\\n]+)(\\s*;?\\s*\\n?)`, 'gm');
|
|
48
|
+
if (content.match(configPattern)) {
|
|
49
|
+
content = content.replace(configPattern, (match, prefix, oldValue, suffix) => {
|
|
50
|
+
return `${prefix}${JSON.stringify(value)}${suffix}`;
|
|
51
|
+
});
|
|
52
|
+
modified = true;
|
|
53
|
+
}
|
|
54
|
+
// Pattern 2: TEMPLATE__ identifier replacement
|
|
55
|
+
// Matches: TEMPLATE__IdentifierName anywhere in code
|
|
56
|
+
// Replaces the entire identifier with the value
|
|
57
|
+
const templatePattern = new RegExp(`TEMPLATE__${key}\\b`, 'g');
|
|
58
|
+
if (content.match(templatePattern)) {
|
|
59
|
+
content = content.replace(templatePattern, String(value));
|
|
60
|
+
modified = true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { content, modified };
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Replace variables in files
|
|
67
|
+
* Uses different strategies based on file type:
|
|
68
|
+
* - Code files (.js, .jsx, .mjs, .ts, .tsx):
|
|
69
|
+
* - CONFIG__variableName for constant values
|
|
70
|
+
* - TEMPLATE__IdentifierName for identifier replacement
|
|
71
|
+
* - Text files (all others): {{VARIABLE}} placeholder pattern
|
|
72
|
+
*/
|
|
73
|
+
export function replaceVariables(projectName, templateConfig, answers) {
|
|
74
|
+
if (!templateConfig.files) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
console.log(chalk.blue('✏️ Configuring files...\n'));
|
|
78
|
+
for (const file of templateConfig.files) {
|
|
79
|
+
const filePath = path.join(projectName, file);
|
|
80
|
+
if (!fs.existsSync(filePath)) {
|
|
81
|
+
console.log(chalk.yellow(` ⚠️ File not found: ${file} (skipping)`));
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
85
|
+
let modified = false;
|
|
86
|
+
// Choose replacement strategy based on file type
|
|
87
|
+
if (isCodeFile(file)) {
|
|
88
|
+
const result = replaceInCodeFile(content, answers);
|
|
89
|
+
content = result.content;
|
|
90
|
+
modified = result.modified;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
const result = replaceInTextFile(content, answers);
|
|
94
|
+
content = result.content;
|
|
95
|
+
modified = result.modified;
|
|
96
|
+
}
|
|
97
|
+
if (modified) {
|
|
98
|
+
fs.writeFileSync(filePath, content);
|
|
99
|
+
console.log(chalk.gray(` ✓ ${file}`));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
console.log();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Adjust package.json after variable replacement
|
|
106
|
+
* 1. Sets the package name to PROJECT_NAME
|
|
107
|
+
* 2. Converts workspace:* dependencies to * for @vertesia and @llumiverse packages
|
|
108
|
+
*/
|
|
109
|
+
export function adjustPackageJson(projectName, answers) {
|
|
110
|
+
console.log(chalk.blue('📝 Adjusting package.json...\n'));
|
|
111
|
+
const packageJsonPath = path.join(projectName, 'package.json');
|
|
112
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
113
|
+
console.log(chalk.yellow(' ⚠️ package.json not found (skipping adjustment)'));
|
|
114
|
+
console.log();
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
119
|
+
// 1. Set package name to PROJECT_NAME
|
|
120
|
+
const newName = answers.PROJECT_NAME || projectName;
|
|
121
|
+
if (packageJson.name !== newName) {
|
|
122
|
+
packageJson.name = newName;
|
|
123
|
+
console.log(chalk.gray(` ✓ Set package name to "${newName}"`));
|
|
124
|
+
}
|
|
125
|
+
// 2. Replace workspace:* with * for @vertesia and @llumiverse dependencies
|
|
126
|
+
let workspaceReplacements = 0;
|
|
127
|
+
['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].forEach(depType => {
|
|
128
|
+
if (packageJson[depType]) {
|
|
129
|
+
Object.keys(packageJson[depType]).forEach(pkgName => {
|
|
130
|
+
if ((pkgName.startsWith('@vertesia/') || pkgName.startsWith('@llumiverse/')) &&
|
|
131
|
+
packageJson[depType][pkgName] === 'workspace:*') {
|
|
132
|
+
packageJson[depType][pkgName] = '*';
|
|
133
|
+
workspaceReplacements++;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
if (workspaceReplacements > 0) {
|
|
139
|
+
console.log(chalk.gray(` ✓ Replaced ${workspaceReplacements} workspace:* dependencies with *`));
|
|
140
|
+
}
|
|
141
|
+
// Write back to file
|
|
142
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2) + '\n');
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.log(chalk.yellow(` ⚠️ Failed to adjust package.json: ${error instanceof Error ? error.message : 'Unknown error'}`));
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Handle conditional file removal based on user answers
|
|
151
|
+
*/
|
|
152
|
+
export function handleConditionalRemoves(projectName, templateConfig, answers) {
|
|
153
|
+
if (!templateConfig.conditionalRemove)
|
|
154
|
+
return;
|
|
155
|
+
console.log(chalk.blue('🔧 Applying conditional configurations...\n'));
|
|
156
|
+
for (const [varName, conditions] of Object.entries(templateConfig.conditionalRemove)) {
|
|
157
|
+
const value = String(answers[varName]);
|
|
158
|
+
const filesToRemove = conditions[value];
|
|
159
|
+
if (filesToRemove) {
|
|
160
|
+
for (const file of filesToRemove) {
|
|
161
|
+
const filePath = path.join(projectName, file);
|
|
162
|
+
if (fs.existsSync(filePath)) {
|
|
163
|
+
fs.rmSync(filePath, { recursive: true, force: true });
|
|
164
|
+
console.log(chalk.gray(` ✓ Removed: ${file}`));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
console.log();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Remove meta files that shouldn't be in the user's project
|
|
173
|
+
*/
|
|
174
|
+
export function removeMetaFiles(projectName, templateConfig) {
|
|
175
|
+
console.log(chalk.blue('🧹 Cleaning up...\n'));
|
|
176
|
+
const filesToRemove = templateConfig.removeAfterInstall || [];
|
|
177
|
+
for (const file of filesToRemove) {
|
|
178
|
+
const filePath = path.join(projectName, file);
|
|
179
|
+
if (fs.existsSync(filePath)) {
|
|
180
|
+
fs.rmSync(filePath, { recursive: true, force: true });
|
|
181
|
+
console.log(chalk.gray(` ✓ Removed: ${file}`));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
console.log();
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=process-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-template.js","sourceRoot":"","sources":["../src/process-template.ts"],"names":[],"mappings":"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"}
|
package/lib/prompts.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD;;GAEG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAmDlH"}
|
package/lib/prompts.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User prompts for configuration
|
|
3
|
+
*/
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { applyTransform } from './transforms.js';
|
|
7
|
+
/**
|
|
8
|
+
* Prompt user for configuration values
|
|
9
|
+
*/
|
|
10
|
+
export async function promptUser(projectName, templateConfig) {
|
|
11
|
+
if (!templateConfig.prompts) {
|
|
12
|
+
return {};
|
|
13
|
+
}
|
|
14
|
+
console.log(chalk.blue('⚙️ Configure your project:\n'));
|
|
15
|
+
// Process prompts - replace ${PROJECT_NAME} and other variables in initial values
|
|
16
|
+
const processedPrompts = templateConfig.prompts.map(p => {
|
|
17
|
+
const prompt = { ...p };
|
|
18
|
+
// Override PROJECT_NAME initial value with the directory name
|
|
19
|
+
if (prompt.name === 'PROJECT_NAME') {
|
|
20
|
+
prompt.initial = projectName;
|
|
21
|
+
}
|
|
22
|
+
// Replace ${PROJECT_NAME} in initial values
|
|
23
|
+
if (typeof prompt.initial === 'string') {
|
|
24
|
+
prompt.initial = prompt.initial.replace(/\$\{PROJECT_NAME\}/g, projectName);
|
|
25
|
+
}
|
|
26
|
+
return prompt;
|
|
27
|
+
});
|
|
28
|
+
const answers = await prompts(processedPrompts, {
|
|
29
|
+
onCancel: () => {
|
|
30
|
+
throw new Error('Installation cancelled by user');
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Check if all prompts were answered
|
|
34
|
+
if (Object.keys(answers).length !== processedPrompts.length) {
|
|
35
|
+
throw new Error('Installation cancelled');
|
|
36
|
+
}
|
|
37
|
+
// Process derived variables
|
|
38
|
+
if (templateConfig.derived) {
|
|
39
|
+
for (const [targetName, config] of Object.entries(templateConfig.derived)) {
|
|
40
|
+
const sourceValue = answers[config.from];
|
|
41
|
+
if (sourceValue !== undefined) {
|
|
42
|
+
try {
|
|
43
|
+
answers[targetName] = applyTransform(String(sourceValue), config.transform);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
throw new Error(`Failed to derive ${targetName} from ${config.from}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
console.log(); // Empty line after prompts
|
|
52
|
+
return answers;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB,EAAE,cAA8B;IAClF,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACtD,MAAM,MAAM,GAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;QAE7B,8DAA8D;QAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,GAAG,WAAW,CAAC;QAC/B,CAAC;QAED,4CAA4C;QAC5C,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,WAAW,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,EAAE;QAC9C,QAAQ,EAAE,GAAG,EAAE;YACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;KACF,CAAC,CAAC;IAEH,qCAAqC;IACrC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,4BAA4B;IAC5B,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC9E,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,UAAU,SAAS,MAAM,CAAC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;gBACrI,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,2BAA2B;IAC1C,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template configuration loaded from template.config.json
|
|
3
|
+
*
|
|
4
|
+
* This configuration defines how the template installer should:
|
|
5
|
+
* - Prompt users for configuration values
|
|
6
|
+
* - Replace variables in template files
|
|
7
|
+
* - Conditionally remove files based on user choices
|
|
8
|
+
* - Clean up template-specific files after installation
|
|
9
|
+
*
|
|
10
|
+
* @see TEMPLATE_CONFIG.md for detailed documentation
|
|
11
|
+
*/
|
|
12
|
+
export interface TemplateConfig {
|
|
13
|
+
/** Configuration format version (currently "1.0") */
|
|
14
|
+
version: string;
|
|
15
|
+
/** Optional human-readable description of the template */
|
|
16
|
+
description?: string;
|
|
17
|
+
/** Array of prompts to ask the user during installation */
|
|
18
|
+
prompts: PromptConfig[];
|
|
19
|
+
/** Array of file paths where {{VARIABLE}} replacement should occur */
|
|
20
|
+
files: string[];
|
|
21
|
+
/** Optional array of file paths to remove after installation (e.g., template.config.json) */
|
|
22
|
+
removeAfterInstall?: string[];
|
|
23
|
+
/**
|
|
24
|
+
* Optional conditional file removal based on user answers
|
|
25
|
+
* Format: { "VARIABLE_NAME": { "value": ["files", "to", "remove"] } }
|
|
26
|
+
* Example: { "USE_TYPESCRIPT": { "false": ["tsconfig.json"] } }
|
|
27
|
+
*/
|
|
28
|
+
conditionalRemove?: Record<string, Record<string, string[]>>;
|
|
29
|
+
/**
|
|
30
|
+
* Optional derived variables computed from user answers
|
|
31
|
+
* Format: { "NEW_VAR": { "from": "SOURCE_VAR", "transform": "pascalCase" } }
|
|
32
|
+
* Supported transforms: "pascalCase", "camelCase", "kebabCase", "snakeCase", "titleCase", "upperCase", "lowerCase"
|
|
33
|
+
* Example: { "ComponentName": { "from": "PROJECT_NAME", "transform": "pascalCase" } }
|
|
34
|
+
*/
|
|
35
|
+
derived?: Record<string, DerivedVariable>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Configuration for a derived variable computed from user input
|
|
39
|
+
*/
|
|
40
|
+
export interface DerivedVariable {
|
|
41
|
+
/** Source variable name to derive from */
|
|
42
|
+
from: string;
|
|
43
|
+
/** Transformation to apply: "pascalCase", "camelCase", "kebabCase", "snakeCase", "titleCase", "upperCase", "lowerCase" */
|
|
44
|
+
transform: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Configuration for a single prompt shown to the user
|
|
48
|
+
*
|
|
49
|
+
* The user's answer is stored using the 'name' field and can be used
|
|
50
|
+
* to replace {{name}} placeholders in template files.
|
|
51
|
+
*/
|
|
52
|
+
export interface PromptConfig {
|
|
53
|
+
/** Prompt type: "text", "number", "confirm", "select", or "multiselect" */
|
|
54
|
+
type: string;
|
|
55
|
+
/** Variable name used for replacement (use {{name}} in template files) */
|
|
56
|
+
name: string;
|
|
57
|
+
/** Question text shown to the user */
|
|
58
|
+
message: string;
|
|
59
|
+
/**
|
|
60
|
+
* Optional default value
|
|
61
|
+
* Can include ${PROJECT_NAME} which will be replaced with the user's project name
|
|
62
|
+
* Example: "initial": "@myorg/${PROJECT_NAME}"
|
|
63
|
+
*/
|
|
64
|
+
initial?: string | number | boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Optional validation function as string
|
|
67
|
+
* Should return true if valid, or error message string if invalid
|
|
68
|
+
* Example: "(value) => value.length > 0 || 'Required field'"
|
|
69
|
+
*/
|
|
70
|
+
validate?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Optional format function as string to transform the value before saving
|
|
73
|
+
* Example: "(value) => value.toLowerCase()"
|
|
74
|
+
*/
|
|
75
|
+
format?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Optional skip condition as string
|
|
78
|
+
* Should return true to skip this prompt based on previous answers
|
|
79
|
+
* Example: "(prev) => !prev.USE_TYPESCRIPT"
|
|
80
|
+
*/
|
|
81
|
+
skip?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Read template.config.json from the downloaded template
|
|
85
|
+
*/
|
|
86
|
+
export declare function readTemplateConfig(projectName: string): TemplateConfig;
|
|
87
|
+
//# sourceMappingURL=template-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-config.d.ts","sourceRoot":"","sources":["../src/template-config.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAEhB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,2DAA2D;IAC3D,OAAO,EAAE,YAAY,EAAE,CAAC;IAExB,sEAAsE;IACtE,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAE7D;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IAEb,0HAA0H;IAC1H,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IAEb,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IAEb,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAEpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAatE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template configuration types and reading
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import { config } from './configuration.js';
|
|
7
|
+
/**
|
|
8
|
+
* Read template.config.json from the downloaded template
|
|
9
|
+
*/
|
|
10
|
+
export function readTemplateConfig(projectName) {
|
|
11
|
+
const configPath = path.join(projectName, config.templateConfigFile);
|
|
12
|
+
if (!fs.existsSync(configPath)) {
|
|
13
|
+
throw new Error(`Template configuration file not found: ${config.templateConfigFile}`);
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
17
|
+
return JSON.parse(content);
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
throw new Error(`Failed to parse template configuration: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=template-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-config.js","sourceRoot":"","sources":["../src/template-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoG5C;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAErE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,0CAA0C,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACzH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { TemplateDefinition } from './configuration.js';
|
|
2
|
+
/**
|
|
3
|
+
* Select a template (only prompts if multiple templates are available)
|
|
4
|
+
* Returns the selected template definition with branch override applied if provided
|
|
5
|
+
*/
|
|
6
|
+
export declare function selectTemplate(branchOverride?: string): Promise<TemplateDefinition>;
|
|
7
|
+
//# sourceMappingURL=template-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-selector.d.ts","sourceRoot":"","sources":["../src/template-selector.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAiBhE;;;GAGG;AACH,wBAAsB,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoCzF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template selection when multiple templates are available
|
|
3
|
+
*/
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { config } from './configuration.js';
|
|
7
|
+
/**
|
|
8
|
+
* Apply branch override to repository URL
|
|
9
|
+
*/
|
|
10
|
+
function applyBranchOverride(repository, branch) {
|
|
11
|
+
if (!branch) {
|
|
12
|
+
return repository;
|
|
13
|
+
}
|
|
14
|
+
// Remove existing branch/tag if present (after #)
|
|
15
|
+
const baseRepo = repository.split('#')[0];
|
|
16
|
+
// Apply the override branch
|
|
17
|
+
return `${baseRepo}#${branch}`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Select a template (only prompts if multiple templates are available)
|
|
21
|
+
* Returns the selected template definition with branch override applied if provided
|
|
22
|
+
*/
|
|
23
|
+
export async function selectTemplate(branchOverride) {
|
|
24
|
+
const templates = config.templates;
|
|
25
|
+
let selectedTemplate;
|
|
26
|
+
// If only one template, return it directly
|
|
27
|
+
if (templates.length === 1) {
|
|
28
|
+
selectedTemplate = templates[0];
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// Multiple templates - let user choose
|
|
32
|
+
console.log(chalk.blue('📋 Template Selection\n'));
|
|
33
|
+
const response = await prompts({
|
|
34
|
+
type: 'select',
|
|
35
|
+
name: 'template',
|
|
36
|
+
message: 'Which type of project would you like to create?',
|
|
37
|
+
choices: templates.map((template, index) => ({
|
|
38
|
+
title: template.name,
|
|
39
|
+
value: index
|
|
40
|
+
})),
|
|
41
|
+
initial: 0
|
|
42
|
+
}, {
|
|
43
|
+
onCancel: () => {
|
|
44
|
+
throw new Error('Installation cancelled by user');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
console.log();
|
|
48
|
+
selectedTemplate = templates[response.template];
|
|
49
|
+
}
|
|
50
|
+
// Apply branch override if provided
|
|
51
|
+
return {
|
|
52
|
+
...selectedTemplate,
|
|
53
|
+
repository: applyBranchOverride(selectedTemplate.repository, branchOverride)
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=template-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-selector.js","sourceRoot":"","sources":["../src/template-selector.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAEhE;;GAEG;AACH,SAAS,mBAAmB,CAAC,UAAkB,EAAE,MAAe;IAC9D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,kDAAkD;IAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,4BAA4B;IAC5B,OAAO,GAAG,QAAQ,IAAI,MAAM,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,cAAuB;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAEnC,IAAI,gBAAoC,CAAC;IAEzC,2CAA2C;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC;YAC7B,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,iDAAiD;YAC1D,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3C,KAAK,EAAE,QAAQ,CAAC,IAAI;gBACpB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;SACX,EAAE;YACD,QAAQ,EAAE,GAAG,EAAE;gBACb,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;YACpD,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,oCAAoC;IACpC,OAAO;QACL,GAAG,gBAAgB;QACnB,UAAU,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC;KAC7E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* String transformation utilities for derived variables
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert string to PascalCase
|
|
6
|
+
* Examples: "my-plugin" → "MyPlugin", "hello world" → "HelloWorld"
|
|
7
|
+
*/
|
|
8
|
+
export declare function toPascalCase(str: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Convert string to camelCase
|
|
11
|
+
* Examples: "my-plugin" → "myPlugin", "hello world" → "helloWorld"
|
|
12
|
+
*/
|
|
13
|
+
export declare function toCamelCase(str: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Convert string to kebab-case
|
|
16
|
+
* Examples: "MyPlugin" → "my-plugin", "helloWorld" → "hello-world"
|
|
17
|
+
*/
|
|
18
|
+
export declare function toKebabCase(str: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Convert string to snake_case
|
|
21
|
+
* Examples: "MyPlugin" → "my_plugin", "helloWorld" → "hello_world"
|
|
22
|
+
*/
|
|
23
|
+
export declare function toSnakeCase(str: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Convert string to Title Case
|
|
26
|
+
* Examples: "my-plugin" → "My Plugin", "hello_world" → "Hello World"
|
|
27
|
+
*/
|
|
28
|
+
export declare function toTitleCase(str: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Apply a transformation to a string value
|
|
31
|
+
*/
|
|
32
|
+
export declare function applyTransform(value: string, transform: string): string;
|
|
33
|
+
//# sourceMappingURL=transforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAmBvE"}
|